Merge branch 'fix/buffer_entries' into 'develop'

Fix/buffer entries

Closes #64

See merge request ems/astdm/modeling.dram/dram.sys.5!86
This commit is contained in:
Lukas Steiner
2024-11-29 10:34:09 +00:00
19 changed files with 29 additions and 31 deletions

View File

@@ -542,10 +542,8 @@ void Controller::manageRequests(const sc_time& delay)
{ {
if (transToAcquire.payload != nullptr && transToAcquire.arrival <= sc_time_stamp()) 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 unsigned requiredBufferEntries = transToAcquire.payload->get_data_length() / memSpec.maxBytesPerBurst;
// transaction if (scheduler->hasBufferSpace(requiredBufferEntries))
// but for a maximum size transaction
if (scheduler->hasBufferSpace())
{ {
if (totalNumberOfPayloads == 0) if (totalNumberOfPayloads == 0)
idleTimeCollector.end(); idleTimeCollector.end();

View File

@@ -47,9 +47,9 @@ BufferCounterBankwise::BufferCounterBankwise(unsigned requestBufferSize, unsigne
numRequestsOnBank = std::vector<unsigned>(numberOfBanks, 0); numRequestsOnBank = std::vector<unsigned>(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) void BufferCounterBankwise::storeRequest(const tlm_generic_payload& trans)

View File

@@ -47,7 +47,7 @@ class BufferCounterBankwise final : public BufferCounterIF
{ {
public: public:
BufferCounterBankwise(unsigned requestBufferSize, unsigned numberOfBanks); 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 storeRequest(const tlm::tlm_generic_payload& trans) override;
void removeRequest(const tlm::tlm_generic_payload& trans) override; void removeRequest(const tlm::tlm_generic_payload& trans) override;
[[nodiscard]] const std::vector<unsigned>& getBufferDepth() const override; [[nodiscard]] const std::vector<unsigned>& getBufferDepth() const override;

View File

@@ -53,7 +53,7 @@ public:
BufferCounterIF() = default; BufferCounterIF() = default;
virtual ~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 storeRequest(const tlm::tlm_generic_payload& trans) = 0;
virtual void removeRequest(const tlm::tlm_generic_payload& trans) = 0; virtual void removeRequest(const tlm::tlm_generic_payload& trans) = 0;
[[nodiscard]] virtual const std::vector<unsigned>& getBufferDepth() const = 0; [[nodiscard]] virtual const std::vector<unsigned>& getBufferDepth() const = 0;

View File

@@ -47,10 +47,10 @@ BufferCounterReadWrite::BufferCounterReadWrite(unsigned requestBufferSizeRead,
numReadWriteRequests = std::vector<unsigned>(2); numReadWriteRequests = std::vector<unsigned>(2);
} }
bool BufferCounterReadWrite::hasBufferSpace() const bool BufferCounterReadWrite::hasBufferSpace(unsigned entries) const
{ {
return (numReadWriteRequests[0] < requestBufferSizeRead && return (numReadWriteRequests[0] + entries <= requestBufferSizeRead &&
numReadWriteRequests[1] < requestBufferSizeWrite); numReadWriteRequests[1] + entries <= requestBufferSizeWrite);
} }
void BufferCounterReadWrite::storeRequest(const tlm_generic_payload& trans) void BufferCounterReadWrite::storeRequest(const tlm_generic_payload& trans)

View File

@@ -48,7 +48,7 @@ class BufferCounterReadWrite final : public BufferCounterIF
public: public:
explicit BufferCounterReadWrite(unsigned requestBufferSizeRead, explicit BufferCounterReadWrite(unsigned requestBufferSizeRead,
unsigned requestBufferSizeWrite); unsigned requestBufferSizeWrite);
[[nodiscard]] bool hasBufferSpace() const override; [[nodiscard]] bool hasBufferSpace(unsigned entries) const override;
void storeRequest(const tlm::tlm_generic_payload& trans) override; void storeRequest(const tlm::tlm_generic_payload& trans) override;
void removeRequest(const tlm::tlm_generic_payload& trans) override; void removeRequest(const tlm::tlm_generic_payload& trans) override;
[[nodiscard]] const std::vector<unsigned>& getBufferDepth() const override; [[nodiscard]] const std::vector<unsigned>& getBufferDepth() const override;

View File

@@ -45,9 +45,9 @@ BufferCounterShared::BufferCounterShared(unsigned requestBufferSize) :
numRequests = std::vector<unsigned>(1); numRequests = std::vector<unsigned>(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) void BufferCounterShared::storeRequest(const tlm_generic_payload& trans)

View File

@@ -47,7 +47,7 @@ class BufferCounterShared final : public BufferCounterIF
{ {
public: public:
explicit BufferCounterShared(unsigned requestBufferSize); 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 storeRequest(const tlm::tlm_generic_payload& trans) override;
void removeRequest(const tlm::tlm_generic_payload& trans) override; void removeRequest(const tlm::tlm_generic_payload& trans) override;
[[nodiscard]] const std::vector<unsigned>& getBufferDepth() const override; [[nodiscard]] const std::vector<unsigned>& getBufferDepth() const override;

View File

@@ -57,9 +57,9 @@ SchedulerFifo::SchedulerFifo(const McConfig& config, const MemSpec& memSpec)
bufferCounter = std::make_unique<BufferCounterShared>(config.requestBufferSize); bufferCounter = std::make_unique<BufferCounterShared>(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) void SchedulerFifo::storeRequest(tlm_generic_payload& payload)

View File

@@ -53,7 +53,7 @@ class SchedulerFifo final : public SchedulerIF
{ {
public: public:
explicit SchedulerFifo(const McConfig& config, const MemSpec& memSpec); 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 storeRequest(tlm::tlm_generic_payload& payload) override;
void removeRequest(tlm::tlm_generic_payload& payload) override; void removeRequest(tlm::tlm_generic_payload& payload) override;
[[nodiscard]] tlm::tlm_generic_payload* [[nodiscard]] tlm::tlm_generic_payload*

View File

@@ -57,9 +57,9 @@ SchedulerFrFcfs::SchedulerFrFcfs(const McConfig& config, const MemSpec& memSpec)
bufferCounter = std::make_unique<BufferCounterShared>(config.requestBufferSize); bufferCounter = std::make_unique<BufferCounterShared>(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) void SchedulerFrFcfs::storeRequest(tlm_generic_payload& payload)

View File

@@ -53,7 +53,7 @@ class SchedulerFrFcfs final : public SchedulerIF
{ {
public: public:
explicit SchedulerFrFcfs(const McConfig& config, const MemSpec& memSpec); 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 storeRequest(tlm::tlm_generic_payload& payload) override;
void removeRequest(tlm::tlm_generic_payload& payload) override; void removeRequest(tlm::tlm_generic_payload& payload) override;
[[nodiscard]] tlm::tlm_generic_payload* [[nodiscard]] tlm::tlm_generic_payload*

View File

@@ -57,9 +57,9 @@ SchedulerFrFcfsGrp::SchedulerFrFcfsGrp(const McConfig& config, const MemSpec& me
bufferCounter = std::make_unique<BufferCounterShared>(config.requestBufferSize); bufferCounter = std::make_unique<BufferCounterShared>(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) void SchedulerFrFcfsGrp::storeRequest(tlm_generic_payload& trans)

View File

@@ -52,7 +52,7 @@ class SchedulerFrFcfsGrp final : public SchedulerIF
{ {
public: public:
explicit SchedulerFrFcfsGrp(const McConfig& config, const MemSpec& memSpec); 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 storeRequest(tlm::tlm_generic_payload& payload) override;
void removeRequest(tlm::tlm_generic_payload& payload) override; void removeRequest(tlm::tlm_generic_payload& payload) override;
[[nodiscard]] tlm::tlm_generic_payload* [[nodiscard]] tlm::tlm_generic_payload*

View File

@@ -60,9 +60,9 @@ SchedulerGrpFrFcfs::SchedulerGrpFrFcfs(const McConfig& config, const MemSpec& me
SC_REPORT_WARNING("SchedulerGrpFrFcfs", "Hazard detection not yet implemented!"); 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) void SchedulerGrpFrFcfs::storeRequest(tlm_generic_payload& payload)

View File

@@ -52,7 +52,7 @@ class SchedulerGrpFrFcfs final : public SchedulerIF
{ {
public: public:
explicit SchedulerGrpFrFcfs(const McConfig& config, const MemSpec& memSpec); 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 storeRequest(tlm::tlm_generic_payload& payload) override;
void removeRequest(tlm::tlm_generic_payload& payload) override; void removeRequest(tlm::tlm_generic_payload& payload) override;
[[nodiscard]] tlm::tlm_generic_payload* [[nodiscard]] tlm::tlm_generic_payload*

View File

@@ -67,9 +67,9 @@ SchedulerGrpFrFcfsWm::SchedulerGrpFrFcfsWm(const McConfig& config, const MemSpec
SC_REPORT_WARNING("SchedulerGrpFrFcfsWm", "Hazard detection not yet implemented!"); 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) void SchedulerGrpFrFcfsWm::storeRequest(tlm_generic_payload& payload)

View File

@@ -52,7 +52,7 @@ class SchedulerGrpFrFcfsWm final : public SchedulerIF
{ {
public: public:
explicit SchedulerGrpFrFcfsWm(const McConfig& config, const MemSpec& memSpec); 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 storeRequest(tlm::tlm_generic_payload& payload) override;
void removeRequest(tlm::tlm_generic_payload& payload) override; void removeRequest(tlm::tlm_generic_payload& payload) override;
[[nodiscard]] tlm::tlm_generic_payload* [[nodiscard]] tlm::tlm_generic_payload*

View File

@@ -57,7 +57,7 @@ public:
SchedulerIF() = default; SchedulerIF() = default;
virtual ~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 storeRequest(tlm::tlm_generic_payload& payload) = 0;
virtual void removeRequest(tlm::tlm_generic_payload& payload) = 0; virtual void removeRequest(tlm::tlm_generic_payload& payload) = 0;
[[nodiscard]] virtual tlm::tlm_generic_payload* [[nodiscard]] virtual tlm::tlm_generic_payload*