From b22cfa4a94ab6d5d4719caee68b916e43f805c9e Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Thu, 3 Oct 2019 19:04:34 +0200 Subject: [PATCH] Improved controller method, some code and output formatting. --- .../library/src/common/XmlAddressDecoder.cpp | 14 +++--- .../src/configuration/Configuration.cpp | 25 +++++----- .../library/src/controller/BankMachine.cpp | 13 ++++-- DRAMSys/library/src/controller/BankMachine.h | 11 +++-- DRAMSys/library/src/controller/Controller.cpp | 46 ++++++++++--------- .../src/controller/refresh/RefreshManager.cpp | 2 +- .../src/controller/refresh/RefreshManager.h | 2 +- .../refresh/RefreshManagerBankwise.cpp | 2 +- .../refresh/RefreshManagerBankwise.h | 2 +- .../refresh/RefreshManagerDummy.cpp | 2 +- .../controller/refresh/RefreshManagerDummy.h | 2 +- .../src/controller/refresh/RefreshManagerIF.h | 2 +- DRAMSys/library/src/simulation/DRAMSys.cpp | 2 +- 13 files changed, 68 insertions(+), 57 deletions(-) diff --git a/DRAMSys/library/src/common/XmlAddressDecoder.cpp b/DRAMSys/library/src/common/XmlAddressDecoder.cpp index 39d38d04..06e0c715 100644 --- a/DRAMSys/library/src/common/XmlAddressDecoder.cpp +++ b/DRAMSys/library/src/common/XmlAddressDecoder.cpp @@ -172,12 +172,12 @@ void XmlAddressDecoder::print() { std::cout << headline << std::endl; std::cout << "Address Mapping:" << std::endl << std::endl; - std::cout << std::setw(11) << "channel: " << std::bitset<64>(masks.channel) << std::endl; - std::cout << std::setw(11) << "rank: " << std::bitset<64>(masks.rank) << std::endl; - std::cout << std::setw(11) << "bankgroup: " << std::bitset<64>(masks.bankgroup) << std::endl; - std::cout << std::setw(11) << "bank: " << std::bitset<64>(masks.bank) << std::endl; - std::cout << std::setw(11) << "row: " << std::bitset<64>(masks.row) << std::endl; - std::cout << std::setw(11) << "column: " << std::bitset<64>(masks.column) << std::endl; - std::cout << std::setw(11) << "bytes: " << std::bitset<64>(masks.bytes) << std::endl; + std::cout << " channel: " << std::bitset<64>(masks.channel) << std::endl; + std::cout << " rank: " << std::bitset<64>(masks.rank) << std::endl; + std::cout << " bankgroup: " << std::bitset<64>(masks.bankgroup) << std::endl; + std::cout << " bank: " << std::bitset<64>(masks.bank) << std::endl; + std::cout << " row: " << std::bitset<64>(masks.row) << std::endl; + std::cout << " column: " << std::bitset<64>(masks.column) << std::endl; + std::cout << " bytes: " << std::bitset<64>(masks.bytes) << std::endl; std::cout << std::endl; } diff --git a/DRAMSys/library/src/configuration/Configuration.cpp b/DRAMSys/library/src/configuration/Configuration.cpp index 5026d578..826343d6 100644 --- a/DRAMSys/library/src/configuration/Configuration.cpp +++ b/DRAMSys/library/src/configuration/Configuration.cpp @@ -337,6 +337,7 @@ void Configuration::setParameters(std::map std::uint64_t Configuration::getSimMemSizeInBytes() { // 1. Get number of banks, rows, columns and data width in bits for one die (or chip) + std::string type = memSpec->MemoryType; std::uint64_t ranks = memSpec->NumberOfRanks; std::uint64_t bankgroups = memSpec->NumberOfBankGroups; std::uint64_t banks = memSpec->NumberOfBanks; @@ -350,17 +351,19 @@ std::uint64_t Configuration::getSimMemSizeInBytes() // 4. Total memory size in Bytes of one DIMM (with only support of 1 rank on a DIMM) std::uint64_t memorySize = chipSize * NumberOfDevicesOnDIMM; - std::cout << headline << std::endl << std::endl; - std::cout << std::setw(24) << "Memory size in bytes : " << memorySize << std::endl; - std::cout << std::setw(24) << "Number of ranks : " << ranks << std::endl; - std::cout << std::setw(24) << "Number of bankgroups : " << bankgroups << std::endl; - std::cout << std::setw(24) << "Number of banks : " << banks << std::endl; - std::cout << std::setw(24) << "Number of rows : " << rows << std::endl; - std::cout << std::setw(24) << "Number of columns : " << columns << std::endl; - std::cout << std::setw(24) << "Chip data bus width : " << bitWidth << std::endl; - std::cout << std::setw(24) << "Chip size in bits : " << chipBitSize << std::endl; - std::cout << std::setw(24) << "Chip Size in bytes : " << chipSize << std::endl; - std::cout << std::setw(24) << "Devices/Chips on DIMM: " << NumberOfDevicesOnDIMM << std::endl; + std::cout << headline << std::endl; + std::cout << "Per Channel Configuration:" << std::endl << std::endl; + std::cout << " Memory type: " << type << std::endl; + std::cout << " Memory size in bytes: " << memorySize << std::endl; + std::cout << " Number of ranks: " << ranks << std::endl; + std::cout << " Number of bankgroups: " << bankgroups << std::endl; + std::cout << " Number of banks: " << banks << std::endl; + std::cout << " Number of rows: " << rows << std::endl; + std::cout << " Number of columns: " << columns << std::endl; + std::cout << " Chip data bus width: " << bitWidth << std::endl; + std::cout << " Chip size in bits: " << chipBitSize << std::endl; + std::cout << " Chip Size in bytes: " << chipSize << std::endl; + std::cout << " Devices/Chips on DIMM: " << NumberOfDevicesOnDIMM << std::endl; std::cout << std::endl; assert(memorySize > 0); diff --git a/DRAMSys/library/src/controller/BankMachine.cpp b/DRAMSys/library/src/controller/BankMachine.cpp index 1953dd30..c3e2688e 100644 --- a/DRAMSys/library/src/controller/BankMachine.cpp +++ b/DRAMSys/library/src/controller/BankMachine.cpp @@ -97,10 +97,15 @@ BmState BankMachine::getState() return currentState; } +bool BankMachine::isIdle() +{ + return (currentPayload == nullptr); +} + BankMachineOpen::BankMachineOpen(SchedulerIF *scheduler, CheckerIF *checker, Bank bank) : BankMachine(scheduler, checker, bank) {} -sc_time BankMachineOpen::startBankMachine() +sc_time BankMachineOpen::start() { if (currentPayload == nullptr) { @@ -147,7 +152,7 @@ sc_time BankMachineOpen::startBankMachine() BankMachineClosed::BankMachineClosed(SchedulerIF *scheduler, CheckerIF *checker, Bank bank) : BankMachine(scheduler, checker, bank) {} -sc_time BankMachineClosed::startBankMachine() +sc_time BankMachineClosed::start() { if (currentPayload == nullptr) { @@ -194,7 +199,7 @@ sc_time BankMachineClosed::startBankMachine() BankMachineOpenAdaptive::BankMachineOpenAdaptive(SchedulerIF *scheduler, CheckerIF *checker, Bank bank) : BankMachine(scheduler, checker, bank) {} -sc_time BankMachineOpenAdaptive::startBankMachine() +sc_time BankMachineOpenAdaptive::start() { if (currentPayload == nullptr) { @@ -259,7 +264,7 @@ sc_time BankMachineOpenAdaptive::startBankMachine() BankMachineClosedAdaptive::BankMachineClosedAdaptive(SchedulerIF *scheduler, CheckerIF *checker, Bank bank) : BankMachine(scheduler, checker, bank) {} -sc_time BankMachineClosedAdaptive::startBankMachine() +sc_time BankMachineClosedAdaptive::start() { if (currentPayload == nullptr) { diff --git a/DRAMSys/library/src/controller/BankMachine.h b/DRAMSys/library/src/controller/BankMachine.h index eed17816..bf36ef47 100644 --- a/DRAMSys/library/src/controller/BankMachine.h +++ b/DRAMSys/library/src/controller/BankMachine.h @@ -59,7 +59,7 @@ class BankMachine { public: virtual ~BankMachine() {} - virtual sc_time startBankMachine() = 0; + virtual sc_time start() = 0; std::pair getNextCommand(); void updateState(Command); void block(); @@ -68,6 +68,7 @@ public: Bank getBank(); Row getOpenRow(); BmState getState(); + bool isIdle(); protected: BankMachine(SchedulerIF *, CheckerIF *, Bank); @@ -89,28 +90,28 @@ class BankMachineOpen final : public BankMachine { public: BankMachineOpen(SchedulerIF *, CheckerIF *, Bank); - sc_time startBankMachine(); + sc_time start(); }; class BankMachineClosed final : public BankMachine { public: BankMachineClosed(SchedulerIF *, CheckerIF *, Bank); - sc_time startBankMachine(); + sc_time start(); }; class BankMachineOpenAdaptive final : public BankMachine { public: BankMachineOpenAdaptive(SchedulerIF *, CheckerIF *, Bank); - sc_time startBankMachine(); + sc_time start(); }; class BankMachineClosedAdaptive final : public BankMachine { public: BankMachineClosedAdaptive(SchedulerIF *, CheckerIF *, Bank); - sc_time startBankMachine(); + sc_time start(); }; #endif // BANKMACHINE_H diff --git a/DRAMSys/library/src/controller/Controller.cpp b/DRAMSys/library/src/controller/Controller.cpp index ead8b620..35922e48 100644 --- a/DRAMSys/library/src/controller/Controller.cpp +++ b/DRAMSys/library/src/controller/Controller.cpp @@ -127,7 +127,7 @@ Controller::Controller(sc_module_name name) : RefreshManagerIF *manager = new RefreshManagerBankwise (bankMachinesOnRank[rankID], Rank(rankID), checker); refreshManagers.push_back(manager); - refreshEvent.notify(manager->startRefreshManager()); + refreshEvent.notify(manager->start()); } } else @@ -137,7 +137,7 @@ Controller::Controller(sc_module_name name) : RefreshManagerIF *manager = new RefreshManager (bankMachinesOnRank[rankID], Rank(rankID), checker); refreshManagers.push_back(manager); - refreshEvent.notify(manager->startRefreshManager()); + refreshEvent.notify(manager->start()); } } @@ -163,16 +163,7 @@ void Controller::controllerMethod() if (sc_time_stamp() == timeToRelease && payloadToRelease != nullptr) releasePayload(); - // (2) Accept new request from arbiter - if (sc_time_stamp() >= timeToAcquire && payloadToAcquire != nullptr) - { - if (numberOfPayloads < Configuration::getInstance().MaxNrOfTransactions) - acquirePayload(); - else - PRINTDEBUGMESSAGE(name(), "Total number of payloads exceeded, backpressure!"); - } - - // (3) Send result to arbiter + // (2) Send next result to arbiter if (payloadToRelease == nullptr && !responseQueue.empty()) { std::pair element = responseQueue.front(); @@ -184,21 +175,32 @@ void Controller::controllerMethod() } } - // (4) Start bank machines to issue new requests for current time - for (auto it : bankMachines) - it->startBankMachine(); + // (3) Accept new request from arbiter and start appropriate BM if necessary + if (sc_time_stamp() >= timeToAcquire && payloadToAcquire != nullptr) + { + if (numberOfPayloads < Configuration::getInstance().MaxNrOfTransactions) + { + Bank bank = DramExtension::getBank(payloadToAcquire); + acquirePayload(); - // (5) Choose one request and send it to DRAM + if (bankMachines[bank.ID()]->isIdle()) + bankMachines[bank.ID()]->start(); + } + else + PRINTDEBUGMESSAGE(name(), "Total number of payloads exceeded, backpressure!"); + } + + // (4) Choose one request and send it to DRAM std::pair commandPair; std::vector> readyCommands; - // (5.1) Check for refresh command (PREA/PRE or REFA/REFB) + // (4.1) Check for refresh command (PREA/PRE or REFA/REFB) for (auto it : refreshManagers) { commandPair = it->getNextCommand(); if (commandPair.second != nullptr) readyCommands.push_back(commandPair); } - // (5.2) Check for other commands (PRE, ACT, RD or WR) + // (4.2) Check for other commands (PRE, ACT, RD or WR) for (auto it : bankMachines) { commandPair = it->getNextCommand(); @@ -226,13 +228,13 @@ void Controller::controllerMethod() } } - // (6) Restart bank machines and refresh managers to issue new requests for the future + // (5) Restart bank machines and refresh managers to issue new requests for the future for (auto it : refreshManagers) - bankMachineEvent.notify(it->startRefreshManager()); - + bankMachineEvent.notify(it->start()); + // TODO: order, first BM then RM? for (auto it : bankMachines) { - sc_time delay = it->startBankMachine(); + sc_time delay = it->start(); if (delay != SC_ZERO_TIME) // TODO: must be checked to avoid livelock bankMachineEvent.notify(delay); } diff --git a/DRAMSys/library/src/controller/refresh/RefreshManager.cpp b/DRAMSys/library/src/controller/refresh/RefreshManager.cpp index 5c17059f..3935c7d2 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManager.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManager.cpp @@ -53,7 +53,7 @@ std::pair RefreshManager::getNextCommand() return std::pair(Command::NOP, nullptr); } -sc_time RefreshManager::startRefreshManager() +sc_time RefreshManager::start() { if (sc_time_stamp() >= timeForNextTrigger) { diff --git a/DRAMSys/library/src/controller/refresh/RefreshManager.h b/DRAMSys/library/src/controller/refresh/RefreshManager.h index 50748fa9..9f730d8e 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManager.h +++ b/DRAMSys/library/src/controller/refresh/RefreshManager.h @@ -48,7 +48,7 @@ public: RefreshManager(std::vector &, Rank, CheckerIF *); std::pair getNextCommand(); - sc_time startRefreshManager(); + sc_time start(); void updateState(Command, tlm_generic_payload *); private: diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp index 2e4509fd..ac6b4158 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp @@ -57,7 +57,7 @@ std::pair RefreshManagerBankwise::getNextCommand return std::pair(Command::NOP, nullptr); } -sc_time RefreshManagerBankwise::startRefreshManager() +sc_time RefreshManagerBankwise::start() { if (sc_time_stamp() >= timeForNextTrigger) { diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.h b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.h index 158246cc..d3ff44e7 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.h +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.h @@ -48,7 +48,7 @@ public: RefreshManagerBankwise(std::vector &, Rank, CheckerIF *); std::pair getNextCommand(); - sc_time startRefreshManager(); + sc_time start(); void updateState(Command, tlm_generic_payload *); private: diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerDummy.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerDummy.cpp index c35e77af..c6c1428c 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerDummy.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerDummy.cpp @@ -39,7 +39,7 @@ std::pair RefreshManagerDummy::getNextCommand() return std::pair(Command::NOP, nullptr); } -sc_time RefreshManagerDummy::startRefreshManager() +sc_time RefreshManagerDummy::start() { return sc_max_time() - sc_time_stamp(); } diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerDummy.h b/DRAMSys/library/src/controller/refresh/RefreshManagerDummy.h index 7dac7a23..2d895cf3 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerDummy.h +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerDummy.h @@ -47,7 +47,7 @@ class RefreshManagerDummy final : public RefreshManagerIF { public: std::pair getNextCommand(); - sc_time startRefreshManager(); + sc_time start(); void updateState(Command, tlm_generic_payload *) {} }; diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerIF.h b/DRAMSys/library/src/controller/refresh/RefreshManagerIF.h index 0449e788..d1e589ca 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerIF.h +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerIF.h @@ -48,7 +48,7 @@ public: virtual ~RefreshManagerIF() {} virtual std::pair getNextCommand() = 0; - virtual sc_time startRefreshManager() = 0; + virtual sc_time start() = 0; virtual void updateState(Command, tlm_generic_payload *) = 0; }; diff --git a/DRAMSys/library/src/simulation/DRAMSys.cpp b/DRAMSys/library/src/simulation/DRAMSys.cpp index ecf8af92..e2d49595 100644 --- a/DRAMSys/library/src/simulation/DRAMSys.cpp +++ b/DRAMSys/library/src/simulation/DRAMSys.cpp @@ -169,7 +169,7 @@ void DRAMSys::logo() cout << REDTXT("=| |= ") << BOLDBLUETXT("University of Kaiserslautern") << endl; cout << REDTXT(" +---+ ") << endl; - cout << REDTXT(" ||| ") << "DRAMSys v3.0" << endl; + cout << REDTXT(" ||| ") << "DRAMSys v4.0" << endl; cout << endl; #undef REDTXT #undef BOLDBLUETXT