1#define SC_INCLUDE_DYNAMIC_PROCESSES 2#include "systemc" 3using namespace sc_core; 4using namespace sc_dt; 5using namespace std; 6 7#include "tlm.h" 8#include "tlm_utils/peq_with_cb_and_phase.h" 9#include "tlm_utils/peq_with_get.h" 10 11 12SC_MODULE(Test_peq_with_cb) 13{ 14 15 SC_CTOR(Test_peq_with_cb) 16 : m_peq(this, &Test_peq_with_cb::peq_cb), flag1(true), flag2(true) 17 { 18 SC_THREAD(thread); 19 } 20 21 void thread() 22 { 23 section = 1; 24 25 tlm::tlm_generic_payload *trans; 26 tlm::tlm_phase phase; 27 for (int i = 0; i < 50; i++) 28 { 29 trans = new tlm::tlm_generic_payload; 30 trans->set_address(i); 31 m_peq.notify( *trans, phase, sc_time(rand() % 100, SC_NS) ); 32 } 33 wait(50, SC_NS); 34 35 m_peq.cancel_all(); 36 cout << "cancel_all\n"; 37 section = 2; 38 39 for (int i = 100; i < 150; i++) 40 { 41 trans = new tlm::tlm_generic_payload; 42 trans->set_address(i); 43 m_peq.notify( *trans, phase, sc_time(rand() % 100, SC_NS) ); 44 } 45 wait(50, SC_NS); 46 m_peq.cancel_all(); 47 cout << "cancel_all\n"; 48 49 wait(50, SC_NS); 50 } 51 52 void peq_cb(tlm::tlm_generic_payload& trans, const tlm::tlm_phase& phase) 53 { 54 sc_time t = sc_time_stamp(); 55 sc_dt::uint64 adr = trans.get_address(); 56 sc_assert( section == 1 || section == 2 ); 57 if (section == 1) 58 { 59 if (flag1) cout << "Called peq_cb with section = " << section << "\n"; 60 flag1 = false; 61 sc_assert( t >= sc_time(0, SC_NS) && t <= sc_time(50, SC_NS) ); 62 sc_assert( adr >= 0 && adr < 50); 63 } 64 else if (section == 2) 65 { 66 if (flag2) cout << "Called peq_cb with section = " << section << "\n"; 67 flag2 = false; 68 sc_assert( t >= sc_time(50, SC_NS) && t <= sc_time(100, SC_NS) ); 69 sc_assert( adr >= 100 && adr < 150); 70 } 71 } 72 73 int section; 74 tlm_utils::peq_with_cb_and_phase<Test_peq_with_cb> m_peq; 75 bool flag1, flag2; 76}; 77 78 79SC_MODULE(Test_peq_with_get) 80{ 81 82 SC_CTOR(Test_peq_with_get) 83 : m_peq("foo"), flag3(true), flag4(true) 84 { 85 SC_THREAD(thread); 86 SC_THREAD(ass_end_thread); 87 } 88 89 void thread() 90 { 91 wait(1000, SC_NS); 92 93 section = 3; 94 95 tlm::tlm_generic_payload *trans; 96 for (int i = 0; i < 50; i++) 97 { 98 trans = new tlm::tlm_generic_payload; 99 trans->set_address(i); 100 m_peq.notify( *trans, sc_time(rand() % 100, SC_NS) ); 101 } 102 wait(50, SC_NS); 103 104 m_peq.cancel_all(); 105 cout << "cancel_all\n"; 106 section = 4; 107 108 for (int i = 100; i < 150; i++) 109 { 110 trans = new tlm::tlm_generic_payload; 111 trans->set_address(i); 112 m_peq.notify( *trans, sc_time(rand() % 100, SC_NS) ); 113 } 114 wait(50, SC_NS); 115 m_peq.cancel_all(); 116 cout << "cancel_all\n"; 117 118 wait(50, SC_NS); 119 } 120 121 void ass_end_thread() 122 { 123 tlm::tlm_generic_payload *trans; 124 for(;;) 125 { 126 wait(m_peq.get_event()); 127 while( (trans = m_peq.get_next_transaction()) ) 128 { 129 sc_time t = sc_time_stamp(); 130 sc_dt::uint64 adr = trans->get_address(); 131 sc_assert( section == 3 || section == 4 ); 132 if (section == 3) 133 { 134 if (flag3) cout << "Called get_next_transaction with section = " << section << "\n"; 135 flag3 = false; 136 sc_assert( t >= sc_time(1000, SC_NS) && t <= sc_time(1050, SC_NS) ); 137 sc_assert( adr >= 0 && adr < 50); 138 } 139 else if (section == 4) 140 { 141 if (flag4) cout << "Called get_next_transaction with section = " << section << "\n"; 142 flag4 = false; 143 sc_assert( t >= sc_time(1050, SC_NS) && t <= sc_time(1100, SC_NS) ); 144 sc_assert( adr >= 100 && adr < 150); 145 } 146 } 147 } 148 } 149 150 int section; 151 tlm_utils::peq_with_get<tlm::tlm_generic_payload> m_peq; 152 bool flag3, flag4; 153}; 154 155 156int sc_main(int argc, char* argv[]) 157{ 158 cout << "Unit test for cancel_all()\n"; 159 Test_peq_with_cb cb("test_peq_with_cb"); 160 Test_peq_with_get get("test_peq_with_get"); 161 sc_start(); 162 return 0; 163} 164 165