diff --git a/extensions/standards/DDR5/DRAMSys/configuration/memspec/MemSpecDDR5.cpp b/extensions/standards/DDR5/DRAMSys/configuration/memspec/MemSpecDDR5.cpp index bd2c4b0d..9446cb7e 100644 --- a/extensions/standards/DDR5/DRAMSys/configuration/memspec/MemSpecDDR5.cpp +++ b/extensions/standards/DDR5/DRAMSys/configuration/memspec/MemSpecDDR5.cpp @@ -230,20 +230,20 @@ sc_time MemSpecDDR5::getExecutionTime(Command command, const tlm_generic_payload } else if (command == Command::RDA) return tRTP + tRP + longCmdOffset; - else if (command == Command::WR) + else if (command == Command::WR || command == Command::MWR) { if (ControllerExtension::getBurstLength(payload) == 32) return tWL + tBURST32 + longCmdOffset; else return tWL + tBURST16 + longCmdOffset; - } - else if (command == Command::WRA) + } + else if (command == Command::WRA || command == Command::MWRA) { if (ControllerExtension::getBurstLength(payload) == 32) return tWL + tBURST32 + tWR + tRP + longCmdOffset; else return tWL + tBURST16 + tWR + tRP + longCmdOffset; - } + } else if (command == Command::REFAB || command == Command::RFMAB) return tRFC_slr + shortCmdOffset; else if (command == Command::REFSB || command == Command::RFMSB) @@ -265,7 +265,7 @@ TimeInterval MemSpecDDR5::getIntervalOnDataStrobe(Command command, const tlm_gen else return {tRL + longCmdOffset, tRL + tBURST16 + longCmdOffset}; } - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) { if (ControllerExtension::getBurstLength(payload) == 32) return {tWL + longCmdOffset, tWL + tBURST32 + longCmdOffset}; @@ -279,4 +279,10 @@ TimeInterval MemSpecDDR5::getIntervalOnDataStrobe(Command command, const tlm_gen } } +bool MemSpecDDR5::requiresReadModifyWrite(const tlm::tlm_generic_payload& payload) const +{ + assert(false); // TODO + return payload.get_byte_enable_ptr() != nullptr; +} + } // namespace DRAMSys diff --git a/extensions/standards/DDR5/DRAMSys/configuration/memspec/MemSpecDDR5.h b/extensions/standards/DDR5/DRAMSys/configuration/memspec/MemSpecDDR5.h index cc0eb9cd..dacc5ef1 100644 --- a/extensions/standards/DDR5/DRAMSys/configuration/memspec/MemSpecDDR5.h +++ b/extensions/standards/DDR5/DRAMSys/configuration/memspec/MemSpecDDR5.h @@ -128,6 +128,8 @@ public: sc_core::sc_time getExecutionTime(Command command, const tlm::tlm_generic_payload &payload) const override; TimeInterval getIntervalOnDataStrobe(Command command, const tlm::tlm_generic_payload &payload) const override; + + bool requiresReadModifyWrite(const tlm::tlm_generic_payload& payload) const override; }; } // namespace DRAMSys diff --git a/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.cpp b/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.cpp index ffbc1803..c25e549e 100644 --- a/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.cpp +++ b/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.cpp @@ -338,7 +338,7 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } } } - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) { unsigned burstLength = ControllerExtension::getBurstLength(payload); assert((burstLength == 16) || (burstLength == 32)); diff --git a/extensions/standards/HBM3/DRAMSys/configuration/memspec/MemSpecHBM3.cpp b/extensions/standards/HBM3/DRAMSys/configuration/memspec/MemSpecHBM3.cpp index b251ee72..1ed567c0 100644 --- a/extensions/standards/HBM3/DRAMSys/configuration/memspec/MemSpecHBM3.cpp +++ b/extensions/standards/HBM3/DRAMSys/configuration/memspec/MemSpecHBM3.cpp @@ -153,9 +153,9 @@ sc_time MemSpecHBM3::getExecutionTime(Command command, const tlm_generic_payload return tRL + tDQSCK + burstDuration; else if (command == Command::RDA) return tRTP + tRP; - else if (command == Command::WR) + else if (command == Command::WR || command == Command::MWR) return tWL + burstDuration; - else if (command == Command::WRA) + else if (command == Command::WRA || command == Command::MWRA) return tWL + burstDuration + tWR + tRP; else if (command == Command::REFAB || command == Command::RFMAB) return tRFC; @@ -173,7 +173,7 @@ TimeInterval MemSpecHBM3::getIntervalOnDataStrobe(Command command, const tlm_gen { if (command == Command::RD || command == Command::RDA) return {tRL + tDQSCK, tRL + tDQSCK + burstDuration}; - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) return {tWL, tWL + burstDuration}; else { diff --git a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp index f081e85a..d9d3fde4 100644 --- a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp +++ b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp @@ -155,7 +155,7 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandOnCasBus != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnCasBus + memSpec->tCK); } - else if (command == Command::WR) + else if (command == Command::WR || command == Command::MWR) { lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) @@ -242,7 +242,7 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandOnCasBus != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnCasBus + memSpec->tCK); } - else if (command == Command::WRA) + else if (command == Command::WRA || command == Command::MWRA) { lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) diff --git a/extensions/standards/LPDDR5/DRAMSys/configuration/memspec/MemSpecLPDDR5.cpp b/extensions/standards/LPDDR5/DRAMSys/configuration/memspec/MemSpecLPDDR5.cpp index a34d70ba..05fe2990 100644 --- a/extensions/standards/LPDDR5/DRAMSys/configuration/memspec/MemSpecLPDDR5.cpp +++ b/extensions/standards/LPDDR5/DRAMSys/configuration/memspec/MemSpecLPDDR5.cpp @@ -184,7 +184,7 @@ sc_time MemSpecLPDDR5::getExecutionTime(Command command, const tlm_generic_paylo else return BL_n_min_16 + tRBTP + tRPpb; } - else if (command == Command::WR) + else if (command == Command::WR || command == Command::MWR) { if (ControllerExtension::getBurstLength(trans) == 32) { @@ -196,7 +196,7 @@ sc_time MemSpecLPDDR5::getExecutionTime(Command command, const tlm_generic_paylo else return tWL + tBURST16; } - else if (command == Command::WRA) + else if (command == Command::WRA || command == Command::MWRA) { if (ControllerExtension::getBurstLength(trans) == 32) return tWL + BL_n_min_32 + tCK + tWR + tRPpb; @@ -229,7 +229,7 @@ TimeInterval MemSpecLPDDR5::getIntervalOnDataStrobe(Command command, const tlm_g else return {tRL, tRL + tBURST16}; } - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) { if (ControllerExtension::getBurstLength(trans) == 32) { @@ -248,4 +248,10 @@ TimeInterval MemSpecLPDDR5::getIntervalOnDataStrobe(Command command, const tlm_g } } +bool MemSpecLPDDR5::requiresReadModifyWrite(const tlm::tlm_generic_payload& payload) const +{ + assert(false); // TODO + return payload.get_byte_enable_ptr() != nullptr; +} + } // namespace DRAMSys diff --git a/extensions/standards/LPDDR5/DRAMSys/configuration/memspec/MemSpecLPDDR5.h b/extensions/standards/LPDDR5/DRAMSys/configuration/memspec/MemSpecLPDDR5.h index 5091bc98..594ba768 100644 --- a/extensions/standards/LPDDR5/DRAMSys/configuration/memspec/MemSpecLPDDR5.h +++ b/extensions/standards/LPDDR5/DRAMSys/configuration/memspec/MemSpecLPDDR5.h @@ -120,6 +120,8 @@ public: sc_core::sc_time getExecutionTime(Command command, const tlm::tlm_generic_payload &payload) const override; TimeInterval getIntervalOnDataStrobe(Command command, const tlm::tlm_generic_payload &payload) const override; + bool requiresReadModifyWrite(const tlm::tlm_generic_payload& payload) const override; + private: unsigned per2BankOffset; }; diff --git a/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp b/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp index 52edc578..955bded6 100644 --- a/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp +++ b/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp @@ -240,7 +240,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tWL + memSpec->BL_n_min_16 + memSpec->tCK - memSpec->tRL); } } - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) { unsigned burstLength = ControllerExtension::getBurstLength(payload); assert(!(memSpec->bankMode == MemSpecLPDDR5::BankMode::M8B) || (burstLength == 32)); // 8B mode -> BL32 diff --git a/src/libdramsys/DRAMSys/configuration/memspec/MemSpec.cpp b/src/libdramsys/DRAMSys/configuration/memspec/MemSpec.cpp index 5c3c140d..7fc5b70d 100644 --- a/src/libdramsys/DRAMSys/configuration/memspec/MemSpec.cpp +++ b/src/libdramsys/DRAMSys/configuration/memspec/MemSpec.cpp @@ -148,4 +148,9 @@ bool MemSpec::hasRasAndCasBus() const return false; } +bool MemSpec::requiresReadModifyWrite(const tlm::tlm_generic_payload& payload) const +{ + return payload.get_byte_enable_ptr() != nullptr; +} + } // namespace DRAMSys diff --git a/src/libdramsys/DRAMSys/configuration/memspec/MemSpec.h b/src/libdramsys/DRAMSys/configuration/memspec/MemSpec.h index f3189285..7b28e7ac 100644 --- a/src/libdramsys/DRAMSys/configuration/memspec/MemSpec.h +++ b/src/libdramsys/DRAMSys/configuration/memspec/MemSpec.h @@ -102,6 +102,8 @@ public: virtual sc_core::sc_time getExecutionTime(Command command, const tlm::tlm_generic_payload& payload) const = 0; virtual TimeInterval getIntervalOnDataStrobe(Command command, const tlm::tlm_generic_payload& payload) const = 0; + virtual bool requiresReadModifyWrite(const tlm::tlm_generic_payload& payload) const; + sc_core::sc_time getCommandLength(Command) const; double getCommandLengthInCycles(Command) const; uint64_t getSimMemSizeInBytes() const; diff --git a/src/libdramsys/DRAMSys/configuration/memspec/MemSpecDDR3.cpp b/src/libdramsys/DRAMSys/configuration/memspec/MemSpecDDR3.cpp index 4e9150f4..716f44e1 100644 --- a/src/libdramsys/DRAMSys/configuration/memspec/MemSpecDDR3.cpp +++ b/src/libdramsys/DRAMSys/configuration/memspec/MemSpecDDR3.cpp @@ -137,9 +137,9 @@ sc_time MemSpecDDR3::getExecutionTime(Command command, const tlm_generic_payload return tRL + burstDuration; else if (command == Command::RDA) return tRTP + tRP; - else if (command == Command::WR) + else if (command == Command::WR || command == Command::MWR) return tWL + burstDuration; - else if (command == Command::WRA) + else if (command == Command::WRA || command == Command::MWRA) return tWL + burstDuration + tWR + tRP; else if (command == Command::REFAB) return tRFC; @@ -155,7 +155,7 @@ TimeInterval MemSpecDDR3::getIntervalOnDataStrobe(Command command, const tlm_gen { if (command == Command::RD || command == Command::RDA) return {tRL, tRL + burstDuration}; - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) return {tWL, tWL + burstDuration}; else { diff --git a/src/libdramsys/DRAMSys/configuration/memspec/MemSpecDDR4.cpp b/src/libdramsys/DRAMSys/configuration/memspec/MemSpecDDR4.cpp index 10d7a37d..d781c42e 100644 --- a/src/libdramsys/DRAMSys/configuration/memspec/MemSpecDDR4.cpp +++ b/src/libdramsys/DRAMSys/configuration/memspec/MemSpecDDR4.cpp @@ -156,9 +156,9 @@ sc_time MemSpecDDR4::getExecutionTime(Command command, const tlm_generic_payload return tRL + burstDuration; else if (command == Command::RDA) return tRTP + tRP; - else if (command == Command::WR) + else if (command == Command::WR || command == Command::MWR) return tWL + burstDuration; - else if (command == Command::WRA) + else if (command == Command::WRA || command == Command::MWRA) return tWL + burstDuration + tWR + tRP; else if (command == Command::REFAB) return tRFC; @@ -174,7 +174,7 @@ TimeInterval MemSpecDDR4::getIntervalOnDataStrobe(Command command, const tlm::tl { if (command == Command::RD || command == Command::RDA) return {tRL, tRL + burstDuration}; - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) return {tWL, tWL + burstDuration}; else { diff --git a/src/libdramsys/DRAMSys/configuration/memspec/MemSpecGDDR5.cpp b/src/libdramsys/DRAMSys/configuration/memspec/MemSpecGDDR5.cpp index 9dd86741..1bb1f1b7 100644 --- a/src/libdramsys/DRAMSys/configuration/memspec/MemSpecGDDR5.cpp +++ b/src/libdramsys/DRAMSys/configuration/memspec/MemSpecGDDR5.cpp @@ -141,9 +141,9 @@ sc_time MemSpecGDDR5::getExecutionTime(Command command, const tlm_generic_payloa return tCL + tWCK2CKPIN + tWCK2CK + tWCK2DQO + burstDuration; else if (command == Command::RDA) return tRTP + tRP; - else if (command == Command::WR) + else if (command == Command::WR || command == Command::MWR) return tWL + tWCK2CKPIN + tWCK2CK + tWCK2DQI + burstDuration; - else if (command == Command::WRA) + else if (command == Command::WRA || command == Command::MWRA) return tWL + burstDuration + tWR + tRP; else if (command == Command::REFAB) return tRFC; @@ -161,7 +161,7 @@ TimeInterval MemSpecGDDR5::getIntervalOnDataStrobe(Command command, const tlm_ge { if (command == Command::RD || command == Command::RDA) return {tCL + tWCK2CKPIN + tWCK2CK + tWCK2DQO, tCL + tWCK2CKPIN + tWCK2CK + tWCK2DQO + burstDuration}; - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) return {tWL + tWCK2CKPIN + tWCK2CK + tWCK2DQI, tWL + tWCK2CKPIN + tWCK2CK + tWCK2DQI + burstDuration}; else { diff --git a/src/libdramsys/DRAMSys/configuration/memspec/MemSpecGDDR5X.cpp b/src/libdramsys/DRAMSys/configuration/memspec/MemSpecGDDR5X.cpp index 2ff265aa..5d380a2b 100644 --- a/src/libdramsys/DRAMSys/configuration/memspec/MemSpecGDDR5X.cpp +++ b/src/libdramsys/DRAMSys/configuration/memspec/MemSpecGDDR5X.cpp @@ -141,9 +141,9 @@ sc_time MemSpecGDDR5X::getExecutionTime(Command command, const tlm_generic_paylo return tRL + tWCK2CKPIN + tWCK2CK + tWCK2DQO + burstDuration; else if (command == Command::RDA) return tRTP + tRP; - else if (command == Command::WR) + else if (command == Command::WR || command == Command::MWR) return tWL + tWCK2CKPIN + tWCK2CK + tWCK2DQI + burstDuration; - else if (command == Command::WRA) + else if (command == Command::WRA || command == Command::MWRA) return tWL + burstDuration + tWR + tRP; else if (command == Command::REFAB) return tRFC; @@ -161,7 +161,7 @@ TimeInterval MemSpecGDDR5X::getIntervalOnDataStrobe(Command command, const tlm_g { if (command == Command::RD || command == Command::RDA) return {tRL + tWCK2CKPIN + tWCK2CK + tWCK2DQO, tRL + tWCK2CKPIN + tWCK2CK + tWCK2DQO + burstDuration}; - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) return {tWL + tWCK2CKPIN + tWCK2CK + tWCK2DQI, tWL + tWCK2CKPIN + tWCK2CK + tWCK2DQI + burstDuration}; else { diff --git a/src/libdramsys/DRAMSys/configuration/memspec/MemSpecGDDR6.cpp b/src/libdramsys/DRAMSys/configuration/memspec/MemSpecGDDR6.cpp index 818f251e..d8ff81a0 100644 --- a/src/libdramsys/DRAMSys/configuration/memspec/MemSpecGDDR6.cpp +++ b/src/libdramsys/DRAMSys/configuration/memspec/MemSpecGDDR6.cpp @@ -154,9 +154,9 @@ sc_time MemSpecGDDR6::getExecutionTime(Command command, const tlm_generic_payloa return tRL + tWCK2CKPIN + tWCK2CK + tWCK2DQO + burstDuration; else if (command == Command::RDA) return tRTP + tRP; - else if (command == Command::WR) + else if (command == Command::WR || command == Command::MWR) return tWL + tWCK2CKPIN + tWCK2CK + tWCK2DQI + burstDuration; - else if (command == Command::WRA) + else if (command == Command::WRA || command == Command::MWRA) return tWL + burstDuration + tWR + tRP; else if (command == Command::REFAB) return tRFCab; @@ -174,7 +174,7 @@ TimeInterval MemSpecGDDR6::getIntervalOnDataStrobe(Command command, const tlm_ge { if (command == Command::RD || command == Command::RDA) return {tRL + tWCK2CKPIN + tWCK2CK + tWCK2DQO, tRL + tWCK2CKPIN + tWCK2CK + tWCK2DQO + burstDuration}; - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) return {tWL + tWCK2CKPIN + tWCK2CK + tWCK2DQI, tWL + tWCK2CKPIN + tWCK2CK + tWCK2DQI + burstDuration}; else { diff --git a/src/libdramsys/DRAMSys/configuration/memspec/MemSpecHBM2.cpp b/src/libdramsys/DRAMSys/configuration/memspec/MemSpecHBM2.cpp index 79b8c801..61acd0f6 100644 --- a/src/libdramsys/DRAMSys/configuration/memspec/MemSpecHBM2.cpp +++ b/src/libdramsys/DRAMSys/configuration/memspec/MemSpecHBM2.cpp @@ -142,9 +142,9 @@ sc_time MemSpecHBM2::getExecutionTime(Command command, const tlm_generic_payload return tRL + tDQSCK + burstDuration; else if (command == Command::RDA) return tRTP + tRP; - else if (command == Command::WR) + else if (command == Command::WR || command == Command::MWR) return tWL + burstDuration; - else if (command == Command::WRA) + else if (command == Command::WRA || command == Command::MWRA) return tWL + burstDuration + tWR + tRP; else if (command == Command::REFAB) return tRFC; @@ -162,7 +162,7 @@ TimeInterval MemSpecHBM2::getIntervalOnDataStrobe(Command command, const tlm_gen { if (command == Command::RD || command == Command::RDA) return {tRL + tDQSCK, tRL + tDQSCK + burstDuration}; - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) return {tWL, tWL + burstDuration}; else { diff --git a/src/libdramsys/DRAMSys/configuration/memspec/MemSpecLPDDR4.cpp b/src/libdramsys/DRAMSys/configuration/memspec/MemSpecLPDDR4.cpp index a90e67de..1fcff328 100644 --- a/src/libdramsys/DRAMSys/configuration/memspec/MemSpecLPDDR4.cpp +++ b/src/libdramsys/DRAMSys/configuration/memspec/MemSpecLPDDR4.cpp @@ -144,9 +144,9 @@ sc_time MemSpecLPDDR4::getExecutionTime(Command command, const tlm_generic_paylo return tRL + tDQSCK + burstDuration + 3 * tCK; else if (command == Command::RDA) return burstDuration + tRTP - 5 * tCK + tRPpb; - else if (command == Command::WR) + else if (command == Command::WR || command == Command::MWR) return tWL + tDQSS + tDQS2DQ + burstDuration + 3 * tCK; - else if (command == Command::WRA) + else if (command == Command::WRA || command == Command::MWRA) return tWL + 4 * tCK + burstDuration + tWR + tRPpb; else if (command == Command::REFAB) return tRFCab + tCK; @@ -164,7 +164,7 @@ TimeInterval MemSpecLPDDR4::getIntervalOnDataStrobe(Command command, const tlm_g { if (command == Command::RD || command == Command::RDA) return {tRL + tDQSCK + 3 * tCK, tRL + tDQSCK + burstDuration + 3 * tCK}; - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) return {tWL + tDQSS + tDQS2DQ + 3 * tCK, tWL + tDQSS + tDQS2DQ + burstDuration + 3 * tCK}; else { diff --git a/src/libdramsys/DRAMSys/configuration/memspec/MemSpecSTTMRAM.cpp b/src/libdramsys/DRAMSys/configuration/memspec/MemSpecSTTMRAM.cpp index 76ea4cbd..46071ad9 100644 --- a/src/libdramsys/DRAMSys/configuration/memspec/MemSpecSTTMRAM.cpp +++ b/src/libdramsys/DRAMSys/configuration/memspec/MemSpecSTTMRAM.cpp @@ -114,9 +114,9 @@ sc_time MemSpecSTTMRAM::getExecutionTime(Command command, const tlm_generic_payl return tRL + burstDuration; else if (command == Command::RDA) return tRTP + tRP; - else if (command == Command::WR) + else if (command == Command::WR || command == Command::MWR) return tWL + burstDuration; - else if (command == Command::WRA) + else if (command == Command::WRA || command == Command::MWRA) return tWL + burstDuration + tWR + tRP; else { @@ -130,7 +130,7 @@ TimeInterval MemSpecSTTMRAM::getIntervalOnDataStrobe(Command command, const tlm: { if (command == Command::RD || command == Command::RDA) return {tRL, tRL + burstDuration}; - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) return {tWL, tWL + burstDuration}; else { diff --git a/src/libdramsys/DRAMSys/configuration/memspec/MemSpecWideIO.cpp b/src/libdramsys/DRAMSys/configuration/memspec/MemSpecWideIO.cpp index a72f8d72..cae6509c 100644 --- a/src/libdramsys/DRAMSys/configuration/memspec/MemSpecWideIO.cpp +++ b/src/libdramsys/DRAMSys/configuration/memspec/MemSpecWideIO.cpp @@ -143,9 +143,9 @@ sc_time MemSpecWideIO::getExecutionTime(Command command, const tlm_generic_paylo return tRL + tAC + burstDuration; else if (command == Command::RDA) return burstDuration + tRP; - else if (command == Command::WR) + else if (command == Command::WR || command == Command::MWR) return tWL + burstDuration; - else if (command == Command::WRA) + else if (command == Command::WRA || command == Command::MWRA) return tWL + burstDuration - tCK + tWR + tRP; else if (command == Command::REFAB) return tRFC; @@ -161,7 +161,7 @@ TimeInterval MemSpecWideIO::getIntervalOnDataStrobe(Command command, const tlm_g { if (command == Command::RD || command == Command::RDA) return {tRL + tAC, tRL + tAC + burstDuration}; - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) return {tWL, tWL + burstDuration}; else { diff --git a/src/libdramsys/DRAMSys/configuration/memspec/MemSpecWideIO2.cpp b/src/libdramsys/DRAMSys/configuration/memspec/MemSpecWideIO2.cpp index b1a1a683..42352afc 100644 --- a/src/libdramsys/DRAMSys/configuration/memspec/MemSpecWideIO2.cpp +++ b/src/libdramsys/DRAMSys/configuration/memspec/MemSpecWideIO2.cpp @@ -129,9 +129,9 @@ sc_time MemSpecWideIO2::getExecutionTime(Command command, const tlm_generic_payl return tRL + tDQSCK + burstDuration; else if (command == Command::RDA) return burstDuration - 2 * tCK + tRTP + tRPpb; - else if (command == Command::WR) + else if (command == Command::WR || command == Command::MWR) return tWL + tDQSS + burstDuration; - else if (command == Command::WRA) + else if (command == Command::WRA || command == Command::MWRA) return tWL + burstDuration + tCK + tWR + tRPpb; else if (command == Command::REFAB) return tRFCab; @@ -149,7 +149,7 @@ TimeInterval MemSpecWideIO2::getIntervalOnDataStrobe(Command command, const tlm_ { if (command == Command::RD || command == Command::RDA) return {tRL + tDQSCK, tRL + tDQSCK + burstDuration}; - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) return {tWL + tDQSS, tWL + tDQSS + burstDuration}; else { diff --git a/src/libdramsys/DRAMSys/controller/BankMachine.cpp b/src/libdramsys/DRAMSys/controller/BankMachine.cpp index 02b090ea..3f04671f 100644 --- a/src/libdramsys/DRAMSys/controller/BankMachine.cpp +++ b/src/libdramsys/DRAMSys/controller/BankMachine.cpp @@ -200,7 +200,9 @@ void BankMachineOpen::evaluate() if (currentPayload->is_read()) nextCommand = Command::RD; else - nextCommand = Command::WR; + { + nextCommand = memSpec.requiresReadModifyWrite(*currentPayload) ? Command::MWR : Command::WR; + } } else // row miss nextCommand = Command::PREPB; @@ -244,7 +246,9 @@ void BankMachineClosed::evaluate() if (currentPayload->is_read()) nextCommand = Command::RDA; else - nextCommand = Command::WRA; + { + nextCommand = memSpec.requiresReadModifyWrite(*currentPayload) ? Command::MWRA : Command::WRA; + } } } } @@ -290,7 +294,9 @@ void BankMachineOpenAdaptive::evaluate() if (currentPayload->is_read()) nextCommand = Command::RDA; else - nextCommand = Command::WRA; + { + nextCommand = memSpec.requiresReadModifyWrite(*currentPayload) ? Command::MWRA : Command::WRA; + } } else { @@ -298,7 +304,9 @@ void BankMachineOpenAdaptive::evaluate() if (currentPayload->is_read()) nextCommand = Command::RD; else - nextCommand = Command::WR; + { + nextCommand = memSpec.requiresReadModifyWrite(*currentPayload) ? Command::MWR : Command::WR; + } } } else // row miss @@ -348,7 +356,9 @@ void BankMachineClosedAdaptive::evaluate() if (currentPayload->is_read()) nextCommand = Command::RD; else - nextCommand = Command::WR; + { + nextCommand = memSpec.requiresReadModifyWrite(*currentPayload) ? Command::MWR : Command::WR; + } } else { @@ -356,7 +366,9 @@ void BankMachineClosedAdaptive::evaluate() if (currentPayload->is_read()) nextCommand = Command::RDA; else - nextCommand = Command::WRA; + { + nextCommand = memSpec.requiresReadModifyWrite(*currentPayload) ? Command::MWRA : Command::WRA; + } } } else // row miss, can happen when RD/WR mode is switched diff --git a/src/libdramsys/DRAMSys/controller/Command.cpp b/src/libdramsys/DRAMSys/controller/Command.cpp index b4b62c54..577ca9d2 100644 --- a/src/libdramsys/DRAMSys/controller/Command.cpp +++ b/src/libdramsys/DRAMSys/controller/Command.cpp @@ -51,7 +51,7 @@ namespace DRAMSys bool phaseHasDataStrobe(tlm::tlm_phase phase) { - return (phase >= BEGIN_RD && phase <= BEGIN_WRA); + return (phase >= BEGIN_RD && phase <= BEGIN_MWRA); } bool isPowerDownEntryPhase(tlm::tlm_phase phase) @@ -85,26 +85,28 @@ Command::Command(tlm_phase phase) 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 + Command::MWR, // 3 + Command::RDA, // 4 + Command::WRA, // 5 + Command::MWRA, // 6 + Command::ACT, // 7 + Command::PREPB, // 8 + Command::REFPB, // 9 + Command::RFMPB, // 10 + Command::REFP2B, // 11 + Command::RFMP2B, // 12 + Command::PRESB, // 13 + Command::REFSB, // 14 + Command::RFMSB, // 15 + Command::PREAB, // 16 + Command::REFAB, // 17 + Command::RFMAB, // 18 + Command::PDEA, // 19 + Command::PDEP, // 20 + Command::SREFEN, // 21 + Command::PDXA, // 22 + Command::PDXP, // 23 + Command::SREFEX // 24 }; type = commandOfPhase[phase - BEGIN_NOP]; } @@ -117,26 +119,28 @@ std::string Command::toString() const "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 + "MWR", // 3 + "RDA", // 4 + "WRA", // 5 + "MWRA", // 6 + "ACT", // 7 + "PREPB", // 8 + "REFPB", // 9 + "RFMPB", // 10 + "REFP2B", // 11 + "RFMP2B", // 12 + "PRESB", // 13 + "REFSB", // 14 + "RFMSB", // 15 + "PREAB", // 16 + "REFAB", // 17 + "RFMAB", // 18 + "PDEA", // 19 + "PDEP", // 20 + "SREFEN", // 21 + "PDXA", // 22 + "PDXP", // 23 + "SREFEX" // 24 }; return stringOfCommand[type]; } @@ -154,26 +158,28 @@ tlm_phase Command::toPhase() const 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 + BEGIN_MWR, // 3 + BEGIN_RDA, // 4 + BEGIN_WRA, // 5 + BEGIN_MWRA, // 6 + BEGIN_ACT, // 7 + BEGIN_PREPB, // 8 + BEGIN_REFPB, // 9 + BEGIN_RFMPB, // 10 + BEGIN_REFP2B, // 11 + BEGIN_RFMP2B, // 12 + BEGIN_PRESB, // 13 + BEGIN_REFSB, // 14 + BEGIN_RFMSB, // 15 + BEGIN_PREAB, // 16 + BEGIN_REFAB, // 17 + BEGIN_RFMAB, // 18 + BEGIN_PDNA, // 19 + BEGIN_PDNP, // 20 + BEGIN_SREF, // 21 + END_PDNA, // 22 + END_PDNP, // 23 + END_SREF // 24 }; return phaseOfCommand[type]; } @@ -188,26 +194,28 @@ MemCommand::cmds phaseToDRAMPowerCommand(tlm_phase phase) 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 + MemCommand::NOP, // 3 + MemCommand::RDA, // 4 + MemCommand::WRA, // 5 + MemCommand::NOP, // 6 + MemCommand::ACT, // 7 + MemCommand::PRE, // 8, PREPB + MemCommand::REFB, // 9, REFPB + MemCommand::NOP, // 10, RFMPB + MemCommand::NOP, // 11, REFP2B + MemCommand::NOP, // 12, RFMP2B + MemCommand::NOP, // 13, PRESB + MemCommand::NOP, // 14, REFSB + MemCommand::NOP, // 15, RFMSB + MemCommand::PREA, // 16, PREAB + MemCommand::REF, // 17, REFAB + MemCommand::NOP, // 18, RFMAB + MemCommand::PDN_S_ACT, // 19 + MemCommand::PDN_S_PRE, // 20 + MemCommand::SREN, // 21 + MemCommand::PUP_ACT, // 22 + MemCommand::PUP_PRE, // 23 + MemCommand::SREX // 24 }; return phaseOfCommand[phase - BEGIN_NOP]; } @@ -240,7 +248,7 @@ bool Command::isRankCommand() const bool Command::isCasCommand() const { assert(type >= Command::NOP && type <= Command::SREFEX); - return (type <= Command::WRA); + return (type <= Command::MWRA); } bool Command::isRasCommand() const diff --git a/src/libdramsys/DRAMSys/controller/Command.h b/src/libdramsys/DRAMSys/controller/Command.h index 4b28e8b4..1e43035e 100644 --- a/src/libdramsys/DRAMSys/controller/Command.h +++ b/src/libdramsys/DRAMSys/controller/Command.h @@ -60,28 +60,30 @@ namespace DRAMSys 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_MWR); // 8 +DECLARE_EXTENDED_PHASE(BEGIN_RDA); // 9 +DECLARE_EXTENDED_PHASE(BEGIN_WRA); // 10 +DECLARE_EXTENDED_PHASE(BEGIN_MWRA); // 11 +DECLARE_EXTENDED_PHASE(BEGIN_ACT); // 12 +DECLARE_EXTENDED_PHASE(BEGIN_PREPB); // 13 +DECLARE_EXTENDED_PHASE(BEGIN_REFPB); // 14 +DECLARE_EXTENDED_PHASE(BEGIN_RFMPB); // 15 +DECLARE_EXTENDED_PHASE(BEGIN_REFP2B); // 16 +DECLARE_EXTENDED_PHASE(BEGIN_RFMP2B); // 17 +DECLARE_EXTENDED_PHASE(BEGIN_PRESB); // 18 +DECLARE_EXTENDED_PHASE(BEGIN_REFSB); // 19 +DECLARE_EXTENDED_PHASE(BEGIN_RFMSB); // 20 +DECLARE_EXTENDED_PHASE(BEGIN_PREAB); // 21 +DECLARE_EXTENDED_PHASE(BEGIN_REFAB); // 22 +DECLARE_EXTENDED_PHASE(BEGIN_RFMAB); // 23 -DECLARE_EXTENDED_PHASE(BEGIN_PDNA); // 22 -DECLARE_EXTENDED_PHASE(BEGIN_PDNP); // 23 -DECLARE_EXTENDED_PHASE(BEGIN_SREF); // 24 +DECLARE_EXTENDED_PHASE(BEGIN_PDNA); // 24 +DECLARE_EXTENDED_PHASE(BEGIN_PDNP); // 25 +DECLARE_EXTENDED_PHASE(BEGIN_SREF); // 26 -DECLARE_EXTENDED_PHASE(END_PDNA); // 25 -DECLARE_EXTENDED_PHASE(END_PDNP); // 26 -DECLARE_EXTENDED_PHASE(END_SREF); // 27 +DECLARE_EXTENDED_PHASE(END_PDNA); // 27 +DECLARE_EXTENDED_PHASE(END_PDNP); // 28 +DECLARE_EXTENDED_PHASE(END_SREF); // 29 #ifdef DRAMPOWER DRAMPower::MemCommand::cmds phaseToDRAMPowerCommand(tlm::tlm_phase); @@ -101,27 +103,29 @@ public: NOP = 0, // 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 - END_ENUM // 23, To mark the end of this enumeration + MWR, // 3 + RDA, // 4 + WRA, // 5 + MWRA, // 6 + ACT, // 7 + PREPB, // 8 + REFPB, // 9 + RFMPB, // 10 + REFP2B, // 11 + RFMP2B, // 12 + PRESB, // 13 + REFSB, // 14 + RFMSB, // 15 + PREAB, // 16 + REFAB, // 17 + RFMAB, // 18 + PDEA, // 19 + PDEP, // 20 + SREFEN, // 21 + PDXA, // 22 + PDXP, // 23 + SREFEX, // 24 + END_ENUM // 25, To mark the end of this enumeration }; private: diff --git a/src/libdramsys/DRAMSys/controller/Controller.cpp b/src/libdramsys/DRAMSys/controller/Controller.cpp index 2c40fa11..30f5b647 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.cpp +++ b/src/libdramsys/DRAMSys/controller/Controller.cpp @@ -89,7 +89,7 @@ Controller::Controller(const sc_module_name& name, const Configuration& config, { SC_METHOD(controllerMethod); sensitive << beginReqEvent << endRespEvent << controllerEvent << dataResponseEvent; - + ranksNumberOfPayloads = ControllerVector(memSpec.ranksPerChannel); // reserve buffer for command tuples diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerDDR3.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerDDR3.cpp index 5f0e9406..1f00e8c5 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerDDR3.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerDDR3.cpp @@ -132,7 +132,7 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSDLL); } - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) { assert(ControllerExtension::getBurstLength(payload) == 8); diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerDDR4.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerDDR4.cpp index 9f215a44..db410aad 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerDDR4.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerDDR4.cpp @@ -49,7 +49,7 @@ CheckerDDR4::CheckerDDR4(const Configuration& config) memSpec = dynamic_cast(config.memSpec.get()); if (memSpec == nullptr) SC_REPORT_FATAL("CheckerDDR4", "Wrong MemSpec chosen"); - + lastScheduledByCommandAndBank = std::vector> (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); lastScheduledByCommandAndBankGroup = std::vector> @@ -60,7 +60,7 @@ CheckerDDR4::CheckerDDR4(const Configuration& config) lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnBus = scMaxTime; last4Activates = ControllerVector>(memSpec->ranksPerChannel); - + tBURST = memSpec->defaultBurstLength / memSpec->dataRate * memSpec->tCK; tRDWR = memSpec->tRL + tBURST + memSpec->tCK - memSpec->tWL + memSpec->tWPRE; tRDWR_R = memSpec->tRL + tBURST + memSpec->tRTRS - memSpec->tWL + memSpec->tWPRE; @@ -78,7 +78,7 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, const tlm_generic Rank rank = ControllerExtension::getRank(payload); BankGroup bankGroup = ControllerExtension::getBankGroup(payload); Bank bank = ControllerExtension::getBank(payload); - + sc_time lastCommandStart; sc_time earliestTimeToStart = sc_time_stamp(); @@ -153,7 +153,7 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSDLL); } - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) { assert(ControllerExtension::getBurstLength(payload) == 8); diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5.cpp index a7c4b9e8..685ae2f6 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5.cpp @@ -79,7 +79,7 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, const tlm_generi Rank rank = ControllerExtension::getRank(payload); BankGroup bankGroup = ControllerExtension::getBankGroup(payload); Bank bank = ControllerExtension::getBank(payload); - + sc_time lastCommandStart; sc_time earliestTimeToStart = sc_time_stamp(); @@ -154,7 +154,7 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, const tlm_generi if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tLK); } - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) { assert(ControllerExtension::getBurstLength(payload) == 8); diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.cpp index b92c614b..063463df 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.cpp @@ -79,7 +79,7 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, const tlm_gener Rank rank = ControllerExtension::getRank(payload); BankGroup bankGroup = ControllerExtension::getBankGroup(payload); Bank bank = ControllerExtension::getBank(payload); - + sc_time lastCommandStart; sc_time earliestTimeToStart = sc_time_stamp(); @@ -156,7 +156,7 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, const tlm_gener if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tLK); } - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) { unsigned burstLength = ControllerExtension::getBurstLength(payload); assert(!(memSpec->dataRate == 4) || (burstLength == 8)); // DDR mode (QDR wrt CK) diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.cpp index bfdb9185..396f5c50 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.cpp @@ -78,7 +78,7 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, const tlm_generi Rank rank = ControllerExtension::getRank(payload); BankGroup bankGroup = ControllerExtension::getBankGroup(payload); Bank bank = ControllerExtension::getBank(payload); - + sc_time lastCommandStart; sc_time earliestTimeToStart = sc_time_stamp(); @@ -153,7 +153,7 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, const tlm_generi if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tLK); } - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) { assert(ControllerExtension::getBurstLength(payload) == 16); diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.cpp index 638c76ad..0b9f6770 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.cpp @@ -136,7 +136,7 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) { unsigned burstLength = ControllerExtension::getBurstLength(payload); assert(!(memSpec->ranksPerChannel == 1) || (burstLength == 2 || burstLength == 4)); // Legacy mode diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.cpp index 037b78d9..813cad39 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.cpp @@ -136,7 +136,7 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, const tlm_gener if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) { unsigned burstLength = ControllerExtension::getBurstLength(payload); assert((burstLength == 16) || (burstLength == 32)); diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.cpp index 11c92ff3..faba3563 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.cpp @@ -134,7 +134,7 @@ sc_time CheckerSTTMRAM::timeToSatisfyConstraints(Command command, const tlm_gene if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSDLL); } - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) { assert(ControllerExtension::getBurstLength(payload) == 8); diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.cpp index 5345c9d1..ca60076a 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.cpp @@ -130,7 +130,7 @@ sc_time CheckerWideIO::timeToSatisfyConstraints(Command command, const tlm_gener if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) { unsigned burstLength = ControllerExtension::getBurstLength(payload); assert((burstLength == 2) || (burstLength == 4)); diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.cpp index c23c5fc7..0ca3e8df 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.cpp @@ -131,7 +131,7 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, const tlm_gene if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } - else if (command == Command::WR || command == Command::WRA) + else if (command == Command::WR || command == Command::WRA || command == Command::MWR || command == Command::MWRA) { unsigned burstLength = ControllerExtension::getBurstLength(payload); assert((burstLength == 4) || (burstLength == 8)); diff --git a/src/libdramsys/DRAMSys/simulation/dram/Dram.cpp b/src/libdramsys/DRAMSys/simulation/dram/Dram.cpp index 05f2c962..5c4dacfb 100644 --- a/src/libdramsys/DRAMSys/simulation/dram/Dram.cpp +++ b/src/libdramsys/DRAMSys/simulation/dram/Dram.cpp @@ -144,12 +144,42 @@ tlm_sync_enum Dram::nb_transport_fw(tlm_generic_payload& trans, tlm_phase& phase if (phase == BEGIN_RD || phase == BEGIN_RDA) { unsigned char* phyAddr = memory + trans.get_address(); - memcpy(trans.get_data_ptr(), phyAddr, trans.get_data_length()); + + if (trans.get_byte_enable_ptr() == nullptr) + { + memcpy(trans.get_data_ptr(), phyAddr, trans.get_data_length()); + } + else + { + for (std::size_t i = 0; i < trans.get_data_length(); i++) + { + std::size_t byteEnableIndex = i % trans.get_byte_enable_length(); + if (trans.get_byte_enable_ptr()[byteEnableIndex] != 0) + { + trans.get_data_ptr()[i] = phyAddr[i]; + } + } + } } - else if (phase == BEGIN_WR || phase == BEGIN_WRA) + else if (phase == BEGIN_WR || phase == BEGIN_WRA || phase == BEGIN_MWR || phase == BEGIN_MWRA) { unsigned char* phyAddr = memory + trans.get_address(); - memcpy(phyAddr, trans.get_data_ptr(), trans.get_data_length()); + + if (trans.get_byte_enable_ptr() == nullptr) + { + memcpy(phyAddr, trans.get_data_ptr(), trans.get_data_length()); + } + else + { + for (std::size_t i = 0; i < trans.get_data_length(); i++) + { + std::size_t byteEnableIndex = i % trans.get_byte_enable_length(); + if (trans.get_byte_enable_ptr()[byteEnableIndex] != 0) + { + phyAddr[i] = trans.get_data_ptr()[i]; + } + } + } } }