#define SC_INCLUDE_DYNAMIC_PROCESSES #include "systemc" using namespace sc_core; using namespace sc_dt; using namespace std; #include "tlm.h" #include "tlm_utils/peq_with_cb_and_phase.h" #include "tlm_utils/peq_with_get.h" SC_MODULE(Test_peq_with_cb) { SC_CTOR(Test_peq_with_cb) : m_peq(this, &Test_peq_with_cb::peq_cb), flag1(true), flag2(true) { SC_THREAD(thread); } void thread() { section = 1; tlm::tlm_generic_payload *trans; tlm::tlm_phase phase; for (int i = 0; i < 50; i++) { trans = new tlm::tlm_generic_payload; trans->set_address(i); m_peq.notify( *trans, phase, sc_time(rand() % 100, SC_NS) ); } wait(50, SC_NS); m_peq.cancel_all(); cout << "cancel_all\n"; section = 2; for (int i = 100; i < 150; i++) { trans = new tlm::tlm_generic_payload; trans->set_address(i); m_peq.notify( *trans, phase, sc_time(rand() % 100, SC_NS) ); } wait(50, SC_NS); m_peq.cancel_all(); cout << "cancel_all\n"; wait(50, SC_NS); } void peq_cb(tlm::tlm_generic_payload& trans, const tlm::tlm_phase& phase) { sc_time t = sc_time_stamp(); sc_dt::uint64 adr = trans.get_address(); sc_assert( section == 1 || section == 2 ); if (section == 1) { if (flag1) cout << "Called peq_cb with section = " << section << "\n"; flag1 = false; sc_assert( t >= sc_time(0, SC_NS) && t <= sc_time(50, SC_NS) ); sc_assert( adr >= 0 && adr < 50); } else if (section == 2) { if (flag2) cout << "Called peq_cb with section = " << section << "\n"; flag2 = false; sc_assert( t >= sc_time(50, SC_NS) && t <= sc_time(100, SC_NS) ); sc_assert( adr >= 100 && adr < 150); } } int section; tlm_utils::peq_with_cb_and_phase m_peq; bool flag1, flag2; }; SC_MODULE(Test_peq_with_get) { SC_CTOR(Test_peq_with_get) : m_peq("foo"), flag3(true), flag4(true) { SC_THREAD(thread); SC_THREAD(ass_end_thread); } void thread() { wait(1000, SC_NS); section = 3; tlm::tlm_generic_payload *trans; for (int i = 0; i < 50; i++) { trans = new tlm::tlm_generic_payload; trans->set_address(i); m_peq.notify( *trans, sc_time(rand() % 100, SC_NS) ); } wait(50, SC_NS); m_peq.cancel_all(); cout << "cancel_all\n"; section = 4; for (int i = 100; i < 150; i++) { trans = new tlm::tlm_generic_payload; trans->set_address(i); m_peq.notify( *trans, sc_time(rand() % 100, SC_NS) ); } wait(50, SC_NS); m_peq.cancel_all(); cout << "cancel_all\n"; wait(50, SC_NS); } void ass_end_thread() { tlm::tlm_generic_payload *trans; for(;;) { wait(m_peq.get_event()); while( (trans = m_peq.get_next_transaction()) ) { sc_time t = sc_time_stamp(); sc_dt::uint64 adr = trans->get_address(); sc_assert( section == 3 || section == 4 ); if (section == 3) { if (flag3) cout << "Called get_next_transaction with section = " << section << "\n"; flag3 = false; sc_assert( t >= sc_time(1000, SC_NS) && t <= sc_time(1050, SC_NS) ); sc_assert( adr >= 0 && adr < 50); } else if (section == 4) { if (flag4) cout << "Called get_next_transaction with section = " << section << "\n"; flag4 = false; sc_assert( t >= sc_time(1050, SC_NS) && t <= sc_time(1100, SC_NS) ); sc_assert( adr >= 100 && adr < 150); } } } } int section; tlm_utils::peq_with_get m_peq; bool flag3, flag4; }; int sc_main(int argc, char* argv[]) { cout << "Unit test for cancel_all()\n"; Test_peq_with_cb cb("test_peq_with_cb"); Test_peq_with_get get("test_peq_with_get"); sc_start(); return 0; }