diff --git a/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.cpp b/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.cpp index 32b49f73..6092a53e 100644 --- a/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.cpp +++ b/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.cpp @@ -50,40 +50,43 @@ CheckerDDR5::CheckerDDR5(const Configuration& config) if (memSpec == nullptr) SC_REPORT_FATAL("CheckerDDR5", "Wrong MemSpec chosen"); - lastScheduledByCommandAndDimmRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->dimmRanksPerChannel, scMaxTime)); - lastScheduledByCommandAndPhysicalRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->physicalRanksPerChannel, scMaxTime)); - lastScheduledByCommandAndLogicalRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->logicalRanksPerChannel, scMaxTime)); - lastScheduledByCommandAndBankGroup = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->bankGroupsPerChannel, scMaxTime)); - lastScheduledByCommandAndBank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndDimmRank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->dimmRanksPerChannel, scMaxTime)); + lastScheduledByCommandAndPhysicalRank = std::vector> + (Command::numberOfCommands(), + ControllerVector(memSpec->physicalRanksPerChannel, scMaxTime)); + lastScheduledByCommandAndLogicalRank = std::vector> + (Command::numberOfCommands(), + ControllerVector(memSpec->logicalRanksPerChannel, scMaxTime)); + lastScheduledByCommandAndBankGroup = std::vector> + (Command::numberOfCommands(), + ControllerVector(memSpec->bankGroupsPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); // Required for Same Bank Refresh - lastScheduledByCommandAndBankInGroup = std::vector>(Command::numberOfCommands(), - std::vector(memSpec->ranksPerChannel * memSpec->banksPerGroup, scMaxTime)); + lastScheduledByCommandAndBankInGroup = std::vector>(Command::numberOfCommands(), + ControllerVector(memSpec->ranksPerChannel * memSpec->banksPerGroup, scMaxTime)); lastCommandOnBus = scMaxTime; dummyCommandOnBus.start = scMaxTime; dummyCommandOnBus.end = scMaxTime; - last4ActivatesLogical = std::vector>(memSpec->logicalRanksPerChannel); - last4ActivatesPhysical = std::vector>(memSpec->physicalRanksPerChannel); + last4ActivatesLogical = ControllerVector>(memSpec->logicalRanksPerChannel); + last4ActivatesPhysical = ControllerVector>(memSpec->physicalRanksPerChannel); - lastBurstLengthByCommandAndDimmRank = std::vector> - (Command::WRA + 1, std::vector(memSpec->dimmRanksPerChannel)); - lastBurstLengthByCommandAndPhysicalRank = std::vector> - (Command::WRA + 1, std::vector(memSpec->physicalRanksPerChannel)); - lastBurstLengthByCommandAndLogicalRank = std::vector> - (Command::WRA + 1, std::vector(memSpec->logicalRanksPerChannel)); - lastBurstLengthByCommandAndBankGroup = std::vector> - (Command::WRA + 1, std::vector(memSpec->bankGroupsPerChannel)); - lastBurstLengthByCommandAndBank = std::vector> - (Command::WRA + 1, std::vector(memSpec->banksPerChannel)); + lastBurstLengthByCommandAndDimmRank = std::vector> + (Command::WRA + 1, ControllerVector(memSpec->dimmRanksPerChannel)); + lastBurstLengthByCommandAndPhysicalRank = std::vector> + (Command::WRA + 1, ControllerVector(memSpec->physicalRanksPerChannel)); + lastBurstLengthByCommandAndLogicalRank = std::vector> + (Command::WRA + 1, ControllerVector(memSpec->logicalRanksPerChannel)); + lastBurstLengthByCommandAndBankGroup = std::vector> + (Command::WRA + 1, ControllerVector(memSpec->bankGroupsPerChannel)); + lastBurstLengthByCommandAndBank = std::vector> + (Command::WRA + 1, ControllerVector(memSpec->banksPerChannel)); lastBurstLengthByCommand = std::vector(Command::WRA + 1); - lastBurstLengthByCommandAndBankInGroup = std::vector> - (Command::WRA + 1, std::vector(memSpec->ranksPerChannel * memSpec->banksPerGroup)); + lastBurstLengthByCommandAndBankInGroup = std::vector> + (Command::WRA + 1, ControllerVector(memSpec->ranksPerChannel * memSpec->banksPerGroup)); cmdLengthDiff = memSpec->cmdMode * memSpec->tCK; @@ -123,9 +126,9 @@ CheckerDDR5::CheckerDDR5(const Configuration& config) sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic_payload& payload) const { - Rank logicalRank = ControllerExtension::getRank(payload); - Rank physicalRank = Rank(logicalRank.ID() / memSpec->logicalRanksPerPhysicalRank); - Rank dimmRank = Rank(physicalRank.ID() / memSpec->physicalRanksPerDimmRank); + LogicalRank logicalRank(ControllerExtension::getRank(payload).ID()); + PhysicalRank physicalRank(logicalRank.ID() / memSpec->logicalRanksPerPhysicalRank); + DimmRank dimmRank(physicalRank.ID() / memSpec->physicalRanksPerDimmRank); BankGroup bankGroup = ControllerExtension::getBankGroup(payload); Bank bank = ControllerExtension::getBank(payload); Bank bankInGroup = Bank(logicalRank.ID() * memSpec->banksPerGroup + bank.ID() % memSpec->banksPerGroup); @@ -140,37 +143,37 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic assert(!(burstLength == 32) || (memSpec->bitWidth == 4)); assert(burstLength <= memSpec->maxBurstLength); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_L_slr); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_M_slr); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RD][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RD][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_S_slr); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndPhysicalRank[Command::RD][physicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndPhysicalRank[Command::RD][physicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST32); earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_dlr); } lastCommandStart = lastScheduledByCommand[Command::RD]; - if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank.ID()]) // different physical rank + if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank]) // different physical rank { - if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RD][dimmRank.ID()]) // same DIMM + if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RD][dimmRank]) // same DIMM { - if (lastBurstLengthByCommandAndDimmRank[Command::RD][dimmRank.ID()] == 32) + if (lastBurstLengthByCommandAndDimmRank[Command::RD][dimmRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDRD_dpr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDRD_dpr); @@ -184,29 +187,29 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_M_slr); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RDA][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RDA][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_S_slr); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndPhysicalRank[Command::RDA][physicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndPhysicalRank[Command::RDA][physicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST32); earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_dlr); } lastCommandStart = lastScheduledByCommand[Command::RDA]; - if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank.ID()]) // different physical rank + if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank]) // different physical rank { - if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RDA][dimmRank.ID()]) // same DIMM + if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RDA][dimmRank]) // same DIMM { - if (lastBurstLengthByCommandAndDimmRank[Command::RDA][dimmRank.ID()] == 32) + if (lastBurstLengthByCommandAndDimmRank[Command::RDA][dimmRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDRD_dpr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDRD_dpr); @@ -222,58 +225,58 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic if (command == Command::RDA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::WR][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::WR][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDA + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDA); } } - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::WR][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::WR][bank] == 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()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_M_WTR_slr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_M_WTR_slr); } - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WR][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WR][logicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndLogicalRank[Command::WR][logicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndLogicalRank[Command::WR][logicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_WTR_slr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_WTR_slr); } - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndPhysicalRank[Command::WR][physicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndPhysicalRank[Command::WR][physicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_WTR_dlr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_WTR_dlr); } lastCommandStart = lastScheduledByCommand[Command::WR]; - if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank.ID()]) // different physical rank + if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank]) // different physical rank { - if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WR][dimmRank.ID()]) // same DIMM + if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WR][dimmRank]) // same DIMM { - if (lastBurstLengthByCommandAndDimmRank[Command::WR][dimmRank.ID()] == 32) + if (lastBurstLengthByCommandAndDimmRank[Command::WR][dimmRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_dpr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_dpr); @@ -287,39 +290,39 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_M_WTR_slr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_M_WTR_slr); } - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndLogicalRank[Command::WRA][logicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndLogicalRank[Command::WRA][logicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_WTR_slr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_WTR_slr); } - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndPhysicalRank[Command::WRA][physicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndPhysicalRank[Command::WRA][physicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_WTR_dlr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_WTR_dlr); } lastCommandStart = lastScheduledByCommand[Command::WRA]; - if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank.ID()]) // different physical rank + if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank]) // different physical rank { - if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WRA][dimmRank.ID()]) // same DIMM + if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WRA][dimmRank]) // same DIMM { - if (lastBurstLengthByCommandAndDimmRank[Command::WRA][dimmRank.ID()] == 32) + if (lastBurstLengthByCommandAndDimmRank[Command::WRA][dimmRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_dpr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_dpr); @@ -340,43 +343,43 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic assert(!(burstLength == 32) || (memSpec->bitWidth == 4)); assert(burstLength <= memSpec->maxBurstLength); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::RD][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::RD][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_RTW_slr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_RTW_slr); } - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RD][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RD][logicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndLogicalRank[Command::RD][logicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndLogicalRank[Command::RD][logicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_RTW_slr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_RTW_slr); } - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndPhysicalRank[Command::RD][physicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndPhysicalRank[Command::RD][physicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_RTW_dlr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_RTW_dlr); } lastCommandStart = lastScheduledByCommand[Command::RD]; - if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank.ID()]) // different physical rank + if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank]) // different physical rank { - if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RD][dimmRank.ID()]) // same DIMM + if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RD][dimmRank]) // same DIMM { - if (lastBurstLengthByCommandAndDimmRank[Command::RD][dimmRank.ID()] == 32) + if (lastBurstLengthByCommandAndDimmRank[Command::RD][dimmRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_dpr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_dpr); @@ -390,39 +393,39 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::RDA][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::RDA][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_RTW_slr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_RTW_slr); } - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RDA][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RDA][logicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndLogicalRank[Command::RDA][logicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndLogicalRank[Command::RDA][logicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_RTW_slr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_RTW_slr); } - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndPhysicalRank[Command::RDA][physicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndPhysicalRank[Command::RDA][physicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_RTW_dlr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_RTW_dlr); } lastCommandStart = lastScheduledByCommand[Command::RDA]; - if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank.ID()]) // different physical rank + if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank]) // different physical rank { - if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RDA][dimmRank.ID()]) // same DIMM + if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RDA][dimmRank]) // same DIMM { - if (lastBurstLengthByCommandAndDimmRank[Command::RDA][dimmRank.ID()] == 32) + if (lastBurstLengthByCommandAndDimmRank[Command::RDA][dimmRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_dpr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_dpr); @@ -438,10 +441,10 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic if (burstLength == 16 && memSpec->bitWidth == 4) // second WR requires RMW { - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::WR][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::WR][bank] == 32) { earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST16 + memSpec->tCCD_L_WR_slr); } @@ -451,10 +454,10 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; - if (lastCommandStart != lastScheduledByCommandAndBank[Command::WR][bank.ID()]) // different bank + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; + if (lastCommandStart != lastScheduledByCommandAndBank[Command::WR][bank]) // different bank { - if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup] == 32) { earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST16 + memSpec->tCCD_M_WR_slr); } @@ -466,10 +469,10 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } else // no RMW { - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup] == 32) { earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST16 + memSpec->tCCD_L_WR2_slr); } @@ -480,25 +483,25 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } } - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WR][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WR][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_S_WR_slr); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndPhysicalRank[Command::WR][physicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndPhysicalRank[Command::WR][physicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST32); earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_WR_dlr); } lastCommandStart = lastScheduledByCommand[Command::WR]; - if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank.ID()]) // different physical rank + if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank]) // different physical rank { - if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WR][dimmRank.ID()]) // same DIMM + if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WR][dimmRank]) // same DIMM { - if (lastBurstLengthByCommandAndDimmRank[Command::WR][dimmRank.ID()] == 32) + if (lastBurstLengthByCommandAndDimmRank[Command::WR][dimmRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRWR_dpr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRWR_dpr); @@ -514,10 +517,10 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic if (burstLength == 16 && memSpec->bitWidth == 4) // second WR requires RMW { - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup] == 32) { earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST16 + memSpec->tCCD_M_WR_slr); } @@ -529,10 +532,10 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } else // no RMW { - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup] == 32) { earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST16 + memSpec->tCCD_L_WR2_slr); } @@ -543,25 +546,25 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } } - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_S_WR_slr); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndPhysicalRank[Command::WRA][physicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndPhysicalRank[Command::WRA][physicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST32); earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_WR_dlr); } lastCommandStart = lastScheduledByCommand[Command::WRA]; - if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank.ID()]) // different physical rank + if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank]) // different physical rank { - if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WRA][dimmRank.ID()]) // same DIMM + if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WRA][dimmRank]) // same DIMM { - if (lastBurstLengthByCommandAndDimmRank[Command::WRA][dimmRank.ID()] == 32) + if (lastBurstLengthByCommandAndDimmRank[Command::WRA][dimmRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRWR_dpr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRWR_dpr); @@ -577,159 +580,159 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD_L_slr); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD_S_slr); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::ACT][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::ACT][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD_dlr); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDAACT); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::WRA][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::WRA][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAACT + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAACT); } - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREAB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREAB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PRESB][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PRESB][bankInGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr - cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMAB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMAB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr - cmdLengthDiff); // TODO: No tRFC_dlr and tRFC_dpr between REFAB and ACT? - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::REFSB][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::REFSB][bankInGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCsb_slr - cmdLengthDiff); // TODO: No tRFCsb_dlr between REFSB and ACT? - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFSB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFSB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFSBRD_slr - cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFSB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFSB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFSBRD_dlr - cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RFMSB][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RFMSB][bankInGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCsb_slr - cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMSB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMSB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFSBRD_slr - cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMSB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMSB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFSBRD_dlr - cmdLengthDiff); - if (last4ActivatesLogical[logicalRank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesLogical[logicalRank.ID()].front() + if (last4ActivatesLogical[logicalRank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesLogical[logicalRank].front() + memSpec->tFAW_slr - memSpec->longCmdOffset); - if (last4ActivatesPhysical[physicalRank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesPhysical[physicalRank.ID()].front() + if (last4ActivatesPhysical[physicalRank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesPhysical[physicalRank].front() + memSpec->tFAW_dlr - memSpec->longCmdOffset); } else if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::WR][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::WR][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + tBURST16 + cmdLengthDiff); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + cmdLengthDiff); } - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREAB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREAB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PRESB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PRESB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RD][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RD][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RDA][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RDA][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WR][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WR][logicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndLogicalRank[Command::WR][logicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndLogicalRank[Command::WR][logicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + tBURST16 + cmdLengthDiff); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + cmdLengthDiff); } - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndLogicalRank[Command::WRA][logicalRank.ID()]) + if (lastBurstLengthByCommandAndLogicalRank[Command::WRA][logicalRank]) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + tBURST16 + cmdLengthDiff); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + cmdLengthDiff); } - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREAB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREAB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); @@ -737,94 +740,94 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::PRESB) { - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::ACT][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::ACT][bankInGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RD][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RD][bankInGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RDA][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RDA][bankInGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::WR][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::WR][bankInGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankInGroup[Command::WR][bankInGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankInGroup[Command::WR][bankInGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + tBURST16 + cmdLengthDiff); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + cmdLengthDiff); } - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::WRA][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::WRA][bankInGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankInGroup[Command::WRA][bankInGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankInGroup[Command::WRA][bankInGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + tBURST16 + cmdLengthDiff); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + cmdLengthDiff); } - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); // PREA tRP - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PRESB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PRESB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); } else if (command == Command::REFAB || command == Command::RFMAB) { - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDAACT + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndLogicalRank[Command::WRA][logicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndLogicalRank[Command::WRA][logicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + tBURST16 + memSpec->tRP + cmdLengthDiff); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP + cmdLengthDiff); } - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREPB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREPB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREAB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREAB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFAB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFAB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dlr); - lastCommandStart = lastScheduledByCommandAndDimmRank[Command::REFAB][dimmRank.ID()]; + lastCommandStart = lastScheduledByCommandAndDimmRank[Command::REFAB][dimmRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dpr); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMAB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMAB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMAB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMAB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dlr); - lastCommandStart = lastScheduledByCommandAndDimmRank[Command::RFMAB][dimmRank.ID()]; + lastCommandStart = lastScheduledByCommandAndDimmRank[Command::RFMAB][dimmRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dpr); @@ -833,87 +836,87 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::REFSB || command == Command::RFMSB) { - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::ACT][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::ACT][bankInGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD_L_slr + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RDA][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RDA][bankInGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDAACT + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::WRA][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::WRA][bankInGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankInGroup[Command::WRA][bankInGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankInGroup[Command::WRA][bankInGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAACT + tBURST16 + cmdLengthDiff); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAACT + cmdLengthDiff); } - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PREPB][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PREPB][bankInGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); // PREA tRP - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PRESB][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PRESB][bankInGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr); // TODO: check this - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFAB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFAB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dlr); // TODO: check this - lastCommandStart = lastScheduledByCommandAndDimmRank[Command::REFAB][dimmRank.ID()]; + lastCommandStart = lastScheduledByCommandAndDimmRank[Command::REFAB][dimmRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dpr); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMAB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMAB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr); // TODO: check this - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMAB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMAB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dlr); // TODO: check this - lastCommandStart = lastScheduledByCommandAndDimmRank[Command::RFMAB][dimmRank.ID()]; + lastCommandStart = lastScheduledByCommandAndDimmRank[Command::RFMAB][dimmRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dpr); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFSB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFSB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCsb_slr); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFSB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFSB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCsb_dlr); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMSB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMSB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCsb_slr); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMSB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMSB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCsb_dlr); - if (last4ActivatesLogical[logicalRank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesLogical[logicalRank.ID()].front() + if (last4ActivatesLogical[logicalRank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesLogical[logicalRank].front() + memSpec->tFAW_slr - memSpec->shortCmdOffset); - if (last4ActivatesPhysical[physicalRank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesPhysical[physicalRank.ID()].front() + if (last4ActivatesPhysical[physicalRank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesPhysical[physicalRank].front() + memSpec->tFAW_dlr - memSpec->shortCmdOffset); } else @@ -935,9 +938,9 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic void CheckerDDR5::insert(Command command, const tlm_generic_payload& payload) { - Rank logicalRank = ControllerExtension::getRank(payload); - Rank physicalRank = Rank(logicalRank.ID() / memSpec->logicalRanksPerPhysicalRank); - Rank dimmRank = Rank(physicalRank.ID() / memSpec->physicalRanksPerDimmRank); + LogicalRank logicalRank(ControllerExtension::getRank(payload).ID()); + PhysicalRank physicalRank(logicalRank.ID() / memSpec->logicalRanksPerPhysicalRank); + DimmRank dimmRank(physicalRank.ID() / memSpec->physicalRanksPerDimmRank); BankGroup bankGroup = ControllerExtension::getBankGroup(payload); Bank bank = ControllerExtension::getBank(payload); Bank bankInGroup = Bank(logicalRank.ID() * memSpec->banksPerGroup + bank.ID() % memSpec->banksPerGroup); @@ -946,23 +949,23 @@ void CheckerDDR5::insert(Command command, const tlm_generic_payload& payload) PRINTDEBUGMESSAGE("CheckerDDR5", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndDimmRank[command][dimmRank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndPhysicalRank[command][physicalRank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndLogicalRank[command][logicalRank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndBankGroup[command][bankGroup.ID()] = sc_time_stamp(); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndDimmRank[command][dimmRank] = sc_time_stamp(); + lastScheduledByCommandAndPhysicalRank[command][physicalRank] = sc_time_stamp(); + lastScheduledByCommandAndLogicalRank[command][logicalRank] = sc_time_stamp(); + lastScheduledByCommandAndBankGroup[command][bankGroup] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); - lastScheduledByCommandAndBankInGroup[command][bankInGroup.ID()] = sc_time_stamp(); + lastScheduledByCommandAndBankInGroup[command][bankInGroup] = sc_time_stamp(); if (command.isCasCommand()) { - lastBurstLengthByCommandAndDimmRank[command][dimmRank.ID()] = burstLength; - lastBurstLengthByCommandAndPhysicalRank[command ][physicalRank.ID()] = burstLength; - lastBurstLengthByCommandAndLogicalRank[command][logicalRank.ID()] = burstLength; - lastBurstLengthByCommandAndBankGroup[command][bankGroup.ID()] = burstLength; - lastBurstLengthByCommandAndBank[command][bank.ID()] = burstLength; + lastBurstLengthByCommandAndDimmRank[command][dimmRank] = burstLength; + lastBurstLengthByCommandAndPhysicalRank[command ][physicalRank] = burstLength; + lastBurstLengthByCommandAndLogicalRank[command][logicalRank] = burstLength; + lastBurstLengthByCommandAndBankGroup[command][bankGroup] = burstLength; + lastBurstLengthByCommandAndBank[command][bank] = burstLength; lastBurstLengthByCommand[command] = burstLength; - lastBurstLengthByCommandAndBankInGroup[command][bankInGroup.ID()] = burstLength; + lastBurstLengthByCommandAndBankInGroup[command][bankInGroup] = burstLength; if (burstLength == 32) { @@ -975,13 +978,13 @@ void CheckerDDR5::insert(Command command, const tlm_generic_payload& payload) if (command == Command::ACT || command == Command::REFSB || command == Command::RFMSB) { - if (last4ActivatesLogical[logicalRank.ID()].size() == 4) - last4ActivatesLogical[logicalRank.ID()].pop(); - last4ActivatesLogical[logicalRank.ID()].push(lastCommandOnBus); + if (last4ActivatesLogical[logicalRank].size() == 4) + last4ActivatesLogical[logicalRank].pop(); + last4ActivatesLogical[logicalRank].push(lastCommandOnBus); - if (last4ActivatesPhysical[physicalRank.ID()].size() == 4) - last4ActivatesPhysical[physicalRank.ID()].pop(); - last4ActivatesPhysical[physicalRank.ID()].push(lastCommandOnBus); + if (last4ActivatesPhysical[physicalRank].size() == 4) + last4ActivatesPhysical[physicalRank].pop(); + last4ActivatesPhysical[physicalRank].push(lastCommandOnBus); } } diff --git a/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.h b/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.h index 96ca9291..db0c3144 100644 --- a/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.h +++ b/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.h @@ -57,28 +57,28 @@ public: private: const MemSpecDDR5 *memSpec; - std::vector> lastScheduledByCommandAndDimmRank; - std::vector> lastScheduledByCommandAndPhysicalRank; - std::vector> lastScheduledByCommandAndLogicalRank; - std::vector> lastScheduledByCommandAndBankGroup; - std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndDimmRank; + std::vector> lastScheduledByCommandAndPhysicalRank; + std::vector> lastScheduledByCommandAndLogicalRank; + std::vector> lastScheduledByCommandAndBankGroup; + std::vector> lastScheduledByCommandAndBank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnBus; TimeInterval dummyCommandOnBus; - std::vector> lastScheduledByCommandAndBankInGroup; + std::vector> lastScheduledByCommandAndBankInGroup; - std::vector> last4ActivatesPhysical; - std::vector> last4ActivatesLogical; + ControllerVector> last4ActivatesPhysical; + ControllerVector> last4ActivatesLogical; - std::vector> lastBurstLengthByCommandAndDimmRank; - std::vector> lastBurstLengthByCommandAndPhysicalRank; - std::vector> lastBurstLengthByCommandAndLogicalRank; - std::vector> lastBurstLengthByCommandAndBankGroup; - std::vector> lastBurstLengthByCommandAndBank; + std::vector> lastBurstLengthByCommandAndDimmRank; + std::vector> lastBurstLengthByCommandAndPhysicalRank; + std::vector> lastBurstLengthByCommandAndLogicalRank; + std::vector> lastBurstLengthByCommandAndBankGroup; + std::vector> lastBurstLengthByCommandAndBank; std::vector lastBurstLengthByCommand; - std::vector> lastBurstLengthByCommandAndBankInGroup; + std::vector> lastBurstLengthByCommandAndBankInGroup; // TODO: store BL of last RD and WR globally or for each hierarchy? diff --git a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp index 8327953f..c4d578cf 100644 --- a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp +++ b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp @@ -50,18 +50,18 @@ CheckerHBM3::CheckerHBM3(const Configuration &config) if (memSpec == nullptr) SC_REPORT_FATAL("CheckerHBM3", "Wrong MemSpec chosen"); - lastScheduledByCommandAndBank = std::vector>( - Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); - lastScheduledByCommandAndBankGroup = std::vector>( - Command::numberOfCommands(), std::vector(memSpec->bankGroupsPerChannel, scMaxTime)); - lastScheduledByCommandAndRank = std::vector>( - Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector>( + Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndBankGroup = std::vector>( + Command::numberOfCommands(), ControllerVector(memSpec->bankGroupsPerChannel, scMaxTime)); + lastScheduledByCommandAndRank = std::vector>( + Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnRasBus = scMaxTime; lastCommandOnCasBus = scMaxTime; - last4Activates = std::vector>(memSpec->ranksPerChannel); + last4Activates = ControllerVector>(memSpec->ranksPerChannel); - bankwiseRefreshCounter = std::vector(memSpec->ranksPerChannel); + bankwiseRefreshCounter = ControllerVector(memSpec->ranksPerChannel); tRDPDE = memSpec->tRL + memSpec->tPL + 2 * memSpec->tCK; tRDSRE = memSpec->tRL + memSpec->tPL + 3 * memSpec->tCK; @@ -83,27 +83,27 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); @@ -111,43 +111,43 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::RD) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDRD + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); @@ -155,35 +155,35 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::WR) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDWR + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); @@ -191,48 +191,48 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::RDA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDRD + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + 2 * memSpec->tCK + std::max(memSpec->tWR - memSpec->tRTP, memSpec->tWTRL)); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); @@ -240,35 +240,35 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::WRA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDWR + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); @@ -276,124 +276,124 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::REFPB][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::REFPB][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RFMPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RFMPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS - memSpec->tCK); - if (last4Activates[rank.ID()].size() >= 4) + if (last4Activates[rank].size() >= 4) earliestTimeToStart = - std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::REFAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); @@ -401,39 +401,39 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); @@ -441,120 +441,120 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::REFPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndBank[Command::RFMPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RFMPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) { - if (bankwiseRefreshCounter[rank.ID()] == 0) + if (bankwiseRefreshCounter[rank] == 0) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); } - if (last4Activates[rank.ID()].size() >= 4) + if (last4Activates[rank].size() >= 4) earliestTimeToStart = - std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::SREFEN) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(memSpec->tRTP + memSpec->tRP, tRDSRE)); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); @@ -562,23 +562,23 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::RFMAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); @@ -586,39 +586,39 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::RFMAB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndBank[Command::RFMPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RFMPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); @@ -626,23 +626,23 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::PDEA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); @@ -650,23 +650,23 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::PDEP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); @@ -674,7 +674,7 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::PDXP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); @@ -682,7 +682,7 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::PDXA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); @@ -690,7 +690,7 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::SREFEX) { - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKESR); @@ -717,9 +717,9 @@ void CheckerHBM3::insert(Command command, const tlm_generic_payload &payload) PRINTDEBUGMESSAGE("CheckerHBM3", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndBankGroup[command][bankGroup.ID()] = sc_time_stamp(); - lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); + lastScheduledByCommandAndBankGroup[command][bankGroup] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); if (command.isCasCommand()) @@ -731,13 +731,13 @@ void CheckerHBM3::insert(Command command, const tlm_generic_payload &payload) if (command == Command::ACT || command == Command::REFPB) { - if (last4Activates[rank.ID()].size() == 4) - last4Activates[rank.ID()].pop(); - last4Activates[rank.ID()].push(lastCommandOnRasBus); + if (last4Activates[rank].size() == 4) + last4Activates[rank].pop(); + last4Activates[rank].push(lastCommandOnRasBus); } if (command == Command::REFPB) - bankwiseRefreshCounter[rank.ID()] = (bankwiseRefreshCounter[rank.ID()] + 1) % memSpec->banksPerRank; + bankwiseRefreshCounter[rank] = (bankwiseRefreshCounter[rank] + 1) % memSpec->banksPerRank; } bool CheckerHBM3::isFullCycle(const sc_core::sc_time& time) const diff --git a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.h b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.h index 679b2aa5..979418a9 100644 --- a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.h +++ b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.h @@ -60,17 +60,17 @@ private: const MemSpecHBM3 *memSpec; - std::vector> lastScheduledByCommandAndBank; - std::vector> lastScheduledByCommandAndBankGroup; - std::vector> lastScheduledByCommandAndRank; + std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndBankGroup; + std::vector> lastScheduledByCommandAndRank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnRasBus; sc_core::sc_time lastCommandOnCasBus; // Four activate window - std::vector> last4Activates; - std::vector bankwiseRefreshCounter; + ControllerVector> last4Activates; + ControllerVector bankwiseRefreshCounter; const sc_core::sc_time scMaxTime = sc_core::sc_max_time(); sc_core::sc_time tRDPDE; diff --git a/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp b/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp index 81246e92..fa6a59ac 100644 --- a/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp +++ b/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp @@ -51,23 +51,24 @@ CheckerLPDDR5::CheckerLPDDR5(const Configuration& config) SC_REPORT_FATAL("CheckerLPDDR5", "Wrong MemSpec chosen"); else { - lastScheduledByCommandAndRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime)); - lastScheduledByCommandAndBankGroup = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->bankGroupsPerChannel, scMaxTime)); - lastScheduledByCommandAndBank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndRank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime)); + lastScheduledByCommandAndBankGroup = std::vector> + (Command::numberOfCommands(), + ControllerVector(memSpec->bankGroupsPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnBus = scMaxTime; - last4Activates = std::vector>(memSpec->ranksPerChannel); + last4Activates = ControllerVector>(memSpec->ranksPerChannel); - lastBurstLengthByCommandAndRank = std::vector> - (Command::WRA + 1, std::vector(memSpec->ranksPerChannel)); - lastBurstLengthByCommandAndBankGroup = std::vector> - (Command::WRA + 1, std::vector(memSpec->bankGroupsPerChannel)); - lastBurstLengthByCommandAndBank = std::vector> - (Command::WRA + 1, std::vector(memSpec->banksPerChannel)); + lastBurstLengthByCommandAndRank = std::vector> + (Command::WRA + 1, ControllerVector(memSpec->ranksPerChannel)); + lastBurstLengthByCommandAndBankGroup = std::vector> + (Command::WRA + 1, ControllerVector(memSpec->bankGroupsPerChannel)); + lastBurstLengthByCommandAndBank = std::vector> + (Command::WRA + 1, ControllerVector(memSpec->banksPerChannel)); lastBurstLengthByCommand = std::vector(Command::WRA + 1); tBURST16 = 16 / memSpec->dataRate * memSpec->tCK; @@ -92,23 +93,23 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener assert(!(memSpec->bankMode == MemSpecLPDDR5::BankMode::MBG) || (memSpec->dataRate == 8)); // BG mode -> 4:1 ratio assert(burstLength <= memSpec->maxBurstLength); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD_L + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::RD][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::RD][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_32); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_16); } - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::RD][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::RD][rank] == 32) { // TODO: model BG mode BL32 interleaved burst, remove this fix if (memSpec->bankMode == MemSpecLPDDR5::BankMode::MBG) @@ -120,7 +121,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_S_16); } - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) { @@ -132,19 +133,19 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tCK + memSpec->tRPST + memSpec->tRPRE); } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::RDA][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::RDA][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_32); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_16); } - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::RDA][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::RDA][rank] == 32) { // TODO: model BG mode BL32 interleaved burst, remove this fix if (memSpec->bankMode == MemSpecLPDDR5::BankMode::MBG) @@ -156,7 +157,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_S_16); } - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) { @@ -169,10 +170,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tCK + memSpec->tRPST + memSpec->tRPRE); } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_max_32 + memSpec->tWTR_L); else @@ -180,10 +181,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_max_16 + memSpec->tWTR_L); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::WR][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::WR][rank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_min_32 + memSpec->tWTR_S); else @@ -191,7 +192,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tWTR_S); } - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) { @@ -204,10 +205,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tWL + memSpec->BL_n_min_16 + memSpec->tCK - memSpec->tRL); } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_max_32 + memSpec->tWTR_L); else @@ -215,10 +216,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_max_16 + memSpec->tWTR_L); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::WRA][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::WRA][rank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_min_32 + memSpec->tWTR_S); else @@ -226,7 +227,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tWTR_S); } - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) { @@ -246,14 +247,14 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener assert(!(memSpec->bankMode == MemSpecLPDDR5::BankMode::MBG) || (memSpec->dataRate == 8)); // BG mode -> 4:1 ratio assert(burstLength <= memSpec->maxBurstLength); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD_S + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::RD][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::RD][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRL + memSpec->BL_n_max_32 + memSpec->tWCK2DQO - memSpec->tWL); else @@ -261,10 +262,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_max_16 + memSpec->tWCK2DQO - memSpec->tWL); } - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::RD][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::RD][rank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRL + memSpec->BL_n_min_32 + memSpec->tWCK2DQO - memSpec->tWL); else @@ -272,7 +273,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tWCK2DQO - memSpec->tWL); } - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) { @@ -285,10 +286,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tRL + memSpec->BL_n_min_16 + memSpec->tWCK2DQO + memSpec->tRPST - memSpec->tWL); } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::RDA][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::RDA][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRL + memSpec->BL_n_max_32 + memSpec->tWCK2DQO - memSpec->tWL); else @@ -296,10 +297,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_max_16 + memSpec->tWCK2DQO - memSpec->tWL); } - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::RDA][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::RDA][rank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRL + memSpec->BL_n_min_32 + memSpec->tWCK2DQO - memSpec->tWL); else @@ -307,7 +308,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tWCK2DQO - memSpec->tWL); } - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) { @@ -320,19 +321,19 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tRL + memSpec->BL_n_min_16 + memSpec->tWCK2DQO + memSpec->tRPST - memSpec->tWL); } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup.ID()] == 32) + 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); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::WR][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::WR][rank] == 32) { // TODO: model BG mode BL32 interleaved burst, remove this fix if (memSpec->bankMode == MemSpecLPDDR5::BankMode::MBG) @@ -344,7 +345,7 @@ 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.ID()] ? + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) { @@ -355,19 +356,19 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_16 + memSpec->tCK); } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup.ID()] == 32) + 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); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::WRA][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::WRA][rank] == 32) { // TODO: model BG mode BL32 interleaved burst, remove this fix if (memSpec->bankMode == MemSpecLPDDR5::BankMode::MBG) @@ -379,7 +380,7 @@ 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.ID()] ? + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) { @@ -391,18 +392,18 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::RDA][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::RDA][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32 + memSpec->tRBTP + memSpec->tRPpb - memSpec->tCK); else @@ -410,10 +411,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tRBTP + memSpec->tRPpb - memSpec->tCK); } - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::RDA][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::RDA][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb - memSpec->tCK); else @@ -421,47 +422,47 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb - memSpec->tCK); } - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tpbR2act - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFP2B][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFP2B][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tpbR2act - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFP2B][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFP2B][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb - memSpec->tCK); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW - memSpec->tCK); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW - memSpec->tCK); } else if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::RD][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::RD][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32 + memSpec->tRBTP); else @@ -469,10 +470,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tRBTP); } - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::WR][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::WR][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR); else @@ -480,20 +481,20 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR); } - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::RD][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::RD][rank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32 + memSpec->tRBTP); else @@ -501,10 +502,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tRBTP); } - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::RDA][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::RDA][rank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32 + memSpec->tRBTP); else @@ -512,10 +513,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tRBTP); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::WR][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::WR][rank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR); else @@ -523,10 +524,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::WRA][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::WRA][rank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR); else @@ -534,20 +535,20 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR); } - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); } else if (command == Command::REFAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::RDA][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::RDA][rank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32 + memSpec->tRBTP + memSpec->tRPpb); else @@ -555,10 +556,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tRBTP + memSpec->tRPpb); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::WRA][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::WRA][rank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb); else @@ -566,32 +567,32 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb); } - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); } else if (command == Command::REFPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::RDA][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::RDA][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32 + memSpec->tRBTP + memSpec->tRPpb); else @@ -599,10 +600,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tRBTP + memSpec->tRPpb); } - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::WRA][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::WRA][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb); else @@ -610,45 +611,45 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb); } - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tpbR2pbR); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); } else if (command == Command::REFP2B) { Bank secondBank = Bank(bank.ID() + memSpec->getPer2BankOffset()); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][secondBank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][secondBank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::RDA][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::RDA][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32 + memSpec->tRBTP + memSpec->tRPpb); else @@ -656,10 +657,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tRBTP + memSpec->tRPpb); } - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][secondBank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][secondBank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::RDA][secondBank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::RDA][secondBank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32 + memSpec->tRBTP + memSpec->tRPpb); else @@ -667,10 +668,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tRBTP + memSpec->tRPpb); } - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::WRA][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::WRA][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb); else @@ -678,10 +679,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb); } - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][secondBank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][secondBank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::WRA][secondBank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::WRA][secondBank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb); else @@ -689,28 +690,28 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb); } - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][secondBank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][secondBank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFP2B][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFP2B][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFP2B][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFP2B][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tpbR2pbR); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); } else SC_REPORT_FATAL("CheckerLPDDR5", "Unknown command!"); @@ -732,30 +733,33 @@ void CheckerLPDDR5::insert(Command command, const tlm_generic_payload& payload) PRINTDEBUGMESSAGE("CheckerLPDDR5", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndBankGroup[command][bankGroup.ID()] = sc_time_stamp(); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); + lastScheduledByCommandAndBankGroup[command][bankGroup] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); if (command.isCasCommand()) { - lastBurstLengthByCommandAndRank[command][rank.ID()] = burstLength; - lastBurstLengthByCommandAndBankGroup[command][bankGroup.ID()] = burstLength; - lastBurstLengthByCommandAndBank[command][bank.ID()] = burstLength; + lastBurstLengthByCommandAndRank[command][rank] = burstLength; + lastBurstLengthByCommandAndBankGroup[command][bankGroup] = burstLength; + lastBurstLengthByCommandAndBank[command][bank] = burstLength; lastBurstLengthByCommand[command] = burstLength; } if (command == Command::REFP2B) - lastScheduledByCommandAndBank[command][bank.ID() + memSpec->getPer2BankOffset()] = sc_time_stamp(); + { + Bank secondBank(bank.ID() + memSpec->getPer2BankOffset()); + lastScheduledByCommandAndBank[command][secondBank] = sc_time_stamp(); + } lastCommandOnBus = sc_time_stamp() + memSpec->getCommandLength(command) - memSpec->tCK; if (command == Command::ACT || command == Command::REFPB || command == Command::REFP2B || command == Command::RFMPB || command == Command::RFMP2B) { - if (last4Activates[rank.ID()].size() == 4) - last4Activates[rank.ID()].pop(); - last4Activates[rank.ID()].push(lastCommandOnBus); + if (last4Activates[rank].size() == 4) + last4Activates[rank].pop(); + last4Activates[rank].push(lastCommandOnBus); } } diff --git a/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.h b/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.h index 23ed17c2..7887dda3 100644 --- a/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.h +++ b/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.h @@ -57,16 +57,16 @@ public: private: const MemSpecLPDDR5 *memSpec; - std::vector> lastScheduledByCommandAndRank; - std::vector> lastScheduledByCommandAndBankGroup; - std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndRank; + std::vector> lastScheduledByCommandAndBankGroup; + std::vector> lastScheduledByCommandAndBank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnBus; - std::vector> last4Activates; + ControllerVector> last4Activates; - std::vector> lastBurstLengthByCommandAndRank; - std::vector> lastBurstLengthByCommandAndBankGroup; - std::vector> lastBurstLengthByCommandAndBank; + std::vector> lastBurstLengthByCommandAndRank; + std::vector> lastBurstLengthByCommandAndBankGroup; + std::vector> lastBurstLengthByCommandAndBank; std::vector lastBurstLengthByCommand; const sc_core::sc_time scMaxTime = sc_core::sc_max_time(); diff --git a/src/libdramsys/DRAMSys/common/dramExtensions.h b/src/libdramsys/DRAMSys/common/dramExtensions.h index 109a095f..feb24516 100644 --- a/src/libdramsys/DRAMSys/common/dramExtensions.h +++ b/src/libdramsys/DRAMSys/common/dramExtensions.h @@ -88,6 +88,49 @@ private: unsigned int id; }; +class LogicalRank +{ +public: + explicit LogicalRank(unsigned int id) : id(id) {} + + unsigned int ID() const + { + return id; + } + +private: + unsigned int id; +}; + + +class PhysicalRank +{ +public: + explicit PhysicalRank(unsigned int id) : id(id) {} + + unsigned int ID() const + { + return id; + } + +private: + unsigned int id; +}; + +class DimmRank +{ +public: + explicit DimmRank(unsigned int id) : id(id) {} + + unsigned int ID() const + { + return id; + } + +private: + unsigned int id; +}; + class BankGroup { public: diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.cpp index 682a2196..f4c04a16 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.cpp @@ -50,18 +50,19 @@ CheckerGDDR5X::CheckerGDDR5X(const Configuration& config) if (memSpec == nullptr) SC_REPORT_FATAL("CheckerGDDR5X", "Wrong MemSpec chosen"); - lastScheduledByCommandAndBank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); - lastScheduledByCommandAndBankGroup = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->bankGroupsPerChannel, scMaxTime)); - lastScheduledByCommandAndRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndBankGroup = std::vector> + (Command::numberOfCommands(), + ControllerVector(memSpec->bankGroupsPerChannel, scMaxTime)); + lastScheduledByCommandAndRank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnBus = scMaxTime; - last4Activates = std::vector>(memSpec->ranksPerChannel); - last32Activates = std::vector>(memSpec->ranksPerChannel); + last4Activates = ControllerVector>(memSpec->ranksPerChannel); + last32Activates = ControllerVector>(memSpec->ranksPerChannel); - bankwiseRefreshCounter = std::vector(memSpec->ranksPerChannel); + bankwiseRefreshCounter = ControllerVector(memSpec->ranksPerChannel); tBURST = memSpec->defaultBurstLength / memSpec->dataRate * memSpec->tCK; tRDSRE = memSpec->tRL + memSpec->tWCK2CKPIN + memSpec->tWCK2CK + memSpec->tWCK2DQO + tBURST; @@ -88,70 +89,70 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, const tlm_gener assert(!(memSpec->dataRate == 4) || (burstLength == 8)); // DDR mode (QDR wrt CK) assert(!(memSpec->dataRate == 8) || (burstLength == 16)); // QDR mode (ODR wrt CK) - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDRD); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); if (command == Command::RDA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE - memSpec->tRTP); } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_L); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_S); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_L); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_S); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tLK); } @@ -161,378 +162,378 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, const tlm_gener assert(!(memSpec->dataRate == 4) || (burstLength == 8)); // DDR mode (QDR wrt CK) assert(!(memSpec->dataRate == 8) || (burstLength == 16)); // QDR mode (ODR wrt CK) - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDWR); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tLK); } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); - if (last32Activates[rank.ID()].size() >= 32) - earliestTimeToStart = std::max(earliestTimeToStart, last32Activates[rank.ID()].front() + memSpec->t32AW); + if (last32Activates[rank].size() >= 32) + earliestTimeToStart = std::max(earliestTimeToStart, last32Activates[rank].front() + memSpec->t32AW); } else if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); } else if (command == Command::REFAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::REFPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) { - if (bankwiseRefreshCounter[rank.ID()] == 0) + if (bankwiseRefreshCounter[rank] == 0) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); } - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); - if (last32Activates[rank.ID()].size() >= 32) - earliestTimeToStart = std::max(earliestTimeToStart, last32Activates[rank.ID()].front() + memSpec->t32AW); + if (last32Activates[rank].size() >= 32) + earliestTimeToStart = std::max(earliestTimeToStart, last32Activates[rank].front() + memSpec->t32AW); } else if (command == Command::PDEA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::PDXA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); } else if (command == Command::PDEP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::PDXP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); } else if (command == Command::SREFEN) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(memSpec->tRTP + memSpec->tRP, tRDSRE)); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::SREFEX) { - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } @@ -555,25 +556,25 @@ void CheckerGDDR5X::insert(Command command, const tlm_generic_payload& payload) PRINTDEBUGMESSAGE("CheckerGDDR5X", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndBankGroup[command][bankGroup.ID()] = sc_time_stamp(); - lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); + lastScheduledByCommandAndBankGroup[command][bankGroup] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); lastCommandOnBus = sc_time_stamp(); if (command == Command::ACT || command == Command::REFPB) { - if (last4Activates[rank.ID()].size() == 4) - last4Activates[rank.ID()].pop(); - last4Activates[rank.ID()].push(lastCommandOnBus); + if (last4Activates[rank].size() == 4) + last4Activates[rank].pop(); + last4Activates[rank].push(lastCommandOnBus); - if (last32Activates[rank.ID()].size() == 32) - last32Activates[rank.ID()].pop(); - last32Activates[rank.ID()].push(lastCommandOnBus); + if (last32Activates[rank].size() == 32) + last32Activates[rank].pop(); + last32Activates[rank].push(lastCommandOnBus); } if (command == Command::REFPB) - bankwiseRefreshCounter[rank.ID()] = (bankwiseRefreshCounter[rank.ID()] + 1) % memSpec->banksPerRank; + bankwiseRefreshCounter[rank] = (bankwiseRefreshCounter[rank] + 1) % memSpec->banksPerRank; } } // namespace DRAMSys diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.h b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.h index 482f8e5e..c3d664c4 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.h +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.h @@ -55,18 +55,18 @@ public: private: const MemSpecGDDR5X *memSpec; - std::vector> lastScheduledByCommandAndBank; - std::vector> lastScheduledByCommandAndBankGroup; - std::vector> lastScheduledByCommandAndRank; + std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndBankGroup; + std::vector> lastScheduledByCommandAndRank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnBus; // 4 and 32 activate window - std::vector> last4Activates; - std::vector> last32Activates; + ControllerVector> last4Activates; + ControllerVector> last32Activates; - std::vector bankwiseRefreshCounter; + ControllerVector bankwiseRefreshCounter; const sc_core::sc_time scMaxTime = sc_core::sc_max_time(); sc_core::sc_time tBURST; diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.cpp index 7b90405e..28bd7f38 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.cpp @@ -50,17 +50,18 @@ CheckerGDDR6::CheckerGDDR6(const Configuration& config) if (memSpec == nullptr) SC_REPORT_FATAL("CheckerGDDR6", "Wrong MemSpec chosen"); - lastScheduledByCommandAndBank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); - lastScheduledByCommandAndBankGroup = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->bankGroupsPerChannel, scMaxTime)); - lastScheduledByCommandAndRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndBankGroup = std::vector> + (Command::numberOfCommands(), + ControllerVector(memSpec->bankGroupsPerChannel, scMaxTime)); + lastScheduledByCommandAndRank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnBus = scMaxTime; - last4Activates = std::vector>(memSpec->ranksPerChannel); + last4Activates = ControllerVector>(memSpec->ranksPerChannel); - bankwiseRefreshCounter = std::vector(memSpec->ranksPerChannel); + bankwiseRefreshCounter = ControllerVector(memSpec->ranksPerChannel); tBURST = memSpec->defaultBurstLength / memSpec->dataRate * memSpec->tCK; tRDSRE = memSpec->tRL + memSpec->tWCK2CKPIN + memSpec->tWCK2CK + memSpec->tWCK2DQO + tBURST; @@ -85,70 +86,70 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, const tlm_generi { assert(ControllerExtension::getBurstLength(payload) == 16); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDRD); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); if (command == Command::RDA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE - memSpec->tRTP); } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_L); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_S); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_L); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_S); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tLK); } @@ -156,400 +157,400 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, const tlm_generi { assert(ControllerExtension::getBurstLength(payload) == 16); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDWR); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tLK); } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); } else if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); } else if (command == Command::REFAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::REFPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) { - if (bankwiseRefreshCounter[rank.ID()] == 0) + if (bankwiseRefreshCounter[rank] == 0) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); } - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); } else if (command == Command::PDEA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tACTPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPREPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::PDXA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); } else if (command == Command::PDEP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPREPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPREPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::PDXP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); } else if (command == Command::SREFEN) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(memSpec->tRTP + memSpec->tRP, tRDSRE)); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::SREFEX) { - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKESR); } @@ -572,21 +573,21 @@ void CheckerGDDR6::insert(Command command, const tlm_generic_payload& payload) PRINTDEBUGMESSAGE("CheckerGDDR6", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndBankGroup[command][bankGroup.ID()] = sc_time_stamp(); - lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); + lastScheduledByCommandAndBankGroup[command][bankGroup] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); lastCommandOnBus = sc_time_stamp(); if (command == Command::ACT || command == Command::REFPB) { - if (last4Activates[rank.ID()].size() == 4) - last4Activates[rank.ID()].pop(); - last4Activates[rank.ID()].push(lastCommandOnBus); + if (last4Activates[rank].size() == 4) + last4Activates[rank].pop(); + last4Activates[rank].push(lastCommandOnBus); } if (command == Command::REFPB) - bankwiseRefreshCounter[rank.ID()] = (bankwiseRefreshCounter[rank.ID()] + 1) % memSpec->banksPerRank; + bankwiseRefreshCounter[rank] = (bankwiseRefreshCounter[rank] + 1) % memSpec->banksPerRank; } } // namespace DRAMSys diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.h b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.h index c86de7f4..5446f520 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.h +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.h @@ -55,16 +55,16 @@ public: private: const MemSpecGDDR6 *memSpec; - std::vector> lastScheduledByCommandAndBank; - std::vector> lastScheduledByCommandAndBankGroup; - std::vector> lastScheduledByCommandAndRank; + std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndBankGroup; + std::vector> lastScheduledByCommandAndRank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnBus; // four activate window - std::vector> last4Activates; + ControllerVector> last4Activates; - std::vector bankwiseRefreshCounter; + ControllerVector bankwiseRefreshCounter; const sc_core::sc_time scMaxTime = sc_core::sc_max_time(); sc_core::sc_time tBURST; diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.cpp index 1e645b74..31f428ba 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.cpp @@ -50,18 +50,19 @@ CheckerHBM2::CheckerHBM2(const Configuration& config) if (memSpec == nullptr) SC_REPORT_FATAL("CheckerHBM2", "Wrong MemSpec chosen"); - lastScheduledByCommandAndBank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); - lastScheduledByCommandAndBankGroup = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->bankGroupsPerChannel, scMaxTime)); - lastScheduledByCommandAndRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndBankGroup = std::vector> + (Command::numberOfCommands(), + ControllerVector(memSpec->bankGroupsPerChannel, scMaxTime)); + lastScheduledByCommandAndRank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnRasBus = scMaxTime; lastCommandOnCasBus = scMaxTime; - last4Activates = std::vector>(memSpec->ranksPerChannel); + last4Activates = ControllerVector>(memSpec->ranksPerChannel); - bankwiseRefreshCounter = std::vector(memSpec->ranksPerChannel); + bankwiseRefreshCounter = ControllerVector(memSpec->ranksPerChannel); tBURST = memSpec->defaultBurstLength / memSpec->dataRate * memSpec->tCK; tRDPDE = memSpec->tRL + memSpec->tPL + tBURST + memSpec->tCK; @@ -88,46 +89,46 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic assert(!(memSpec->ranksPerChannel == 1) || (burstLength == 2 || burstLength == 4)); // Legacy mode assert(!(memSpec->ranksPerChannel == 2) || (burstLength == 4)); // Pseudo-channel mode - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDRD + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); if (command == Command::RDA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE - memSpec->tRTP); } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDS); @@ -143,31 +144,31 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic assert(!(memSpec->ranksPerChannel == 1) || (burstLength == 2 || burstLength == 4)); // Legacy mode assert(!(memSpec->ranksPerChannel == 2) || (burstLength == 4)); // Pseudo-channel mode - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDWR + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); @@ -179,31 +180,31 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - memSpec->tCK); @@ -215,15 +216,15 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCSB - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD - memSpec->tCK); @@ -231,22 +232,22 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS - memSpec->tCK); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW - memSpec->tCK); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW - memSpec->tCK); earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); @@ -258,23 +259,23 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); @@ -282,7 +283,7 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCSB); @@ -290,23 +291,23 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::REFAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -314,11 +315,11 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCSB); @@ -330,31 +331,31 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::REFPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -366,18 +367,18 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCSB); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) { - if (bankwiseRefreshCounter[rank.ID()] == 0) + if (bankwiseRefreshCounter[rank] == 0) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCSB); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); @@ -387,8 +388,8 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } @@ -530,9 +531,9 @@ void CheckerHBM2::insert(Command command, const tlm_generic_payload& payload) PRINTDEBUGMESSAGE("CheckerHBM2", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndBankGroup[command][bankGroup.ID()] = sc_time_stamp(); - lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); + lastScheduledByCommandAndBankGroup[command][bankGroup] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); if (command.isCasCommand()) @@ -544,13 +545,13 @@ void CheckerHBM2::insert(Command command, const tlm_generic_payload& payload) if (command == Command::ACT || command == Command::REFPB) { - if (last4Activates[rank.ID()].size() == 4) - last4Activates[rank.ID()].pop(); - last4Activates[rank.ID()].push(lastCommandOnRasBus); + if (last4Activates[rank].size() == 4) + last4Activates[rank].pop(); + last4Activates[rank].push(lastCommandOnRasBus); } if (command == Command::REFPB) - bankwiseRefreshCounter[rank.ID()] = (bankwiseRefreshCounter[rank.ID()] + 1) % memSpec->banksPerRank; + bankwiseRefreshCounter[rank] = (bankwiseRefreshCounter[rank] + 1) % memSpec->banksPerRank; } } // namespace DRAMSys diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.h b/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.h index 060e28f4..66e7e537 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.h +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.h @@ -55,17 +55,17 @@ public: private: const MemSpecHBM2 *memSpec; - std::vector> lastScheduledByCommandAndBank; - std::vector> lastScheduledByCommandAndBankGroup; - std::vector> lastScheduledByCommandAndRank; + std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndBankGroup; + std::vector> lastScheduledByCommandAndRank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnRasBus; sc_core::sc_time lastCommandOnCasBus; // Four activate window - std::vector> last4Activates; - std::vector bankwiseRefreshCounter; + ControllerVector> last4Activates; + ControllerVector bankwiseRefreshCounter; const sc_core::sc_time scMaxTime = sc_core::sc_max_time(); sc_core::sc_time tBURST; diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.cpp index f71b6502..8490480d 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.cpp @@ -50,13 +50,13 @@ CheckerLPDDR4::CheckerLPDDR4(const Configuration& config) if (memSpec == nullptr) SC_REPORT_FATAL("CheckerLPDDR4", "Wrong MemSpec chosen"); - lastScheduledByCommandAndBank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); - lastScheduledByCommandAndRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndRank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnBus = scMaxTime; - last4Activates = std::vector>(memSpec->ranksPerChannel); + last4Activates = ControllerVector>(memSpec->ranksPerChannel); tBURST = memSpec->defaultBurstLength / memSpec->dataRate * memSpec->tCK; tRDWR = memSpec->tRL + memSpec->tDQSCK + tBURST - memSpec->tWL + memSpec->tWPRE + memSpec->tRPST; @@ -89,50 +89,50 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, const tlm_gener assert((burstLength == 16) || (burstLength == 32)); // TODO: BL16/32 OTF assert(burstLength <= memSpec->maxBurstLength); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); if (command == Command::RDA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE - tRDPRE); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } @@ -142,367 +142,367 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, const tlm_gener assert((burstLength == 16) || (burstLength == 32)); assert(burstLength <= memSpec->maxBurstLength); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDAACT); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAACT); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb - 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab - 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab - 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb - 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD - 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR - 2 * memSpec->tCK); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW - 3 * memSpec->tCK); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW - 3 * memSpec->tCK); } else if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); } else if (command == Command::REFAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb + 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); } else if (command == Command::REFPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb + 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD + 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW - memSpec->tCK); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW - memSpec->tCK); } else if (command == Command::PDEA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tACTPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tREFPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::PDXA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::PDEP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tREFPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tREFPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); } else if (command == Command::PDXP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::SREFEN) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb + 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tRDPDEN, tRDPRE + memSpec->tRPpb)); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRPpb)); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); } else if (command == Command::SREFEX) { - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tSR); } @@ -524,17 +524,17 @@ void CheckerLPDDR4::insert(Command command, const tlm_generic_payload& payload) PRINTDEBUGMESSAGE("CheckerLPDDR4", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); lastCommandOnBus = sc_time_stamp() + memSpec->getCommandLength(command) - memSpec->tCK; if (command == Command::ACT || command == Command::REFPB) { - if (last4Activates[rank.ID()].size() == 4) - last4Activates[rank.ID()].pop(); - last4Activates[rank.ID()].push(lastCommandOnBus); + if (last4Activates[rank].size() == 4) + last4Activates[rank].pop(); + last4Activates[rank].push(lastCommandOnBus); } } diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.h b/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.h index 2cef3ddd..64a611bc 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.h +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.h @@ -55,13 +55,13 @@ public: private: const MemSpecLPDDR4 *memSpec; - std::vector> lastScheduledByCommandAndBank; - std::vector> lastScheduledByCommandAndRank; + std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndRank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnBus; // Four activate window - std::vector> last4Activates; + ControllerVector> last4Activates; const sc_core::sc_time scMaxTime = sc_core::sc_max_time(); sc_core::sc_time tBURST; diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.cpp index ab2833c6..292c31c5 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.cpp @@ -50,13 +50,13 @@ CheckerSTTMRAM::CheckerSTTMRAM(const Configuration& config) if (memSpec == nullptr) SC_REPORT_FATAL("CheckerSTTMRAM", "Wrong MemSpec chosen"); - lastScheduledByCommandAndBank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); - lastScheduledByCommandAndRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndRank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnBus = scMaxTime; - last4Activates = std::vector>(memSpec->ranksPerChannel); + last4Activates = ControllerVector>(memSpec->ranksPerChannel); tBURST = memSpec->defaultBurstLength / memSpec->dataRate * memSpec->tCK; tRDWR = memSpec->tRL + tBURST + 2 * memSpec->tCK - memSpec->tWL; @@ -81,36 +81,36 @@ sc_time CheckerSTTMRAM::timeToSatisfyConstraints(Command command, const tlm_gene { assert(ControllerExtension::getBurstLength(payload) == 8); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD - memSpec->tAL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); if (command == Command::RDA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE - memSpec->tRTP - memSpec->tAL); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD); @@ -118,7 +118,7 @@ sc_time CheckerSTTMRAM::timeToSatisfyConstraints(Command command, const tlm_gene if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD); @@ -126,11 +126,11 @@ sc_time CheckerSTTMRAM::timeToSatisfyConstraints(Command command, const tlm_gene if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSDLL); } @@ -138,240 +138,240 @@ sc_time CheckerSTTMRAM::timeToSatisfyConstraints(Command command, const tlm_gene { assert(ControllerExtension::getBurstLength(payload) == 8); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD - memSpec->tAL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSDLL); } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tAL + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); } else if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tAL + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tAL + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tAL + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::PDEA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tACTPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::PDXA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); } else if (command == Command::PDEP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::PDXP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); } else if (command == Command::SREFEN) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tRDPDEN, memSpec->tAL + memSpec->tRTP + memSpec->tRP)); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRP)); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::SREFEX) { - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKESR); } @@ -392,17 +392,17 @@ void CheckerSTTMRAM::insert(Command command, const tlm_generic_payload& payload) PRINTDEBUGMESSAGE("CheckerSTTMRAM", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); lastCommandOnBus = sc_time_stamp(); if (command == Command::ACT) { - if (last4Activates[rank.ID()].size() == 4) - last4Activates[rank.ID()].pop(); - last4Activates[rank.ID()].push(sc_time_stamp()); + if (last4Activates[rank].size() == 4) + last4Activates[rank].pop(); + last4Activates[rank].push(sc_time_stamp()); } } diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.h b/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.h index 28d52e2e..eb2ab813 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.h +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.h @@ -55,13 +55,13 @@ public: private: const MemSpecSTTMRAM *memSpec; - std::vector> lastScheduledByCommandAndBank; - std::vector> lastScheduledByCommandAndRank; + std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndRank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnBus; // Four activate window - std::vector> last4Activates; + ControllerVector> last4Activates; const sc_core::sc_time scMaxTime = sc_core::sc_max_time(); sc_core::sc_time tBURST; diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.cpp index 25a91656..94174941 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.cpp @@ -50,13 +50,13 @@ CheckerWideIO::CheckerWideIO(const Configuration& config) if (memSpec == nullptr) SC_REPORT_FATAL("CheckerWideIO", "Wrong MemSpec chosen"); - lastScheduledByCommandAndBank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); - lastScheduledByCommandAndRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndRank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnBus = scMaxTime; - last2Activates = std::vector>(memSpec->ranksPerChannel); + last2Activates = ControllerVector>(memSpec->ranksPerChannel); tBURST = memSpec->defaultBurstLength * memSpec->tCK; tRDWR = memSpec->tRL + tBURST + memSpec->tCK; @@ -83,50 +83,50 @@ sc_time CheckerWideIO::timeToSatisfyConstraints(Command command, const tlm_gener assert((burstLength == 2) || (burstLength == 4)); assert(burstLength <= memSpec->maxBurstLength); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); if (command == Command::RDA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE - tBURST); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } @@ -136,262 +136,262 @@ sc_time CheckerWideIO::timeToSatisfyConstraints(Command command, const tlm_gener assert((burstLength == 2) || (burstLength == 4)); assert(burstLength <= memSpec->maxBurstLength); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); - if (last2Activates[rank.ID()].size() >= 2) - earliestTimeToStart = std::max(earliestTimeToStart, last2Activates[rank.ID()].front() + memSpec->tTAW); + if (last2Activates[rank].size() >= 2) + earliestTimeToStart = std::max(earliestTimeToStart, last2Activates[rank].front() + memSpec->tTAW); } else if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::REFAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); } else if (command == Command::PDEA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::PDXA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::PDEP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); } else if (command == Command::PDXP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::SREFEN) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tRDPDEN, tBURST + memSpec->tRP)); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRP)); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); } else if (command == Command::SREFEX) { - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKESR); } @@ -413,16 +413,16 @@ void CheckerWideIO::insert(Command command, const tlm_generic_payload& payload) PRINTDEBUGMESSAGE("CheckerWideIO", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); lastCommandOnBus = sc_time_stamp(); if (command == Command::ACT) { - if (last2Activates[rank.ID()].size() == 2) - last2Activates[rank.ID()].pop(); - last2Activates[rank.ID()].push(sc_time_stamp()); + if (last2Activates[rank].size() == 2) + last2Activates[rank].pop(); + last2Activates[rank].push(sc_time_stamp()); } } diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.h b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.h index c39d1e41..0a2c7032 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.h +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.h @@ -55,13 +55,13 @@ public: private: const MemSpecWideIO *memSpec; - std::vector> lastScheduledByCommandAndBank; - std::vector> lastScheduledByCommandAndRank; + std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndRank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnBus; // Four activate window - std::vector> last2Activates; + ControllerVector> last2Activates; const sc_core::sc_time scMaxTime = sc_core::sc_max_time(); sc_core::sc_time tBURST; diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.cpp index ebc6e967..cf92fc0d 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.cpp @@ -50,13 +50,13 @@ CheckerWideIO2::CheckerWideIO2(const Configuration& config) if (memSpec == nullptr) SC_REPORT_FATAL("CheckerWideIO2", "Wrong MemSpec chosen"); - lastScheduledByCommandAndBank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); - lastScheduledByCommandAndRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndRank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnBus = scMaxTime; - last4Activates = std::vector>(memSpec->ranksPerChannel); + last4Activates = ControllerVector>(memSpec->ranksPerChannel); tBURST = memSpec->defaultBurstLength / memSpec->dataRate * memSpec->tCK; tRDPRE = tBURST + std::max(2 * memSpec->tCK, memSpec->tRTP) - 2 * memSpec->tCK; @@ -84,50 +84,50 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, const tlm_gene assert((burstLength == 4) || (burstLength == 8)); // TODO: BL4/8 OTF assert(burstLength <= memSpec->maxBurstLength); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); if (command == Command::RDA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE - tRDPRE); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } @@ -137,339 +137,339 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, const tlm_gene assert((burstLength == 4) || (burstLength == 8)); assert(burstLength <= memSpec->maxBurstLength); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); } else if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); } else if(command == Command::REFAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); } else if(command == Command::REFPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); } else if (command == Command::PDEA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::PDXA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::PDEP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); } else if (command == Command::PDXP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::SREFEN) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tRDPDEN, tRDPRE + memSpec->tRPpb)); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRPpb)); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); } else if (command == Command::SREFEX) { - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKESR); } @@ -491,16 +491,16 @@ void CheckerWideIO2::insert(Command command, const tlm_generic_payload& payload) PRINTDEBUGMESSAGE("CheckerWideIO2", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); lastCommandOnBus = sc_time_stamp(); if (command == Command::ACT || command == Command::REFPB) { - if (last4Activates[rank.ID()].size() == 4) - last4Activates[rank.ID()].pop(); - last4Activates[rank.ID()].push(sc_time_stamp()); + if (last4Activates[rank].size() == 4) + last4Activates[rank].pop(); + last4Activates[rank].push(sc_time_stamp()); } } diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.h b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.h index f68f551d..d787870b 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.h +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.h @@ -55,13 +55,13 @@ public: private: const MemSpecWideIO2 *memSpec; - std::vector> lastScheduledByCommandAndBank; - std::vector> lastScheduledByCommandAndRank; + std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndRank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnBus; // Four activate window - std::vector> last4Activates; + ControllerVector> last4Activates; const sc_core::sc_time scMaxTime = sc_core::sc_max_time(); sc_core::sc_time tBURST;