diff --git a/DRAMSys/library/src/common/TlmRecorder.cpp b/DRAMSys/library/src/common/TlmRecorder.cpp index 15a54d35..c056de77 100644 --- a/DRAMSys/library/src/common/TlmRecorder.cpp +++ b/DRAMSys/library/src/common/TlmRecorder.cpp @@ -131,9 +131,12 @@ void TlmRecorder::recordPhase(tlm_generic_payload &trans, if (currentTransactionsInSystem[&trans].cmd == 'X') { - if (phase == END_REFA + if (phase == END_REFAB || phase == END_RFMAB - || phase == END_REFB + || phase == END_REFPB + || phase == END_RFMPB + || phase == END_REFP2B + || phase == END_RFMP2B || phase == END_REFSB || phase == END_RFMSB || phase == END_PDNA @@ -298,12 +301,14 @@ void TlmRecorder::prepareSqlStatements() insertGeneralInfoString = "INSERT INTO GeneralInfo VALUES" - "(:numberOfTransactions,:end,:numberOfRanks,:numberOfBankgroups,:numberOfBanks,:clk,:unitOfTime,:mcconfig,:memspec," - ":traces,:windowSize, :flexibleRefresh, :maxRefBurst, :controllerThread, :maxBufferDepth)"; + "(:numberOfTransactions, :end, :numberOfRanks, :numberOfBankGroups, :numberOfBanks, :clk, :unitOfTime, " + ":mcconfig, :memspec, :traces, :windowSize, :refreshMaxPostponed, :refreshMaxPulledin, :controllerThread, " + ":maxBufferDepth, :per2BankOffset)"; insertCommandLengthsString = "INSERT INTO CommandLengths VALUES" - "(:NOP, :RD, :WR, :RDA, :WRA, :ACT, :PRE, :REFB, :PRESB, :REFSB, :RFMSB, :PREA, :REFA, :RFMAB, :PDEA, :PDXA, :PDEP, :PDXP, :SREFEN, :SREFEX)"; + "(:NOP, :RD, :WR, :RDA, :WRA, :ACT, :PREPB, :REFPB, :RFMPB, :REFP2B, :RFMP2B, :PRESB, :REFSB, :RFMSB, " + ":PREAB, :REFAB, :RFMAB, :PDEA, :PDXA, :PDEP, :PDXP, :SREFEN, :SREFEX)"; insertDebugMessageString = "INSERT INTO DebugMessages (Time,Message) Values (:time,:message)"; @@ -340,7 +345,7 @@ void TlmRecorder::insertGeneralInfo() sqlite3_bind_int(insertGeneralInfoStatement, 3, static_cast(Configuration::getInstance().memSpec->numberOfRanks)); sqlite3_bind_int(insertGeneralInfoStatement, 4, static_cast(Configuration::getInstance().memSpec->numberOfBankGroups)); sqlite3_bind_int(insertGeneralInfoStatement, 5, static_cast(Configuration::getInstance().memSpec->numberOfBanks)); - sqlite3_bind_int(insertGeneralInfoStatement, 6, static_cast(Configuration::getInstance().memSpec->tCK.value())); + sqlite3_bind_int64(insertGeneralInfoStatement, 6, static_cast(Configuration::getInstance().memSpec->tCK.value())); sqlite3_bind_text(insertGeneralInfoStatement, 7, "PS", 2, nullptr); std::fstream mcconfig_stream, memspec_stream; @@ -352,28 +357,17 @@ void TlmRecorder::insertGeneralInfo() sqlite3_bind_text(insertGeneralInfoStatement, 8, mcconfig_dump.c_str(), static_cast(mcconfig_dump.length()), nullptr); sqlite3_bind_text(insertGeneralInfoStatement, 9, memspec_dump.c_str(), static_cast(memspec_dump.length()), nullptr); sqlite3_bind_text(insertGeneralInfoStatement, 10, traces.c_str(), static_cast(traces.length()), nullptr); - if (!Configuration::getInstance().enableWindowing) + if (Configuration::getInstance().enableWindowing) + sqlite3_bind_int64(insertGeneralInfoStatement, 11, static_cast((Configuration::getInstance().memSpec->tCK + * Configuration::getInstance().windowSize).value())); + else sqlite3_bind_int64(insertGeneralInfoStatement, 11, 0); - else - sqlite3_bind_int64(insertGeneralInfoStatement, 11, - static_cast((Configuration::getInstance().memSpec->tCK * - Configuration::getInstance().windowSize).value())); - - if ((Configuration::getInstance().refreshMaxPostponed > 0) - || (Configuration::getInstance().refreshMaxPulledin > 0)) - { - sqlite3_bind_int(insertGeneralInfoStatement, 12, 1); - sqlite3_bind_int(insertGeneralInfoStatement, 13, - static_cast(std::max(Configuration::getInstance().refreshMaxPostponed, - Configuration::getInstance().refreshMaxPulledin))); - } - else - { - sqlite3_bind_int(insertGeneralInfoStatement, 12, 0); - sqlite3_bind_int(insertGeneralInfoStatement, 13, 0); - } - sqlite3_bind_int(insertGeneralInfoStatement, 14, static_cast(UINT_MAX)); + sqlite3_bind_int(insertGeneralInfoStatement, 12, static_cast(Configuration::getInstance().refreshMaxPostponed)); + sqlite3_bind_int(insertGeneralInfoStatement, 13, static_cast(Configuration::getInstance().refreshMaxPulledin)); + sqlite3_bind_int64(insertGeneralInfoStatement, 14, static_cast(UINT64_MAX)); sqlite3_bind_int(insertGeneralInfoStatement, 15, static_cast(Configuration::getInstance().requestBufferSize)); + sqlite3_bind_int(insertGeneralInfoStatement, 16, + static_cast(Configuration::getInstance().memSpec->getPer2BankOffset())); executeSqlStatement(insertGeneralInfoStatement); } @@ -387,20 +381,23 @@ void TlmRecorder::insertCommandLengths() sqlite3_bind_int(insertCommandLengthsStatement, 4, static_cast(lround(memSpec->getCommandLength(Command::RDA) / memSpec->tCK))); sqlite3_bind_int(insertCommandLengthsStatement, 5, static_cast(lround(memSpec->getCommandLength(Command::WRA) / memSpec->tCK))); sqlite3_bind_int(insertCommandLengthsStatement, 6, static_cast(lround(memSpec->getCommandLength(Command::ACT) / memSpec->tCK))); - sqlite3_bind_int(insertCommandLengthsStatement, 7, static_cast(lround(memSpec->getCommandLength(Command::PRE) / memSpec->tCK))); - sqlite3_bind_int(insertCommandLengthsStatement, 8, static_cast(lround(memSpec->getCommandLength(Command::REFB) / memSpec->tCK))); - sqlite3_bind_int(insertCommandLengthsStatement, 9, static_cast(lround(memSpec->getCommandLength(Command::PRESB) / memSpec->tCK))); - sqlite3_bind_int(insertCommandLengthsStatement, 10, static_cast(lround(memSpec->getCommandLength(Command::REFSB) / memSpec->tCK))); - sqlite3_bind_int(insertCommandLengthsStatement, 11, static_cast(lround(memSpec->getCommandLength(Command::RFMSB) / memSpec->tCK))); - sqlite3_bind_int(insertCommandLengthsStatement, 12, static_cast(lround(memSpec->getCommandLength(Command::PREA) / memSpec->tCK))); - sqlite3_bind_int(insertCommandLengthsStatement, 13, static_cast(lround(memSpec->getCommandLength(Command::REFA) / memSpec->tCK))); - sqlite3_bind_int(insertCommandLengthsStatement, 14, static_cast(lround(memSpec->getCommandLength(Command::RFMAB) / memSpec->tCK))); - sqlite3_bind_int(insertCommandLengthsStatement, 15, static_cast(lround(memSpec->getCommandLength(Command::PDEA) / memSpec->tCK))); - sqlite3_bind_int(insertCommandLengthsStatement, 16, static_cast(lround(memSpec->getCommandLength(Command::PDXA) / memSpec->tCK))); - sqlite3_bind_int(insertCommandLengthsStatement, 17, static_cast(lround(memSpec->getCommandLength(Command::PDEP) / memSpec->tCK))); - sqlite3_bind_int(insertCommandLengthsStatement, 18, static_cast(lround(memSpec->getCommandLength(Command::PDXP) / memSpec->tCK))); - sqlite3_bind_int(insertCommandLengthsStatement, 19, static_cast(lround(memSpec->getCommandLength(Command::SREFEN) / memSpec->tCK))); - sqlite3_bind_int(insertCommandLengthsStatement, 20, static_cast(lround(memSpec->getCommandLength(Command::SREFEX) / memSpec->tCK))); + sqlite3_bind_int(insertCommandLengthsStatement, 7, static_cast(lround(memSpec->getCommandLength(Command::PREPB) / memSpec->tCK))); + sqlite3_bind_int(insertCommandLengthsStatement, 8, static_cast(lround(memSpec->getCommandLength(Command::REFPB) / memSpec->tCK))); + sqlite3_bind_int(insertCommandLengthsStatement, 9, static_cast(lround(memSpec->getCommandLength(Command::RFMPB) / memSpec->tCK))); + sqlite3_bind_int(insertCommandLengthsStatement, 10, static_cast(lround(memSpec->getCommandLength(Command::REFP2B) / memSpec->tCK))); + sqlite3_bind_int(insertCommandLengthsStatement, 11, static_cast(lround(memSpec->getCommandLength(Command::RFMP2B) / memSpec->tCK))); + sqlite3_bind_int(insertCommandLengthsStatement, 12, static_cast(lround(memSpec->getCommandLength(Command::PRESB) / memSpec->tCK))); + sqlite3_bind_int(insertCommandLengthsStatement, 13, static_cast(lround(memSpec->getCommandLength(Command::REFSB) / memSpec->tCK))); + sqlite3_bind_int(insertCommandLengthsStatement, 14, static_cast(lround(memSpec->getCommandLength(Command::RFMSB) / memSpec->tCK))); + sqlite3_bind_int(insertCommandLengthsStatement, 15, static_cast(lround(memSpec->getCommandLength(Command::PREAB) / memSpec->tCK))); + sqlite3_bind_int(insertCommandLengthsStatement, 16, static_cast(lround(memSpec->getCommandLength(Command::REFAB) / memSpec->tCK))); + sqlite3_bind_int(insertCommandLengthsStatement, 17, static_cast(lround(memSpec->getCommandLength(Command::RFMAB) / memSpec->tCK))); + sqlite3_bind_int(insertCommandLengthsStatement, 18, static_cast(lround(memSpec->getCommandLength(Command::PDEA) / memSpec->tCK))); + sqlite3_bind_int(insertCommandLengthsStatement, 19, static_cast(lround(memSpec->getCommandLength(Command::PDXA) / memSpec->tCK))); + sqlite3_bind_int(insertCommandLengthsStatement, 20, static_cast(lround(memSpec->getCommandLength(Command::PDEP) / memSpec->tCK))); + sqlite3_bind_int(insertCommandLengthsStatement, 21, static_cast(lround(memSpec->getCommandLength(Command::PDXP) / memSpec->tCK))); + sqlite3_bind_int(insertCommandLengthsStatement, 22, static_cast(lround(memSpec->getCommandLength(Command::SREFEN) / memSpec->tCK))); + sqlite3_bind_int(insertCommandLengthsStatement, 23, static_cast(lround(memSpec->getCommandLength(Command::SREFEX) / memSpec->tCK))); executeSqlStatement(insertCommandLengthsStatement); } diff --git a/DRAMSys/library/src/common/TlmRecorder.h b/DRAMSys/library/src/common/TlmRecorder.h index 9f07ca13..6b92859d 100644 --- a/DRAMSys/library/src/common/TlmRecorder.h +++ b/DRAMSys/library/src/common/TlmRecorder.h @@ -60,10 +60,12 @@ public: { mcconfig = std::move(_mcconfig); } + void recordMemspec(std::string _memspec) { memspec = std::move(_memspec); } + void recordTraceNames(std::string _traces) { traces = std::move(_traces); @@ -179,10 +181,11 @@ private: " Memspec TEXT, \n" " Traces TEXT, \n" " WindowSize INTEGER, \n" - " FlexibleRefresh INTEGER, \n" - " MaxRefBurst INTEGER, \n" + " RefreshMaxPostponed INTEGER, \n" + " RefreshMaxPulledin INTEGER, \n" " ControllerThread INTEGER, \n" - " MaxBufferDepth INTEGER \n" + " MaxBufferDepth INTEGER, \n" + " Per2BankOffset INTEGER \n" "); \n" " \n" "CREATE TABLE CommandLengths( \n" @@ -192,13 +195,16 @@ private: " RDA INTEGER, \n" " WRA INTEGER, \n" " ACT INTEGER, \n" - " PRE INTEGER, \n" - " REFB INTEGER, \n" + " PREPB INTEGER, \n" + " REFPB INTEGER, \n" + " RFMPB INTEGER, \n" + " REFP2B INTEGER, \n" + " RFMP2B INTEGER, \n" " PRESB INTEGER, \n" " REFSB INTEGER, \n" " RFMSB INTEGER, \n" - " PREA INTEGER, \n" - " REFA INTEGER, \n" + " PREAB INTEGER, \n" + " REFAB INTEGER, \n" " RFMAB INTEGER, \n" " PDEA INTEGER, \n" " PDXA INTEGER, \n" diff --git a/DRAMSys/library/src/configuration/memspec/MemSpec.cpp b/DRAMSys/library/src/configuration/memspec/MemSpec.cpp index e22eb7f1..6a6ca79d 100644 --- a/DRAMSys/library/src/configuration/memspec/MemSpec.cpp +++ b/DRAMSys/library/src/configuration/memspec/MemSpec.cpp @@ -82,22 +82,33 @@ uint64_t MemSpec::getSimMemSizeInBytes() const sc_time MemSpec::getRefreshIntervalAB() const { - SC_REPORT_FATAL("MemSpec", "All bank refresh not supported"); + SC_REPORT_FATAL("MemSpec", "All-bank refresh not supported"); return SC_ZERO_TIME; } sc_time MemSpec::getRefreshIntervalPB() const { - SC_REPORT_FATAL("MemSpec", "Per bank refresh not supported"); + SC_REPORT_FATAL("MemSpec", "Per-bank refresh not supported"); + return SC_ZERO_TIME; +} + +sc_time MemSpec::getRefreshIntervalP2B() const +{ + SC_REPORT_FATAL("MemSpec", "Per-2-bank refresh not supported"); return SC_ZERO_TIME; } sc_time MemSpec::getRefreshIntervalSB() const { - SC_REPORT_FATAL("MemSpec", "Same bank refresh not supported"); + SC_REPORT_FATAL("MemSpec", "Same-bank refresh not supported"); return SC_ZERO_TIME; } +unsigned MemSpec::getPer2BankOffset() const +{ + return 0; +} + unsigned MemSpec::getRAACDR() const { SC_REPORT_FATAL("MemSpec", "Refresh Management not supported"); diff --git a/DRAMSys/library/src/configuration/memspec/MemSpec.h b/DRAMSys/library/src/configuration/memspec/MemSpec.h index 4c6b9f9d..6e1ee9c0 100644 --- a/DRAMSys/library/src/configuration/memspec/MemSpec.h +++ b/DRAMSys/library/src/configuration/memspec/MemSpec.h @@ -78,8 +78,11 @@ public: virtual sc_core::sc_time getRefreshIntervalAB() const; virtual sc_core::sc_time getRefreshIntervalPB() const; + virtual sc_core::sc_time getRefreshIntervalP2B() const; virtual sc_core::sc_time getRefreshIntervalSB() const; + virtual unsigned getPer2BankOffset() const; + virtual unsigned getRAAIMT() const; virtual unsigned getRAAMMT() const; virtual unsigned getRAACDR() const; diff --git a/DRAMSys/library/src/configuration/memspec/MemSpecDDR3.cpp b/DRAMSys/library/src/configuration/memspec/MemSpecDDR3.cpp index fde1ea69..2d7bbfb4 100644 --- a/DRAMSys/library/src/configuration/memspec/MemSpecDDR3.cpp +++ b/DRAMSys/library/src/configuration/memspec/MemSpecDDR3.cpp @@ -121,7 +121,7 @@ sc_time MemSpecDDR3::getRefreshIntervalAB() const // Returns the execution time for commands that have a fixed execution time sc_time MemSpecDDR3::getExecutionTime(Command command, const tlm_generic_payload &) const { - if (command == Command::PRE || command == Command::PREA) + if (command == Command::PREPB || command == Command::PREAB) return tRP; else if (command == Command::ACT) return tRCD; @@ -133,7 +133,7 @@ sc_time MemSpecDDR3::getExecutionTime(Command command, const tlm_generic_payload return tWL + burstDuration; else if (command == Command::WRA) return tWL + burstDuration + tWR + tRP; - else if (command == Command::REFA) + else if (command == Command::REFAB) return tRFC; else { diff --git a/DRAMSys/library/src/configuration/memspec/MemSpecDDR4.cpp b/DRAMSys/library/src/configuration/memspec/MemSpecDDR4.cpp index 6f29e509..81c7e762 100644 --- a/DRAMSys/library/src/configuration/memspec/MemSpecDDR4.cpp +++ b/DRAMSys/library/src/configuration/memspec/MemSpecDDR4.cpp @@ -140,7 +140,7 @@ sc_time MemSpecDDR4::getRefreshIntervalAB() const // Returns the execution time for commands that have a fixed execution time sc_time MemSpecDDR4::getExecutionTime(Command command, const tlm_generic_payload &) const { - if (command == Command::PRE || command == Command::PREA) + if (command == Command::PREPB || command == Command::PREAB) return tRP; else if (command == Command::ACT) return tRCD; @@ -152,7 +152,7 @@ sc_time MemSpecDDR4::getExecutionTime(Command command, const tlm_generic_payload return tWL + burstDuration; else if (command == Command::WRA) return tWL + burstDuration + tWR + tRP; - else if (command == Command::REFA) + else if (command == Command::REFAB) return tRFC; else { diff --git a/DRAMSys/library/src/configuration/memspec/MemSpecDDR5.cpp b/DRAMSys/library/src/configuration/memspec/MemSpecDDR5.cpp index ba3de486..a041b8bd 100644 --- a/DRAMSys/library/src/configuration/memspec/MemSpecDDR5.cpp +++ b/DRAMSys/library/src/configuration/memspec/MemSpecDDR5.cpp @@ -130,14 +130,14 @@ MemSpecDDR5::MemSpecDDR5(json &memspec) else if (cmdMode == 2) { commandLengthInCycles[Command::ACT] = 4; - commandLengthInCycles[Command::PRE] = 2; - commandLengthInCycles[Command::PREA] = 2; + commandLengthInCycles[Command::PREPB] = 2; + commandLengthInCycles[Command::PREAB] = 2; commandLengthInCycles[Command::PRESB] = 2; commandLengthInCycles[Command::RD] = 4; commandLengthInCycles[Command::RDA] = 4; commandLengthInCycles[Command::WR] = 4; commandLengthInCycles[Command::WRA] = 4; - commandLengthInCycles[Command::REFA] = 2; + commandLengthInCycles[Command::REFAB] = 2; commandLengthInCycles[Command::RFMAB] = 2; commandLengthInCycles[Command::REFSB] = 2; commandLengthInCycles[Command::RFMSB] = 2; @@ -209,7 +209,7 @@ unsigned MemSpecDDR5::getRAAMMT() const // Returns the execution time for commands that have a fixed execution time sc_time MemSpecDDR5::getExecutionTime(Command command, const tlm_generic_payload &payload) const { - if (command == Command::PRE || command == Command::PREA || command == Command::PRESB) + if (command == Command::PREPB || command == Command::PREAB || command == Command::PRESB) return tRP + shortCmdOffset; else if (command == Command::ACT) return tRCD + longCmdOffset; @@ -236,7 +236,7 @@ sc_time MemSpecDDR5::getExecutionTime(Command command, const tlm_generic_payload else return tWL + tBURST16 + tWR + tRP + longCmdOffset; } - else if (command == Command::REFA || command == Command::RFMAB) + else if (command == Command::REFAB || command == Command::RFMAB) return tRFC_slr + shortCmdOffset; else if (command == Command::REFSB || command == Command::RFMSB) return tRFCsb_slr + shortCmdOffset; diff --git a/DRAMSys/library/src/configuration/memspec/MemSpecGDDR5.cpp b/DRAMSys/library/src/configuration/memspec/MemSpecGDDR5.cpp index b681ac06..280d00a0 100644 --- a/DRAMSys/library/src/configuration/memspec/MemSpecGDDR5.cpp +++ b/DRAMSys/library/src/configuration/memspec/MemSpecGDDR5.cpp @@ -122,7 +122,7 @@ sc_time MemSpecGDDR5::getRefreshIntervalPB() const sc_time MemSpecGDDR5::getExecutionTime(Command command, const tlm_generic_payload &payload) const { - if (command == Command::PRE || command == Command::PREA) + if (command == Command::PREPB || command == Command::PREAB) return tRP; else if (command == Command::ACT) { @@ -139,9 +139,9 @@ sc_time MemSpecGDDR5::getExecutionTime(Command command, const tlm_generic_payloa return tWL + tWCK2CKPIN + tWCK2CK + tWCK2DQI + burstDuration; else if (command == Command::WRA) return tWL + burstDuration + tWR + tRP; - else if (command == Command::REFA) + else if (command == Command::REFAB) return tRFC; - else if (command == Command::REFB) + else if (command == Command::REFPB) return tRFCPB; else { diff --git a/DRAMSys/library/src/configuration/memspec/MemSpecGDDR5X.cpp b/DRAMSys/library/src/configuration/memspec/MemSpecGDDR5X.cpp index fe396212..c4ebebfe 100644 --- a/DRAMSys/library/src/configuration/memspec/MemSpecGDDR5X.cpp +++ b/DRAMSys/library/src/configuration/memspec/MemSpecGDDR5X.cpp @@ -121,7 +121,7 @@ sc_time MemSpecGDDR5X::getRefreshIntervalPB() const sc_time MemSpecGDDR5X::getExecutionTime(Command command, const tlm_generic_payload &payload) const { - if (command == Command::PRE || command == Command::PREA) + if (command == Command::PREPB || command == Command::PREAB) return tRP; else if (command == Command::ACT) { @@ -138,9 +138,9 @@ sc_time MemSpecGDDR5X::getExecutionTime(Command command, const tlm_generic_paylo return tWL + tWCK2CKPIN + tWCK2CK + tWCK2DQI + burstDuration; else if (command == Command::WRA) return tWL + burstDuration + tWR + tRP; - else if (command == Command::REFA) + else if (command == Command::REFAB) return tRFC; - else if (command == Command::REFB) + else if (command == Command::REFPB) return tRFCPB; else { diff --git a/DRAMSys/library/src/configuration/memspec/MemSpecGDDR6.cpp b/DRAMSys/library/src/configuration/memspec/MemSpecGDDR6.cpp index 76087278..dce32d1d 100644 --- a/DRAMSys/library/src/configuration/memspec/MemSpecGDDR6.cpp +++ b/DRAMSys/library/src/configuration/memspec/MemSpecGDDR6.cpp @@ -55,6 +55,7 @@ MemSpecGDDR6::MemSpecGDDR6(json &memspec) parseUint(memspec["memarchitecturespec"], "nbrOfBankGroups") * parseUint(memspec["memarchitecturespec"],"nbrOfRanks"), 1), + per2BankOffset(parseUint(memspec["memarchitecturespec"], "per2BankOffset")), tRP (tCK * parseUint(memspec["memtimingspec"], "RP")), tRAS (tCK * parseUint(memspec["memtimingspec"], "RAS")), tRC (tCK * parseUint(memspec["memtimingspec"], "RC")), @@ -79,9 +80,9 @@ MemSpecGDDR6::MemSpecGDDR6(json &memspec) tCKESR (tCK * parseUint(memspec["memtimingspec"], "CKESR")), tXP (tCK * parseUint(memspec["memtimingspec"], "XP")), tREFI (tCK * parseUint(memspec["memtimingspec"], "REFI")), - tREFIPB (tCK * parseUint(memspec["memtimingspec"], "REFIPB")), - tRFC (tCK * parseUint(memspec["memtimingspec"], "RFC")), - tRFCPB (tCK * parseUint(memspec["memtimingspec"], "RFCPB")), + tREFIpb (tCK * parseUint(memspec["memtimingspec"], "REFIpb")), + tRFCab (tCK * parseUint(memspec["memtimingspec"], "RFCab")), + tRFCpb (tCK * parseUint(memspec["memtimingspec"], "RFCpb")), tRREFD (tCK * parseUint(memspec["memtimingspec"], "RREFD")), tXS (tCK * parseUint(memspec["memtimingspec"], "XS")), tFAW (tCK * parseUint(memspec["memtimingspec"], "FAW")), @@ -119,12 +120,22 @@ sc_time MemSpecGDDR6::getRefreshIntervalAB() const sc_time MemSpecGDDR6::getRefreshIntervalPB() const { - return tREFIPB; + return tREFIpb; +} + +sc_time MemSpecGDDR6::getRefreshIntervalP2B() const +{ + return tREFIpb; +} + +unsigned MemSpecGDDR6::getPer2BankOffset() const +{ + return per2BankOffset; } sc_time MemSpecGDDR6::getExecutionTime(Command command, const tlm_generic_payload &payload) const { - if (command == Command::PRE || command == Command::PREA) + if (command == Command::PREPB || command == Command::PREAB) return tRP; else if (command == Command::ACT) { @@ -141,10 +152,10 @@ sc_time MemSpecGDDR6::getExecutionTime(Command command, const tlm_generic_payloa return tWL + tWCK2CKPIN + tWCK2CK + tWCK2DQI + burstDuration; else if (command == Command::WRA) return tWL + burstDuration + tWR + tRP; - else if (command == Command::REFA) - return tRFC; - else if (command == Command::REFB) - return tRFCPB; + else if (command == Command::REFAB) + return tRFCab; + else if (command == Command::REFPB || command == Command::REFP2B) + return tRFCpb; else { SC_REPORT_FATAL("getExecutionTime", diff --git a/DRAMSys/library/src/configuration/memspec/MemSpecGDDR6.h b/DRAMSys/library/src/configuration/memspec/MemSpecGDDR6.h index a28308bb..8deb3605 100644 --- a/DRAMSys/library/src/configuration/memspec/MemSpecGDDR6.h +++ b/DRAMSys/library/src/configuration/memspec/MemSpecGDDR6.h @@ -70,9 +70,9 @@ public: const sc_core::sc_time tCKESR; const sc_core::sc_time tXP; const sc_core::sc_time tREFI; - const sc_core::sc_time tREFIPB; - const sc_core::sc_time tRFC; - const sc_core::sc_time tRFCPB; + const sc_core::sc_time tREFIpb; + const sc_core::sc_time tRFCab; + const sc_core::sc_time tRFCpb; const sc_core::sc_time tRREFD; const sc_core::sc_time tXS; const sc_core::sc_time tFAW; @@ -90,9 +90,14 @@ public: sc_core::sc_time getRefreshIntervalAB() const override; sc_core::sc_time getRefreshIntervalPB() const override; + sc_core::sc_time getRefreshIntervalP2B() const override; + unsigned getPer2BankOffset() const override; sc_core::sc_time getExecutionTime(Command command, const tlm::tlm_generic_payload &payload) const override; TimeInterval getIntervalOnDataStrobe(Command command, const tlm::tlm_generic_payload &payload) const override; + +private: + unsigned per2BankOffset; }; #endif // MEMSPECGDDR6_H diff --git a/DRAMSys/library/src/configuration/memspec/MemSpecHBM2.cpp b/DRAMSys/library/src/configuration/memspec/MemSpecHBM2.cpp index a07fa30f..0ca90c77 100644 --- a/DRAMSys/library/src/configuration/memspec/MemSpecHBM2.cpp +++ b/DRAMSys/library/src/configuration/memspec/MemSpecHBM2.cpp @@ -124,7 +124,7 @@ bool MemSpecHBM2::hasRasAndCasBus() const sc_time MemSpecHBM2::getExecutionTime(Command command, const tlm_generic_payload &payload) const { - if (command == Command::PRE || command == Command::PREA) + if (command == Command::PREPB || command == Command::PREAB) return tRP; else if (command == Command::ACT) { @@ -141,9 +141,9 @@ sc_time MemSpecHBM2::getExecutionTime(Command command, const tlm_generic_payload return tWL + burstDuration; else if (command == Command::WRA) return tWL + burstDuration + tWR + tRP; - else if (command == Command::REFA) + else if (command == Command::REFAB) return tRFC; - else if (command == Command::REFB) + else if (command == Command::REFPB) return tRFCSB; else { diff --git a/DRAMSys/library/src/configuration/memspec/MemSpecLPDDR4.cpp b/DRAMSys/library/src/configuration/memspec/MemSpecLPDDR4.cpp index 1e4c63b8..257936a0 100644 --- a/DRAMSys/library/src/configuration/memspec/MemSpecLPDDR4.cpp +++ b/DRAMSys/library/src/configuration/memspec/MemSpecLPDDR4.cpp @@ -86,14 +86,14 @@ MemSpecLPDDR4::MemSpecLPDDR4(json &memspec) tRTRS (tCK * parseUint(memspec["memtimingspec"], "RTRS")) { commandLengthInCycles[Command::ACT] = 4; - commandLengthInCycles[Command::PRE] = 2; - commandLengthInCycles[Command::PREA] = 2; + commandLengthInCycles[Command::PREPB] = 2; + commandLengthInCycles[Command::PREAB] = 2; commandLengthInCycles[Command::RD] = 4; commandLengthInCycles[Command::RDA] = 4; commandLengthInCycles[Command::WR] = 4; commandLengthInCycles[Command::WRA] = 4; - commandLengthInCycles[Command::REFA] = 2; - commandLengthInCycles[Command::REFB] = 2; + commandLengthInCycles[Command::REFAB] = 2; + commandLengthInCycles[Command::REFPB] = 2; commandLengthInCycles[Command::SREFEN] = 2; commandLengthInCycles[Command::SREFEX] = 2; @@ -128,9 +128,9 @@ sc_time MemSpecLPDDR4::getRefreshIntervalPB() const sc_time MemSpecLPDDR4::getExecutionTime(Command command, const tlm_generic_payload &) const { - if (command == Command::PRE) + if (command == Command::PREPB) return tRPpb + tCK; - else if (command == Command::PREA) + else if (command == Command::PREAB) return tRPab + tCK; else if (command == Command::ACT) return tRCD + 3 * tCK; @@ -142,9 +142,9 @@ sc_time MemSpecLPDDR4::getExecutionTime(Command command, const tlm_generic_paylo return tWL + tDQSS + tDQS2DQ + burstDuration + 3 * tCK; else if (command == Command::WRA) return tWL + 4 * tCK + burstDuration + tWR + tRPpb; - else if (command == Command::REFA) + else if (command == Command::REFAB) return tRFCab + tCK; - else if (command == Command::REFB) + else if (command == Command::REFPB) return tRFCpb + tCK; else { diff --git a/DRAMSys/library/src/configuration/memspec/MemSpecSTTMRAM.cpp b/DRAMSys/library/src/configuration/memspec/MemSpecSTTMRAM.cpp index f9b24fe9..fd042cad 100644 --- a/DRAMSys/library/src/configuration/memspec/MemSpecSTTMRAM.cpp +++ b/DRAMSys/library/src/configuration/memspec/MemSpecSTTMRAM.cpp @@ -101,7 +101,7 @@ MemSpecSTTMRAM::MemSpecSTTMRAM(json &memspec) // Returns the execution time for commands that have a fixed execution time sc_time MemSpecSTTMRAM::getExecutionTime(Command command, const tlm_generic_payload &) const { - if (command == Command::PRE || command == Command::PREA) + if (command == Command::PREPB || command == Command::PREAB) return tRP; else if (command == Command::ACT) return tRCD; diff --git a/DRAMSys/library/src/configuration/memspec/MemSpecWideIO.cpp b/DRAMSys/library/src/configuration/memspec/MemSpecWideIO.cpp index ede42e5c..d73657b4 100644 --- a/DRAMSys/library/src/configuration/memspec/MemSpecWideIO.cpp +++ b/DRAMSys/library/src/configuration/memspec/MemSpecWideIO.cpp @@ -126,7 +126,7 @@ sc_time MemSpecWideIO::getRefreshIntervalAB() const // Returns the execution time for commands that have a fixed execution time sc_time MemSpecWideIO::getExecutionTime(Command command, const tlm_generic_payload &) const { - if (command == Command::PRE || command == Command::PREA) + if (command == Command::PREPB || command == Command::PREAB) return tRP; else if (command == Command::ACT) return tRCD; @@ -138,7 +138,7 @@ sc_time MemSpecWideIO::getExecutionTime(Command command, const tlm_generic_paylo return tWL + burstDuration; else if (command == Command::WRA) return tWL + burstDuration - tCK + tWR + tRP; - else if (command == Command::REFA) + else if (command == Command::REFAB) return tRFC; else { diff --git a/DRAMSys/library/src/configuration/memspec/MemSpecWideIO2.cpp b/DRAMSys/library/src/configuration/memspec/MemSpecWideIO2.cpp index c7fab8bf..e2bb6749 100644 --- a/DRAMSys/library/src/configuration/memspec/MemSpecWideIO2.cpp +++ b/DRAMSys/library/src/configuration/memspec/MemSpecWideIO2.cpp @@ -113,9 +113,9 @@ sc_time MemSpecWideIO2::getRefreshIntervalPB() const // Returns the execution time for commands that have a fixed execution time sc_time MemSpecWideIO2::getExecutionTime(Command command, const tlm_generic_payload &) const { - if (command == Command::PRE) + if (command == Command::PREPB) return tRPpb; - else if (command == Command::PREA) + else if (command == Command::PREAB) return tRPab; else if (command == Command::ACT) return tRCD; @@ -127,9 +127,9 @@ sc_time MemSpecWideIO2::getExecutionTime(Command command, const tlm_generic_payl return tWL + tDQSS + burstDuration; else if (command == Command::WRA) return tWL + burstDuration + tCK + tWR + tRPpb; - else if (command == Command::REFA) + else if (command == Command::REFAB) return tRFCab; - else if (command == Command::REFB) + else if (command == Command::REFPB) return tRFCpb; else { diff --git a/DRAMSys/library/src/controller/BankMachine.cpp b/DRAMSys/library/src/controller/BankMachine.cpp index 307b23f4..867bdda5 100644 --- a/DRAMSys/library/src/controller/BankMachine.cpp +++ b/DRAMSys/library/src/controller/BankMachine.cpp @@ -63,7 +63,7 @@ void BankMachine::updateState(Command command) openRow = DramExtension::getRow(currentPayload); refreshManagementCounter++; break; - case Command::PRE: case Command::PREA: case Command::PRESB: + case Command::PREPB: case Command::PRESB: case Command::PREAB: state = State::Precharged; break; case Command::RD: case Command::WR: @@ -76,7 +76,7 @@ void BankMachine::updateState(Command command) case Command::PDEA: case Command::PDEP: case Command::SREFEN: sleeping = true; break; - case Command::REFA: case Command::REFB: case Command::REFSB: + case Command::REFPB: case Command::REFP2B: case Command::REFSB: case Command::REFAB: sleeping = false; blocked = false; @@ -88,7 +88,7 @@ void BankMachine::updateState(Command command) refreshManagementCounter = 0; } break; - case Command::RFMAB: case Command::RFMSB: + case Command::RFMPB: case Command::RFMP2B: case Command::RFMSB: case Command::RFMAB: sleeping = false; blocked = false; @@ -182,7 +182,7 @@ sc_time BankMachineOpen::start() SC_REPORT_FATAL("BankMachine", "Wrong TLM command"); } else // row miss - nextCommand = Command::PRE; + nextCommand = Command::PREPB; } timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, currentPayload); } @@ -259,7 +259,7 @@ sc_time BankMachineOpenAdaptive::start() } } else // row miss - nextCommand = Command::PRE; + nextCommand = Command::PREPB; } timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, currentPayload); } diff --git a/DRAMSys/library/src/controller/Command.cpp b/DRAMSys/library/src/controller/Command.cpp index 88cd6796..42d1121b 100644 --- a/DRAMSys/library/src/controller/Command.cpp +++ b/DRAMSys/library/src/controller/Command.cpp @@ -33,6 +33,7 @@ * Janik Schlemminger * Robert Gernhardt * Matthias Jung + * Lukas Steiner */ #include @@ -45,58 +46,65 @@ Command::Command(Command::Type type) : type(type) {} Command::Command(tlm_phase phase) { - assert(phase >= BEGIN_RD && phase <= END_SREF); + assert(phase >= BEGIN_NOP && phase <= END_SREF); static constexpr std::array commandOfPhase = - { - Command::RD, // 1 - Command::WR, // 2 - Command::RDA, // 3 - Command::WRA, // 4 - Command::ACT, // 5 - Command::PRE, // 6 - Command::REFB, // 7 - Command::PRESB, // 8 - Command::REFSB, // 9 - Command::RFMSB, // 10 - Command::PREA, // 11 - Command::REFA, // 12 - Command::RFMAB, // 13 - Command::PDEA, // 14 - Command::PDEP, // 15 - Command::SREFEN,// 16 - Command::PDXA, // 17 - Command::PDXP, // 18 - Command::SREFEX // 19 - }; - type = commandOfPhase[phase - BEGIN_RD]; + { + Command::NOP, // 0 + Command::RD, // 1 + Command::WR, // 2 + Command::RDA, // 3 + Command::WRA, // 4 + Command::ACT, // 5 + Command::PREPB, // 6 + Command::REFPB, // 7 + Command::RFMPB, // 8 + Command::REFP2B, // 9 + Command::RFMP2B, // 10 + Command::PRESB, // 11 + Command::REFSB, // 12 + Command::RFMSB, // 13 + Command::PREAB, // 14 + Command::REFAB, // 15 + Command::RFMAB, // 16 + Command::PDEA, // 17 + Command::PDEP, // 18 + Command::SREFEN, // 19 + Command::PDXA, // 20 + Command::PDXP, // 21 + Command::SREFEX // 22 + }; + type = commandOfPhase[phase - BEGIN_NOP]; } std::string Command::toString() const { assert(type >= Command::NOP && type <= Command::SREFEX); static std::array stringOfCommand = - { - "NOP", // 0 - "RD", // 1 - "WR", // 2 - "RDA", // 3 - "WRA", // 4 - "ACT", // 5 - "PRE", // 6 - "REFB", // 7 - "PRESB", // 8 - "REFSB", // 9 - "RFMSB", // 10 - "PREA", // 11 - "REFA", // 12 - "RFMAB", // 13 - "PDEA", // 14 - "PDEP", // 15 - "SREFEN", // 16 - "PDXA", // 17 - "PDXP", // 18 - "SREFEX" // 19 - }; + { + "NOP", // 0 + "RD", // 1 + "WR", // 2 + "RDA", // 3 + "WRA", // 4 + "ACT", // 5 + "PREPB", // 6 + "REFPB", // 7 + "RFMPB", // 8 + "REFP2B", // 9 + "RFMP2B", // 10 + "PRESB", // 11 + "REFSB", // 12 + "RFMSB", // 13 + "PREAB", // 14 + "REFAB", // 15 + "RFMAB", // 16 + "PDEA", // 17 + "PDEP", // 18 + "SREFEN", // 19 + "PDXA", // 20 + "PDXP", // 21 + "SREFEX" // 22 + }; return stringOfCommand[type]; } @@ -109,75 +117,88 @@ tlm_phase Command::toPhase() const { assert(type >= Command::NOP && type <= Command::SREFEX); static std::array phaseOfCommand = - { - UNINITIALIZED_PHASE, // 0 - BEGIN_RD, // 1 - BEGIN_WR, // 2 - BEGIN_RDA, // 3 - BEGIN_WRA, // 4 - BEGIN_ACT, // 5 - BEGIN_PRE, // 6 - BEGIN_REFB, // 7 - BEGIN_PRESB, // 8 - BEGIN_REFSB, // 9 - BEGIN_RFMSB, // 10 - BEGIN_PREA, // 11 - BEGIN_REFA, // 12 - BEGIN_RFMAB, // 13 - BEGIN_PDNA, // 14 - BEGIN_PDNP, // 15 - BEGIN_SREF, // 16 - END_PDNA, // 17 - END_PDNP, // 18 - END_SREF // 19 - }; + { + BEGIN_NOP, // 0 + BEGIN_RD, // 1 + BEGIN_WR, // 2 + BEGIN_RDA, // 3 + BEGIN_WRA, // 4 + BEGIN_ACT, // 5 + BEGIN_PREPB, // 6 + BEGIN_REFPB, // 7 + BEGIN_RFMPB, // 8 + BEGIN_REFP2B, // 9 + BEGIN_RFMP2B, // 10 + BEGIN_PRESB, // 11 + BEGIN_REFSB, // 12 + BEGIN_RFMSB, // 13 + BEGIN_PREAB, // 14 + BEGIN_REFAB, // 15 + BEGIN_RFMAB, // 16 + BEGIN_PDNA, // 17 + BEGIN_PDNP, // 18 + BEGIN_SREF, // 19 + END_PDNA, // 20 + END_PDNP, // 21 + END_SREF // 22 + }; return phaseOfCommand[type]; } MemCommand::cmds phaseToDRAMPowerCommand(tlm_phase phase) { // TODO: add correct phases when DRAMPower supports DDR5 same bank refresh - assert(phase >= BEGIN_RD && phase <= END_SREF); + assert(phase >= BEGIN_NOP && phase <= END_SREF); static std::array phaseOfCommand = - { - MemCommand::RD, // 1 - MemCommand::WR, // 2 - MemCommand::RDA, // 3 - MemCommand::WRA, // 4 - MemCommand::ACT, // 5 - MemCommand::PRE, // 6 - MemCommand::REFB, // 7 - MemCommand::NOP, // 8 - MemCommand::NOP, // 9 - MemCommand::NOP, // 10 - MemCommand::PREA, // 11 - MemCommand::REF, // 12 - MemCommand::NOP, // 13 - MemCommand::PDN_S_ACT, // 14 - MemCommand::PDN_S_PRE, // 15 - MemCommand::SREN, // 16 - MemCommand::PUP_ACT, // 17 - MemCommand::PUP_PRE, // 18 - MemCommand::SREX // 19 - }; - return phaseOfCommand[phase - BEGIN_RD]; + { + MemCommand::NOP, // 0 + MemCommand::RD, // 1 + MemCommand::WR, // 2 + MemCommand::RDA, // 3 + MemCommand::WRA, // 4 + MemCommand::ACT, // 5 + MemCommand::PRE, // 6, PREPB + MemCommand::REFB, // 7, REFPB + MemCommand::NOP, // 8, RFMPB + MemCommand::NOP, // 9, REFP2B + MemCommand::NOP, // 10, RFMP2B + MemCommand::NOP, // 11, PRESB + MemCommand::NOP, // 12, REFSB + MemCommand::NOP, // 13, RFMSB + MemCommand::PREA, // 14, PREAB + MemCommand::REF, // 15, REFAB + MemCommand::NOP, // 16, RFMAB + MemCommand::PDN_S_ACT, // 17 + MemCommand::PDN_S_PRE, // 18 + MemCommand::SREN, // 19 + MemCommand::PUP_ACT, // 20 + MemCommand::PUP_PRE, // 21 + MemCommand::SREX // 22 + }; + return phaseOfCommand[phase - BEGIN_NOP]; } bool phaseNeedsEnd(tlm_phase phase) { - return (phase >= BEGIN_RD && phase <= BEGIN_RFMAB); + return (phase >= BEGIN_NOP && phase <= BEGIN_RFMAB); } tlm_phase getEndPhase(tlm_phase phase) { - assert(phase >= BEGIN_RD && phase <= BEGIN_RFMAB); - return (phase + Command::Type::END_ENUM - 1); + assert(phase >= BEGIN_NOP && phase <= BEGIN_RFMAB); + return (phase + Command::Type::END_ENUM); } bool Command::isBankCommand() const { assert(type >= Command::NOP && type <= Command::SREFEX); - return (type <= Command::REFB); + return (type <= Command::RFMPB); +} + +bool Command::is2BankCommand() const +{ + assert(type >= Command::NOP && type <= Command::SREFEX); + return (type >= Command::REFP2B && type <= Command::RFMP2B); } bool Command::isGroupCommand() const @@ -189,7 +210,7 @@ bool Command::isGroupCommand() const bool Command::isRankCommand() const { assert(type >= Command::NOP && type <= Command::SREFEX); - return (type >= Command::PREA); + return (type >= Command::PREAB); } bool Command::isCasCommand() const diff --git a/DRAMSys/library/src/controller/Command.h b/DRAMSys/library/src/controller/Command.h index 62bcb3d2..c84f82ff 100644 --- a/DRAMSys/library/src/controller/Command.h +++ b/DRAMSys/library/src/controller/Command.h @@ -32,6 +32,7 @@ * Authors: * Janik Schlemminger * Matthias Jung + * Lukas Steiner */ #ifndef COMMAND_H #define COMMAND_H @@ -46,72 +47,83 @@ // DO NOT CHANGE THE ORDER! -// BEGIN_REQ // 1 -// END_REQ // 2 -// BEGIN_RESP // 3 -// END_RESP // 4 +// BEGIN_REQ // 1 +// END_REQ // 2 +// BEGIN_RESP // 3 +// END_RESP // 4 -DECLARE_EXTENDED_PHASE(BEGIN_RD); // 5 -DECLARE_EXTENDED_PHASE(BEGIN_WR); // 6 -DECLARE_EXTENDED_PHASE(BEGIN_RDA); // 7 -DECLARE_EXTENDED_PHASE(BEGIN_WRA); // 8 -DECLARE_EXTENDED_PHASE(BEGIN_ACT); // 9 -DECLARE_EXTENDED_PHASE(BEGIN_PRE); // 10 -DECLARE_EXTENDED_PHASE(BEGIN_REFB); // 11 -DECLARE_EXTENDED_PHASE(BEGIN_PRESB); // 12 -DECLARE_EXTENDED_PHASE(BEGIN_REFSB); // 13 -DECLARE_EXTENDED_PHASE(BEGIN_RFMSB); // 14 -DECLARE_EXTENDED_PHASE(BEGIN_PREA); // 15 -DECLARE_EXTENDED_PHASE(BEGIN_REFA); // 16 -DECLARE_EXTENDED_PHASE(BEGIN_RFMAB); // 17 -DECLARE_EXTENDED_PHASE(BEGIN_PDNA); // 18 -DECLARE_EXTENDED_PHASE(BEGIN_PDNP); // 19 -DECLARE_EXTENDED_PHASE(BEGIN_SREF); // 20 +DECLARE_EXTENDED_PHASE(BEGIN_NOP); // 5 +DECLARE_EXTENDED_PHASE(BEGIN_RD); // 6 +DECLARE_EXTENDED_PHASE(BEGIN_WR); // 7 +DECLARE_EXTENDED_PHASE(BEGIN_RDA); // 8 +DECLARE_EXTENDED_PHASE(BEGIN_WRA); // 9 +DECLARE_EXTENDED_PHASE(BEGIN_ACT); // 10 +DECLARE_EXTENDED_PHASE(BEGIN_PREPB); // 11 +DECLARE_EXTENDED_PHASE(BEGIN_REFPB); // 12 +DECLARE_EXTENDED_PHASE(BEGIN_RFMPB); // 13 +DECLARE_EXTENDED_PHASE(BEGIN_REFP2B); // 14 +DECLARE_EXTENDED_PHASE(BEGIN_RFMP2B); // 15 +DECLARE_EXTENDED_PHASE(BEGIN_PRESB); // 16 +DECLARE_EXTENDED_PHASE(BEGIN_REFSB); // 17 +DECLARE_EXTENDED_PHASE(BEGIN_RFMSB); // 18 +DECLARE_EXTENDED_PHASE(BEGIN_PREAB); // 19 +DECLARE_EXTENDED_PHASE(BEGIN_REFAB); // 20 +DECLARE_EXTENDED_PHASE(BEGIN_RFMAB); // 21 +DECLARE_EXTENDED_PHASE(BEGIN_PDNA); // 22 +DECLARE_EXTENDED_PHASE(BEGIN_PDNP); // 23 +DECLARE_EXTENDED_PHASE(BEGIN_SREF); // 24 -DECLARE_EXTENDED_PHASE(END_PDNA); // 21 -DECLARE_EXTENDED_PHASE(END_PDNP); // 22 -DECLARE_EXTENDED_PHASE(END_SREF); // 23 +DECLARE_EXTENDED_PHASE(END_PDNA); // 25 +DECLARE_EXTENDED_PHASE(END_PDNP); // 26 +DECLARE_EXTENDED_PHASE(END_SREF); // 27 -DECLARE_EXTENDED_PHASE(END_RD); // 24 -DECLARE_EXTENDED_PHASE(END_WR); // 25 -DECLARE_EXTENDED_PHASE(END_RDA); // 26 -DECLARE_EXTENDED_PHASE(END_WRA); // 27 -DECLARE_EXTENDED_PHASE(END_ACT); // 28 -DECLARE_EXTENDED_PHASE(END_PRE); // 29 -DECLARE_EXTENDED_PHASE(END_REFB); // 30 -DECLARE_EXTENDED_PHASE(END_PRESB); // 31 -DECLARE_EXTENDED_PHASE(END_REFSB); // 32 -DECLARE_EXTENDED_PHASE(END_RFMSB); // 33 -DECLARE_EXTENDED_PHASE(END_PREA); // 34 -DECLARE_EXTENDED_PHASE(END_REFA); // 35 -DECLARE_EXTENDED_PHASE(END_RFMAB); // 36 +DECLARE_EXTENDED_PHASE(END_NOP); // 28 +DECLARE_EXTENDED_PHASE(END_RD); // 29 +DECLARE_EXTENDED_PHASE(END_WR); // 30 +DECLARE_EXTENDED_PHASE(END_RDA); // 31 +DECLARE_EXTENDED_PHASE(END_WRA); // 32 +DECLARE_EXTENDED_PHASE(END_ACT); // 33 +DECLARE_EXTENDED_PHASE(END_PREPB); // 34 +DECLARE_EXTENDED_PHASE(END_REFPB); // 35 +DECLARE_EXTENDED_PHASE(END_RFMPB); // 36 +DECLARE_EXTENDED_PHASE(END_REFP2B); // 37 +DECLARE_EXTENDED_PHASE(END_RFMP2B); // 38 +DECLARE_EXTENDED_PHASE(END_PRESB); // 39 +DECLARE_EXTENDED_PHASE(END_REFSB); // 40 +DECLARE_EXTENDED_PHASE(END_RFMSB); // 41 +DECLARE_EXTENDED_PHASE(END_PREAB); // 42 +DECLARE_EXTENDED_PHASE(END_REFAB); // 43 +DECLARE_EXTENDED_PHASE(END_RFMAB); // 44 class Command { public: enum Type : uint8_t { - NOP, // 0 + NOP = 0, // 0 RD, // 1 WR, // 2 RDA, // 3 WRA, // 4 ACT, // 5 - PRE, // 6 - REFB, // 7 - PRESB, // 8 - REFSB, // 9 - RFMSB, // 10 - PREA, // 11 - REFA, // 12 - RFMAB, // 13 - PDEA, // 14 - PDEP, // 15 - SREFEN, // 16 - PDXA, // 17 - PDXP, // 18 - SREFEX, // 19 - END_ENUM // To mark the end of this enumeration + PREPB, // 6 + REFPB, // 7 + RFMPB, // 8 + REFP2B, // 9 + RFMP2B, // 10 + PRESB, // 11 + REFSB, // 12 + RFMSB, // 13 + PREAB, // 14 + REFAB, // 15 + RFMAB, // 16 + PDEA, // 17 + PDEP, // 18 + SREFEN, // 19 + PDXA, // 20 + PDXP, // 21 + SREFEX, // 22 + END_ENUM // 23, To mark the end of this enumeration }; private: @@ -126,6 +138,7 @@ public: tlm::tlm_phase toPhase() const; static unsigned numberOfCommands(); bool isBankCommand() const; + bool is2BankCommand() const; bool isGroupCommand() const; bool isRankCommand() const; bool isCasCommand() const; diff --git a/DRAMSys/library/src/controller/Controller.cpp b/DRAMSys/library/src/controller/Controller.cpp index 7bc13b71..b15feb12 100644 --- a/DRAMSys/library/src/controller/Controller.cpp +++ b/DRAMSys/library/src/controller/Controller.cpp @@ -265,12 +265,12 @@ void Controller::controllerMethod() readyCommands.emplace_back(commandTuple); else { - // (4.2) Check for refresh commands (PREA/PRE or REFA/REFB/...) + // (4.2) Check for refresh commands (PREXX or REFXX) commandTuple = refreshManagers[rankID]->getNextCommand(); if (std::get(commandTuple) != Command::NOP) readyCommands.emplace_back(commandTuple); - // (4.3) Check for bank commands (PRE, ACT, RD/RDA or WR/WRA) + // (4.3) Check for bank commands (PREPB, ACT, RD/RDA or WR/WRA) for (auto it : bankMachinesOnRank[rankID]) { commandTuple = it->getNextCommand(); diff --git a/DRAMSys/library/src/controller/checker/CheckerDDR3.cpp b/DRAMSys/library/src/controller/checker/CheckerDDR3.cpp index 1c8456f5..125c6cbf 100644 --- a/DRAMSys/library/src/controller/checker/CheckerDDR3.cpp +++ b/DRAMSys/library/src/controller/checker/CheckerDDR3.cpp @@ -190,11 +190,11 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -206,7 +206,7 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); @@ -217,7 +217,7 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (last4Activates[rank.ID()].size() >= 4) earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); } - else if (command == Command::PRE) + else if (command == Command::PREPB) { lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; if (lastCommandStart != sc_max_time()) @@ -235,7 +235,7 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } - else if (command == Command::PREA) + else if (command == Command::PREAB) { lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; if (lastCommandStart != sc_max_time()) @@ -261,7 +261,7 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } - else if (command == Command::REFA) + else if (command == Command::REFAB) { lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; if (lastCommandStart != sc_max_time()) @@ -275,11 +275,11 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -287,7 +287,7 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); @@ -317,7 +317,7 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN); @@ -345,11 +345,11 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN); @@ -357,7 +357,7 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFPDEN); @@ -385,11 +385,11 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRP)); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -397,7 +397,7 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); diff --git a/DRAMSys/library/src/controller/checker/CheckerDDR4.cpp b/DRAMSys/library/src/controller/checker/CheckerDDR4.cpp index b1646e43..47b151c7 100644 --- a/DRAMSys/library/src/controller/checker/CheckerDDR4.cpp +++ b/DRAMSys/library/src/controller/checker/CheckerDDR4.cpp @@ -222,11 +222,11 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -238,7 +238,7 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); @@ -249,7 +249,7 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (last4Activates[rank.ID()].size() >= 4) earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); } - else if (command == Command::PRE) + else if (command == Command::PREPB) { lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; if (lastCommandStart != sc_max_time()) @@ -267,7 +267,7 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } - else if (command == Command::PREA) + else if (command == Command::PREAB) { lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; if (lastCommandStart != sc_max_time()) @@ -293,7 +293,7 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } - else if (command == Command::REFA) + else if (command == Command::REFAB) { lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; if (lastCommandStart != sc_max_time()) @@ -307,11 +307,11 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -319,7 +319,7 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); @@ -349,7 +349,7 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN); @@ -377,11 +377,11 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN); @@ -389,7 +389,7 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFPDEN); @@ -417,11 +417,11 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRP)); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -429,7 +429,7 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); diff --git a/DRAMSys/library/src/controller/checker/CheckerDDR5.cpp b/DRAMSys/library/src/controller/checker/CheckerDDR5.cpp index f7758832..cb9b80b5 100644 --- a/DRAMSys/library/src/controller/checker/CheckerDDR5.cpp +++ b/DRAMSys/library/src/controller/checker/CheckerDDR5.cpp @@ -125,6 +125,7 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo Bank bank = DramExtension::getBank(payload); Bank bankInGroup = Bank(logicalRank.ID() * memSpec->banksPerGroup + bank.ID() % memSpec->banksPerGroup); unsigned burstLength = DramExtension::getBurstLength(payload); + assert(!(burstLength == 32) || (memSpec->bitWidth == 4)); sc_time lastCommandStart; sc_time earliestTimeToStart = sc_time_stamp(); @@ -542,11 +543,11 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAACT); } - lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREA][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREAB][logicalRank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - cmdLengthDiff); @@ -554,7 +555,7 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFA][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr - cmdLengthDiff); @@ -562,7 +563,7 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr - cmdLengthDiff); - // TODO: No tRFC_dlr and tRFC_dpr between REFA and ACT? + // TODO: No tRFC_dlr and tRFC_dpr between REFAB and ACT? lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::REFSB][bankInGroup.ID()]; if (lastCommandStart != sc_max_time()) @@ -598,7 +599,7 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesPhysical[physicalRank.ID()].front() + memSpec->tFAW_dlr - memSpec->longCmdOffset); } - else if (command == Command::PRE) + else if (command == Command::PREPB) { lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; if (lastCommandStart != sc_max_time()) @@ -617,11 +618,11 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + cmdLengthDiff); } - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PRE][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREA][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREAB][physicalRank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); @@ -629,7 +630,7 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); } - else if (command == Command::PREA) + else if (command == Command::PREAB) { lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank.ID()]; if (lastCommandStart != sc_max_time()) @@ -661,11 +662,11 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + cmdLengthDiff); } - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PRE][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREA][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREAB][physicalRank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); @@ -703,7 +704,7 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + cmdLengthDiff); } - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PRE][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); @@ -713,7 +714,7 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); } - else if (command == Command::REFA || command == Command::RFMAB) + else if (command == Command::REFAB || command == Command::RFMAB) { lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank.ID()]; if (lastCommandStart != sc_max_time()) @@ -732,23 +733,23 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP + cmdLengthDiff); } - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PRE][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREPB][logicalRank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREA][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREAB][logicalRank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFA][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFA][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFAB][physicalRank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dlr); - lastCommandStart = lastScheduledByCommandAndDimmRank[Command::REFA][dimmRank.ID()]; + lastCommandStart = lastScheduledByCommandAndDimmRank[Command::REFAB][dimmRank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dpr); @@ -790,7 +791,7 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAACT + cmdLengthDiff); } - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PRE][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PREPB][bankInGroup.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -800,17 +801,17 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFA][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr); // TODO: check this - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFA][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFAB][physicalRank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dlr); // TODO: check this - lastCommandStart = lastScheduledByCommandAndDimmRank[Command::REFA][dimmRank.ID()]; + lastCommandStart = lastScheduledByCommandAndDimmRank[Command::REFAB][dimmRank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dpr); diff --git a/DRAMSys/library/src/controller/checker/CheckerGDDR5.cpp b/DRAMSys/library/src/controller/checker/CheckerGDDR5.cpp index 32844894..eea58b9c 100644 --- a/DRAMSys/library/src/controller/checker/CheckerGDDR5.cpp +++ b/DRAMSys/library/src/controller/checker/CheckerGDDR5.cpp @@ -223,11 +223,11 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -239,15 +239,15 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); @@ -261,7 +261,7 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl if (last32Activates[rank.ID()].size() >= 32) earliestTimeToStart = std::max(earliestTimeToStart, last32Activates[rank.ID()].front() + memSpec->t32AW); } - else if (command == Command::PRE) + else if (command == Command::PREPB) { lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; if (lastCommandStart != sc_max_time()) @@ -275,7 +275,7 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); @@ -283,7 +283,7 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN); } - else if (command == Command::PREA) + else if (command == Command::PREAB) { lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; if (lastCommandStart != sc_max_time()) @@ -305,7 +305,7 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); @@ -313,11 +313,11 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); } - else if (command == Command::REFA) + else if (command == Command::REFAB) { lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; if (lastCommandStart != sc_max_time()) @@ -331,11 +331,11 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -343,11 +343,11 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); @@ -355,7 +355,7 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } - else if (command == Command::REFB) + else if (command == Command::REFPB) { lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; if (lastCommandStart != sc_max_time()) @@ -377,11 +377,11 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -393,15 +393,15 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) { if (bankwiseRefreshCounter[rank.ID()] == 0) @@ -494,11 +494,11 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -506,11 +506,11 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); @@ -549,7 +549,7 @@ void CheckerGDDR5::insert(Command command, tlm_generic_payload *payload) lastScheduledByCommand[command] = sc_time_stamp(); lastCommandOnBus = sc_time_stamp(); - if (command == Command::ACT || command == Command::REFB) + if (command == Command::ACT || command == Command::REFPB) { if (last4Activates[rank.ID()].size() == 4) last4Activates[rank.ID()].pop(); @@ -560,6 +560,6 @@ void CheckerGDDR5::insert(Command command, tlm_generic_payload *payload) last32Activates[rank.ID()].push(lastCommandOnBus); } - if (command == Command::REFB) + if (command == Command::REFPB) bankwiseRefreshCounter[rank.ID()] = (bankwiseRefreshCounter[rank.ID()] + 1) % memSpec->banksPerRank; } diff --git a/DRAMSys/library/src/controller/checker/CheckerGDDR5X.cpp b/DRAMSys/library/src/controller/checker/CheckerGDDR5X.cpp index 3181b89b..4f63a8da 100644 --- a/DRAMSys/library/src/controller/checker/CheckerGDDR5X.cpp +++ b/DRAMSys/library/src/controller/checker/CheckerGDDR5X.cpp @@ -223,11 +223,11 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -239,15 +239,15 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); @@ -261,7 +261,7 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay if (last32Activates[rank.ID()].size() >= 32) earliestTimeToStart = std::max(earliestTimeToStart, last32Activates[rank.ID()].front() + memSpec->t32AW); } - else if (command == Command::PRE) + else if (command == Command::PREPB) { lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; if (lastCommandStart != sc_max_time()) @@ -275,7 +275,7 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); @@ -283,7 +283,7 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } - else if (command == Command::PREA) + else if (command == Command::PREAB) { lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; if (lastCommandStart != sc_max_time()) @@ -305,7 +305,7 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); @@ -313,11 +313,11 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); } - else if (command == Command::REFA) + else if (command == Command::REFAB) { lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; if (lastCommandStart != sc_max_time()) @@ -331,11 +331,11 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -343,11 +343,11 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); @@ -355,7 +355,7 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } - else if (command == Command::REFB) + else if (command == Command::REFPB) { lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; if (lastCommandStart != sc_max_time()) @@ -377,11 +377,11 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -393,15 +393,15 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) { if (bankwiseRefreshCounter[rank.ID()] == 0) @@ -494,11 +494,11 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -506,11 +506,11 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); @@ -549,7 +549,7 @@ void CheckerGDDR5X::insert(Command command, tlm_generic_payload *payload) lastScheduledByCommand[command] = sc_time_stamp(); lastCommandOnBus = sc_time_stamp(); - if (command == Command::ACT || command == Command::REFB) + if (command == Command::ACT || command == Command::REFPB) { if (last4Activates[rank.ID()].size() == 4) last4Activates[rank.ID()].pop(); @@ -560,6 +560,6 @@ void CheckerGDDR5X::insert(Command command, tlm_generic_payload *payload) last32Activates[rank.ID()].push(lastCommandOnBus); } - if (command == Command::REFB) + if (command == Command::REFPB) bankwiseRefreshCounter[rank.ID()] = (bankwiseRefreshCounter[rank.ID()] + 1) % memSpec->banksPerRank; } diff --git a/DRAMSys/library/src/controller/checker/CheckerGDDR6.cpp b/DRAMSys/library/src/controller/checker/CheckerGDDR6.cpp index a6c9a8c9..212982a6 100644 --- a/DRAMSys/library/src/controller/checker/CheckerGDDR6.cpp +++ b/DRAMSys/library/src/controller/checker/CheckerGDDR6.cpp @@ -222,11 +222,11 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -238,15 +238,15 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; if (lastCommandStart != sc_max_time()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); @@ -257,7 +257,7 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl if (last4Activates[rank.ID()].size() >= 4) earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); } - else if (command == Command::PRE) + else if (command == Command::PREPB) { lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; if (lastCommandStart != sc_max_time()) @@ -271,7 +271,7 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); @@ -279,7 +279,7 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } - else if (command == Command::PREA) + else if (command == Command::PREAB) { lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; if (lastCommandStart != sc_max_time()) @@ -301,7 +301,7 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); @@ -309,11 +309,11 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); } - else if (command == Command::REFA) + else if (command == Command::REFAB) { lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; if (lastCommandStart != sc_max_time()) @@ -327,11 +327,11 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -339,19 +339,19 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } - else if (command == Command::REFB) + else if (command == Command::REFPB) { lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; if (lastCommandStart != sc_max_time()) @@ -373,11 +373,11 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -389,19 +389,19 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; if (lastCommandStart != sc_max_time()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) { if (bankwiseRefreshCounter[rank.ID()] == 0) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); } @@ -435,11 +435,11 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPREPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFPDE); @@ -467,19 +467,19 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPREPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPREPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFPDE); @@ -515,11 +515,11 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -527,13 +527,13 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; if (lastCommandStart != sc_max_time()) @@ -570,13 +570,13 @@ void CheckerGDDR6::insert(Command command, tlm_generic_payload *payload) lastScheduledByCommand[command] = sc_time_stamp(); lastCommandOnBus = sc_time_stamp(); - if (command == Command::ACT || command == Command::REFB) + if (command == Command::ACT || command == Command::REFPB) { if (last4Activates[rank.ID()].size() == 4) last4Activates[rank.ID()].pop(); last4Activates[rank.ID()].push(lastCommandOnBus); } - if (command == Command::REFB) + if (command == Command::REFPB) bankwiseRefreshCounter[rank.ID()] = (bankwiseRefreshCounter[rank.ID()] + 1) % memSpec->banksPerRank; } diff --git a/DRAMSys/library/src/controller/checker/CheckerHBM2.cpp b/DRAMSys/library/src/controller/checker/CheckerHBM2.cpp index 7f479656..c5866453 100644 --- a/DRAMSys/library/src/controller/checker/CheckerHBM2.cpp +++ b/DRAMSys/library/src/controller/checker/CheckerHBM2.cpp @@ -187,11 +187,11 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - memSpec->tCK); @@ -203,15 +203,15 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCSB - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD - memSpec->tCK); @@ -224,7 +224,7 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } - else if (command == Command::PRE) + else if (command == Command::PREPB) { lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; if (lastCommandStart != sc_max_time()) @@ -244,7 +244,7 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } - else if (command == Command::PREA) + else if (command == Command::PREAB) { lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; if (lastCommandStart != sc_max_time()) @@ -270,13 +270,13 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCSB); earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } - else if (command == Command::REFA) + else if (command == Command::REFAB) { lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; if (lastCommandStart != sc_max_time()) @@ -290,11 +290,11 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -302,11 +302,11 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCSB); @@ -316,7 +316,7 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } - else if (command == Command::REFB) + else if (command == Command::REFPB) { lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; if (lastCommandStart != sc_max_time()) @@ -338,11 +338,11 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -354,15 +354,15 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCSB); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) { if (bankwiseRefreshCounter[rank.ID()] == 0) @@ -458,11 +458,11 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommand[Command::PRE]; + lastCommandStart = lastScheduledByCommand[Command::PREPB]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommand[Command::PREA]; + lastCommandStart = lastScheduledByCommand[Command::PREAB]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -470,11 +470,11 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommand[Command::REFA]; + lastCommandStart = lastScheduledByCommand[Command::REFAB]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommand[Command::REFB]; + lastCommandStart = lastScheduledByCommand[Command::REFPB]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCSB); @@ -530,13 +530,13 @@ void CheckerHBM2::insert(Command command, tlm_generic_payload *payload) else lastCommandOnRasBus = sc_time_stamp(); - if (command == Command::ACT || command == Command::REFB) + if (command == Command::ACT || command == Command::REFPB) { if (last4Activates[rank.ID()].size() == 4) last4Activates[rank.ID()].pop(); last4Activates[rank.ID()].push(lastCommandOnRasBus); } - if (command == Command::REFB) + if (command == Command::REFPB) bankwiseRefreshCounter[rank.ID()] = (bankwiseRefreshCounter[rank.ID()] + 1) % memSpec->banksPerRank; } diff --git a/DRAMSys/library/src/controller/checker/CheckerLPDDR4.cpp b/DRAMSys/library/src/controller/checker/CheckerLPDDR4.cpp index 54e6fdf2..47cef996 100644 --- a/DRAMSys/library/src/controller/checker/CheckerLPDDR4.cpp +++ b/DRAMSys/library/src/controller/checker/CheckerLPDDR4.cpp @@ -188,11 +188,11 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAACT); - lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb - 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab - 2 * memSpec->tCK); @@ -204,15 +204,15 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab - 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb - 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD - 2 * memSpec->tCK); @@ -223,7 +223,7 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay if (last4Activates[rank.ID()].size() >= 4) earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW - 3 * memSpec->tCK); } - else if (command == Command::PRE) + else if (command == Command::PREPB) { lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; if (lastCommandStart != sc_max_time()) @@ -237,7 +237,7 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); @@ -245,7 +245,7 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } - else if (command == Command::PREA) + else if (command == Command::PREAB) { lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; if (lastCommandStart != sc_max_time()) @@ -267,7 +267,7 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); @@ -275,11 +275,11 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); } - else if (command == Command::REFA) + else if (command == Command::REFAB) { lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; if (lastCommandStart != sc_max_time()) @@ -293,11 +293,11 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); @@ -305,11 +305,11 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); @@ -317,7 +317,7 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); } - else if (command == Command::REFB) + else if (command == Command::REFPB) { lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; if (lastCommandStart != sc_max_time()) @@ -335,11 +335,11 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); @@ -351,11 +351,11 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); @@ -388,11 +388,11 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tREFPDEN); @@ -420,19 +420,19 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tREFPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tREFPDEN); @@ -464,11 +464,11 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRPpb)); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); @@ -476,11 +476,11 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); @@ -518,7 +518,7 @@ void CheckerLPDDR4::insert(Command command, tlm_generic_payload *payload) lastCommandOnBus = sc_time_stamp() + memSpec->getCommandLength(command) - memSpec->tCK; - if (command == Command::ACT || command == Command::REFB) + if (command == Command::ACT || command == Command::REFPB) { if (last4Activates[rank.ID()].size() == 4) last4Activates[rank.ID()].pop(); diff --git a/DRAMSys/library/src/controller/checker/CheckerSTTMRAM.cpp b/DRAMSys/library/src/controller/checker/CheckerSTTMRAM.cpp index 623cd6b0..b572c4d3 100644 --- a/DRAMSys/library/src/controller/checker/CheckerSTTMRAM.cpp +++ b/DRAMSys/library/src/controller/checker/CheckerSTTMRAM.cpp @@ -192,11 +192,11 @@ sc_time CheckerSTTMRAM::timeToSatisfyConstraints(Command command, tlm_generic_pa if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -215,7 +215,7 @@ sc_time CheckerSTTMRAM::timeToSatisfyConstraints(Command command, tlm_generic_pa if (last4Activates[rank.ID()].size() >= 4) earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); } - else if (command == Command::PRE) + else if (command == Command::PREPB) { lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; if (lastCommandStart != sc_max_time()) @@ -233,7 +233,7 @@ sc_time CheckerSTTMRAM::timeToSatisfyConstraints(Command command, tlm_generic_pa if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } - else if (command == Command::PREA) + else if (command == Command::PREAB) { lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; if (lastCommandStart != sc_max_time()) @@ -281,7 +281,7 @@ sc_time CheckerSTTMRAM::timeToSatisfyConstraints(Command command, tlm_generic_pa if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN); @@ -309,11 +309,11 @@ sc_time CheckerSTTMRAM::timeToSatisfyConstraints(Command command, tlm_generic_pa if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN); @@ -345,11 +345,11 @@ sc_time CheckerSTTMRAM::timeToSatisfyConstraints(Command command, tlm_generic_pa if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRP)); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); diff --git a/DRAMSys/library/src/controller/checker/CheckerWideIO.cpp b/DRAMSys/library/src/controller/checker/CheckerWideIO.cpp index bae5a9fa..c7c526aa 100644 --- a/DRAMSys/library/src/controller/checker/CheckerWideIO.cpp +++ b/DRAMSys/library/src/controller/checker/CheckerWideIO.cpp @@ -182,15 +182,15 @@ sc_time CheckerWideIO::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); @@ -209,7 +209,7 @@ sc_time CheckerWideIO::timeToSatisfyConstraints(Command command, tlm_generic_pay if (last2Activates[rank.ID()].size() >= 2) earliestTimeToStart = std::max(earliestTimeToStart, last2Activates[rank.ID()].front() + memSpec->tTAW); } - else if (command == Command::PRE) + else if (command == Command::PREPB) { lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; if (lastCommandStart != sc_max_time()) @@ -227,7 +227,7 @@ sc_time CheckerWideIO::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } - else if (command == Command::PREA) + else if (command == Command::PREAB) { lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; if (lastCommandStart != sc_max_time()) @@ -253,7 +253,7 @@ sc_time CheckerWideIO::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } - else if (command == Command::REFA) + else if (command == Command::REFAB) { lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; if (lastCommandStart != sc_max_time()) @@ -267,15 +267,15 @@ sc_time CheckerWideIO::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); @@ -357,11 +357,11 @@ sc_time CheckerWideIO::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRP)); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -369,7 +369,7 @@ sc_time CheckerWideIO::timeToSatisfyConstraints(Command command, tlm_generic_pay if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); diff --git a/DRAMSys/library/src/controller/checker/CheckerWideIO2.cpp b/DRAMSys/library/src/controller/checker/CheckerWideIO2.cpp index eee56d31..48cb04f6 100644 --- a/DRAMSys/library/src/controller/checker/CheckerWideIO2.cpp +++ b/DRAMSys/library/src/controller/checker/CheckerWideIO2.cpp @@ -183,11 +183,11 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); @@ -199,15 +199,15 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD); @@ -218,7 +218,7 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa if (last4Activates[rank.ID()].size() >= 4) earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); } - else if (command == Command::PRE) + else if (command == Command::PREPB) { lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; if (lastCommandStart != sc_max_time()) @@ -232,7 +232,7 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + 2 * memSpec->tCK); @@ -240,7 +240,7 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } - else if (command == Command::PREA) + else if (command == Command::PREAB) { lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; if (lastCommandStart != sc_max_time()) @@ -262,7 +262,7 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + 2 * memSpec->tCK); @@ -270,11 +270,11 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); } - else if(command == Command::REFA) + else if(command == Command::REFAB) { lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; if (lastCommandStart != sc_max_time()) @@ -288,11 +288,11 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); @@ -300,11 +300,11 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); @@ -312,7 +312,7 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); } - else if(command == Command::REFB) + else if(command == Command::REFPB) { lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; if (lastCommandStart != sc_max_time()) @@ -330,11 +330,11 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); @@ -346,11 +346,11 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); @@ -431,11 +431,11 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRPpb)); - lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); @@ -443,11 +443,11 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != sc_max_time()) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); @@ -484,7 +484,7 @@ void CheckerWideIO2::insert(Command command, tlm_generic_payload *payload) lastScheduledByCommand[command] = sc_time_stamp(); lastCommandOnBus = sc_time_stamp(); - if (command == Command::ACT || command == Command::REFB) + if (command == Command::ACT || command == Command::REFPB) { if (last4Activates[rank.ID()].size() == 4) last4Activates[rank.ID()].pop(); diff --git a/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.cpp b/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.cpp index b7a36bb1..bd9cb653 100644 --- a/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.cpp +++ b/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.cpp @@ -90,7 +90,7 @@ sc_time PowerDownManagerStaggered::start() else if (state == State::SelfRefresh) nextCommand = Command::SREFEX; else if (state == State::ExtraRefresh) - nextCommand = Command::REFA; + nextCommand = Command::REFAB; timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, &powerDownPayload); } @@ -147,7 +147,7 @@ void PowerDownManagerStaggered::updateState(Command command) case Command::SREFEX: state = State::ExtraRefresh; break; - case Command::REFA: + case Command::REFAB: if (state == State::ExtraRefresh) { state = State::Idle; @@ -156,7 +156,7 @@ void PowerDownManagerStaggered::updateState(Command command) else if (controllerIdle) entryTriggered = true; break; - case Command::REFB: + case Command::REFPB: case Command::REFP2B: case Command::REFSB: if (controllerIdle) entryTriggered = true; break; diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerAllBank.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerAllBank.cpp index 7ead6aec..9500e74c 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerAllBank.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerAllBank.cpp @@ -105,9 +105,9 @@ sc_time RefreshManagerAllBank::start() if (doRefresh) { if (activatedBanks > 0) - nextCommand = Command::PREA; + nextCommand = Command::PREAB; else - nextCommand = Command::REFA; + nextCommand = Command::REFAB; timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, &refreshPayload); return timeToSchedule; @@ -129,7 +129,7 @@ sc_time RefreshManagerAllBank::start() if (doRefresh) { - nextCommand = Command::REFA; + nextCommand = Command::REFAB; timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, &refreshPayload); return timeToSchedule; } @@ -168,7 +168,7 @@ sc_time RefreshManagerAllBank::start() if (refreshManagementRequired) { if (activatedBanks > 0) - nextCommand = Command::PREA; + nextCommand = Command::PREAB; else nextCommand = Command::RFMAB; @@ -187,13 +187,13 @@ void RefreshManagerAllBank::updateState(Command command) case Command::ACT: activatedBanks++; break; - case Command::PRE: case Command::RDA: case Command::WRA: + case Command::PREPB: case Command::RDA: case Command::WRA: activatedBanks--; break; - case Command::PREA: + case Command::PREAB: activatedBanks = 0; break; - case Command::REFA: + case Command::REFAB: if (sleeping) { // Refresh command after SREFEX diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerPerBank.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerPerBank.cpp index 780fb845..89e446e8 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerPerBank.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerPerBank.cpp @@ -48,16 +48,14 @@ RefreshManagerPerBank::RefreshManagerPerBank(std::vector &bankMac memSpec = config.memSpec; timeForNextTrigger = getTimeForFirstTrigger(memSpec->getRefreshIntervalPB(), rank, memSpec->numberOfRanks); - - refreshPayloads = std::vector(memSpec->banksPerRank); - for (unsigned bankID = 0; bankID < memSpec->banksPerRank; bankID++) + for (auto it : bankMachinesOnRank) { - setUpDummy(refreshPayloads[bankID], 0, rank, bankMachinesOnRank[bankID]->getBankGroup(), - bankMachinesOnRank[bankID]->getBank()); - allBankMachines.push_back(bankMachinesOnRank[bankID]); + setUpDummy(refreshPayloads[it], 0, rank, it->getBankGroup(), it->getBank()); + allBankMachines.push_back(it); } + remainingBankMachines = allBankMachines; - currentBankMachine = *remainingBankMachines.begin(); + currentIterator = remainingBankMachines.begin(); maxPostponed = static_cast(config.refreshMaxPostponed * memSpec->banksPerRank); maxPulledin = -static_cast(config.refreshMaxPulledin * memSpec->banksPerRank); @@ -65,9 +63,7 @@ RefreshManagerPerBank::RefreshManagerPerBank(std::vector &bankMac CommandTuple::Type RefreshManagerPerBank::getNextCommand() { - return {nextCommand, - &refreshPayloads[currentBankMachine->getBank().ID() % memSpec->banksPerRank], - std::max(timeToSchedule, sc_time_stamp())}; + return {nextCommand, &refreshPayloads[*currentIterator], std::max(timeToSchedule, sc_time_stamp())}; } sc_time RefreshManagerPerBank::start() @@ -95,14 +91,12 @@ sc_time RefreshManagerPerBank::start() if (!skipSelection) { currentIterator = remainingBankMachines.begin(); - currentBankMachine = *remainingBankMachines.begin(); for (auto it = remainingBankMachines.begin(); it != remainingBankMachines.end(); it++) { if ((*it)->isIdle()) { currentIterator = it; - currentBankMachine = *it; allBanksBusy = false; break; } @@ -117,21 +111,21 @@ sc_time RefreshManagerPerBank::start() } else { - if (currentBankMachine->isActivated()) - nextCommand = Command::PRE; + // TODO: bank should already be blocked for precharge and selection should be skipped + if ((*currentIterator)->isActivated()) + nextCommand = Command::PREPB; else { - nextCommand = Command::REFB; + nextCommand = Command::REFPB; if (forcedRefresh) { - currentBankMachine->block(); + (*currentIterator)->block(); skipSelection = true; } } - timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, - &refreshPayloads[currentBankMachine->getBank().ID()]); + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, &refreshPayloads[*currentIterator]); return timeToSchedule; } } @@ -144,7 +138,6 @@ sc_time RefreshManagerPerBank::start() if ((*it)->isIdle()) { currentIterator = it; - currentBankMachine = *it; allBanksBusy = false; break; } @@ -158,13 +151,12 @@ sc_time RefreshManagerPerBank::start() } else { - if (currentBankMachine->isActivated()) - nextCommand = Command::PRE; + if ((*currentIterator)->isActivated()) + nextCommand = Command::PREPB; else - nextCommand = Command::REFB; + nextCommand = Command::REFPB; - timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, - &refreshPayloads[currentBankMachine->getBank().ID()]); + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, &refreshPayloads[*currentIterator]); return timeToSchedule; } } @@ -177,7 +169,7 @@ void RefreshManagerPerBank::updateState(Command command) { switch (command) { - case Command::REFB: + case Command::REFPB: skipSelection = false; remainingBankMachines.erase(currentIterator); if (remainingBankMachines.empty()) @@ -194,11 +186,14 @@ void RefreshManagerPerBank::updateState(Command command) timeForNextTrigger += memSpec->getRefreshIntervalPB(); } break; - case Command::REFA: + case Command::REFAB: // Refresh command after SREFEX state = State::Regular; // TODO: check if this assignment is necessary timeForNextTrigger = sc_time_stamp() + memSpec->getRefreshIntervalPB(); sleeping = false; + remainingBankMachines = allBankMachines; + currentIterator = remainingBankMachines.begin(); + skipSelection = false; break; case Command::PDEA: case Command::PDEP: sleeping = true; diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerPerBank.h b/DRAMSys/library/src/controller/refresh/RefreshManagerPerBank.h index c02a12ba..2f24dd28 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerPerBank.h +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerPerBank.h @@ -37,6 +37,7 @@ #include #include +#include #include #include @@ -58,7 +59,7 @@ private: enum class State {Regular, Pulledin} state = State::Regular; const MemSpec *memSpec; PowerDownManagerIF *powerDownManager; - std::vector refreshPayloads; + std::unordered_map refreshPayloads; sc_core::sc_time timeForNextTrigger = sc_core::sc_max_time(); sc_core::sc_time timeToSchedule = sc_core::sc_max_time(); CheckerIF *checker; @@ -67,7 +68,6 @@ private: std::list remainingBankMachines; std::list allBankMachines; std::list::iterator currentIterator; - BankMachine *currentBankMachine; int flexibilityCounter = 0; int maxPostponed = 0; diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerSameBank.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerSameBank.cpp index 5ef86933..dc5b0493 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerSameBank.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerSameBank.cpp @@ -146,6 +146,7 @@ sc_time RefreshManagerSameBank::start() } } + // TODO: banks should already be blocked for precharge and selection should be skipped // only check for forced refresh, also block for PRESB if (nextCommand == Command::REFSB && forcedRefresh) { @@ -307,11 +308,14 @@ void RefreshManagerSameBank::updateState(Command command) timeForNextTrigger += memSpec->getRefreshIntervalSB(); } break; - case Command::REFA: + case Command::REFAB: // Refresh command after SREFEX state = State::Regular; // TODO: check if this assignment is necessary timeForNextTrigger = sc_time_stamp() + memSpec->getRefreshIntervalSB(); sleeping = false; + remainingBankMachines = allBankMachines; + currentIterator = remainingBankMachines.begin(); + skipSelection = false; break; case Command::PDEA: case Command::PDEP: sleeping = true; diff --git a/DRAMSys/library/src/simulation/dram/Dram.h b/DRAMSys/library/src/simulation/dram/Dram.h index 39613044..965f70a4 100644 --- a/DRAMSys/library/src/simulation/dram/Dram.h +++ b/DRAMSys/library/src/simulation/dram/Dram.h @@ -64,7 +64,7 @@ protected: unsigned char *memory; - libDRAMPower *DRAMPower; + libDRAMPower *DRAMPower = nullptr; virtual tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload &payload, tlm::tlm_phase &phase, sc_core::sc_time &delay); diff --git a/DRAMSys/library/src/simulation/dram/DramWideIO.cpp b/DRAMSys/library/src/simulation/dram/DramWideIO.cpp index 1d1ec292..663f063d 100644 --- a/DRAMSys/library/src/simulation/dram/DramWideIO.cpp +++ b/DRAMSys/library/src/simulation/dram/DramWideIO.cpp @@ -211,7 +211,7 @@ tlm_sync_enum DramWideIO::nb_transport_fw(tlm_generic_payload &payload, ememory[bank]->load(payload); else if (phase == BEGIN_WR || phase == BEGIN_WRA) ememory[bank]->store(payload); - else if (phase == BEGIN_REFA) + else if (phase == BEGIN_REFAB) ememory[bank]->refresh(DramExtension::getExtension(payload).getRow().ID()); } diff --git a/DRAMSys/traceAnalyzer/businessObjects/commandlengths.h b/DRAMSys/traceAnalyzer/businessObjects/commandlengths.h index 7048a0d0..8cfd421b 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/commandlengths.h +++ b/DRAMSys/traceAnalyzer/businessObjects/commandlengths.h @@ -38,40 +38,48 @@ struct CommandLengths { - unsigned NOP; - unsigned RD; - unsigned WR; - unsigned RDA; - unsigned WRA; - unsigned ACT; - unsigned PRE; - unsigned REFB; - unsigned PRESB; - unsigned REFSB; - unsigned RFMSB; - unsigned PREA; - unsigned REFA; - unsigned RFMAB; - unsigned PDEA; - unsigned PDXA; - unsigned PDEP; - unsigned PDXP; - unsigned SREFEN; - unsigned SREFEX; + unsigned NOP = 1; + unsigned RD = 1; + unsigned WR = 1; + unsigned RDA = 1; + unsigned WRA = 1; + unsigned ACT = 1; + unsigned PREPB = 1; + unsigned REFPB = 1; + unsigned RFMPB = 1; + unsigned REFP2B = 1; + unsigned RFMP2B = 1; + unsigned PRESB = 1; + unsigned REFSB = 1; + unsigned RFMSB = 1; + unsigned PREAB = 1; + unsigned REFAB = 1; + unsigned RFMAB = 1; + unsigned PDEA = 1; + unsigned PDXA = 1; + unsigned PDEP = 1; + unsigned PDXP = 1; + unsigned SREFEN = 1; + unsigned SREFEX = 1; CommandLengths(unsigned NOP, unsigned RD, unsigned WR, unsigned RDA, unsigned WRA, unsigned ACT, - unsigned PRE, unsigned REFB, unsigned PRESB, - unsigned REFSB, unsigned RFMSB, unsigned PREA, - unsigned REFA, unsigned RFMAB, unsigned PDEA, - unsigned PDXA, unsigned PDEP, unsigned PDXP, + unsigned PREPB, unsigned REFPB, unsigned RFMPB, + unsigned REFP2B, unsigned RFMP2B, + unsigned PRESB, unsigned REFSB, unsigned RFMSB, + unsigned PREAB, unsigned REFAB, unsigned RFMAB, + unsigned PDEA, unsigned PDXA, unsigned PDEP, unsigned PDXP, unsigned SREFEN, unsigned SREFEX) : - NOP(NOP), RD(RD), WR(WR), RDA(RDA), WRA(WRA), ACT(ACT), PRE(PRE), - REFB(REFB), PRESB(PRESB), REFSB(REFSB), RFMSB(RFMSB), PREA(PREA), - REFA(REFA), RFMAB(RFMAB), PDEA(PDEA), PDXA(PDXA), PDEP(PDEP), - PDXP(PDXP), SREFEN(SREFEN), SREFEX(SREFEX) {} + NOP(NOP), RD(RD), WR(WR), + RDA(RDA), WRA(WRA), ACT(ACT), + PREPB(PREPB), REFPB(REFPB), RFMPB(RFMPB), + REFP2B(REFP2B), RFMP2B(RFMP2B), + PRESB(PRESB), REFSB(REFSB), RFMSB(RFMSB), + PREAB(PREAB), REFAB(REFAB), RFMAB(RFMAB), + PDEA(PDEA), PDXA(PDXA), PDEP(PDEP), PDXP(PDXP), + SREFEN(SREFEN), SREFEX(SREFEX) {} - CommandLengths() {} + CommandLengths() = default; }; #endif // COMMANDLENGTHS_H diff --git a/DRAMSys/traceAnalyzer/businessObjects/generalinfo.h b/DRAMSys/traceAnalyzer/businessObjects/generalinfo.h index b6108c3e..7eb8e8d2 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/generalinfo.h +++ b/DRAMSys/traceAnalyzer/businessObjects/generalinfo.h @@ -38,36 +38,44 @@ #ifndef GENERALINFO_H #define GENERALINFO_H + #include "timespan.h" #include struct GeneralInfo { -public: - unsigned int numberOfTransactions; - unsigned int numberOfPhases; - Timespan span; - unsigned int numberOfRanks; - unsigned int numberOfBankgroups; - unsigned int numberOfBanks; - unsigned int banksPerRank; - unsigned int groupsPerRank; - unsigned int banksPerGroup; - QString unitOfTime; - unsigned int clkPeriod; - unsigned int windowSize; - unsigned int controllerThread; + uint64_t numberOfTransactions = 0; + uint64_t numberOfPhases = 0; + Timespan span = 0; + unsigned int numberOfRanks = 1; + unsigned int numberOfBankGroups = 1; + unsigned int numberOfBanks = 1; + unsigned int banksPerRank = 1; + unsigned int groupsPerRank = 1; + unsigned int banksPerGroup = 1; + QString description = "empty"; + QString unitOfTime = "PS"; + uint64_t clkPeriod = 1000; + uint64_t windowSize = 0; + unsigned int refreshMaxPostponed = 0; + unsigned int refreshMaxPulledin = 0; + uint64_t controllerThread = UINT64_MAX; + unsigned int maxBufferDepth = 8; + unsigned int per2BankOffset = 1; - GeneralInfo(unsigned int numberOfTransactions, unsigned int numberOfPhases, Timespan span, + GeneralInfo() = default; + GeneralInfo(uint64_t numberOfTransactions, uint64_t numberOfPhases, Timespan span, unsigned int numberOfRanks, unsigned int numberOfBankgroups, unsigned int numberOfBanks, - QString unitOfTime, unsigned int clkPeriod, unsigned int windowSize, unsigned int controllerThread) - : numberOfTransactions(numberOfTransactions), numberOfPhases(numberOfPhases), span(span), - numberOfRanks(numberOfRanks), numberOfBankgroups(numberOfBankgroups), numberOfBanks(numberOfBanks), - banksPerRank(numberOfBanks / numberOfRanks), groupsPerRank(numberOfBankgroups / numberOfRanks), - banksPerGroup(numberOfBanks / numberOfBankgroups), unitOfTime(unitOfTime), clkPeriod(clkPeriod), - windowSize(windowSize), controllerThread(controllerThread) - { - } + QString description, QString unitOfTime, uint64_t clkPeriod, uint64_t windowSize, + unsigned int refreshMaxPostponed, unsigned int refreshMaxPulledin, + uint64_t controllerThread, unsigned int maxBufferDepth, unsigned int per2BankOffset) : + numberOfTransactions(numberOfTransactions) , numberOfPhases(numberOfPhases), span(span), + numberOfRanks(numberOfRanks), numberOfBankGroups(numberOfBankgroups), numberOfBanks(numberOfBanks), + banksPerRank(numberOfBanks / numberOfRanks), groupsPerRank(numberOfBankgroups / numberOfRanks), + banksPerGroup(numberOfBanks / numberOfBankgroups), description(std::move(description)), + unitOfTime(std::move(unitOfTime)), clkPeriod(clkPeriod), windowSize(windowSize), + refreshMaxPostponed(refreshMaxPostponed), refreshMaxPulledin(refreshMaxPulledin), + controllerThread(controllerThread), maxBufferDepth(maxBufferDepth), per2BankOffset(per2BankOffset) {} }; #endif // GENERALINFO_H diff --git a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp index 15ec782a..0c13f1fd 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp @@ -43,8 +43,6 @@ #include "businessObjects/transaction.h" #include -using namespace std; - void Phase::draw(QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, bool highlight, const TraceDrawingProperties &drawingProperties) const @@ -179,20 +177,16 @@ void Phase::drawPhaseDependencies(traceTime begin, traceTime end, double y, QColor Phase::getColor(const TraceDrawingProperties &drawingProperties) const { - switch (drawingProperties.colorGrouping) { - case ColorGrouping::PhaseType: - return getPhaseColor(); - break; - case ColorGrouping::Thread: - return ColorGenerator::getColor(static_cast(transaction.lock()->thread)); - break; - case ColorGrouping::AlphaTransaction: - return ColorGenerator::getAlphaColored(transaction.lock()->id); - - break; - case ColorGrouping::Transaction: - default: - return ColorGenerator::getColor(transaction.lock()->id); + switch (drawingProperties.colorGrouping) + { + case ColorGrouping::PhaseType: + return getPhaseColor(); + case ColorGrouping::Thread: + return ColorGenerator::getColor(static_cast(transaction.lock()->thread)); + case ColorGrouping::AlphaTransaction: + return ColorGenerator::getAlphaColored(transaction.lock()->id); + case ColorGrouping::Transaction: default: + return ColorGenerator::getColor(transaction.lock()->id); } } @@ -252,13 +246,22 @@ std::vector> Phase::getTracePlotLines(const Trace return drawingProperties.getBankLinesGroupwise(transaction.lock()->rank, transaction.lock()->bank % drawingProperties.banksPerGroup); } + else if (getGranularity() == Granularity::TwoBankwise) + { + unsigned int firstGroup = transaction.lock()->bank / drawingProperties.banksPerGroup; + unsigned int firstBank = transaction.lock()->bank % drawingProperties.banksPerGroup; + unsigned int secondGroup = (transaction.lock()->bank + drawingProperties.per2BankOffset) + / drawingProperties.banksPerGroup; + unsigned int secondBank = (transaction.lock()->bank + drawingProperties.per2BankOffset) + % drawingProperties.banksPerGroup; + return drawingProperties.getBankLinesTwoBankwise(transaction.lock()->rank, firstGroup, firstBank, secondGroup, + secondBank); + } else // if (getGranularity() == Granularity::Bankwise) { return drawingProperties.getBankLines(transaction.lock()->rank, transaction.lock()->bankgroup % drawingProperties.groupsPerRank, - transaction.lock()->bank - % drawingProperties.banksPerRank - % drawingProperties.banksPerGroup); + transaction.lock()->bank % drawingProperties.banksPerGroup); } } diff --git a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.h b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.h index feb7b99a..3f05b8d2 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.h +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.h @@ -106,7 +106,7 @@ protected: virtual std::vector> getTracePlotLines(const TraceDrawingProperties &drawingProperties) const; - enum class Granularity {Bankwise, Groupwise, Rankwise}; + enum class Granularity {Bankwise, TwoBankwise, Groupwise, Rankwise}; virtual Granularity getGranularity() const { @@ -121,15 +121,15 @@ class REQ : public Phase public: using Phase::Phase; protected: - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { return ColorGenerator::getColor(1); } - virtual QString Name() const final + QString Name() const final { return "REQ"; } - virtual std::vector> getTracePlotLines(const TraceDrawingProperties &drawingProperties) const + std::vector> getTracePlotLines(const TraceDrawingProperties &drawingProperties) const override { return drawingProperties.getRequestLines(); @@ -142,22 +142,22 @@ class RESP : public Phase public: using Phase::Phase; protected: - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { return ColorGenerator::getColor(1); } - virtual QString Name() const override + QString Name() const override { return "RESP"; } - virtual std::vector> getTracePlotLines(const TraceDrawingProperties &drawingProperties) const + std::vector> getTracePlotLines(const TraceDrawingProperties &drawingProperties) const override { return drawingProperties.getResponseLines(); } }; - +/* class PREB: public Phase { public: @@ -172,19 +172,19 @@ protected: return "PREB"; } }; - -class PRE : public Phase +*/ +class PREPB : public Phase { public: using Phase::Phase; protected: - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { return ColorGenerator::getColor(1); } - virtual QString Name() const override + QString Name() const override { - return "PRE"; + return "PREPB"; } }; @@ -193,7 +193,7 @@ class PRESB : public Phase public: using Phase::Phase; protected: - virtual QString Name() const override + QString Name() const override { return "PRESB"; } @@ -201,49 +201,49 @@ protected: { return {span.Begin()}; } - virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const + QColor getColor(const TraceDrawingProperties &drawingProperties) const override { Q_UNUSED(drawingProperties) return getPhaseColor(); } - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { return ColorGenerator::getColor(1); } - virtual Granularity getGranularity() const override + Granularity getGranularity() const override { return Granularity::Groupwise; } }; -class PREA : public Phase +class PREAB : public Phase { public: using Phase::Phase; protected: - virtual QString Name() const override + QString Name() const override { - return "PREA"; + return "PREAB"; } virtual std::vector getTimesOnCommandBus() const { return {span.Begin()}; } - virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const + QColor getColor(const TraceDrawingProperties &drawingProperties) const override { Q_UNUSED(drawingProperties) return getPhaseColor(); } - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { return ColorGenerator::getColor(10); } - virtual Granularity getGranularity() const override + Granularity getGranularity() const override { return Granularity::Rankwise; } }; - +/* class ACTB : public Phase { public: @@ -258,17 +258,17 @@ protected: return "ACTB"; } }; - +*/ class ACT : public Phase { public: using Phase::Phase; protected: - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { return ColorGenerator::getColor(3); } - virtual QString Name() const override + QString Name() const override { return "ACT"; } @@ -279,11 +279,11 @@ class RD : public Phase public: using Phase::Phase; protected: - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { return ColorGenerator::getColor(4); } - virtual QString Name() const override + QString Name() const override { return "RD"; } @@ -294,11 +294,11 @@ class RDA : public Phase public: using Phase::Phase; protected: - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { return ColorGenerator::getColor(5); } - virtual QString Name() const override + QString Name() const override { return "RDA"; } @@ -309,11 +309,11 @@ class WR : public Phase public: using Phase::Phase; protected: - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { return ColorGenerator::getColor(6); } - virtual QString Name() const override + QString Name() const override { return "WR"; } @@ -324,11 +324,11 @@ class WRA : public Phase public: using Phase::Phase; protected: - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { return ColorGenerator::getColor(7); } - virtual QString Name() const override + QString Name() const override { return "WRA"; } @@ -339,7 +339,7 @@ class AUTO_REFRESH : public Phase public: using Phase::Phase; protected: - virtual QString Name() const override + QString Name() const override { return "REF"; } @@ -347,12 +347,12 @@ protected: { return {span.Begin()}; } - virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const + QColor getColor(const TraceDrawingProperties &drawingProperties) const override { Q_UNUSED(drawingProperties) return getPhaseColor(); } - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { QColor phaseColor = QColor(Qt::darkCyan); phaseColor.setAlpha(130); @@ -360,16 +360,16 @@ protected: } }; -class REFA : public AUTO_REFRESH +class REFAB : public AUTO_REFRESH { public: using AUTO_REFRESH::AUTO_REFRESH; protected: - virtual QString Name() const override + QString Name() const override { - return "REFA"; + return "REFAB"; } - virtual Granularity getGranularity() const override + Granularity getGranularity() const override { return Granularity::Rankwise; } @@ -380,15 +380,15 @@ class RFMAB : public AUTO_REFRESH public: using AUTO_REFRESH::AUTO_REFRESH; protected: - virtual QString Name() const override + QString Name() const override { return "RFMAB"; } - virtual Granularity getGranularity() const override + Granularity getGranularity() const override { return Granularity::Rankwise; } - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { QColor phaseColor = QColor(Qt::darkRed); phaseColor.setAlpha(130); @@ -397,14 +397,50 @@ protected: }; -class REFB : public AUTO_REFRESH +class REFPB : public AUTO_REFRESH { public: using AUTO_REFRESH::AUTO_REFRESH; protected: - virtual QString Name() const override + QString Name() const override { - return "REFB"; + return "REFPB"; + } +}; + +class REFP2B : public AUTO_REFRESH +{ +public: + using AUTO_REFRESH::AUTO_REFRESH; +protected: + QString Name() const override + { + return "REFP2B"; + } + Granularity getGranularity() const override + { + return Granularity::TwoBankwise; + } +}; + +class RFMP2B : public AUTO_REFRESH +{ +public: + using AUTO_REFRESH::AUTO_REFRESH; +protected: + QString Name() const override + { + return "RFMP2B"; + } + Granularity getGranularity() const override + { + return Granularity::TwoBankwise; + } + QColor getPhaseColor() const override + { + QColor phaseColor = QColor(Qt::darkRed); + phaseColor.setAlpha(130); + return phaseColor; } }; @@ -413,11 +449,11 @@ class REFSB : public AUTO_REFRESH public: using AUTO_REFRESH::AUTO_REFRESH; protected: - virtual QString Name() const override + QString Name() const override { return "REFSB"; } - virtual Granularity getGranularity() const override + Granularity getGranularity() const override { return Granularity::Groupwise; } @@ -428,15 +464,15 @@ class RFMSB : public AUTO_REFRESH public: using AUTO_REFRESH::AUTO_REFRESH; protected: - virtual QString Name() const override + QString Name() const override { return "RFMSB"; } - virtual Granularity getGranularity() const override + Granularity getGranularity() const override { return Granularity::Groupwise; } - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { QColor phaseColor = QColor(Qt::darkRed); phaseColor.setAlpha(130); @@ -449,24 +485,24 @@ class PDNAB : public Phase public: using Phase::Phase; protected: - virtual QString Name() const override + QString Name() const override { return "PDNAB"; } - virtual Qt::BrushStyle getBrushStyle() const override + Qt::BrushStyle getBrushStyle() const override { return Qt::Dense6Pattern; } - virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const + QColor getColor(const TraceDrawingProperties &drawingProperties) const override { Q_UNUSED(drawingProperties) return getPhaseColor(); } - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { - return QColor(Qt::black); + return {Qt::black}; } - virtual Phase::PhaseSymbol getPhaseSymbol() const override + Phase::PhaseSymbol getPhaseSymbol() const override { return PhaseSymbol::Rect; } @@ -477,11 +513,11 @@ class PDNA : public PDNAB public: using PDNAB::PDNAB; protected: - virtual QString Name() const override + QString Name() const override { return "PDNA"; } - virtual Granularity getGranularity() const override + Granularity getGranularity() const override { return Granularity::Rankwise; } @@ -492,24 +528,24 @@ class PDNPB : public Phase public: using Phase::Phase; protected: - virtual QString Name() const override + QString Name() const override { return "PDNPB"; } - virtual Qt::BrushStyle getBrushStyle() const override + Qt::BrushStyle getBrushStyle() const override { return Qt::Dense4Pattern; } - virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const + QColor getColor(const TraceDrawingProperties &drawingProperties) const override { Q_UNUSED(drawingProperties) return getPhaseColor(); } - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { - return QColor(Qt::black); + return {Qt::black}; } - virtual Phase::PhaseSymbol getPhaseSymbol() const override + Phase::PhaseSymbol getPhaseSymbol() const override { return PhaseSymbol::Rect; } @@ -520,11 +556,11 @@ class PDNP : public PDNPB public: using PDNPB::PDNPB; protected: - virtual QString Name() const override + QString Name() const override { return "PDNP"; } - virtual Granularity getGranularity() const override + Granularity getGranularity() const override { return Granularity::Rankwise; } @@ -535,24 +571,24 @@ class SREFB : public Phase public: using Phase::Phase; protected: - virtual QString Name() const override + QString Name() const override { return "SREFB"; } - virtual Qt::BrushStyle getBrushStyle() const override + Qt::BrushStyle getBrushStyle() const override { return Qt::Dense1Pattern; } - virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const + QColor getColor(const TraceDrawingProperties &drawingProperties) const override { Q_UNUSED(drawingProperties) return getPhaseColor(); } - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { - return QColor(Qt::black); + return {Qt::black}; } - virtual Phase::PhaseSymbol getPhaseSymbol() const override + Phase::PhaseSymbol getPhaseSymbol() const override { return PhaseSymbol::Rect; } @@ -563,11 +599,11 @@ class SREF : public SREFB public: using SREFB::SREFB; protected: - virtual QString Name() const override + QString Name() const override { return "SREF"; } - virtual Granularity getGranularity() const override + Granularity getGranularity() const override { return Granularity::Rankwise; } diff --git a/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.cpp b/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.cpp index 9afa91e1..60847527 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.cpp @@ -42,81 +42,88 @@ #include "data/tracedb.h" #include "businessObjects/timespan.h" -using namespace std; - -shared_ptr PhaseFactory::CreatePhase(ID id, const QString &dbPhaseName, - const Timespan &span, const shared_ptr &trans, TraceDB &database) +std::shared_ptr PhaseFactory::CreatePhase(ID id, const QString &dbPhaseName, + const Timespan &span, const std::shared_ptr &trans, + TraceDB &database) { traceTime clk = database.getGeneralInfo().clkPeriod; const CommandLengths &cl = database.getCommandLengths(); if (dbPhaseName == "REQ") - return shared_ptr(new REQ(id, span, clk, trans, {}, std::shared_ptr())); + return std::shared_ptr(new REQ(id, span, clk, trans, {}, std::shared_ptr())); else if (dbPhaseName == "RESP") - return shared_ptr(new RESP(id, span, clk, trans, {}, std::shared_ptr())); - - else if (dbPhaseName == "PREB") + return std::shared_ptr(new RESP(id, span, clk, trans, {}, std::shared_ptr())); + /*else if (dbPhaseName == "PREB") return shared_ptr(new PREB(id, span, clk, trans, - {Timespan(span.Begin(), span.Begin() + clk)}, std::shared_ptr())); - else if (dbPhaseName == "PRE") - return shared_ptr(new PRE(id, span, clk, trans, - {Timespan(span.Begin(), span.Begin() + clk * cl.PRE)}, std::shared_ptr())); - else if (dbPhaseName == "ACTB") - return shared_ptr(new ACTB(id, span, clk, trans, - {Timespan(span.Begin(), span.Begin() + clk)}, std::shared_ptr())); + {Timespan(span.Begin(), span.Begin() + clk)}, std::shared_ptr()));*/ + else if (dbPhaseName == "PREPB" || dbPhaseName == "PRE") // for backwards compatibility + return std::shared_ptr(new PREPB(id, span, clk, trans, + {Timespan(span.Begin(), span.Begin() + clk * cl.PREPB)}, std::shared_ptr())); + /*else if (dbPhaseName == "ACTB") + return std::shared_ptr(new ACTB(id, span, clk, trans, + {Timespan(span.Begin(), span.Begin() + clk)}, std::shared_ptr()));*/ else if (dbPhaseName == "ACT") - return shared_ptr(new ACT(id, span, clk, trans, + return std::shared_ptr(new ACT(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.ACT)}, std::shared_ptr())); - else if (dbPhaseName == "PREA") - return shared_ptr(new PREA(id, span, clk, trans, - {Timespan(span.Begin(), span.Begin() + clk * cl.PREA)}, std::shared_ptr())); - else if (dbPhaseName == "REFA") - return shared_ptr(new REFA(id, span, clk, trans, - {Timespan(span.Begin(), span.Begin() + clk * cl.REFA)}, std::shared_ptr())); + else if (dbPhaseName == "PREAB" || dbPhaseName == "PREA") // for backwards compatibility + return std::shared_ptr(new PREAB(id, span, clk, trans, + {Timespan(span.Begin(), span.Begin() + clk * cl.PREAB)}, std::shared_ptr())); + else if (dbPhaseName == "REFAB" || dbPhaseName == "REFA") // for backwards compatibility + return std::shared_ptr(new REFAB(id, span, clk, trans, + {Timespan(span.Begin(), span.Begin() + clk * cl.REFAB)}, std::shared_ptr())); else if (dbPhaseName == "RFMAB") - return shared_ptr(new RFMAB(id, span, clk, trans, + return std::shared_ptr(new RFMAB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RFMAB)}, std::shared_ptr())); - else if (dbPhaseName == "REFB") - return shared_ptr(new REFB(id, span, clk, trans, - {Timespan(span.Begin(), span.Begin() + clk * cl.REFB)}, std::shared_ptr())); + else if (dbPhaseName == "REFPB" || dbPhaseName == "REFB") // for backwards compatibility + return std::shared_ptr(new REFPB(id, span, clk, trans, + {Timespan(span.Begin(), span.Begin() + clk * cl.REFPB)}, std::shared_ptr())); + else if (dbPhaseName == "RFMPB") + return std::shared_ptr(new REFPB(id, span, clk, trans, + {Timespan(span.Begin(), span.Begin() + clk * cl.RFMPB)}, std::shared_ptr())); + else if (dbPhaseName == "REFP2B") + return std::shared_ptr(new REFP2B(id, span, clk, trans, + {Timespan(span.Begin(), span.Begin() + clk * cl.REFP2B)}, std::shared_ptr())); + else if (dbPhaseName == "RFMP2B") + return std::shared_ptr(new REFP2B(id, span, clk, trans, + {Timespan(span.Begin(), span.Begin() + clk * cl.RFMP2B)}, std::shared_ptr())); else if (dbPhaseName == "PRESB") - return shared_ptr(new PRESB(id, span, clk, trans, + return std::shared_ptr(new PRESB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PRESB)}, std::shared_ptr())); else if (dbPhaseName == "REFSB") - return shared_ptr(new REFSB(id, span, clk, trans, + return std::shared_ptr(new REFSB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.REFSB)}, std::shared_ptr())); else if (dbPhaseName == "RFMSB") - return shared_ptr(new RFMSB(id, span, clk, trans, + return std::shared_ptr(new RFMSB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RFMSB)}, std::shared_ptr())); else if (dbPhaseName == "RD") - return shared_ptr(new RD(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RD)}, + return std::shared_ptr(new RD(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RD)}, std::shared_ptr(new Timespan(trans->spanOnDataStrobe)))); else if (dbPhaseName == "RDA") - return shared_ptr(new RDA(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RDA)}, + return std::shared_ptr(new RDA(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RDA)}, std::shared_ptr(new Timespan(trans->spanOnDataStrobe)))); else if (dbPhaseName == "WR") - return shared_ptr(new WR(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WR)}, + return std::shared_ptr(new WR(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WR)}, std::shared_ptr(new Timespan(trans->spanOnDataStrobe)))); else if (dbPhaseName == "WRA") - return shared_ptr(new WRA(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WRA)}, + return std::shared_ptr(new WRA(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WRA)}, std::shared_ptr(new Timespan(trans->spanOnDataStrobe)))); else if (dbPhaseName == "PDNA") - return shared_ptr(new PDNA(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PDEA), + return std::shared_ptr(new PDNA(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PDEA), Timespan(span.End() - clk * cl.PDXA, span.End())}, std::shared_ptr())); else if (dbPhaseName == "PDNAB") - return shared_ptr(new PDNAB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk), + return std::shared_ptr(new PDNAB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk), Timespan(span.End() - clk, span.End())}, std::shared_ptr())); else if (dbPhaseName == "PDNP") - return shared_ptr(new PDNP(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PDEP), + return std::shared_ptr(new PDNP(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PDEP), Timespan(span.End() - clk * cl.PDXP, span.End())}, std::shared_ptr())); else if (dbPhaseName == "PDNPB") - return shared_ptr(new PDNPB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk), + return std::shared_ptr(new PDNPB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk), Timespan(span.End() - clk, span.End())}, std::shared_ptr())); else if (dbPhaseName == "SREF") - return shared_ptr(new SREF(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.SREFEN), + return std::shared_ptr(new SREF(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.SREFEN), Timespan(span.End() - clk * cl.SREFEX, span.End())}, std::shared_ptr())); else if (dbPhaseName == "SREFB") - return shared_ptr(new SREFB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk), + return std::shared_ptr(new SREFB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk), Timespan(span.End() - clk, span.End())}, std::shared_ptr())); else throw std::runtime_error("DB phasename " + dbPhaseName.toStdString() + " unkown to phasefactory"); diff --git a/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.h b/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.h index 4c01e794..4aef44c7 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.h +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.h @@ -37,6 +37,7 @@ #ifndef PHASEFACTORY_H #define PHASEFACTORY_H + #include "phase.h" #include #include @@ -46,9 +47,8 @@ class TraceDB; class PhaseFactory { -private: - PhaseFactory(); public: + PhaseFactory() = delete; static std::shared_ptr CreatePhase(ID id, const QString &dbPhaseName, const Timespan &span, const std::shared_ptr &trans, TraceDB &database); diff --git a/DRAMSys/traceAnalyzer/data/tracedb.cpp b/DRAMSys/traceAnalyzer/data/tracedb.cpp index 98fa0978..5564d843 100644 --- a/DRAMSys/traceAnalyzer/data/tracedb.cpp +++ b/DRAMSys/traceAnalyzer/data/tracedb.cpp @@ -52,14 +52,13 @@ //define symbol printqueries if all queries should be printed to the console //#define printqueries -using namespace std; - TraceDB::TraceDB(QString path, bool openExisting) { this->pathToDB = path; database = QSqlDatabase::database(path); - if (database.isValid() && database.isOpen()) { + if (database.isValid() && database.isOpen()) + { // Close the database connection if it exists and was not closed yet. database.removeDatabase(path); database.close(); @@ -132,7 +131,7 @@ void TraceDB::refreshData() //QueryText must select the fields //TransactionID, Ranges.begin, Ranges.end, Address, TThread, TChannel, TBank, TRow, TColumn, Phases.ID AS PhaseID, PhaseName, PhaseBegin, PhaseEnd -vector> TraceDB::getTransactionsWithCustomQuery( +std::vector> TraceDB::getTransactionsWithCustomQuery( QString queryText) { QSqlQuery query(database); @@ -141,7 +140,7 @@ vector> TraceDB::getTransactionsWithCustomQuery( return parseTransactionsFromQuery(query); } -vector> TraceDB::getTransactionsInTimespan(const Timespan &span, bool updateVisiblePhases) +std::vector> TraceDB::getTransactionsInTimespan(const Timespan &span, bool updateVisiblePhases) { selectTransactionsByTimespan.bindValue(":begin", span.Begin()); selectTransactionsByTimespan.bindValue(":end", span.End()); @@ -170,7 +169,7 @@ void TraceDB::updateDependenciesInTimespan(const Timespan &span) } //TODO Remove exception -shared_ptr TraceDB::getTransactionByID(ID id) +std::shared_ptr TraceDB::getTransactionByID(ID id) { selectTransactionById.bindValue(":id", id); executeQuery(selectTransactionById); @@ -183,12 +182,11 @@ shared_ptr TraceDB::getTransactionByID(ID id) } -shared_ptr TraceDB::getNextActivate(traceTime time) +std::shared_ptr TraceDB::getNextActivate(traceTime time) { QSqlQuery query(database); QString queryText = queryTexts.queryHead + - "WHERE PhaseBegin > :traceTime AND PhaseName " - "IN ('ACT','ACTB') ORDER BY PhaseBegin ASC LIMIT 1"; + "WHERE PhaseBegin > :traceTime AND PhaseName = 'ACT' ORDER BY PhaseBegin ASC LIMIT 1"; query.prepare(queryText); query.bindValue(":traceTime", time); @@ -196,12 +194,12 @@ shared_ptr TraceDB::getNextActivate(traceTime time) return parseTransactionFromQuery(query); } -shared_ptr TraceDB::getNextPrecharge(traceTime time) +std::shared_ptr TraceDB::getNextPrecharge(traceTime time) { QSqlQuery query(database); QString queryText = queryTexts.queryHead + "WHERE PhaseBegin > :traceTime AND PhaseName " - "IN ('PRE','PREA','PREB','PRESB') ORDER BY PhaseBegin ASC LIMIT 1"; + "IN ('PRE','PREPB','PREA','PREAB','PRESB') ORDER BY PhaseBegin ASC LIMIT 1"; query.prepare(queryText); query.bindValue(":traceTime", time); @@ -233,12 +231,12 @@ shared_ptr TraceDB::getNextPrecharge(traceTime time) // return parseTransactionFromQuery(query); // } -shared_ptr TraceDB::getNextRefresh(traceTime time) +std::shared_ptr TraceDB::getNextRefresh(traceTime time) { QSqlQuery query(database); QString queryText = queryTexts.queryHead + "WHERE PhaseBegin > :traceTime AND PhaseName " - "IN ('REFA','REFB','REFSB','SREF','SREFB') ORDER BY PhaseBegin ASC LIMIT 1"; + "IN ('REFAB','REFA','REFB','REFPB','REFP2B','REFSB','SREF','SREFB') ORDER BY PhaseBegin ASC LIMIT 1"; query.prepare(queryText); query.bindValue(":traceTime", time); executeQuery(query); @@ -278,92 +276,187 @@ ID TraceDB::getTransactionIDFromPhaseID(ID phaseID) if (query.next()) { return query.value(0).toInt(); } else { - throw sqlException("Phase with ID " + to_string(phaseID) + " not in db", + throw sqlException("Phase with ID " + std::to_string(phaseID) + " not in db", this->pathToDB.toStdString()); } } -GeneralInfo *TraceDB::getGeneralInfoFromDB() +GeneralInfo TraceDB::getGeneralInfoFromDB() { - QSqlQuery query(database); - query.prepare("SELECT NumberOfTransactions, TraceEnd, NumberOfRanks, NumberOfBankgroups, NumberOfBanks, Clk, " - "UnitOfTime, Traces, Memspec, MCconfig, WindowSize, ControllerThread FROM GeneralInfo"); - executeQuery(query); + QVariant parameter; + parameter = getParameterFromTable("NumberOfTransactions", "GeneralInfo"); + uint64_t numberOfTransactions = parameter.isValid() ? parameter.toULongLong() : 0; + parameter = getParameterFromTable("TraceEnd", "GeneralInfo"); + traceTime traceEnd = parameter.isValid() ? parameter.toULongLong() : 0; + parameter = getParameterFromTable("NumberOfRanks", "GeneralInfo"); + unsigned numberOfRanks = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("NumberOfBankgroups", "GeneralInfo"); + unsigned numberOfBankGroups = parameter.isValid() ? parameter.toUInt() : numberOfRanks; + parameter = getParameterFromTable("NumberOfBanks", "GeneralInfo"); + unsigned numberOfBanks = parameter.isValid() ? parameter.toUInt() : numberOfBankGroups; + parameter = getParameterFromTable("Clk", "GeneralInfo"); + uint64_t clkPeriod = parameter.isValid() ? parameter.toULongLong() : 1000; + parameter = getParameterFromTable("UnitOfTime", "GeneralInfo"); + QString unitOfTime = parameter.isValid() ? parameter.toString() : "PS"; + parameter = getParameterFromTable("Traces", "GeneralInfo"); + QString traces = parameter.isValid() ? "Traces: " + parameter.toString() : "Traces: empty"; + parameter = getParameterFromTable("Memspec", "GeneralInfo"); + QString memspec = parameter.isValid() ? "Memspec: " + parameter.toString() : "Memspec: empty"; + parameter = getParameterFromTable("MCconfig", "GeneralInfo"); + QString mcconfig = parameter.isValid() ? "MCconfig: " + parameter.toString() : "MCconfig: empty"; + parameter = getParameterFromTable("WindowSize", "GeneralInfo"); + uint64_t windowSize = parameter.isValid() ? parameter.toULongLong() : 0; + parameter = getParameterFromTable("RefreshMaxPostponed", "GeneralInfo"); + unsigned refreshMaxPostponed = parameter.isValid() ? parameter.toUInt() : 0; + parameter = getParameterFromTable("RefreshMaxPulledin", "GeneralInfo"); + unsigned refreshMaxPulledin = parameter.isValid() ? parameter.toUInt() : 0; + parameter = getParameterFromTable("ControllerThread", "GeneralInfo"); + uint64_t controllerThread = parameter.isValid() ? parameter.toULongLong() : UINT64_MAX; + parameter = getParameterFromTable("MaxBufferDepth", "GeneralInfo"); + unsigned maxBufferDepth = parameter.isValid() ? parameter.toUInt() : 8; + parameter = getParameterFromTable("Per2BankOffset", "GeneralInfo"); + unsigned per2BankOffset = parameter.isValid() ? parameter.toUInt() : 1; - if (query.next()) { - unsigned int numberOfTransactions = query.value(0).toInt(); - traceTime traceEnd = query.value(1).toLongLong(); - unsigned int numberOfRanks = query.value(2).toInt(); - unsigned int numberOfBankgroups = query.value(3).toInt(); - unsigned int numberOfBanks = query.value(4).toInt(); - unsigned int clkPeriod = query.value(5).toInt(); - QString unitOfTime = query.value(6).toString(); - unsigned int numberOfPhases = getNumberOfPhases(); + uint64_t numberOfPhases = getNumberOfPhases(); - QString traces = "Traces: " + query.value(7).toString(); - QString memspec = "Memspec: " + query.value(8).toString(); - QString mcconfig = "MCconfig: " + query.value(9).toString(); - unsigned int windowSize = query.value(10).toInt(); - unsigned int controllerThread = query.value(11).toUInt(); + QString description = (traces + "\n"); + description += mcconfig + "\n"; + description += memspec + "\n"; + description += "Number of Transactions: " + QString::number(numberOfTransactions) + "\n"; + description += "Clock period: " + QString::number(clkPeriod) + " " + unitOfTime + "\n"; + description += "Length of trace: " + prettyFormatTime(traceEnd) + "\n"; + description += "Window size: " + QString::number(windowSize) + "\n"; - return new GeneralInfo(numberOfTransactions, numberOfPhases, Timespan(0, traceEnd), numberOfRanks, - numberOfBankgroups, numberOfBanks, unitOfTime, clkPeriod, windowSize, controllerThread); - } else { - throw sqlException("Tracefile corrupted. No general info table", - this->pathToDB.toStdString()); - } + return {numberOfTransactions, numberOfPhases, Timespan(0, traceEnd), numberOfRanks, + numberOfBankGroups, numberOfBanks, description, unitOfTime, clkPeriod, windowSize, + refreshMaxPostponed, refreshMaxPulledin, controllerThread, maxBufferDepth, per2BankOffset}; } CommandLengths TraceDB::getCommandLengthsFromDB() { - unsigned NOP = getLengthOfCommandFromDB("NOP"); - unsigned RD = getLengthOfCommandFromDB("RD"); - unsigned WR = getLengthOfCommandFromDB("WR"); - unsigned RDA = getLengthOfCommandFromDB("RDA"); - unsigned WRA = getLengthOfCommandFromDB("WRA"); - unsigned ACT = getLengthOfCommandFromDB("ACT"); - unsigned PRE = getLengthOfCommandFromDB("PRE"); - unsigned REFB = getLengthOfCommandFromDB("REFB"); - unsigned PRESB = getLengthOfCommandFromDB("PRESB"); - unsigned REFSB = getLengthOfCommandFromDB("REFSB"); - unsigned RFMSB = getLengthOfCommandFromDB("RFMSB"); - unsigned PREA = getLengthOfCommandFromDB("PREA"); - unsigned REFA = getLengthOfCommandFromDB("REFA"); - unsigned RFMAB = getLengthOfCommandFromDB("RFMAB"); - unsigned PDEA = getLengthOfCommandFromDB("PDEA"); - unsigned PDXA = getLengthOfCommandFromDB("PDXA"); - unsigned PDEP = getLengthOfCommandFromDB("PDEP"); - unsigned PDXP = getLengthOfCommandFromDB("PDXP"); - unsigned SREFEN = getLengthOfCommandFromDB("SREFEN"); - unsigned SREFEX = getLengthOfCommandFromDB("SREFEX"); - - return {NOP, RD, WR, RDA, WRA, ACT, PRE, REFB, PRESB, REFSB, RFMSB, - PREA, REFA, RFMAB, PDEA, PDXA, PDEP, PDXP, SREFEN, SREFEX}; -} - -unsigned int TraceDB::getLengthOfCommandFromDB(const std::string& command) -{ - QSqlQuery query(("SELECT " + command + " FROM CommandLengths").c_str(), database); - if (query.first()) - return query.value(0).toUInt(); + QVariant parameter; + parameter = getParameterFromTable("NOP", "CommandLengths"); + unsigned NOP = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("RD", "CommandLengths"); + unsigned RD = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("WR", "CommandLengths"); + unsigned WR = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("RDA", "CommandLengths"); + unsigned RDA = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("WRA", "CommandLengths"); + unsigned WRA = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("ACT", "CommandLengths"); + unsigned ACT = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("PREPB", "CommandLengths"); + unsigned PREPB; + if (parameter.isValid()) + { + PREPB = parameter.toUInt(); + } else { - qDebug() << "Warning: Length of command " << command.c_str() << " not present in DB, setting 1 as default."; - return 1; + parameter = getParameterFromTable("PRE", "CommandLengths"); + if (parameter.isValid()) + PREPB = parameter.toUInt(); + else + PREPB = 1; + } + parameter = getParameterFromTable("REFPB", "CommandLengths"); + unsigned REFPB; + if (parameter.isValid()) + { + REFPB = parameter.toUInt(); + } + else + { + parameter = getParameterFromTable("REFB", "CommandLengths"); + if (parameter.isValid()) + REFPB = parameter.toUInt(); + else + REFPB = 1; + } + parameter = getParameterFromTable("RFMPB", "CommandLengths"); + unsigned RFMPB = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("REFP2B", "CommandLengths"); + unsigned REFP2B = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("RFMP2B", "CommandLengths"); + unsigned RFMP2B = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("PRESB", "CommandLengths"); + unsigned PRESB = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("REFSB", "CommandLengths"); + unsigned REFSB = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("RFMSB", "CommandLengths"); + unsigned RFMSB = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("PREAB", "CommandLengths"); + unsigned PREAB; + if (parameter.isValid()) + { + PREAB = parameter.toUInt(); + } + else + { + parameter = getParameterFromTable("PREA", "CommandLengths"); + if (parameter.isValid()) + PREAB = parameter.toUInt(); + else + PREAB = 1; + } + parameter = getParameterFromTable("REFAB", "CommandLengths"); + unsigned REFAB; + if (parameter.isValid()) + { + REFAB = parameter.toUInt(); + } + else + { + parameter = getParameterFromTable("REFA", "CommandLengths"); + if (parameter.isValid()) + REFAB = parameter.toUInt(); + else + REFAB = 1; + } + parameter = getParameterFromTable("RFMAB", "CommandLengths"); + unsigned RFMAB = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("PDEA", "CommandLengths"); + unsigned PDEA = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("PDXA", "CommandLengths"); + unsigned PDXA = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("PDEP", "CommandLengths"); + unsigned PDEP = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("PDXP", "CommandLengths"); + unsigned PDXP = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("SREFEN", "CommandLengths"); + unsigned SREFEN = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("SREFEX", "CommandLengths"); + unsigned SREFEX = parameter.isValid() ? parameter.toUInt() : 1; + + return {NOP, RD, WR, RDA, WRA, ACT, PREPB, REFPB, RFMPB, REFP2B, RFMP2B, PRESB, REFSB, RFMSB, + PREAB, REFAB, RFMAB, PDEA, PDXA, PDEP, PDXP, SREFEN, SREFEX}; +} + +QVariant TraceDB::getParameterFromTable(const std::string& parameter, const std::string& table) +{ + QSqlQuery query(("SELECT " + parameter + " FROM " + table).c_str(), database); + if (query.first()) + return query.value(0); + else + { + qDebug() << "Parameter " << parameter.c_str() << " not present in table " << table.c_str(); + return {}; } } -unsigned int TraceDB::getNumberOfPhases() +uint64_t TraceDB::getNumberOfPhases() { QSqlQuery query(database); query.prepare("SELECT COUNT(ID) FROM Phases"); executeQuery(query); query.next(); - return query.value(0).toInt(); + return query.value(0).toULongLong(); } -vector TraceDB::getComments() +std::vector TraceDB::getComments() { QSqlQuery query(database); query.prepare("SELECT Time,Text From Comments"); @@ -372,7 +465,7 @@ vector TraceDB::getComments() } -vector TraceDB::getDebugMessagesInTimespan(const Timespan &span) +std::vector TraceDB::getDebugMessagesInTimespan(const Timespan &span) { selectDebugMessagesByTimespan.bindValue(":begin", span.Begin()); selectDebugMessagesByTimespan.bindValue(":end", span.End()); @@ -381,7 +474,7 @@ vector TraceDB::getDebugMessagesInTimespan(const Timespan return parseCommentsFromQuery(selectDebugMessagesByTimespan); } -vector TraceDB::getDebugMessagesInTimespan(const Timespan &span, +std::vector TraceDB::getDebugMessagesInTimespan(const Timespan &span, unsigned int limit = 50) { selectDebugMessagesByTimespanWithLimit.bindValue(":begin", span.Begin()); @@ -434,23 +527,23 @@ QSqlDatabase TraceDB::getDatabase() const */ -shared_ptr TraceDB::parseTransactionFromQuery(QSqlQuery &query) +std::shared_ptr TraceDB::parseTransactionFromQuery(QSqlQuery &query) { auto result = parseTransactionsFromQuery(query); if (!result.empty()) return result[0]; else - return shared_ptr(); + return {}; } -vector> TraceDB::parseTransactionsFromQuery(QSqlQuery &query, bool updateVisiblePhases) +std::vector> TraceDB::parseTransactionsFromQuery(QSqlQuery &query, bool updateVisiblePhases) { if (updateVisiblePhases) { _visiblePhases.clear(); } - vector> result; + std::vector> result; bool firstIteration = true; ID currentID = 0; @@ -475,9 +568,9 @@ vector> TraceDB::parseTransactionsFromQuery(QSqlQuery &q unsigned int bank = query.value(11).toInt(); unsigned int row = query.value(12).toInt(); unsigned int column = query.value(13).toInt(); - result.push_back(shared_ptr(new Transaction(id, address, burstlength, + result.push_back(std::make_shared(id, address, burstlength, thread, channel, rank, bankgroup, bank, row, column, - span, spanOnStrobe, generalInfo->clkPeriod))); + span, spanOnStrobe, generalInfo.clkPeriod)); } unsigned int phaseID = query.value(14).toInt(); @@ -524,14 +617,14 @@ void TraceDB::mUpdateDependenciesFromQuery(QSqlQuery &query) if (_visiblePhases.count(dependencyID) > 0) { - _visiblePhases[delayedID]->addDependency(std::shared_ptr( - new PhaseDependency(type, timeDependencyStr, _visiblePhases[dependencyID]))); + _visiblePhases[delayedID]->addDependency(std::make_shared( + PhaseDependency(type, timeDependencyStr, _visiblePhases[dependencyID]))); } else { _visiblePhases[delayedID]->addDependency( - std::shared_ptr(new PhaseDependency(type, timeDependencyStr))); + std::make_shared(PhaseDependency(type, timeDependencyStr))); } } else @@ -541,10 +634,11 @@ void TraceDB::mUpdateDependenciesFromQuery(QSqlQuery &query) } } -vector TraceDB::parseCommentsFromQuery(QSqlQuery &query) +std::vector TraceDB::parseCommentsFromQuery(QSqlQuery &query) { - vector result; - while (query.next()) { + std::vector result; + while (query.next()) + { result.push_back(CommentModel::Comment{query.value(0).toLongLong(), query.value(1).toString()}); } diff --git a/DRAMSys/traceAnalyzer/data/tracedb.h b/DRAMSys/traceAnalyzer/data/tracedb.h index 525824b8..8b759f24 100644 --- a/DRAMSys/traceAnalyzer/data/tracedb.h +++ b/DRAMSys/traceAnalyzer/data/tracedb.h @@ -77,7 +77,7 @@ public: const GeneralInfo &getGeneralInfo() const { - return *generalInfo; + return generalInfo; } const CommandLengths &getCommandLengths() const @@ -114,8 +114,8 @@ public: private: QString pathToDB; QSqlDatabase database; - GeneralInfo *generalInfo; - CommandLengths commandLengths; + GeneralInfo generalInfo; + CommandLengths commandLengths{}; QSqlQuery insertPhaseQuery; QSqlQuery insertTransactionQuery; @@ -133,22 +133,22 @@ private: TransactionQueryTexts queryTexts; void prepareQueries(); void executeQuery(QSqlQuery query); - QString queryToString(QSqlQuery query); + static QString queryToString(QSqlQuery query); std::shared_ptr parseTransactionFromQuery(QSqlQuery &query); std::vector> parseTransactionsFromQuery(QSqlQuery &query, bool updateVisiblePhases = false); - std::vector parseCommentsFromQuery(QSqlQuery &query); + static std::vector parseCommentsFromQuery(QSqlQuery &query); void mUpdateDependenciesFromQuery(QSqlQuery &query); - DependencyInfos parseDependencyInfos(QSqlQuery &query, const DependencyInfos::Type infoType); + static DependencyInfos parseDependencyInfos(QSqlQuery &query, const DependencyInfos::Type infoType); void executeScriptFile(QString fileName); void dropAndCreateTables(); - unsigned int getNumberOfPhases(); - GeneralInfo *getGeneralInfoFromDB(); + uint64_t getNumberOfPhases(); + GeneralInfo getGeneralInfoFromDB(); CommandLengths getCommandLengthsFromDB(); - unsigned int getLengthOfCommandFromDB(const std::string& command); + QVariant getParameterFromTable(const std::string& parameter, const std::string& table); std::map> _visiblePhases; // Updated at parseTransactionsFromQuery }; @@ -165,7 +165,7 @@ public: this->message = std::string("Error in file ") + filename + std::string(" ") + message; } - const char *what() const noexcept + const char *what() const noexcept override { return message.c_str(); } diff --git a/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.cpp b/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.cpp index 8a1971d4..b1a5ccc4 100644 --- a/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.cpp +++ b/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.cpp @@ -192,7 +192,7 @@ void TraceDrawingProperties::collapseOrExpandAllRanks(ToggleCollapsedAction::Col } } -const std::shared_ptr> TraceDrawingProperties::getLabels() const +std::shared_ptr> TraceDrawingProperties::getLabels() const { return labels; } @@ -289,3 +289,14 @@ TracePlotLineVector TraceDrawingProperties::getBankLinesFromRank(unsigned int ra { return tracePlotLineCache->getBankLinesFromRank(rank); } + +TracePlotLineVector TraceDrawingProperties::getBankLinesTwoBankwise(unsigned int rank, unsigned int firstGroup, + unsigned int firstBank, unsigned int secondGroup, + unsigned int secondBank) const +{ + TracePlotLineVector firstBankLines = tracePlotLineCache->getBankLines(rank, firstGroup, firstBank); + TracePlotLineVector secondBankLines = tracePlotLineCache->getBankLines(rank, secondGroup, secondBank); + firstBankLines.insert(firstBankLines.end(), secondBankLines.begin(), secondBankLines.end()); + + return firstBankLines; +} diff --git a/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.h b/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.h index 2573606e..6c437ad0 100644 --- a/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.h +++ b/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.h @@ -93,12 +93,13 @@ public: DependencyOptions drawDependenciesOption; ColorGrouping colorGrouping; - unsigned int numberOfRanks; - unsigned int numberOfBankgroups; - unsigned int numberOfBanks; - unsigned int banksPerRank; - unsigned int groupsPerRank; - unsigned int banksPerGroup; + unsigned int numberOfRanks = 1; + unsigned int numberOfBankGroups = 1; + unsigned int numberOfBanks = 1; + unsigned int banksPerRank = 1; + unsigned int groupsPerRank = 1; + unsigned int banksPerGroup = 1; + unsigned int per2BankOffset = 0; TraceDrawingProperties(bool drawText = true, bool drawBorder = true, DependencyOptions drawDependenciesOption = {DependencyOption::Disabled, @@ -123,9 +124,12 @@ public: TracePlotLineVector getBankLines(unsigned int rank, unsigned int group, unsigned int bank) const; TracePlotLineVector getBankLinesFromGroup(unsigned int rank, unsigned int group) const; TracePlotLineVector getBankLinesGroupwise(unsigned int rank, unsigned int bank) const; + TracePlotLineVector getBankLinesTwoBankwise(unsigned int rank, unsigned int firstGroup, + unsigned int firstBank, unsigned int secondGroup, + unsigned int secondBank) const; TracePlotLineVector getBankLinesFromRank(unsigned int rank) const; - const std::shared_ptr> getLabels() const; + std::shared_ptr> getLabels() const; void updateTracePlotLines(QTreeWidget *treeWidget); void collapseOrExpandAllRanks(ToggleCollapsedAction::CollapseAction collapseAction); @@ -142,7 +146,7 @@ private: std::shared_ptr tracePlotLines; std::shared_ptr tracePlotLineCache; - TracePlot *tracePlot; + TracePlot *tracePlot = nullptr; }; #endif // TRACECOLLECTIONDRAWINGPROPERTIES_H diff --git a/DRAMSys/traceAnalyzer/presentation/traceplot.cpp b/DRAMSys/traceAnalyzer/presentation/traceplot.cpp index f1ecc997..7c986afd 100644 --- a/DRAMSys/traceAnalyzer/presentation/traceplot.cpp +++ b/DRAMSys/traceAnalyzer/presentation/traceplot.cpp @@ -303,11 +303,12 @@ void TracePlot::setUpDrawingProperties() drawingProperties.init(navigator->getTracePlotLines(), navigator->getTracePlotLineCache(), this); drawingProperties.numberOfRanks = navigator->GeneralTraceInfo().numberOfRanks; - drawingProperties.numberOfBankgroups = navigator->GeneralTraceInfo().numberOfBankgroups; + drawingProperties.numberOfBankGroups = navigator->GeneralTraceInfo().numberOfBankGroups; drawingProperties.numberOfBanks = navigator->GeneralTraceInfo().numberOfBanks; drawingProperties.banksPerRank = drawingProperties.numberOfBanks / drawingProperties.numberOfRanks; - drawingProperties.groupsPerRank = drawingProperties.numberOfBankgroups / drawingProperties.numberOfRanks; - drawingProperties.banksPerGroup = drawingProperties.numberOfBanks / drawingProperties.numberOfBankgroups; + drawingProperties.groupsPerRank = drawingProperties.numberOfBankGroups / drawingProperties.numberOfRanks; + drawingProperties.banksPerGroup = drawingProperties.numberOfBanks / drawingProperties.numberOfBankGroups; + drawingProperties.per2BankOffset = navigator->GeneralTraceInfo().per2BankOffset; } void TracePlot::setUpQueryEditor() diff --git a/DRAMSys/traceAnalyzer/presentation/tracescroller.cpp b/DRAMSys/traceAnalyzer/presentation/tracescroller.cpp index 50d5dbd6..79d75c72 100644 --- a/DRAMSys/traceAnalyzer/presentation/tracescroller.cpp +++ b/DRAMSys/traceAnalyzer/presentation/tracescroller.cpp @@ -107,11 +107,12 @@ void TraceScroller::setUpDrawingProperties() drawingProperties.init(navigator->getTracePlotLines(), navigator->getTracePlotLineCache()); drawingProperties.numberOfRanks = navigator->GeneralTraceInfo().numberOfRanks; - drawingProperties.numberOfBankgroups = navigator->GeneralTraceInfo().numberOfBankgroups; + drawingProperties.numberOfBankGroups = navigator->GeneralTraceInfo().numberOfBankGroups; drawingProperties.numberOfBanks = navigator->GeneralTraceInfo().numberOfBanks; drawingProperties.banksPerRank = drawingProperties.numberOfBanks / drawingProperties.numberOfRanks; - drawingProperties.groupsPerRank = drawingProperties.numberOfBankgroups / drawingProperties.numberOfRanks; - drawingProperties.banksPerGroup = drawingProperties.numberOfBanks / drawingProperties.numberOfBankgroups; + drawingProperties.groupsPerRank = drawingProperties.numberOfBankGroups / drawingProperties.numberOfRanks; + drawingProperties.banksPerGroup = drawingProperties.numberOfBanks / drawingProperties.numberOfBankGroups; + drawingProperties.per2BankOffset = navigator->GeneralTraceInfo().per2BankOffset; } diff --git a/DRAMSys/traceAnalyzer/scripts/memUtil.py b/DRAMSys/traceAnalyzer/scripts/memUtil.py index 69885ec0..ce928d4d 100755 --- a/DRAMSys/traceAnalyzer/scripts/memUtil.py +++ b/DRAMSys/traceAnalyzer/scripts/memUtil.py @@ -72,6 +72,12 @@ def getNumberOfBankGroups(dbconnection): result = cursor.fetchone() return result[0] +def getPer2BankOffset(dbconnection): + cursor = dbconnection.cursor() + cursor.execute("SELECT Per2BankOffset FROM generalInfo") + result = cursor.fetchone() + return result[0] + def getWindowSize(connection): cursor = connection.cursor() cursor.execute(" SELECT WindowSize FROM GeneralInfo ") diff --git a/DRAMSys/traceAnalyzer/scripts/metrics.py b/DRAMSys/traceAnalyzer/scripts/metrics.py index cda9484c..9e6aa966 100644 --- a/DRAMSys/traceAnalyzer/scripts/metrics.py +++ b/DRAMSys/traceAnalyzer/scripts/metrics.py @@ -39,7 +39,8 @@ def trace_length_in_ns(connection): @metric def average_response_latency_in_ns(connection): cursor = connection.cursor() - cursor.execute("""SELECT AVG(RESP.PHASEBEGIN - REQ.PHASEBEGIN)/1000 FROM PHASES REQ, PHASES RESP WHERE REQ.PHASENAME = 'REQ' AND RESP.PHASENAME='RESP' AND REQ.TRANSACT = RESP.TRANSACT """) + cursor.execute("""SELECT AVG(RESP.PHASEBEGIN - REQ.PHASEBEGIN)/1000 FROM PHASES REQ, PHASES RESP + WHERE REQ.PHASENAME = 'REQ' AND RESP.PHASENAME='RESP' AND REQ.TRANSACT = RESP.TRANSACT """) result = cursor.fetchone() return round(result[0], 1) @@ -47,7 +48,8 @@ def average_response_latency_in_ns(connection): @metric def max_response_latency_in_ns(connection): cursor = connection.cursor() - cursor.execute(""" SELECT max(RESP.PHASEBEGIN - REQ.PHASEBEGIN)/1000 FROM PHASES REQ, PHASES RESP WHERE REQ.PHASENAME = 'REQ' AND RESP.PHASENAME='RESP' AND REQ.TRANSACT = RESP.TRANSACT """) + cursor.execute(""" SELECT max(RESP.PHASEBEGIN - REQ.PHASEBEGIN)/1000 FROM PHASES REQ, PHASES RESP + WHERE REQ.PHASENAME = 'REQ' AND RESP.PHASENAME='RESP' AND REQ.TRANSACT = RESP.TRANSACT """) result = cursor.fetchone() return result[0] @@ -55,7 +57,8 @@ def max_response_latency_in_ns(connection): @metric def trans_with_max_response_latency(connection): cursor = connection.cursor() - cursor.execute(""" SELECT REQ.TRANSACT, max(RESP.PHASEBEGIN - REQ.PHASEBEGIN)/1000 FROM PHASES REQ, PHASES RESP WHERE REQ.PHASENAME = 'REQ' AND RESP.PHASENAME='RESP' AND REQ.TRANSACT = RESP.TRANSACT """) + cursor.execute(""" SELECT REQ.TRANSACT, max(RESP.PHASEBEGIN - REQ.PHASEBEGIN)/1000 FROM PHASES REQ, PHASES RESP + WHERE REQ.PHASENAME = 'REQ' AND RESP.PHASENAME='RESP' AND REQ.TRANSACT = RESP.TRANSACT """) result = cursor.fetchone() return result[0] @@ -383,7 +386,8 @@ def memory_utilisation_percent_including_idle(connection): def refreshMissDecision(connection, calculatedMetrics): cursor = connection.cursor() - cursor.execute("""SELECT phases.ID,PhaseBegin,PhaseEnd,TBank FROM Phases INNER JOIN transactions on transactions.id = phases.transact WHERE PhaseName IN ('REFA')' """) + cursor.execute("""SELECT phases.ID,PhaseBegin,PhaseEnd,TBank FROM Phases INNER JOIN transactions + on transactions.id = phases.transact WHERE PhaseName IN ('REFAB')' """) queryMinREQ = """SELECT id,min(PhaseBegin) FROM (SELECT transactions.id, PhaseBegin FROM transactions inner join ranges on ranges.id = transactions.range inner join phases on phases.transact = transactions.id where tthread != 0 and tbank = :bank and PhaseName = "REQ" and ranges.begin<:begin and ranges.end>:end)""" @@ -482,19 +486,9 @@ def RESP_count(connection): return get_phase_occurrences(connection, 'RESP') -@metric -def PREB_count(connection): - return get_phase_occurrences(connection, 'PREB') - - -@metric -def PRE_count(connection): - return get_phase_occurrences(connection, 'PRE') - - -@metric -def ACTB_count(connection): - return get_phase_occurrences(connection, 'ACTB') +#@metric +#def ACTB_count(connection): +# return get_phase_occurrences(connection, 'ACTB') @metric @@ -502,19 +496,64 @@ def ACT_count(connection): return get_phase_occurrences(connection, 'ACT') -@metric -def PREA_count(connection): - return get_phase_occurrences(connection, 'PREA') +#@metric +#def PREB_count(connection): +# return get_phase_occurrences(connection, 'PREB') @metric -def REFA_count(connection): - return get_phase_occurrences(connection, 'REFA') +def PREPB_count(connection): + return get_phase_occurrences(connection, 'PREPB') + get_phase_occurrences(connection, 'PRE') @metric -def REFB_count(connection): - return get_phase_occurrences(connection, 'REFB') +def PRESB_count(connection): + return get_phase_occurrences(connection, 'PRESB') + + +@metric +def PREAB_count(connection): + return get_phase_occurrences(connection, 'PREAB') + get_phase_occurrences(connection, 'PREA') + + +@metric +def REFPB_count(connection): + return get_phase_occurrences(connection, 'REFPB') + get_phase_occurrences(connection, 'REFB') + + +@metric +def REFP2B_count(connection): + return get_phase_occurrences(connection, 'REFP2B') + + +@metric +def REFSB_count(connection): + return get_phase_occurrences(connection, 'REFSB') + + +@metric +def REFAB_count(connection): + return get_phase_occurrences(connection, 'REFAB') + get_phase_occurrences(connection, 'REFA') + + +@metric +def RFMPB_count(connection): + return get_phase_occurrences(connection, 'RFMPB') + + +@metric +def RFMP2B_count(connection): + return get_phase_occurrences(connection, 'RFMP2B') + + +@metric +def RFMSB_count(connection): + return get_phase_occurrences(connection, 'RFMSB') + + +@metric +def RFMAB_count(connection): + return get_phase_occurrences(connection, 'RFMAB') @metric @@ -591,17 +630,18 @@ def bank_overlap_ratio(connection): cursor.execute(""" select p1.PhaseBegin, p1.PhaseName from Phases p1 where - (p1.PhaseName = "ACT" or p1.PhaseName = "PREA" or p1.PhaseName = "PRE" or p1.PhaseName = "RDA" or p1.PhaseName = "WRA" or p1.PhaseName = "PREB" or p1.PhaseName = "ACTB") + (p1.PhaseName = "ACT" or p1.PhaseName = "PREPB" or p1.PhaseName = "PRE" or p1.PhaseName = "PRESB" + or p1.PhaseName = "PREAB" or p1.PhaseName = "PREA" or p1.PhaseName = "RDA" or p1.PhaseName = "WRA") order by PhaseBegin """) - prevPhase = "PREA" + prevPhase = "PREAB" prevTime = 0 for c in cursor: trace.append([(int(c[0]/clk)), c[1]]) # Insert a pseudo precharge all to mark the end of the trace - trace.append([traceEnd, "PREA"]) + trace.append([traceEnd, "PREAB"]) bankCounter = 0 bankTime = [] @@ -626,13 +666,13 @@ def bank_overlap_ratio(connection): print("Unexpected ACT. bankCounter was {0} valid range is python range {1}".format(bankCounter, validBankRange)) elif t[1] == "ACTB": actbCnt += 1 - elif(t[1] == "PREA"): + elif(t[1] == "PREAB" or t[1] == "PREA"): bankCounter = 0 - elif(t[1] == "PRE"): + elif(t[1] == "PREPB" or t[1] == "PRE"): if (bankCounter > 0): bankCounter -= 1 else: - print("Unexpected PRE. bankCounter was {0} valid range is python range {1}".format(bankCounter, validBankRange)) + print("Unexpected PREPB. bankCounter was {0} valid range is python range {1}".format(bankCounter, validBankRange)) elif(t[1] == "PREB"): # RGR first PREB closes the row ACT follows, then PREB again. if actbCnt > 0: diff --git a/DRAMSys/traceAnalyzer/scripts/tests.py b/DRAMSys/traceAnalyzer/scripts/tests.py index c23be21f..4f51e98c 100755 --- a/DRAMSys/traceAnalyzer/scripts/tests.py +++ b/DRAMSys/traceAnalyzer/scripts/tests.py @@ -236,9 +236,9 @@ def commandbus_slots_are_used_once(connection): cursor = connection.cursor() if (dramconfig.bankwiseLogic == "1"): - excludedPhases = "('REQ','RESP','PREA')" + excludedPhases = "('REQ','RESP','PREAB')" else: - excludedPhases = "('REQ','RESP','PREA','PDNA','PDNP','SREF','REFA')" + excludedPhases = "('REQ','RESP','PREAB','PDNA','PDNP','SREF','REFAB')" query = """SELECT PhaseBegin,count FROM (SELECT phaseBegin,count(phasebegin) AS count FROM Phases WHERE PhaseName NOT IN """ + excludedPhases + """ AND phasebegin>0 GROUP BY phaseBegin) WHERE count>1""" @@ -260,34 +260,34 @@ def phase_transitions_are_valid(connection): # validTransitions tells you which phases are allowed to follow the last transaction. if (dramconfig.bankwiseLogic == "1"): - validTransitions['PRE'] = set(['ACT', 'REFB', 'SREFB']) - validTransitions['ACT'] = set(['RD', 'RDA', 'WR', 'WRA', 'PRE', 'PREA']) + validTransitions['PREPB'] = set(['ACT', 'REFPB', 'SREFB']) + validTransitions['ACT'] = set(['RD', 'RDA', 'WR', 'WRA', 'PREPB', 'PREAB']) - validTransitions['RD'] = set(['PRE', 'RD', 'RDA', 'WR', 'WRA', 'PDNAB']) - validTransitions['WR'] = set(['PRE', 'RD', 'RDA', 'WR', 'WRA', 'PDNAB']) - validTransitions['RDA'] = set(['ACT', 'REFB', 'PDNPB']) - validTransitions['WRA'] = set(['ACT', 'REFB', 'PDNPB']) + validTransitions['RD'] = set(['PREPB', 'RD', 'RDA', 'WR', 'WRA', 'PDNAB']) + validTransitions['WR'] = set(['PREPB', 'RD', 'RDA', 'WR', 'WRA', 'PDNAB']) + validTransitions['RDA'] = set(['ACT', 'REFPB', 'PDNPB']) + validTransitions['WRA'] = set(['ACT', 'REFPB', 'PDNPB']) - validTransitions['REFB'] = set(['ACT', 'REFB', 'PDNPB', 'SREFB']) + validTransitions['REFPB'] = set(['ACT', 'REFPB', 'PDNPB', 'SREFB']) - validTransitions['PDNAB'] = set(['PRE', 'RD', 'RDA', 'WR', 'WRA', 'REFB']) - validTransitions['PDNPB'] = set(['ACT', 'REFB', 'SREFB']) - validTransitions['SREFB'] = set(['ACT', 'REFB']) + validTransitions['PDNAB'] = set(['PREPB', 'RD', 'RDA', 'WR', 'WRA', 'REFPB']) + validTransitions['PDNPB'] = set(['ACT', 'REFPB', 'SREFB']) + validTransitions['SREFB'] = set(['ACT', 'REFPB']) else: - validTransitions['PRE'] = set(['ACT', 'PREA', 'REFA']) - validTransitions['PREA'] = set(['REFA', 'SREF']) - validTransitions['ACT'] = set(['RD', 'RDA', 'WR', 'WRA', 'PREA']) + validTransitions['PREPB'] = set(['ACT', 'PREAB', 'REFAB']) + validTransitions['PREAB'] = set(['REFAB', 'SREF']) + validTransitions['ACT'] = set(['RD', 'RDA', 'WR', 'WRA', 'PREAB']) - validTransitions['RD'] = set(['PRE', 'PREA', 'RD', 'RDA', 'WR', 'WRA', 'PDNA']) - validTransitions['WR'] = set(['PRE', 'PREA', 'RD', 'RDA', 'WR', 'WRA', 'PDNA']) - validTransitions['RDA'] = set(['PREA', 'ACT', 'REFA', 'PDNA', 'PDNP']) - validTransitions['WRA'] = set(['PREA', 'ACT', 'REFA', 'PDNA', 'PDNP']) + validTransitions['RD'] = set(['PREPB', 'PREAB', 'RD', 'RDA', 'WR', 'WRA', 'PDNA']) + validTransitions['WR'] = set(['PREPB', 'PREAB', 'RD', 'RDA', 'WR', 'WRA', 'PDNA']) + validTransitions['RDA'] = set(['PREAB', 'ACT', 'REFAB', 'PDNA', 'PDNP']) + validTransitions['WRA'] = set(['PREAB', 'ACT', 'REFAB', 'PDNA', 'PDNP']) - validTransitions['REFA'] = set(['PREA', 'ACT', 'REFA', 'PDNA', 'PDNP', 'SREF']) + validTransitions['REFAB'] = set(['PREAB', 'ACT', 'REFAB', 'PDNA', 'PDNP', 'SREF']) - validTransitions['PDNA'] = set(['PRE', 'PREA', 'ACT', 'RD', 'RDA', 'WR', 'WRA', 'REFA', 'PDNA', 'PDNP']) - validTransitions['PDNP'] = set(['PREA', 'ACT', 'REFA', 'PDNA', 'PDNP', 'SREF']) - validTransitions['SREF'] = set(['PREA', 'ACT', 'REFA', 'PDNA', 'PDNP']) + validTransitions['PDNA'] = set(['PREPB', 'PREAB', 'ACT', 'RD', 'RDA', 'WR', 'WRA', 'REFAB', 'PDNA', 'PDNP']) + validTransitions['PDNP'] = set(['PREAB', 'ACT', 'REFAB', 'PDNA', 'PDNP', 'SREF']) + validTransitions['SREF'] = set(['PREAB', 'ACT', 'REFAB', 'PDNA', 'PDNP']) if (dramconfig.bankwiseLogic == "1"): query = """SELECT @@ -297,13 +297,13 @@ def phase_transitions_are_valid(connection): WHERE (TBank=:bank) AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin""" else: - # REFA, PREA, PDNA, PDNP and SREF are attributed to Bank 0 therefore this must be added to the order evaluation: + # REFAB, PREAB, PDNA, PDNP and SREF are attributed to Bank 0 therefore this must be added to the order evaluation: query = """SELECT PhaseName, phases.ID FROM phases INNER JOIN transactions ON phases.transact=transactions.ID WHERE - ((TBank=:bank) OR PhaseName IN ('PREA', 'SREF', 'PDNP', 'PDNA', 'REFA')) + ((TBank=:bank) OR PhaseName IN ('PREAB', 'SREF', 'PDNP', 'PDNA', 'REFAB')) AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin""" for bankNumber in range(dramconfig.numberOfBanks): @@ -324,14 +324,14 @@ def timing_constraint(FirstPhase, SecondPhase): FirstPhaseName = FirstPhase[0] SecondPhaseName = SecondPhase[0] - if ((FirstPhaseName == "PRE" or FirstPhaseName == "PREA") and SecondPhaseName != "PREA"): + if ((FirstPhaseName == "PREPB" or FirstPhaseName == "PREAB") and SecondPhaseName != "PREAB"): return dramconfig.tRP elif (FirstPhaseName == "ACT"): return dramconfig.tRCD elif (FirstPhaseName == "RD"): - if (SecondPhaseName in ["PRE, PREA"]): + if (SecondPhaseName in ["PREPB, PREAB"]): return dramconfig.tRTP elif (SecondPhaseName in ["RD, RDA"]): return max(dramconfig.tCCD_L, dramconfig.getReadAccessTime()) @@ -341,7 +341,7 @@ def timing_constraint(FirstPhase, SecondPhase): return dramconfig.tRL + dramconfig.getReadAccessTime() + dramconfig.clk elif (FirstPhaseName == "WR"): - if (SecondPhaseName in ["PRE, PREA", "PDNA"]): + if (SecondPhaseName in ["PREPB, PREAB", "PDNA"]): return dramconfig.tWL + dramconfig.getWriteAccessTime() + dramconfig.tWR elif (SecondPhaseName in ["RD, RDA"]): return dramconfig.tWL + dramconfig.getWriteAccessTime() + dramconfig.tWTR_L @@ -349,22 +349,22 @@ def timing_constraint(FirstPhase, SecondPhase): return max(dramconfig.tCCD_L, burstlength/dramconfig.dataRate) elif (FirstPhaseName == "RDA"): - if (SecondPhaseName in ["ACT", "REFA"]): + if (SecondPhaseName in ["ACT", "REFAB"]): return dramconfig.tRTP + dramconfig.tRP - elif (SecondPhaseName == "PREA"): + elif (SecondPhaseName == "PREAB"): return dramconfig.tRTP elif (SecondPhaseName in ["PDNA", "PDNP"]): return dramconfig.tRL + dramconfig.getReadAccessTime() + dramconfig.clk elif (FirstPhaseName == "WRA"): - if (SecondPhaseName in ["ACT", "REFA"]): + if (SecondPhaseName in ["ACT", "REFAB"]): return dramconfig.tWL + dramconfig.getWriteAccessTime() + dramconfig.tWR + dramconfig.tRP - elif (SecondPhaseName == "PREA"): + elif (SecondPhaseName == "PREAB"): return dramconfig.tWL + dramconfig.getWriteAccessTime() + dramconfig.tWR elif (SecondPhaseName in ["PDNA", "PDNP"]): return dramconfig.tWL + dramconfig.getWriteAccessTime() + dramconfig.tWR + dramconfig.clk - elif (FirstPhaseName == "REFA"): + elif (FirstPhaseName == "REFAB"): return dramconfig.tRFC elif (FirstPhaseName in ["PDNA", "PDNP"]): @@ -392,7 +392,7 @@ def timing_constraits_on_the_same_bank_hold(connection): AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin""" else: query = """SELECT PhaseName, phases.ID, PhaseBegin, PhaseEnd FROM phases INNER JOIN transactions ON phases.transact=transactions.ID - WHERE ((TBank=:bank) OR PhaseName IN ('PREA', 'SREF', 'PDNP', 'PDNA', 'REFA')) AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin""" + WHERE ((TBank=:bank) OR PhaseName IN ('PREAB', 'SREF', 'PDNP', 'PDNA', 'REFAB')) AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin""" for bankNumber in range(dramconfig.numberOfBanks): cursor.execute(query, {"bank": bankNumber}) lastRow = cursor.fetchone() @@ -418,27 +418,27 @@ def row_buffer_is_used_correctly(connection): FROM phases INNER JOIN transactions ON phases.transact=transactions.ID WHERE - ((TBank=:bank) OR (PhaseNAME = "REFA" AND TBank=0) OR (PhaseNAME = "PREA" AND TBank=0)) + ((TBank=:bank) OR (PhaseNAME = "REFAB" AND TBank=0) OR (PhaseNAME = "PREAB" AND TBank=0)) AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin""" else: - # REFA, PREA, PDNA, PDNP and SREF are stored to bank0 for all the other banks we have also to grep this command: - # PhaseName IN ('PREA', 'SREF', 'PDNP', 'PDNA', 'REFA') + # REFAB, PREAB, PDNA, PDNP and SREF are stored to bank0 for all the other banks we have also to grep this command: + # PhaseName IN ('PREAB', 'SREF', 'PDNP', 'PDNA', 'REFAB') query = """SELECT PhaseName, phases.ID FROM phases INNER JOIN transactions ON phases.transact=transactions.ID WHERE - ((TBank=:bank) OR PhaseName IN ('PREA', 'SREF', 'PDNP', 'PDNA', 'REFA')) + ((TBank=:bank) OR PhaseName IN ('PREAB', 'SREF', 'PDNP', 'PDNA', 'REFAB')) AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin""" # phases that precharge the bank and close the rowbuffer - prechargingPhases = set(['PRE', 'PREA', 'RDA', 'WRA']) + prechargingPhases = set(['PREPB', 'PREAB', 'RDA', 'WRA']) # phases that require the bank to be in active state and the rowbuffer to be opened - accessingPhases = set(['RD', 'RDA', 'WR', 'WRA', 'PRE']) + accessingPhases = set(['RD', 'RDA', 'WR', 'WRA', 'PREPB']) # phases that require the bank to be in precharged state and the robuffer to be closed - idlePhases = set(['ACT', 'PDNP', 'REFA', 'SREF']) + idlePhases = set(['ACT', 'PDNP', 'REFAB', 'SREF']) for bankNumber in range(dramconfig.numberOfBanks): cursor.execute(query, {"bank": bankNumber}) @@ -466,11 +466,11 @@ def no_commands_during_refresh(connection): """Checks that no command was scheduled during refresh period""" cursor = connection.cursor() if (dramconfig.bankwiseLogic == "1"): - query = """SELECT PhaseBegin, PhaseEnd, TBank FROM phases INNER JOIN transactions ON phases.transact=transactions.ID WHERE PhaseName = 'REFB' """ - test_query = """SELECT PhaseName FROM phases INNER JOIN transactions ON phases.transact=transactions.ID WHERE ((PhaseBegin >= ? and PhaseEnd <= ?) or (PhaseBegin <= ? and PhaseEnd > ?) or (PhaseBegin < ? and PhaseEnd >= ?)) and PhaseName NOT IN ('REQ','RESP','REFB') and TBank = ?""" + query = """SELECT PhaseBegin, PhaseEnd, TBank FROM phases INNER JOIN transactions ON phases.transact=transactions.ID WHERE PhaseName = 'REFPB' """ + test_query = """SELECT PhaseName FROM phases INNER JOIN transactions ON phases.transact=transactions.ID WHERE ((PhaseBegin >= ? and PhaseEnd <= ?) or (PhaseBegin <= ? and PhaseEnd > ?) or (PhaseBegin < ? and PhaseEnd >= ?)) and PhaseName NOT IN ('REQ','RESP','REFPB') and TBank = ?""" else: - query = """SELECT PhaseBegin, PhaseEnd FROM phases WHERE PhaseName = 'REFA' """ - test_query = """SELECT PhaseName FROM phases WHERE ((PhaseBegin >= ? and PhaseEnd <= ?) or (PhaseBegin <= ? and PhaseEnd > ?) or (PhaseBegin < ? and PhaseEnd >= ?)) and PhaseName NOT IN ('REQ','RESP','REFA')""" + query = """SELECT PhaseBegin, PhaseEnd FROM phases WHERE PhaseName = 'REFAB' """ + test_query = """SELECT PhaseName FROM phases WHERE ((PhaseBegin >= ? and PhaseEnd <= ?) or (PhaseBegin <= ? and PhaseEnd > ?) or (PhaseBegin < ? and PhaseEnd >= ?)) and PhaseName NOT IN ('REQ','RESP','REFAB')""" cursor.execute(query) result = cursor.fetchall() @@ -488,9 +488,9 @@ def no_commands_during_refresh(connection): @test def max_number_ref_burst(connection): - """Checks that the maximum number of REFA commands in a burst is not exceeded""" + """Checks that the maximum number of REFAB commands in a burst is not exceeded""" cursor = connection.cursor() - query = """SELECT PhaseBegin, PhaseEnd FROM phases WHERE PhaseName = 'REFA' """ + query = """SELECT PhaseBegin, PhaseEnd FROM phases WHERE PhaseName = 'REFAB' """ prevrow = [0] * 2 cnt = 0 flexibleRef = getFlexibleRef(connection) @@ -509,7 +509,7 @@ def max_number_ref_burst(connection): cnt = 0 # Reset the counter every time a burst ends prevrow = row if(cnt > maxRefBurst): - return TestFailed("Maximum number of REFA in a burst was exceeded at {0} with {1} REFA in sequence. Maximum allowed is {2}.".format(formatTime(row[0]), cnt, maxRefBurst)) + return TestFailed("Maximum number of REFAB in a burst was exceeded at {0} with {1} REFAB in sequence. Maximum allowed is {2}.".format(formatTime(row[0]), cnt, maxRefBurst)) return TestSuceeded() @@ -517,9 +517,9 @@ def max_number_ref_burst(connection): @test @test def max_time_without_ref(connection): - """Checks that the maximum time allowed between REFA/SREF commands is not exceeded""" + """Checks that the maximum time allowed between REFAB/SREF commands is not exceeded""" cursor = connection.cursor() - query = """SELECT PhaseBegin, PhaseEnd FROM phases WHERE PhaseName = 'REFA' OR PhaseName = 'SREF' """ + query = """SELECT PhaseBegin, PhaseEnd FROM phases WHERE PhaseName = 'REFAB' OR PhaseName = 'SREF' """ prevrow = [0] * 2 flexibleRef = getFlexibleRef(connection) maxRefBurst = getMaxRefBurst(connection) diff --git a/DRAMSys/traceAnalyzer/scripts/vcdExport.py b/DRAMSys/traceAnalyzer/scripts/vcdExport.py index 2401f66a..a46e0419 100755 --- a/DRAMSys/traceAnalyzer/scripts/vcdExport.py +++ b/DRAMSys/traceAnalyzer/scripts/vcdExport.py @@ -89,8 +89,9 @@ class Transaction(): class Granularity(enum.Enum): Bankwise = 0 - Groupwise = 1 - Rankwise = 2 + TwoBankwise = 1 + Groupwise = 2 + Rankwise = 3 class TimeWindow(): def __init__(self, windowSize, lastTimestamp): @@ -113,30 +114,38 @@ class TimeWindow(): def numberOfIterations(self): return int(self.lastTimestamp / self.windowSize) + def getGranularity(phase): if phase == "PRESB" or phase == "REFSB" or phase == "RFMSB": return Granularity.Groupwise - elif phase == "PREA" or phase == "REFA" or phase=="RFMAB" or phase == "PDNA" or phase == "PDNP" or phase == "SREF": + elif phase == "REFP2B" or phase == "RFMP2B": + return Granularity.TwoBankwise + elif phase == "PREAB" or phase == "PREA" or phase == "REFAB" or phase == "REFA" or phase == "RFMAB" \ + or phase == "PDNA" or phase == "PDNP" or phase == "SREF": return Granularity.Rankwise else: return Granularity.Bankwise + def getAmountOfCommandBusSpans(phase): if phase == "PDNA" or phase == "PDNAB" or phase == "PDNP" or phase == "PDNPB" or phase == "SREF" or phase == "SREFB": return 2 else: return 1 + def getUnitOfTime(connection): _, unit = getClock(connection) return unit.lower() + def getLastTimestamp(connection): cursor = connection.cursor() cursor.execute("SELECT DataStrobeEnd FROM Transactions ORDER BY DataStrobeEnd DESC LIMIT 1") return cursor.fetchone()[0] + def getRanksBankgroupsBanks(connection): ranks = getNumberOfRanks(connection) bankgroups = int(getNumberOfBankGroups(connection) / ranks) @@ -144,9 +153,11 @@ def getRanksBankgroupsBanks(connection): return (ranks, bankgroups, banks) + def getBankName(rank, bankgroup, bank): return "RA" + str(rank) + "_BG" + str(bankgroup) + "_BA" + str(bank) + def getBankNames(ranks, bankgroups, banks): names = [] for rank in range(ranks): @@ -156,6 +167,7 @@ def getBankNames(ranks, bankgroups, banks): return names + def getOccurringSignals(connection): setOfSignals = set() @@ -172,6 +184,7 @@ def getOccurringSignals(connection): return setOfSignals + def getDataBusEvents(connection, eventDict, windowRange): beginWindow, endWindow = windowRange @@ -190,6 +203,7 @@ def getDataBusEvents(connection, eventDict, windowRange): eventDict[begin].append(Event("Data_Bus", command + " " + str(transactionId))) eventDict[end].append(Event("Data_Bus", "")) + def getCommandBusEvents(connection, eventDict, transactionDict, windowRange): beginWindow, endWindow = windowRange @@ -236,11 +250,15 @@ def getCommandBusEvents(connection, eventDict, transactionDict, windowRange): for _bankgroup in range(bankgroups): for _bank in range(banks): currentBanks.append((rank, _bankgroup, _bank)) - elif getGranularity(phase) == Granularity.Groupwise: for _bankgroup in range(bankgroups): currentBanks.append((rank, _bankgroup, bank)) - + elif getGranularity(phase) == Granularity.TwoBankwise: + currentBanks.append((rank, bankgroup, bank)) + per2BankOffset = getPer2BankOffset(connection) + bankgroupOffset = per2BankOffset // banks + bankOffset = per2BankOffset % banks + currentBanks.append((rank, bankgroup + bankgroupOffset, bank + bankOffset)) else: currentBanks.append((rank, bankgroup, bank)) @@ -250,6 +268,7 @@ def getCommandBusEvents(connection, eventDict, transactionDict, windowRange): eventDict[begin].append(Event(currentBankName, phase + " " + str(transactionId))) eventDict[end].append(Event(currentBankName, "")) + def getTransactionRange(connection, transactionRange, windowRange): beginWindow, endWindow = windowRange @@ -270,6 +289,7 @@ def getTransactionRange(connection, transactionRange, windowRange): transactionRange.append(minTransaction) transactionRange.append(maxTransaction) + def getReqAndRespPhases(connection, eventDict, transactionDict, windowRange): beginWindow, endWindow = windowRange @@ -294,6 +314,7 @@ def getReqAndRespPhases(connection, eventDict, transactionDict, windowRange): eventDict[begin].append(Event(phase, command + " " + str(transactionId))) eventDict[end].append(Event(phase, "")) + def getTransactions(connection, transactionDict, transactionRange): minTransaction, maxTransaction = transactionRange @@ -353,6 +374,7 @@ def dumpVcd(pathToTrace): f.seek(0) return f.read() + if __name__ == "__main__": if len(sys.argv) == 2: dump = dumpVcd(sys.argv[1])