diff --git a/src/libdramsys/DRAMSys/common/dramExtensions.h b/src/libdramsys/DRAMSys/common/dramExtensions.h index feb24516..d02a8c8d 100644 --- a/src/libdramsys/DRAMSys/common/dramExtensions.h +++ b/src/libdramsys/DRAMSys/common/dramExtensions.h @@ -202,7 +202,7 @@ private: }; template -struct ControllerVector +class ControllerVector { private: std::vector baseVector; @@ -229,6 +229,21 @@ public: { return baseVector[index.ID()]; } + + void push_back(ValueType&& value) + { + baseVector.push_back(std::move(value)); + } + + typename std::vector::iterator begin() + { + return baseVector.begin(); + } + + typename std::vector::iterator end() + { + return baseVector.end(); + } }; class ArbiterExtension : public tlm::tlm_extension diff --git a/src/libdramsys/DRAMSys/controller/Controller.cpp b/src/libdramsys/DRAMSys/controller/Controller.cpp index 9bd58985..f13e0d2b 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.cpp +++ b/src/libdramsys/DRAMSys/controller/Controller.cpp @@ -90,7 +90,7 @@ Controller::Controller(const sc_module_name& name, const Configuration& config, SC_METHOD(controllerMethod); sensitive << beginReqEvent << endRespEvent << controllerEvent << dataResponseEvent; - ranksNumberOfPayloads = std::vector(memSpec.ranksPerChannel); + ranksNumberOfPayloads = ControllerVector(memSpec.ranksPerChannel); // reserve buffer for command tuples readyCommands.reserve(memSpec.banksPerChannel); @@ -166,47 +166,48 @@ Controller::Controller(const sc_module_name& name, const Configuration& config, if (config.pagePolicy == Configuration::PagePolicy::Open) { for (unsigned bankID = 0; bankID < memSpec.banksPerChannel; bankID++) - bankMachines.emplace_back(std::make_unique + bankMachines.push_back(std::make_unique (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 + bankMachines.push_back(std::make_unique (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 + bankMachines.push_back(std::make_unique (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 + bankMachines.push_back(std::make_unique (config, *scheduler, Bank(bankID))); } - bankMachinesOnRank = std::vector>(memSpec.ranksPerChannel, - std::vector(memSpec.banksPerRank)); + bankMachinesOnRank = ControllerVector>(memSpec.ranksPerChannel, + ControllerVector(memSpec.banksPerRank)); for (unsigned rankID = 0; rankID < memSpec.ranksPerChannel; rankID++) { for (unsigned bankID = 0; bankID < memSpec.banksPerRank; bankID++) - bankMachinesOnRank[rankID][bankID] = bankMachines[rankID * memSpec.banksPerRank + bankID].get(); + bankMachinesOnRank[Rank(rankID)][Bank(bankID)] + = bankMachines[Bank(rankID * memSpec.banksPerRank + bankID)].get(); } // instantiate power-down managers (one per rank) if (config.powerDownPolicy == Configuration::PowerDownPolicy::NoPowerDown) { for (unsigned rankID = 0; rankID < memSpec.ranksPerChannel; rankID++) - powerDownManagers.emplace_back(std::make_unique()); + powerDownManagers.push_back(std::make_unique()); } else if (config.powerDownPolicy == Configuration::PowerDownPolicy::Staggered) { for (unsigned rankID = 0; rankID < memSpec.ranksPerChannel; rankID++) { - powerDownManagers.emplace_back(std::make_unique(bankMachinesOnRank[rankID], + powerDownManagers.push_back(std::make_unique(bankMachinesOnRank[Rank(rankID)], Rank(rankID), *checker)); } } @@ -215,22 +216,22 @@ Controller::Controller(const sc_module_name& name, const Configuration& config, if (config.refreshPolicy == Configuration::RefreshPolicy::NoRefresh) { for (unsigned rankID = 0; rankID < memSpec.ranksPerChannel; rankID++) - refreshManagers.emplace_back(std::make_unique()); + refreshManagers.push_back(std::make_unique()); } else if (config.refreshPolicy == Configuration::RefreshPolicy::AllBank) { for (unsigned rankID = 0; rankID < memSpec.ranksPerChannel; rankID++) { - refreshManagers.emplace_back(std::make_unique - (config, bankMachinesOnRank[rankID], *powerDownManagers[rankID].get(), Rank(rankID))); + refreshManagers.push_back(std::make_unique + (config, bankMachinesOnRank[Rank(rankID)], *powerDownManagers[Rank(rankID)], Rank(rankID))); } } else if (config.refreshPolicy == Configuration::RefreshPolicy::SameBank) { for (unsigned rankID = 0; rankID < memSpec.ranksPerChannel; rankID++) { - refreshManagers.emplace_back(std::make_unique - (config, bankMachinesOnRank[rankID], *powerDownManagers[rankID].get(), Rank(rankID))); + refreshManagers.push_back(std::make_unique + (config, bankMachinesOnRank[Rank(rankID)], *powerDownManagers[Rank(rankID)], Rank(rankID))); } } else if (config.refreshPolicy == Configuration::RefreshPolicy::PerBank) @@ -238,8 +239,8 @@ Controller::Controller(const sc_module_name& name, const Configuration& config, for (unsigned rankID = 0; rankID < memSpec.ranksPerChannel; rankID++) { // TODO: remove bankMachines in constructor - refreshManagers.emplace_back(std::make_unique - (config, bankMachinesOnRank[rankID], *powerDownManagers[rankID], Rank(rankID))); + refreshManagers.push_back(std::make_unique + (config, bankMachinesOnRank[Rank(rankID)], *powerDownManagers[Rank(rankID)], Rank(rankID))); } } else if (config.refreshPolicy == Configuration::RefreshPolicy::Per2Bank) @@ -247,8 +248,8 @@ Controller::Controller(const sc_module_name& name, const Configuration& config, for (unsigned rankID = 0; rankID < memSpec.ranksPerChannel; rankID++) { // TODO: remove bankMachines in constructor - refreshManagers.emplace_back(std::make_unique - (config, bankMachinesOnRank[rankID], *powerDownManagers[rankID], Rank(rankID))); + refreshManagers.push_back(std::make_unique + (config, bankMachinesOnRank[Rank(rankID)], *powerDownManagers[Rank(rankID)], Rank(rankID))); } } else @@ -280,18 +281,18 @@ void Controller::controllerMethod() for (unsigned rankID = 0; rankID < memSpec.ranksPerChannel; rankID++) { // (4.1) Check for power-down commands (PDEA/PDEP/SREFEN or PDXA/PDXP/SREFEX) - commandTuple = powerDownManagers[rankID]->getNextCommand(); + commandTuple = powerDownManagers[Rank(rankID)]->getNextCommand(); if (std::get(commandTuple) != Command::NOP) readyCommands.emplace_back(commandTuple); else { // (4.2) Check for refresh commands (PREXX or REFXX) - commandTuple = refreshManagers[rankID]->getNextCommand(); + commandTuple = refreshManagers[Rank(rankID)]->getNextCommand(); if (std::get(commandTuple) != Command::NOP) readyCommands.emplace_back(commandTuple); // (4.3) Check for bank commands (PREPB, ACT, RD/RDA or WR/WRA) - for (auto it : bankMachinesOnRank[rankID]) + for (auto it : bankMachinesOnRank[Rank(rankID)]) { commandTuple = it->getNextCommand(); if (std::get(commandTuple) != Command::NOP) @@ -320,25 +321,25 @@ void Controller::controllerMethod() if (command.isRankCommand()) { - for (auto it : bankMachinesOnRank[rank.ID()]) + for (auto it : bankMachinesOnRank[rank]) it->update(command); } else if (command.isGroupCommand()) { for (unsigned bankID = (bank.ID() % memSpec.banksPerGroup); bankID < memSpec.banksPerRank; bankID += memSpec.banksPerGroup) - bankMachinesOnRank[rank.ID()][bankID]->update(command); + bankMachinesOnRank[rank][Bank(bankID)]->update(command); } else if (command.is2BankCommand()) { - bankMachines[bank.ID()]->update(command); - bankMachines[bank.ID() + memSpec.getPer2BankOffset()]->update(command); + bankMachines[bank]->update(command); + bankMachines[Bank(bank.ID() + memSpec.getPer2BankOffset())]->update(command); } else // if (isBankCommand(command)) - bankMachines[bank.ID()]->update(command); + bankMachines[bank]->update(command); - refreshManagers[rank.ID()]->update(command); - powerDownManagers[rank.ID()]->update(command); + refreshManagers[rank]->update(command); + powerDownManagers[rank]->update(command); checker->insert(command, *trans); if (command.isCasCommand()) @@ -354,10 +355,10 @@ void Controller::controllerMethod() if (triggerTime != scMaxTime) dataResponseEvent.notify(triggerTime - sc_time_stamp()); - ranksNumberOfPayloads[rank.ID()]--; // TODO: move to a different place? + ranksNumberOfPayloads[rank]--; // TODO: move to a different place? } - if (ranksNumberOfPayloads[rank.ID()] == 0) - powerDownManagers[rank.ID()]->triggerEntry(); + if (ranksNumberOfPayloads[rank] == 0) + powerDownManagers[rank]->triggerEntry(); sc_time fwDelay = thinkDelayFw + phyDelayFw; tlm_phase phase = command.toPhase(); @@ -487,13 +488,13 @@ void Controller::manageRequests(const sc_time& delay) transToAcquire.payload->get_data_length() / memSpec.bytesPerBeat); Rank rank = Rank(decodedAddress.rank); - if (ranksNumberOfPayloads[rank.ID()] == 0) - powerDownManagers[rank.ID()]->triggerExit(); - ranksNumberOfPayloads[rank.ID()]++; + if (ranksNumberOfPayloads[rank] == 0) + powerDownManagers[rank]->triggerExit(); + ranksNumberOfPayloads[rank]++; scheduler->storeRequest(*transToAcquire.payload); Bank bank = Bank(decodedAddress.bank); - bankMachines[bank.ID()]->evaluate(); + bankMachines[bank]->evaluate(); } else { @@ -503,13 +504,13 @@ void Controller::manageRequests(const sc_time& delay) for (auto* childTrans : childTranses) { Rank rank = ControllerExtension::getRank(*childTrans); - if (ranksNumberOfPayloads[rank.ID()] == 0) - powerDownManagers[rank.ID()]->triggerExit(); - ranksNumberOfPayloads[rank.ID()]++; + if (ranksNumberOfPayloads[rank] == 0) + powerDownManagers[rank]->triggerExit(); + ranksNumberOfPayloads[rank]++; scheduler->storeRequest(*childTrans); Bank bank = ControllerExtension::getBank(*childTrans); - bankMachines[bank.ID()]->evaluate(); + bankMachines[bank]->evaluate(); } } diff --git a/src/libdramsys/DRAMSys/controller/Controller.h b/src/libdramsys/DRAMSys/controller/Controller.h index f2a1ea60..4c598f70 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.h +++ b/src/libdramsys/DRAMSys/controller/Controller.h @@ -83,16 +83,16 @@ protected: private: unsigned totalNumberOfPayloads = 0; - std::vector ranksNumberOfPayloads; + ControllerVector ranksNumberOfPayloads; ReadyCommands readyCommands; - std::vector> bankMachines; - std::vector> bankMachinesOnRank; + ControllerVector> bankMachines; + ControllerVector> bankMachinesOnRank; std::unique_ptr cmdMux; std::unique_ptr checker; std::unique_ptr respQueue; - std::vector> refreshManagers; - std::vector> powerDownManagers; + ControllerVector> refreshManagers; + ControllerVector> powerDownManagers; const AddressDecoder& addressDecoder; uint64_t nextChannelPayloadIDToAppend = 1; diff --git a/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerStaggered.cpp b/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerStaggered.cpp index e0bad06d..a9d0213d 100644 --- a/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerStaggered.cpp +++ b/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerStaggered.cpp @@ -42,7 +42,7 @@ using namespace tlm; namespace DRAMSys { -PowerDownManagerStaggered::PowerDownManagerStaggered(std::vector& bankMachinesOnRank, +PowerDownManagerStaggered::PowerDownManagerStaggered(ControllerVector& bankMachinesOnRank, Rank rank, CheckerIF& checker) : bankMachinesOnRank(bankMachinesOnRank) { diff --git a/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerStaggered.h b/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerStaggered.h index d0aff5f9..ac061f0c 100644 --- a/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerStaggered.h +++ b/src/libdramsys/DRAMSys/controller/powerdown/PowerDownManagerStaggered.h @@ -49,7 +49,7 @@ class BankMachine; class PowerDownManagerStaggered final : public PowerDownManagerIF { public: - PowerDownManagerStaggered(std::vector& bankMachinesOnRank, + PowerDownManagerStaggered(ControllerVector& bankMachinesOnRank, Rank rank, CheckerIF& checker); void triggerEntry() override; @@ -63,7 +63,7 @@ public: private: enum class State {Idle, ActivePdn, PrechargePdn, SelfRefresh, ExtraRefresh} state = State::Idle; tlm::tlm_generic_payload powerDownPayload; - std::vector& bankMachinesOnRank; + ControllerVector& bankMachinesOnRank; 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 333ef9f1..7a2a22f3 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerAllBank.cpp +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerAllBank.cpp @@ -44,7 +44,8 @@ using namespace tlm; namespace DRAMSys { -RefreshManagerAllBank::RefreshManagerAllBank(const Configuration& config, std::vector& bankMachinesOnRank, +RefreshManagerAllBank::RefreshManagerAllBank(const Configuration& config, + ControllerVector& bankMachinesOnRank, PowerDownManagerIF& powerDownManager, Rank rank) : bankMachinesOnRank(bankMachinesOnRank), powerDownManager(powerDownManager), memSpec(*config.memSpec), maxPostponed(static_cast(config.refreshMaxPostponed)), diff --git a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerAllBank.h b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerAllBank.h index abd9a8be..521e9abe 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerAllBank.h +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerAllBank.h @@ -53,7 +53,7 @@ class PowerDownManagerIF; class RefreshManagerAllBank final : public RefreshManagerIF { public: - RefreshManagerAllBank(const Configuration& config, std::vector& bankMachinesOnRank, + RefreshManagerAllBank(const Configuration& config, ControllerVector& bankMachinesOnRank, PowerDownManagerIF& powerDownManager, Rank rank); CommandTuple::Type getNextCommand() override; @@ -64,7 +64,7 @@ public: private: enum class State {Regular, Pulledin} state = State::Regular; const MemSpec& memSpec; - std::vector& bankMachinesOnRank; + ControllerVector& bankMachinesOnRank; PowerDownManagerIF& powerDownManager; tlm::tlm_generic_payload refreshPayload; sc_core::sc_time timeForNextTrigger = sc_core::sc_max_time(); diff --git a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPer2Bank.cpp b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPer2Bank.cpp index a544c1f6..b84c096e 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPer2Bank.cpp +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPer2Bank.cpp @@ -44,7 +44,7 @@ namespace DRAMSys { RefreshManagerPer2Bank::RefreshManagerPer2Bank(const Configuration& config, - std::vector& bankMachinesOnRank, + ControllerVector& bankMachinesOnRank, PowerDownManagerIF& powerDownManager, Rank rank) : powerDownManager(powerDownManager), memSpec(*config.memSpec), maxPostponed(static_cast(config.refreshMaxPostponed * memSpec.banksPerRank / 2)), @@ -58,12 +58,13 @@ RefreshManagerPer2Bank::RefreshManagerPer2Bank(const Configuration& config, { for (unsigned bankID = outerID; bankID < (outerID + memSpec.getPer2BankOffset()); bankID++) { - unsigned bankID2 = bankID + memSpec.getPer2BankOffset(); - setUpDummy(refreshPayloads[bankMachinesOnRank[bankID]], 0, rank, - bankMachinesOnRank[bankID]->getBankGroup(), bankMachinesOnRank[bankID]->getBank()); - setUpDummy(refreshPayloads[bankMachinesOnRank[bankID2]], 0, rank, - bankMachinesOnRank[bankID2]->getBankGroup(), bankMachinesOnRank[bankID2]->getBank()); - allBankMachines.push_back({bankMachinesOnRank[bankID], bankMachinesOnRank[bankID2]}); + Bank firstBank(bankID); + Bank secondBank(bankID + memSpec.getPer2BankOffset()); + setUpDummy(refreshPayloads[bankMachinesOnRank[firstBank]], 0, rank, + bankMachinesOnRank[firstBank]->getBankGroup(), bankMachinesOnRank[firstBank]->getBank()); + setUpDummy(refreshPayloads[bankMachinesOnRank[secondBank]], 0, rank, + bankMachinesOnRank[secondBank]->getBankGroup(), bankMachinesOnRank[secondBank]->getBank()); + allBankMachines.push_back({bankMachinesOnRank[firstBank], bankMachinesOnRank[secondBank]}); } } diff --git a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPer2Bank.h b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPer2Bank.h index 37f505ba..26287ae5 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPer2Bank.h +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPer2Bank.h @@ -55,7 +55,7 @@ class PowerDownManagerIF; class RefreshManagerPer2Bank final : public RefreshManagerIF { public: - RefreshManagerPer2Bank(const Configuration& config, std::vector& bankMachinesOnRank, + RefreshManagerPer2Bank(const Configuration& config, ControllerVector& bankMachinesOnRank, PowerDownManagerIF& powerDownManager, Rank rank); CommandTuple::Type getNextCommand() override; diff --git a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPerBank.cpp b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPerBank.cpp index 5fb5bac9..089b5b8e 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPerBank.cpp +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPerBank.cpp @@ -43,7 +43,8 @@ using namespace tlm; namespace DRAMSys { -RefreshManagerPerBank::RefreshManagerPerBank(const Configuration& config, std::vector& bankMachinesOnRank, +RefreshManagerPerBank::RefreshManagerPerBank(const Configuration& config, + ControllerVector& bankMachinesOnRank, PowerDownManagerIF& powerDownManager, Rank rank) : powerDownManager(powerDownManager), memSpec(*config.memSpec), maxPostponed(static_cast(config.refreshMaxPostponed * memSpec.banksPerRank)), diff --git a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPerBank.h b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPerBank.h index e1ba8f42..4fde59f2 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPerBank.h +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPerBank.h @@ -55,7 +55,7 @@ class PowerDownManagerIF; class RefreshManagerPerBank final : public RefreshManagerIF { public: - RefreshManagerPerBank(const Configuration& config, std::vector& bankMachinesOnRank, + RefreshManagerPerBank(const Configuration& config, ControllerVector& bankMachinesOnRank, PowerDownManagerIF& powerDownManager, Rank rank); CommandTuple::Type getNextCommand() override; diff --git a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerSameBank.cpp b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerSameBank.cpp index 08078262..97e99a10 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerSameBank.cpp +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerSameBank.cpp @@ -44,7 +44,7 @@ namespace DRAMSys { RefreshManagerSameBank::RefreshManagerSameBank(const Configuration& config, - std::vector& bankMachinesOnRank, + ControllerVector& bankMachinesOnRank, PowerDownManagerIF& powerDownManager, Rank rank) : powerDownManager(powerDownManager), memSpec(*config.memSpec), maxPostponed(static_cast(config.refreshMaxPostponed * memSpec.banksPerGroup)), @@ -59,8 +59,8 @@ RefreshManagerSameBank::RefreshManagerSameBank(const Configuration& config, for (unsigned bankID = 0; bankID < memSpec.banksPerGroup; bankID++) { // rank 0: bank group 0, bank 0 - 3; rank 1: bank group 8, bank 32 - 35 - setUpDummy(refreshPayloads[bankID], 0, rank, bankMachinesOnRank[bankID]->getBankGroup(), - bankMachinesOnRank[bankID]->getBank()); + setUpDummy(refreshPayloads[bankID], 0, rank, bankMachinesOnRank[Bank(bankID)]->getBankGroup(), + bankMachinesOnRank[Bank(bankID)]->getBank()); allBankMachines.emplace_back(std::vector(memSpec.groupsPerRank)); } @@ -69,7 +69,7 @@ RefreshManagerSameBank::RefreshManagerSameBank(const Configuration& config, for (unsigned bankID = 0; bankID < memSpec.banksPerGroup; bankID++) { for (unsigned groupID = 0; groupID < memSpec.groupsPerRank; groupID++) - (*it)[groupID] = bankMachinesOnRank[groupID * memSpec.banksPerGroup + bankID]; + (*it)[groupID] = bankMachinesOnRank[Bank(groupID * memSpec.banksPerGroup + bankID)]; it++; } diff --git a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerSameBank.h b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerSameBank.h index 632572b1..8a5f9c41 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerSameBank.h +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerSameBank.h @@ -54,7 +54,7 @@ class PowerDownManagerIF; class RefreshManagerSameBank final : public RefreshManagerIF { public: - RefreshManagerSameBank(const Configuration& config, std::vector& bankMachinesOnRank, + RefreshManagerSameBank(const Configuration& config, ControllerVector& bankMachinesOnRank, PowerDownManagerIF& powerDownManager, Rank rank); CommandTuple::Type getNextCommand() override;