1#include <systemc.h> 2 3SC_MODULE(Rec) { 4 sc_event_queue_port E; 5 6 SC_CTOR(Rec) { 7 SC_METHOD(P); 8 sensitive << E; 9 dont_initialize(); 10 } 11 void P() { 12 cout << sc_time_stamp() 13 << " delta " << sc_delta_count() 14 << ": P awakes\n"; 15 } 16}; 17 18SC_MODULE(Sender) { 19 sc_in<bool> Clock; 20 sc_event_queue_port E; 21 22 SC_CTOR(Sender) { 23 SC_METHOD(P); 24 sensitive << Clock.pos(); 25 dont_initialize(); 26 } 27 void P() { 28 // trigger in now (2x), now+1ns (2x) 29 E->notify( 0, SC_NS ); 30 E->notify( 0, SC_NS ); 31 E->notify( 1, SC_NS ); 32 E->notify( 1, SC_NS ); 33 } 34}; 35 36SC_MODULE(xyz) { 37 SC_CTOR(xyz) { 38 SC_THREAD(P); 39 } 40 void P() { 41 wait(15, SC_NS); 42 cout << sc_time_stamp() 43 << " delta " << sc_delta_count() 44 << ": xyz awakes\n"; 45 } 46}; 47 48int sc_main (int agrc, char** argv) 49{ 50 sc_event_queue E("E"); 51 52 Rec R("Rec"); 53 R.E(E); 54 55 sc_clock C1 ("C1", 20, SC_NS); 56 sc_clock C2 ("C2", 40, SC_NS); 57 58 xyz xyz_obj("xyz"); 59 60 // Events at 0ns (2x), 1ns (2x), 20ns (2x), 21ns (2x), 40ns (2x), ... 61 Sender S1("S1"); 62 S1.Clock(C1); 63 S1.E(E); 64 65 // Events at 0ns (2x), 1ns (2x), 40ns (2x), 41ns (2x), 80ns (2x), ... 66 Sender S2("S2"); 67 S2.Clock(C2); 68 S2.E(E); 69 70 // Events at 3ns, 5ns (2x), 8ns 71 sc_start(10, SC_NS); 72 E.notify( 5,SC_NS ); 73 E.notify( 3,SC_NS ); 74 E.notify( 5,SC_NS ); 75 E.notify( 8,SC_NS) ; 76 77 // Events would be at 40ns, 43ns (2x), 44ns but all are cancelled 78 sc_start(40, SC_NS); 79 E.notify( 3, SC_NS ); 80 E.notify( 3, SC_NS ); 81 E.notify( 4, SC_NS ); 82 E.notify( SC_ZERO_TIME ); 83 E.cancel_all(); 84 85 sc_start(40, SC_NS); 86 87 return 0; 88} 89