diff --git a/.vscode/launch.json b/.vscode/launch.json index bbf0a1b..0e8969e 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -8,7 +8,10 @@ "type": "gdb", "request": "launch", "name": "quantum_keeper_mt", - "program": "${workspaceFolder}/build/Debug/tests/quantum_keeper_mt/quantum_keeper_mt" + "program": "${workspaceFolder}/build/Debug/tests/quantum_keeper_mt/quantum_keeper_mt", + "environment": { + "SCC_TEST_VERBOSE": "7" + } }, { "name": "cppdbg quantum_keeper_mt", diff --git a/scc b/scc index cc35ebf..df0b696 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit cc35ebf490cf314972fde6570673c5ba40eb7b23 +Subproject commit df0b69632d336a5bffdcb7565f70440d904bc91c diff --git a/tests/quantum_keeper_mt/CMakeLists.txt b/tests/quantum_keeper_mt/CMakeLists.txt index 5666264..980c0ca 100644 --- a/tests/quantum_keeper_mt/CMakeLists.txt +++ b/tests/quantum_keeper_mt/CMakeLists.txt @@ -1,5 +1,5 @@ if(SC_VERSION_MAJOR GREATER 2) add_executable (quantum_keeper_mt sc_main.cpp) - target_link_libraries (quantum_keeper_mt LINK_PUBLIC scc-sysc) + target_link_libraries (quantum_keeper_mt LINK_PUBLIC scc::components) add_test(NAME quantum_keeper_mt COMMAND quantum_keeper_mt) endif() \ No newline at end of file diff --git a/tests/quantum_keeper_mt/sc_main.cpp b/tests/quantum_keeper_mt/sc_main.cpp index c96a7a0..34a1961 100644 --- a/tests/quantum_keeper_mt/sc_main.cpp +++ b/tests/quantum_keeper_mt/sc_main.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -38,6 +39,8 @@ int sc_main(int argc, char* argv[]) { top_module top_mod("top_module_inst"); // Start the simulation sc_core::sc_start(20_us); + if(sc_core::sc_is_running()) + sc_core::sc_stop(); SCCINFO() << "Simulation finished"; } else { SCCERR() << "Some error occured"; diff --git a/tests/quantum_keeper_mt/top_module.h b/tests/quantum_keeper_mt/top_module.h index 10fd595..a08e34e 100644 --- a/tests/quantum_keeper_mt/top_module.h +++ b/tests/quantum_keeper_mt/top_module.h @@ -1,11 +1,13 @@ #ifndef _TOP_MODULE_H_ #define _TOP_MODULE_H_ +#include "scc/mt19937_rng.h" #include #include #include #include #include +#include #include #include #include @@ -17,13 +19,15 @@ #include #include #include + enum { CLIENT_DELAY = 100, SC_DELAY = 10 }; struct initiator : ::sc_core ::sc_module { tlm_utils::simple_initiator_socket isckt{"isckt"}; - initiator(sc_core::sc_module_name nm) - : sc_core::sc_module(nm) { + initiator(sc_core::sc_module_name nm, sc_core::sc_time period = 1_us) + : sc_core::sc_module(nm) + , period(period) { SC_THREAD(run); } @@ -55,7 +59,7 @@ private: quantum_keeper.inc(t); } } else { - quantum_keeper.check_and_sync(1_us); + quantum_keeper.check_and_sync(period); } SCCDEBUG(SCMOD) << "local time now " << quantum_keeper.get_local_absolute_time(); } @@ -64,17 +68,23 @@ private: } tlm::scc::quantumkeeper_mt quantum_keeper; scc::async_thread core_executor; + const sc_core::sc_time period{1_us}; }; // top_module struct top_module : ::sc_core ::sc_module { - initiator core{"core"}; + initiator core0{"core0"}; + initiator core1{"core1", 1500_ns}; + scc::router router{"router", 1, 2}; tlm_utils::simple_target_socket tsckt{"tsckt"}; top_module(sc_core::sc_module_name nm) : sc_core::sc_module(nm) { - core.isckt(tsckt); + core0.isckt(router.target[0]); + core1.isckt(router.target[1]); + router.initiator[0](tsckt); + router.set_default_target(0); tsckt.register_b_transport(this, &top_module::b_transport); SC_THREAD(run); } @@ -83,7 +93,8 @@ struct top_module : ::sc_core ::sc_module { void b_transport(tlm::tlm_generic_payload& gp, sc_core::sc_time& t) { SCCDEBUG(SCMOD) << "Received b_transport call at local time " << t; - t += 5_us; + auto cycles = rng.uniform(0, 5); + t += sc_core::sc_time(cycles, sc_core::SC_US); gp.set_response_status(tlm::TLM_OK_RESPONSE); } @@ -91,8 +102,10 @@ struct top_module : ::sc_core ::sc_module { wait(sc_core::SC_ZERO_TIME); while(true) { std::this_thread::sleep_for(std::chrono::milliseconds(SC_DELAY)); - wait(1500_ns); + wait(500_ns); } } + + scc::MT19937 rng; }; #endif // _TOP_MODULE_H_