@@ -34,9 +34,7 @@ struct Dump {
34
34
};
35
35
36
36
template <size_t n>
37
- Signal<n> random_signal () {
38
- std::random_device rd; // Random device for seeding
39
- std::mt19937 gen (rd ()); // Mersenne Twister engine
37
+ Signal<n> random_signal (std::mt19937 &gen) {
40
38
std::uniform_int_distribution<uint32_t > dist;
41
39
std::array<uint32_t , (n+31 )/32 > words;
42
40
for (auto &w : words)
@@ -52,9 +50,12 @@ struct Reset {
52
50
};
53
51
54
52
struct Randomize {
53
+ std::mt19937 &gen;
54
+ Randomize (std::mt19937 &gen) : gen(gen) {}
55
+
55
56
template <size_t n>
56
57
void operator ()(const char *, Signal<n> &signal) {
57
- signal = random_signal<n>();
58
+ signal = random_signal<n>(gen );
58
59
}
59
60
};
60
61
@@ -89,19 +90,23 @@ int main(int argc, char **argv)
89
90
vcd_file << " #0\n " ;
90
91
// Set all signals to false
91
92
inputs.visit (Reset ());
92
-
93
+
93
94
gold::eval (inputs, outputs, state, next_state);
94
95
{
95
96
Dump d (vcd_file);
96
97
inputs.visit (d);
97
98
outputs.visit (d);
98
99
state.visit (d);
99
100
}
100
-
101
+
102
+ // Initialize random number generator once
103
+ std::random_device rd;
104
+ std::mt19937 gen (rd ());
105
+
101
106
for (int step = 0 ; step < steps; ++step) {
102
107
// Functional backend cxx
103
108
vcd_file << " #" << (step + 1 ) << " \n " ;
104
- inputs.visit (Randomize ());
109
+ inputs.visit (Randomize (gen ));
105
110
106
111
gold::eval (inputs, outputs, state, next_state);
107
112
{
@@ -110,7 +115,7 @@ int main(int argc, char **argv)
110
115
outputs.visit (d);
111
116
state.visit (d);
112
117
}
113
-
118
+
114
119
state = next_state;
115
120
}
116
121
0 commit comments