Add LPDDR5 Partial Write Support

This commit is contained in:
2023-08-16 11:21:45 +02:00
parent 3f0372f1f7
commit b3937cf63a
3 changed files with 57 additions and 29 deletions

View File

@@ -248,10 +248,4 @@ TimeInterval MemSpecLPDDR5::getIntervalOnDataStrobe(Command command, const tlm_g
}
}
bool MemSpecLPDDR5::requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const
{
// assert(false); // TODO
return payload.get_byte_enable_ptr() != nullptr;
}
} // namespace DRAMSys

View File

@@ -120,8 +120,6 @@ 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 requiresMaskedWrite(const tlm::tlm_generic_payload& payload) const override;
private:
unsigned per2BankOffset;
};

View File

@@ -321,13 +321,35 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->tRL + memSpec->BL_n_min_16 + memSpec->tWCK2DQO + memSpec->tRPST - memSpec->tWL);
}
lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank];
if (lastCommandStart != scMaxTime)
{
if (command == Command::MWR || command == Command::MWRA)
{
if (lastBurstLengthByCommandAndBank[Command::WR][bank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + 2.5 * memSpec->BL_n_max_32);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + 4 * memSpec->BL_n_max_16);
}
}
lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup];
if (lastCommandStart != scMaxTime)
{
if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_32);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_16);
if (command == Command::WR || command == Command::WRA)
{
if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_32);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_16);
}
else if (command == Command::MWR || command == Command::MWRA)
{
if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_max_32);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_max_16);
}
}
lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank];
@@ -345,24 +367,36 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_S_16);
}
lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ?
lastScheduledByCommand[Command::WR] : scMaxTime;
lastCommandStart = lastScheduledByCommand[Command::WR];
if (lastCommandStart != scMaxTime)
{
// TODO: BG mode with BL32
if (lastBurstLengthByCommand[Command::WR] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32 + memSpec->tCK);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_16 + memSpec->tCK);
if (lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank])
{
// TODO: BG mode with BL32
if (lastBurstLengthByCommand[Command::WR] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32 + memSpec->tCK);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_16 + memSpec->tCK);
}
}
lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup];
if (lastCommandStart != scMaxTime)
{
if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_32);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_16);
if (command == Command::WR || command == Command::WRA)
{
if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_32);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_16);
}
else if (command == Command::MWR || command == Command::MWRA)
{
if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_max_32);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_max_16);
}
}
lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank];
@@ -380,14 +414,16 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_S_16);
}
lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ?
lastScheduledByCommand[Command::WRA] : scMaxTime;
lastCommandStart = lastScheduledByCommand[Command::WRA];
if (lastCommandStart != scMaxTime)
{
if (lastBurstLengthByCommand[Command::WRA] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32 + memSpec->tCK);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_16 + memSpec->tCK);
if (lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank])
{
if (lastBurstLengthByCommand[Command::WRA] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32 + memSpec->tCK);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_16 + memSpec->tCK);
}
}
}
else if (command == Command::ACT)