diff --git a/scc b/scc index dd8a539..331b6d7 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit dd8a539df05a14ab320f81af08b0db17faf489cb +Subproject commit 331b6d77ea5f9aed99bd0963a3bb234cf7c98b07 diff --git a/tests/cxs_tlm/csx_packet_test.cpp b/tests/cxs_tlm/csx_packet_test.cpp index aa3325b..8000a57 100644 --- a/tests/cxs_tlm/csx_packet_test.cpp +++ b/tests/cxs_tlm/csx_packet_test.cpp @@ -4,10 +4,11 @@ #include #undef CHECK #include +#include #include using namespace sc_core; - +namespace cxs { factory::add> tb8; factory::add> tb9; factory::add> tb10; @@ -22,22 +23,34 @@ template unsigned run_scenario(STATE& state) { auto run1 = sc_spawn([&dut, &state]() { auto burst_cnt{0}; + std::deque expected_pkt; for(auto size : state.packet_sizes) { cxs_pkt_shared_ptr tx_pkt = cxs_pkt_mm::get().allocate(); tx_pkt->get_data().resize(size); + SCCDEBUG("run_scenario") << "Transmitting packet with size " << size; auto phase{tlm::nw::REQUEST}; sc_core::sc_time t = sc_core::SC_ZERO_TIME; auto status = dut.isck->nb_transport_fw(*tx_pkt, phase, t); + expected_pkt.emplace_back(tx_pkt); + tx_pkt = nullptr; REQUIRE(status == tlm::TLM_UPDATED); REQUIRE(phase == tlm::nw::CONFIRM); if(++burst_cnt == state.granularity) { - ::sc_core::wait(dut.recv.data_written_event()); - while(!dut.recv.empty()) { - auto recv_pkt = dut.recv.front(); - dut.recv.pop_front(); - REQUIRE(tx_pkt == recv_pkt); - REQUIRE(recv_pkt->get_data().size() == state.packet_sizes[state.resp_cnt]); - state.resp_cnt++; + auto rec_cnt = 0u; + while(rec_cnt < burst_cnt) { + ::sc_core::wait(dut.recv.data_written_event()); + while(!dut.recv.empty()) { + auto recv_pkt = dut.recv.front(); + dut.recv.pop_front(); + tx_pkt = expected_pkt.front(); + expected_pkt.pop_front(); + REQUIRE(tx_pkt == recv_pkt); + REQUIRE(recv_pkt->get_data().size() == state.packet_sizes[state.resp_cnt]); + state.resp_cnt++; + rec_cnt++; + SCCDEBUG("run_scenario") << "Received packet with size " << recv_pkt->get_data().size() + << ", total number of packets is " << state.resp_cnt; + } } burst_cnt = 0; } @@ -89,24 +102,26 @@ TEST_CASE("single-packet", "[CXS][tlm-level]") { REQUIRE(state.resp_cnt == state.packet_sizes.size()); } } -/* -TEST_CASE("flit-alignment", "[CXS][tlm-level]") { + +TEST_CASE("multi-packet", "[CXS][tlm-level]") { struct { unsigned int reset_cycles{4}; + unsigned int max_cycles = 5000; std::vector packet_sizes; unsigned granularity{2}; unsigned resp_cnt{0}; } state; - state.packet_sizes.assign({4, 32, 32, 8, 64, 128}); - state.resp_cnt = 0; - auto cycles = run_scenario(8, state); + state.packet_sizes.assign({4, 8, 16, 32, 16, 64, 16, 128, 16, 256, 16, 1024}); + for(auto width = 8; width < 11; ++width) { + state.resp_cnt = 0; + auto cycles = run_scenario(width, state); - REQUIRE(cycles < 1000); - REQUIRE(sc_report_handler::get_count(SC_ERROR) == 0); - REQUIRE(sc_report_handler::get_count(SC_WARNING) == 0); + REQUIRE(cycles < state.max_cycles); + REQUIRE(sc_report_handler::get_count(SC_ERROR) == 0); + REQUIRE(sc_report_handler::get_count(SC_WARNING) == 0); - REQUIRE(state.resp_cnt == state.packet_sizes.size()); + REQUIRE(state.resp_cnt == state.packet_sizes.size()); + } } - -*/ +} // namespace cxs diff --git a/tests/cxs_tlm/testbench.h b/tests/cxs_tlm/testbench.h index 0d127dd..332d43d 100644 --- a/tests/cxs_tlm/testbench.h +++ b/tests/cxs_tlm/testbench.h @@ -15,7 +15,7 @@ using namespace sc_core; using namespace sc_dt; using namespace std; -using namespace cxs; +namespace cxs { const char* sc_gen_unique_name(const char*, bool preserve_first); template struct testbench : public sc_core::sc_module { @@ -72,5 +72,5 @@ template struct testbench : public sc_core::sc_module { sc_core::sc_event confirmation_evt; scc::fifo_w_cb recv; }; - +} // namespace cxs #endif // _TESTBENCH_H_