From 55a9acb1aa47050058dd0ba2d7ead099c6b803db Mon Sep 17 00:00:00 2001 From: Matthias Jung Date: Thu, 17 Sep 2015 16:11:20 +0200 Subject: [PATCH] Repaired powerdown after Refresh, however the DRAM should be awake again for the interval... I think this commit will break the nightly test so I will fix that soon. --- DRAMSys/simulator/src/controller/Controller.h | 14 +++++++----- .../powerdown/PowerDownManagerTimeout.cpp | 22 ++++++++++++++----- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/DRAMSys/simulator/src/controller/Controller.h b/DRAMSys/simulator/src/controller/Controller.h index 31bb622d..9889a697 100644 --- a/DRAMSys/simulator/src/controller/Controller.h +++ b/DRAMSys/simulator/src/controller/Controller.h @@ -495,17 +495,21 @@ void Controller::dramPEQCallback(tlm_generic_payload &payload, const t else if (phase == END_REFA) { printDebugMessage("Finished auto refresh on all banks "); + + bool sleepy = true; for(Bank bank : controllerCore->getBanks()) { - if(numberOfPayloadsInSystem[bank] == 0) - { - controllerCore->powerDownManager->sleep(bank,sc_time_stamp()); - } - else + if(numberOfPayloadsInSystem[bank] != 0) { + sleepy = false; scheduleNextFromScheduler(bank); } } + + if(sleepy == true) + { + controllerCore->powerDownManager->sleep(0,sc_time_stamp()); + } } else if(phase == END_REFB) { diff --git a/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerTimeout.cpp b/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerTimeout.cpp index 2b2b172a..e3139b24 100644 --- a/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerTimeout.cpp +++ b/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerTimeout.cpp @@ -59,14 +59,23 @@ PowerDownManagerTimeout::~PowerDownManagerTimeout() void PowerDownManagerTimeout::sleep(Bank bank, sc_time time) { - if(canSleep() && !isInPowerDown() && (time - controllerCore.state.getLastScheduledCommand().getEnd()) >= Configuration::getInstance().getPowerDownTimeout()) + bool test_canSleep = canSleep(); + bool test_isInPowerDown = isInPowerDown(); + sc_time last_scheduled_command = controllerCore.state.getLastScheduledCommand().getEnd(); + sc_time power_down_timeout = Configuration::getInstance().getPowerDownTimeout(); + bool test_timeCondition = (time - last_scheduled_command) >= power_down_timeout; + bool test_awakeForRefresh = (powerDownState == PowerDownState::AwakeForRefresh); + + //test_awakeForRefresh = false; + + if( test_canSleep && !test_isInPowerDown && (test_timeCondition || test_awakeForRefresh )) { PowerDownState newState; if(Configuration::getInstance().PowerDownMode == EPowerDownMode::TimeoutPDN) { newState = controllerCore.state.rowBufferStates.allRowBuffersAreClosed() ? PowerDownState::PDNPrecharge : PowerDownState::PDNActive; } - else + else // PowerDownMode == TimeoutSREF { newState = PowerDownState::PDNSelfRefresh; } @@ -91,8 +100,9 @@ void PowerDownManagerTimeout::sleep(Bank bank, sc_time time) bool PowerDownManagerTimeout::isInPowerDown() { - return (powerDownState == PowerDownState::PDNActive || powerDownState == PowerDownState::PDNPrecharge - || powerDownState == PowerDownState::PDNSelfRefresh); + return ( powerDownState == PowerDownState::PDNActive + || powerDownState == PowerDownState::PDNPrecharge + || powerDownState == PowerDownState::PDNSelfRefresh); } void PowerDownManagerTimeout::setPowerDownState(PowerDownState state) @@ -129,6 +139,8 @@ void PowerDownManagerTimeout::wakeUpForRefresh(Bank bank, sc_time time) setPowerDownState(PowerDownState::AwakeForRefresh); sendPowerDownPayloads(pdn); + + // Schedule Next Powerdown after Refresh: } } @@ -149,7 +161,7 @@ bool PowerDownManagerTimeout::canSleep() { for (Bank bank : controllerCore.getBanks()) { - if (!controllerCore.numberOfPayloads[bank] == 0) + if (controllerCore.numberOfPayloads[bank] != 0) return false; } return true;