|
|
|
|
@@ -104,6 +104,7 @@ CheckerDDR5::CheckerDDR5(const Configuration& config)
|
|
|
|
|
tRDWR_ddr = memSpec->tRL - memSpec->tWL + tBURST16 + memSpec->tRTRS
|
|
|
|
|
- memSpec->tRDDQS + memSpec->tRPST + memSpec->tWPRE;
|
|
|
|
|
tCCD_L_WTR_slr = memSpec->tWL + tBURST16 + memSpec->tWTR_L;
|
|
|
|
|
tCCD_M_WTR_slr = memSpec->tWL + tBURST16 + memSpec->tWTR_M; // tWTR_M is max(16nck, 10ns)
|
|
|
|
|
tCCD_S_WTR_slr = memSpec->tWL + tBURST16 + memSpec->tWTR_S;
|
|
|
|
|
tCCD_WTR_dlr = memSpec->tWL + tBURST16 + memSpec->tWTR_S;
|
|
|
|
|
tWRWR_dpr = std::max(memSpec->tCCD_WR_dpr, tBURST16 + memSpec->tRTRS);
|
|
|
|
|
@@ -140,10 +141,14 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
|
|
|
|
|
if (lastCommandStart != sc_max_time())
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD);
|
|
|
|
|
|
|
|
|
|
lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()];
|
|
|
|
|
lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()];
|
|
|
|
|
if (lastCommandStart != sc_max_time())
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_L_slr);
|
|
|
|
|
|
|
|
|
|
lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()];
|
|
|
|
|
if (lastCommandStart != sc_max_time())
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_M_slr);
|
|
|
|
|
|
|
|
|
|
lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RD][logicalRank.ID()];
|
|
|
|
|
if (lastCommandStart != sc_max_time())
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_S_slr);
|
|
|
|
|
@@ -176,10 +181,14 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()];
|
|
|
|
|
if (lastCommandStart != sc_max_time())
|
|
|
|
|
lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()];
|
|
|
|
|
if (lastCommandStart != SC_ZERO_TIME)
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_L_slr);
|
|
|
|
|
|
|
|
|
|
lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()];
|
|
|
|
|
if (lastCommandStart != SC_ZERO_TIME)
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_M_slr);
|
|
|
|
|
|
|
|
|
|
lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RDA][logicalRank.ID()];
|
|
|
|
|
if (lastCommandStart != sc_max_time())
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_S_slr);
|
|
|
|
|
@@ -224,13 +233,22 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()];
|
|
|
|
|
if (lastCommandStart != sc_max_time())
|
|
|
|
|
{
|
|
|
|
|
if (lastBurstLengthByCommandAndBank[Command::WR][bank.ID()] == 32)
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_WTR_slr + tBURST16);
|
|
|
|
|
else
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_WTR_slr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()];
|
|
|
|
|
if (lastCommandStart != sc_max_time())
|
|
|
|
|
{
|
|
|
|
|
if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup.ID()] == 32)
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_WTR_slr + tBURST16);
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_M_WTR_slr + tBURST16);
|
|
|
|
|
else
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_WTR_slr);
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_M_WTR_slr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WR][logicalRank.ID()];
|
|
|
|
|
@@ -270,13 +288,22 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()];
|
|
|
|
|
if (lastCommandStart != sc_max_time())
|
|
|
|
|
{
|
|
|
|
|
if (lastBurstLengthByCommandAndBank[Command::WRA][bank.ID()] == 32)
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_WTR_slr + tBURST16);
|
|
|
|
|
else
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_WTR_slr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()];
|
|
|
|
|
if (lastCommandStart != sc_max_time())
|
|
|
|
|
{
|
|
|
|
|
if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup.ID()] == 32)
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_WTR_slr + tBURST16);
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_M_WTR_slr + tBURST16);
|
|
|
|
|
else
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_WTR_slr);
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_M_WTR_slr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank.ID()];
|
|
|
|
|
@@ -419,10 +446,10 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()];
|
|
|
|
|
lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()];
|
|
|
|
|
if (lastCommandStart != sc_max_time())
|
|
|
|
|
{
|
|
|
|
|
if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup.ID()] == 32)
|
|
|
|
|
if (lastBurstLengthByCommandAndBank[Command::WR][bank.ID()] == 32)
|
|
|
|
|
{
|
|
|
|
|
if (burstLength == 16 && memSpec->bitWidth == 4) // second WR requires RMW
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST16 + memSpec->tCCD_L_WR_slr);
|
|
|
|
|
@@ -438,6 +465,19 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()];
|
|
|
|
|
if (lastCommandStart != sc_max_time())
|
|
|
|
|
{
|
|
|
|
|
if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup.ID()] == 32)
|
|
|
|
|
{
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST16 + memSpec->tCCD_M_WR_slr);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_M_WR_slr);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WR][logicalRank.ID()];
|
|
|
|
|
if (lastCommandStart != sc_max_time())
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_S_WR_slr);
|
|
|
|
|
@@ -470,20 +510,32 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()];
|
|
|
|
|
if (lastCommandStart != sc_max_time())
|
|
|
|
|
{
|
|
|
|
|
if (burstLength == 16 && memSpec->bitWidth == 4) // second WR requires RMW
|
|
|
|
|
{
|
|
|
|
|
if (lastBurstLengthByCommandAndBank[Command::WRA][bank.ID()] == 32)
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST16 + memSpec->tCCD_L_WR_slr);
|
|
|
|
|
else
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_L_WR_slr);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()];
|
|
|
|
|
if (lastCommandStart != sc_max_time())
|
|
|
|
|
{
|
|
|
|
|
if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup.ID()] == 32)
|
|
|
|
|
{
|
|
|
|
|
if (burstLength == 16 && memSpec->bitWidth == 4) // second WR requires RMW
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST16 + memSpec->tCCD_L_WR_slr);
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST16 + memSpec->tCCD_M_WR_slr);
|
|
|
|
|
else
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST16 + memSpec->tCCD_L_WR2_slr);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (burstLength == 16 && memSpec->bitWidth == 4) // second WR requires RMW
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_L_WR_slr);
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_M_WR_slr);
|
|
|
|
|
else
|
|
|
|
|
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_L_WR2_slr);
|
|
|
|
|
}
|
|
|
|
|
|