From 53d913c5f14909f51c4e5740c5d46d330a6ac741 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Fri, 17 Mar 2023 09:44:31 +0100 Subject: [PATCH] Make BlockingRead/WriteDelay configurable --- src/configuration/DRAMSys/config/McConfig.cpp | 10 +++++++++- src/configuration/DRAMSys/config/McConfig.h | 2 ++ .../DRAMSys/configuration/Configuration.cpp | 10 ++++++++++ .../DRAMSys/configuration/Configuration.h | 2 ++ .../DRAMSys/controller/Controller.cpp | 2 ++ src/libdramsys/DRAMSys/controller/Controller.h | 2 ++ src/libdramsys/DRAMSys/simulation/DRAMSys.cpp | 2 +- src/libdramsys/DRAMSys/simulation/DRAMSys.h | 2 +- .../DRAMSys/simulation/dram/Dram.cpp | 5 ----- src/libdramsys/DRAMSys/simulation/dram/Dram.h | 2 -- .../tests_dramsys/b_transport/b_transport.cpp | 18 +++++++++++------- .../b_transport/configs/no_storage.json | 4 +++- tests/tests_dramsys/example.txt | 0 13 files changed, 43 insertions(+), 18 deletions(-) delete mode 100644 tests/tests_dramsys/example.txt diff --git a/src/configuration/DRAMSys/config/McConfig.cpp b/src/configuration/DRAMSys/config/McConfig.cpp index 04556b78..ff9f479d 100644 --- a/src/configuration/DRAMSys/config/McConfig.cpp +++ b/src/configuration/DRAMSys/config/McConfig.cpp @@ -60,7 +60,9 @@ void to_json(json_t &j, const McConfig &c) {"ThinkDelayFw", c.thinkDelayFw}, {"ThinkDelayBw", c.thinkDelayBw}, {"PhyDelayFw", c.phyDelayFw}, - {"PhyDelayBw", c.phyDelayBw}}; + {"PhyDelayBw", c.phyDelayBw}, + {"BlockingReadDelay", c.blockingReadDelay}, + {"BlockingWriteDelay", c.blockingWriteDelay}}; remove_null_values(j); } @@ -132,6 +134,12 @@ void from_json(const json_t &j, McConfig &c) if (j_mcconfig.contains("PhyDelayBw")) j_mcconfig.at("PhyDelayBw").get_to(c.phyDelayBw); + if (j_mcconfig.contains("BlockingReadDelay")) + j_mcconfig.at("BlockingReadDelay").get_to(c.blockingReadDelay); + + if (j_mcconfig.contains("BlockingWriteDelay")) + j_mcconfig.at("BlockingWriteDelay").get_to(c.blockingWriteDelay); + invalidateEnum(c.pagePolicy); invalidateEnum(c.scheduler); invalidateEnum(c.schedulerBuffer); diff --git a/src/configuration/DRAMSys/config/McConfig.h b/src/configuration/DRAMSys/config/McConfig.h index 16769e4b..da697981 100644 --- a/src/configuration/DRAMSys/config/McConfig.h +++ b/src/configuration/DRAMSys/config/McConfig.h @@ -171,6 +171,8 @@ struct McConfig std::optional thinkDelayBw; std::optional phyDelayFw; std::optional phyDelayBw; + std::optional blockingReadDelay; + std::optional blockingWriteDelay; }; void to_json(json_t &j, const McConfig &c); diff --git a/src/libdramsys/DRAMSys/configuration/Configuration.cpp b/src/libdramsys/DRAMSys/configuration/Configuration.cpp index d7ca08d7..b3ae5fe4 100644 --- a/src/libdramsys/DRAMSys/configuration/Configuration.cpp +++ b/src/libdramsys/DRAMSys/configuration/Configuration.cpp @@ -274,6 +274,16 @@ void Configuration::loadMCConfig(const DRAMSys::Config::McConfig &mcConfig) { phyDelayBw = std::round(sc_time(*_phyDelayBw, SC_NS) / memSpec->tCK) * memSpec->tCK; } + + { + auto _blockingReadDelay = mcConfig.blockingReadDelay.value_or(60); + blockingReadDelay = std::round(sc_time(_blockingReadDelay, SC_NS) / memSpec->tCK) * memSpec->tCK; + } + + { + auto _blockingWriteDelay = mcConfig.blockingWriteDelay.value_or(60); + blockingWriteDelay = std::round(sc_time(_blockingWriteDelay, SC_NS) / memSpec->tCK) * memSpec->tCK; + } } void Configuration::loadMemSpec(const DRAMSys::Config::MemSpec &memSpecConfig) diff --git a/src/libdramsys/DRAMSys/configuration/Configuration.h b/src/libdramsys/DRAMSys/configuration/Configuration.h index 7a4cfc20..f9c7fff0 100644 --- a/src/libdramsys/DRAMSys/configuration/Configuration.h +++ b/src/libdramsys/DRAMSys/configuration/Configuration.h @@ -79,6 +79,8 @@ public: sc_core::sc_time thinkDelayBw = sc_core::SC_ZERO_TIME; sc_core::sc_time phyDelayFw = sc_core::SC_ZERO_TIME; sc_core::sc_time phyDelayBw = sc_core::SC_ZERO_TIME; + sc_core::sc_time blockingReadDelay = sc_core::SC_ZERO_TIME; + sc_core::sc_time blockingWriteDelay = sc_core::SC_ZERO_TIME; // SimConfig std::string simulationName = "default"; diff --git a/src/libdramsys/DRAMSys/controller/Controller.cpp b/src/libdramsys/DRAMSys/controller/Controller.cpp index 0ac6e063..f5c4d042 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.cpp +++ b/src/libdramsys/DRAMSys/controller/Controller.cpp @@ -80,6 +80,7 @@ Controller::Controller(const sc_module_name& name, const Configuration& config, ControllerIF(name, config), addressDecoder(addressDecoder), thinkDelayFw(config.thinkDelayFw), thinkDelayBw(config.thinkDelayBw), phyDelayFw(config.phyDelayFw), phyDelayBw(config.phyDelayBw), + blockingReadDelay(config.blockingReadDelay), blockingWriteDelay(config.blockingWriteDelay), minBytesPerBurst(config.memSpec->defaultBytesPerBurst), maxBytesPerBurst(config.memSpec->maxBytesPerBurst) { @@ -416,6 +417,7 @@ tlm_sync_enum Controller::nb_transport_bw(tlm_generic_payload &, void Controller::b_transport(tlm_generic_payload &trans, sc_time &delay) { iSocket->b_transport(trans, delay); + delay += trans.is_write() ? blockingWriteDelay : blockingReadDelay; } unsigned int Controller::transport_dbg(tlm_generic_payload &trans) diff --git a/src/libdramsys/DRAMSys/controller/Controller.h b/src/libdramsys/DRAMSys/controller/Controller.h index 049a1152..5630b763 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.h +++ b/src/libdramsys/DRAMSys/controller/Controller.h @@ -74,6 +74,8 @@ protected: const sc_core::sc_time thinkDelayBw; const sc_core::sc_time phyDelayFw; const sc_core::sc_time phyDelayBw; + const sc_core::sc_time blockingReadDelay; + const sc_core::sc_time blockingWriteDelay; private: unsigned totalNumberOfPayloads = 0; diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp index 0a1e92d5..7d02beab 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp @@ -103,7 +103,7 @@ DRAMSys::DRAMSys(const sc_core::sc_module_name& name, } } -const Configuration& DRAMSys::getConfig() +const Configuration& DRAMSys::getConfig() const { return config; } diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.h b/src/libdramsys/DRAMSys/simulation/DRAMSys.h index 94ca9388..cec3a6d9 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.h +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.h @@ -69,7 +69,7 @@ public: DRAMSys(const sc_core::sc_module_name& name, const ::DRAMSys::Config::Configuration& configLib); - const Configuration& getConfig(); + const Configuration& getConfig() const; protected: DRAMSys(const sc_core::sc_module_name& name, diff --git a/src/libdramsys/DRAMSys/simulation/dram/Dram.cpp b/src/libdramsys/DRAMSys/simulation/dram/Dram.cpp index 30833042..b15b050f 100644 --- a/src/libdramsys/DRAMSys/simulation/dram/Dram.cpp +++ b/src/libdramsys/DRAMSys/simulation/dram/Dram.cpp @@ -63,9 +63,6 @@ using namespace tlm; using namespace DRAMPower; #endif -const sc_core::sc_time Dram::BLOCKING_READ_LATENCY = sc_core::sc_time(60, sc_core::SC_NS); -const sc_core::sc_time Dram::BLOCKING_WRITE_LATENCY = sc_core::sc_time(60, sc_core::SC_NS); - Dram::Dram(const sc_module_name& name, const Configuration& config) : sc_module(name), memSpec(*config.memSpec), tSocket("socket"), storeMode(config.storeMode), powerAnalysis(config.powerAnalysis), useMalloc(config.useMalloc) @@ -212,8 +209,6 @@ void Dram::b_transport(tlm_generic_payload &trans, sc_time &delay) printedWarning = true; } - delay += trans.is_write() ? BLOCKING_WRITE_LATENCY : BLOCKING_READ_LATENCY; - if (storeMode == Configuration::StoreMode::Store) { tlm_command cmd = trans.get_command(); diff --git a/src/libdramsys/DRAMSys/simulation/dram/Dram.h b/src/libdramsys/DRAMSys/simulation/dram/Dram.h index c78254fd..4e6acf98 100644 --- a/src/libdramsys/DRAMSys/simulation/dram/Dram.h +++ b/src/libdramsys/DRAMSys/simulation/dram/Dram.h @@ -75,8 +75,6 @@ protected: virtual unsigned int transport_dbg(tlm::tlm_generic_payload& trans); public: - static const sc_core::sc_time BLOCKING_READ_LATENCY; - static const sc_core::sc_time BLOCKING_WRITE_LATENCY; static constexpr std::string_view BLOCKING_WARNING = "Use the blocking mode of DRAMSys with caution! " "The simulated timings do not reflect the real system!"; diff --git a/tests/tests_dramsys/b_transport/b_transport.cpp b/tests/tests_dramsys/b_transport/b_transport.cpp index b57759fb..9fde8579 100644 --- a/tests/tests_dramsys/b_transport/b_transport.cpp +++ b/tests/tests_dramsys/b_transport/b_transport.cpp @@ -74,11 +74,15 @@ struct BlockingInitiator : sc_core::sc_module { tlm_utils::simple_initiator_socket iSocket; static constexpr std::array TEST_DATA = {0xDEADBEEF}; - SC_CTOR(BlockingInitiator) + DRAMSys::DRAMSys const &dramSys; + + BlockingInitiator(sc_core::sc_module_name const &name, DRAMSys::DRAMSys const &dramSys) + : sc_core::sc_module(name), dramSys(dramSys) { SC_THREAD(readAccess); SC_THREAD(writeAccess); } + SC_HAS_PROCESS(BlockingInitiator); void readAccess() { @@ -87,7 +91,7 @@ struct BlockingInitiator : sc_core::sc_module sc_core::sc_time delay = sc_core::SC_ZERO_TIME; iSocket->b_transport(payload, delay); - EXPECT_EQ(delay, Dram::BLOCKING_READ_LATENCY); + EXPECT_EQ(delay, dramSys.getConfig().blockingReadDelay); } void writeAccess() @@ -100,13 +104,13 @@ struct BlockingInitiator : sc_core::sc_module sc_core::sc_time delay = sc_core::SC_ZERO_TIME; iSocket->b_transport(payload, delay); - EXPECT_EQ(delay, Dram::BLOCKING_WRITE_LATENCY); + EXPECT_EQ(delay, dramSys.getConfig().blockingWriteDelay); } }; TEST_F(BTransportNoStorage, RWDelay) { - BlockingInitiator initiator("initiator"); + BlockingInitiator initiator("initiator", dramSysNoStorage); initiator.iSocket.bind(dramSysNoStorage.tSocket); sc_core::sc_start(sc_core::sc_time(1, sc_core::SC_US)); @@ -114,7 +118,7 @@ TEST_F(BTransportNoStorage, RWDelay) TEST_F(BTransportStorage, RWDelay) { - BlockingInitiator initiator("initiator"); + BlockingInitiator initiator("initiator", dramSysStorage); initiator.iSocket.bind(dramSysStorage.tSocket); sc_core::sc_start(sc_core::sc_time(1, sc_core::SC_US)); @@ -122,7 +126,7 @@ TEST_F(BTransportStorage, RWDelay) TEST_F(BTransportStorage, DataWritten) { - BlockingInitiator initiator("initiator"); + BlockingInitiator initiator("initiator", dramSysStorage); initiator.iSocket.bind(dramSysStorage.tSocket); sc_core::sc_start(sc_core::sc_time(1, sc_core::SC_US)); @@ -140,7 +144,7 @@ TEST_F(BTransportStorage, DataWritten) TEST_F(BTransportNoStorage, Warning) { - BlockingInitiator initiator("initiator"); + BlockingInitiator initiator("initiator", dramSysNoStorage); initiator.iSocket.bind(dramSysNoStorage.tSocket); // Redirect stdout to buffer diff --git a/tests/tests_dramsys/b_transport/configs/no_storage.json b/tests/tests_dramsys/b_transport/configs/no_storage.json index a62c17b0..c2950e40 100644 --- a/tests/tests_dramsys/b_transport/configs/no_storage.json +++ b/tests/tests_dramsys/b_transport/configs/no_storage.json @@ -59,7 +59,9 @@ "RequestBufferSize": 8, "RespQueue": "Fifo", "Scheduler": "FrFcfs", - "SchedulerBuffer": "Bankwise" + "SchedulerBuffer": "Bankwise", + "BlockingReadDelay": 80, + "BlockingWriteDelay": 100 }, "memspec": { "memarchitecturespec": { diff --git a/tests/tests_dramsys/example.txt b/tests/tests_dramsys/example.txt deleted file mode 100644 index e69de29b..00000000