diff --git a/DRAMSys/analyzer/scripts/tests.py b/DRAMSys/analyzer/scripts/tests.py index 7823da5a..a7e26334 100755 --- a/DRAMSys/analyzer/scripts/tests.py +++ b/DRAMSys/analyzer/scripts/tests.py @@ -259,7 +259,7 @@ def phase_transitions_are_valid(connection): validTransitions['REFB'] = set(['ACT', 'REFB', 'PDNPB', 'SREFB']) validTransitions['PDNAB'] = set(['PRE', 'RD', 'RDA', 'WR', 'WRA', 'REFB']) - validTransitions['PDNPB'] = set(['ACT', 'REFB']) + validTransitions['PDNPB'] = set(['ACT', 'REFB', 'SREFB']) validTransitions['SREFB'] = set(['ACT']) else: validTransitions['PRE'] = set(['ACT', 'PRE_ALL']) @@ -274,7 +274,7 @@ def phase_transitions_are_valid(connection): validTransitions['REFA'] = set(['PRE_ALL', 'ACT', 'REFA', 'PDNA', 'PDNP', 'SREF']) validTransitions['PDNA'] = set(['PRE', 'PRE_ALL', 'ACT', 'RD', 'RDA', 'WR', 'WRA', 'REFA', 'PDNA', 'PDNP']) - validTransitions['PDNP'] = set(['PRE_ALL', 'ACT', 'REFA', 'PDNA', 'PDNP']) + validTransitions['PDNP'] = set(['PRE_ALL', 'ACT', 'REFA', 'PDNA', 'PDNP', 'SREF']) validTransitions['SREF'] = set(['PRE_ALL', 'ACT', 'REFA', 'PDNA', 'PDNP']) if (dramconfig.bankwiseLogic == "1"): diff --git a/DRAMSys/simulator/src/controller/core/ControllerCore.cpp b/DRAMSys/simulator/src/controller/core/ControllerCore.cpp index 57233afd..8de6d3f5 100644 --- a/DRAMSys/simulator/src/controller/core/ControllerCore.cpp +++ b/DRAMSys/simulator/src/controller/core/ControllerCore.cpp @@ -134,11 +134,19 @@ void ControllerCore::triggerRefresh(tlm::tlm_generic_payload& payload) state->cleanUp(time); - if (!refreshManager->isInvalidated(payload, time) && !powerDownManager->isInSelfRefresh(bank)) - { + if (!refreshManager->isInvalidated(payload, time) && !powerDownManager->isInSelfRefresh(bank)) { printDebugMessage("Triggering refresh on bank " + to_string(bank.ID())); powerDownManager->wakeUpForRefresh(bank, time); //expects PDNA and PDNP to exit without delay - refreshManager->scheduleRefresh(payload, time); + bool pdnpToSrefTransition = false; + if (config.PowerDownMode == EPowerDownMode::Staggered) { + pdnpToSrefTransition = state->getLastCommand(Command::PDNPX,bank).getStart() >= time; + } + if (pdnpToSrefTransition) { + powerDownManager->sleep(bank,time); + } + else { + refreshManager->scheduleRefresh(payload, time); + } } } }