#include 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 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; }