From 8b64cbf047c6a0f26efe8c71e6f94d84e1f01fcb Mon Sep 17 00:00:00 2001 From: Jonathan Hager Date: Wed, 12 Feb 2025 22:42:52 +0100 Subject: [PATCH 01/17] Added TlmRecorderWrapper to handle database logic --- src/libdramsys/CMakeLists.txt | 1 + .../DRAMSys/common/TlmRecorderWrapper.cpp | 65 +++++++++++++++++++ .../DRAMSys/common/TlmRecorderWrapper.h | 57 ++++++++++++++++ src/libdramsys/DRAMSys/simulation/DRAMSys.cpp | 21 +++++- src/libdramsys/DRAMSys/simulation/DRAMSys.h | 4 ++ 5 files changed, 145 insertions(+), 3 deletions(-) create mode 100644 src/libdramsys/DRAMSys/common/TlmRecorderWrapper.cpp create mode 100644 src/libdramsys/DRAMSys/common/TlmRecorderWrapper.h diff --git a/src/libdramsys/CMakeLists.txt b/src/libdramsys/CMakeLists.txt index c7bcab1c..0b1e0d7a 100644 --- a/src/libdramsys/CMakeLists.txt +++ b/src/libdramsys/CMakeLists.txt @@ -39,6 +39,7 @@ add_library(libdramsys DRAMSys/common/DebugManager.cpp DRAMSys/common/TlmRecorder.cpp + DRAMSys/common/TlmRecorderWrapper.cpp DRAMSys/common/dramExtensions.cpp DRAMSys/common/utils.cpp DRAMSys/configuration/memspec/MemSpec.cpp diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.cpp b/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.cpp new file mode 100644 index 00000000..e16c9352 --- /dev/null +++ b/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.cpp @@ -0,0 +1,65 @@ +#include "TlmRecorderWrapper.h" + +namespace DRAMSys +{ +// TlmRecorderWrapper::TlmRecorderWrapper(const std::string& name, +// const SimConfig& simConfig, +// const McConfig& mcConfig, +// const MemSpec& memSpec, +// const std::string& dbName, +// const std::string& mcconfig, +// const std::string& memspec, +// const std::string& traces) : +// tlmRecorder(name, simConfig, mcConfig, memSpec, dbName, mcconfig, memspec, traces) +// { +// // TODO: Nothing?? +// } + +TlmRecorderWrapper::TlmRecorderWrapper(const sc_core::sc_module_name& name, + TlmRecorder& tlmRecorder) : + sc_module(name), + tlmRecorder(tlmRecorder) +{ + // TODO: Nothing?? +} + +tlm::tlm_sync_enum TlmRecorderWrapper::nb_transport_fw(tlm::tlm_generic_payload& trans, + tlm::tlm_phase& phase, + sc_core::sc_time& delay) +{ + tlmRecorder.recordPhase(trans, phase, delay); + return iSocket->nb_transport_fw(trans, phase, delay); +} + +tlm::tlm_sync_enum TlmRecorderWrapper::nb_transport_bw(tlm::tlm_generic_payload& trans, + tlm::tlm_phase& phase, + sc_core::sc_time& delay) +{ + tlmRecorder.recordPhase(trans, phase, delay); + return tSocket->nb_transport_bw(trans, phase, delay); +} + +void TlmRecorderWrapper::b_transport(tlm::tlm_generic_payload& trans, sc_core::sc_time& delay) +{ + // TODO: Implement me +} + +unsigned int TlmRecorderWrapper::transport_dbg(tlm::tlm_generic_payload& trans) +{ + // TODO: Implement me + return 0; +} + +bool TlmRecorderWrapper::get_direct_mem_ptr(tlm::tlm_generic_payload& trans, tlm::tlm_dmi& dmi_data) +{ + // TODO: Implement me + return false; +} + +void TlmRecorderWrapper::invalidate_direct_mem_ptr(sc_dt::uint64 start_range, + sc_dt::uint64 end_range) +{ + // TODO: Implement me +} + +} // namespace DRAMSys diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.h b/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.h new file mode 100644 index 00000000..49103ae4 --- /dev/null +++ b/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.h @@ -0,0 +1,57 @@ +#ifndef TLMRECORDERWRAPPER_H +#define TLMRECORDERWRAPPER_H + +#include "DRAMSys/configuration/memspec/MemSpec.h" +#include "DRAMSys/controller/McConfig.h" +#include "DRAMSys/simulation/SimConfig.h" +#include "TlmRecorder.h" + +#include + +namespace DRAMSys +{ + +class TlmRecorderWrapper : public sc_core::sc_module, + public tlm::tlm_fw_transport_if, + public tlm::tlm_bw_transport_if + +{ +public: + tlm::tlm_initiator_socket<> iSocket; + tlm::tlm_target_socket<> tSocket; + + // TlmRecorderWrapper(const std::string& name, + // const SimConfig& simConfig, + // const McConfig& mcConfig, + // const MemSpec& memSpec, + // const std::string& dbName, + // const std::string& mcconfig, + // const std::string& memspec, + // const std::string& traces); + + TlmRecorderWrapper(const sc_core::sc_module_name& name, TlmRecorder& tlmRecorder); + + // TlmRecorderWrapper(const TlmRecorderWrapper&) = delete; + // TlmRecorderWrapper(TlmRecorderWrapper&&) = default; + // TlmRecorderWrapper& operator=(const TlmRecorderWrapper&) = delete; + // TlmRecorderWrapper& operator=(TlmRecorderWrapper&&) = delete; + ~TlmRecorderWrapper() = default; + + tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload& trans, + tlm::tlm_phase& phase, + sc_core::sc_time& delay) override; + tlm::tlm_sync_enum nb_transport_bw(tlm::tlm_generic_payload& trans, + tlm::tlm_phase& phase, + sc_core::sc_time& delay) override; + void b_transport(tlm::tlm_generic_payload& trans, sc_core::sc_time& delay) override; + unsigned int transport_dbg(tlm::tlm_generic_payload& trans) override; + bool get_direct_mem_ptr(tlm::tlm_generic_payload& trans, tlm::tlm_dmi& dmi_data) override; + void invalidate_direct_mem_ptr(sc_dt::uint64 start_range, sc_dt::uint64 end_range) override; + +private: + TlmRecorder& tlmRecorder; +}; + +} // namespace DRAMSys + +#endif // TLMRECORDERWRAPPER_H diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp index 5bd6ae3b..a505e5d1 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp @@ -114,13 +114,18 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio *addressDecoder, tlmRecorders[i])); - drams.emplace_back(std::make_unique( - ("dram" + std::to_string(i)).c_str(), simConfig, *memSpec, tlmRecorders[i])); + // drams.emplace_back(std::make_unique( + // ("dram" + std::to_string(i)).c_str(), simConfig, *memSpec, tlmRecorders[i])); + + drams.emplace_back( + std::make_unique(("dram" + std::to_string(i)).c_str(), simConfig, *memSpec)); if (simConfig.checkTLM2Protocol) controllersTlmCheckers.emplace_back( std::make_unique>( ("TLMCheckerController" + std::to_string(i)).c_str())); + + tlmWrappers.emplace_back(std::make_unique(("TlmRecorderWrapper" + std::to_string(i)).c_str(), tlmRecorders[i])); } } else @@ -155,7 +160,17 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio { arbiter->iSocket.bind(controllers[i]->tSocket); } - controllers[i]->iSocket.bind(drams[i]->tSocket); + + // TODO: comments + if (simConfig.databaseRecording) + { + controllers[i]->iSocket.bind(tlmWrappers[i]->tSocket); + tlmWrappers[i]->iSocket.bind(drams[i]->tSocket); + } + else + { + controllers[i]->iSocket.bind(drams[i]->tSocket); + } } report(); diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.h b/src/libdramsys/DRAMSys/simulation/DRAMSys.h index e1c29aeb..7ee4f5d5 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.h +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.h @@ -42,6 +42,7 @@ #define DRAMSYS_H #include "DRAMSys/common/TlmRecorder.h" +#include "DRAMSys/common/TlmRecorderWrapper.h" #include "DRAMSys/common/tlm2_base_protocol_checker.h" #include "DRAMSys/config/DRAMSysConfiguration.h" #include "DRAMSys/controller/Controller.h" @@ -125,6 +126,9 @@ private: // Transaction Recorders (one per channel). // They generate the output databases. std::vector tlmRecorders; + + // TODO: Comments + std::vector> tlmWrappers; }; } // namespace DRAMSys From 0975e52f5f0ea73e9c8b002bd08f3beb497f6da3 Mon Sep 17 00:00:00 2001 From: Jonathan Hager Date: Thu, 13 Feb 2025 11:33:36 +0100 Subject: [PATCH 02/17] Changed TlmRecorderWrapper to simple_sockets --- .../DRAMSys/common/TlmRecorderWrapper.cpp | 26 ++----------------- .../DRAMSys/common/TlmRecorderWrapper.h | 19 ++++++-------- 2 files changed, 10 insertions(+), 35 deletions(-) diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.cpp b/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.cpp index e16c9352..dd71e53f 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.cpp +++ b/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.cpp @@ -20,7 +20,8 @@ TlmRecorderWrapper::TlmRecorderWrapper(const sc_core::sc_module_name& name, sc_module(name), tlmRecorder(tlmRecorder) { - // TODO: Nothing?? + iSocket.register_nb_transport_bw(this, &TlmRecorderWrapper::nb_transport_bw); + tSocket.register_nb_transport_fw(this, &TlmRecorderWrapper::nb_transport_fw); } tlm::tlm_sync_enum TlmRecorderWrapper::nb_transport_fw(tlm::tlm_generic_payload& trans, @@ -39,27 +40,4 @@ tlm::tlm_sync_enum TlmRecorderWrapper::nb_transport_bw(tlm::tlm_generic_payload& return tSocket->nb_transport_bw(trans, phase, delay); } -void TlmRecorderWrapper::b_transport(tlm::tlm_generic_payload& trans, sc_core::sc_time& delay) -{ - // TODO: Implement me -} - -unsigned int TlmRecorderWrapper::transport_dbg(tlm::tlm_generic_payload& trans) -{ - // TODO: Implement me - return 0; -} - -bool TlmRecorderWrapper::get_direct_mem_ptr(tlm::tlm_generic_payload& trans, tlm::tlm_dmi& dmi_data) -{ - // TODO: Implement me - return false; -} - -void TlmRecorderWrapper::invalidate_direct_mem_ptr(sc_dt::uint64 start_range, - sc_dt::uint64 end_range) -{ - // TODO: Implement me -} - } // namespace DRAMSys diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.h b/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.h index 49103ae4..47f3847e 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.h +++ b/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.h @@ -7,18 +7,18 @@ #include "TlmRecorder.h" #include +#include +#include namespace DRAMSys { -class TlmRecorderWrapper : public sc_core::sc_module, - public tlm::tlm_fw_transport_if, - public tlm::tlm_bw_transport_if +class TlmRecorderWrapper : public sc_core::sc_module { public: - tlm::tlm_initiator_socket<> iSocket; - tlm::tlm_target_socket<> tSocket; + tlm_utils::simple_initiator_socket iSocket; + tlm_utils::simple_target_socket tSocket; // TlmRecorderWrapper(const std::string& name, // const SimConfig& simConfig, @@ -39,16 +39,13 @@ public: tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, - sc_core::sc_time& delay) override; + sc_core::sc_time& delay); tlm::tlm_sync_enum nb_transport_bw(tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, - sc_core::sc_time& delay) override; - void b_transport(tlm::tlm_generic_payload& trans, sc_core::sc_time& delay) override; - unsigned int transport_dbg(tlm::tlm_generic_payload& trans) override; - bool get_direct_mem_ptr(tlm::tlm_generic_payload& trans, tlm::tlm_dmi& dmi_data) override; - void invalidate_direct_mem_ptr(sc_dt::uint64 start_range, sc_dt::uint64 end_range) override; + sc_core::sc_time& delay); private: + // TODO: Refactor with shared pointers? TlmRecorder& tlmRecorder; }; From d5862e55eabd96dbe467179065e9773f76f19a27 Mon Sep 17 00:00:00 2001 From: Jonathan Hager Date: Tue, 25 Feb 2025 14:05:34 +0100 Subject: [PATCH 03/17] Moved DramRecordable logic to Dram --- src/libdramsys/DRAMSys/simulation/DRAMSys.cpp | 14 ++--- src/libdramsys/DRAMSys/simulation/Dram.cpp | 58 ++++++++++++++++++- src/libdramsys/DRAMSys/simulation/Dram.h | 13 ++++- 3 files changed, 74 insertions(+), 11 deletions(-) diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp index a505e5d1..a7d3a282 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp @@ -114,18 +114,16 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio *addressDecoder, tlmRecorders[i])); - // drams.emplace_back(std::make_unique( - // ("dram" + std::to_string(i)).c_str(), simConfig, *memSpec, tlmRecorders[i])); - - drams.emplace_back( - std::make_unique(("dram" + std::to_string(i)).c_str(), simConfig, *memSpec)); + drams.emplace_back(std::make_unique( + ("dram" + std::to_string(i)).c_str(), simConfig, *memSpec, tlmRecorders[i])); if (simConfig.checkTLM2Protocol) controllersTlmCheckers.emplace_back( std::make_unique>( ("TLMCheckerController" + std::to_string(i)).c_str())); - tlmWrappers.emplace_back(std::make_unique(("TlmRecorderWrapper" + std::to_string(i)).c_str(), tlmRecorders[i])); + tlmWrappers.emplace_back(std::make_unique( + ("TlmRecorderWrapper" + std::to_string(i)).c_str(), tlmRecorders[i])); } } else @@ -135,8 +133,8 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio controllers.emplace_back(std::make_unique( ("controller" + std::to_string(i)).c_str(), mcConfig, *memSpec, *addressDecoder)); - drams.emplace_back( - std::make_unique(("dram" + std::to_string(i)).c_str(), simConfig, *memSpec)); + drams.emplace_back(std::make_unique( + ("dram" + std::to_string(i)).c_str(), simConfig, *memSpec, tlmRecorders[i])); if (simConfig.checkTLM2Protocol) { diff --git a/src/libdramsys/DRAMSys/simulation/Dram.cpp b/src/libdramsys/DRAMSys/simulation/Dram.cpp index 6f767fe4..5b1e7d4c 100644 --- a/src/libdramsys/DRAMSys/simulation/Dram.cpp +++ b/src/libdramsys/DRAMSys/simulation/Dram.cpp @@ -41,7 +41,9 @@ #include "Dram.h" #include "DRAMSys/common/DebugManager.h" +#include "DRAMSys/common/TlmRecorder.h" #include "DRAMSys/config/SimConfig.h" +#include #ifdef DRAMPOWER #include "LibDRAMPower.h" @@ -67,13 +69,18 @@ using namespace DRAMPower; namespace DRAMSys { -Dram::Dram(const sc_module_name& name, const SimConfig& simConfig, const MemSpec& memSpec) : +Dram::Dram(const sc_module_name& name, + const SimConfig& simConfig, + const MemSpec& memSpec, + TlmRecorder& tlmRecorder) : sc_module(name), memSpec(memSpec), storeMode(simConfig.storeMode), powerAnalysis(simConfig.powerAnalysis), channelSize(memSpec.getSimMemSizeInBytes() / memSpec.numberOfChannels), - useMalloc(simConfig.useMalloc) + useMalloc(simConfig.useMalloc), + tlmRecorder(tlmRecorder), + powerWindowSize(memSpec.tCK * simConfig.windowSize) { if (storeMode == Config::StoreModeType::Store) { @@ -109,6 +116,9 @@ Dram::Dram(const sc_module_name& name, const SimConfig& simConfig, const MemSpec { DRAMPower = std::make_unique(memSpec.toDramPowerMemSpec(), false); } + + if (simConfig.powerAnalysis && simConfig.enableWindowing) + SC_THREAD(powerWindow); #endif } @@ -132,6 +142,10 @@ void Dram::reportPower() std::cout << name() << std::string(" Average Power: ") << std::fixed << std::setprecision(2) << DRAMPower->getPower().average_power * memSpec.devicesPerRank << std::string(" mW") << std::endl; + + tlmRecorder.recordPower(sc_time_stamp().to_seconds(), + this->DRAMPower->getPower().window_average_power * + this->memSpec.devicesPerRank); #endif } @@ -267,4 +281,44 @@ void Dram::deserialize(std::istream& stream) stream.read(reinterpret_cast(memory), channelSize); } +#ifdef DRAMPOWER +// This Thread is only triggered when Power Simulation is enabled. +// It estimates the current average power which will be stored in the trace database for +// visualization purposes. +void Dram::powerWindow() +{ + int64_t clkCycles = 0; + + while (true) + { + // At the very beginning (zero clock cycles) the energy is 0, so we wait first + sc_module::wait(powerWindowSize); + + clkCycles = std::lround(sc_time_stamp() / this->memSpec.tCK); + + this->DRAMPower->calcWindowEnergy(clkCycles); + + // During operation the energy should never be zero since the device is always consuming + assert(!this->DRAMPower->getEnergy().window_energy < 1e-05); + + // Store the time (in seconds) and the current average power (in mW) into the database + tlmRecorder.recordPower(sc_time_stamp().to_seconds(), + this->DRAMPower->getPower().window_average_power * + this->memSpec.devicesPerRank); + + // Here considering that DRAMPower provides the energy in pJ and the power in mW + PRINTDEBUGMESSAGE(this->name(), + std::string("\tWindow Energy: \t") + + std::to_string(this->DRAMPower->getEnergy().window_energy * + this->memSpec.devicesPerRank) + + std::string("\t[pJ]")); + PRINTDEBUGMESSAGE(this->name(), + std::string("\tWindow Average Power: \t") + + std::to_string(this->DRAMPower->getPower().window_average_power * + this->memSpec.devicesPerRank) + + std::string("\t[mW]")); + } +} +#endif + } // namespace DRAMSys diff --git a/src/libdramsys/DRAMSys/simulation/Dram.h b/src/libdramsys/DRAMSys/simulation/Dram.h index d8c7125a..add46abe 100644 --- a/src/libdramsys/DRAMSys/simulation/Dram.h +++ b/src/libdramsys/DRAMSys/simulation/Dram.h @@ -43,6 +43,7 @@ #include "DRAMSys/common/Deserialize.h" #include "DRAMSys/common/Serialize.h" +#include "DRAMSys/common/TlmRecorder.h" #include "DRAMSys/configuration/memspec/MemSpec.h" #include "DRAMSys/simulation/SimConfig.h" @@ -68,8 +69,15 @@ protected: const uint64_t channelSize; const bool useMalloc; + TlmRecorder& tlmRecorder; + sc_core::sc_time powerWindowSize; + #ifdef DRAMPOWER std::unique_ptr DRAMPower; + // This Thread is only triggered when Power Simulation is enabled. + // It estimates the current average power which will be stored in the trace database for + // visualization purposes. + void powerWindow(); #endif virtual tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload& trans, @@ -82,7 +90,10 @@ protected: void executeWrite(const tlm::tlm_generic_payload& trans); public: - Dram(const sc_core::sc_module_name& name, const SimConfig& simConfig, const MemSpec& memSpec); + Dram(const sc_core::sc_module_name& name, + const SimConfig& simConfig, + const MemSpec& memSpec, + TlmRecorder& tlmRecorder); SC_HAS_PROCESS(Dram); Dram(const Dram&) = delete; From c45137958d6ae2b12ecebf1439529a30d4f7985b Mon Sep 17 00:00:00 2001 From: Jonathan Hager Date: Tue, 25 Feb 2025 14:06:03 +0100 Subject: [PATCH 04/17] Removed DramRecordable --- src/libdramsys/CMakeLists.txt | 1 - src/libdramsys/DRAMSys/simulation/DRAMSys.h | 1 + .../DRAMSys/simulation/DramRecordable.cpp | 121 ------------------ .../DRAMSys/simulation/DramRecordable.h | 90 ------------- 4 files changed, 1 insertion(+), 212 deletions(-) delete mode 100644 src/libdramsys/DRAMSys/simulation/DramRecordable.cpp delete mode 100644 src/libdramsys/DRAMSys/simulation/DramRecordable.h diff --git a/src/libdramsys/CMakeLists.txt b/src/libdramsys/CMakeLists.txt index 0b1e0d7a..8c039694 100644 --- a/src/libdramsys/CMakeLists.txt +++ b/src/libdramsys/CMakeLists.txt @@ -91,7 +91,6 @@ add_library(libdramsys DRAMSys/simulation/Arbiter.cpp DRAMSys/simulation/DRAMSys.cpp DRAMSys/simulation/Dram.cpp - DRAMSys/simulation/DramRecordable.cpp DRAMSys/simulation/SimConfig.cpp ) diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.h b/src/libdramsys/DRAMSys/simulation/DRAMSys.h index 7ee4f5d5..66b9a9ee 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.h +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.h @@ -50,6 +50,7 @@ #include "DRAMSys/controller/McConfig.h" #include "DRAMSys/simulation/AddressDecoder.h" #include "DRAMSys/simulation/Arbiter.h" +#include "DRAMSys/simulation/Dram.h" #include "DRAMSys/simulation/SimConfig.h" #include diff --git a/src/libdramsys/DRAMSys/simulation/DramRecordable.cpp b/src/libdramsys/DRAMSys/simulation/DramRecordable.cpp deleted file mode 100644 index 6723e4cc..00000000 --- a/src/libdramsys/DRAMSys/simulation/DramRecordable.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2019, RPTU Kaiserslautern-Landau - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: - * Lukas Steiner - */ - -#include "DramRecordable.h" - -#include "DRAMSys/common/DebugManager.h" -#include "DRAMSys/common/TlmRecorder.h" -#include "DRAMSys/common/utils.h" - -using namespace sc_core; -using namespace tlm; - -namespace DRAMSys -{ - -DramRecordable::DramRecordable(const sc_module_name& name, - const SimConfig& simConfig, - const MemSpec& memSpec, - TlmRecorder& tlmRecorder) : - Dram(name, simConfig, memSpec), - tlmRecorder(tlmRecorder), - powerWindowSize(memSpec.tCK * simConfig.windowSize) -{ -#ifdef DRAMPOWER - // Create a thread that is triggered every $powerWindowSize - // to generate a Power over Time plot in the Trace analyzer: - if (simConfig.powerAnalysis && simConfig.enableWindowing) - SC_THREAD(powerWindow); -#endif -} - -void DramRecordable::reportPower() -{ - Dram::reportPower(); -#ifdef DRAMPOWER - tlmRecorder.recordPower(sc_time_stamp().to_seconds(), - this->DRAMPower->getPower().window_average_power * - this->memSpec.devicesPerRank); -#endif -} - -tlm_sync_enum -DramRecordable::nb_transport_fw(tlm_generic_payload& trans, tlm_phase& phase, sc_time& delay) -{ - tlmRecorder.recordPhase(trans, phase, delay); - return Dram::nb_transport_fw(trans, phase, delay); -} - -#ifdef DRAMPOWER -// This Thread is only triggered when Power Simulation is enabled. -// It estimates the current average power which will be stored in the trace database for -// visualization purposes. -void DramRecordable::powerWindow() -{ - int64_t clkCycles = 0; - - while (true) - { - // At the very beginning (zero clock cycles) the energy is 0, so we wait first - sc_module::wait(powerWindowSize); - - clkCycles = std::lround(sc_time_stamp() / this->memSpec.tCK); - - this->DRAMPower->calcWindowEnergy(clkCycles); - - // During operation the energy should never be zero since the device is always consuming - assert(!isEqual(this->DRAMPower->getEnergy().window_energy, 0.0)); - - // Store the time (in seconds) and the current average power (in mW) into the database - tlmRecorder.recordPower(sc_time_stamp().to_seconds(), - this->DRAMPower->getPower().window_average_power * - this->memSpec.devicesPerRank); - - // Here considering that DRAMPower provides the energy in pJ and the power in mW - PRINTDEBUGMESSAGE(this->name(), - std::string("\tWindow Energy: \t") + - std::to_string(this->DRAMPower->getEnergy().window_energy * - this->memSpec.devicesPerRank) + - std::string("\t[pJ]")); - PRINTDEBUGMESSAGE(this->name(), - std::string("\tWindow Average Power: \t") + - std::to_string(this->DRAMPower->getPower().window_average_power * - this->memSpec.devicesPerRank) + - std::string("\t[mW]")); - } -} -#endif - -} // namespace DRAMSys diff --git a/src/libdramsys/DRAMSys/simulation/DramRecordable.h b/src/libdramsys/DRAMSys/simulation/DramRecordable.h deleted file mode 100644 index 5c332a80..00000000 --- a/src/libdramsys/DRAMSys/simulation/DramRecordable.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2019, RPTU Kaiserslautern-Landau - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: - * Lukas Steiner - */ - -#ifndef DRAMRECORDABLE_H -#define DRAMRECORDABLE_H - -#include "DRAMSys/common/TlmRecorder.h" -#include "Dram.h" - -#ifdef DRAMPOWER -#include "LibDRAMPower.h" -#endif - -#include -#include - -namespace DRAMSys -{ - -class DramRecordable : public Dram -{ -public: - DramRecordable(const sc_core::sc_module_name& name, - const SimConfig& simConfig, - const MemSpec& memSpec, - TlmRecorder& tlmRecorder); - SC_HAS_PROCESS(DramRecordable); - - void reportPower() override; - -private: - tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload& trans, - tlm::tlm_phase& phase, - sc_core::sc_time& delay) override; - - TlmRecorder& tlmRecorder; - - sc_core::sc_time powerWindowSize; - - // When working with floats, we have to decide ourselves what is an - // acceptable definition for "equal". Here the number is compared with a - // suitable error margin (0.00001). - static bool isEqual(double a, double b, const double epsilon = 1e-05) - { - return std::fabs(a - b) < epsilon; - } - -#ifdef DRAMPOWER - // This Thread is only triggered when Power Simulation is enabled. - // It estimates the current average power which will be stored in the trace database for - // visualization purposes. - void powerWindow(); -#endif -}; - -} // namespace DRAMSys - -#endif // DRAMRECORDABLE_H From 9a563e78d5c694dd1f103d4a2a0e3be1ba3f343f Mon Sep 17 00:00:00 2001 From: Jonathan Hager Date: Thu, 27 Feb 2025 16:50:56 +0100 Subject: [PATCH 05/17] Moved Bandwidth recording out of the Controller --- .../DRAMSys/common/TlmRecorderWrapper.cpp | 73 +++++++++++++++---- .../DRAMSys/common/TlmRecorderWrapper.h | 37 +++++----- .../controller/ControllerRecordable.cpp | 14 ---- src/libdramsys/DRAMSys/simulation/DRAMSys.cpp | 5 +- 4 files changed, 84 insertions(+), 45 deletions(-) diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.cpp b/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.cpp index dd71e53f..729e1063 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.cpp +++ b/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.cpp @@ -1,33 +1,55 @@ #include "TlmRecorderWrapper.h" +#include "DRAMSys/configuration/memspec/MemSpec.h" +#include "DRAMSys/controller/Command.h" +#include "DRAMSys/simulation/SimConfig.h" +#include +#include +#include namespace DRAMSys { -// TlmRecorderWrapper::TlmRecorderWrapper(const std::string& name, -// const SimConfig& simConfig, -// const McConfig& mcConfig, -// const MemSpec& memSpec, -// const std::string& dbName, -// const std::string& mcconfig, -// const std::string& memspec, -// const std::string& traces) : -// tlmRecorder(name, simConfig, mcConfig, memSpec, dbName, mcconfig, memspec, traces) -// { -// // TODO: Nothing?? -// } TlmRecorderWrapper::TlmRecorderWrapper(const sc_core::sc_module_name& name, + const SimConfig& simConfig, + const MemSpec& memSpec, TlmRecorder& tlmRecorder) : sc_module(name), - tlmRecorder(tlmRecorder) + tlmRecorder(tlmRecorder), + enableWindowing(simConfig.enableWindowing), + pseudoChannelMode(memSpec.pseudoChannelMode()), + ranksPerChannel(memSpec.ranksPerChannel), + windowSizeTime(simConfig.windowSize * memSpec.tCK), + numberOfBeatsServed(memSpec.ranksPerChannel, 0), + activeTimeMultiplier(memSpec.tCK / memSpec.dataRate) { iSocket.register_nb_transport_bw(this, &TlmRecorderWrapper::nb_transport_bw); tSocket.register_nb_transport_fw(this, &TlmRecorderWrapper::nb_transport_fw); + + SC_METHOD(recordBandwidth); + sensitive << windowEvent; + + if (enableWindowing) + { + windowEvent.notify(windowSizeTime); + nextWindowEventTime = windowSizeTime; + } } tlm::tlm_sync_enum TlmRecorderWrapper::nb_transport_fw(tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, sc_core::sc_time& delay) { + if (enableWindowing) + { + Command cmd{phase}; + if (cmd.isCasCommand()) + { + auto rank = ControllerExtension::getRank(trans); + numberOfBeatsServed[static_cast(rank)] += + ControllerExtension::getBurstLength(trans); + } + } + tlmRecorder.recordPhase(trans, phase, delay); return iSocket->nb_transport_fw(trans, phase, delay); } @@ -40,4 +62,29 @@ tlm::tlm_sync_enum TlmRecorderWrapper::nb_transport_bw(tlm::tlm_generic_payload& return tSocket->nb_transport_bw(trans, phase, delay); } +void TlmRecorderWrapper::recordBandwidth() +{ + if (enableWindowing && sc_core::sc_time_stamp() == nextWindowEventTime) + { + windowEvent.notify(windowSizeTime); + nextWindowEventTime += windowSizeTime; + + std::uint64_t totalNumberOfBeatsServed = + std::accumulate(numberOfBeatsServed.begin(), numberOfBeatsServed.end(), 0); + + uint64_t windowNumberOfBeatsServed = totalNumberOfBeatsServed - lastNumberOfBeatsServed; + lastNumberOfBeatsServed = totalNumberOfBeatsServed; + + // HBM specific, pseudo channels get averaged + if (pseudoChannelMode) + windowNumberOfBeatsServed /= ranksPerChannel; + + sc_core::sc_time windowActiveTime = + activeTimeMultiplier * static_cast(windowNumberOfBeatsServed); + double windowAverageBandwidth = windowActiveTime / windowSizeTime; + std::cout << "recordBandwidth: " << sc_core::sc_time_stamp().to_seconds() << "\n"; + tlmRecorder.recordBandwidth(sc_core::sc_time_stamp().to_seconds(), windowAverageBandwidth); + } +} + } // namespace DRAMSys diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.h b/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.h index 47f3847e..2523763b 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.h +++ b/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.h @@ -2,13 +2,14 @@ #define TLMRECORDERWRAPPER_H #include "DRAMSys/configuration/memspec/MemSpec.h" -#include "DRAMSys/controller/McConfig.h" #include "DRAMSys/simulation/SimConfig.h" #include "TlmRecorder.h" +#include #include #include #include +#include namespace DRAMSys { @@ -16,25 +17,16 @@ namespace DRAMSys class TlmRecorderWrapper : public sc_core::sc_module { + SC_HAS_PROCESS(TlmRecorderWrapper); + public: tlm_utils::simple_initiator_socket iSocket; tlm_utils::simple_target_socket tSocket; - // TlmRecorderWrapper(const std::string& name, - // const SimConfig& simConfig, - // const McConfig& mcConfig, - // const MemSpec& memSpec, - // const std::string& dbName, - // const std::string& mcconfig, - // const std::string& memspec, - // const std::string& traces); - - TlmRecorderWrapper(const sc_core::sc_module_name& name, TlmRecorder& tlmRecorder); - - // TlmRecorderWrapper(const TlmRecorderWrapper&) = delete; - // TlmRecorderWrapper(TlmRecorderWrapper&&) = default; - // TlmRecorderWrapper& operator=(const TlmRecorderWrapper&) = delete; - // TlmRecorderWrapper& operator=(TlmRecorderWrapper&&) = delete; + TlmRecorderWrapper(const sc_core::sc_module_name& name, + const SimConfig& simConfig, + const MemSpec& memspec, + TlmRecorder& tlmRecorder); ~TlmRecorderWrapper() = default; tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload& trans, @@ -45,8 +37,19 @@ public: sc_core::sc_time& delay); private: - // TODO: Refactor with shared pointers? + // HACK: Refactor with shared pointers? TlmRecorder& tlmRecorder; + const bool enableWindowing; + const bool pseudoChannelMode; + const unsigned int ranksPerChannel; + const sc_core::sc_time windowSizeTime; + sc_core::sc_event windowEvent; + sc_core::sc_time nextWindowEventTime; + std::vector numberOfBeatsServed; + uint64_t lastNumberOfBeatsServed = 0; + const sc_core::sc_time activeTimeMultiplier; + + void recordBandwidth(); }; } // namespace DRAMSys diff --git a/src/libdramsys/DRAMSys/controller/ControllerRecordable.cpp b/src/libdramsys/DRAMSys/controller/ControllerRecordable.cpp index 20d5f602..b66a8720 100644 --- a/src/libdramsys/DRAMSys/controller/ControllerRecordable.cpp +++ b/src/libdramsys/DRAMSys/controller/ControllerRecordable.cpp @@ -112,20 +112,6 @@ void ControllerRecordable::controllerMethod() tlmRecorder.recordBufferDepth(sc_time_stamp().to_seconds(), windowAverageBufferDepth); Controller::controllerMethod(); - - std::uint64_t totalNumberOfBeatsServed = std::accumulate(numberOfBeatsServed.begin(), numberOfBeatsServed.end(), 0); - - uint64_t windowNumberOfBeatsServed = totalNumberOfBeatsServed - lastNumberOfBeatsServed; - lastNumberOfBeatsServed = totalNumberOfBeatsServed; - - // HBM specific, pseudo channels get averaged - if (memSpec.pseudoChannelMode()) - windowNumberOfBeatsServed /= memSpec.ranksPerChannel; - - sc_time windowActiveTime = - activeTimeMultiplier * static_cast(windowNumberOfBeatsServed); - double windowAverageBandwidth = windowActiveTime / windowSizeTime; - tlmRecorder.recordBandwidth(sc_time_stamp().to_seconds(), windowAverageBandwidth); } else { diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp index a7d3a282..6cf722c3 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp @@ -123,7 +123,10 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio ("TLMCheckerController" + std::to_string(i)).c_str())); tlmWrappers.emplace_back(std::make_unique( - ("TlmRecorderWrapper" + std::to_string(i)).c_str(), tlmRecorders[i])); + ("TlmRecorderWrapper" + std::to_string(i)).c_str(), + simConfig, + *memSpec, + tlmRecorders[i])); } } else From f1445ab8513f45b0d2d11a83f5676c43d90e6ee0 Mon Sep 17 00:00:00 2001 From: Jonathan Hager Date: Mon, 10 Mar 2025 11:05:44 +0100 Subject: [PATCH 06/17] WIP: Moved BufferDepth out of ControllerRecordable --- .../DRAMSys/common/TlmRecorderWrapper.cpp | 1 - .../DRAMSys/controller/Controller.cpp | 46 ++++++++++++++++++- .../DRAMSys/controller/Controller.h | 16 ++++++- .../controller/ControllerRecordable.cpp | 2 +- src/libdramsys/DRAMSys/simulation/DRAMSys.cpp | 19 ++++---- 5 files changed, 72 insertions(+), 12 deletions(-) diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.cpp b/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.cpp index 729e1063..8cf53a5a 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.cpp +++ b/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.cpp @@ -82,7 +82,6 @@ void TlmRecorderWrapper::recordBandwidth() sc_core::sc_time windowActiveTime = activeTimeMultiplier * static_cast(windowNumberOfBeatsServed); double windowAverageBandwidth = windowActiveTime / windowSizeTime; - std::cout << "recordBandwidth: " << sc_core::sc_time_stamp().to_seconds() << "\n"; tlmRecorder.recordBandwidth(sc_core::sc_time_stamp().to_seconds(), windowAverageBandwidth); } } diff --git a/src/libdramsys/DRAMSys/controller/Controller.cpp b/src/libdramsys/DRAMSys/controller/Controller.cpp index 79da9ece..802489c1 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.cpp +++ b/src/libdramsys/DRAMSys/controller/Controller.cpp @@ -87,15 +87,25 @@ namespace DRAMSys Controller::Controller(const sc_module_name& name, const McConfig& config, const MemSpec& memSpec, - const AddressDecoder& addressDecoder) : + const SimConfig& simConfig, + const AddressDecoder& addressDecoder, + TlmRecorder& tlmRecorder) : sc_module(name), config(config), memSpec(memSpec), + simConfig(simConfig), addressDecoder(addressDecoder), + tlmRecorder(tlmRecorder), + windowSizeTime(simConfig.windowSize * memSpec.tCK), + nextWindowEventTime(windowSizeTime), numberOfBeatsServed(memSpec.ranksPerChannel, 0), minBytesPerBurst(memSpec.defaultBytesPerBurst), maxBytesPerBurst(memSpec.maxBytesPerBurst) { + SC_METHOD(recordBufferDepth); + sensitive << windowEvent; + windowEvent.notify(windowSizeTime); + SC_METHOD(controllerMethod); sensitive << beginReqEvent << endRespEvent << controllerEvent << dataResponseEvent; @@ -320,6 +330,9 @@ Controller::Controller(const sc_module_name& name, } else SC_REPORT_FATAL("Controller", "Selected refresh mode not supported!"); + + slidingAverageBufferDepth = std::vector(scheduler->getBufferDepth().size()); + windowAverageBufferDepth = std::vector(scheduler->getBufferDepth().size()); } void Controller::registerIdleCallback(std::function idleCallback) @@ -327,8 +340,39 @@ void Controller::registerIdleCallback(std::function idleCallback) this->idleCallback = std::move(idleCallback); } +void Controller::recordBufferDepth() +{ + std::cout << "Method called "; + if (sc_time_stamp() == nextWindowEventTime) + { + std::cout << "If entered\n"; + windowEvent.notify(windowSizeTime); + nextWindowEventTime += windowSizeTime; + + for (std::size_t index = 0; index < slidingAverageBufferDepth.size(); index++) + { + windowAverageBufferDepth[index] = slidingAverageBufferDepth[index] / windowSizeTime; + slidingAverageBufferDepth[index] = SC_ZERO_TIME; + } + + std::cout << windowAverageBufferDepth[0] << "\n"; + tlmRecorder.recordBufferDepth(sc_time_stamp().to_seconds(), windowAverageBufferDepth); + } +} + void Controller::controllerMethod() { + // Compute and report BufferDepth + if (simConfig.databaseRecording && simConfig.enableWindowing) + { + sc_time timeDiff = sc_time_stamp() - lastTimeCalled; + lastTimeCalled = sc_time_stamp(); + const std::vector& bufferDepth = scheduler->getBufferDepth(); + + for (std::size_t index = 0; index < slidingAverageBufferDepth.size(); index++) + slidingAverageBufferDepth[index] += bufferDepth[index] * timeDiff; + } + if (isFullCycle(sc_time_stamp(), memSpec.tCK)) { // (1) Finish last response (END_RESP) and start new response (BEGIN_RESP) diff --git a/src/libdramsys/DRAMSys/controller/Controller.h b/src/libdramsys/DRAMSys/controller/Controller.h index 99e5e622..3f25cf56 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.h +++ b/src/libdramsys/DRAMSys/controller/Controller.h @@ -46,6 +46,8 @@ #include "refresh/RefreshManagerIF.h" #include "respqueue/RespQueueIF.h" +#include "DRAMSys/common/TlmRecorder.h" +#include "DRAMSys/simulation/SimConfig.h" #include #include @@ -70,7 +72,9 @@ public: Controller(const sc_core::sc_module_name& name, const McConfig& config, const MemSpec& memSpec, - const AddressDecoder& addressDecoder); + const SimConfig& simConfig, + const AddressDecoder& addressDecoder, + TlmRecorder& tlmRecorder); SC_HAS_PROCESS(Controller); [[nodiscard]] bool idle() const { return totalNumberOfPayloads == 0; } @@ -92,15 +96,25 @@ protected: sendToFrontend(tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, sc_core::sc_time& delay); virtual void controllerMethod(); + void recordBufferDepth(); const McConfig& config; const MemSpec& memSpec; + const SimConfig& simConfig; const AddressDecoder& addressDecoder; + TlmRecorder& tlmRecorder; std::unique_ptr scheduler; sc_core::sc_time scMaxTime = sc_core::sc_max_time(); + sc_core::sc_time lastTimeCalled = sc_core::SC_ZERO_TIME; + sc_core::sc_event windowEvent; + const sc_core::sc_time windowSizeTime; + sc_core::sc_time nextWindowEventTime; + std::vector slidingAverageBufferDepth; + std::vector windowAverageBufferDepth; + std::vector numberOfBeatsServed; unsigned totalNumberOfPayloads = 0; std::function idleCallback; diff --git a/src/libdramsys/DRAMSys/controller/ControllerRecordable.cpp b/src/libdramsys/DRAMSys/controller/ControllerRecordable.cpp index b66a8720..9576bd39 100644 --- a/src/libdramsys/DRAMSys/controller/ControllerRecordable.cpp +++ b/src/libdramsys/DRAMSys/controller/ControllerRecordable.cpp @@ -48,7 +48,7 @@ ControllerRecordable::ControllerRecordable(const sc_module_name& name, const MemSpec& memSpec, const AddressDecoder& addressDecoder, TlmRecorder& tlmRecorder) : - Controller(name, config, memSpec, addressDecoder), + Controller(name, config, memSpec, simConfig, addressDecoder, tlmRecorder), tlmRecorder(tlmRecorder), windowSizeTime(simConfig.windowSize * memSpec.tCK), activeTimeMultiplier(memSpec.tCK / memSpec.dataRate), diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp index 6cf722c3..6d3da436 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp @@ -106,13 +106,16 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio // Create controllers and DRAMs for (std::size_t i = 0; i < memSpec->numberOfChannels; i++) { - controllers.emplace_back( - std::make_unique(("controller" + std::to_string(i)).c_str(), - mcConfig, - simConfig, - *memSpec, - *addressDecoder, - tlmRecorders[i])); + // controllers.emplace_back( + // std::make_unique(("controller" + std::to_string(i)).c_str(), + // mcConfig, + // simConfig, + // *memSpec, + // *addressDecoder, + // tlmRecorders[i])); + + controllers.emplace_back(std::make_unique( + ("controller" + std::to_string(i)).c_str(), mcConfig, *memSpec, simConfig, *addressDecoder, tlmRecorders[i])); drams.emplace_back(std::make_unique( ("dram" + std::to_string(i)).c_str(), simConfig, *memSpec, tlmRecorders[i])); @@ -134,7 +137,7 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio for (std::size_t i = 0; i < memSpec->numberOfChannels; i++) { controllers.emplace_back(std::make_unique( - ("controller" + std::to_string(i)).c_str(), mcConfig, *memSpec, *addressDecoder)); + ("controller" + std::to_string(i)).c_str(), mcConfig, *memSpec, simConfig, *addressDecoder, tlmRecorders[i])); drams.emplace_back(std::make_unique( ("dram" + std::to_string(i)).c_str(), simConfig, *memSpec, tlmRecorders[i])); From 0479184f7276a7fd28e7725bc9203de75197aa18 Mon Sep 17 00:00:00 2001 From: Jonathan Hager Date: Tue, 11 Mar 2025 12:57:02 +0100 Subject: [PATCH 07/17] Split the bandwidth recording in two modules This allows separate recording of the bandwidth between Arbiter - Controller and Controller - Dram --- src/libdramsys/CMakeLists.txt | 3 +- .../DRAMSys/common/TlmRecorderArbiter.cpp | 99 +++++++++++++++++++ .../DRAMSys/common/TlmRecorderArbiter.h | 61 ++++++++++++ ...ecorderWrapper.cpp => TlmRecorderDram.cpp} | 39 ++++---- ...TlmRecorderWrapper.h => TlmRecorderDram.h} | 23 +++-- .../DRAMSys/controller/Controller.cpp | 3 - src/libdramsys/DRAMSys/simulation/DRAMSys.cpp | 57 +++++++---- src/libdramsys/DRAMSys/simulation/DRAMSys.h | 7 +- 8 files changed, 241 insertions(+), 51 deletions(-) create mode 100644 src/libdramsys/DRAMSys/common/TlmRecorderArbiter.cpp create mode 100644 src/libdramsys/DRAMSys/common/TlmRecorderArbiter.h rename src/libdramsys/DRAMSys/common/{TlmRecorderWrapper.cpp => TlmRecorderDram.cpp} (69%) rename src/libdramsys/DRAMSys/common/{TlmRecorderWrapper.h => TlmRecorderDram.h} (71%) diff --git a/src/libdramsys/CMakeLists.txt b/src/libdramsys/CMakeLists.txt index 8c039694..6b41fee7 100644 --- a/src/libdramsys/CMakeLists.txt +++ b/src/libdramsys/CMakeLists.txt @@ -39,7 +39,8 @@ add_library(libdramsys DRAMSys/common/DebugManager.cpp DRAMSys/common/TlmRecorder.cpp - DRAMSys/common/TlmRecorderWrapper.cpp + DRAMSys/common/TlmRecorderArbiter.cpp + DRAMSys/common/TlmRecorderDram.cpp DRAMSys/common/dramExtensions.cpp DRAMSys/common/utils.cpp DRAMSys/configuration/memspec/MemSpec.cpp diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderArbiter.cpp b/src/libdramsys/DRAMSys/common/TlmRecorderArbiter.cpp new file mode 100644 index 00000000..66d3facc --- /dev/null +++ b/src/libdramsys/DRAMSys/common/TlmRecorderArbiter.cpp @@ -0,0 +1,99 @@ +#include "TlmRecorderArbiter.h" + +#include "DRAMSys/configuration/memspec/MemSpec.h" +#include "DRAMSys/controller/Command.h" +#include "DRAMSys/simulation/SimConfig.h" +#include +#include +#include + +namespace DRAMSys +{ + +TlmRecorderArbiter::TlmRecorderArbiter(const sc_core::sc_module_name& name, + const SimConfig& simConfig, + const MemSpec& memSpec, + TlmRecorder& tlmRecorder, + bool enableBandwidth) : + sc_module(name), + memSpec(memSpec), + tlmRecorder(tlmRecorder), + enableWindowing(simConfig.enableWindowing), + pseudoChannelMode(memSpec.pseudoChannelMode()), + ranksPerChannel(memSpec.ranksPerChannel), + windowSizeTime(simConfig.windowSize * memSpec.tCK), + numberOfBytesServed(0), + activeTimeMultiplier(memSpec.tCK / memSpec.dataRate), + enableBandwidth(enableBandwidth) +{ + iSocket.register_nb_transport_bw(this, &TlmRecorderArbiter::nb_transport_bw); + tSocket.register_nb_transport_fw(this, &TlmRecorderArbiter::nb_transport_fw); + + if (enableBandwidth) + { + SC_METHOD(recordBandwidth); + sensitive << windowEvent; + + if (enableWindowing) + { + windowEvent.notify(windowSizeTime); + nextWindowEventTime = windowSizeTime; + } + } +} + +tlm::tlm_sync_enum TlmRecorderArbiter::nb_transport_fw(tlm::tlm_generic_payload& trans, + tlm::tlm_phase& phase, + sc_core::sc_time& delay) +{ + if (enableBandwidth && enableWindowing) + { + if (phase == tlm::BEGIN_REQ && trans.is_write()) + numberOfBytesServed += trans.get_data_length(); + } + + tlmRecorder.recordPhase(trans, phase, delay); + return iSocket->nb_transport_fw(trans, phase, delay); +} + +tlm::tlm_sync_enum TlmRecorderArbiter::nb_transport_bw(tlm::tlm_generic_payload& trans, + tlm::tlm_phase& phase, + sc_core::sc_time& delay) +{ + if (enableBandwidth && enableWindowing) + { + if (phase == tlm::BEGIN_RESP && trans.is_read()) + numberOfBytesServed += trans.get_data_length(); + } + + tlmRecorder.recordPhase(trans, phase, delay); + return tSocket->nb_transport_bw(trans, phase, delay); +} + +void TlmRecorderArbiter::recordBandwidth() +{ + if (enableBandwidth && enableWindowing && sc_core::sc_time_stamp() == nextWindowEventTime) + { + windowEvent.notify(windowSizeTime); + nextWindowEventTime += windowSizeTime; + + uint64_t windowNumberOfBytesServed = numberOfBytesServed - lastNumberOfBytesServed; + lastNumberOfBytesServed = numberOfBytesServed; + + // HBM specific, pseudo channels get averaged + if (pseudoChannelMode) + windowNumberOfBytesServed /= ranksPerChannel; + + double windowBandwidth = + static_cast(windowNumberOfBytesServed) / (windowSizeTime.to_seconds()); + tlmRecorder.recordBandwidth(sc_core::sc_time_stamp().to_seconds(), windowBandwidth); + + // sc_core::sc_time windowActiveTime = + // activeTimeMultiplier * static_cast(windowNumberOfBytesServed); + // double windowAverageBandwidth = windowNumberOfBytesServed / maxBandwidth; + // tlmRecorder.recordBandwidth(sc_core::sc_time_stamp().to_seconds(), + // windowAverageBandwidth); + } +} + +} // namespace DRAMSys diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderArbiter.h b/src/libdramsys/DRAMSys/common/TlmRecorderArbiter.h new file mode 100644 index 00000000..ef3f5416 --- /dev/null +++ b/src/libdramsys/DRAMSys/common/TlmRecorderArbiter.h @@ -0,0 +1,61 @@ +#ifndef TLMRECORDERARBITER_H +#define TLMRECORDERARBITER_H + +#include "DRAMSys/configuration/memspec/MemSpec.h" +#include "DRAMSys/simulation/SimConfig.h" +#include "TlmRecorder.h" + +#include +#include +#include +#include +#include + +namespace DRAMSys +{ + +class TlmRecorderArbiter : public sc_core::sc_module + +{ + SC_HAS_PROCESS(TlmRecorderArbiter); + +public: + tlm_utils::simple_initiator_socket iSocket; + tlm_utils::simple_target_socket tSocket; + + TlmRecorderArbiter(const sc_core::sc_module_name& name, + const SimConfig& simConfig, + const MemSpec& memspec, + TlmRecorder& tlmRecorder, + bool enableBandwidth); + ~TlmRecorderArbiter() = default; + + tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload& trans, + tlm::tlm_phase& phase, + sc_core::sc_time& delay); + tlm::tlm_sync_enum nb_transport_bw(tlm::tlm_generic_payload& trans, + tlm::tlm_phase& phase, + sc_core::sc_time& delay); + +private: + const MemSpec& memSpec; + // HACK: Refactor with shared pointers? + TlmRecorder& tlmRecorder; + const bool enableWindowing; + const bool pseudoChannelMode; + const unsigned int ranksPerChannel; + const sc_core::sc_time windowSizeTime; + sc_core::sc_event windowEvent; + sc_core::sc_time nextWindowEventTime; + uint64_t numberOfBytesServed; + uint64_t lastNumberOfBytesServed = 0; + const sc_core::sc_time activeTimeMultiplier; + + bool enableBandwidth = false; + + void recordBandwidth(); +}; + +} // namespace DRAMSys + +#endif // TLMRECORDERARBITER_H diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.cpp b/src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp similarity index 69% rename from src/libdramsys/DRAMSys/common/TlmRecorderWrapper.cpp rename to src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp index 8cf53a5a..48856db7 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.cpp +++ b/src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp @@ -1,4 +1,4 @@ -#include "TlmRecorderWrapper.h" +#include "TlmRecorderDram.h" #include "DRAMSys/configuration/memspec/MemSpec.h" #include "DRAMSys/controller/Command.h" #include "DRAMSys/simulation/SimConfig.h" @@ -9,10 +9,11 @@ namespace DRAMSys { -TlmRecorderWrapper::TlmRecorderWrapper(const sc_core::sc_module_name& name, +TlmRecorderDram::TlmRecorderDram(const sc_core::sc_module_name& name, const SimConfig& simConfig, const MemSpec& memSpec, - TlmRecorder& tlmRecorder) : + TlmRecorder& tlmRecorder, + bool enableBandwidth) : sc_module(name), tlmRecorder(tlmRecorder), enableWindowing(simConfig.enableWindowing), @@ -20,26 +21,30 @@ TlmRecorderWrapper::TlmRecorderWrapper(const sc_core::sc_module_name& name, ranksPerChannel(memSpec.ranksPerChannel), windowSizeTime(simConfig.windowSize * memSpec.tCK), numberOfBeatsServed(memSpec.ranksPerChannel, 0), - activeTimeMultiplier(memSpec.tCK / memSpec.dataRate) + activeTimeMultiplier(memSpec.tCK / memSpec.dataRate), + enableBandwidth(enableBandwidth) { - iSocket.register_nb_transport_bw(this, &TlmRecorderWrapper::nb_transport_bw); - tSocket.register_nb_transport_fw(this, &TlmRecorderWrapper::nb_transport_fw); + iSocket.register_nb_transport_bw(this, &TlmRecorderDram::nb_transport_bw); + tSocket.register_nb_transport_fw(this, &TlmRecorderDram::nb_transport_fw); - SC_METHOD(recordBandwidth); - sensitive << windowEvent; - - if (enableWindowing) + if (enableBandwidth) { - windowEvent.notify(windowSizeTime); - nextWindowEventTime = windowSizeTime; + SC_METHOD(recordBandwidth); + sensitive << windowEvent; + + if (enableWindowing) + { + windowEvent.notify(windowSizeTime); + nextWindowEventTime = windowSizeTime; + } } } -tlm::tlm_sync_enum TlmRecorderWrapper::nb_transport_fw(tlm::tlm_generic_payload& trans, +tlm::tlm_sync_enum TlmRecorderDram::nb_transport_fw(tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, sc_core::sc_time& delay) { - if (enableWindowing) + if (enableBandwidth && enableWindowing) { Command cmd{phase}; if (cmd.isCasCommand()) @@ -54,7 +59,7 @@ tlm::tlm_sync_enum TlmRecorderWrapper::nb_transport_fw(tlm::tlm_generic_payload& return iSocket->nb_transport_fw(trans, phase, delay); } -tlm::tlm_sync_enum TlmRecorderWrapper::nb_transport_bw(tlm::tlm_generic_payload& trans, +tlm::tlm_sync_enum TlmRecorderDram::nb_transport_bw(tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, sc_core::sc_time& delay) { @@ -62,9 +67,9 @@ tlm::tlm_sync_enum TlmRecorderWrapper::nb_transport_bw(tlm::tlm_generic_payload& return tSocket->nb_transport_bw(trans, phase, delay); } -void TlmRecorderWrapper::recordBandwidth() +void TlmRecorderDram::recordBandwidth() { - if (enableWindowing && sc_core::sc_time_stamp() == nextWindowEventTime) + if (enableBandwidth && enableWindowing && sc_core::sc_time_stamp() == nextWindowEventTime) { windowEvent.notify(windowSizeTime); nextWindowEventTime += windowSizeTime; diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.h b/src/libdramsys/DRAMSys/common/TlmRecorderDram.h similarity index 71% rename from src/libdramsys/DRAMSys/common/TlmRecorderWrapper.h rename to src/libdramsys/DRAMSys/common/TlmRecorderDram.h index 2523763b..fd5d2aa7 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderWrapper.h +++ b/src/libdramsys/DRAMSys/common/TlmRecorderDram.h @@ -1,5 +1,5 @@ -#ifndef TLMRECORDERWRAPPER_H -#define TLMRECORDERWRAPPER_H +#ifndef TLMRECORDERDRAM_H +#define TLMRECORDERDRAM_H #include "DRAMSys/configuration/memspec/MemSpec.h" #include "DRAMSys/simulation/SimConfig.h" @@ -14,20 +14,21 @@ namespace DRAMSys { -class TlmRecorderWrapper : public sc_core::sc_module +class TlmRecorderDram : public sc_core::sc_module { - SC_HAS_PROCESS(TlmRecorderWrapper); + SC_HAS_PROCESS(TlmRecorderDram); public: - tlm_utils::simple_initiator_socket iSocket; - tlm_utils::simple_target_socket tSocket; + tlm_utils::simple_initiator_socket iSocket; + tlm_utils::simple_target_socket tSocket; - TlmRecorderWrapper(const sc_core::sc_module_name& name, + TlmRecorderDram(const sc_core::sc_module_name& name, const SimConfig& simConfig, const MemSpec& memspec, - TlmRecorder& tlmRecorder); - ~TlmRecorderWrapper() = default; + TlmRecorder& tlmRecorder, + bool enableBandwidth); + ~TlmRecorderDram() = default; tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, @@ -49,9 +50,11 @@ private: uint64_t lastNumberOfBeatsServed = 0; const sc_core::sc_time activeTimeMultiplier; + bool enableBandwidth = false; + void recordBandwidth(); }; } // namespace DRAMSys -#endif // TLMRECORDERWRAPPER_H +#endif // TLMRECORDERDRAM_H diff --git a/src/libdramsys/DRAMSys/controller/Controller.cpp b/src/libdramsys/DRAMSys/controller/Controller.cpp index 802489c1..50f86ca8 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.cpp +++ b/src/libdramsys/DRAMSys/controller/Controller.cpp @@ -342,10 +342,8 @@ void Controller::registerIdleCallback(std::function idleCallback) void Controller::recordBufferDepth() { - std::cout << "Method called "; if (sc_time_stamp() == nextWindowEventTime) { - std::cout << "If entered\n"; windowEvent.notify(windowSizeTime); nextWindowEventTime += windowSizeTime; @@ -355,7 +353,6 @@ void Controller::recordBufferDepth() slidingAverageBufferDepth[index] = SC_ZERO_TIME; } - std::cout << windowAverageBufferDepth[0] << "\n"; tlmRecorder.recordBufferDepth(sc_time_stamp().to_seconds(), windowAverageBufferDepth); } } diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp index 6d3da436..e86da6ef 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp @@ -106,16 +106,13 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio // Create controllers and DRAMs for (std::size_t i = 0; i < memSpec->numberOfChannels; i++) { - // controllers.emplace_back( - // std::make_unique(("controller" + std::to_string(i)).c_str(), - // mcConfig, - // simConfig, - // *memSpec, - // *addressDecoder, - // tlmRecorders[i])); - - controllers.emplace_back(std::make_unique( - ("controller" + std::to_string(i)).c_str(), mcConfig, *memSpec, simConfig, *addressDecoder, tlmRecorders[i])); + controllers.emplace_back( + std::make_unique(("controller" + std::to_string(i)).c_str(), + mcConfig, + *memSpec, + simConfig, + *addressDecoder, + tlmRecorders[i])); drams.emplace_back(std::make_unique( ("dram" + std::to_string(i)).c_str(), simConfig, *memSpec, tlmRecorders[i])); @@ -125,19 +122,34 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio std::make_unique>( ("TLMCheckerController" + std::to_string(i)).c_str())); - tlmWrappers.emplace_back(std::make_unique( + // Not recording bandwidth between Arbiter - Controller + tlmWrappersArbiter.emplace_back(std::make_unique( ("TlmRecorderWrapper" + std::to_string(i)).c_str(), simConfig, *memSpec, - tlmRecorders[i])); + tlmRecorders[i], + false)); + + // Recording bandwidth between Controller - DRAM + tlmWrappersDram.emplace_back(std::make_unique( + ("TlmRecorderWrapper" + std::to_string(i)).c_str(), + simConfig, + *memSpec, + tlmRecorders[i], + true)); } } else { for (std::size_t i = 0; i < memSpec->numberOfChannels; i++) { - controllers.emplace_back(std::make_unique( - ("controller" + std::to_string(i)).c_str(), mcConfig, *memSpec, simConfig, *addressDecoder, tlmRecorders[i])); + controllers.emplace_back( + std::make_unique(("controller" + std::to_string(i)).c_str(), + mcConfig, + *memSpec, + simConfig, + *addressDecoder, + tlmRecorders[i])); drams.emplace_back(std::make_unique( ("dram" + std::to_string(i)).c_str(), simConfig, *memSpec, tlmRecorders[i])); @@ -155,11 +167,22 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio tSocket.bind(arbiter->tSocket); for (unsigned i = 0; i < memSpec->numberOfChannels; i++) { - if (simConfig.checkTLM2Protocol) + if (simConfig.checkTLM2Protocol && simConfig.databaseRecording) + { + arbiter->iSocket.bind(controllersTlmCheckers[i]->target_socket); + controllersTlmCheckers[i]->initiator_socket.bind(tlmWrappersArbiter[i]->tSocket); + tlmWrappersArbiter[i]->iSocket.bind(controllers[i]->tSocket); + } + else if (simConfig.checkTLM2Protocol) { arbiter->iSocket.bind(controllersTlmCheckers[i]->target_socket); controllersTlmCheckers[i]->initiator_socket.bind(controllers[i]->tSocket); } + else if (simConfig.databaseRecording) + { + arbiter->iSocket.bind(tlmWrappersArbiter[i]->tSocket); + tlmWrappersArbiter[i]->iSocket.bind(controllers[i]->tSocket); + } else { arbiter->iSocket.bind(controllers[i]->tSocket); @@ -168,8 +191,8 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio // TODO: comments if (simConfig.databaseRecording) { - controllers[i]->iSocket.bind(tlmWrappers[i]->tSocket); - tlmWrappers[i]->iSocket.bind(drams[i]->tSocket); + controllers[i]->iSocket.bind(tlmWrappersDram[i]->tSocket); + tlmWrappersDram[i]->iSocket.bind(drams[i]->tSocket); } else { diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.h b/src/libdramsys/DRAMSys/simulation/DRAMSys.h index 66b9a9ee..e721391c 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.h +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.h @@ -42,7 +42,8 @@ #define DRAMSYS_H #include "DRAMSys/common/TlmRecorder.h" -#include "DRAMSys/common/TlmRecorderWrapper.h" +#include "DRAMSys/common/TlmRecorderArbiter.h" +#include "DRAMSys/common/TlmRecorderDram.h" #include "DRAMSys/common/tlm2_base_protocol_checker.h" #include "DRAMSys/config/DRAMSysConfiguration.h" #include "DRAMSys/controller/Controller.h" @@ -128,8 +129,8 @@ private: // They generate the output databases. std::vector tlmRecorders; - // TODO: Comments - std::vector> tlmWrappers; + std::vector> tlmWrappersArbiter; + std::vector> tlmWrappersDram; }; } // namespace DRAMSys From 5b7dcbcc1cd88bb73a1111b95c6d2c054d514acb Mon Sep 17 00:00:00 2001 From: Jonathan Hager Date: Mon, 17 Mar 2025 10:55:05 +0100 Subject: [PATCH 08/17] Moved TlmRecorder from reference to smart pointer --- .../DRAMSys/common/TlmRecorderArbiter.cpp | 16 +++++----------- .../DRAMSys/common/TlmRecorderArbiter.h | 5 ++--- .../DRAMSys/common/TlmRecorderDram.cpp | 10 +++++----- .../DRAMSys/common/TlmRecorderDram.h | 5 ++--- .../DRAMSys/controller/Controller.cpp | 6 +++--- src/libdramsys/DRAMSys/controller/Controller.h | 4 ++-- src/libdramsys/DRAMSys/simulation/DRAMSys.cpp | 18 +++++++++--------- src/libdramsys/DRAMSys/simulation/DRAMSys.h | 2 +- src/libdramsys/DRAMSys/simulation/Dram.cpp | 8 ++++---- src/libdramsys/DRAMSys/simulation/Dram.h | 4 ++-- 10 files changed, 35 insertions(+), 43 deletions(-) diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderArbiter.cpp b/src/libdramsys/DRAMSys/common/TlmRecorderArbiter.cpp index 66d3facc..db2c1f98 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderArbiter.cpp +++ b/src/libdramsys/DRAMSys/common/TlmRecorderArbiter.cpp @@ -13,11 +13,11 @@ namespace DRAMSys TlmRecorderArbiter::TlmRecorderArbiter(const sc_core::sc_module_name& name, const SimConfig& simConfig, const MemSpec& memSpec, - TlmRecorder& tlmRecorder, + std::shared_ptr tlmRecorder, bool enableBandwidth) : sc_module(name), memSpec(memSpec), - tlmRecorder(tlmRecorder), + tlmRecorder(std::move(tlmRecorder)), enableWindowing(simConfig.enableWindowing), pseudoChannelMode(memSpec.pseudoChannelMode()), ranksPerChannel(memSpec.ranksPerChannel), @@ -52,7 +52,7 @@ tlm::tlm_sync_enum TlmRecorderArbiter::nb_transport_fw(tlm::tlm_generic_payload& numberOfBytesServed += trans.get_data_length(); } - tlmRecorder.recordPhase(trans, phase, delay); + tlmRecorder->recordPhase(trans, phase, delay); return iSocket->nb_transport_fw(trans, phase, delay); } @@ -66,7 +66,7 @@ tlm::tlm_sync_enum TlmRecorderArbiter::nb_transport_bw(tlm::tlm_generic_payload& numberOfBytesServed += trans.get_data_length(); } - tlmRecorder.recordPhase(trans, phase, delay); + tlmRecorder->recordPhase(trans, phase, delay); return tSocket->nb_transport_bw(trans, phase, delay); } @@ -86,13 +86,7 @@ void TlmRecorderArbiter::recordBandwidth() double windowBandwidth = static_cast(windowNumberOfBytesServed) / (windowSizeTime.to_seconds()); - tlmRecorder.recordBandwidth(sc_core::sc_time_stamp().to_seconds(), windowBandwidth); - - // sc_core::sc_time windowActiveTime = - // activeTimeMultiplier * static_cast(windowNumberOfBytesServed); - // double windowAverageBandwidth = windowNumberOfBytesServed / maxBandwidth; - // tlmRecorder.recordBandwidth(sc_core::sc_time_stamp().to_seconds(), - // windowAverageBandwidth); + tlmRecorder->recordBandwidth(sc_core::sc_time_stamp().to_seconds(), windowBandwidth); } } diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderArbiter.h b/src/libdramsys/DRAMSys/common/TlmRecorderArbiter.h index ef3f5416..0c0475e8 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderArbiter.h +++ b/src/libdramsys/DRAMSys/common/TlmRecorderArbiter.h @@ -26,7 +26,7 @@ public: TlmRecorderArbiter(const sc_core::sc_module_name& name, const SimConfig& simConfig, const MemSpec& memspec, - TlmRecorder& tlmRecorder, + std::shared_ptr tlmRecorder, bool enableBandwidth); ~TlmRecorderArbiter() = default; @@ -39,8 +39,7 @@ public: private: const MemSpec& memSpec; - // HACK: Refactor with shared pointers? - TlmRecorder& tlmRecorder; + std::shared_ptr tlmRecorder; const bool enableWindowing; const bool pseudoChannelMode; const unsigned int ranksPerChannel; diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp b/src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp index 48856db7..8faf784b 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp +++ b/src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp @@ -12,10 +12,10 @@ namespace DRAMSys TlmRecorderDram::TlmRecorderDram(const sc_core::sc_module_name& name, const SimConfig& simConfig, const MemSpec& memSpec, - TlmRecorder& tlmRecorder, + std::shared_ptr tlmRecorder, bool enableBandwidth) : sc_module(name), - tlmRecorder(tlmRecorder), + tlmRecorder(std::move(tlmRecorder)), enableWindowing(simConfig.enableWindowing), pseudoChannelMode(memSpec.pseudoChannelMode()), ranksPerChannel(memSpec.ranksPerChannel), @@ -55,7 +55,7 @@ tlm::tlm_sync_enum TlmRecorderDram::nb_transport_fw(tlm::tlm_generic_payload& tr } } - tlmRecorder.recordPhase(trans, phase, delay); + tlmRecorder->recordPhase(trans, phase, delay); return iSocket->nb_transport_fw(trans, phase, delay); } @@ -63,7 +63,7 @@ tlm::tlm_sync_enum TlmRecorderDram::nb_transport_bw(tlm::tlm_generic_payload& tr tlm::tlm_phase& phase, sc_core::sc_time& delay) { - tlmRecorder.recordPhase(trans, phase, delay); + tlmRecorder->recordPhase(trans, phase, delay); return tSocket->nb_transport_bw(trans, phase, delay); } @@ -87,7 +87,7 @@ void TlmRecorderDram::recordBandwidth() sc_core::sc_time windowActiveTime = activeTimeMultiplier * static_cast(windowNumberOfBeatsServed); double windowAverageBandwidth = windowActiveTime / windowSizeTime; - tlmRecorder.recordBandwidth(sc_core::sc_time_stamp().to_seconds(), windowAverageBandwidth); + tlmRecorder->recordBandwidth(sc_core::sc_time_stamp().to_seconds(), windowAverageBandwidth); } } diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderDram.h b/src/libdramsys/DRAMSys/common/TlmRecorderDram.h index fd5d2aa7..6916eb20 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderDram.h +++ b/src/libdramsys/DRAMSys/common/TlmRecorderDram.h @@ -26,7 +26,7 @@ public: TlmRecorderDram(const sc_core::sc_module_name& name, const SimConfig& simConfig, const MemSpec& memspec, - TlmRecorder& tlmRecorder, + std::shared_ptr tlmRecorder, bool enableBandwidth); ~TlmRecorderDram() = default; @@ -38,8 +38,7 @@ public: sc_core::sc_time& delay); private: - // HACK: Refactor with shared pointers? - TlmRecorder& tlmRecorder; + std::shared_ptr tlmRecorder; const bool enableWindowing; const bool pseudoChannelMode; const unsigned int ranksPerChannel; diff --git a/src/libdramsys/DRAMSys/controller/Controller.cpp b/src/libdramsys/DRAMSys/controller/Controller.cpp index 50f86ca8..2a27bc9c 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.cpp +++ b/src/libdramsys/DRAMSys/controller/Controller.cpp @@ -89,13 +89,13 @@ Controller::Controller(const sc_module_name& name, const MemSpec& memSpec, const SimConfig& simConfig, const AddressDecoder& addressDecoder, - TlmRecorder& tlmRecorder) : + std::shared_ptr tlmRecorder) : sc_module(name), config(config), memSpec(memSpec), simConfig(simConfig), addressDecoder(addressDecoder), - tlmRecorder(tlmRecorder), + tlmRecorder(std::move(tlmRecorder)), windowSizeTime(simConfig.windowSize * memSpec.tCK), nextWindowEventTime(windowSizeTime), numberOfBeatsServed(memSpec.ranksPerChannel, 0), @@ -353,7 +353,7 @@ void Controller::recordBufferDepth() slidingAverageBufferDepth[index] = SC_ZERO_TIME; } - tlmRecorder.recordBufferDepth(sc_time_stamp().to_seconds(), windowAverageBufferDepth); + tlmRecorder->recordBufferDepth(sc_time_stamp().to_seconds(), windowAverageBufferDepth); } } diff --git a/src/libdramsys/DRAMSys/controller/Controller.h b/src/libdramsys/DRAMSys/controller/Controller.h index 3f25cf56..4278ed89 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.h +++ b/src/libdramsys/DRAMSys/controller/Controller.h @@ -74,7 +74,7 @@ public: const MemSpec& memSpec, const SimConfig& simConfig, const AddressDecoder& addressDecoder, - TlmRecorder& tlmRecorder); + std::shared_ptr tlmRecorder); SC_HAS_PROCESS(Controller); [[nodiscard]] bool idle() const { return totalNumberOfPayloads == 0; } @@ -102,7 +102,7 @@ protected: const MemSpec& memSpec; const SimConfig& simConfig; const AddressDecoder& addressDecoder; - TlmRecorder& tlmRecorder; + std::shared_ptr tlmRecorder; std::unique_ptr scheduler; diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp index e86da6ef..81be9420 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp @@ -223,14 +223,14 @@ void DRAMSys::setupTlmRecorders(const std::string& traceName, const Config::Conf mcconfig[Config::McConfig::KEY] = config.mcconfig; memspec[Config::MemSpec::KEY] = config.memspec; - tlmRecorders.emplace_back(recorderName, - simConfig, - mcConfig, - *memSpec, - dbName, - mcconfig.dump(), - memspec.dump(), - simConfig.simulationName); + tlmRecorders.push_back(std::make_shared(recorderName, + simConfig, + mcConfig, + *memSpec, + dbName, + mcconfig.dump(), + memspec.dump(), + simConfig.simulationName)); } } @@ -258,7 +258,7 @@ void DRAMSys::end_of_simulation() } for (auto& tlmRecorder : tlmRecorders) - tlmRecorder.finalize(); + tlmRecorder->finalize(); } void DRAMSys::logo() diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.h b/src/libdramsys/DRAMSys/simulation/DRAMSys.h index e721391c..73000ac6 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.h +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.h @@ -127,7 +127,7 @@ private: // Transaction Recorders (one per channel). // They generate the output databases. - std::vector tlmRecorders; + std::vector> tlmRecorders; std::vector> tlmWrappersArbiter; std::vector> tlmWrappersDram; diff --git a/src/libdramsys/DRAMSys/simulation/Dram.cpp b/src/libdramsys/DRAMSys/simulation/Dram.cpp index 5b1e7d4c..13fe2af4 100644 --- a/src/libdramsys/DRAMSys/simulation/Dram.cpp +++ b/src/libdramsys/DRAMSys/simulation/Dram.cpp @@ -72,14 +72,14 @@ namespace DRAMSys Dram::Dram(const sc_module_name& name, const SimConfig& simConfig, const MemSpec& memSpec, - TlmRecorder& tlmRecorder) : + std::shared_ptr tlmRecorder) : sc_module(name), memSpec(memSpec), storeMode(simConfig.storeMode), powerAnalysis(simConfig.powerAnalysis), channelSize(memSpec.getSimMemSizeInBytes() / memSpec.numberOfChannels), useMalloc(simConfig.useMalloc), - tlmRecorder(tlmRecorder), + tlmRecorder(std::move(tlmRecorder)), powerWindowSize(memSpec.tCK * simConfig.windowSize) { if (storeMode == Config::StoreModeType::Store) @@ -143,7 +143,7 @@ void Dram::reportPower() << DRAMPower->getPower().average_power * memSpec.devicesPerRank << std::string(" mW") << std::endl; - tlmRecorder.recordPower(sc_time_stamp().to_seconds(), + tlmRecorder->recordPower(sc_time_stamp().to_seconds(), this->DRAMPower->getPower().window_average_power * this->memSpec.devicesPerRank); #endif @@ -302,7 +302,7 @@ void Dram::powerWindow() assert(!this->DRAMPower->getEnergy().window_energy < 1e-05); // Store the time (in seconds) and the current average power (in mW) into the database - tlmRecorder.recordPower(sc_time_stamp().to_seconds(), + tlmRecorder->recordPower(sc_time_stamp().to_seconds(), this->DRAMPower->getPower().window_average_power * this->memSpec.devicesPerRank); diff --git a/src/libdramsys/DRAMSys/simulation/Dram.h b/src/libdramsys/DRAMSys/simulation/Dram.h index add46abe..40581fe3 100644 --- a/src/libdramsys/DRAMSys/simulation/Dram.h +++ b/src/libdramsys/DRAMSys/simulation/Dram.h @@ -69,7 +69,7 @@ protected: const uint64_t channelSize; const bool useMalloc; - TlmRecorder& tlmRecorder; + std::shared_ptr tlmRecorder; sc_core::sc_time powerWindowSize; #ifdef DRAMPOWER @@ -93,7 +93,7 @@ public: Dram(const sc_core::sc_module_name& name, const SimConfig& simConfig, const MemSpec& memSpec, - TlmRecorder& tlmRecorder); + std::shared_ptr tlmRecorder); SC_HAS_PROCESS(Dram); Dram(const Dram&) = delete; From 86281cc6d3e3e77303541922a6e8110df33298d4 Mon Sep 17 00:00:00 2001 From: Jonathan Hager Date: Tue, 18 Mar 2025 10:56:08 +0100 Subject: [PATCH 09/17] Removed ControllerRecordable --- src/libdramsys/CMakeLists.txt | 1 - .../controller/ControllerRecordable.cpp | 127 ------------------ .../DRAMSys/controller/ControllerRecordable.h | 89 ------------ src/libdramsys/DRAMSys/simulation/DRAMSys.h | 1 - 4 files changed, 218 deletions(-) delete mode 100644 src/libdramsys/DRAMSys/controller/ControllerRecordable.cpp delete mode 100644 src/libdramsys/DRAMSys/controller/ControllerRecordable.h diff --git a/src/libdramsys/CMakeLists.txt b/src/libdramsys/CMakeLists.txt index 6b41fee7..c37bab12 100644 --- a/src/libdramsys/CMakeLists.txt +++ b/src/libdramsys/CMakeLists.txt @@ -57,7 +57,6 @@ add_library(libdramsys DRAMSys/controller/BankMachine.cpp DRAMSys/controller/Command.cpp DRAMSys/controller/Controller.cpp - DRAMSys/controller/ControllerRecordable.cpp DRAMSys/controller/McConfig.cpp DRAMSys/controller/checker/CheckerDDR3.cpp DRAMSys/controller/checker/CheckerDDR4.cpp diff --git a/src/libdramsys/DRAMSys/controller/ControllerRecordable.cpp b/src/libdramsys/DRAMSys/controller/ControllerRecordable.cpp deleted file mode 100644 index 9576bd39..00000000 --- a/src/libdramsys/DRAMSys/controller/ControllerRecordable.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2019, RPTU Kaiserslautern-Landau - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Author: Lukas Steiner - */ - -#include "ControllerRecordable.h" - -#include "DRAMSys/controller/scheduler/SchedulerIF.h" - -using namespace sc_core; -using namespace tlm; - -namespace DRAMSys -{ - -ControllerRecordable::ControllerRecordable(const sc_module_name& name, - const McConfig& config, - const SimConfig& simConfig, - const MemSpec& memSpec, - const AddressDecoder& addressDecoder, - TlmRecorder& tlmRecorder) : - Controller(name, config, memSpec, simConfig, addressDecoder, tlmRecorder), - tlmRecorder(tlmRecorder), - windowSizeTime(simConfig.windowSize * memSpec.tCK), - activeTimeMultiplier(memSpec.tCK / memSpec.dataRate), - enableWindowing(simConfig.enableWindowing) -{ - if (enableWindowing) - { - sensitive << windowEvent; - slidingAverageBufferDepth = std::vector(scheduler->getBufferDepth().size()); - windowAverageBufferDepth = std::vector(scheduler->getBufferDepth().size()); - windowEvent.notify(windowSizeTime); - nextWindowEventTime = windowSizeTime; - } -} - -tlm_sync_enum -ControllerRecordable::nb_transport_fw(tlm_generic_payload& trans, tlm_phase& phase, sc_time& delay) -{ - tlmRecorder.recordPhase(trans, phase, delay); - return Controller::nb_transport_fw(trans, phase, delay); -} - -tlm_sync_enum ControllerRecordable::nb_transport_bw([[maybe_unused]] tlm_generic_payload& trans, - [[maybe_unused]] tlm_phase& phase, - [[maybe_unused]] sc_time& delay) -{ - SC_REPORT_FATAL("Controller", "nb_transport_bw of controller must not be called"); - return TLM_ACCEPTED; -} - -void ControllerRecordable::sendToFrontend(tlm_generic_payload& payload, - tlm_phase& phase, - sc_time& delay) -{ - tlmRecorder.recordPhase(payload, phase, delay); - tSocket->nb_transport_bw(payload, phase, delay); -} - -void ControllerRecordable::controllerMethod() -{ - if (enableWindowing) - { - sc_time timeDiff = sc_time_stamp() - lastTimeCalled; - lastTimeCalled = sc_time_stamp(); - const std::vector& bufferDepth = scheduler->getBufferDepth(); - - for (std::size_t index = 0; index < slidingAverageBufferDepth.size(); index++) - slidingAverageBufferDepth[index] += bufferDepth[index] * timeDiff; - - if (sc_time_stamp() == nextWindowEventTime) - { - windowEvent.notify(windowSizeTime); - nextWindowEventTime += windowSizeTime; - - for (std::size_t index = 0; index < slidingAverageBufferDepth.size(); index++) - { - windowAverageBufferDepth[index] = slidingAverageBufferDepth[index] / windowSizeTime; - slidingAverageBufferDepth[index] = SC_ZERO_TIME; - } - - tlmRecorder.recordBufferDepth(sc_time_stamp().to_seconds(), windowAverageBufferDepth); - - Controller::controllerMethod(); - } - else - { - Controller::controllerMethod(); - } - } - else - { - Controller::controllerMethod(); - } -} - -} // namespace DRAMSys diff --git a/src/libdramsys/DRAMSys/controller/ControllerRecordable.h b/src/libdramsys/DRAMSys/controller/ControllerRecordable.h deleted file mode 100644 index 26ae086d..00000000 --- a/src/libdramsys/DRAMSys/controller/ControllerRecordable.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2019, RPTU Kaiserslautern-Landau - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Author: Lukas Steiner - */ - -#ifndef CONTROLLERRECORDABLE_H -#define CONTROLLERRECORDABLE_H - -#include "DRAMSys/common/TlmRecorder.h" -#include "DRAMSys/controller/Controller.h" -#include "DRAMSys/simulation/SimConfig.h" - -#include -#include - -namespace DRAMSys -{ - -class ControllerRecordable final : public Controller -{ -public: - ControllerRecordable(const sc_core::sc_module_name& name, - const McConfig& config, - const SimConfig& simConfig, - const MemSpec& memSpec, - const AddressDecoder& addressDecoder, - TlmRecorder& tlmRecorder); - -protected: - tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload& trans, - tlm::tlm_phase& phase, - sc_core::sc_time& delay) override; - tlm::tlm_sync_enum nb_transport_bw(tlm::tlm_generic_payload& trans, - tlm::tlm_phase& phase, - sc_core::sc_time& delay) override; - - void sendToFrontend(tlm::tlm_generic_payload& payload, - tlm::tlm_phase& phase, - sc_core::sc_time& delay) override; - - void controllerMethod() override; - -private: - TlmRecorder& tlmRecorder; - - sc_core::sc_event windowEvent; - const sc_core::sc_time windowSizeTime; - sc_core::sc_time nextWindowEventTime; - std::vector slidingAverageBufferDepth; - std::vector windowAverageBufferDepth; - sc_core::sc_time lastTimeCalled = sc_core::SC_ZERO_TIME; - - uint64_t lastNumberOfBeatsServed = 0; - const sc_core::sc_time activeTimeMultiplier; - const bool enableWindowing; -}; - -} // namespace DRAMSys - -#endif // CONTROLLERRECORDABLE_H diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.h b/src/libdramsys/DRAMSys/simulation/DRAMSys.h index 73000ac6..f3a9cc9b 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.h +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.h @@ -47,7 +47,6 @@ #include "DRAMSys/common/tlm2_base_protocol_checker.h" #include "DRAMSys/config/DRAMSysConfiguration.h" #include "DRAMSys/controller/Controller.h" -#include "DRAMSys/controller/ControllerRecordable.h" #include "DRAMSys/controller/McConfig.h" #include "DRAMSys/simulation/AddressDecoder.h" #include "DRAMSys/simulation/Arbiter.h" From d349aafff7a717c92d4779501ab298ead99ba741 Mon Sep 17 00:00:00 2001 From: Jonathan Hager Date: Wed, 19 Mar 2025 12:57:21 +0100 Subject: [PATCH 10/17] Change TlmRecorderArbiter to TlmRecorderController --- src/libdramsys/CMakeLists.txt | 2 +- ...rArbiter.cpp => TlmRecorderController.cpp} | 26 ++++++++++++++----- ...orderArbiter.h => TlmRecorderController.h} | 20 +++++++------- src/libdramsys/DRAMSys/simulation/DRAMSys.cpp | 16 ++++++------ src/libdramsys/DRAMSys/simulation/DRAMSys.h | 6 ++--- 5 files changed, 42 insertions(+), 28 deletions(-) rename src/libdramsys/DRAMSys/common/{TlmRecorderArbiter.cpp => TlmRecorderController.cpp} (75%) rename src/libdramsys/DRAMSys/common/{TlmRecorderArbiter.h => TlmRecorderController.h} (71%) diff --git a/src/libdramsys/CMakeLists.txt b/src/libdramsys/CMakeLists.txt index c37bab12..c3f5124e 100644 --- a/src/libdramsys/CMakeLists.txt +++ b/src/libdramsys/CMakeLists.txt @@ -39,7 +39,7 @@ add_library(libdramsys DRAMSys/common/DebugManager.cpp DRAMSys/common/TlmRecorder.cpp - DRAMSys/common/TlmRecorderArbiter.cpp + DRAMSys/common/TlmRecorderController.cpp DRAMSys/common/TlmRecorderDram.cpp DRAMSys/common/dramExtensions.cpp DRAMSys/common/utils.cpp diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderArbiter.cpp b/src/libdramsys/DRAMSys/common/TlmRecorderController.cpp similarity index 75% rename from src/libdramsys/DRAMSys/common/TlmRecorderArbiter.cpp rename to src/libdramsys/DRAMSys/common/TlmRecorderController.cpp index db2c1f98..5bdcd34f 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderArbiter.cpp +++ b/src/libdramsys/DRAMSys/common/TlmRecorderController.cpp @@ -1,4 +1,4 @@ -#include "TlmRecorderArbiter.h" +#include "TlmRecorderController.h" #include "DRAMSys/configuration/memspec/MemSpec.h" #include "DRAMSys/controller/Command.h" @@ -10,7 +10,7 @@ namespace DRAMSys { -TlmRecorderArbiter::TlmRecorderArbiter(const sc_core::sc_module_name& name, +TlmRecorderController::TlmRecorderController(const sc_core::sc_module_name& name, const SimConfig& simConfig, const MemSpec& memSpec, std::shared_ptr tlmRecorder, @@ -26,8 +26,10 @@ TlmRecorderArbiter::TlmRecorderArbiter(const sc_core::sc_module_name& name, activeTimeMultiplier(memSpec.tCK / memSpec.dataRate), enableBandwidth(enableBandwidth) { - iSocket.register_nb_transport_bw(this, &TlmRecorderArbiter::nb_transport_bw); - tSocket.register_nb_transport_fw(this, &TlmRecorderArbiter::nb_transport_fw); + iSocket.register_nb_transport_bw(this, &TlmRecorderController::nb_transport_bw); + tSocket.register_nb_transport_fw(this, &TlmRecorderController::nb_transport_fw); + tSocket.register_b_transport(this, &TlmRecorderController::b_transport); + tSocket.register_transport_dbg(this, &TlmRecorderController::transport_dbg); if (enableBandwidth) { @@ -42,7 +44,7 @@ TlmRecorderArbiter::TlmRecorderArbiter(const sc_core::sc_module_name& name, } } -tlm::tlm_sync_enum TlmRecorderArbiter::nb_transport_fw(tlm::tlm_generic_payload& trans, +tlm::tlm_sync_enum TlmRecorderController::nb_transport_fw(tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, sc_core::sc_time& delay) { @@ -56,7 +58,7 @@ tlm::tlm_sync_enum TlmRecorderArbiter::nb_transport_fw(tlm::tlm_generic_payload& return iSocket->nb_transport_fw(trans, phase, delay); } -tlm::tlm_sync_enum TlmRecorderArbiter::nb_transport_bw(tlm::tlm_generic_payload& trans, +tlm::tlm_sync_enum TlmRecorderController::nb_transport_bw(tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, sc_core::sc_time& delay) { @@ -70,7 +72,17 @@ tlm::tlm_sync_enum TlmRecorderArbiter::nb_transport_bw(tlm::tlm_generic_payload& return tSocket->nb_transport_bw(trans, phase, delay); } -void TlmRecorderArbiter::recordBandwidth() +void TlmRecorderController::b_transport(tlm::tlm_generic_payload& trans, sc_core::sc_time& delay) +{ + iSocket->b_transport(trans, delay); +} + +unsigned int TlmRecorderController::transport_dbg(tlm::tlm_generic_payload& trans) +{ + return iSocket->transport_dbg(trans); +} + +void TlmRecorderController::recordBandwidth() { if (enableBandwidth && enableWindowing && sc_core::sc_time_stamp() == nextWindowEventTime) { diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderArbiter.h b/src/libdramsys/DRAMSys/common/TlmRecorderController.h similarity index 71% rename from src/libdramsys/DRAMSys/common/TlmRecorderArbiter.h rename to src/libdramsys/DRAMSys/common/TlmRecorderController.h index 0c0475e8..5c63f52b 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderArbiter.h +++ b/src/libdramsys/DRAMSys/common/TlmRecorderController.h @@ -1,5 +1,5 @@ -#ifndef TLMRECORDERARBITER_H -#define TLMRECORDERARBITER_H +#ifndef TLMRECORDERCONTROLLER_H +#define TLMRECORDERCONTROLLER_H #include "DRAMSys/configuration/memspec/MemSpec.h" #include "DRAMSys/simulation/SimConfig.h" @@ -14,21 +14,21 @@ namespace DRAMSys { -class TlmRecorderArbiter : public sc_core::sc_module +class TlmRecorderController : public sc_core::sc_module { - SC_HAS_PROCESS(TlmRecorderArbiter); + SC_HAS_PROCESS(TlmRecorderController); public: - tlm_utils::simple_initiator_socket iSocket; - tlm_utils::simple_target_socket tSocket; + tlm_utils::simple_initiator_socket iSocket; + tlm_utils::simple_target_socket tSocket; - TlmRecorderArbiter(const sc_core::sc_module_name& name, + TlmRecorderController(const sc_core::sc_module_name& name, const SimConfig& simConfig, const MemSpec& memspec, std::shared_ptr tlmRecorder, bool enableBandwidth); - ~TlmRecorderArbiter() = default; + ~TlmRecorderController() = default; tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, @@ -36,6 +36,8 @@ public: tlm::tlm_sync_enum nb_transport_bw(tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, sc_core::sc_time& delay); + void b_transport(tlm::tlm_generic_payload& trans, sc_core::sc_time& delay); + unsigned int transport_dbg(tlm::tlm_generic_payload& trans); private: const MemSpec& memSpec; @@ -57,4 +59,4 @@ private: } // namespace DRAMSys -#endif // TLMRECORDERARBITER_H +#endif // TLMRECORDERCONTROLLER_H diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp index 81be9420..ae8c13c3 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp @@ -123,7 +123,7 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio ("TLMCheckerController" + std::to_string(i)).c_str())); // Not recording bandwidth between Arbiter - Controller - tlmWrappersArbiter.emplace_back(std::make_unique( + tlmRecordersController.emplace_back(std::make_unique( ("TlmRecorderWrapper" + std::to_string(i)).c_str(), simConfig, *memSpec, @@ -131,7 +131,7 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio false)); // Recording bandwidth between Controller - DRAM - tlmWrappersDram.emplace_back(std::make_unique( + tlmRecordersDram.emplace_back(std::make_unique( ("TlmRecorderWrapper" + std::to_string(i)).c_str(), simConfig, *memSpec, @@ -170,8 +170,8 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio if (simConfig.checkTLM2Protocol && simConfig.databaseRecording) { arbiter->iSocket.bind(controllersTlmCheckers[i]->target_socket); - controllersTlmCheckers[i]->initiator_socket.bind(tlmWrappersArbiter[i]->tSocket); - tlmWrappersArbiter[i]->iSocket.bind(controllers[i]->tSocket); + controllersTlmCheckers[i]->initiator_socket.bind(tlmRecordersController[i]->tSocket); + tlmRecordersController[i]->iSocket.bind(controllers[i]->tSocket); } else if (simConfig.checkTLM2Protocol) { @@ -180,8 +180,8 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio } else if (simConfig.databaseRecording) { - arbiter->iSocket.bind(tlmWrappersArbiter[i]->tSocket); - tlmWrappersArbiter[i]->iSocket.bind(controllers[i]->tSocket); + arbiter->iSocket.bind(tlmRecordersController[i]->tSocket); + tlmRecordersController[i]->iSocket.bind(controllers[i]->tSocket); } else { @@ -191,8 +191,8 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio // TODO: comments if (simConfig.databaseRecording) { - controllers[i]->iSocket.bind(tlmWrappersDram[i]->tSocket); - tlmWrappersDram[i]->iSocket.bind(drams[i]->tSocket); + controllers[i]->iSocket.bind(tlmRecordersDram[i]->tSocket); + tlmRecordersDram[i]->iSocket.bind(drams[i]->tSocket); } else { diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.h b/src/libdramsys/DRAMSys/simulation/DRAMSys.h index f3a9cc9b..410fd0f3 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.h +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.h @@ -42,7 +42,7 @@ #define DRAMSYS_H #include "DRAMSys/common/TlmRecorder.h" -#include "DRAMSys/common/TlmRecorderArbiter.h" +#include "DRAMSys/common/TlmRecorderController.h" #include "DRAMSys/common/TlmRecorderDram.h" #include "DRAMSys/common/tlm2_base_protocol_checker.h" #include "DRAMSys/config/DRAMSysConfiguration.h" @@ -128,8 +128,8 @@ private: // They generate the output databases. std::vector> tlmRecorders; - std::vector> tlmWrappersArbiter; - std::vector> tlmWrappersDram; + std::vector> tlmRecordersController; + std::vector> tlmRecordersDram; }; } // namespace DRAMSys From 2f8c318c0ee45d6d07a2febfcfd0b8c56bf81017 Mon Sep 17 00:00:00 2001 From: Jonathan Hager Date: Wed, 19 Mar 2025 12:58:49 +0100 Subject: [PATCH 11/17] Implemented b_transport and dbg --- .../DRAMSys/common/TlmRecorderDram.cpp | 28 +++++++++++++------ .../DRAMSys/common/TlmRecorderDram.h | 10 ++++--- src/libdramsys/DRAMSys/simulation/DRAMSys.cpp | 11 ++++---- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp b/src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp index 8faf784b..e4f0c6f8 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp +++ b/src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp @@ -10,10 +10,10 @@ namespace DRAMSys { TlmRecorderDram::TlmRecorderDram(const sc_core::sc_module_name& name, - const SimConfig& simConfig, - const MemSpec& memSpec, - std::shared_ptr tlmRecorder, - bool enableBandwidth) : + const SimConfig& simConfig, + const MemSpec& memSpec, + std::shared_ptr tlmRecorder, + bool enableBandwidth) : sc_module(name), tlmRecorder(std::move(tlmRecorder)), enableWindowing(simConfig.enableWindowing), @@ -26,6 +26,8 @@ TlmRecorderDram::TlmRecorderDram(const sc_core::sc_module_name& name, { iSocket.register_nb_transport_bw(this, &TlmRecorderDram::nb_transport_bw); tSocket.register_nb_transport_fw(this, &TlmRecorderDram::nb_transport_fw); + tSocket.register_b_transport(this, &TlmRecorderDram::b_transport); + tSocket.register_transport_dbg(this, &TlmRecorderDram::transport_dbg); if (enableBandwidth) { @@ -41,8 +43,8 @@ TlmRecorderDram::TlmRecorderDram(const sc_core::sc_module_name& name, } tlm::tlm_sync_enum TlmRecorderDram::nb_transport_fw(tlm::tlm_generic_payload& trans, - tlm::tlm_phase& phase, - sc_core::sc_time& delay) + tlm::tlm_phase& phase, + sc_core::sc_time& delay) { if (enableBandwidth && enableWindowing) { @@ -60,13 +62,23 @@ tlm::tlm_sync_enum TlmRecorderDram::nb_transport_fw(tlm::tlm_generic_payload& tr } tlm::tlm_sync_enum TlmRecorderDram::nb_transport_bw(tlm::tlm_generic_payload& trans, - tlm::tlm_phase& phase, - sc_core::sc_time& delay) + tlm::tlm_phase& phase, + sc_core::sc_time& delay) { tlmRecorder->recordPhase(trans, phase, delay); return tSocket->nb_transport_bw(trans, phase, delay); } +void TlmRecorderDram::b_transport(tlm::tlm_generic_payload& trans, sc_core::sc_time& delay) +{ + iSocket->b_transport(trans, delay); +} + +unsigned int TlmRecorderDram::transport_dbg(tlm::tlm_generic_payload& trans) +{ + return iSocket->transport_dbg(trans); +} + void TlmRecorderDram::recordBandwidth() { if (enableBandwidth && enableWindowing && sc_core::sc_time_stamp() == nextWindowEventTime) diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderDram.h b/src/libdramsys/DRAMSys/common/TlmRecorderDram.h index 6916eb20..8ac3d5b0 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderDram.h +++ b/src/libdramsys/DRAMSys/common/TlmRecorderDram.h @@ -24,10 +24,10 @@ public: tlm_utils::simple_target_socket tSocket; TlmRecorderDram(const sc_core::sc_module_name& name, - const SimConfig& simConfig, - const MemSpec& memspec, - std::shared_ptr tlmRecorder, - bool enableBandwidth); + const SimConfig& simConfig, + const MemSpec& memspec, + std::shared_ptr tlmRecorder, + bool enableBandwidth); ~TlmRecorderDram() = default; tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload& trans, @@ -36,6 +36,8 @@ public: tlm::tlm_sync_enum nb_transport_bw(tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, sc_core::sc_time& delay); + void b_transport(tlm::tlm_generic_payload& trans, sc_core::sc_time& delay); + unsigned int transport_dbg(tlm::tlm_generic_payload& trans); private: std::shared_ptr tlmRecorder; diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp index ae8c13c3..29d71ba7 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp @@ -91,18 +91,17 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio // Setup the debug manager: setupDebugManager(simConfig.simulationName); + std::string traceName = simConfig.simulationName; + // Create and properly initialize TLM recorders. + // They need to be ready before creating some modules. + setupTlmRecorders(traceName, config); + // Instantiate all internal DRAMSys modules: if (simConfig.databaseRecording) { - std::string traceName = simConfig.simulationName; - if (!config.simulationid.empty()) traceName = config.simulationid + '_' + traceName; - // Create and properly initialize TLM recorders. - // They need to be ready before creating some modules. - setupTlmRecorders(traceName, config); - // Create controllers and DRAMs for (std::size_t i = 0; i < memSpec->numberOfChannels; i++) { From 9c690c021c7e5cdadac45e1bdaa068ff9319cdcf Mon Sep 17 00:00:00 2001 From: Jonathan Hager Date: Wed, 19 Mar 2025 14:15:19 +0100 Subject: [PATCH 12/17] Fixed nullptr segfault if no database recording Dram and Controller handle this case now and are initialized with a shared_ptr pointing to null --- .../DRAMSys/controller/Controller.cpp | 3 +- src/libdramsys/DRAMSys/simulation/DRAMSys.cpp | 39 +++++++++++-------- src/libdramsys/DRAMSys/simulation/Dram.cpp | 20 ++++++---- 3 files changed, 37 insertions(+), 25 deletions(-) diff --git a/src/libdramsys/DRAMSys/controller/Controller.cpp b/src/libdramsys/DRAMSys/controller/Controller.cpp index 2a27bc9c..e18c7ef1 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.cpp +++ b/src/libdramsys/DRAMSys/controller/Controller.cpp @@ -353,7 +353,8 @@ void Controller::recordBufferDepth() slidingAverageBufferDepth[index] = SC_ZERO_TIME; } - tlmRecorder->recordBufferDepth(sc_time_stamp().to_seconds(), windowAverageBufferDepth); + if (simConfig.databaseRecording) + tlmRecorder->recordBufferDepth(sc_time_stamp().to_seconds(), windowAverageBufferDepth); } } diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp index 29d71ba7..00d361cf 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp @@ -91,17 +91,17 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio // Setup the debug manager: setupDebugManager(simConfig.simulationName); - std::string traceName = simConfig.simulationName; - // Create and properly initialize TLM recorders. - // They need to be ready before creating some modules. - setupTlmRecorders(traceName, config); - // Instantiate all internal DRAMSys modules: if (simConfig.databaseRecording) { + std::string traceName = simConfig.simulationName; if (!config.simulationid.empty()) traceName = config.simulationid + '_' + traceName; + // Create and properly initialize TLM recorders. + // They need to be ready before creating some modules. + setupTlmRecorders(traceName, config); + // Create controllers and DRAMs for (std::size_t i = 0; i < memSpec->numberOfChannels; i++) { @@ -123,19 +123,19 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio // Not recording bandwidth between Arbiter - Controller tlmRecordersController.emplace_back(std::make_unique( - ("TlmRecorderWrapper" + std::to_string(i)).c_str(), + ("TlmRecorderController" + std::to_string(i)).c_str(), simConfig, *memSpec, tlmRecorders[i], false)); // Recording bandwidth between Controller - DRAM - tlmRecordersDram.emplace_back(std::make_unique( - ("TlmRecorderWrapper" + std::to_string(i)).c_str(), - simConfig, - *memSpec, - tlmRecorders[i], - true)); + tlmRecordersDram.emplace_back( + std::make_unique(("TlmRecorderDram" + std::to_string(i)).c_str(), + simConfig, + *memSpec, + tlmRecorders[i], + true)); } } else @@ -148,10 +148,12 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio *memSpec, simConfig, *addressDecoder, - tlmRecorders[i])); + std::shared_ptr{})); - drams.emplace_back(std::make_unique( - ("dram" + std::to_string(i)).c_str(), simConfig, *memSpec, tlmRecorders[i])); + drams.emplace_back(std::make_unique(("dram" + std::to_string(i)).c_str(), + simConfig, + *memSpec, + std::shared_ptr{})); if (simConfig.checkTLM2Protocol) { @@ -256,8 +258,11 @@ void DRAMSys::end_of_simulation() dram->reportPower(); } - for (auto& tlmRecorder : tlmRecorders) - tlmRecorder->finalize(); + if (simConfig.databaseRecording) + { + for (auto& tlmRecorder : tlmRecorders) + tlmRecorder->finalize(); + } } void DRAMSys::logo() diff --git a/src/libdramsys/DRAMSys/simulation/Dram.cpp b/src/libdramsys/DRAMSys/simulation/Dram.cpp index 13fe2af4..f6ae99e1 100644 --- a/src/libdramsys/DRAMSys/simulation/Dram.cpp +++ b/src/libdramsys/DRAMSys/simulation/Dram.cpp @@ -143,9 +143,12 @@ void Dram::reportPower() << DRAMPower->getPower().average_power * memSpec.devicesPerRank << std::string(" mW") << std::endl; - tlmRecorder->recordPower(sc_time_stamp().to_seconds(), - this->DRAMPower->getPower().window_average_power * - this->memSpec.devicesPerRank); + if (tlmRecorder) + { + tlmRecorder->recordPower(sc_time_stamp().to_seconds(), + this->DRAMPower->getPower().window_average_power * + this->memSpec.devicesPerRank); + } #endif } @@ -301,10 +304,13 @@ void Dram::powerWindow() // During operation the energy should never be zero since the device is always consuming assert(!this->DRAMPower->getEnergy().window_energy < 1e-05); - // Store the time (in seconds) and the current average power (in mW) into the database - tlmRecorder->recordPower(sc_time_stamp().to_seconds(), - this->DRAMPower->getPower().window_average_power * - this->memSpec.devicesPerRank); + if (tlmRecorder) + { + // Store the time (in seconds) and the current average power (in mW) into the database + tlmRecorder->recordPower(sc_time_stamp().to_seconds(), + this->DRAMPower->getPower().window_average_power * + this->memSpec.devicesPerRank); + } // Here considering that DRAMPower provides the energy in pJ and the power in mW PRINTDEBUGMESSAGE(this->name(), From d773abc7ce2d388e3f5d93ffdd2f50ddb993a123 Mon Sep 17 00:00:00 2001 From: Jonathan Hager Date: Mon, 24 Mar 2025 15:54:28 +0100 Subject: [PATCH 13/17] Updated unit tests for HBM2 This is necessary, as recording the phases with tlmRecorders on the bus changed the internal call order in the SystemC kernel. This leads to different IDs in the database --- src/libdramsys/DRAMSys/simulation/DRAMSys.cpp | 6 +++++- .../HBM2/expected/DRAMSys_hbm2-example_hbm2_ch0.tdb | 4 ++-- .../HBM2/expected/DRAMSys_hbm2-example_hbm2_ch1.tdb | 4 ++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp index 00d361cf..ba2a93c4 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp @@ -165,6 +165,8 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio } // Connect all internal DRAMSys modules: + // If database recording is enabled, then the tlmRecorders are placed + // on the bus between the modules tSocket.bind(arbiter->tSocket); for (unsigned i = 0; i < memSpec->numberOfChannels; i++) { @@ -176,6 +178,7 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio } else if (simConfig.checkTLM2Protocol) { + // Arbiter <--> tlmRecorder <--> Controller arbiter->iSocket.bind(controllersTlmCheckers[i]->target_socket); controllersTlmCheckers[i]->initiator_socket.bind(controllers[i]->tSocket); } @@ -189,14 +192,15 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio arbiter->iSocket.bind(controllers[i]->tSocket); } - // TODO: comments if (simConfig.databaseRecording) { + // Controller <--> tlmRecorder <--> Dram controllers[i]->iSocket.bind(tlmRecordersDram[i]->tSocket); tlmRecordersDram[i]->iSocket.bind(drams[i]->tSocket); } else { + // Controller <--> Dram controllers[i]->iSocket.bind(drams[i]->tSocket); } } diff --git a/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch0.tdb b/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch0.tdb index cbf342c2..72b1a455 100644 --- a/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch0.tdb +++ b/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch0.tdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c07d0788e550884138f84803c0baf0c634a61ce225698eaedb39f9e828f62c65 -size 675840 +oid sha256:4e1a66644ba415a3821042624586f6ad20a44d6e0c2f999dc6a882d8aa4eda5c +size 692224 diff --git a/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch1.tdb b/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch1.tdb index 1bea7de6..f5cb5cd5 100644 --- a/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch1.tdb +++ b/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch1.tdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:db5321193521e8eb75654a545ba1155b7c707ee993ab67ae96b2639e278fc9d7 -size 684032 +oid sha256:1d12f192bd71465d7dceff8c9eff62865e7eb8b1a9b72ecb6d96af352a54efef +size 700416 From 94954c8697af2e08a687b5a696cf43c132668cfb Mon Sep 17 00:00:00 2001 From: Jonathan Hager Date: Wed, 26 Mar 2025 13:31:19 +0100 Subject: [PATCH 14/17] Switch from shared_ptrs back to references Dram and Controller hold a const pointer instead of a reference, so that it can be set to null, if database recording is disabled --- .../DRAMSys/common/TlmRecorderController.cpp | 10 +++---- .../DRAMSys/common/TlmRecorderController.h | 4 +-- .../DRAMSys/common/TlmRecorderDram.cpp | 10 +++---- .../DRAMSys/common/TlmRecorderDram.h | 4 +-- .../DRAMSys/controller/Controller.cpp | 6 ++-- .../DRAMSys/controller/Controller.h | 4 +-- src/libdramsys/DRAMSys/simulation/DRAMSys.cpp | 30 +++++++++---------- src/libdramsys/DRAMSys/simulation/DRAMSys.h | 2 +- src/libdramsys/DRAMSys/simulation/Dram.cpp | 6 ++-- src/libdramsys/DRAMSys/simulation/Dram.h | 4 +-- 10 files changed, 39 insertions(+), 41 deletions(-) diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderController.cpp b/src/libdramsys/DRAMSys/common/TlmRecorderController.cpp index 5bdcd34f..e9e00b3f 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderController.cpp +++ b/src/libdramsys/DRAMSys/common/TlmRecorderController.cpp @@ -13,11 +13,11 @@ namespace DRAMSys TlmRecorderController::TlmRecorderController(const sc_core::sc_module_name& name, const SimConfig& simConfig, const MemSpec& memSpec, - std::shared_ptr tlmRecorder, + TlmRecorder& tlmRecorder, bool enableBandwidth) : sc_module(name), memSpec(memSpec), - tlmRecorder(std::move(tlmRecorder)), + tlmRecorder(tlmRecorder), enableWindowing(simConfig.enableWindowing), pseudoChannelMode(memSpec.pseudoChannelMode()), ranksPerChannel(memSpec.ranksPerChannel), @@ -54,7 +54,7 @@ tlm::tlm_sync_enum TlmRecorderController::nb_transport_fw(tlm::tlm_generic_paylo numberOfBytesServed += trans.get_data_length(); } - tlmRecorder->recordPhase(trans, phase, delay); + tlmRecorder.recordPhase(trans, phase, delay); return iSocket->nb_transport_fw(trans, phase, delay); } @@ -68,7 +68,7 @@ tlm::tlm_sync_enum TlmRecorderController::nb_transport_bw(tlm::tlm_generic_paylo numberOfBytesServed += trans.get_data_length(); } - tlmRecorder->recordPhase(trans, phase, delay); + tlmRecorder.recordPhase(trans, phase, delay); return tSocket->nb_transport_bw(trans, phase, delay); } @@ -98,7 +98,7 @@ void TlmRecorderController::recordBandwidth() double windowBandwidth = static_cast(windowNumberOfBytesServed) / (windowSizeTime.to_seconds()); - tlmRecorder->recordBandwidth(sc_core::sc_time_stamp().to_seconds(), windowBandwidth); + tlmRecorder.recordBandwidth(sc_core::sc_time_stamp().to_seconds(), windowBandwidth); } } diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderController.h b/src/libdramsys/DRAMSys/common/TlmRecorderController.h index 5c63f52b..0df7c62e 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderController.h +++ b/src/libdramsys/DRAMSys/common/TlmRecorderController.h @@ -26,7 +26,7 @@ public: TlmRecorderController(const sc_core::sc_module_name& name, const SimConfig& simConfig, const MemSpec& memspec, - std::shared_ptr tlmRecorder, + TlmRecorder& tlmRecorder, bool enableBandwidth); ~TlmRecorderController() = default; @@ -41,7 +41,7 @@ public: private: const MemSpec& memSpec; - std::shared_ptr tlmRecorder; + TlmRecorder& tlmRecorder; const bool enableWindowing; const bool pseudoChannelMode; const unsigned int ranksPerChannel; diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp b/src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp index e4f0c6f8..68c2807e 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp +++ b/src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp @@ -12,10 +12,10 @@ namespace DRAMSys TlmRecorderDram::TlmRecorderDram(const sc_core::sc_module_name& name, const SimConfig& simConfig, const MemSpec& memSpec, - std::shared_ptr tlmRecorder, + TlmRecorder& tlmRecorder, bool enableBandwidth) : sc_module(name), - tlmRecorder(std::move(tlmRecorder)), + tlmRecorder(tlmRecorder), enableWindowing(simConfig.enableWindowing), pseudoChannelMode(memSpec.pseudoChannelMode()), ranksPerChannel(memSpec.ranksPerChannel), @@ -57,7 +57,7 @@ tlm::tlm_sync_enum TlmRecorderDram::nb_transport_fw(tlm::tlm_generic_payload& tr } } - tlmRecorder->recordPhase(trans, phase, delay); + tlmRecorder.recordPhase(trans, phase, delay); return iSocket->nb_transport_fw(trans, phase, delay); } @@ -65,7 +65,7 @@ tlm::tlm_sync_enum TlmRecorderDram::nb_transport_bw(tlm::tlm_generic_payload& tr tlm::tlm_phase& phase, sc_core::sc_time& delay) { - tlmRecorder->recordPhase(trans, phase, delay); + tlmRecorder.recordPhase(trans, phase, delay); return tSocket->nb_transport_bw(trans, phase, delay); } @@ -99,7 +99,7 @@ void TlmRecorderDram::recordBandwidth() sc_core::sc_time windowActiveTime = activeTimeMultiplier * static_cast(windowNumberOfBeatsServed); double windowAverageBandwidth = windowActiveTime / windowSizeTime; - tlmRecorder->recordBandwidth(sc_core::sc_time_stamp().to_seconds(), windowAverageBandwidth); + tlmRecorder.recordBandwidth(sc_core::sc_time_stamp().to_seconds(), windowAverageBandwidth); } } diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderDram.h b/src/libdramsys/DRAMSys/common/TlmRecorderDram.h index 8ac3d5b0..e6d5704f 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderDram.h +++ b/src/libdramsys/DRAMSys/common/TlmRecorderDram.h @@ -26,7 +26,7 @@ public: TlmRecorderDram(const sc_core::sc_module_name& name, const SimConfig& simConfig, const MemSpec& memspec, - std::shared_ptr tlmRecorder, + TlmRecorder& tlmRecorder, bool enableBandwidth); ~TlmRecorderDram() = default; @@ -40,7 +40,7 @@ public: unsigned int transport_dbg(tlm::tlm_generic_payload& trans); private: - std::shared_ptr tlmRecorder; + TlmRecorder& tlmRecorder; const bool enableWindowing; const bool pseudoChannelMode; const unsigned int ranksPerChannel; diff --git a/src/libdramsys/DRAMSys/controller/Controller.cpp b/src/libdramsys/DRAMSys/controller/Controller.cpp index e18c7ef1..6e7c1484 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.cpp +++ b/src/libdramsys/DRAMSys/controller/Controller.cpp @@ -89,13 +89,13 @@ Controller::Controller(const sc_module_name& name, const MemSpec& memSpec, const SimConfig& simConfig, const AddressDecoder& addressDecoder, - std::shared_ptr tlmRecorder) : + TlmRecorder* tlmRecorder) : sc_module(name), config(config), memSpec(memSpec), simConfig(simConfig), addressDecoder(addressDecoder), - tlmRecorder(std::move(tlmRecorder)), + tlmRecorder(tlmRecorder), windowSizeTime(simConfig.windowSize * memSpec.tCK), nextWindowEventTime(windowSizeTime), numberOfBeatsServed(memSpec.ranksPerChannel, 0), @@ -353,7 +353,7 @@ void Controller::recordBufferDepth() slidingAverageBufferDepth[index] = SC_ZERO_TIME; } - if (simConfig.databaseRecording) + if (simConfig.databaseRecording && tlmRecorder != nullptr) tlmRecorder->recordBufferDepth(sc_time_stamp().to_seconds(), windowAverageBufferDepth); } } diff --git a/src/libdramsys/DRAMSys/controller/Controller.h b/src/libdramsys/DRAMSys/controller/Controller.h index 4278ed89..79169c8f 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.h +++ b/src/libdramsys/DRAMSys/controller/Controller.h @@ -74,7 +74,7 @@ public: const MemSpec& memSpec, const SimConfig& simConfig, const AddressDecoder& addressDecoder, - std::shared_ptr tlmRecorder); + TlmRecorder* tlmRecorder); SC_HAS_PROCESS(Controller); [[nodiscard]] bool idle() const { return totalNumberOfPayloads == 0; } @@ -102,7 +102,7 @@ protected: const MemSpec& memSpec; const SimConfig& simConfig; const AddressDecoder& addressDecoder; - std::shared_ptr tlmRecorder; + TlmRecorder* const tlmRecorder; std::unique_ptr scheduler; diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp index ba2a93c4..9aaa2949 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp @@ -111,10 +111,10 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio *memSpec, simConfig, *addressDecoder, - tlmRecorders[i])); + &tlmRecorders[i])); drams.emplace_back(std::make_unique( - ("dram" + std::to_string(i)).c_str(), simConfig, *memSpec, tlmRecorders[i])); + ("dram" + std::to_string(i)).c_str(), simConfig, *memSpec, &tlmRecorders[i])); if (simConfig.checkTLM2Protocol) controllersTlmCheckers.emplace_back( @@ -148,12 +148,10 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio *memSpec, simConfig, *addressDecoder, - std::shared_ptr{})); + nullptr)); - drams.emplace_back(std::make_unique(("dram" + std::to_string(i)).c_str(), - simConfig, - *memSpec, - std::shared_ptr{})); + drams.emplace_back(std::make_unique( + ("dram" + std::to_string(i)).c_str(), simConfig, *memSpec, nullptr)); if (simConfig.checkTLM2Protocol) { @@ -228,14 +226,14 @@ void DRAMSys::setupTlmRecorders(const std::string& traceName, const Config::Conf mcconfig[Config::McConfig::KEY] = config.mcconfig; memspec[Config::MemSpec::KEY] = config.memspec; - tlmRecorders.push_back(std::make_shared(recorderName, - simConfig, - mcConfig, - *memSpec, - dbName, - mcconfig.dump(), - memspec.dump(), - simConfig.simulationName)); + tlmRecorders.emplace_back(recorderName, + simConfig, + mcConfig, + *memSpec, + dbName, + mcconfig.dump(), + memspec.dump(), + simConfig.simulationName); } } @@ -265,7 +263,7 @@ void DRAMSys::end_of_simulation() if (simConfig.databaseRecording) { for (auto& tlmRecorder : tlmRecorders) - tlmRecorder->finalize(); + tlmRecorder.finalize(); } } diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.h b/src/libdramsys/DRAMSys/simulation/DRAMSys.h index 410fd0f3..acfe0287 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.h +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.h @@ -126,7 +126,7 @@ private: // Transaction Recorders (one per channel). // They generate the output databases. - std::vector> tlmRecorders; + std::vector tlmRecorders; std::vector> tlmRecordersController; std::vector> tlmRecordersDram; diff --git a/src/libdramsys/DRAMSys/simulation/Dram.cpp b/src/libdramsys/DRAMSys/simulation/Dram.cpp index f6ae99e1..22e8e756 100644 --- a/src/libdramsys/DRAMSys/simulation/Dram.cpp +++ b/src/libdramsys/DRAMSys/simulation/Dram.cpp @@ -72,14 +72,14 @@ namespace DRAMSys Dram::Dram(const sc_module_name& name, const SimConfig& simConfig, const MemSpec& memSpec, - std::shared_ptr tlmRecorder) : + TlmRecorder* tlmRecorder) : sc_module(name), memSpec(memSpec), storeMode(simConfig.storeMode), powerAnalysis(simConfig.powerAnalysis), channelSize(memSpec.getSimMemSizeInBytes() / memSpec.numberOfChannels), useMalloc(simConfig.useMalloc), - tlmRecorder(std::move(tlmRecorder)), + tlmRecorder(tlmRecorder), powerWindowSize(memSpec.tCK * simConfig.windowSize) { if (storeMode == Config::StoreModeType::Store) @@ -143,7 +143,7 @@ void Dram::reportPower() << DRAMPower->getPower().average_power * memSpec.devicesPerRank << std::string(" mW") << std::endl; - if (tlmRecorder) + if (tlmRecorder != nullptr) { tlmRecorder->recordPower(sc_time_stamp().to_seconds(), this->DRAMPower->getPower().window_average_power * diff --git a/src/libdramsys/DRAMSys/simulation/Dram.h b/src/libdramsys/DRAMSys/simulation/Dram.h index 40581fe3..05742a91 100644 --- a/src/libdramsys/DRAMSys/simulation/Dram.h +++ b/src/libdramsys/DRAMSys/simulation/Dram.h @@ -69,7 +69,7 @@ protected: const uint64_t channelSize; const bool useMalloc; - std::shared_ptr tlmRecorder; + TlmRecorder* const tlmRecorder; sc_core::sc_time powerWindowSize; #ifdef DRAMPOWER @@ -93,7 +93,7 @@ public: Dram(const sc_core::sc_module_name& name, const SimConfig& simConfig, const MemSpec& memSpec, - std::shared_ptr tlmRecorder); + TlmRecorder* tlmRecorder); SC_HAS_PROCESS(Dram); Dram(const Dram&) = delete; From 950dbd690d5eb07659ce54c4615c2c3175e5c4d9 Mon Sep 17 00:00:00 2001 From: Jonathan Hager Date: Wed, 26 Mar 2025 13:58:14 +0100 Subject: [PATCH 15/17] Removed DramRecordable import --- src/libdramsys/DRAMSys/simulation/DRAMSys.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp index 9aaa2949..3d9e5e8b 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp @@ -44,7 +44,6 @@ #include "DRAMSys/common/utils.h" #include "DRAMSys/simulation/Dram.h" -#include "DRAMSys/simulation/DramRecordable.h" #include "DRAMSys/configuration/memspec/MemSpecDDR3.h" #include "DRAMSys/configuration/memspec/MemSpecDDR4.h" From 8266d825f35e478e7fe95f2546197118b7acc409 Mon Sep 17 00:00:00 2001 From: Jonathan Hager Date: Thu, 10 Apr 2025 10:21:58 +0200 Subject: [PATCH 16/17] Moved ifs from the method body to the invocation --- .../DRAMSys/common/TlmRecorderController.cpp | 49 +++++++++---------- .../DRAMSys/common/TlmRecorderDram.cpp | 39 +++++++-------- .../DRAMSys/controller/Controller.cpp | 30 ++++++------ 3 files changed, 54 insertions(+), 64 deletions(-) diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderController.cpp b/src/libdramsys/DRAMSys/common/TlmRecorderController.cpp index e9e00b3f..833fa82c 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderController.cpp +++ b/src/libdramsys/DRAMSys/common/TlmRecorderController.cpp @@ -11,10 +11,10 @@ namespace DRAMSys { TlmRecorderController::TlmRecorderController(const sc_core::sc_module_name& name, - const SimConfig& simConfig, - const MemSpec& memSpec, - TlmRecorder& tlmRecorder, - bool enableBandwidth) : + const SimConfig& simConfig, + const MemSpec& memSpec, + TlmRecorder& tlmRecorder, + bool enableBandwidth) : sc_module(name), memSpec(memSpec), tlmRecorder(tlmRecorder), @@ -31,22 +31,20 @@ TlmRecorderController::TlmRecorderController(const sc_core::sc_module_name& name tSocket.register_b_transport(this, &TlmRecorderController::b_transport); tSocket.register_transport_dbg(this, &TlmRecorderController::transport_dbg); - if (enableBandwidth) + if (enableBandwidth && enableWindowing) { SC_METHOD(recordBandwidth); + dont_initialize(); sensitive << windowEvent; - if (enableWindowing) - { - windowEvent.notify(windowSizeTime); - nextWindowEventTime = windowSizeTime; - } + windowEvent.notify(windowSizeTime); + nextWindowEventTime = windowSizeTime; } } tlm::tlm_sync_enum TlmRecorderController::nb_transport_fw(tlm::tlm_generic_payload& trans, - tlm::tlm_phase& phase, - sc_core::sc_time& delay) + tlm::tlm_phase& phase, + sc_core::sc_time& delay) { if (enableBandwidth && enableWindowing) { @@ -59,8 +57,8 @@ tlm::tlm_sync_enum TlmRecorderController::nb_transport_fw(tlm::tlm_generic_paylo } tlm::tlm_sync_enum TlmRecorderController::nb_transport_bw(tlm::tlm_generic_payload& trans, - tlm::tlm_phase& phase, - sc_core::sc_time& delay) + tlm::tlm_phase& phase, + sc_core::sc_time& delay) { if (enableBandwidth && enableWindowing) { @@ -84,22 +82,19 @@ unsigned int TlmRecorderController::transport_dbg(tlm::tlm_generic_payload& tran void TlmRecorderController::recordBandwidth() { - if (enableBandwidth && enableWindowing && sc_core::sc_time_stamp() == nextWindowEventTime) - { - windowEvent.notify(windowSizeTime); - nextWindowEventTime += windowSizeTime; + windowEvent.notify(windowSizeTime); + nextWindowEventTime += windowSizeTime; - uint64_t windowNumberOfBytesServed = numberOfBytesServed - lastNumberOfBytesServed; - lastNumberOfBytesServed = numberOfBytesServed; + uint64_t windowNumberOfBytesServed = numberOfBytesServed - lastNumberOfBytesServed; + lastNumberOfBytesServed = numberOfBytesServed; - // HBM specific, pseudo channels get averaged - if (pseudoChannelMode) - windowNumberOfBytesServed /= ranksPerChannel; + // HBM specific, pseudo channels get averaged + if (pseudoChannelMode) + windowNumberOfBytesServed /= ranksPerChannel; - double windowBandwidth = - static_cast(windowNumberOfBytesServed) / (windowSizeTime.to_seconds()); - tlmRecorder.recordBandwidth(sc_core::sc_time_stamp().to_seconds(), windowBandwidth); - } + double windowBandwidth = + static_cast(windowNumberOfBytesServed) / (windowSizeTime.to_seconds()); + tlmRecorder.recordBandwidth(sc_core::sc_time_stamp().to_seconds(), windowBandwidth); } } // namespace DRAMSys diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp b/src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp index 68c2807e..19f27360 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp +++ b/src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp @@ -29,16 +29,14 @@ TlmRecorderDram::TlmRecorderDram(const sc_core::sc_module_name& name, tSocket.register_b_transport(this, &TlmRecorderDram::b_transport); tSocket.register_transport_dbg(this, &TlmRecorderDram::transport_dbg); - if (enableBandwidth) + if (enableBandwidth && enableWindowing) { SC_METHOD(recordBandwidth); + dont_initialize(); sensitive << windowEvent; - if (enableWindowing) - { - windowEvent.notify(windowSizeTime); - nextWindowEventTime = windowSizeTime; - } + windowEvent.notify(windowSizeTime); + nextWindowEventTime = windowSizeTime; } } @@ -81,26 +79,23 @@ unsigned int TlmRecorderDram::transport_dbg(tlm::tlm_generic_payload& trans) void TlmRecorderDram::recordBandwidth() { - if (enableBandwidth && enableWindowing && sc_core::sc_time_stamp() == nextWindowEventTime) - { - windowEvent.notify(windowSizeTime); - nextWindowEventTime += windowSizeTime; + windowEvent.notify(windowSizeTime); + nextWindowEventTime += windowSizeTime; - std::uint64_t totalNumberOfBeatsServed = - std::accumulate(numberOfBeatsServed.begin(), numberOfBeatsServed.end(), 0); + std::uint64_t totalNumberOfBeatsServed = + std::accumulate(numberOfBeatsServed.begin(), numberOfBeatsServed.end(), 0); - uint64_t windowNumberOfBeatsServed = totalNumberOfBeatsServed - lastNumberOfBeatsServed; - lastNumberOfBeatsServed = totalNumberOfBeatsServed; + uint64_t windowNumberOfBeatsServed = totalNumberOfBeatsServed - lastNumberOfBeatsServed; + lastNumberOfBeatsServed = totalNumberOfBeatsServed; - // HBM specific, pseudo channels get averaged - if (pseudoChannelMode) - windowNumberOfBeatsServed /= ranksPerChannel; + // HBM specific, pseudo channels get averaged + if (pseudoChannelMode) + windowNumberOfBeatsServed /= ranksPerChannel; - sc_core::sc_time windowActiveTime = - activeTimeMultiplier * static_cast(windowNumberOfBeatsServed); - double windowAverageBandwidth = windowActiveTime / windowSizeTime; - tlmRecorder.recordBandwidth(sc_core::sc_time_stamp().to_seconds(), windowAverageBandwidth); - } + sc_core::sc_time windowActiveTime = + activeTimeMultiplier * static_cast(windowNumberOfBeatsServed); + double windowAverageBandwidth = windowActiveTime / windowSizeTime; + tlmRecorder.recordBandwidth(sc_core::sc_time_stamp().to_seconds(), windowAverageBandwidth); } } // namespace DRAMSys diff --git a/src/libdramsys/DRAMSys/controller/Controller.cpp b/src/libdramsys/DRAMSys/controller/Controller.cpp index 6e7c1484..95d9254b 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.cpp +++ b/src/libdramsys/DRAMSys/controller/Controller.cpp @@ -102,9 +102,13 @@ Controller::Controller(const sc_module_name& name, minBytesPerBurst(memSpec.defaultBytesPerBurst), maxBytesPerBurst(memSpec.maxBytesPerBurst) { - SC_METHOD(recordBufferDepth); - sensitive << windowEvent; - windowEvent.notify(windowSizeTime); + if (simConfig.databaseRecording && tlmRecorder != nullptr) + { + SC_METHOD(recordBufferDepth); + dont_initialize(); + sensitive << windowEvent; + windowEvent.notify(windowSizeTime); + } SC_METHOD(controllerMethod); sensitive << beginReqEvent << endRespEvent << controllerEvent << dataResponseEvent; @@ -342,20 +346,16 @@ void Controller::registerIdleCallback(std::function idleCallback) void Controller::recordBufferDepth() { - if (sc_time_stamp() == nextWindowEventTime) + windowEvent.notify(windowSizeTime); + nextWindowEventTime += windowSizeTime; + + for (std::size_t index = 0; index < slidingAverageBufferDepth.size(); index++) { - windowEvent.notify(windowSizeTime); - nextWindowEventTime += windowSizeTime; - - for (std::size_t index = 0; index < slidingAverageBufferDepth.size(); index++) - { - windowAverageBufferDepth[index] = slidingAverageBufferDepth[index] / windowSizeTime; - slidingAverageBufferDepth[index] = SC_ZERO_TIME; - } - - if (simConfig.databaseRecording && tlmRecorder != nullptr) - tlmRecorder->recordBufferDepth(sc_time_stamp().to_seconds(), windowAverageBufferDepth); + windowAverageBufferDepth[index] = slidingAverageBufferDepth[index] / windowSizeTime; + slidingAverageBufferDepth[index] = SC_ZERO_TIME; } + + tlmRecorder->recordBufferDepth(sc_time_stamp().to_seconds(), windowAverageBufferDepth); } void Controller::controllerMethod() From b9e3d8b0bf272df5a8cbfb839b0bbf8725078a91 Mon Sep 17 00:00:00 2001 From: Jonathan Hager Date: Thu, 10 Apr 2025 10:48:40 +0200 Subject: [PATCH 17/17] Renamed the tlmRecorder classes --- src/libdramsys/CMakeLists.txt | 4 +-- ...TlmRecorderDram.cpp => DramATRecorder.cpp} | 22 ++++++------ .../{TlmRecorderDram.h => DramATRecorder.h} | 18 +++++----- ...corderController.cpp => TlmATRecorder.cpp} | 22 ++++++------ ...lmRecorderController.h => TlmATRecorder.h} | 18 +++++----- src/libdramsys/DRAMSys/simulation/DRAMSys.cpp | 36 +++++++++---------- src/libdramsys/DRAMSys/simulation/DRAMSys.h | 8 ++--- 7 files changed, 64 insertions(+), 64 deletions(-) rename src/libdramsys/DRAMSys/common/{TlmRecorderDram.cpp => DramATRecorder.cpp} (78%) rename src/libdramsys/DRAMSys/common/{TlmRecorderDram.h => DramATRecorder.h} (79%) rename src/libdramsys/DRAMSys/common/{TlmRecorderController.cpp => TlmATRecorder.cpp} (76%) rename src/libdramsys/DRAMSys/common/{TlmRecorderController.h => TlmATRecorder.h} (78%) diff --git a/src/libdramsys/CMakeLists.txt b/src/libdramsys/CMakeLists.txt index c3f5124e..2bcca32e 100644 --- a/src/libdramsys/CMakeLists.txt +++ b/src/libdramsys/CMakeLists.txt @@ -39,8 +39,8 @@ add_library(libdramsys DRAMSys/common/DebugManager.cpp DRAMSys/common/TlmRecorder.cpp - DRAMSys/common/TlmRecorderController.cpp - DRAMSys/common/TlmRecorderDram.cpp + DRAMSys/common/TlmATRecorder.cpp + DRAMSys/common/DramATRecorder.cpp DRAMSys/common/dramExtensions.cpp DRAMSys/common/utils.cpp DRAMSys/configuration/memspec/MemSpec.cpp diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp b/src/libdramsys/DRAMSys/common/DramATRecorder.cpp similarity index 78% rename from src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp rename to src/libdramsys/DRAMSys/common/DramATRecorder.cpp index 19f27360..6a687382 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderDram.cpp +++ b/src/libdramsys/DRAMSys/common/DramATRecorder.cpp @@ -1,4 +1,4 @@ -#include "TlmRecorderDram.h" +#include "DramATRecorder.h" #include "DRAMSys/configuration/memspec/MemSpec.h" #include "DRAMSys/controller/Command.h" #include "DRAMSys/simulation/SimConfig.h" @@ -9,7 +9,7 @@ namespace DRAMSys { -TlmRecorderDram::TlmRecorderDram(const sc_core::sc_module_name& name, +DramATRecorder::DramATRecorder(const sc_core::sc_module_name& name, const SimConfig& simConfig, const MemSpec& memSpec, TlmRecorder& tlmRecorder, @@ -24,10 +24,10 @@ TlmRecorderDram::TlmRecorderDram(const sc_core::sc_module_name& name, activeTimeMultiplier(memSpec.tCK / memSpec.dataRate), enableBandwidth(enableBandwidth) { - iSocket.register_nb_transport_bw(this, &TlmRecorderDram::nb_transport_bw); - tSocket.register_nb_transport_fw(this, &TlmRecorderDram::nb_transport_fw); - tSocket.register_b_transport(this, &TlmRecorderDram::b_transport); - tSocket.register_transport_dbg(this, &TlmRecorderDram::transport_dbg); + iSocket.register_nb_transport_bw(this, &DramATRecorder::nb_transport_bw); + tSocket.register_nb_transport_fw(this, &DramATRecorder::nb_transport_fw); + tSocket.register_b_transport(this, &DramATRecorder::b_transport); + tSocket.register_transport_dbg(this, &DramATRecorder::transport_dbg); if (enableBandwidth && enableWindowing) { @@ -40,7 +40,7 @@ TlmRecorderDram::TlmRecorderDram(const sc_core::sc_module_name& name, } } -tlm::tlm_sync_enum TlmRecorderDram::nb_transport_fw(tlm::tlm_generic_payload& trans, +tlm::tlm_sync_enum DramATRecorder::nb_transport_fw(tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, sc_core::sc_time& delay) { @@ -59,7 +59,7 @@ tlm::tlm_sync_enum TlmRecorderDram::nb_transport_fw(tlm::tlm_generic_payload& tr return iSocket->nb_transport_fw(trans, phase, delay); } -tlm::tlm_sync_enum TlmRecorderDram::nb_transport_bw(tlm::tlm_generic_payload& trans, +tlm::tlm_sync_enum DramATRecorder::nb_transport_bw(tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, sc_core::sc_time& delay) { @@ -67,17 +67,17 @@ tlm::tlm_sync_enum TlmRecorderDram::nb_transport_bw(tlm::tlm_generic_payload& tr return tSocket->nb_transport_bw(trans, phase, delay); } -void TlmRecorderDram::b_transport(tlm::tlm_generic_payload& trans, sc_core::sc_time& delay) +void DramATRecorder::b_transport(tlm::tlm_generic_payload& trans, sc_core::sc_time& delay) { iSocket->b_transport(trans, delay); } -unsigned int TlmRecorderDram::transport_dbg(tlm::tlm_generic_payload& trans) +unsigned int DramATRecorder::transport_dbg(tlm::tlm_generic_payload& trans) { return iSocket->transport_dbg(trans); } -void TlmRecorderDram::recordBandwidth() +void DramATRecorder::recordBandwidth() { windowEvent.notify(windowSizeTime); nextWindowEventTime += windowSizeTime; diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderDram.h b/src/libdramsys/DRAMSys/common/DramATRecorder.h similarity index 79% rename from src/libdramsys/DRAMSys/common/TlmRecorderDram.h rename to src/libdramsys/DRAMSys/common/DramATRecorder.h index e6d5704f..85622b11 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderDram.h +++ b/src/libdramsys/DRAMSys/common/DramATRecorder.h @@ -1,5 +1,5 @@ -#ifndef TLMRECORDERDRAM_H -#define TLMRECORDERDRAM_H +#ifndef DRAMATRECORDER_H +#define DRAMATRECORDER_H #include "DRAMSys/configuration/memspec/MemSpec.h" #include "DRAMSys/simulation/SimConfig.h" @@ -14,21 +14,21 @@ namespace DRAMSys { -class TlmRecorderDram : public sc_core::sc_module +class DramATRecorder : public sc_core::sc_module { - SC_HAS_PROCESS(TlmRecorderDram); + SC_HAS_PROCESS(DramATRecorder); public: - tlm_utils::simple_initiator_socket iSocket; - tlm_utils::simple_target_socket tSocket; + tlm_utils::simple_initiator_socket iSocket; + tlm_utils::simple_target_socket tSocket; - TlmRecorderDram(const sc_core::sc_module_name& name, + DramATRecorder(const sc_core::sc_module_name& name, const SimConfig& simConfig, const MemSpec& memspec, TlmRecorder& tlmRecorder, bool enableBandwidth); - ~TlmRecorderDram() = default; + ~DramATRecorder() = default; tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, @@ -58,4 +58,4 @@ private: } // namespace DRAMSys -#endif // TLMRECORDERDRAM_H +#endif // DRAMATRECORDER_H diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderController.cpp b/src/libdramsys/DRAMSys/common/TlmATRecorder.cpp similarity index 76% rename from src/libdramsys/DRAMSys/common/TlmRecorderController.cpp rename to src/libdramsys/DRAMSys/common/TlmATRecorder.cpp index 833fa82c..05d04909 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderController.cpp +++ b/src/libdramsys/DRAMSys/common/TlmATRecorder.cpp @@ -1,4 +1,4 @@ -#include "TlmRecorderController.h" +#include "TlmATRecorder.h" #include "DRAMSys/configuration/memspec/MemSpec.h" #include "DRAMSys/controller/Command.h" @@ -10,7 +10,7 @@ namespace DRAMSys { -TlmRecorderController::TlmRecorderController(const sc_core::sc_module_name& name, +TlmATRecorder::TlmATRecorder(const sc_core::sc_module_name& name, const SimConfig& simConfig, const MemSpec& memSpec, TlmRecorder& tlmRecorder, @@ -26,10 +26,10 @@ TlmRecorderController::TlmRecorderController(const sc_core::sc_module_name& name activeTimeMultiplier(memSpec.tCK / memSpec.dataRate), enableBandwidth(enableBandwidth) { - iSocket.register_nb_transport_bw(this, &TlmRecorderController::nb_transport_bw); - tSocket.register_nb_transport_fw(this, &TlmRecorderController::nb_transport_fw); - tSocket.register_b_transport(this, &TlmRecorderController::b_transport); - tSocket.register_transport_dbg(this, &TlmRecorderController::transport_dbg); + iSocket.register_nb_transport_bw(this, &TlmATRecorder::nb_transport_bw); + tSocket.register_nb_transport_fw(this, &TlmATRecorder::nb_transport_fw); + tSocket.register_b_transport(this, &TlmATRecorder::b_transport); + tSocket.register_transport_dbg(this, &TlmATRecorder::transport_dbg); if (enableBandwidth && enableWindowing) { @@ -42,7 +42,7 @@ TlmRecorderController::TlmRecorderController(const sc_core::sc_module_name& name } } -tlm::tlm_sync_enum TlmRecorderController::nb_transport_fw(tlm::tlm_generic_payload& trans, +tlm::tlm_sync_enum TlmATRecorder::nb_transport_fw(tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, sc_core::sc_time& delay) { @@ -56,7 +56,7 @@ tlm::tlm_sync_enum TlmRecorderController::nb_transport_fw(tlm::tlm_generic_paylo return iSocket->nb_transport_fw(trans, phase, delay); } -tlm::tlm_sync_enum TlmRecorderController::nb_transport_bw(tlm::tlm_generic_payload& trans, +tlm::tlm_sync_enum TlmATRecorder::nb_transport_bw(tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, sc_core::sc_time& delay) { @@ -70,17 +70,17 @@ tlm::tlm_sync_enum TlmRecorderController::nb_transport_bw(tlm::tlm_generic_paylo return tSocket->nb_transport_bw(trans, phase, delay); } -void TlmRecorderController::b_transport(tlm::tlm_generic_payload& trans, sc_core::sc_time& delay) +void TlmATRecorder::b_transport(tlm::tlm_generic_payload& trans, sc_core::sc_time& delay) { iSocket->b_transport(trans, delay); } -unsigned int TlmRecorderController::transport_dbg(tlm::tlm_generic_payload& trans) +unsigned int TlmATRecorder::transport_dbg(tlm::tlm_generic_payload& trans) { return iSocket->transport_dbg(trans); } -void TlmRecorderController::recordBandwidth() +void TlmATRecorder::recordBandwidth() { windowEvent.notify(windowSizeTime); nextWindowEventTime += windowSizeTime; diff --git a/src/libdramsys/DRAMSys/common/TlmRecorderController.h b/src/libdramsys/DRAMSys/common/TlmATRecorder.h similarity index 78% rename from src/libdramsys/DRAMSys/common/TlmRecorderController.h rename to src/libdramsys/DRAMSys/common/TlmATRecorder.h index 0df7c62e..d6713a88 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorderController.h +++ b/src/libdramsys/DRAMSys/common/TlmATRecorder.h @@ -1,5 +1,5 @@ -#ifndef TLMRECORDERCONTROLLER_H -#define TLMRECORDERCONTROLLER_H +#ifndef TLMATRECORDER_H +#define TLMATRECORDER_H #include "DRAMSys/configuration/memspec/MemSpec.h" #include "DRAMSys/simulation/SimConfig.h" @@ -14,21 +14,21 @@ namespace DRAMSys { -class TlmRecorderController : public sc_core::sc_module +class TlmATRecorder : public sc_core::sc_module { - SC_HAS_PROCESS(TlmRecorderController); + SC_HAS_PROCESS(TlmATRecorder); public: - tlm_utils::simple_initiator_socket iSocket; - tlm_utils::simple_target_socket tSocket; + tlm_utils::simple_initiator_socket iSocket; + tlm_utils::simple_target_socket tSocket; - TlmRecorderController(const sc_core::sc_module_name& name, + TlmATRecorder(const sc_core::sc_module_name& name, const SimConfig& simConfig, const MemSpec& memspec, TlmRecorder& tlmRecorder, bool enableBandwidth); - ~TlmRecorderController() = default; + ~TlmATRecorder() = default; tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, @@ -59,4 +59,4 @@ private: } // namespace DRAMSys -#endif // TLMRECORDERCONTROLLER_H +#endif // TLMATRECORDER_H diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp index 3d9e5e8b..c0a92821 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp @@ -121,20 +121,20 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio ("TLMCheckerController" + std::to_string(i)).c_str())); // Not recording bandwidth between Arbiter - Controller - tlmRecordersController.emplace_back(std::make_unique( - ("TlmRecorderController" + std::to_string(i)).c_str(), - simConfig, - *memSpec, - tlmRecorders[i], - false)); + tlmATRecorders.emplace_back( + std::make_unique(("TlmATRecorder" + std::to_string(i)).c_str(), + simConfig, + *memSpec, + tlmRecorders[i], + false)); // Recording bandwidth between Controller - DRAM - tlmRecordersDram.emplace_back( - std::make_unique(("TlmRecorderDram" + std::to_string(i)).c_str(), - simConfig, - *memSpec, - tlmRecorders[i], - true)); + dramATRecorders.emplace_back( + std::make_unique(("DramATRecorder" + std::to_string(i)).c_str(), + simConfig, + *memSpec, + tlmRecorders[i], + true)); } } else @@ -170,8 +170,8 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio if (simConfig.checkTLM2Protocol && simConfig.databaseRecording) { arbiter->iSocket.bind(controllersTlmCheckers[i]->target_socket); - controllersTlmCheckers[i]->initiator_socket.bind(tlmRecordersController[i]->tSocket); - tlmRecordersController[i]->iSocket.bind(controllers[i]->tSocket); + controllersTlmCheckers[i]->initiator_socket.bind(tlmATRecorders[i]->tSocket); + tlmATRecorders[i]->iSocket.bind(controllers[i]->tSocket); } else if (simConfig.checkTLM2Protocol) { @@ -181,8 +181,8 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio } else if (simConfig.databaseRecording) { - arbiter->iSocket.bind(tlmRecordersController[i]->tSocket); - tlmRecordersController[i]->iSocket.bind(controllers[i]->tSocket); + arbiter->iSocket.bind(tlmATRecorders[i]->tSocket); + tlmATRecorders[i]->iSocket.bind(controllers[i]->tSocket); } else { @@ -192,8 +192,8 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, const Config::Configuratio if (simConfig.databaseRecording) { // Controller <--> tlmRecorder <--> Dram - controllers[i]->iSocket.bind(tlmRecordersDram[i]->tSocket); - tlmRecordersDram[i]->iSocket.bind(drams[i]->tSocket); + controllers[i]->iSocket.bind(dramATRecorders[i]->tSocket); + dramATRecorders[i]->iSocket.bind(drams[i]->tSocket); } else { diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.h b/src/libdramsys/DRAMSys/simulation/DRAMSys.h index acfe0287..158df249 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.h +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.h @@ -41,9 +41,9 @@ #ifndef DRAMSYS_H #define DRAMSYS_H +#include "DRAMSys/common/DramATRecorder.h" +#include "DRAMSys/common/TlmATRecorder.h" #include "DRAMSys/common/TlmRecorder.h" -#include "DRAMSys/common/TlmRecorderController.h" -#include "DRAMSys/common/TlmRecorderDram.h" #include "DRAMSys/common/tlm2_base_protocol_checker.h" #include "DRAMSys/config/DRAMSysConfiguration.h" #include "DRAMSys/controller/Controller.h" @@ -128,8 +128,8 @@ private: // They generate the output databases. std::vector tlmRecorders; - std::vector> tlmRecordersController; - std::vector> tlmRecordersDram; + std::vector> tlmATRecorders; + std::vector> dramATRecorders; }; } // namespace DRAMSys