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