From 0c51a4e1f82d71851a6c2ddaf5b80c61538c2fd4 Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Wed, 24 Mar 2021 09:10:12 +0100 Subject: [PATCH 1/4] First version of RasCas command mux, not working. --- .../src/configuration/memspec/MemSpec.cpp | 5 + .../src/configuration/memspec/MemSpec.h | 2 + .../src/configuration/memspec/MemSpecHBM2.cpp | 5 + .../src/configuration/memspec/MemSpecHBM2.h | 2 + DRAMSys/library/src/controller/Controller.cpp | 14 ++- .../src/controller/cmdmux/CmdMuxOldest.cpp | 111 +++++++++++++++++ .../src/controller/cmdmux/CmdMuxOldest.h | 13 ++ .../src/controller/cmdmux/CmdMuxStrict.cpp | 114 ++++++++++++++++++ .../src/controller/cmdmux/CmdMuxStrict.h | 13 ++ 9 files changed, 277 insertions(+), 2 deletions(-) diff --git a/DRAMSys/library/src/configuration/memspec/MemSpec.cpp b/DRAMSys/library/src/configuration/memspec/MemSpec.cpp index c3a73127..0ab6486c 100644 --- a/DRAMSys/library/src/configuration/memspec/MemSpec.cpp +++ b/DRAMSys/library/src/configuration/memspec/MemSpec.cpp @@ -95,3 +95,8 @@ sc_time MemSpec::getRefreshIntervalSB() const SC_REPORT_FATAL("MemSpec", "Same bank refresh not supported"); return SC_ZERO_TIME; } + +bool MemSpec::hasRasAndCasBus() const +{ + return false; +} diff --git a/DRAMSys/library/src/configuration/memspec/MemSpec.h b/DRAMSys/library/src/configuration/memspec/MemSpec.h index 5aa935f9..4020a8ed 100644 --- a/DRAMSys/library/src/configuration/memspec/MemSpec.h +++ b/DRAMSys/library/src/configuration/memspec/MemSpec.h @@ -77,6 +77,8 @@ public: virtual sc_time getRefreshIntervalPB() const; virtual sc_time getRefreshIntervalSB() const; + virtual bool hasRasAndCasBus() const; + virtual sc_time getExecutionTime(Command, const tlm::tlm_generic_payload &) const = 0; virtual TimeInterval getIntervalOnDataStrobe(Command) const = 0; diff --git a/DRAMSys/library/src/configuration/memspec/MemSpecHBM2.cpp b/DRAMSys/library/src/configuration/memspec/MemSpecHBM2.cpp index ea91854b..c299f9d9 100644 --- a/DRAMSys/library/src/configuration/memspec/MemSpecHBM2.cpp +++ b/DRAMSys/library/src/configuration/memspec/MemSpecHBM2.cpp @@ -94,6 +94,11 @@ sc_time MemSpecHBM2::getRefreshIntervalPB() const return tREFISB; } +bool MemSpecHBM2::hasRasAndCasBus() const +{ + return true; +} + sc_time MemSpecHBM2::getExecutionTime(Command command, const tlm_generic_payload &payload) const { if (command == Command::PRE || command == Command::PREA) diff --git a/DRAMSys/library/src/configuration/memspec/MemSpecHBM2.h b/DRAMSys/library/src/configuration/memspec/MemSpecHBM2.h index 618f40db..a56f18fb 100644 --- a/DRAMSys/library/src/configuration/memspec/MemSpecHBM2.h +++ b/DRAMSys/library/src/configuration/memspec/MemSpecHBM2.h @@ -83,6 +83,8 @@ public: virtual sc_time getRefreshIntervalAB() const override; virtual sc_time getRefreshIntervalPB() const override; + virtual bool hasRasAndCasBus() const override; + virtual sc_time getExecutionTime(Command, const tlm::tlm_generic_payload &) const override; virtual TimeInterval getIntervalOnDataStrobe(Command) const override; diff --git a/DRAMSys/library/src/controller/Controller.cpp b/DRAMSys/library/src/controller/Controller.cpp index d74f2b71..21355bb1 100644 --- a/DRAMSys/library/src/controller/Controller.cpp +++ b/DRAMSys/library/src/controller/Controller.cpp @@ -112,9 +112,19 @@ Controller::Controller(sc_module_name name) : scheduler = new SchedulerFrFcfsGrp(); if (config.cmdMux == Configuration::CmdMux::Oldest) - cmdMux = new CmdMuxOldest(); + { + if (memSpec->hasRasAndCasBus()) + cmdMux = new CmdMuxOldestRasCas(); + else + cmdMux = new CmdMuxOldest(); + } else if (config.cmdMux == Configuration::CmdMux::Strict) - cmdMux = new CmdMuxStrict(); + { + if (memSpec->hasRasAndCasBus()) + cmdMux = new CmdMuxStrictRasCas(); + else + cmdMux = new CmdMuxStrict(); + } if (config.respQueue == Configuration::RespQueue::Fifo) respQueue = new RespQueueFifo(); diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.cpp b/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.cpp index f11f597e..9bbc825b 100644 --- a/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.cpp +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.cpp @@ -76,3 +76,114 @@ CommandTuple::Type CmdMuxOldest::selectCommand(ReadyCommands &readyCommands) else return CommandTuple::Type(Command::NOP, nullptr, sc_max_time()); } + + +CmdMuxOldestRasCas::CmdMuxOldestRasCas() : memSpec(Configuration::getInstance().memSpec) +{ + readyRasCommands.reserve(memSpec->numberOfBanks); + readyCasCommands.reserve(memSpec->numberOfBanks); +} + +CommandTuple::Type CmdMuxOldestRasCas::selectCommand(ReadyCommands &readyCommands) +{ + readyRasCommands.clear(); + readyCasCommands.clear(); + + for (auto it : readyCommands) + { + if (isRasCommand(std::get(it))) + readyRasCommands.emplace_back(it); + else + readyCasCommands.emplace_back(it); + } + + auto resultRas = readyRasCommands.cend(); + auto resultCas = readyCasCommands.cend(); + + uint64_t lastPayloadID = UINT64_MAX; + uint64_t newPayloadID; + sc_time lastTimestamp = sc_max_time(); + sc_time newTimestamp; + + for (auto it = readyRasCommands.cbegin(); it != readyRasCommands.cend(); it++) + { + newTimestamp = std::get(*it) + + memSpec->getCommandLength(std::get(*it)) - memSpec->tCK; + newPayloadID = DramExtension::getChannelPayloadID(std::get(*it)); + + if (newTimestamp < lastTimestamp) + { + lastTimestamp = newTimestamp; + lastPayloadID = newPayloadID; + resultRas = it; + } + else if (newTimestamp == lastTimestamp) + { + if (newPayloadID < lastPayloadID) + { + lastPayloadID = newPayloadID; + resultRas = it; + } + } + } + + lastPayloadID = UINT64_MAX; + lastTimestamp = sc_max_time(); + + for (auto it = readyCasCommands.cbegin(); it != readyCasCommands.cend(); it++) + { + newTimestamp = std::get(*it) + + memSpec->getCommandLength(std::get(*it)) - memSpec->tCK; + newPayloadID = DramExtension::getChannelPayloadID(std::get(*it)); + + if (newTimestamp < lastTimestamp) + { + lastTimestamp = newTimestamp; + lastPayloadID = newPayloadID; + resultCas = it; + } + else if (newTimestamp == lastTimestamp) + { + if (newPayloadID < lastPayloadID) + { + lastPayloadID = newPayloadID; + resultCas = it; + } + } + } + + if (resultRas != readyRasCommands.cend() && resultCas != readyCasCommands.cend()) + { + if (std::get(*resultRas) == sc_time_stamp() + && std::get(*resultCas) == sc_time_stamp()) + { + if (DramExtension::getChannelPayloadID(std::get(*resultRas)) + <= DramExtension::getChannelPayloadID(std::get(*resultCas))) + return *resultRas; + else + return *resultCas; + } + else if (std::get(*resultRas) == sc_time_stamp()) + return *resultRas; + else if (std::get(*resultCas) == sc_time_stamp()) + return *resultCas; + else + return CommandTuple::Type(Command::NOP, nullptr, sc_max_time()); + } + else if (resultRas != readyRasCommands.cend()) + { + if (std::get(*resultRas) == sc_time_stamp()) + return *resultRas; + else + return CommandTuple::Type(Command::NOP, nullptr, sc_max_time()); + } + else if (resultCas != readyCasCommands.cend()) + { + if (std::get(*resultCas) == sc_time_stamp()) + return *resultCas; + else + return CommandTuple::Type(Command::NOP, nullptr, sc_max_time()); + } + else + return CommandTuple::Type(Command::NOP, nullptr, sc_max_time()); +} diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.h b/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.h index ee2c794e..06e07c44 100644 --- a/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.h +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.h @@ -48,4 +48,17 @@ private: const MemSpec *memSpec; }; + +class CmdMuxOldestRasCas : public CmdMuxIF +{ +public: + CmdMuxOldestRasCas(); + CommandTuple::Type selectCommand(ReadyCommands &); + +private: + const MemSpec *memSpec; + ReadyCommands readyRasCommands; + ReadyCommands readyCasCommands; +}; + #endif // CMDMUXOLDEST_H diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp index d10f36fa..f895f635 100644 --- a/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp @@ -103,3 +103,117 @@ CommandTuple::Type CmdMuxStrict::selectCommand(ReadyCommands &readyCommands) else return CommandTuple::Type(Command::NOP, nullptr, sc_max_time()); } + + +CmdMuxStrictRasCas::CmdMuxStrictRasCas() : memSpec(Configuration::getInstance().memSpec) +{ + readyRasCommands.reserve(memSpec->numberOfBanks); + readyCasCommands.reserve(memSpec->numberOfBanks); +} + +CommandTuple::Type CmdMuxStrictRasCas::selectCommand(ReadyCommands &readyCommands) +{ + readyRasCommands.clear(); + readyCasCommands.clear(); + + for (auto it : readyCommands) + { + if (isRasCommand(std::get(it))) + readyRasCommands.emplace_back(it); + else + readyCasCommands.emplace_back(it); + } + + auto resultRas = readyRasCommands.cend(); + auto resultCas = readyCasCommands.cend(); + + uint64_t lastPayloadID = UINT64_MAX; + uint64_t newPayloadID; + sc_time lastTimestamp = sc_max_time(); + sc_time newTimestamp; + + for (auto it = readyRasCommands.cbegin(); it != readyRasCommands.cend(); it++) + { + newTimestamp = std::get(*it) + + memSpec->getCommandLength(std::get(*it)) - memSpec->tCK; + newPayloadID = DramExtension::getChannelPayloadID(std::get(*it)); + + if (newTimestamp < lastTimestamp) + { + lastTimestamp = newTimestamp; + lastPayloadID = newPayloadID; + resultRas = it; + } + else if (newTimestamp == lastTimestamp) + { + if (newPayloadID < lastPayloadID) + { + lastPayloadID = newPayloadID; + resultRas = it; + } + } + } + + lastPayloadID = UINT64_MAX; + lastTimestamp = sc_max_time(); + + for (auto it = readyCasCommands.cbegin(); it != readyCasCommands.cend(); it++) + { + newTimestamp = std::get(*it) + + memSpec->getCommandLength(std::get(*it)) - memSpec->tCK; + newPayloadID = DramExtension::getChannelPayloadID(std::get(*it)); + + if (newPayloadID == nextPayloadID) + { + if (newTimestamp < lastTimestamp) + { + lastTimestamp = newTimestamp; + lastPayloadID = newPayloadID; + resultCas = it; + } + else if (newTimestamp == lastTimestamp) + { + if (newPayloadID < lastPayloadID) + { + lastPayloadID = newPayloadID; + resultCas = it; + } + } + } + } + + if (resultRas != readyRasCommands.cend() && resultCas != readyCasCommands.cend()) + { + if (std::get(*resultRas) == sc_time_stamp() + && std::get(*resultCas) == sc_time_stamp()) + { + if (DramExtension::getChannelPayloadID(std::get(*resultRas)) + <= DramExtension::getChannelPayloadID(std::get(*resultCas))) + return *resultRas; + else + return *resultCas; + } + else if (std::get(*resultRas) == sc_time_stamp()) + return *resultRas; + else if (std::get(*resultCas) == sc_time_stamp()) + return *resultCas; + else + return CommandTuple::Type(Command::NOP, nullptr, sc_max_time()); + } + else if (resultRas != readyRasCommands.cend()) + { + if (std::get(*resultRas) == sc_time_stamp()) + return *resultRas; + else + return CommandTuple::Type(Command::NOP, nullptr, sc_max_time()); + } + else if (resultCas != readyCasCommands.cend()) + { + if (std::get(*resultCas) == sc_time_stamp()) + return *resultCas; + else + return CommandTuple::Type(Command::NOP, nullptr, sc_max_time()); + } + else + return CommandTuple::Type(Command::NOP, nullptr, sc_max_time()); +} diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.h b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.h index 2cd2a372..6ed6afd8 100644 --- a/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.h +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.h @@ -49,4 +49,17 @@ private: const MemSpec *memSpec; }; +class CmdMuxStrictRasCas : public CmdMuxIF +{ +public: + CmdMuxStrictRasCas(); + CommandTuple::Type selectCommand(ReadyCommands &); + +private: + uint64_t nextPayloadID = 1; + const MemSpec *memSpec; + ReadyCommands readyRasCommands; + ReadyCommands readyCasCommands; +}; + #endif // CMDMUXSTRICT_H From ae85f6cd832160e804bb556714222b80173252e8 Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Wed, 21 Apr 2021 09:38:22 +0200 Subject: [PATCH 2/4] New oldest cmd mux working. --- .../library/src/controller/cmdmux/CmdMuxIF.h | 2 +- .../src/controller/cmdmux/CmdMuxOldest.cpp | 69 ++++++++++--------- .../src/controller/cmdmux/CmdMuxOldest.h | 5 +- .../src/controller/cmdmux/CmdMuxStrict.cpp | 69 ++++++++++--------- .../src/controller/cmdmux/CmdMuxStrict.h | 5 +- 5 files changed, 79 insertions(+), 71 deletions(-) diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxIF.h b/DRAMSys/library/src/controller/cmdmux/CmdMuxIF.h index 49e0318c..7134f3cb 100644 --- a/DRAMSys/library/src/controller/cmdmux/CmdMuxIF.h +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxIF.h @@ -45,7 +45,7 @@ class CmdMuxIF { public: virtual ~CmdMuxIF() {} - virtual CommandTuple::Type selectCommand(ReadyCommands &) = 0; + virtual CommandTuple::Type selectCommand(const ReadyCommands &) = 0; }; #endif // CMDMUXIF_H diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.cpp b/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.cpp index 9bbc825b..657d1abe 100644 --- a/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.cpp +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.cpp @@ -40,7 +40,7 @@ using namespace tlm; CmdMuxOldest::CmdMuxOldest() : memSpec(Configuration::getInstance().memSpec) {} -CommandTuple::Type CmdMuxOldest::selectCommand(ReadyCommands &readyCommands) +CommandTuple::Type CmdMuxOldest::selectCommand(const ReadyCommands &readyCommands) { auto result = readyCommands.cend(); uint64_t lastPayloadID = UINT64_MAX; @@ -51,7 +51,7 @@ CommandTuple::Type CmdMuxOldest::selectCommand(ReadyCommands &readyCommands) for (auto it = readyCommands.cbegin(); it != readyCommands.cend(); it++) { newTimestamp = std::get(*it) + - memSpec->getCommandLength(std::get(*it)) - memSpec->tCK; + memSpec->getCommandLength(std::get(*it)); newPayloadID = DramExtension::getChannelPayloadID(std::get(*it)); if (newTimestamp < lastTimestamp) @@ -84,7 +84,7 @@ CmdMuxOldestRasCas::CmdMuxOldestRasCas() : memSpec(Configuration::getInstance(). readyCasCommands.reserve(memSpec->numberOfBanks); } -CommandTuple::Type CmdMuxOldestRasCas::selectCommand(ReadyCommands &readyCommands) +CommandTuple::Type CmdMuxOldestRasCas::selectCommand(const ReadyCommands &readyCommands) { readyRasCommands.clear(); readyCasCommands.clear(); @@ -97,6 +97,7 @@ CommandTuple::Type CmdMuxOldestRasCas::selectCommand(ReadyCommands &readyCommand readyCasCommands.emplace_back(it); } + auto result = readyCommands.cend(); auto resultRas = readyRasCommands.cend(); auto resultCas = readyCasCommands.cend(); @@ -108,7 +109,7 @@ CommandTuple::Type CmdMuxOldestRasCas::selectCommand(ReadyCommands &readyCommand for (auto it = readyRasCommands.cbegin(); it != readyRasCommands.cend(); it++) { newTimestamp = std::get(*it) + - memSpec->getCommandLength(std::get(*it)) - memSpec->tCK; + memSpec->getCommandLength(std::get(*it)); newPayloadID = DramExtension::getChannelPayloadID(std::get(*it)); if (newTimestamp < lastTimestamp) @@ -133,7 +134,7 @@ CommandTuple::Type CmdMuxOldestRasCas::selectCommand(ReadyCommands &readyCommand for (auto it = readyCasCommands.cbegin(); it != readyCasCommands.cend(); it++) { newTimestamp = std::get(*it) + - memSpec->getCommandLength(std::get(*it)) - memSpec->tCK; + memSpec->getCommandLength(std::get(*it)); newPayloadID = DramExtension::getChannelPayloadID(std::get(*it)); if (newTimestamp < lastTimestamp) @@ -152,38 +153,40 @@ CommandTuple::Type CmdMuxOldestRasCas::selectCommand(ReadyCommands &readyCommand } } - if (resultRas != readyRasCommands.cend() && resultCas != readyCasCommands.cend()) + readyRasCasCommands.clear(); + + if (resultRas != readyRasCommands.cend()) + readyRasCasCommands.emplace_back(*resultRas); + if (resultCas != readyCasCommands.cend()) + readyRasCasCommands.emplace_back(*resultCas); + + lastPayloadID = UINT64_MAX; + lastTimestamp = sc_max_time(); + + for (auto it = readyRasCasCommands.cbegin(); it != readyRasCasCommands.cend(); it++) { - if (std::get(*resultRas) == sc_time_stamp() - && std::get(*resultCas) == sc_time_stamp()) + newTimestamp = std::get(*it); + newPayloadID = DramExtension::getChannelPayloadID(std::get(*it)); + + if (newTimestamp < lastTimestamp) { - if (DramExtension::getChannelPayloadID(std::get(*resultRas)) - <= DramExtension::getChannelPayloadID(std::get(*resultCas))) - return *resultRas; - else - return *resultCas; + lastTimestamp = newTimestamp; + lastPayloadID = newPayloadID; + result = it; + } + else if (newTimestamp == lastTimestamp) + { + if (newPayloadID < lastPayloadID) + { + lastPayloadID = newPayloadID; + result = it; + } } - else if (std::get(*resultRas) == sc_time_stamp()) - return *resultRas; - else if (std::get(*resultCas) == sc_time_stamp()) - return *resultCas; - else - return CommandTuple::Type(Command::NOP, nullptr, sc_max_time()); - } - else if (resultRas != readyRasCommands.cend()) - { - if (std::get(*resultRas) == sc_time_stamp()) - return *resultRas; - else - return CommandTuple::Type(Command::NOP, nullptr, sc_max_time()); - } - else if (resultCas != readyCasCommands.cend()) - { - if (std::get(*resultCas) == sc_time_stamp()) - return *resultCas; - else - return CommandTuple::Type(Command::NOP, nullptr, sc_max_time()); } + + if (result != readyCommands.cend() && + std::get(*result) == sc_time_stamp()) + return *result; else return CommandTuple::Type(Command::NOP, nullptr, sc_max_time()); } diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.h b/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.h index 06e07c44..5f8ce661 100644 --- a/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.h +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.h @@ -42,7 +42,7 @@ class CmdMuxOldest : public CmdMuxIF { public: CmdMuxOldest(); - CommandTuple::Type selectCommand(ReadyCommands &); + virtual CommandTuple::Type selectCommand(const ReadyCommands &) override; private: const MemSpec *memSpec; @@ -53,12 +53,13 @@ class CmdMuxOldestRasCas : public CmdMuxIF { public: CmdMuxOldestRasCas(); - CommandTuple::Type selectCommand(ReadyCommands &); + virtual CommandTuple::Type selectCommand(const ReadyCommands &) override; private: const MemSpec *memSpec; ReadyCommands readyRasCommands; ReadyCommands readyCasCommands; + ReadyCommands readyRasCasCommands; }; #endif // CMDMUXOLDEST_H diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp index f895f635..12a167be 100644 --- a/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp @@ -40,7 +40,7 @@ using namespace tlm; CmdMuxStrict::CmdMuxStrict() : memSpec(Configuration::getInstance().memSpec) {} -CommandTuple::Type CmdMuxStrict::selectCommand(ReadyCommands &readyCommands) +CommandTuple::Type CmdMuxStrict::selectCommand(const ReadyCommands &readyCommands) { auto result = readyCommands.cend(); uint64_t lastPayloadID = UINT64_MAX; @@ -51,7 +51,7 @@ CommandTuple::Type CmdMuxStrict::selectCommand(ReadyCommands &readyCommands) for (auto it = readyCommands.cbegin(); it != readyCommands.cend(); it++) { newTimestamp = std::get(*it) + - memSpec->getCommandLength(std::get(*it)) - memSpec->tCK; + memSpec->getCommandLength(std::get(*it)); newPayloadID = DramExtension::getChannelPayloadID(std::get(*it)); if (newTimestamp < lastTimestamp) @@ -111,7 +111,7 @@ CmdMuxStrictRasCas::CmdMuxStrictRasCas() : memSpec(Configuration::getInstance(). readyCasCommands.reserve(memSpec->numberOfBanks); } -CommandTuple::Type CmdMuxStrictRasCas::selectCommand(ReadyCommands &readyCommands) +CommandTuple::Type CmdMuxStrictRasCas::selectCommand(const ReadyCommands &readyCommands) { readyRasCommands.clear(); readyCasCommands.clear(); @@ -124,6 +124,7 @@ CommandTuple::Type CmdMuxStrictRasCas::selectCommand(ReadyCommands &readyCommand readyCasCommands.emplace_back(it); } + auto result = readyCommands.cend(); auto resultRas = readyRasCommands.cend(); auto resultCas = readyCasCommands.cend(); @@ -135,7 +136,7 @@ CommandTuple::Type CmdMuxStrictRasCas::selectCommand(ReadyCommands &readyCommand for (auto it = readyRasCommands.cbegin(); it != readyRasCommands.cend(); it++) { newTimestamp = std::get(*it) + - memSpec->getCommandLength(std::get(*it)) - memSpec->tCK; + memSpec->getCommandLength(std::get(*it)); newPayloadID = DramExtension::getChannelPayloadID(std::get(*it)); if (newTimestamp < lastTimestamp) @@ -160,7 +161,7 @@ CommandTuple::Type CmdMuxStrictRasCas::selectCommand(ReadyCommands &readyCommand for (auto it = readyCasCommands.cbegin(); it != readyCasCommands.cend(); it++) { newTimestamp = std::get(*it) + - memSpec->getCommandLength(std::get(*it)) - memSpec->tCK; + memSpec->getCommandLength(std::get(*it)); newPayloadID = DramExtension::getChannelPayloadID(std::get(*it)); if (newPayloadID == nextPayloadID) @@ -182,38 +183,40 @@ CommandTuple::Type CmdMuxStrictRasCas::selectCommand(ReadyCommands &readyCommand } } - if (resultRas != readyRasCommands.cend() && resultCas != readyCasCommands.cend()) + readyRasCasCommands.clear(); + + if (resultRas != readyRasCommands.cend()) + readyRasCasCommands.emplace_back(*resultRas); + if (resultCas != readyCasCommands.cend()) + readyRasCasCommands.emplace_back(*resultCas); + + lastPayloadID = UINT64_MAX; + lastTimestamp = sc_max_time(); + + for (auto it = readyRasCasCommands.cbegin(); it != readyRasCasCommands.cend(); it++) { - if (std::get(*resultRas) == sc_time_stamp() - && std::get(*resultCas) == sc_time_stamp()) + newTimestamp = std::get(*it); + newPayloadID = DramExtension::getChannelPayloadID(std::get(*it)); + + if (newTimestamp < lastTimestamp) { - if (DramExtension::getChannelPayloadID(std::get(*resultRas)) - <= DramExtension::getChannelPayloadID(std::get(*resultCas))) - return *resultRas; - else - return *resultCas; + lastTimestamp = newTimestamp; + lastPayloadID = newPayloadID; + result = it; + } + else if (newTimestamp == lastTimestamp) + { + if (newPayloadID < lastPayloadID) + { + lastPayloadID = newPayloadID; + result = it; + } } - else if (std::get(*resultRas) == sc_time_stamp()) - return *resultRas; - else if (std::get(*resultCas) == sc_time_stamp()) - return *resultCas; - else - return CommandTuple::Type(Command::NOP, nullptr, sc_max_time()); - } - else if (resultRas != readyRasCommands.cend()) - { - if (std::get(*resultRas) == sc_time_stamp()) - return *resultRas; - else - return CommandTuple::Type(Command::NOP, nullptr, sc_max_time()); - } - else if (resultCas != readyCasCommands.cend()) - { - if (std::get(*resultCas) == sc_time_stamp()) - return *resultCas; - else - return CommandTuple::Type(Command::NOP, nullptr, sc_max_time()); } + + if (result != readyCommands.cend() && + std::get(*result) == sc_time_stamp()) + return *result; else return CommandTuple::Type(Command::NOP, nullptr, sc_max_time()); } diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.h b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.h index 6ed6afd8..f7c42380 100644 --- a/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.h +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.h @@ -42,7 +42,7 @@ class CmdMuxStrict : public CmdMuxIF { public: CmdMuxStrict(); - CommandTuple::Type selectCommand(ReadyCommands &); + virtual CommandTuple::Type selectCommand(const ReadyCommands &) override; private: uint64_t nextPayloadID = 1; @@ -53,13 +53,14 @@ class CmdMuxStrictRasCas : public CmdMuxIF { public: CmdMuxStrictRasCas(); - CommandTuple::Type selectCommand(ReadyCommands &); + virtual CommandTuple::Type selectCommand(const ReadyCommands &) override; private: uint64_t nextPayloadID = 1; const MemSpec *memSpec; ReadyCommands readyRasCommands; ReadyCommands readyCasCommands; + ReadyCommands readyRasCasCommands; }; #endif // CMDMUXSTRICT_H From fc44d319bb1a2b9092e60bc4587c0d4696e472d9 Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Thu, 22 Apr 2021 11:27:22 +0200 Subject: [PATCH 3/4] New strict cmd mux working. --- DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp index 12a167be..c2b0f9e0 100644 --- a/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp @@ -216,7 +216,11 @@ CommandTuple::Type CmdMuxStrictRasCas::selectCommand(const ReadyCommands &readyC if (result != readyCommands.cend() && std::get(*result) == sc_time_stamp()) - return *result; + { + if (isCasCommand(std::get(*result))) + nextPayloadID++; + return *result; + } else return CommandTuple::Type(Command::NOP, nullptr, sc_max_time()); } From 399a0739129ea8ba61e9d4157a711791afe6759f Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Fri, 23 Apr 2021 10:51:35 +0200 Subject: [PATCH 4/4] Code formatting. --- .../src/controller/cmdmux/CmdMuxOldest.cpp | 37 ++++------ .../src/controller/cmdmux/CmdMuxStrict.cpp | 72 ++++--------------- 2 files changed, 28 insertions(+), 81 deletions(-) diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.cpp b/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.cpp index 657d1abe..a64bde58 100644 --- a/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.cpp +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.cpp @@ -60,13 +60,10 @@ CommandTuple::Type CmdMuxOldest::selectCommand(const ReadyCommands &readyCommand lastPayloadID = newPayloadID; result = it; } - else if (newTimestamp == lastTimestamp) + else if ((newTimestamp == lastTimestamp) && (newPayloadID < lastPayloadID)) { - if (newPayloadID < lastPayloadID) - { - lastPayloadID = newPayloadID; - result = it; - } + lastPayloadID = newPayloadID; + result = it; } } @@ -82,6 +79,7 @@ CmdMuxOldestRasCas::CmdMuxOldestRasCas() : memSpec(Configuration::getInstance(). { readyRasCommands.reserve(memSpec->numberOfBanks); readyCasCommands.reserve(memSpec->numberOfBanks); + readyRasCasCommands.reserve(2); } CommandTuple::Type CmdMuxOldestRasCas::selectCommand(const ReadyCommands &readyCommands) @@ -118,13 +116,10 @@ CommandTuple::Type CmdMuxOldestRasCas::selectCommand(const ReadyCommands &readyC lastPayloadID = newPayloadID; resultRas = it; } - else if (newTimestamp == lastTimestamp) + else if ((newTimestamp == lastTimestamp) && (newPayloadID < lastPayloadID)) { - if (newPayloadID < lastPayloadID) - { - lastPayloadID = newPayloadID; - resultRas = it; - } + lastPayloadID = newPayloadID; + resultRas = it; } } @@ -143,13 +138,10 @@ CommandTuple::Type CmdMuxOldestRasCas::selectCommand(const ReadyCommands &readyC lastPayloadID = newPayloadID; resultCas = it; } - else if (newTimestamp == lastTimestamp) + else if ((newTimestamp == lastTimestamp) && (newPayloadID < lastPayloadID)) { - if (newPayloadID < lastPayloadID) - { - lastPayloadID = newPayloadID; - resultCas = it; - } + lastPayloadID = newPayloadID; + resultCas = it; } } @@ -174,13 +166,10 @@ CommandTuple::Type CmdMuxOldestRasCas::selectCommand(const ReadyCommands &readyC lastPayloadID = newPayloadID; result = it; } - else if (newTimestamp == lastTimestamp) + else if ((newTimestamp == lastTimestamp) && (newPayloadID < lastPayloadID)) { - if (newPayloadID < lastPayloadID) - { - lastPayloadID = newPayloadID; - result = it; - } + lastPayloadID = newPayloadID; + result = it; } } diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp index c2b0f9e0..ce9e97d6 100644 --- a/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp @@ -56,39 +56,19 @@ CommandTuple::Type CmdMuxStrict::selectCommand(const ReadyCommands &readyCommand if (newTimestamp < lastTimestamp) { - if (isCasCommand(std::get(*it))) - { - if (newPayloadID == nextPayloadID) - { - lastTimestamp = newTimestamp; - lastPayloadID = newPayloadID; - result = it; - } - } - else + if (isRasCommand(std::get(*it)) || newPayloadID == nextPayloadID) { lastTimestamp = newTimestamp; lastPayloadID = newPayloadID; result = it; - } + } } - else if (newTimestamp == lastTimestamp) + else if ((newTimestamp == lastTimestamp) && (newPayloadID < lastPayloadID)) { - if (isCasCommand(std::get(*it))) + if (isRasCommand(std::get(*it)) || newPayloadID == nextPayloadID) { - if ((newPayloadID < lastPayloadID) && (newPayloadID == nextPayloadID)) - { - lastPayloadID = newPayloadID; - result = it; - } - } - else - { - if (newPayloadID < lastPayloadID) - { - lastPayloadID = newPayloadID; - result = it; - } + lastPayloadID = newPayloadID; + result = it; } } } @@ -109,6 +89,7 @@ CmdMuxStrictRasCas::CmdMuxStrictRasCas() : memSpec(Configuration::getInstance(). { readyRasCommands.reserve(memSpec->numberOfBanks); readyCasCommands.reserve(memSpec->numberOfBanks); + readyRasCasCommands.reserve(2); } CommandTuple::Type CmdMuxStrictRasCas::selectCommand(const ReadyCommands &readyCommands) @@ -145,41 +126,21 @@ CommandTuple::Type CmdMuxStrictRasCas::selectCommand(const ReadyCommands &readyC lastPayloadID = newPayloadID; resultRas = it; } - else if (newTimestamp == lastTimestamp) + else if ((newTimestamp == lastTimestamp) && (newPayloadID < lastPayloadID)) { - if (newPayloadID < lastPayloadID) - { - lastPayloadID = newPayloadID; - resultRas = it; - } + lastPayloadID = newPayloadID; + resultRas = it; } } - lastPayloadID = UINT64_MAX; - lastTimestamp = sc_max_time(); - for (auto it = readyCasCommands.cbegin(); it != readyCasCommands.cend(); it++) { - newTimestamp = std::get(*it) + - memSpec->getCommandLength(std::get(*it)); newPayloadID = DramExtension::getChannelPayloadID(std::get(*it)); if (newPayloadID == nextPayloadID) { - if (newTimestamp < lastTimestamp) - { - lastTimestamp = newTimestamp; - lastPayloadID = newPayloadID; - resultCas = it; - } - else if (newTimestamp == lastTimestamp) - { - if (newPayloadID < lastPayloadID) - { - lastPayloadID = newPayloadID; - resultCas = it; - } - } + resultCas = it; + break; } } @@ -204,13 +165,10 @@ CommandTuple::Type CmdMuxStrictRasCas::selectCommand(const ReadyCommands &readyC lastPayloadID = newPayloadID; result = it; } - else if (newTimestamp == lastTimestamp) + else if ((newTimestamp == lastTimestamp) && (newPayloadID < lastPayloadID)) { - if (newPayloadID < lastPayloadID) - { - lastPayloadID = newPayloadID; - result = it; - } + lastPayloadID = newPayloadID; + result = it; } }