From 10f577c38f49f45a8852dfc0644cfda6788e12fb Mon Sep 17 00:00:00 2001 From: "Lukas Steiner (2)" Date: Wed, 11 Dec 2019 11:11:21 +0100 Subject: [PATCH] Adapted bankwise refresh manager to new controller functionality. --- .../refresh/RefreshManagerBankwise.cpp | 76 +++++++------------ .../refresh/RefreshManagerBankwise.h | 3 +- 2 files changed, 31 insertions(+), 48 deletions(-) diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp index 22af8665..53955547 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp @@ -49,8 +49,9 @@ RefreshManagerBankwise::RefreshManagerBankwise(std::vector &bankM for (unsigned bankID = 0; bankID < memSpec->BanksPerRank; bankID++) { setUpDummy(refreshPayloads[bankID], rank, bankMachines[bankID]->getBank()); - remainingBankMachines.push_back(bankMachines[bankID]); + allBankMachines.push_back(bankMachines[bankID]); } + remainingBankMachines = allBankMachines; if (config.ControllerCoreRefEnablePostpone) maxPostponed = config.ControllerCoreRefMaxPostponed * memSpec->BanksPerRank; @@ -73,6 +74,10 @@ sc_time RefreshManagerBankwise::start() if (sc_time_stamp() >= timeForNextTrigger) { + powerDownManager->triggerExit(TriggerSource::RefreshManager); + if (blocked) + return sc_max_time() - sc_time_stamp(); + if (sc_time_stamp() >= timeForNextTrigger + memSpec->getRefreshIntervalPB()) { timeForNextTrigger += memSpec->getRefreshIntervalPB(); @@ -104,31 +109,19 @@ sc_time RefreshManagerBankwise::start() timeForNextTrigger += memSpec->getRefreshIntervalPB(); return timeForNextTrigger - sc_time_stamp(); } - else if (currentBankMachine->getState() == BmState::Activated) - { - if (forcedRefresh) - currentBankMachine->block(); - nextCommand = Command::PRE; - delay = checker->delayToSatisfyConstraints(Command::PRE, rank, - currentBankMachine->getBankGroup(), currentBankMachine->getBank()); - timeToSchedule = sc_time_stamp() + delay; - return delay; - } else { - if (forcedRefresh) - { - currentBankMachine->block(); - state = RmState::Precharged; - } - nextCommand = Command::REFB; - delay = checker->delayToSatisfyConstraints(Command::REFB, rank, + if (currentBankMachine->getState() == BmState::Activated) + nextCommand = Command::PRE; + else + nextCommand = Command::REFB; + delay = checker->delayToSatisfyConstraints(nextCommand, rank, currentBankMachine->getBankGroup(), currentBankMachine->getBank()); timeToSchedule = sc_time_stamp() + delay; return delay; } } - else if (state == RmState::Pulledin) + else // if (state == RmState::Pulledin) { bool allBanksBusy = true; @@ -149,31 +142,18 @@ sc_time RefreshManagerBankwise::start() timeForNextTrigger += memSpec->getRefreshIntervalPB(); return timeForNextTrigger - sc_time_stamp(); } - else if (currentBankMachine->getState() == BmState::Activated) - { - nextCommand = Command::PRE; - delay = checker->delayToSatisfyConstraints(Command::PRE, rank, - currentBankMachine->getBankGroup(), currentBankMachine->getBank()); - timeToSchedule = sc_time_stamp() + delay; - return delay; - } else { - nextCommand = Command::REFB; - delay = checker->delayToSatisfyConstraints(Command::REFB, rank, + if (currentBankMachine->getState() == BmState::Activated) + nextCommand = Command::PRE; + else + nextCommand = Command::REFB; + delay = checker->delayToSatisfyConstraints(nextCommand, rank, currentBankMachine->getBankGroup(), currentBankMachine->getBank()); timeToSchedule = sc_time_stamp() + delay; return delay; } } - else // if (state == RmState::Precharged) - { - nextCommand = Command::REFB; - delay = checker->delayToSatisfyConstraints(Command::REFB, rank, - currentBankMachine->getBankGroup(), currentBankMachine->getBank()); - timeToSchedule = sc_time_stamp() + delay; - return delay; - } } else return timeForNextTrigger - sc_time_stamp(); @@ -185,10 +165,7 @@ void RefreshManagerBankwise::updateState(Command command, tlm_generic_payload *p { remainingBankMachines.erase(currentIterator); if (remainingBankMachines.empty()) - { - for (unsigned bankID = 0; bankID < memSpec->BanksPerRank; bankID++) - remainingBankMachines.push_back(bankMachines[bankID]); - } + remainingBankMachines = allBankMachines; if (state == RmState::Pulledin) flexibilityCounter--; @@ -199,18 +176,23 @@ void RefreshManagerBankwise::updateState(Command command, tlm_generic_payload *p { state = RmState::Regular; timeForNextTrigger += memSpec->getRefreshIntervalPB(); + powerDownManager->triggerEntry(TriggerSource::RefreshManager); } } - else if (command == Command::PRE) + else if (command == Command::REFA) { - if (nextCommand == Command::PRE && DramExtension::getBank(payload) == currentBankMachine->getBank()) - { - currentBankMachine->block(); - state = RmState::Precharged; - } + // Refresh command after SREFEX + state = RmState::Regular; // TODO: check if this assignment is necessary + timeForNextTrigger = sc_time_stamp() + memSpec->getRefreshIntervalPB(); + blocked = false; } else if (command == Command::PDEA || command == Command::PDEP) blocked = true; + else if (command == Command::SREFEN) + { + blocked = true; + timeForNextTrigger = sc_max_time(); + } else if (command == Command::PDXA || command == Command::PDXP) blocked = false; } diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.h b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.h index 4054c0e2..8963e36d 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.h +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.h @@ -58,7 +58,7 @@ public: virtual void notifyIdle() override {} private: - enum class RmState {Regular, Precharged, Pulledin} state = RmState::Regular; + enum class RmState {Regular, Pulledin} state = RmState::Regular; const MemSpec *memSpec; std::vector &bankMachines; PowerDownManagerIF *powerDownManager; @@ -70,6 +70,7 @@ private: Command nextCommand; std::list remainingBankMachines; + std::list allBankMachines; std::list::iterator currentIterator; BankMachine *currentBankMachine;