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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
#include <systemc.h>
SC_MODULE(Rec) {
sc_event_queue_port E;
SC_CTOR(Rec) {
SC_METHOD(P);
sensitive << E;
dont_initialize();
}
void P() {
cout << sc_time_stamp()
<< " delta " << sc_delta_count()
<< ": P awakes\n";
}
};
SC_MODULE(Sender) {
sc_in<bool> Clock;
sc_event_queue_port E;
SC_CTOR(Sender) {
SC_METHOD(P);
sensitive << Clock.pos();
dont_initialize();
}
void P() {
// trigger in now (2x), now+1ns (2x)
E->notify( 0, SC_NS );
E->notify( 0, SC_NS );
E->notify( 1, SC_NS );
E->notify( 1, SC_NS );
}
};
SC_MODULE(xyz) {
SC_CTOR(xyz) {
SC_THREAD(P);
}
void P() {
wait(15, SC_NS);
cout << sc_time_stamp()
<< " delta " << sc_delta_count()
<< ": xyz awakes\n";
}
};
int sc_main (int agrc, char** argv)
{
sc_event_queue E("E");
Rec R("Rec");
R.E(E);
sc_clock C1 ("C1", 20, SC_NS);
sc_clock C2 ("C2", 40, SC_NS);
xyz xyz_obj("xyz");
// Events at 0ns (2x), 1ns (2x), 20ns (2x), 21ns (2x), 40ns (2x), ...
Sender S1("S1");
S1.Clock(C1);
S1.E(E);
// Events at 0ns (2x), 1ns (2x), 40ns (2x), 41ns (2x), 80ns (2x), ...
Sender S2("S2");
S2.Clock(C2);
S2.E(E);
// Events at 3ns, 5ns (2x), 8ns
sc_start(10, SC_NS);
E.notify( 5,SC_NS );
E.notify( 3,SC_NS );
E.notify( 5,SC_NS );
E.notify( 8,SC_NS) ;
// Events would be at 40ns, 43ns (2x), 44ns but all are cancelled
sc_start(40, SC_NS);
E.notify( 3, SC_NS );
E.notify( 3, SC_NS );
E.notify( 4, SC_NS );
E.notify( SC_ZERO_TIME );
E.cancel_all();
sc_start(40, SC_NS);
return 0;
}
|