From 18c00fc363ee2f7550fe1399a5d6967c0ad2de8e Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Fri, 15 Nov 2024 14:17:03 +0100 Subject: [PATCH] Pass a number of required buffer entries to hasBufferSpace() --- src/libdramsys/DRAMSys/controller/Controller.cpp | 6 ++---- .../DRAMSys/controller/scheduler/BufferCounterBankwise.cpp | 4 ++-- .../DRAMSys/controller/scheduler/BufferCounterBankwise.h | 2 +- .../DRAMSys/controller/scheduler/BufferCounterIF.h | 2 +- .../DRAMSys/controller/scheduler/BufferCounterReadWrite.cpp | 6 +++--- .../DRAMSys/controller/scheduler/BufferCounterReadWrite.h | 2 +- .../DRAMSys/controller/scheduler/BufferCounterShared.cpp | 4 ++-- .../DRAMSys/controller/scheduler/BufferCounterShared.h | 2 +- .../DRAMSys/controller/scheduler/SchedulerFifo.cpp | 4 ++-- src/libdramsys/DRAMSys/controller/scheduler/SchedulerFifo.h | 2 +- .../DRAMSys/controller/scheduler/SchedulerFrFcfs.cpp | 4 ++-- .../DRAMSys/controller/scheduler/SchedulerFrFcfs.h | 2 +- .../DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.cpp | 4 ++-- .../DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.h | 2 +- .../DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.cpp | 4 ++-- .../DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.h | 2 +- .../DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.cpp | 4 ++-- .../DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.h | 2 +- src/libdramsys/DRAMSys/controller/scheduler/SchedulerIF.h | 2 +- 19 files changed, 29 insertions(+), 31 deletions(-) diff --git a/src/libdramsys/DRAMSys/controller/Controller.cpp b/src/libdramsys/DRAMSys/controller/Controller.cpp index 99aa20cf..10f5b6f7 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.cpp +++ b/src/libdramsys/DRAMSys/controller/Controller.cpp @@ -538,10 +538,8 @@ void Controller::manageRequests(const sc_time& delay) { if (transToAcquire.payload != nullptr && transToAcquire.arrival <= sc_time_stamp()) { - // TODO: here we assume that the scheduler always has space not only for a single burst - // transaction - // but for a maximum size transaction - if (scheduler->hasBufferSpace()) + unsigned requiredBufferEntries = transToAcquire.payload->get_data_length() / memSpec.maxBytesPerBurst; + if (scheduler->hasBufferSpace(requiredBufferEntries)) { if (totalNumberOfPayloads == 0) idleTimeCollector.end(); diff --git a/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterBankwise.cpp b/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterBankwise.cpp index a807e11e..ccac74e3 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterBankwise.cpp +++ b/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterBankwise.cpp @@ -47,9 +47,9 @@ BufferCounterBankwise::BufferCounterBankwise(unsigned requestBufferSize, unsigne numRequestsOnBank = std::vector(numberOfBanks, 0); } -bool BufferCounterBankwise::hasBufferSpace() const +bool BufferCounterBankwise::hasBufferSpace(unsigned entries) const { - return (numRequestsOnBank[lastBankID] < requestBufferSize); + return (numRequestsOnBank[lastBankID] + entries <= requestBufferSize); } void BufferCounterBankwise::storeRequest(const tlm_generic_payload& trans) diff --git a/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterBankwise.h b/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterBankwise.h index 63d23329..e5ea4d3d 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterBankwise.h +++ b/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterBankwise.h @@ -47,7 +47,7 @@ class BufferCounterBankwise final : public BufferCounterIF { public: BufferCounterBankwise(unsigned requestBufferSize, unsigned numberOfBanks); - [[nodiscard]] bool hasBufferSpace() const override; + [[nodiscard]] bool hasBufferSpace(unsigned entries) const override; void storeRequest(const tlm::tlm_generic_payload& trans) override; void removeRequest(const tlm::tlm_generic_payload& trans) override; [[nodiscard]] const std::vector& getBufferDepth() const override; diff --git a/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterIF.h b/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterIF.h index c028822f..c6cd912f 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterIF.h +++ b/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterIF.h @@ -53,7 +53,7 @@ public: BufferCounterIF() = default; virtual ~BufferCounterIF() = default; - [[nodiscard]] virtual bool hasBufferSpace() const = 0; + [[nodiscard]] virtual bool hasBufferSpace(unsigned entries) const = 0; virtual void storeRequest(const tlm::tlm_generic_payload& trans) = 0; virtual void removeRequest(const tlm::tlm_generic_payload& trans) = 0; [[nodiscard]] virtual const std::vector& getBufferDepth() const = 0; diff --git a/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterReadWrite.cpp b/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterReadWrite.cpp index d4a609d7..39e9f874 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterReadWrite.cpp +++ b/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterReadWrite.cpp @@ -47,10 +47,10 @@ BufferCounterReadWrite::BufferCounterReadWrite(unsigned requestBufferSizeRead, numReadWriteRequests = std::vector(2); } -bool BufferCounterReadWrite::hasBufferSpace() const +bool BufferCounterReadWrite::hasBufferSpace(unsigned entries) const { - return (numReadWriteRequests[0] < requestBufferSizeRead && - numReadWriteRequests[1] < requestBufferSizeWrite); + return (numReadWriteRequests[0] + entries <= requestBufferSizeRead && + numReadWriteRequests[1] + entries <= 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 a70dd9de..f121475a 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterReadWrite.h +++ b/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterReadWrite.h @@ -48,7 +48,7 @@ class BufferCounterReadWrite final : public BufferCounterIF public: explicit BufferCounterReadWrite(unsigned requestBufferSizeRead, unsigned requestBufferSizeWrite); - [[nodiscard]] bool hasBufferSpace() const override; + [[nodiscard]] bool hasBufferSpace(unsigned entries) const override; void storeRequest(const tlm::tlm_generic_payload& trans) override; void removeRequest(const tlm::tlm_generic_payload& trans) override; [[nodiscard]] const std::vector& getBufferDepth() const override; diff --git a/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterShared.cpp b/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterShared.cpp index d2d4c937..659cf5c7 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterShared.cpp +++ b/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterShared.cpp @@ -45,9 +45,9 @@ BufferCounterShared::BufferCounterShared(unsigned requestBufferSize) : numRequests = std::vector(1); } -bool BufferCounterShared::hasBufferSpace() const +bool BufferCounterShared::hasBufferSpace(unsigned entries) const { - return (numRequests[0] < requestBufferSize); + return (numRequests[0] + entries <= requestBufferSize); } void BufferCounterShared::storeRequest(const tlm_generic_payload& trans) diff --git a/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterShared.h b/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterShared.h index b5b6f090..9b5f57ee 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterShared.h +++ b/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterShared.h @@ -47,7 +47,7 @@ class BufferCounterShared final : public BufferCounterIF { public: explicit BufferCounterShared(unsigned requestBufferSize); - [[nodiscard]] bool hasBufferSpace() const override; + [[nodiscard]] bool hasBufferSpace(unsigned entries) const override; void storeRequest(const tlm::tlm_generic_payload& trans) override; void removeRequest(const tlm::tlm_generic_payload& trans) override; [[nodiscard]] const std::vector& getBufferDepth() const override; diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFifo.cpp b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFifo.cpp index b118ee58..f403e074 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFifo.cpp +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFifo.cpp @@ -57,9 +57,9 @@ SchedulerFifo::SchedulerFifo(const McConfig& config, const MemSpec& memSpec) bufferCounter = std::make_unique(config.requestBufferSize); } -bool SchedulerFifo::hasBufferSpace() const +bool SchedulerFifo::hasBufferSpace(unsigned entries) const { - return bufferCounter->hasBufferSpace(); + return bufferCounter->hasBufferSpace(entries); } void SchedulerFifo::storeRequest(tlm_generic_payload& payload) diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFifo.h b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFifo.h index 4dbe87ff..0909cb8e 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFifo.h +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFifo.h @@ -53,7 +53,7 @@ class SchedulerFifo final : public SchedulerIF { public: explicit SchedulerFifo(const McConfig& config, const MemSpec& memSpec); - [[nodiscard]] bool hasBufferSpace() const override; + [[nodiscard]] bool hasBufferSpace(unsigned entries) const override; void storeRequest(tlm::tlm_generic_payload& payload) override; void removeRequest(tlm::tlm_generic_payload& payload) override; [[nodiscard]] tlm::tlm_generic_payload* diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfs.cpp b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfs.cpp index eda8a955..2d296968 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfs.cpp +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfs.cpp @@ -57,9 +57,9 @@ SchedulerFrFcfs::SchedulerFrFcfs(const McConfig& config, const MemSpec& memSpec) bufferCounter = std::make_unique(config.requestBufferSize); } -bool SchedulerFrFcfs::hasBufferSpace() const +bool SchedulerFrFcfs::hasBufferSpace(unsigned entries) const { - return bufferCounter->hasBufferSpace(); + return bufferCounter->hasBufferSpace(entries); } void SchedulerFrFcfs::storeRequest(tlm_generic_payload& payload) diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfs.h b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfs.h index 21418adb..e262340b 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfs.h +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfs.h @@ -53,7 +53,7 @@ class SchedulerFrFcfs final : public SchedulerIF { public: explicit SchedulerFrFcfs(const McConfig& config, const MemSpec& memSpec); - [[nodiscard]] bool hasBufferSpace() const override; + [[nodiscard]] bool hasBufferSpace(unsigned entries) const override; void storeRequest(tlm::tlm_generic_payload& payload) override; void removeRequest(tlm::tlm_generic_payload& payload) override; [[nodiscard]] tlm::tlm_generic_payload* diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.cpp b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.cpp index 0f7e00fd..f408cfa5 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.cpp +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.cpp @@ -57,9 +57,9 @@ SchedulerFrFcfsGrp::SchedulerFrFcfsGrp(const McConfig& config, const MemSpec& me bufferCounter = std::make_unique(config.requestBufferSize); } -bool SchedulerFrFcfsGrp::hasBufferSpace() const +bool SchedulerFrFcfsGrp::hasBufferSpace(unsigned entries) const { - return bufferCounter->hasBufferSpace(); + return bufferCounter->hasBufferSpace(entries); } void SchedulerFrFcfsGrp::storeRequest(tlm_generic_payload& trans) diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.h b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.h index ac1e2ea9..042a0b12 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.h +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.h @@ -52,7 +52,7 @@ class SchedulerFrFcfsGrp final : public SchedulerIF { public: explicit SchedulerFrFcfsGrp(const McConfig& config, const MemSpec& memSpec); - [[nodiscard]] bool hasBufferSpace() const override; + [[nodiscard]] bool hasBufferSpace(unsigned entries) const override; void storeRequest(tlm::tlm_generic_payload& payload) override; void removeRequest(tlm::tlm_generic_payload& payload) override; [[nodiscard]] tlm::tlm_generic_payload* diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.cpp b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.cpp index e86eb072..36872402 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.cpp +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.cpp @@ -60,9 +60,9 @@ SchedulerGrpFrFcfs::SchedulerGrpFrFcfs(const McConfig& config, const MemSpec& me SC_REPORT_WARNING("SchedulerGrpFrFcfs", "Hazard detection not yet implemented!"); } -bool SchedulerGrpFrFcfs::hasBufferSpace() const +bool SchedulerGrpFrFcfs::hasBufferSpace(unsigned entries) const { - return bufferCounter->hasBufferSpace(); + return bufferCounter->hasBufferSpace(entries); } void SchedulerGrpFrFcfs::storeRequest(tlm_generic_payload& payload) diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.h b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.h index fe955b58..9d6c4384 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.h +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.h @@ -52,7 +52,7 @@ class SchedulerGrpFrFcfs final : public SchedulerIF { public: explicit SchedulerGrpFrFcfs(const McConfig& config, const MemSpec& memSpec); - [[nodiscard]] bool hasBufferSpace() const override; + [[nodiscard]] bool hasBufferSpace(unsigned entries) const override; void storeRequest(tlm::tlm_generic_payload& payload) override; void removeRequest(tlm::tlm_generic_payload& payload) override; [[nodiscard]] tlm::tlm_generic_payload* diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.cpp b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.cpp index 0e9f5b7a..e1e14fba 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.cpp +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.cpp @@ -67,9 +67,9 @@ SchedulerGrpFrFcfsWm::SchedulerGrpFrFcfsWm(const McConfig& config, const MemSpec SC_REPORT_WARNING("SchedulerGrpFrFcfsWm", "Hazard detection not yet implemented!"); } -bool SchedulerGrpFrFcfsWm::hasBufferSpace() const +bool SchedulerGrpFrFcfsWm::hasBufferSpace(unsigned entries) const { - return bufferCounter->hasBufferSpace(); + return bufferCounter->hasBufferSpace(entries); } void SchedulerGrpFrFcfsWm::storeRequest(tlm_generic_payload& payload) diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.h b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.h index 85ce52a3..b5f56c1e 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.h +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.h @@ -52,7 +52,7 @@ class SchedulerGrpFrFcfsWm final : public SchedulerIF { public: explicit SchedulerGrpFrFcfsWm(const McConfig& config, const MemSpec& memSpec); - [[nodiscard]] bool hasBufferSpace() const override; + [[nodiscard]] bool hasBufferSpace(unsigned entries) const override; void storeRequest(tlm::tlm_generic_payload& payload) override; void removeRequest(tlm::tlm_generic_payload& payload) override; [[nodiscard]] tlm::tlm_generic_payload* diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerIF.h b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerIF.h index 207b03c5..26e52852 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerIF.h +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerIF.h @@ -57,7 +57,7 @@ public: SchedulerIF() = default; virtual ~SchedulerIF() = default; - [[nodiscard]] virtual bool hasBufferSpace() const = 0; + [[nodiscard]] virtual bool hasBufferSpace(unsigned entries) const = 0; virtual void storeRequest(tlm::tlm_generic_payload& payload) = 0; virtual void removeRequest(tlm::tlm_generic_payload& payload) = 0; [[nodiscard]] virtual tlm::tlm_generic_payload*