From ff265a8a95a8b954c75550f9d5ed558b0b21aaff Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Wed, 19 May 2021 14:03:13 +0200 Subject: [PATCH] Trigger power down interruption outside of refresh manager. --- DRAMSys/library/src/controller/Controller.cpp | 23 ++--- .../powerdown/PowerDownManagerStaggered.cpp | 96 +++++++++---------- .../refresh/RefreshManagerAllBank.cpp | 96 ++++++++++--------- .../refresh/RefreshManagerPerBank.cpp | 83 ++++++++-------- .../refresh/RefreshManagerSameBank.cpp | 84 ++++++++-------- 5 files changed, 196 insertions(+), 186 deletions(-) diff --git a/DRAMSys/library/src/controller/Controller.cpp b/DRAMSys/library/src/controller/Controller.cpp index c9c93f05..b9092b81 100644 --- a/DRAMSys/library/src/controller/Controller.cpp +++ b/DRAMSys/library/src/controller/Controller.cpp @@ -261,20 +261,21 @@ void Controller::controllerMethod() commandTuple = powerDownManagers[rankID]->getNextCommand(); if (std::get(commandTuple) != Command::NOP) readyCommands.emplace_back(commandTuple); - else + + // (4.2) Check for refresh commands (PREA/PRE or REFA/REFB) + commandTuple = refreshManagers[rankID]->getNextCommand(); + if (std::get(commandTuple) != Command::NOP) { - // (4.2) Check for refresh commands (PREA/PRE or REFA/REFB) - commandTuple = refreshManagers[rankID]->getNextCommand(); + readyCommands.emplace_back(commandTuple); + powerDownManagers[rankID]->triggerInterruption(); + } + + // (4.3) Check for bank commands (PRE, ACT, RD/RDA or WR/WRA) + for (auto it : bankMachinesOnRank[rankID]) + { + commandTuple = it->getNextCommand(); if (std::get(commandTuple) != Command::NOP) readyCommands.emplace_back(commandTuple); - - // (4.3) Check for bank commands (PRE, ACT, RD/RDA or WR/WRA) - for (auto it : bankMachinesOnRank[rankID]) - { - commandTuple = it->getNextCommand(); - if (std::get(commandTuple) != Command::NOP) - readyCommands.emplace_back(commandTuple); - } } } diff --git a/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.cpp b/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.cpp index 13532fd0..4ae2a175 100644 --- a/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.cpp +++ b/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.cpp @@ -114,55 +114,55 @@ void PowerDownManagerStaggered::updateState(Command command) { switch (command) { - case Command::ACT: - activatedBanks++; - break; - case Command::PRE: - activatedBanks--; - break; - case Command::PREA: - activatedBanks = 0; - break; - case Command::PDEA: - state = State::ActivePdn; - entryTriggered = false; - break; - case Command::PDEP: - state = State::PrechargePdn; - entryTriggered = false; - break; - case Command::SREFEN: - state = State::SelfRefresh; - entryTriggered = false; - enterSelfRefresh = false; - break; - case Command::PDXA: - state = State::Idle; - exitTriggered = false; - break; - case Command::PDXP: - state = State::Idle; - exitTriggered = false; - if (controllerIdle) - enterSelfRefresh = true; - break; - case Command::SREFEX: - state = State::ExtraRefresh; - break; - case Command::REFA: - if (state == State::ExtraRefresh) - { + case Command::ACT: + activatedBanks++; + break; + case Command::PRE: + activatedBanks--; + break; + case Command::PREA: + activatedBanks = 0; + break; + case Command::PDEA: + state = State::ActivePdn; + entryTriggered = false; + break; + case Command::PDEP: + state = State::PrechargePdn; + entryTriggered = false; + break; + case Command::SREFEN: + state = State::SelfRefresh; + entryTriggered = false; + enterSelfRefresh = false; + break; + case Command::PDXA: state = State::Idle; exitTriggered = false; - } - else if (controllerIdle) - entryTriggered = true; - break; - case Command::REFB: - if (controllerIdle) - entryTriggered = true; - break; - default: - break; + break; + case Command::PDXP: + state = State::Idle; + exitTriggered = false; + if (controllerIdle) + enterSelfRefresh = true; + break; + case Command::SREFEX: + state = State::ExtraRefresh; + break; + case Command::REFA: + if (state == State::ExtraRefresh) + { + state = State::Idle; + exitTriggered = false; + } + else if (controllerIdle) + entryTriggered = true; + break; + case Command::REFB: + if (controllerIdle) + entryTriggered = true; + break; + default: + break; } } diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerAllBank.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerAllBank.cpp index e6e66b18..d9c86544 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerAllBank.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerAllBank.cpp @@ -66,9 +66,9 @@ sc_time RefreshManagerAllBank::start() if (sc_time_stamp() >= timeForNextTrigger) { - powerDownManager->triggerInterruption(); - if (sleeping) - return timeToSchedule; +// powerDownManager->triggerInterruption(); +// if (sleeping) +// return timeToSchedule; if (sc_time_stamp() >= timeForNextTrigger + memSpec->getRefreshIntervalAB()) { @@ -107,7 +107,9 @@ sc_time RefreshManagerAllBank::start() nextCommand = Command::PREA; else nextCommand = Command::REFA; - timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, BankGroup(0), Bank(0)); + + if (!sleeping) + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, BankGroup(0), Bank(0)); return timeToSchedule; } else // if (state == RmState::Pulledin) @@ -131,7 +133,9 @@ sc_time RefreshManagerAllBank::start() else { nextCommand = Command::REFA; - timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, BankGroup(0), Bank(0)); + + if (!sleeping) + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, BankGroup(0), Bank(0)); return timeToSchedule; } } @@ -144,48 +148,48 @@ void RefreshManagerAllBank::updateState(Command command) { switch (command) { - case Command::ACT: - activatedBanks++; - break; - case Command::PRE: case Command::RDA: case Command::WRA: - activatedBanks--; - break; - case Command::PREA: - activatedBanks = 0; - break; - case Command::REFA: - if (sleeping) - { - // Refresh command after SREFEX - state = State::Regular; // TODO: check if this assignment is necessary - timeForNextTrigger = sc_time_stamp() + memSpec->getRefreshIntervalAB(); - sleeping = false; - } - else - { - if (state == State::Pulledin) - flexibilityCounter--; - else - state = State::Pulledin; - - if (flexibilityCounter == maxPulledin) + case Command::ACT: + activatedBanks++; + break; + case Command::PRE: case Command::RDA: case Command::WRA: + activatedBanks--; + break; + case Command::PREA: + activatedBanks = 0; + break; + case Command::REFA: + if (sleeping) { - state = State::Regular; - timeForNextTrigger += memSpec->getRefreshIntervalAB(); + // Refresh command after SREFEX + state = State::Regular; // TODO: check if this assignment is necessary + timeForNextTrigger = sc_time_stamp() + memSpec->getRefreshIntervalAB(); + sleeping = false; } - } - break; - case Command::PDEA: case Command::PDEP: - sleeping = true; - break; - case Command::SREFEN: - sleeping = true; - timeForNextTrigger = sc_max_time(); - break; - case Command::PDXA: case Command::PDXP: - sleeping = false; - break; - default: - break; + else + { + if (state == State::Pulledin) + flexibilityCounter--; + else + state = State::Pulledin; + + if (flexibilityCounter == maxPulledin) + { + state = State::Regular; + timeForNextTrigger += memSpec->getRefreshIntervalAB(); + } + } + break; + case Command::PDEA: case Command::PDEP: + sleeping = true; + break; + case Command::SREFEN: + sleeping = true; + timeForNextTrigger = sc_max_time(); + break; + case Command::PDXA: case Command::PDXP: + sleeping = false; + break; + default: + break; } } diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerPerBank.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerPerBank.cpp index 59991d6b..fc264031 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerPerBank.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerPerBank.cpp @@ -76,9 +76,9 @@ sc_time RefreshManagerPerBank::start() if (sc_time_stamp() >= timeForNextTrigger) { - powerDownManager->triggerInterruption(); - if (sleeping) - return timeToSchedule; +// powerDownManager->triggerInterruption(); +// if (sleeping) +// return timeToSchedule; if (sc_time_stamp() >= timeForNextTrigger + memSpec->getRefreshIntervalPB()) { @@ -129,8 +129,9 @@ sc_time RefreshManagerPerBank::start() } } - timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, - currentBankMachine->getBankGroup(), currentBankMachine->getBank()); + if (!sleeping) + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, + currentBankMachine->getBankGroup(), currentBankMachine->getBank()); return timeToSchedule; } } @@ -161,8 +162,10 @@ sc_time RefreshManagerPerBank::start() nextCommand = Command::PRE; else nextCommand = Command::REFB; - timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, - currentBankMachine->getBankGroup(), currentBankMachine->getBank()); + + if (!sleeping) + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, + currentBankMachine->getBankGroup(), currentBankMachine->getBank()); return timeToSchedule; } } @@ -175,40 +178,40 @@ void RefreshManagerPerBank::updateState(Command command) { switch (command) { - case Command::REFB: - skipSelection = false; - remainingBankMachines.erase(currentIterator); - if (remainingBankMachines.empty()) - remainingBankMachines = allBankMachines; + case Command::REFB: + skipSelection = false; + remainingBankMachines.erase(currentIterator); + if (remainingBankMachines.empty()) + remainingBankMachines = allBankMachines; - if (state == State::Pulledin) - flexibilityCounter--; - else - state = State::Pulledin; + if (state == State::Pulledin) + flexibilityCounter--; + else + state = State::Pulledin; - if (flexibilityCounter == maxPulledin) - { - state = State::Regular; - timeForNextTrigger += memSpec->getRefreshIntervalPB(); - } - break; - case Command::REFA: - // Refresh command after SREFEX - state = State::Regular; // TODO: check if this assignment is necessary - timeForNextTrigger = sc_time_stamp() + memSpec->getRefreshIntervalPB(); - sleeping = false; - break; - case Command::PDEA: case Command::PDEP: - sleeping = true; - break; - case Command::SREFEN: - sleeping = true; - timeForNextTrigger = sc_max_time(); - break; - case Command::PDXA: case Command::PDXP: - sleeping = false; - break; - default: - break; + if (flexibilityCounter == maxPulledin) + { + state = State::Regular; + timeForNextTrigger += memSpec->getRefreshIntervalPB(); + } + break; + case Command::REFA: + // Refresh command after SREFEX + state = State::Regular; // TODO: check if this assignment is necessary + timeForNextTrigger = sc_time_stamp() + memSpec->getRefreshIntervalPB(); + sleeping = false; + break; + case Command::PDEA: case Command::PDEP: + sleeping = true; + break; + case Command::SREFEN: + sleeping = true; + timeForNextTrigger = sc_max_time(); + break; + case Command::PDXA: case Command::PDXP: + sleeping = false; + break; + default: + break; } } diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerSameBank.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerSameBank.cpp index 9e144c4c..e0b3388b 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerSameBank.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerSameBank.cpp @@ -85,9 +85,9 @@ sc_time RefreshManagerSameBank::start() if (sc_time_stamp() >= timeForNextTrigger) { - powerDownManager->triggerInterruption(); - if (sleeping) - return timeToSchedule; +// powerDownManager->triggerInterruption(); +// if (sleeping) +// return timeToSchedule; if (sc_time_stamp() >= timeForNextTrigger + memSpec->getRefreshIntervalSB()) { @@ -148,8 +148,9 @@ sc_time RefreshManagerSameBank::start() skipSelection = true; } - timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, - currentIterator->front()->getBankGroup(), currentIterator->front()->getBank()); + if (!sleeping) + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, + currentIterator->front()->getBankGroup(), currentIterator->front()->getBank()); return timeToSchedule; } } @@ -195,8 +196,9 @@ sc_time RefreshManagerSameBank::start() } } - timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, - currentIterator->front()->getBankGroup(), currentIterator->front()->getBank()); + if (!sleeping) + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, + currentIterator->front()->getBankGroup(), currentIterator->front()->getBank()); return timeToSchedule; } } @@ -209,41 +211,41 @@ void RefreshManagerSameBank::updateState(Command command) { switch (command) { - case Command::REFSB: - skipSelection = false; - remainingBankMachines.erase(currentIterator); - if (remainingBankMachines.empty()) - remainingBankMachines = allBankMachines; - currentIterator = remainingBankMachines.begin(); + case Command::REFSB: + skipSelection = false; + remainingBankMachines.erase(currentIterator); + if (remainingBankMachines.empty()) + remainingBankMachines = allBankMachines; + currentIterator = remainingBankMachines.begin(); - if (state == State::Pulledin) - flexibilityCounter--; - else - state = State::Pulledin; + if (state == State::Pulledin) + flexibilityCounter--; + else + state = State::Pulledin; - if (flexibilityCounter == maxPulledin) - { - state = State::Regular; - timeForNextTrigger += memSpec->getRefreshIntervalSB(); - } - break; - case Command::REFA: - // Refresh command after SREFEX - state = State::Regular; // TODO: check if this assignment is necessary - timeForNextTrigger = sc_time_stamp() + memSpec->getRefreshIntervalSB(); - sleeping = false; - break; - case Command::PDEA: case Command::PDEP: - sleeping = true; - break; - case Command::SREFEN: - sleeping = true; - timeForNextTrigger = sc_max_time(); - break; - case Command::PDXA: case Command::PDXP: - sleeping = false; - break; - default: - break; + if (flexibilityCounter == maxPulledin) + { + state = State::Regular; + timeForNextTrigger += memSpec->getRefreshIntervalSB(); + } + break; + case Command::REFA: + // Refresh command after SREFEX + state = State::Regular; // TODO: check if this assignment is necessary + timeForNextTrigger = sc_time_stamp() + memSpec->getRefreshIntervalSB(); + sleeping = false; + break; + case Command::PDEA: case Command::PDEP: + sleeping = true; + break; + case Command::SREFEN: + sleeping = true; + timeForNextTrigger = sc_max_time(); + break; + case Command::PDXA: case Command::PDXP: + sleeping = false; + break; + default: + break; } }