From bddec3022afd6e0b3108534c8f4254c708a7d1bb Mon Sep 17 00:00:00 2001 From: "Lukas Steiner (2)" Date: Mon, 18 Nov 2019 19:16:42 +0100 Subject: [PATCH] Some preparations for power down. --- .../library/src/controller/BankMachine.cpp | 3 +- DRAMSys/library/src/controller/Command.cpp | 17 +++++++++ DRAMSys/library/src/controller/Command.h | 7 ++++ DRAMSys/library/src/controller/Controller.cpp | 35 +++++-------------- DRAMSys/library/src/controller/Controller.h | 3 +- .../src/controller/refresh/RefreshManager.cpp | 5 +++ .../src/controller/refresh/RefreshManager.h | 3 ++ .../refresh/RefreshManagerBankwise.cpp | 7 +++- .../refresh/RefreshManagerBankwise.h | 3 ++ .../controller/refresh/RefreshManagerDummy.h | 1 + .../src/controller/refresh/RefreshManagerIF.h | 1 + 11 files changed, 56 insertions(+), 29 deletions(-) diff --git a/DRAMSys/library/src/controller/BankMachine.cpp b/DRAMSys/library/src/controller/BankMachine.cpp index cf3238b8..7240f0f5 100644 --- a/DRAMSys/library/src/controller/BankMachine.cpp +++ b/DRAMSys/library/src/controller/BankMachine.cpp @@ -66,7 +66,8 @@ void BankMachine::updateState(Command command) currentState = BmState::Precharged; currentPayload = nullptr; } - else if (command == Command::REFA || command == Command::REFB) + else if (command == Command::REFA || command == Command::REFB + || command == Command::PDXA || command == Command::PDXP) blocked = false; else SC_REPORT_FATAL("BankMachine", "Unknown phase"); diff --git a/DRAMSys/library/src/controller/Command.cpp b/DRAMSys/library/src/controller/Command.cpp index 2890bc36..c9f98bf4 100644 --- a/DRAMSys/library/src/controller/Command.cpp +++ b/DRAMSys/library/src/controller/Command.cpp @@ -135,3 +135,20 @@ bool commandIsIn(Command command, std::vector commands) } return false; } + +std::array phaseOfCommand = {UNINITIALIZED_PHASE, + BEGIN_PRE, + BEGIN_PREA, + BEGIN_ACT, + BEGIN_RD, + BEGIN_WR, + BEGIN_RDA, + BEGIN_WRA, + BEGIN_REFA, + BEGIN_REFB, + BEGIN_PDNA, + END_PDNA, + BEGIN_PDNP, + END_PDNP, + BEGIN_SREF, + END_SREF}; diff --git a/DRAMSys/library/src/controller/Command.h b/DRAMSys/library/src/controller/Command.h index 4bb09641..176233fc 100644 --- a/DRAMSys/library/src/controller/Command.h +++ b/DRAMSys/library/src/controller/Command.h @@ -38,6 +38,11 @@ #include #include +#include +#include +#include "../common/protocol.h" + +using namespace tlm; enum Command { @@ -64,4 +69,6 @@ const std::vector &getAllCommands(); unsigned numberOfCommands(); bool commandIsIn(Command command, std::vector commands); +extern std::array phaseOfCommand; + #endif // COMMAND_H diff --git a/DRAMSys/library/src/controller/Controller.cpp b/DRAMSys/library/src/controller/Controller.cpp index 11209180..08ed05c5 100644 --- a/DRAMSys/library/src/controller/Controller.cpp +++ b/DRAMSys/library/src/controller/Controller.cpp @@ -64,6 +64,7 @@ Controller::Controller(sc_module_name name) : Configuration &config = Configuration::getInstance(); MemSpec *memSpec = config.memSpec; maxNumberOfPayloads = config.MaxNrOfTransactions; + ranksNumberOfPayloads = std::vector(memSpec->NumberOfRanks, 0); if (memSpec->MemoryType == "DDR3") checker = new CheckerDDR3(); @@ -195,7 +196,7 @@ void Controller::controllerMethod() // (3) Accept new request from arbiter and start appropriate BM if necessary if (sc_time_stamp() >= timeToAcquire && payloadToAcquire != nullptr) { - if (numberOfPayloads < Configuration::getInstance().MaxNrOfTransactions) + if (totalNumberOfPayloads < Configuration::getInstance().MaxNrOfTransactions) { Bank bank = DramExtension::getBank(payloadToAcquire); acquirePayload(); @@ -316,13 +317,14 @@ void Controller::releasePayload() uint64_t id __attribute__((unused)) = DramExtension::getPayloadID(payloadToRelease); PRINTDEBUGMESSAGE(name(), "Payload " + std::to_string(id) + " left system."); + totalNumberOfPayloads--; + ranksNumberOfPayloads[DramExtension::getRank(payloadToRelease).ID()]--; payloadToRelease->release(); - numberOfPayloads--; payloadToRelease = nullptr; timeToRelease = sc_max_time(); numberOfTransactionsServed++; - if (numberOfPayloads == 0) + if (totalNumberOfPayloads == 0) startBandwidthIdleCollector(); } @@ -331,12 +333,13 @@ void Controller::acquirePayload() uint64_t id __attribute__((unused)) = DramExtension::getPayloadID(payloadToAcquire); PRINTDEBUGMESSAGE(name(), "Payload " + std::to_string(id) + " entered system."); - if (numberOfPayloads == 0) + if (totalNumberOfPayloads == 0) endBandwithIdleCollector(); scheduler->storeRequest(payloadToAcquire); payloadToAcquire->acquire(); - numberOfPayloads++; + totalNumberOfPayloads++; + ranksNumberOfPayloads[DramExtension::getRank(payloadToAcquire).ID()]++; payloadToAcquire->set_response_status(TLM_OK_RESPONSE); sendToFrontend(payloadToAcquire, END_REQ); payloadToAcquire = nullptr; @@ -355,27 +358,7 @@ void Controller::sendToDram(Command command, tlm_generic_payload *payload) checker->insert(command, extension.getRank(), extension.getBankGroup(), extension.getBank()); sc_time delay = SC_ZERO_TIME; - tlm_phase phase; - if (command == Command::ACT) - phase = BEGIN_ACT; - else if (command == Command::PRE) - phase = BEGIN_PRE; - else if (command == Command::RD) - phase = BEGIN_RD; - else if (command == Command::RDA) - phase = BEGIN_RDA; - else if (command == Command::WR) - phase = BEGIN_WR; - else if (command == Command::WRA) - phase = BEGIN_WRA; - else if (command == Command::PREA) - phase = BEGIN_PREA; - else if (command == Command::REFA) - phase = BEGIN_REFA; - else if (command == Command::REFB) - phase = BEGIN_REFB; - else - SC_REPORT_FATAL("Controller", "Unknown phase"); + tlm_phase phase = phaseOfCommand[command]; iSocket->nb_transport_fw(*payload, phase, delay); } diff --git a/DRAMSys/library/src/controller/Controller.h b/DRAMSys/library/src/controller/Controller.h index 11e7e831..14758071 100644 --- a/DRAMSys/library/src/controller/Controller.h +++ b/DRAMSys/library/src/controller/Controller.h @@ -72,7 +72,8 @@ protected: virtual void sendToDram(Command, tlm_generic_payload *); private: - unsigned numberOfPayloads = 0; + unsigned totalNumberOfPayloads = 0; + std::vector ranksNumberOfPayloads; unsigned maxNumberOfPayloads; tlm_generic_payload *payloadToAcquire = nullptr; sc_time timeToAcquire = sc_max_time(); diff --git a/DRAMSys/library/src/controller/refresh/RefreshManager.cpp b/DRAMSys/library/src/controller/refresh/RefreshManager.cpp index 1abdf2ca..906db024 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManager.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManager.cpp @@ -59,6 +59,11 @@ std::pair RefreshManager::getNextCommand() return std::pair(Command::NOP, nullptr); } +void RefreshManager::block() +{ + blocked = true; +} + sc_time RefreshManager::start() { timeToSchedule = sc_max_time(); diff --git a/DRAMSys/library/src/controller/refresh/RefreshManager.h b/DRAMSys/library/src/controller/refresh/RefreshManager.h index 542108a8..a16981d4 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManager.h +++ b/DRAMSys/library/src/controller/refresh/RefreshManager.h @@ -50,6 +50,7 @@ public: std::pair getNextCommand(); sc_time start(); void updateState(Command, tlm_generic_payload *); + void block(); private: enum class RmState {Regular, Precharged, Pulledin} state = RmState::Regular; @@ -65,6 +66,8 @@ private: int flexibilityCounter = 0; int maxPostponed = 0; int maxPulledin = 0; + + bool blocked = false; }; #endif // REFRESHMANAGER_H diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp index e412d594..7cdc42b7 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp @@ -59,13 +59,18 @@ RefreshManagerBankwise::RefreshManagerBankwise(std::vector &bankM std::pair RefreshManagerBankwise::getNextCommand() { - if (sc_time_stamp() == timeToSchedule) + if (sc_time_stamp() == timeToSchedule && !blocked) return std::pair (nextCommand, &refreshPayloads[currentBankMachine->getBank().ID() % memSpec->BanksPerRank]); else return std::pair(Command::NOP, nullptr); } +void RefreshManagerBankwise::block() +{ + blocked = true; +} + sc_time RefreshManagerBankwise::start() { timeToSchedule = sc_max_time(); diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.h b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.h index 5f7b6948..d986ac74 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.h +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.h @@ -52,6 +52,7 @@ public: std::pair getNextCommand(); sc_time start(); void updateState(Command, tlm_generic_payload *); + void block(); private: enum class RmState {Regular, Precharged, Pulledin} state = RmState::Regular; @@ -71,6 +72,8 @@ private: int flexibilityCounter = 0; int maxPostponed = 0; int maxPulledin = 0; + + bool blocked = false; }; #endif // REFRESHMANAGERBANKWISE_H diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerDummy.h b/DRAMSys/library/src/controller/refresh/RefreshManagerDummy.h index 2d895cf3..301d724e 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerDummy.h +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerDummy.h @@ -49,6 +49,7 @@ public: std::pair getNextCommand(); sc_time start(); void updateState(Command, tlm_generic_payload *) {} + void block() {} }; #endif // REFRESHMANAGERDUMMY_H diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerIF.h b/DRAMSys/library/src/controller/refresh/RefreshManagerIF.h index d1e589ca..d2b78266 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerIF.h +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerIF.h @@ -50,6 +50,7 @@ public: virtual std::pair getNextCommand() = 0; virtual sc_time start() = 0; virtual void updateState(Command, tlm_generic_payload *) = 0; + virtual void block() = 0; }; #endif // REFRESHMANAGERIF_H