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:
@@ -542,10 +542,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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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*
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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*
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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*
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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*
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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*
|
||||
|
||||
@@ -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*
|
||||
|
||||
Reference in New Issue
Block a user