Pass a number of required buffer entries to hasBufferSpace()

This commit is contained in:
2024-11-15 14:17:03 +01:00
parent ba0d0165e8
commit 18c00fc363
19 changed files with 29 additions and 31 deletions

View File

@@ -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();

View File

@@ -47,9 +47,9 @@ BufferCounterBankwise::BufferCounterBankwise(unsigned requestBufferSize, unsigne
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)

View File

@@ -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<unsigned>& getBufferDepth() const override;

View File

@@ -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<unsigned>& getBufferDepth() const = 0;

View File

@@ -47,10 +47,10 @@ BufferCounterReadWrite::BufferCounterReadWrite(unsigned requestBufferSizeRead,
numReadWriteRequests = std::vector<unsigned>(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)

View File

@@ -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<unsigned>& getBufferDepth() const override;

View File

@@ -45,9 +45,9 @@ BufferCounterShared::BufferCounterShared(unsigned requestBufferSize) :
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)

View File

@@ -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<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);
}
bool SchedulerFifo::hasBufferSpace() const
bool SchedulerFifo::hasBufferSpace(unsigned entries) const
{
return bufferCounter->hasBufferSpace();
return bufferCounter->hasBufferSpace(entries);
}
void SchedulerFifo::storeRequest(tlm_generic_payload& payload)

View File

@@ -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*

View File

@@ -57,9 +57,9 @@ SchedulerFrFcfs::SchedulerFrFcfs(const McConfig& config, const MemSpec& memSpec)
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)

View File

@@ -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*

View File

@@ -57,9 +57,9 @@ SchedulerFrFcfsGrp::SchedulerFrFcfsGrp(const McConfig& config, const MemSpec& me
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)

View File

@@ -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*

View File

@@ -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)

View File

@@ -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*

View File

@@ -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)

View File

@@ -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*

View File

@@ -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*