blob: df97d89629fbd557230b55002892d08ae4592b30 [file] [log] [blame]
#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<Test_peq_with_cb> 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<tlm::tlm_generic_payload> 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;
}