Add RequestBufferSizeRead and RequestBufferSizeWrite configurations for ReadWrite Buffer

This commit is contained in:
2023-11-14 11:00:28 +01:00
parent 1050019db6
commit 74a9155993
11 changed files with 34 additions and 11 deletions

View File

@@ -180,6 +180,8 @@ struct McConfig
std::optional<unsigned int> LowWatermark;
std::optional<SchedulerBufferType> SchedulerBuffer;
std::optional<unsigned int> RequestBufferSize;
std::optional<unsigned int> RequestBufferSizeRead;
std::optional<unsigned int> RequestBufferSizeWrite;
std::optional<CmdMuxType> CmdMux;
std::optional<RespQueueType> RespQueue;
std::optional<RefreshPolicyType> RefreshPolicy;
@@ -206,6 +208,8 @@ NLOHMANN_JSONIFY_ALL_THINGS(McConfig,
LowWatermark,
SchedulerBuffer,
RequestBufferSize,
RequestBufferSizeRead,
RequestBufferSizeWrite,
CmdMux,
RespQueue,
RefreshPolicy,

View File

@@ -282,6 +282,14 @@ void Configuration::loadMCConfig(const DRAMSys::Config::McConfig& mcConfig)
if (requestBufferSize == 0)
SC_REPORT_FATAL("Configuration", "Minimum request buffer size is 1!");
requestBufferSizeRead = mcConfig.RequestBufferSizeRead.value_or(requestBufferSizeRead);
if (requestBufferSizeRead == 0)
SC_REPORT_FATAL("Configuration", "Minimum request buffer size is 1!");
requestBufferSizeWrite = mcConfig.RequestBufferSizeWrite.value_or(requestBufferSizeWrite);
if (requestBufferSizeWrite == 0)
SC_REPORT_FATAL("Configuration", "Minimum request buffer size is 1!");
if (const auto& _arbitrationDelayFw = mcConfig.ArbitrationDelayFw)
{
arbitrationDelayFw =

View File

@@ -96,6 +96,8 @@ public:
Reorder
} arbiter = Arbiter::Simple;
unsigned int requestBufferSize = 8;
unsigned int requestBufferSizeRead = 8;
unsigned int requestBufferSizeWrite = 8;
enum class RefreshPolicy
{
NoRefresh,

View File

@@ -39,16 +39,18 @@ using namespace tlm;
namespace DRAMSys
{
BufferCounterReadWrite::BufferCounterReadWrite(unsigned requestBufferSize) :
requestBufferSize(requestBufferSize)
BufferCounterReadWrite::BufferCounterReadWrite(unsigned requestBufferSizeRead,
unsigned requestBufferSizeWrite) :
requestBufferSizeRead(requestBufferSizeRead),
requestBufferSizeWrite(requestBufferSizeWrite)
{
numReadWriteRequests = std::vector<unsigned>(2);
}
bool BufferCounterReadWrite::hasBufferSpace() const
{
return (numReadWriteRequests[0] < requestBufferSize &&
numReadWriteRequests[1] < requestBufferSize);
return (numReadWriteRequests[0] < requestBufferSizeRead &&
numReadWriteRequests[1] < requestBufferSizeWrite);
}
void BufferCounterReadWrite::storeRequest(const tlm_generic_payload& trans)

View File

@@ -46,7 +46,8 @@ namespace DRAMSys
class BufferCounterReadWrite final : public BufferCounterIF
{
public:
explicit BufferCounterReadWrite(unsigned requestBufferSize);
explicit BufferCounterReadWrite(unsigned requestBufferSizeRead,
unsigned requestBufferSizeWrite);
[[nodiscard]] bool hasBufferSpace() const override;
void storeRequest(const tlm::tlm_generic_payload& trans) override;
void removeRequest(const tlm::tlm_generic_payload& trans) override;
@@ -55,7 +56,8 @@ public:
[[nodiscard]] unsigned getNumWriteRequests() const override;
private:
const unsigned requestBufferSize;
const unsigned requestBufferSizeRead;
const unsigned requestBufferSizeWrite;
std::vector<unsigned> numReadWriteRequests;
};

View File

@@ -52,7 +52,7 @@ SchedulerFifo::SchedulerFifo(const Configuration& config)
bufferCounter = std::make_unique<BufferCounterBankwise>(config.requestBufferSize,
config.memSpec->banksPerChannel);
else if (config.schedulerBuffer == Configuration::SchedulerBuffer::ReadWrite)
bufferCounter = std::make_unique<BufferCounterReadWrite>(config.requestBufferSize);
bufferCounter = std::make_unique<BufferCounterReadWrite>(config.requestBufferSizeRead, config.requestBufferSizeWrite);
else if (config.schedulerBuffer == Configuration::SchedulerBuffer::Shared)
bufferCounter = std::make_unique<BufferCounterShared>(config.requestBufferSize);
}

View File

@@ -52,7 +52,7 @@ SchedulerFrFcfs::SchedulerFrFcfs(const Configuration& config)
bufferCounter = std::make_unique<BufferCounterBankwise>(config.requestBufferSize,
config.memSpec->banksPerChannel);
else if (config.schedulerBuffer == Configuration::SchedulerBuffer::ReadWrite)
bufferCounter = std::make_unique<BufferCounterReadWrite>(config.requestBufferSize);
bufferCounter = std::make_unique<BufferCounterReadWrite>(config.requestBufferSizeRead, config.requestBufferSizeWrite);
else if (config.schedulerBuffer == Configuration::SchedulerBuffer::Shared)
bufferCounter = std::make_unique<BufferCounterShared>(config.requestBufferSize);
}

View File

@@ -52,7 +52,8 @@ SchedulerFrFcfsGrp::SchedulerFrFcfsGrp(const Configuration& config)
bufferCounter = std::make_unique<BufferCounterBankwise>(config.requestBufferSize,
config.memSpec->banksPerChannel);
else if (config.schedulerBuffer == Configuration::SchedulerBuffer::ReadWrite)
bufferCounter = std::make_unique<BufferCounterReadWrite>(config.requestBufferSize);
bufferCounter = std::make_unique<BufferCounterReadWrite>(config.requestBufferSizeRead,
config.requestBufferSizeWrite);
else if (config.schedulerBuffer == Configuration::SchedulerBuffer::Shared)
bufferCounter = std::make_unique<BufferCounterShared>(config.requestBufferSize);
}

View File

@@ -54,7 +54,8 @@ SchedulerGrpFrFcfs::SchedulerGrpFrFcfs(const Configuration& config)
bufferCounter = std::make_unique<BufferCounterBankwise>(config.requestBufferSize,
config.memSpec->banksPerChannel);
else if (config.schedulerBuffer == Configuration::SchedulerBuffer::ReadWrite)
bufferCounter = std::make_unique<BufferCounterReadWrite>(config.requestBufferSize);
bufferCounter = std::make_unique<BufferCounterReadWrite>(config.requestBufferSizeRead,
config.requestBufferSizeWrite);
else if (config.schedulerBuffer == Configuration::SchedulerBuffer::Shared)
bufferCounter = std::make_unique<BufferCounterShared>(config.requestBufferSize);

View File

@@ -56,7 +56,8 @@ SchedulerGrpFrFcfsWm::SchedulerGrpFrFcfsWm(const Configuration& config) :
bufferCounter = std::make_unique<BufferCounterBankwise>(config.requestBufferSize,
config.memSpec->banksPerChannel);
else if (config.schedulerBuffer == Configuration::SchedulerBuffer::ReadWrite)
bufferCounter = std::make_unique<BufferCounterReadWrite>(config.requestBufferSize);
bufferCounter = std::make_unique<BufferCounterReadWrite>(config.requestBufferSizeRead,
config.requestBufferSizeWrite);
else if (config.schedulerBuffer == Configuration::SchedulerBuffer::Shared)
bufferCounter = std::make_unique<BufferCounterShared>(config.requestBufferSize);