Implement Partial Write for DDR5
This commit is contained in:
@@ -133,7 +133,9 @@ MemSpecDDR5::MemSpecDDR5(const DRAMSys::Config::MemSpec &memSpec)
|
||||
commandLengthInCycles[Command::RD] = 2;
|
||||
commandLengthInCycles[Command::RDA] = 2;
|
||||
commandLengthInCycles[Command::WR] = 2;
|
||||
commandLengthInCycles[Command::MWR] = 2;
|
||||
commandLengthInCycles[Command::WRA] = 2;
|
||||
commandLengthInCycles[Command::MWRA] = 2;
|
||||
}
|
||||
else if (cmdMode == 2)
|
||||
{
|
||||
@@ -144,7 +146,9 @@ MemSpecDDR5::MemSpecDDR5(const DRAMSys::Config::MemSpec &memSpec)
|
||||
commandLengthInCycles[Command::RD] = 4;
|
||||
commandLengthInCycles[Command::RDA] = 4;
|
||||
commandLengthInCycles[Command::WR] = 4;
|
||||
commandLengthInCycles[Command::MWR] = 4;
|
||||
commandLengthInCycles[Command::WRA] = 4;
|
||||
commandLengthInCycles[Command::MWRA] = 4;
|
||||
commandLengthInCycles[Command::REFAB] = 2;
|
||||
commandLengthInCycles[Command::RFMAB] = 2;
|
||||
commandLengthInCycles[Command::REFSB] = 2;
|
||||
@@ -279,14 +283,12 @@ TimeInterval MemSpecDDR5::getIntervalOnDataStrobe(Command command, const tlm_gen
|
||||
}
|
||||
}
|
||||
|
||||
bool MemSpecDDR5::requiresReadModifyWrite(const tlm::tlm_generic_payload& payload) const
|
||||
bool MemSpecDDR5::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
|
||||
{
|
||||
// auto burstLength = ControllerExtension::getBurstLength(payload);
|
||||
auto burstLength = ControllerExtension::getBurstLength(payload);
|
||||
|
||||
// if (burstLength == 16 && bitWidth == 4)
|
||||
// return true;
|
||||
|
||||
// assert(false); // TODO
|
||||
if (burstLength == 16 && bitWidth == 4)
|
||||
return true;
|
||||
|
||||
return payload.get_byte_enable_ptr() != nullptr;
|
||||
}
|
||||
|
||||
@@ -129,7 +129,7 @@ public:
|
||||
sc_core::sc_time getExecutionTime(Command command, const tlm::tlm_generic_payload &payload) const override;
|
||||
TimeInterval getIntervalOnDataStrobe(Command command, const tlm::tlm_generic_payload &payload) const override;
|
||||
|
||||
bool requiresReadModifyWrite(const tlm::tlm_generic_payload& payload) const override;
|
||||
bool requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const override;
|
||||
};
|
||||
|
||||
} // namespace DRAMSys
|
||||
|
||||
@@ -441,7 +441,7 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
|
||||
}
|
||||
}
|
||||
|
||||
if (burstLength == 16 && memSpec->bitWidth == 4) // second WR requires RMW
|
||||
if (memSpec->requiresMaskedWrite(payload)) // second WR requires RMW
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank];
|
||||
if (lastCommandStart != scMaxTime)
|
||||
@@ -517,7 +517,7 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
|
||||
}
|
||||
}
|
||||
|
||||
if (burstLength == 16 && memSpec->bitWidth == 4) // second WR requires RMW
|
||||
if (memSpec->requiresMaskedWrite(payload)) // second WR requires RMW
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup];
|
||||
if (lastCommandStart != scMaxTime)
|
||||
|
||||
@@ -248,7 +248,7 @@ TimeInterval MemSpecLPDDR5::getIntervalOnDataStrobe(Command command, const tlm_g
|
||||
}
|
||||
}
|
||||
|
||||
bool MemSpecLPDDR5::requiresReadModifyWrite(const tlm::tlm_generic_payload& payload) const
|
||||
bool MemSpecLPDDR5::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
|
||||
{
|
||||
// assert(false); // TODO
|
||||
return payload.get_byte_enable_ptr() != nullptr;
|
||||
|
||||
@@ -120,7 +120,7 @@ public:
|
||||
sc_core::sc_time getExecutionTime(Command command, const tlm::tlm_generic_payload &payload) const override;
|
||||
TimeInterval getIntervalOnDataStrobe(Command command, const tlm::tlm_generic_payload &payload) const override;
|
||||
|
||||
bool requiresReadModifyWrite(const tlm::tlm_generic_payload& payload) const override;
|
||||
bool requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const override;
|
||||
|
||||
private:
|
||||
unsigned per2BankOffset;
|
||||
|
||||
@@ -148,7 +148,7 @@ bool MemSpec::hasRasAndCasBus() const
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MemSpec::requiresReadModifyWrite(const tlm::tlm_generic_payload& payload) const
|
||||
bool MemSpec::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
|
||||
{
|
||||
return payload.get_byte_enable_ptr() != nullptr;
|
||||
}
|
||||
|
||||
@@ -102,7 +102,7 @@ public:
|
||||
virtual sc_core::sc_time getExecutionTime(Command command, const tlm::tlm_generic_payload& payload) const = 0;
|
||||
virtual TimeInterval getIntervalOnDataStrobe(Command command, const tlm::tlm_generic_payload& payload) const = 0;
|
||||
|
||||
virtual bool requiresReadModifyWrite(const tlm::tlm_generic_payload& payload) const;
|
||||
virtual bool requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const;
|
||||
|
||||
sc_core::sc_time getCommandLength(Command) const;
|
||||
double getCommandLengthInCycles(Command) const;
|
||||
|
||||
@@ -70,11 +70,11 @@ void BankMachine::update(Command command)
|
||||
state = State::Precharged;
|
||||
keepTrans = false;
|
||||
break;
|
||||
case Command::RD: case Command::WR:
|
||||
case Command::RD: case Command::WR: case Command::MWR:
|
||||
currentPayload = nullptr;
|
||||
keepTrans = false;
|
||||
break;
|
||||
case Command::RDA: case Command::WRA:
|
||||
case Command::RDA: case Command::WRA: case Command::MWRA:
|
||||
state = State::Precharged;
|
||||
currentPayload = nullptr;
|
||||
keepTrans = false;
|
||||
@@ -201,7 +201,7 @@ void BankMachineOpen::evaluate()
|
||||
nextCommand = Command::RD;
|
||||
else
|
||||
{
|
||||
nextCommand = memSpec.requiresReadModifyWrite(*currentPayload) ? Command::MWR : Command::WR;
|
||||
nextCommand = memSpec.requiresMaskedWrite(*currentPayload) ? Command::MWR : Command::WR;
|
||||
}
|
||||
}
|
||||
else // row miss
|
||||
@@ -247,7 +247,7 @@ void BankMachineClosed::evaluate()
|
||||
nextCommand = Command::RDA;
|
||||
else
|
||||
{
|
||||
nextCommand = memSpec.requiresReadModifyWrite(*currentPayload) ? Command::MWRA : Command::WRA;
|
||||
nextCommand = memSpec.requiresMaskedWrite(*currentPayload) ? Command::MWRA : Command::WRA;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -295,7 +295,7 @@ void BankMachineOpenAdaptive::evaluate()
|
||||
nextCommand = Command::RDA;
|
||||
else
|
||||
{
|
||||
nextCommand = memSpec.requiresReadModifyWrite(*currentPayload) ? Command::MWRA : Command::WRA;
|
||||
nextCommand = memSpec.requiresMaskedWrite(*currentPayload) ? Command::MWRA : Command::WRA;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -305,7 +305,7 @@ void BankMachineOpenAdaptive::evaluate()
|
||||
nextCommand = Command::RD;
|
||||
else
|
||||
{
|
||||
nextCommand = memSpec.requiresReadModifyWrite(*currentPayload) ? Command::MWR : Command::WR;
|
||||
nextCommand = memSpec.requiresMaskedWrite(*currentPayload) ? Command::MWR : Command::WR;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -357,7 +357,7 @@ void BankMachineClosedAdaptive::evaluate()
|
||||
nextCommand = Command::RD;
|
||||
else
|
||||
{
|
||||
nextCommand = memSpec.requiresReadModifyWrite(*currentPayload) ? Command::MWR : Command::WR;
|
||||
nextCommand = memSpec.requiresMaskedWrite(*currentPayload) ? Command::MWR : Command::WR;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -367,7 +367,7 @@ void BankMachineClosedAdaptive::evaluate()
|
||||
nextCommand = Command::RDA;
|
||||
else
|
||||
{
|
||||
nextCommand = memSpec.requiresReadModifyWrite(*currentPayload) ? Command::MWRA : Command::WRA;
|
||||
nextCommand = memSpec.requiresMaskedWrite(*currentPayload) ? Command::MWRA : Command::WRA;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -181,7 +181,7 @@ void RefreshManagerAllBank::update(Command command)
|
||||
case Command::ACT:
|
||||
activatedBanks++;
|
||||
break;
|
||||
case Command::PREPB: case Command::RDA: case Command::WRA:
|
||||
case Command::PREPB: case Command::RDA: case Command::WRA: case Command::MWRA:
|
||||
activatedBanks--;
|
||||
break;
|
||||
case Command::PREAB:
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user