1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
// Learn with Examples, 2020, MIT license
#include <systemc>
using namespace sc_core;
SC_MODULE(SIGNAL_EVENT) {
sc_signal<int> s1, s2; // defines two signal channels
SC_CTOR(SIGNAL_EVENT) {
SC_THREAD(producer1);
SC_THREAD(producer2);
SC_THREAD(consumer); // consumer sensitive to (s1 OR s2)
sensitive << s1 << s2; // same as: sensitive << s1.default_event() << s2.value_changed_event();
dont_initialize();
}
void producer1() {
int v = 1;
while (true) {
s1.write(v++); // write to s1
wait(2, SC_SEC);
}
}
void producer2() {
int v = 1;
while (true) {
s2 = v++; // write to s2
wait(3, SC_SEC);
}
}
void consumer() {
while (true) {
if ( s1.event() true && s2.event() true) { // both triggered
std::cout << sc_time_stamp() << ": s1 & s2 triggered" << std::endl;
} else if (s1.event() == true) { // only s1 triggered
std::cout << sc_time_stamp() << ": s1 triggered" << std::endl;
} else { // only s2 triggered
std::cout << sc_time_stamp() << ": s2 triggered" << std::endl;
}
wait();
}
}
};
int sc_main(int, char*[]) {
SIGNAL_EVENT signal_event("signal_event");
sc_start(7, SC_SEC);
return 0;
}
// Result:
// s1 at 0, 2, 4, 6 s
// s2 at 0, 3, 6 s
// both
0 s: s1 & s2 triggered
// s1 only
2 s: s1 triggered
// s2 only
3 s: s2 triggered
// s1 only
4 s: s1 triggered
// both
6 s: s1 & s2 triggered
|