From 74a91559931d837dbb27882ea8af4d2abc824ac3 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Tue, 14 Nov 2023 11:00:28 +0100 Subject: [PATCH] Add RequestBufferSizeRead and RequestBufferSizeWrite configurations for ReadWrite Buffer --- src/configuration/DRAMSys/config/McConfig.h | 4 ++++ src/libdramsys/DRAMSys/configuration/Configuration.cpp | 8 ++++++++ src/libdramsys/DRAMSys/configuration/Configuration.h | 2 ++ .../controller/scheduler/BufferCounterReadWrite.cpp | 10 ++++++---- .../controller/scheduler/BufferCounterReadWrite.h | 6 ++++-- .../DRAMSys/controller/scheduler/SchedulerFifo.cpp | 2 +- .../DRAMSys/controller/scheduler/SchedulerFrFcfs.cpp | 2 +- .../controller/scheduler/SchedulerFrFcfsGrp.cpp | 3 ++- .../controller/scheduler/SchedulerGrpFrFcfs.cpp | 3 ++- .../controller/scheduler/SchedulerGrpFrFcfsWm.cpp | 3 ++- tests/tests_configuration/test_configuration.cpp | 2 ++ 11 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/configuration/DRAMSys/config/McConfig.h b/src/configuration/DRAMSys/config/McConfig.h index 2c536db6..0f55af7c 100644 --- a/src/configuration/DRAMSys/config/McConfig.h +++ b/src/configuration/DRAMSys/config/McConfig.h @@ -180,6 +180,8 @@ struct McConfig std::optional LowWatermark; std::optional SchedulerBuffer; std::optional RequestBufferSize; + std::optional RequestBufferSizeRead; + std::optional RequestBufferSizeWrite; std::optional CmdMux; std::optional RespQueue; std::optional RefreshPolicy; @@ -206,6 +208,8 @@ NLOHMANN_JSONIFY_ALL_THINGS(McConfig, LowWatermark, SchedulerBuffer, RequestBufferSize, + RequestBufferSizeRead, + RequestBufferSizeWrite, CmdMux, RespQueue, RefreshPolicy, diff --git a/src/libdramsys/DRAMSys/configuration/Configuration.cpp b/src/libdramsys/DRAMSys/configuration/Configuration.cpp index ce98efc9..8fd9ef2d 100644 --- a/src/libdramsys/DRAMSys/configuration/Configuration.cpp +++ b/src/libdramsys/DRAMSys/configuration/Configuration.cpp @@ -282,6 +282,14 @@ void Configuration::loadMCConfig(const DRAMSys::Config::McConfig& mcConfig) if (requestBufferSize == 0) SC_REPORT_FATAL("Configuration", "Minimum request buffer size is 1!"); + requestBufferSizeRead = mcConfig.RequestBufferSizeRead.value_or(requestBufferSizeRead); + if (requestBufferSizeRead == 0) + SC_REPORT_FATAL("Configuration", "Minimum request buffer size is 1!"); + + requestBufferSizeWrite = mcConfig.RequestBufferSizeWrite.value_or(requestBufferSizeWrite); + if (requestBufferSizeWrite == 0) + SC_REPORT_FATAL("Configuration", "Minimum request buffer size is 1!"); + if (const auto& _arbitrationDelayFw = mcConfig.ArbitrationDelayFw) { arbitrationDelayFw = diff --git a/src/libdramsys/DRAMSys/configuration/Configuration.h b/src/libdramsys/DRAMSys/configuration/Configuration.h index db9c85ee..930c78c5 100644 --- a/src/libdramsys/DRAMSys/configuration/Configuration.h +++ b/src/libdramsys/DRAMSys/configuration/Configuration.h @@ -96,6 +96,8 @@ public: Reorder } arbiter = Arbiter::Simple; unsigned int requestBufferSize = 8; + unsigned int requestBufferSizeRead = 8; + unsigned int requestBufferSizeWrite = 8; enum class RefreshPolicy { NoRefresh, diff --git a/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterReadWrite.cpp b/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterReadWrite.cpp index 4cb212f5..d4a609d7 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterReadWrite.cpp +++ b/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterReadWrite.cpp @@ -39,16 +39,18 @@ using namespace tlm; namespace DRAMSys { -BufferCounterReadWrite::BufferCounterReadWrite(unsigned requestBufferSize) : - requestBufferSize(requestBufferSize) +BufferCounterReadWrite::BufferCounterReadWrite(unsigned requestBufferSizeRead, + unsigned requestBufferSizeWrite) : + requestBufferSizeRead(requestBufferSizeRead), + requestBufferSizeWrite(requestBufferSizeWrite) { numReadWriteRequests = std::vector(2); } bool BufferCounterReadWrite::hasBufferSpace() const { - return (numReadWriteRequests[0] < requestBufferSize && - numReadWriteRequests[1] < requestBufferSize); + return (numReadWriteRequests[0] < requestBufferSizeRead && + numReadWriteRequests[1] < requestBufferSizeWrite); } void BufferCounterReadWrite::storeRequest(const tlm_generic_payload& trans) diff --git a/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterReadWrite.h b/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterReadWrite.h index 8202acef..a70dd9de 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterReadWrite.h +++ b/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterReadWrite.h @@ -46,7 +46,8 @@ namespace DRAMSys class BufferCounterReadWrite final : public BufferCounterIF { public: - explicit BufferCounterReadWrite(unsigned requestBufferSize); + explicit BufferCounterReadWrite(unsigned requestBufferSizeRead, + unsigned requestBufferSizeWrite); [[nodiscard]] bool hasBufferSpace() const override; void storeRequest(const tlm::tlm_generic_payload& trans) override; void removeRequest(const tlm::tlm_generic_payload& trans) override; @@ -55,7 +56,8 @@ public: [[nodiscard]] unsigned getNumWriteRequests() const override; private: - const unsigned requestBufferSize; + const unsigned requestBufferSizeRead; + const unsigned requestBufferSizeWrite; std::vector numReadWriteRequests; }; diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFifo.cpp b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFifo.cpp index 5f15f14c..0c3181c3 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFifo.cpp +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFifo.cpp @@ -52,7 +52,7 @@ SchedulerFifo::SchedulerFifo(const Configuration& config) bufferCounter = std::make_unique(config.requestBufferSize, config.memSpec->banksPerChannel); else if (config.schedulerBuffer == Configuration::SchedulerBuffer::ReadWrite) - bufferCounter = std::make_unique(config.requestBufferSize); + bufferCounter = std::make_unique(config.requestBufferSizeRead, config.requestBufferSizeWrite); else if (config.schedulerBuffer == Configuration::SchedulerBuffer::Shared) bufferCounter = std::make_unique(config.requestBufferSize); } diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfs.cpp b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfs.cpp index 27dc0785..267b9e8d 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfs.cpp +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfs.cpp @@ -52,7 +52,7 @@ SchedulerFrFcfs::SchedulerFrFcfs(const Configuration& config) bufferCounter = std::make_unique(config.requestBufferSize, config.memSpec->banksPerChannel); else if (config.schedulerBuffer == Configuration::SchedulerBuffer::ReadWrite) - bufferCounter = std::make_unique(config.requestBufferSize); + bufferCounter = std::make_unique(config.requestBufferSizeRead, config.requestBufferSizeWrite); else if (config.schedulerBuffer == Configuration::SchedulerBuffer::Shared) bufferCounter = std::make_unique(config.requestBufferSize); } diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.cpp b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.cpp index a120c662..582e4e25 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.cpp +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.cpp @@ -52,7 +52,8 @@ SchedulerFrFcfsGrp::SchedulerFrFcfsGrp(const Configuration& config) bufferCounter = std::make_unique(config.requestBufferSize, config.memSpec->banksPerChannel); else if (config.schedulerBuffer == Configuration::SchedulerBuffer::ReadWrite) - bufferCounter = std::make_unique(config.requestBufferSize); + bufferCounter = std::make_unique(config.requestBufferSizeRead, + config.requestBufferSizeWrite); else if (config.schedulerBuffer == Configuration::SchedulerBuffer::Shared) bufferCounter = std::make_unique(config.requestBufferSize); } diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.cpp b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.cpp index e9ca8915..1f61b38a 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.cpp +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.cpp @@ -54,7 +54,8 @@ SchedulerGrpFrFcfs::SchedulerGrpFrFcfs(const Configuration& config) bufferCounter = std::make_unique(config.requestBufferSize, config.memSpec->banksPerChannel); else if (config.schedulerBuffer == Configuration::SchedulerBuffer::ReadWrite) - bufferCounter = std::make_unique(config.requestBufferSize); + bufferCounter = std::make_unique(config.requestBufferSizeRead, + config.requestBufferSizeWrite); else if (config.schedulerBuffer == Configuration::SchedulerBuffer::Shared) bufferCounter = std::make_unique(config.requestBufferSize); diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.cpp b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.cpp index 6e2a5a2e..7068c78e 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.cpp +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.cpp @@ -56,7 +56,8 @@ SchedulerGrpFrFcfsWm::SchedulerGrpFrFcfsWm(const Configuration& config) : bufferCounter = std::make_unique(config.requestBufferSize, config.memSpec->banksPerChannel); else if (config.schedulerBuffer == Configuration::SchedulerBuffer::ReadWrite) - bufferCounter = std::make_unique(config.requestBufferSize); + bufferCounter = std::make_unique(config.requestBufferSizeRead, + config.requestBufferSizeWrite); else if (config.schedulerBuffer == Configuration::SchedulerBuffer::Shared) bufferCounter = std::make_unique(config.requestBufferSize); diff --git a/tests/tests_configuration/test_configuration.cpp b/tests/tests_configuration/test_configuration.cpp index 4bb9be08..5620704a 100644 --- a/tests/tests_configuration/test_configuration.cpp +++ b/tests/tests_configuration/test_configuration.cpp @@ -79,6 +79,8 @@ protected: 0, SchedulerBufferType::Bankwise, 8, + std::nullopt, + std::nullopt, CmdMuxType::Oldest, RespQueueType::Fifo, RefreshPolicyType::AllBank,