From 65a20e982743858cf2e24e84ee145ca2f6687280 Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Thu, 13 Apr 2023 09:57:50 +0200 Subject: [PATCH] Remove checker from BM, RM and PDM. --- .../DRAMSys/controller/BankMachine.cpp | 62 ++++++------------ .../DRAMSys/controller/BankMachine.h | 24 +++---- .../DRAMSys/controller/Controller.cpp | 65 ++++++++++++++----- .../powerdown/PowerDownManagerDummy.cpp | 7 +- .../powerdown/PowerDownManagerDummy.h | 2 +- .../controller/powerdown/PowerDownManagerIF.h | 2 +- .../powerdown/PowerDownManagerStaggered.cpp | 14 +--- .../powerdown/PowerDownManagerStaggered.h | 5 +- .../refresh/RefreshManagerAllBank.cpp | 27 ++++---- .../refresh/RefreshManagerAllBank.h | 7 +- .../refresh/RefreshManagerDummy.cpp | 6 +- .../controller/refresh/RefreshManagerDummy.h | 3 +- .../controller/refresh/RefreshManagerIF.h | 3 +- .../refresh/RefreshManagerPer2Bank.cpp | 31 ++++----- .../refresh/RefreshManagerPer2Bank.h | 7 +- .../refresh/RefreshManagerPerBank.cpp | 29 ++++----- .../refresh/RefreshManagerPerBank.h | 7 +- .../refresh/RefreshManagerSameBank.cpp | 37 ++++------- .../refresh/RefreshManagerSameBank.h | 7 +- 19 files changed, 158 insertions(+), 187 deletions(-) diff --git a/src/libdramsys/DRAMSys/controller/BankMachine.cpp b/src/libdramsys/DRAMSys/controller/BankMachine.cpp index a16f8af9..cd9ac0d1 100644 --- a/src/libdramsys/DRAMSys/controller/BankMachine.cpp +++ b/src/libdramsys/DRAMSys/controller/BankMachine.cpp @@ -41,15 +41,15 @@ using namespace sc_core; using namespace tlm; -BankMachine::BankMachine(const Configuration& config, const SchedulerIF& scheduler, const CheckerIF& checker, Bank bank) - : scheduler(scheduler), checker(checker), memSpec(*config.memSpec), bank(bank), +BankMachine::BankMachine(const Configuration& config, const SchedulerIF& scheduler, Bank bank) + : scheduler(scheduler), memSpec(*config.memSpec), bank(bank), bankgroup(BankGroup(bank.ID() / memSpec.banksPerGroup)), rank(Rank(bank.ID() / memSpec.banksPerRank)), refreshManagement(config.refreshManagement) {} CommandTuple::Type BankMachine::getNextCommand() { - return {nextCommand, currentPayload, std::max(timeToSchedule, sc_time_stamp())}; + return {nextCommand, currentPayload, SC_ZERO_TIME}; } void BankMachine::update(Command command) @@ -121,7 +121,6 @@ uint64_t BankMachine::getRefreshManagementCounter() const void BankMachine::block() { blocked = true; - timeToSchedule = sc_max_time(); nextCommand = Command::NOP; } @@ -160,13 +159,11 @@ bool BankMachine::isPrecharged() const return state == State::Precharged; } -BankMachineOpen::BankMachineOpen(const Configuration& config, const SchedulerIF& scheduler, const CheckerIF& checker, - Bank bank) - : BankMachine(config, scheduler, checker, bank) {} +BankMachineOpen::BankMachineOpen(const Configuration& config, const SchedulerIF& scheduler, Bank bank) + : BankMachine(config, scheduler, bank) {} -sc_time BankMachineOpen::evaluate() +void BankMachineOpen::evaluate() { - timeToSchedule = sc_max_time(); nextCommand = Command::NOP; if (!(sleeping || blocked)) @@ -174,7 +171,7 @@ sc_time BankMachineOpen::evaluate() tlm_generic_payload* newPayload = scheduler.getNextRequest(*this); if (newPayload == nullptr) { - return timeToSchedule; + return; } else { @@ -204,21 +201,15 @@ sc_time BankMachineOpen::evaluate() else // row miss nextCommand = Command::PREPB; } - timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, *currentPayload); - return timeToSchedule; } } - else - return timeToSchedule; } -BankMachineClosed::BankMachineClosed(const Configuration& config, const SchedulerIF& scheduler, - const CheckerIF& checker, Bank bank) - : BankMachine(config, scheduler, checker, bank) {} +BankMachineClosed::BankMachineClosed(const Configuration& config, const SchedulerIF& scheduler, Bank bank) + : BankMachine(config, scheduler, bank) {} -sc_time BankMachineClosed::evaluate() +void BankMachineClosed::evaluate() { - timeToSchedule = sc_max_time(); nextCommand = Command::NOP; if (!(sleeping || blocked)) @@ -226,7 +217,7 @@ sc_time BankMachineClosed::evaluate() tlm_generic_payload* newPayload = scheduler.getNextRequest(*this); if (newPayload == nullptr) { - return timeToSchedule; + return; } else { @@ -251,21 +242,15 @@ sc_time BankMachineClosed::evaluate() else nextCommand = Command::WRA; } - timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, *currentPayload); - return timeToSchedule; } } - else - return timeToSchedule; } -BankMachineOpenAdaptive::BankMachineOpenAdaptive(const Configuration& config, const SchedulerIF& scheduler, - const CheckerIF& checker, Bank bank) - : BankMachine(config, scheduler, checker, bank) {} +BankMachineOpenAdaptive::BankMachineOpenAdaptive(const Configuration& config, const SchedulerIF& scheduler, Bank bank) + : BankMachine(config, scheduler, bank) {} -sc_time BankMachineOpenAdaptive::evaluate() +void BankMachineOpenAdaptive::evaluate() { - timeToSchedule = sc_max_time(); nextCommand = Command::NOP; if (!(sleeping || blocked)) @@ -273,7 +258,7 @@ sc_time BankMachineOpenAdaptive::evaluate() tlm_generic_payload* newPayload = scheduler.getNextRequest(*this); if (newPayload == nullptr) { - return timeToSchedule; + return; } else { @@ -315,21 +300,16 @@ sc_time BankMachineOpenAdaptive::evaluate() else // row miss nextCommand = Command::PREPB; } - timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, *currentPayload); - return timeToSchedule; } } - else - return timeToSchedule; } BankMachineClosedAdaptive::BankMachineClosedAdaptive(const Configuration& config, const SchedulerIF& scheduler, - const CheckerIF& checker, Bank bank) - : BankMachine(config, scheduler, checker, bank) {} + Bank bank) + : BankMachine(config, scheduler, bank) {} -sc_time BankMachineClosedAdaptive::evaluate() +void BankMachineClosedAdaptive::evaluate() { - timeToSchedule = sc_max_time(); nextCommand = Command::NOP; if (!(sleeping || blocked)) @@ -337,7 +317,7 @@ sc_time BankMachineClosedAdaptive::evaluate() tlm_generic_payload* newPayload = scheduler.getNextRequest(*this); if (newPayload == nullptr) { - return timeToSchedule; + return; } else { @@ -378,10 +358,6 @@ sc_time BankMachineClosedAdaptive::evaluate() else // row miss, can happen when RD/WR mode is switched nextCommand = Command::PREPB; } - timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, *currentPayload); - return timeToSchedule; } } - else - return timeToSchedule; } diff --git a/src/libdramsys/DRAMSys/controller/BankMachine.h b/src/libdramsys/DRAMSys/controller/BankMachine.h index 5c2a9fd9..b6591cb3 100644 --- a/src/libdramsys/DRAMSys/controller/BankMachine.h +++ b/src/libdramsys/DRAMSys/controller/BankMachine.h @@ -49,7 +49,7 @@ class BankMachine { public: virtual ~BankMachine() = default; - virtual sc_core::sc_time evaluate() = 0; + virtual void evaluate() = 0; CommandTuple::Type getNextCommand(); void update(Command); void block(); @@ -65,14 +65,12 @@ public: protected: enum class State {Precharged, Activated} state = State::Precharged; - BankMachine(const Configuration& config, const SchedulerIF& scheduler, const CheckerIF& checker, Bank bank); + BankMachine(const Configuration& config, const SchedulerIF& scheduler, Bank bank); const MemSpec& memSpec; tlm::tlm_generic_payload* currentPayload = nullptr; const SchedulerIF& scheduler; - const CheckerIF& checker; Command nextCommand = Command::NOP; Row openRow; - sc_core::sc_time timeToSchedule = sc_core::sc_max_time(); const Bank bank; const BankGroup bankgroup; const Rank rank; @@ -86,31 +84,29 @@ protected: class BankMachineOpen final : public BankMachine { public: - BankMachineOpen(const Configuration& config, const SchedulerIF& scheduler, const CheckerIF& checker, Bank bank); - sc_core::sc_time evaluate() override; + BankMachineOpen(const Configuration& config, const SchedulerIF& scheduler, Bank bank); + void evaluate() override; }; class BankMachineClosed final : public BankMachine { public: - BankMachineClosed(const Configuration& config, const SchedulerIF& scheduler, const CheckerIF& checker, Bank bank); - sc_core::sc_time evaluate() override; + BankMachineClosed(const Configuration& config, const SchedulerIF& scheduler, Bank bank); + void evaluate() override; }; class BankMachineOpenAdaptive final : public BankMachine { public: - BankMachineOpenAdaptive(const Configuration& config, const SchedulerIF& scheduler, const CheckerIF& checker, - Bank bank); - sc_core::sc_time evaluate() override; + BankMachineOpenAdaptive(const Configuration& config, const SchedulerIF& scheduler, Bank bank); + void evaluate() override; }; class BankMachineClosedAdaptive final : public BankMachine { public: - BankMachineClosedAdaptive(const Configuration& config, const SchedulerIF& scheduler, const CheckerIF& checker, - Bank bank); - sc_core::sc_time evaluate() override; + BankMachineClosedAdaptive(const Configuration& config, const SchedulerIF& scheduler, Bank bank); + void evaluate() override; }; #endif // BANKMACHINE_H diff --git a/src/libdramsys/DRAMSys/controller/Controller.cpp b/src/libdramsys/DRAMSys/controller/Controller.cpp index 2865a750..f8743220 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.cpp +++ b/src/libdramsys/DRAMSys/controller/Controller.cpp @@ -164,25 +164,25 @@ Controller::Controller(const sc_module_name& name, const Configuration& config, { for (unsigned bankID = 0; bankID < memSpec.banksPerChannel; bankID++) bankMachines.emplace_back(std::make_unique - (config, *scheduler, *checker, Bank(bankID))); + (config, *scheduler, Bank(bankID))); } else if (config.pagePolicy == Configuration::PagePolicy::OpenAdaptive) { for (unsigned bankID = 0; bankID < memSpec.banksPerChannel; bankID++) bankMachines.emplace_back(std::make_unique - (config, *scheduler, *checker, Bank(bankID))); + (config, *scheduler, Bank(bankID))); } else if (config.pagePolicy == Configuration::PagePolicy::Closed) { for (unsigned bankID = 0; bankID < memSpec.banksPerChannel; bankID++) bankMachines.emplace_back(std::make_unique - (config, *scheduler, *checker, Bank(bankID))); + (config, *scheduler, Bank(bankID))); } else if (config.pagePolicy == Configuration::PagePolicy::ClosedAdaptive) { for (unsigned bankID = 0; bankID < memSpec.banksPerChannel; bankID++) bankMachines.emplace_back(std::make_unique - (config, *scheduler, *checker, Bank(bankID))); + (config, *scheduler, Bank(bankID))); } bankMachinesOnRank = std::vector>(memSpec.ranksPerChannel, @@ -219,7 +219,7 @@ Controller::Controller(const sc_module_name& name, const Configuration& config, for (unsigned rankID = 0; rankID < memSpec.ranksPerChannel; rankID++) { refreshManagers.emplace_back(std::make_unique - (config, bankMachinesOnRank[rankID], *powerDownManagers[rankID].get(), Rank(rankID), *checker)); + (config, bankMachinesOnRank[rankID], *powerDownManagers[rankID].get(), Rank(rankID))); } } else if (config.refreshPolicy == Configuration::RefreshPolicy::SameBank) @@ -227,7 +227,7 @@ Controller::Controller(const sc_module_name& name, const Configuration& config, for (unsigned rankID = 0; rankID < memSpec.ranksPerChannel; rankID++) { refreshManagers.emplace_back(std::make_unique - (config, bankMachinesOnRank[rankID], *powerDownManagers[rankID].get(), Rank(rankID), *checker)); + (config, bankMachinesOnRank[rankID], *powerDownManagers[rankID].get(), Rank(rankID))); } } else if (config.refreshPolicy == Configuration::RefreshPolicy::PerBank) @@ -236,7 +236,7 @@ Controller::Controller(const sc_module_name& name, const Configuration& config, { // TODO: remove bankMachines in constructor refreshManagers.emplace_back(std::make_unique - (config, bankMachinesOnRank[rankID], *powerDownManagers[rankID], Rank(rankID), *checker)); + (config, bankMachinesOnRank[rankID], *powerDownManagers[rankID], Rank(rankID))); } } else if (config.refreshPolicy == Configuration::RefreshPolicy::Per2Bank) @@ -245,7 +245,7 @@ Controller::Controller(const sc_module_name& name, const Configuration& config, { // TODO: remove bankMachines in constructor refreshManagers.emplace_back(std::make_unique - (config, bankMachinesOnRank[rankID], *powerDownManagers[rankID], Rank(rankID), *checker)); + (config, bankMachinesOnRank[rankID], *powerDownManagers[rankID], Rank(rankID))); } } else @@ -301,6 +301,12 @@ void Controller::controllerMethod() bool readyCmdBlocked = false; if (!readyCommands.empty()) { + for (auto& it : readyCommands) + { + Command command = std::get(it); + tlm_generic_payload* trans = std::get(it); + std::get(it) = checker->timeToSatisfyConstraints(command, *trans); + } commandTuple = cmdMux->selectCommand(readyCommands); Command command = std::get(commandTuple); tlm_generic_payload* trans = std::get(commandTuple); @@ -363,21 +369,46 @@ void Controller::controllerMethod() sc_time localTime; for (auto& it : bankMachines) { - localTime = it->evaluate(); - if (!(localTime == sc_time_stamp() && readyCmdBlocked)) - timeForNextTrigger = std::min(timeForNextTrigger, localTime); + it->evaluate(); + commandTuple = it->getNextCommand(); + Command command = std::get(commandTuple); + tlm_generic_payload* trans = std::get(commandTuple); + if (command != Command::NOP) + { + localTime = checker->timeToSatisfyConstraints(command, *trans); + if (!(localTime == sc_time_stamp() && readyCmdBlocked)) + timeForNextTrigger = std::min(timeForNextTrigger, localTime); + } } for (auto& it : refreshManagers) { - localTime = it->evaluate(); - if (!(localTime == sc_time_stamp() && readyCmdBlocked)) - timeForNextTrigger = std::min(timeForNextTrigger, localTime); + it->evaluate(); + commandTuple = it->getNextCommand(); + Command command = std::get(commandTuple); + tlm_generic_payload* trans = std::get(commandTuple); + if (command != Command::NOP) + { + localTime = checker->timeToSatisfyConstraints(command, *trans); + if (!(localTime == sc_time_stamp() && readyCmdBlocked)) + timeForNextTrigger = std::min(timeForNextTrigger, localTime); + } + else + { + timeForNextTrigger = std::min(timeForNextTrigger, it->getTimeForNextTrigger()); + } } for (auto& it : powerDownManagers) { - localTime = it->evaluate(); - if (!(localTime == sc_time_stamp() && readyCmdBlocked)) - timeForNextTrigger = std::min(timeForNextTrigger, localTime); + it->evaluate(); + commandTuple = it->getNextCommand(); + Command command = std::get(commandTuple); + tlm_generic_payload* trans = std::get(commandTuple); + if (command != Command::NOP) + { + localTime = checker->timeToSatisfyConstraints(command, *trans); + if (!(localTime == sc_time_stamp() && readyCmdBlocked)) + timeForNextTrigger = std::min(timeForNextTrigger, localTime); + } } if (timeForNextTrigger != sc_max_time()) diff --git a/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerDummy.cpp b/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerDummy.cpp index 57b77ed1..6f63c761 100644 --- a/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerDummy.cpp +++ b/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerDummy.cpp @@ -39,10 +39,5 @@ using namespace tlm; CommandTuple::Type PowerDownManagerDummy::getNextCommand() { - return {Command::NOP, nullptr, sc_max_time()}; -} - -sc_time PowerDownManagerDummy::evaluate() -{ - return sc_max_time(); + return {Command::NOP, nullptr, SC_ZERO_TIME}; } diff --git a/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerDummy.h b/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerDummy.h index da1bc5d1..6ab4fab6 100644 --- a/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerDummy.h +++ b/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerDummy.h @@ -48,7 +48,7 @@ public: CommandTuple::Type getNextCommand() override; void update(Command) override {} - sc_core::sc_time evaluate() override; + void evaluate() override {} }; #endif // POWERDOWNMANAGERDUMMY_H diff --git a/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerIF.h b/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerIF.h index 3f9fb6d7..f24d0f57 100644 --- a/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerIF.h +++ b/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerIF.h @@ -50,7 +50,7 @@ public: virtual CommandTuple::Type getNextCommand() = 0; virtual void update(Command) = 0; - virtual sc_core::sc_time evaluate() = 0; + virtual void evaluate() = 0; }; #endif // POWERDOWNMANAGERIF_H diff --git a/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerStaggered.cpp b/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerStaggered.cpp index 167fa212..cb139700 100644 --- a/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerStaggered.cpp +++ b/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerStaggered.cpp @@ -41,7 +41,7 @@ using namespace tlm; PowerDownManagerStaggered::PowerDownManagerStaggered(std::vector& bankMachinesOnRank, Rank rank, CheckerIF& checker) - : bankMachinesOnRank(bankMachinesOnRank), checker(checker) + : bankMachinesOnRank(bankMachinesOnRank) { setUpDummy(powerDownPayload, UINT64_MAX - 1, rank); } @@ -74,12 +74,11 @@ void PowerDownManagerStaggered::triggerInterruption() CommandTuple::Type PowerDownManagerStaggered::getNextCommand() { - return {nextCommand, &powerDownPayload, std::max(timeToSchedule, sc_time_stamp())}; + return {nextCommand, &powerDownPayload, SC_ZERO_TIME}; } -sc_time PowerDownManagerStaggered::evaluate() +void PowerDownManagerStaggered::evaluate() { - timeToSchedule = sc_max_time(); nextCommand = Command::NOP; if (exitTriggered) @@ -92,8 +91,6 @@ sc_time PowerDownManagerStaggered::evaluate() nextCommand = Command::SREFEX; else if (state == State::ExtraRefresh) nextCommand = Command::REFAB; - - timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, powerDownPayload); } else if (entryTriggered) { @@ -106,16 +103,11 @@ sc_time PowerDownManagerStaggered::evaluate() break; } } - - timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, powerDownPayload); } else if (enterSelfRefresh) { nextCommand = Command::SREFEN; - timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, powerDownPayload); } - - return timeToSchedule; } void PowerDownManagerStaggered::update(Command command) diff --git a/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerStaggered.h b/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerStaggered.h index 378bfd76..b035a09d 100644 --- a/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerStaggered.h +++ b/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerStaggered.h @@ -55,15 +55,12 @@ public: CommandTuple::Type getNextCommand() override; void update(Command) override; - sc_core::sc_time evaluate() override; + void evaluate() override; private: enum class State {Idle, ActivePdn, PrechargePdn, SelfRefresh, ExtraRefresh} state = State::Idle; tlm::tlm_generic_payload powerDownPayload; std::vector& bankMachinesOnRank; - CheckerIF& checker; - - sc_core::sc_time timeToSchedule = sc_core::sc_max_time(); Command nextCommand = Command::NOP; bool controllerIdle = true; diff --git a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerAllBank.cpp b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerAllBank.cpp index a0d851f9..24c39842 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerAllBank.cpp +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerAllBank.cpp @@ -42,8 +42,8 @@ using namespace sc_core; using namespace tlm; RefreshManagerAllBank::RefreshManagerAllBank(const Configuration& config, std::vector& bankMachinesOnRank, - PowerDownManagerIF& powerDownManager, Rank rank, const CheckerIF& checker) - : bankMachinesOnRank(bankMachinesOnRank), powerDownManager(powerDownManager), checker(checker), + PowerDownManagerIF& powerDownManager, Rank rank) + : bankMachinesOnRank(bankMachinesOnRank), powerDownManager(powerDownManager), memSpec(*config.memSpec), maxPostponed(static_cast(config.refreshMaxPostponed)), maxPulledin(-static_cast(config.refreshMaxPulledin)), refreshManagement(config.refreshManagement) { @@ -54,12 +54,11 @@ RefreshManagerAllBank::RefreshManagerAllBank(const Configuration& config, std::v CommandTuple::Type RefreshManagerAllBank::getNextCommand() { - return {nextCommand, &refreshPayload, std::max(timeToSchedule, sc_time_stamp())}; + return {nextCommand, &refreshPayload, SC_ZERO_TIME}; } -sc_time RefreshManagerAllBank::evaluate() +void RefreshManagerAllBank::evaluate() { - timeToSchedule = sc_max_time(); nextCommand = Command::NOP; if (sc_time_stamp() >= timeForNextTrigger) // Normal refresh @@ -67,7 +66,7 @@ sc_time RefreshManagerAllBank::evaluate() powerDownManager.triggerInterruption(); if (sleeping) - return timeToSchedule; + return; if (sc_time_stamp() >= timeForNextTrigger + memSpec.getRefreshIntervalAB()) { @@ -104,8 +103,7 @@ sc_time RefreshManagerAllBank::evaluate() else nextCommand = Command::REFAB; - timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, refreshPayload); - return timeToSchedule; + return; } } else // if (state == RmState::Pulledin) @@ -126,8 +124,7 @@ sc_time RefreshManagerAllBank::evaluate() { assert(activatedBanks == 0); nextCommand = Command::REFAB; - timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, refreshPayload); - return timeToSchedule; + return; } } } @@ -168,12 +165,9 @@ sc_time RefreshManagerAllBank::evaluate() else nextCommand = Command::RFMAB; - timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, refreshPayload); - return timeToSchedule; + return; } } - - return timeForNextTrigger; } void RefreshManagerAllBank::update(Command command) @@ -225,3 +219,8 @@ void RefreshManagerAllBank::update(Command command) break; } } + +sc_time RefreshManagerAllBank::getTimeForNextTrigger() +{ + return timeForNextTrigger; +} \ No newline at end of file diff --git a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerAllBank.h b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerAllBank.h index d3a3a27d..222cda22 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerAllBank.h +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerAllBank.h @@ -51,11 +51,12 @@ class RefreshManagerAllBank final : public RefreshManagerIF { public: RefreshManagerAllBank(const Configuration& config, std::vector& bankMachinesOnRank, - PowerDownManagerIF& powerDownManager, Rank rank, const CheckerIF& checker); + PowerDownManagerIF& powerDownManager, Rank rank); CommandTuple::Type getNextCommand() override; - sc_core::sc_time evaluate() override; + void evaluate() override; void update(Command) override; + sc_core::sc_time getTimeForNextTrigger() override; private: enum class State {Regular, Pulledin} state = State::Regular; @@ -64,8 +65,6 @@ private: PowerDownManagerIF& powerDownManager; tlm::tlm_generic_payload refreshPayload; sc_core::sc_time timeForNextTrigger = sc_core::sc_max_time(); - sc_core::sc_time timeToSchedule = sc_core::sc_max_time(); - const CheckerIF& checker; Command nextCommand = Command::NOP; unsigned activatedBanks = 0; diff --git a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerDummy.cpp b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerDummy.cpp index 283e5a69..f8bf824a 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerDummy.cpp +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerDummy.cpp @@ -39,10 +39,10 @@ using namespace tlm; CommandTuple::Type RefreshManagerDummy::getNextCommand() { - return {Command::NOP, nullptr, sc_max_time()}; + return {Command::NOP, nullptr, SC_ZERO_TIME}; } -sc_time RefreshManagerDummy::evaluate() +sc_time RefreshManagerDummy::getTimeForNextTrigger() { return sc_max_time(); -} +} \ No newline at end of file diff --git a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerDummy.h b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerDummy.h index d749a1fe..23087403 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerDummy.h +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerDummy.h @@ -43,8 +43,9 @@ class RefreshManagerDummy final : public RefreshManagerIF { public: CommandTuple::Type getNextCommand() override; - sc_core::sc_time evaluate() override; + void evaluate() override {} void update(Command) override {} + sc_core::sc_time getTimeForNextTrigger() override; }; #endif // REFRESHMANAGERDUMMY_H diff --git a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerIF.h b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerIF.h index de00b66e..3e8966b3 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerIF.h +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerIF.h @@ -48,8 +48,9 @@ public: virtual ~RefreshManagerIF() = default; virtual CommandTuple::Type getNextCommand() = 0; - virtual sc_core::sc_time evaluate() = 0; + virtual void evaluate() = 0; virtual void update(Command) = 0; + virtual sc_core::sc_time getTimeForNextTrigger() = 0; protected: static sc_core::sc_time getTimeForFirstTrigger(const sc_core::sc_time& tCK, const sc_core::sc_time &refreshInterval, diff --git a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPer2Bank.cpp b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPer2Bank.cpp index 07905edd..9792f4e7 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPer2Bank.cpp +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPer2Bank.cpp @@ -42,9 +42,8 @@ using namespace tlm; RefreshManagerPer2Bank::RefreshManagerPer2Bank(const Configuration& config, std::vector& bankMachinesOnRank, - PowerDownManagerIF& powerDownManager, Rank rank, - const CheckerIF& checker) - : powerDownManager(powerDownManager), checker(checker), memSpec(*config.memSpec), + PowerDownManagerIF& powerDownManager, Rank rank) + : powerDownManager(powerDownManager), memSpec(*config.memSpec), maxPostponed(static_cast(config.refreshMaxPostponed * memSpec.banksPerRank / 2)), maxPulledin(-static_cast(config.refreshMaxPulledin * memSpec.banksPerRank / 2)) { @@ -72,19 +71,18 @@ RefreshManagerPer2Bank::RefreshManagerPer2Bank(const Configuration& config, CommandTuple::Type RefreshManagerPer2Bank::getNextCommand() { - return {nextCommand, currentRefreshPayload, std::max(timeToSchedule, sc_time_stamp())}; + return {nextCommand, currentRefreshPayload, SC_ZERO_TIME}; } -sc_time RefreshManagerPer2Bank::evaluate() +void RefreshManagerPer2Bank::evaluate() { - timeToSchedule = sc_max_time(); nextCommand = Command::NOP; if (sc_time_stamp() >= timeForNextTrigger) { powerDownManager.triggerInterruption(); if (sleeping) - return timeToSchedule; + return; if (sc_time_stamp() >= timeForNextTrigger + memSpec.getRefreshIntervalP2B()) { @@ -124,7 +122,7 @@ sc_time RefreshManagerPer2Bank::evaluate() { flexibilityCounter++; timeForNextTrigger += memSpec.getRefreshIntervalP2B(); - return timeForNextTrigger; + return; } else { @@ -147,9 +145,7 @@ sc_time RefreshManagerPer2Bank::evaluate() it->block(); skipSelection = true; } - - timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, *currentRefreshPayload); - return timeToSchedule; + return; } } else // if (state == RmState::Pulledin) @@ -180,7 +176,7 @@ sc_time RefreshManagerPer2Bank::evaluate() { state = State::Regular; timeForNextTrigger += memSpec.getRefreshIntervalP2B(); - return timeForNextTrigger; + return; } else { @@ -195,14 +191,10 @@ sc_time RefreshManagerPer2Bank::evaluate() break; } } - - timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, *currentRefreshPayload); - return timeToSchedule; + return; } } } - else - return timeForNextTrigger; } void RefreshManagerPer2Bank::update(Command command) @@ -250,3 +242,8 @@ void RefreshManagerPer2Bank::update(Command command) break; } } + +sc_time RefreshManagerPer2Bank::getTimeForNextTrigger() +{ + return timeForNextTrigger; +} \ No newline at end of file diff --git a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPer2Bank.h b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPer2Bank.h index 2531b095..b246d239 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPer2Bank.h +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPer2Bank.h @@ -53,11 +53,12 @@ class RefreshManagerPer2Bank final : public RefreshManagerIF { public: RefreshManagerPer2Bank(const Configuration& config, std::vector& bankMachinesOnRank, - PowerDownManagerIF& powerDownManager, Rank rank, const CheckerIF& checker); + PowerDownManagerIF& powerDownManager, Rank rank); CommandTuple::Type getNextCommand() override; - sc_core::sc_time evaluate() override; + void evaluate() override; void update(Command) override; + sc_core::sc_time getTimeForNextTrigger() override; private: enum class State {Regular, Pulledin} state = State::Regular; @@ -66,8 +67,6 @@ private: std::unordered_map refreshPayloads; tlm::tlm_generic_payload* currentRefreshPayload; sc_core::sc_time timeForNextTrigger = sc_core::sc_max_time(); - sc_core::sc_time timeToSchedule = sc_core::sc_max_time(); - const CheckerIF& checker; Command nextCommand = Command::NOP; std::list> remainingBankMachines; diff --git a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPerBank.cpp b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPerBank.cpp index 067ff0c7..809ed246 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPerBank.cpp +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPerBank.cpp @@ -41,8 +41,8 @@ using namespace sc_core; using namespace tlm; RefreshManagerPerBank::RefreshManagerPerBank(const Configuration& config, std::vector& bankMachinesOnRank, - PowerDownManagerIF& powerDownManager, Rank rank, const CheckerIF& checker) - : powerDownManager(powerDownManager), checker(checker), memSpec(*config.memSpec), + PowerDownManagerIF& powerDownManager, Rank rank) + : powerDownManager(powerDownManager), memSpec(*config.memSpec), maxPostponed(static_cast(config.refreshMaxPostponed * memSpec.banksPerRank)), maxPulledin(-static_cast(config.refreshMaxPulledin * memSpec.banksPerRank)) { @@ -60,19 +60,18 @@ RefreshManagerPerBank::RefreshManagerPerBank(const Configuration& config, std::v CommandTuple::Type RefreshManagerPerBank::getNextCommand() { - return {nextCommand, &refreshPayloads.at(*currentIterator), std::max(timeToSchedule, sc_time_stamp())}; + return {nextCommand, &refreshPayloads.at(*currentIterator), SC_ZERO_TIME}; } -sc_time RefreshManagerPerBank::evaluate() +void RefreshManagerPerBank::evaluate() { - timeToSchedule = sc_max_time(); nextCommand = Command::NOP; if (sc_time_stamp() >= timeForNextTrigger) { powerDownManager.triggerInterruption(); if (sleeping) - return timeToSchedule; + return; if (sc_time_stamp() >= timeForNextTrigger + memSpec.getRefreshIntervalPB()) { @@ -104,7 +103,7 @@ sc_time RefreshManagerPerBank::evaluate() { flexibilityCounter++; timeForNextTrigger += memSpec.getRefreshIntervalPB(); - return timeForNextTrigger; + return; } else { @@ -121,9 +120,7 @@ sc_time RefreshManagerPerBank::evaluate() skipSelection = true; } } - - timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, refreshPayloads.at(*currentIterator)); - return timeToSchedule; + return; } } else // if (state == RmState::Pulledin) @@ -144,7 +141,7 @@ sc_time RefreshManagerPerBank::evaluate() { state = State::Regular; timeForNextTrigger += memSpec.getRefreshIntervalPB(); - return timeForNextTrigger; + return; } else { @@ -153,13 +150,10 @@ sc_time RefreshManagerPerBank::evaluate() else nextCommand = Command::REFPB; - timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, refreshPayloads.at(*currentIterator)); - return timeToSchedule; + return; } } } - else - return timeForNextTrigger; } void RefreshManagerPerBank::update(Command command) @@ -207,3 +201,8 @@ void RefreshManagerPerBank::update(Command command) break; } } + +sc_time RefreshManagerPerBank::getTimeForNextTrigger() +{ + return timeForNextTrigger; +} \ No newline at end of file diff --git a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPerBank.h b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPerBank.h index 3a105808..21d41b2d 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPerBank.h +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPerBank.h @@ -53,11 +53,12 @@ class RefreshManagerPerBank final : public RefreshManagerIF { public: RefreshManagerPerBank(const Configuration& config, std::vector& bankMachinesOnRank, - PowerDownManagerIF& powerDownManager, Rank rank, const CheckerIF& checker); + PowerDownManagerIF& powerDownManager, Rank rank); CommandTuple::Type getNextCommand() override; - sc_core::sc_time evaluate() override; + void evaluate() override; void update(Command) override; + sc_core::sc_time getTimeForNextTrigger() override; private: enum class State {Regular, Pulledin} state = State::Regular; @@ -65,8 +66,6 @@ private: PowerDownManagerIF& powerDownManager; std::unordered_map refreshPayloads; sc_core::sc_time timeForNextTrigger = sc_core::sc_max_time(); - sc_core::sc_time timeToSchedule = sc_core::sc_max_time(); - const CheckerIF& checker; Command nextCommand = Command::NOP; std::list remainingBankMachines; diff --git a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerSameBank.cpp b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerSameBank.cpp index 0fc011a9..41a52e8a 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerSameBank.cpp +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerSameBank.cpp @@ -42,9 +42,8 @@ using namespace tlm; RefreshManagerSameBank::RefreshManagerSameBank(const Configuration& config, std::vector& bankMachinesOnRank, - PowerDownManagerIF& powerDownManager, Rank rank, - const CheckerIF& checker) - : powerDownManager(powerDownManager), checker(checker), memSpec(*config.memSpec), + PowerDownManagerIF& powerDownManager, Rank rank) + : powerDownManager(powerDownManager), memSpec(*config.memSpec), maxPostponed(static_cast(config.refreshMaxPostponed * memSpec.banksPerGroup)), maxPulledin(-static_cast(config.refreshMaxPulledin * memSpec.banksPerGroup)), refreshManagement(config.refreshManagement) @@ -79,19 +78,18 @@ CommandTuple::Type RefreshManagerSameBank::getNextCommand() { return {nextCommand, &refreshPayloads[currentIterator->front()->getBank().ID() % memSpec.banksPerGroup], - std::max(timeToSchedule, sc_time_stamp())}; + SC_ZERO_TIME}; } -sc_time RefreshManagerSameBank::evaluate() +void RefreshManagerSameBank::evaluate() { - timeToSchedule = sc_max_time(); nextCommand = Command::NOP; if (sc_time_stamp() >= timeForNextTrigger) { powerDownManager.triggerInterruption(); if (sleeping) - return timeToSchedule; + return; if (sc_time_stamp() >= timeForNextTrigger + memSpec.getRefreshIntervalSB()) { @@ -152,10 +150,7 @@ sc_time RefreshManagerSameBank::evaluate() it->block(); skipSelection = true; } - - timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, - refreshPayloads[currentIterator->front()->getBank().ID() % memSpec.banksPerGroup]); - return timeToSchedule; + return; } } else // if (state == RmState::Pulledin) @@ -198,10 +193,7 @@ sc_time RefreshManagerSameBank::evaluate() break; } } - - timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, - refreshPayloads[currentIterator->front()->getBank().ID() % memSpec.banksPerGroup]); - return timeToSchedule; + return; } } } @@ -237,9 +229,7 @@ sc_time RefreshManagerSameBank::evaluate() if (groupIt->isActivated()) nextCommand = Command::PRESB; } - timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, - refreshPayloads[currentIterator->front()->getBank().ID() % memSpec.banksPerGroup]); - return timeToSchedule; + return; } else if (!imtCandidates.empty()) { @@ -274,14 +264,10 @@ sc_time RefreshManagerSameBank::evaluate() break; } } - timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, - refreshPayloads[currentIterator->front()->getBank().ID() % memSpec.banksPerGroup]); - return timeToSchedule; + return; } } } - - return timeForNextTrigger; } void RefreshManagerSameBank::update(Command command) @@ -329,3 +315,8 @@ void RefreshManagerSameBank::update(Command command) break; } } + +sc_time RefreshManagerSameBank::getTimeForNextTrigger() +{ + return timeForNextTrigger; +} diff --git a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerSameBank.h b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerSameBank.h index 3012a850..ace44f16 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerSameBank.h +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerSameBank.h @@ -52,11 +52,12 @@ class RefreshManagerSameBank final : public RefreshManagerIF { public: RefreshManagerSameBank(const Configuration& config, std::vector& bankMachinesOnRank, - PowerDownManagerIF& powerDownManager, Rank rank, const CheckerIF& checker); + PowerDownManagerIF& powerDownManager, Rank rank); CommandTuple::Type getNextCommand() override; - sc_core::sc_time evaluate() override; + void evaluate() override; void update(Command) override; + sc_core::sc_time getTimeForNextTrigger() override; private: enum class State {Regular, Pulledin} state = State::Regular; @@ -64,8 +65,6 @@ private: PowerDownManagerIF& powerDownManager; std::vector refreshPayloads; sc_core::sc_time timeForNextTrigger = sc_core::sc_max_time(); - sc_core::sc_time timeToSchedule = sc_core::sc_max_time(); - const CheckerIF& checker; Command nextCommand = Command::NOP; std::list> remainingBankMachines;