From 7bb02bb49e7f5bb68e95ce2af9efcc366a841dc8 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Tue, 21 Oct 2025 16:52:01 +0200 Subject: [PATCH] adds initial files for mt test --- .gitignore | 3 +- .vscode/launch.json | 30 +++++++++ .vscode/settings.json | 1 + CMakePresets.json | 5 +- conanfile.py | 5 +- scc | 2 +- tests/CMakeLists.txt | 1 + tests/configuration/top_module.h | 44 ++++++------- tests/quantum_keeper_mt/CMakeLists.txt | 5 ++ tests/quantum_keeper_mt/sc_main.cpp | 46 ++++++++++++++ tests/quantum_keeper_mt/top_module.h | 88 ++++++++++++++++++++++++++ 11 files changed, 197 insertions(+), 33 deletions(-) create mode 100644 tests/quantum_keeper_mt/CMakeLists.txt create mode 100644 tests/quantum_keeper_mt/sc_main.cpp create mode 100644 tests/quantum_keeper_mt/top_module.h diff --git a/.gitignore b/.gitignore index 65c3b47..f9f9210 100644 --- a/.gitignore +++ b/.gitignore @@ -48,4 +48,5 @@ /.venv/ /.cache /CMakeUserPresets.json -*.scview +/*.scview +/*.log \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 61973d6..bbf0a1b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,6 +4,36 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + { + "type": "gdb", + "request": "launch", + "name": "quantum_keeper_mt", + "program": "${workspaceFolder}/build/Debug/tests/quantum_keeper_mt/quantum_keeper_mt" + }, + { + "name": "cppdbg quantum_keeper_mt", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceRoot}/build/Debug/tests/quantum_keeper_mt/quantum_keeper_mt", + "args": [], + "stopAtEntry": false, + "cwd": "${fileDirname}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "description": "Set Disassembly Flavor to Intel", + "text": "-gdb-set disassembly-flavor intel", + "ignoreFailures": true + } + ] + }, { "name": "cci_param_restricted", "type": "gdb", diff --git a/.vscode/settings.json b/.vscode/settings.json index 4dce1a6..d46a1f1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,6 +6,7 @@ } ], "editor.formatOnSave": true, + "editor.hover.delay": 1500, "clangd.arguments": [ "--pretty", "--background-index", diff --git a/CMakePresets.json b/CMakePresets.json index 93eedb7..0a556d8 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -15,11 +15,12 @@ "binaryDir": "${sourceDir}/build/${presetName}", "cacheVariables": { "CMAKE_POLICY_DEFAULT_CMP0091": "NEW", - "CMAKE_CXX_STANDARD": "17", + "CMAKE_CXX_STANDARD": "20", "CMAKE_INSTALL_PREFIX": "${sourceDir}/install/${presetName}", "CMAKE_EXPORT_COMPILE_COMMANDS": "ON", "CMAKE_PROJECT_TOP_LEVEL_INCLUDES": "cmake-conan/conan_provider.cmake", - "CONAN_BUILD_PROFILE": "auto-cmake" + "CONAN_HOST_PROFILE": "auto-cmake", + "CONAN_BUILD_PROFILE": "conan_host_profile" } }, { diff --git a/conanfile.py b/conanfile.py index 9be5614..edfda26 100644 --- a/conanfile.py +++ b/conanfile.py @@ -35,7 +35,7 @@ class Pkg(ConanFile): } def requirements(self): - self.requires("systemc/2.3.4") + self.requires("systemc/3.0.1") self.requires("fmt/8.0.1") self.requires("spdlog/1.9.2") self.requires("boost/1.85.0") @@ -44,9 +44,6 @@ class Pkg(ConanFile): self.requires("yaml-cpp/0.7.0") self.requires("jsoncpp/1.9.5") self.requires("zlib/1.2.12") - self.requires("rapidjson/cci.20230929") - if os.path.isdir("tgc-iss/dbt-rise-plugins"): - self.requires("lua/5.4.3") def build_requirements(self): pass diff --git a/scc b/scc index 6c25b65..e672491 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit 6c25b65dc95d8310f613d689ce1e4a59647521d6 +Subproject commit e672491c6ac078698a945e6ec2742720846945bc diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 0982470..90877e2 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -11,6 +11,7 @@ add_subdirectory(sc_fixed_tracing) add_subdirectory(cxs_tlm) add_subdirectory(tlm_memory) add_subdirectory(memory_subsys) +add_subdirectory(quantum_keeper_mt) add_subdirectory(sim_speed) if(FULL_TEST_SUITE) add_subdirectory(sim_performance) diff --git a/tests/configuration/top_module.h b/tests/configuration/top_module.h index 2ce77ee..49663c0 100644 --- a/tests/configuration/top_module.h +++ b/tests/configuration/top_module.h @@ -32,6 +32,7 @@ #define EXAMPLES_EX09_HIERARCHICAL_OVERRIDE_OF_PARAMETER_VALUES_TOP_MODULE_H_ #include +#include #include #include #include @@ -40,6 +41,7 @@ #include "initiator.h" #include "router.h" #include "target.h" +#include /** * @class top_module @@ -89,15 +91,13 @@ public: /// Creating instances of initiator(s) for(int i = 0; i < n_initiators; i++) { - snprintf(initiatorName, sizeof(initiatorName), "initiator_%d", i); + auto initiatorName = fmt::format("initiator_{}", i); SCCINFO(SCMOD) << "[TOP_MODULE C_TOR] : Creating initiator : " << initiatorName; - snprintf(stringMisc, sizeof(stringMisc), "%s.%s.initiator_ID", name(), initiatorName); - - snprintf(initiatorName, sizeof(initiatorName), "\"initiator_%d\"", i); - m_broker.set_preset_cci_value(stringMisc, cci::cci_value::from_json(initiatorName)); - snprintf(initiatorName, sizeof(initiatorName), "initiator_%d", i); - initiatorList.push_back(new initiator(initiatorName)); + auto paramName = fmt::format("{}.{}.initiator_ID", name(), initiatorName); + auto quotedInitiatorName = fmt::format("\"initiator_{}\"", i); + m_broker.set_preset_cci_value(paramName, cci::cci_value::from_json(quotedInitiatorName)); + initiatorList.push_back(new initiator(initiatorName.c_str())); // Binding of initiator to Router SCCINFO(SCMOD) << "[TOP MODULE C_TOR] : Binding Router_Initiator to " << initiatorName; @@ -109,22 +109,21 @@ public: // Creating instances of target(s) for(int i = 0; i < n_targets; i++) { - snprintf(targetName, sizeof(targetName), "target_%d", i); + auto targetName = fmt::format("target_{}", i); SCCINFO(SCMOD) << "[TOP_MODULE C_TOR] : Creating target : " << targetName; - snprintf(stringMisc, sizeof(stringMisc), "%s.%s.target_ID", name(), targetName); - snprintf(targetName, sizeof(targetName), "\"target_%d\"", i); - m_broker.set_preset_cci_value(stringMisc, cci::cci_value::from_json(targetName)); - snprintf(targetName, sizeof(targetName), "target_%d", i); + auto paramName0 = fmt::format("{}.{}.initiator_ID", name(), targetName); + auto quotedTargetName = fmt::format("\"target_{}\"", i); + m_broker.set_preset_cci_value(paramName0, cci::cci_value::from_json(targetName)); // Set preset value for maximum target size(memory) - snprintf(stringMisc, sizeof(stringMisc), "%s.%s.s_size", name(), targetName); + auto paramName1 = fmt::format("{}.{}.initiator_ID", name(), targetName); ss.clear(); ss.str(""); ss << targetSize; - m_broker.set_preset_cci_value(stringMisc, cci::cci_value::from_json(ss.str())); - targetList.push_back(new target(targetName)); + m_broker.set_preset_cci_value(paramName1, cci::cci_value::from_json(ss.str())); + targetList.push_back(new target(targetName.c_str())); // Binding Router to target SCCINFO(SCMOD) << "[TOP MODULE C_TOR] : Binding Router_Initiator to " << targetName; @@ -133,7 +132,7 @@ public: // Try re-setting locked values for Router Table contents for(int i = 0; i < n_targets; i++) { - snprintf(targetName, sizeof(targetName), "%s.RouterInstance.r_index_%d", name(), i); + auto targetName = fmt::format("{}.RouterInstance.r_index_{}", name(), i); ss.clear(); ss.str(""); ss << i; @@ -145,12 +144,12 @@ public: SCCINFO(SCMOD) << "[ROUTER : Caught] : " << exception.what(); } - snprintf(targetName, sizeof(targetName), "%s.RouterInstance.r_sa_%d", name(), i); + targetName = fmt::format("{}.RouterInstance.r_sa_{}", name(), i); ss.clear(); ss.str(""); ss << (i * targetSize); - snprintf(targetBaseAddr, sizeof(targetBaseAddr), "%s.target_%d.s_base_addr", name(), i); + auto targetBaseAddr = fmt::format("{}.target_{}.s_base_addr", name(), i); cci::cci_param_untyped_handle h = m_broker.get_param_handle(targetBaseAddr); h.set_cci_value(cci::cci_value::from_json(ss.str())); @@ -162,7 +161,7 @@ public: SCCINFO(SCMOD) << "[ROUTER : Caught] : " << exception.what(); } - snprintf(targetName, sizeof(targetName), "%s.RouterInstance.r_ea_%d", name(), i); + targetName = fmt::format("{}.RouterInstance.r_ea_{}", name(), i); ss.clear(); ss.str(""); ss << ((i + 1) * targetSize - 1); @@ -210,15 +209,10 @@ private: std::vector initiatorList; ///< STD::VECTOR for initiators std::vector targetList; ///< STD::VECTOR for targets - char initiatorName[50]; ///< initiator_ID - char targetName[50]; ///< target_ID - char stringMisc[50]; ///< String to be used for misc things - char targetBaseAddr[50]; ///< The base address of the target - int addrValue{0}; ///< Address Value int targetSize; ///< Maximum target Size (preset value) int r_addr_max; ///< Maximum Router Table's memory range }; - // top_module +// top_module #endif // EXAMPLES_EX09_HIERARCHICAL_OVERRIDE_OF_PARAMETER_VALUES_TOP_MODULE_H_ diff --git a/tests/quantum_keeper_mt/CMakeLists.txt b/tests/quantum_keeper_mt/CMakeLists.txt new file mode 100644 index 0000000..413e451 --- /dev/null +++ b/tests/quantum_keeper_mt/CMakeLists.txt @@ -0,0 +1,5 @@ +add_executable (quantum_keeper_mt + sc_main.cpp +) +target_link_libraries (quantum_keeper_mt LINK_PUBLIC scc-sysc) +add_test(NAME quantum_keeper_mt COMMAND quantum_keeper_mt) \ No newline at end of file diff --git a/tests/quantum_keeper_mt/sc_main.cpp b/tests/quantum_keeper_mt/sc_main.cpp new file mode 100644 index 0000000..7e0ca51 --- /dev/null +++ b/tests/quantum_keeper_mt/sc_main.cpp @@ -0,0 +1,46 @@ +#include "top_module.h" +#include "util/logging.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace scc; +using namespace sc_core; + +jmp_buf abrt; +void ABRThandler(int sig) { longjmp(abrt, 1); } + +int sc_main(int argc, char* argv[]) { + signal(SIGABRT, ABRThandler); + auto my_name = util::split(argv[0], '/').back(); + auto level = "3"; // getenv("SCC_TEST_VERBOSE"); + auto log_lvl = level ? static_cast(std::min(strtoul(level, nullptr, 10) + 4, 7UL)) : log::FATAL; + scc::init_logging(LogConfig().logLevel(log_lvl).logAsync(false).msgTypeFieldWidth(35)); + LOGGER(DEFAULT)::reporting_level().store(logging::TRACEALL); + scc::configurer cfg(""); + // create tracer if environment variable SCC_TEST_TRACE is defined + std::unique_ptr tracer; + if(auto* test_trace = getenv("SCC_TEST_TRACE")) { + tracer = std::make_unique(my_name, scc::tracer::ENABLE, scc::tracer::ENABLE); + tracer->set_default_trace_enable(true); + } + int result = -1; + tlm_utils::tlm_quantumkeeper::set_global_quantum(3_us); + if(setjmp(abrt) == 0) { + // instantiate design(s) + top_module top_mod("top_module_inst"); + // Start the simulation + sc_core::sc_start(20_us); + } else { + SCCERR() << "Some error occured"; + } + return sc_core::sc_report_handler::get_count(sc_core::SC_ERROR) + sc_core::sc_report_handler::get_count(sc_core::SC_WARNING); +} diff --git a/tests/quantum_keeper_mt/top_module.h b/tests/quantum_keeper_mt/top_module.h new file mode 100644 index 0000000..5a08c17 --- /dev/null +++ b/tests/quantum_keeper_mt/top_module.h @@ -0,0 +1,88 @@ +#ifndef _TOP_MODULE_H_ +#define _TOP_MODULE_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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) { + SC_THREAD(run); + } + + ~initiator() {} + +private: + void run() { + wait(sc_core::SC_ZERO_TIME); // guard elaboration phase + quantum_keeper.reset(); + core_executor.start([this]() { return thread_exec(); }); + wait(core_executor.thread_finish_event()); + sc_core::sc_stop(); + } + + sc_core::sc_time thread_exec() { + SCCDEBUG(SCMOD) << "starting thread_exec"; + for(auto i = 0u; i < 16; ++i) { + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + if(i && (i % 3) == 0) { + tlm::tlm_generic_payload gp; + sc_core::sc_time t; + SCCDEBUG(SCMOD) << "initiating b_transport at local time " << quantum_keeper.get_local_absolute_time(); + quantum_keeper.execute_on_sysc([this, &gp, &t]() { + SCCDEBUG(SCMOD) << "executing b_transport"; + auto t0 = sc_core::sc_time_stamp(); + this->isckt->b_transport(gp, t); + return t0 - sc_core::sc_time_stamp(); + }); + if(t.value()) { + SCCDEBUG(SCMOD) << "incrementing local time by b_transport delay of " << t; + quantum_keeper.inc(t); + } + } else { + quantum_keeper.check_and_sync(1_us); + } + SCCDEBUG(SCMOD) << "local time now " << quantum_keeper.get_local_absolute_time(); + } + SCCDEBUG(SCMOD) << "finished thread_exec at local time " << quantum_keeper.get_local_absolute_time(); + return quantum_keeper.get_local_absolute_time(); + } + tlm::scc::quantumkeeper_mt quantum_keeper; + scc::async_thread core_executor; +}; + +// top_module +struct top_module : ::sc_core ::sc_module { + initiator core{"core"}; + + tlm_utils::simple_target_socket tsckt{"tsckt"}; + + top_module(sc_core::sc_module_name nm) + : sc_core::sc_module(nm) { + core.isckt(tsckt); + tsckt.register_b_transport(this, &top_module::b_transport); + } + + ~top_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; + gp.set_response_status(tlm::TLM_OK_RESPONSE); + } +}; +#endif // _TOP_MODULE_H_