From db615eb6a469a494a0df3fd116739667a4cc8555 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Wed, 26 Mar 2025 15:10:56 +0100 Subject: [PATCH] Fix LPDDR5 AllBank and Per2Bank Refresh --- .../controller/checker/CheckerLPDDR5.cpp | 65 ++++++++++++++----- .../controller/checker/CheckerLPDDR5.h | 1 - 2 files changed, 48 insertions(+), 18 deletions(-) diff --git a/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp b/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp index 233f8877..54027f15 100644 --- a/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp +++ b/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp @@ -1839,8 +1839,12 @@ void CheckerLPDDR5::insert(Command command, const tlm_generic_payload& payload) if (burstLength == 32) { const sc_time constraint = currentTime + ((memSpec.BL_n_min_32 + memSpec.tRBTP) + memSpec.tRPpb); - sc_time &earliestTimeToStart = nextCommandByBank[Command::REFP2B][bank]; - earliestTimeToStart = std::max(earliestTimeToStart, constraint); + for (unsigned int i = static_cast(bank) + memSpec.banksPerRank * static_cast(rank); i < memSpec.banksPerRank * (1 + static_cast(rank)); i += memSpec.getPer2BankOffset()) + { + Bank currentBank{i}; + sc_time &earliestTimeToStart = nextCommandByBank[Command::REFP2B][currentBank]; + earliestTimeToStart = std::max(earliestTimeToStart, constraint); + } } } @@ -1849,8 +1853,12 @@ void CheckerLPDDR5::insert(Command command, const tlm_generic_payload& payload) if (burstLength != 32) { const sc_time constraint = currentTime + ((memSpec.BL_n_min_16 + memSpec.tRBTP) + memSpec.tRPpb); - sc_time &earliestTimeToStart = nextCommandByBank[Command::REFP2B][bank]; - earliestTimeToStart = std::max(earliestTimeToStart, constraint); + for (unsigned int i = static_cast(bank) + memSpec.banksPerRank * static_cast(rank); i < memSpec.banksPerRank * (1 + static_cast(rank)); i += memSpec.getPer2BankOffset()) + { + Bank currentBank{i}; + sc_time &earliestTimeToStart = nextCommandByBank[Command::REFP2B][currentBank]; + earliestTimeToStart = std::max(earliestTimeToStart, constraint); + } } } @@ -2448,8 +2456,12 @@ void CheckerLPDDR5::insert(Command command, const tlm_generic_payload& payload) if (burstLength == 32) { const sc_time constraint = currentTime + ((((memSpec.tWL + memSpec.BL_n_min_32) + memSpec.tCK) + memSpec.tWR) + memSpec.tRPpb); - sc_time &earliestTimeToStart = nextCommandByBank[Command::REFP2B][bank]; - earliestTimeToStart = std::max(earliestTimeToStart, constraint); + for (unsigned int i = static_cast(bank) + memSpec.banksPerRank * static_cast(rank); i < memSpec.banksPerRank * (1 + static_cast(rank)); i += memSpec.getPer2BankOffset()) + { + Bank currentBank{i}; + sc_time &earliestTimeToStart = nextCommandByBank[Command::REFP2B][currentBank]; + earliestTimeToStart = std::max(earliestTimeToStart, constraint); + } } } @@ -2458,8 +2470,12 @@ void CheckerLPDDR5::insert(Command command, const tlm_generic_payload& payload) if (burstLength != 32) { const sc_time constraint = currentTime + ((((memSpec.tWL + memSpec.BL_n_min_16) + memSpec.tCK) + memSpec.tWR) + memSpec.tRPpb); - sc_time &earliestTimeToStart = nextCommandByBank[Command::REFP2B][bank]; - earliestTimeToStart = std::max(earliestTimeToStart, constraint); + for (unsigned int i = static_cast(bank) + memSpec.banksPerRank * static_cast(rank); i < memSpec.banksPerRank * (1 + static_cast(rank)); i += memSpec.getPer2BankOffset()) + { + Bank currentBank{i}; + sc_time &earliestTimeToStart = nextCommandByBank[Command::REFP2B][currentBank]; + earliestTimeToStart = std::max(earliestTimeToStart, constraint); + } } } @@ -3650,8 +3666,12 @@ void CheckerLPDDR5::insert(Command command, const tlm_generic_payload& payload) // Bank (ACT,REFP2B) (memSpec.tRCpb + memSpec.tCK) [] Per2ComponentsIn(level=) { const sc_time constraint = currentTime + (memSpec.tRCpb + memSpec.tCK); - sc_time &earliestTimeToStart = nextCommandByBank[Command::REFP2B][bank]; - earliestTimeToStart = std::max(earliestTimeToStart, constraint); + for (unsigned int i = static_cast(bank) + memSpec.banksPerRank * static_cast(rank); i < memSpec.banksPerRank * (1 + static_cast(rank)); i += memSpec.getPer2BankOffset()) + { + Bank currentBank{i}; + sc_time &earliestTimeToStart = nextCommandByBank[Command::REFP2B][currentBank]; + earliestTimeToStart = std::max(earliestTimeToStart, constraint); + } } // Rank (ACT,ACT) memSpec.tRRD [] SameComponent() @@ -3813,13 +3833,6 @@ void CheckerLPDDR5::insert(Command command, const tlm_generic_payload& payload) } case Command::REFP2B: { - // Bank (REFP2B,ACT) (memSpec.tRFCpb - memSpec.tCK) [] SameComponent() - { - const sc_time constraint = currentTime + (memSpec.tRFCpb - memSpec.tCK); - sc_time &earliestTimeToStart = nextCommandByBank[Command::ACT][bank]; - earliestTimeToStart = std::max(earliestTimeToStart, constraint); - } - // Bank (REFP2B,REFP2B) memSpec.tRFCpb [] SameComponent() { const sc_time constraint = currentTime + memSpec.tRFCpb; @@ -3827,6 +3840,17 @@ void CheckerLPDDR5::insert(Command command, const tlm_generic_payload& payload) earliestTimeToStart = std::max(earliestTimeToStart, constraint); } + // Bank (REFP2B,ACT) (memSpec.tRFCpb - memSpec.tCK) [] Per2ComponentsIn(level=) + { + const sc_time constraint = currentTime + (memSpec.tRFCpb - memSpec.tCK); + for (unsigned int i = static_cast(bank) + memSpec.banksPerRank * static_cast(rank); i < memSpec.banksPerRank * (1 + static_cast(rank)); i += memSpec.getPer2BankOffset()) + { + Bank currentBank{i}; + sc_time &earliestTimeToStart = nextCommandByBank[Command::ACT][currentBank]; + earliestTimeToStart = std::max(earliestTimeToStart, constraint); + } + } + // Rank (REFP2B,ACT) (memSpec.tpbR2act - memSpec.tCK) [] SameComponent() { const sc_time constraint = currentTime + (memSpec.tpbR2act - memSpec.tCK); @@ -3872,6 +3896,13 @@ void CheckerLPDDR5::insert(Command command, const tlm_generic_payload& payload) } case Command::REFAB: { + // Rank (REFAB,ACT) (memSpec.tRFCab - memSpec.tCK) [] SameComponent() + { + const sc_time constraint = currentTime + (memSpec.tRFCab - memSpec.tCK); + sc_time &earliestTimeToStart = nextCommandByRank[Command::ACT][rank]; + earliestTimeToStart = std::max(earliestTimeToStart, constraint); + } + // Rank (REFAB,REFAB) memSpec.tRFCab [] SameComponent() { const sc_time constraint = currentTime + memSpec.tRFCab; diff --git a/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.h b/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.h index fa6a4d1b..19e2c787 100644 --- a/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.h +++ b/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.h @@ -41,7 +41,6 @@ #include "DRAMSys/configuration/memspec/MemSpecLPDDR5.h" #include -#include namespace DRAMSys {