diff --git a/DRAMSys/library/src/controller/Controller.cpp b/DRAMSys/library/src/controller/Controller.cpp index 1498c688..7d5037f3 100644 --- a/DRAMSys/library/src/controller/Controller.cpp +++ b/DRAMSys/library/src/controller/Controller.cpp @@ -380,7 +380,7 @@ void Controller::finishBeginReq() Rank rank = DramExtension::getRank(payloadToAcquire); if (ranksNumberOfPayloads[rank.ID()] == 0) - powerDownManagers[rank.ID()]->triggerExit(TriggerSource::Controller); + powerDownManagers[rank.ID()]->triggerExit(); ranksNumberOfPayloads[rank.ID()]++; diff --git a/DRAMSys/library/src/controller/powerdown/PowerDownManagerDummy.h b/DRAMSys/library/src/controller/powerdown/PowerDownManagerDummy.h index d5fa9ef3..55af81e9 100644 --- a/DRAMSys/library/src/controller/powerdown/PowerDownManagerDummy.h +++ b/DRAMSys/library/src/controller/powerdown/PowerDownManagerDummy.h @@ -45,7 +45,8 @@ public: PowerDownManagerDummy() {} virtual void triggerEntry() override {} - virtual void triggerExit(TriggerSource) override {} + virtual void triggerExit() override {} + virtual void triggerInterruption() override {} virtual std::pair getNextCommand() override; virtual void updateState(Command) override {} diff --git a/DRAMSys/library/src/controller/powerdown/PowerDownManagerIF.h b/DRAMSys/library/src/controller/powerdown/PowerDownManagerIF.h index 05e3ca6b..c5bfdf4d 100644 --- a/DRAMSys/library/src/controller/powerdown/PowerDownManagerIF.h +++ b/DRAMSys/library/src/controller/powerdown/PowerDownManagerIF.h @@ -42,15 +42,14 @@ using namespace tlm; -enum class TriggerSource {Controller, RefreshManager}; - class PowerDownManagerIF { public: virtual ~PowerDownManagerIF() {} virtual void triggerEntry() = 0; - virtual void triggerExit(TriggerSource) = 0; + virtual void triggerExit() = 0; + virtual void triggerInterruption() = 0; virtual std::pair getNextCommand() = 0; virtual void updateState(Command) = 0; diff --git a/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.cpp b/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.cpp index b0ebea5c..b1ca8298 100644 --- a/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.cpp +++ b/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.cpp @@ -43,34 +43,28 @@ PowerDownManagerStaggered::PowerDownManagerStaggered(Rank rank, CheckerIF *check void PowerDownManagerStaggered::triggerEntry() { + controllerIdle = true; + if (state == PdmState::Idle) - triggered = true; + entryTriggered = true; } -void PowerDownManagerStaggered::triggerExit(TriggerSource source) +void PowerDownManagerStaggered::triggerExit() { - if (source == TriggerSource::Controller) - { - controllerIdle = false; - enterSelfRefresh = false; + controllerIdle = false; + enterSelfRefresh = false; + entryTriggered = false; - if (state == PdmState::Idle) - triggered = false; - else - triggered = true; - } - else // if (source == TriggerSource::RefreshManager) - { - if (state == PdmState::Idle && !enterSelfRefresh) - triggered = false; - else if (state == PdmState::PrechargePd && !triggered) - { - triggered = true; - enterSelfRefresh = true; - } - else if (state == PdmState::ActivePd) // TODO: check if normal else is also ok here - triggered = true; - } + if (state != PdmState::Idle) + exitTriggered = true; +} + +void PowerDownManagerStaggered::triggerInterruption() +{ + entryTriggered = false; + + if (state != PdmState::Idle) + exitTriggered = true; } std::pair PowerDownManagerStaggered::getNextCommand() @@ -85,28 +79,33 @@ sc_time PowerDownManagerStaggered::start() { timeToSchedule = sc_max_time(); - if (triggered) + if (exitTriggered) { - if (state == PdmState::Idle) - { - if (enterSelfRefresh) - nextCommand = Command::SREFEN; - else if (activatedBanks == 0) - nextCommand = Command::PDEP; - else - nextCommand = Command::PDEA; - } - else if (state == PdmState::ActivePd) + if (state == PdmState::ActivePdn) nextCommand = Command::PDXA; - else if (state == PdmState::PrechargePd) + else if (state == PdmState::PrechargePdn) nextCommand = Command::PDXP; else if (state == PdmState::SelfRefresh) nextCommand = Command::SREFEX; - else // if (state == PdmState::Refresh) + else if (state == PdmState::ExtraRefresh) nextCommand = Command::REFA; timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, BankGroup(0), Bank(0)); } + else if (entryTriggered) + { + if (activatedBanks != 0) + nextCommand = Command::PDEA; + else + nextCommand = Command::PDEP; + + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, BankGroup(0), Bank(0)); + } + else if (enterSelfRefresh) + { + nextCommand = Command::SREFEN; + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, BankGroup(0), Bank(0)); + } return timeToSchedule; } @@ -121,36 +120,48 @@ void PowerDownManagerStaggered::updateState(Command command) activatedBanks = 0; else if (command == Command::PDEA) { - state = PdmState::ActivePd; - triggered = false; + state = PdmState::ActivePdn; + entryTriggered = false; } else if (command == Command::PDEP) { - state = PdmState::PrechargePd; - triggered = false; + state = PdmState::PrechargePdn; + entryTriggered = false; } else if (command == Command::SREFEN) { state = PdmState::SelfRefresh; - triggered = false; + entryTriggered = false; enterSelfRefresh = false; } else if (command == Command::PDXA) { state = PdmState::Idle; - triggered = false; + exitTriggered = false; } else if (command == Command::PDXP) { state = PdmState::Idle; - if (!enterSelfRefresh) - triggered = false; + exitTriggered = false; + + if (controllerIdle) + enterSelfRefresh = true; } else if (command == Command::SREFEX) - state = PdmState::Refresh; - else if (command == Command::REFA && state == PdmState::Refresh) + state = PdmState::ExtraRefresh; + else if (command == Command::REFA) { - state = PdmState::Idle; - triggered = false; + if (state == PdmState::ExtraRefresh) + { + state = PdmState::Idle; + exitTriggered = false; + } + else if (controllerIdle) + entryTriggered = true; + } + else if (command == Command::REFB) + { + if (controllerIdle) + entryTriggered = true; } } diff --git a/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.h b/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.h index 7d12961d..c11f086f 100644 --- a/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.h +++ b/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.h @@ -47,14 +47,15 @@ public: PowerDownManagerStaggered(Rank, CheckerIF *); virtual void triggerEntry() override; - virtual void triggerExit(TriggerSource) override; + virtual void triggerExit() override; + virtual void triggerInterruption() override; virtual std::pair getNextCommand() override; virtual void updateState(Command) override; virtual sc_time start() override; private: - enum class PdmState {Idle, ActivePd, PrechargePd, SelfRefresh, Refresh} state = PdmState::Idle; + enum class PdmState {Idle, ActivePdn, PrechargePdn, SelfRefresh, ExtraRefresh} state = PdmState::Idle; tlm_generic_payload powerDownPayload; Rank rank; CheckerIF *checker; @@ -62,9 +63,10 @@ private: sc_time timeToSchedule; Command nextCommand; - bool triggered = true; - bool enterSelfRefresh = false; bool controllerIdle = true; + bool entryTriggered = true; + bool exitTriggered = false; + bool enterSelfRefresh = false; unsigned activatedBanks = 0; }; diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp index 3e4271d0..55de87b7 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp @@ -72,7 +72,7 @@ sc_time RefreshManagerBankwise::start() if (sc_time_stamp() >= timeForNextTrigger) { - powerDownManager->triggerExit(TriggerSource::RefreshManager); + powerDownManager->triggerInterruption(); if (sleeping) return timeToSchedule; diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerRankwise.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerRankwise.cpp index a5f704d0..c14f30fc 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerRankwise.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerRankwise.cpp @@ -64,7 +64,7 @@ sc_time RefreshManagerRankwise::start() if (sc_time_stamp() >= timeForNextTrigger) { - powerDownManager->triggerExit(TriggerSource::RefreshManager); + powerDownManager->triggerInterruption(); if (sleeping) return timeToSchedule;