From ec731888a3516d6e0d6268f0aebad7e06438852e Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Mon, 12 Jun 2023 10:29:25 +0200 Subject: [PATCH 01/28] Remove check to issue first transaction at zero time. --- src/simulator/simulator/request/RequestIssuer.cpp | 12 ++---------- src/simulator/simulator/request/RequestIssuer.h | 3 --- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/src/simulator/simulator/request/RequestIssuer.cpp b/src/simulator/simulator/request/RequestIssuer.cpp index 8ae4417f..3a8bd7ba 100644 --- a/src/simulator/simulator/request/RequestIssuer.cpp +++ b/src/simulator/simulator/request/RequestIssuer.cpp @@ -79,14 +79,7 @@ void RequestIssuer::sendNextRequest() tlm::tlm_phase phase = tlm::BEGIN_REQ; sc_core::sc_time delay = request.delay; - if (request.address == 0x4000f000) - int x = 0; - - if (transactionsSent == 0) - delay = sc_core::SC_ZERO_TIME; - iSocket->nb_transport_fw(payload, phase, delay); - transactionInProgress = true; if (request.command == Request::Command::Read) pendingReadRequests++; @@ -121,12 +114,11 @@ void RequestIssuer::peqCallback(tlm::tlm_generic_payload &payload, const tlm::tl } else if (phase == tlm::BEGIN_RESP) { - tlm::tlm_phase phase = tlm::END_RESP; + tlm::tlm_phase nextPhase = tlm::END_RESP; sc_core::sc_time delay = sc_core::SC_ZERO_TIME; - iSocket->nb_transport_fw(payload, phase, delay); + iSocket->nb_transport_fw(payload, nextPhase, delay); payload.release(); - transactionInProgress = false; transactionFinished(); diff --git a/src/simulator/simulator/request/RequestIssuer.h b/src/simulator/simulator/request/RequestIssuer.h index 831fb2b4..816f8138 100644 --- a/src/simulator/simulator/request/RequestIssuer.h +++ b/src/simulator/simulator/request/RequestIssuer.h @@ -63,7 +63,6 @@ private: tlm_utils::peq_with_cb_and_phase payloadEventQueue; MemoryManager &memoryManager; - bool transactionInProgress = false; bool transactionPostponed = false; bool finished = false; @@ -75,8 +74,6 @@ private: const std::optional maxPendingReadRequests; const std::optional maxPendingWriteRequests; - unsigned int activeProducers = 0; - std::function transactionFinished; std::function terminate; std::function nextRequest; From 20f4f111ac3dbb72b2b6268031efcace34a45b45 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Thu, 15 Jun 2023 10:59:29 +0200 Subject: [PATCH 02/28] Align next request to initiator clock period --- src/simulator/README.md | 2 +- src/simulator/main.cpp | 4 +- src/simulator/simulator/SimpleInitiator.h | 2 + .../simulator/generator/RandomProducer.cpp | 4 +- .../simulator/generator/RandomProducer.h | 3 - .../generator/SequentialProducer.cpp | 4 +- .../simulator/generator/SequentialProducer.h | 3 - .../simulator/generator/TrafficGenerator.cpp | 66 +++++++++---------- .../simulator/generator/TrafficGenerator.h | 5 +- src/simulator/simulator/hammer/RowHammer.cpp | 4 +- src/simulator/simulator/hammer/RowHammer.h | 3 - src/simulator/simulator/player/StlPlayer.cpp | 10 ++- src/simulator/simulator/player/StlPlayer.h | 1 - .../simulator/request/RequestIssuer.cpp | 9 +++ .../simulator/request/RequestIssuer.h | 3 + .../simulator/request/RequestProducer.h | 1 - 16 files changed, 61 insertions(+), 63 deletions(-) diff --git a/src/simulator/README.md b/src/simulator/README.md index 8f8712b2..e2ffe592 100644 --- a/src/simulator/README.md +++ b/src/simulator/README.md @@ -6,7 +6,7 @@ Initiators in the simulator are split up into two disctinct components: **Reques **RequestProducers** are simple C++ classes that implement the `RequestProducer` interface. Upon calling the `nextRequest()` method of a producer, a new `Request` is either generated on-the-fly or constructed from a trace file. -**RequestIssuers** are the SystemC modules that connect with DRAMSys. Issuers have no knowledge of where the requests are coming from. They simply call their `nextRequest()` callback that it has been passed in the constructor to obtain the next request to be sent to DRAMSys. Using this concept, the generation and the issuing of request is completely decoupled to make very flexible initiator designs possible. +**RequestIssuers** are the SystemC modules that connect to DRAMSys. Issuers have no knowledge of where the requests are coming from. They simply call their `nextRequest()` callback that it has been passed in the constructor to obtain the next request to be sent to DRAMSys. Using this concept, the generation and the issuing of request is completely decoupled to make very flexible initiator designs possible. **Initiators** implement the `Initiator` interface, which describes how the initiator is bound to DRAMSys. This abstracts over the actual socket type used by the initiator. Complex initiators may implement the interface directly, but for simple cases, there exists the templated `SimpleInitiator` class. This specialized initiator consists of only one producer and one issuer that operate together. The `StlPlayer` and `RowHammer` issuers make use of the `SimpleInitiator`. diff --git a/src/simulator/main.cpp b/src/simulator/main.cpp index 153341ae..80563366 100644 --- a/src/simulator/main.cpp +++ b/src/simulator/main.cpp @@ -150,6 +150,7 @@ int sc_main(int argc, char **argv) return std::make_unique>(config.name.c_str(), memoryManager, + config.clkMhz, std::nullopt, std::nullopt, transactionFinished, @@ -159,10 +160,11 @@ int sc_main(int argc, char **argv) else if constexpr (std::is_same_v) { RowHammer hammer( - config.numRequests, config.clkMhz, config.rowIncrement, defaultDataLength); + config.numRequests, config.rowIncrement, defaultDataLength); return std::make_unique>(config.name.c_str(), memoryManager, + config.clkMhz, 1, 1, transactionFinished, diff --git a/src/simulator/simulator/SimpleInitiator.h b/src/simulator/simulator/SimpleInitiator.h index b0c79d11..3c0a0064 100644 --- a/src/simulator/simulator/SimpleInitiator.h +++ b/src/simulator/simulator/SimpleInitiator.h @@ -44,6 +44,7 @@ class SimpleInitiator : public Initiator public: SimpleInitiator(sc_core::sc_module_name const &name, MemoryManager &memoryManager, + unsigned int clkMhz, std::optional maxPendingReadRequests, std::optional maxPendingWriteRequests, std::function transactionFinished, @@ -53,6 +54,7 @@ public: issuer( name, memoryManager, + clkMhz, maxPendingReadRequests, maxPendingWriteRequests, [this] { return this->producer.nextRequest(); }, diff --git a/src/simulator/simulator/generator/RandomProducer.cpp b/src/simulator/simulator/generator/RandomProducer.cpp index b6a7001e..2d866747 100644 --- a/src/simulator/simulator/generator/RandomProducer.cpp +++ b/src/simulator/simulator/generator/RandomProducer.cpp @@ -39,7 +39,6 @@ RandomProducer::RandomProducer(uint64_t numRequests, std::optional seed, double rwRatio, - unsigned int clkMhz, std::optional minAddress, std::optional maxAddress, uint64_t memorySize, @@ -49,7 +48,6 @@ RandomProducer::RandomProducer(uint64_t numRequests, seed(seed.value_or(DEFAULT_SEED)), rwRatio(rwRatio), randomGenerator(this->seed), - generatorPeriod(sc_core::sc_time(1.0 / static_cast(clkMhz), sc_core::SC_US)), dataLength(dataLength), dataAlignment(dataAlignment), randomAddressDistribution(minAddress.value_or(DEFAULT_MIN_ADDRESS), @@ -79,7 +77,7 @@ Request RandomProducer::nextRequest() request.command = readWriteDistribution(randomGenerator) < rwRatio ? Request::Command::Read : Request::Command::Write; request.length = dataLength; - request.delay = generatorPeriod; + request.delay = sc_core::SC_ZERO_TIME; return request; } diff --git a/src/simulator/simulator/generator/RandomProducer.h b/src/simulator/simulator/generator/RandomProducer.h index 299b7296..062c3acf 100644 --- a/src/simulator/simulator/generator/RandomProducer.h +++ b/src/simulator/simulator/generator/RandomProducer.h @@ -46,7 +46,6 @@ public: RandomProducer(uint64_t numRequests, std::optional seed, double rwRatio, - unsigned int clkMhz, std::optional minAddress, std::optional maxAddress, uint64_t memorySize, @@ -56,12 +55,10 @@ public: Request nextRequest() override; uint64_t totalRequests() override { return numberOfRequests; } - sc_core::sc_time clkPeriod() override { return generatorPeriod; } const uint64_t numberOfRequests; const uint64_t seed; const double rwRatio; - const sc_core::sc_time generatorPeriod; const unsigned int dataLength; const unsigned int dataAlignment; diff --git a/src/simulator/simulator/generator/SequentialProducer.cpp b/src/simulator/simulator/generator/SequentialProducer.cpp index b39a6479..f2985ef6 100644 --- a/src/simulator/simulator/generator/SequentialProducer.cpp +++ b/src/simulator/simulator/generator/SequentialProducer.cpp @@ -39,7 +39,6 @@ SequentialProducer::SequentialProducer(uint64_t numRequests, std::optional seed, double rwRatio, - unsigned int clkMhz, std::optional addressIncrement, std::optional minAddress, std::optional maxAddress, @@ -52,7 +51,6 @@ SequentialProducer::SequentialProducer(uint64_t numRequests, seed(seed.value_or(DEFAULT_SEED)), rwRatio(rwRatio), randomGenerator(this->seed), - generatorPeriod(sc_core::sc_time(1.0 / static_cast(clkMhz), sc_core::SC_US)), dataLength(dataLength) { if (minAddress > memorySize - 1) @@ -75,7 +73,7 @@ Request SequentialProducer::nextRequest() request.command = readWriteDistribution(randomGenerator) < rwRatio ? Request::Command::Read : Request::Command::Write; request.length = dataLength; - request.delay = generatorPeriod; + request.delay = sc_core::SC_ZERO_TIME; generatedRequests++; return request; diff --git a/src/simulator/simulator/generator/SequentialProducer.h b/src/simulator/simulator/generator/SequentialProducer.h index 9c8842ce..d3f64e6e 100644 --- a/src/simulator/simulator/generator/SequentialProducer.h +++ b/src/simulator/simulator/generator/SequentialProducer.h @@ -46,7 +46,6 @@ public: SequentialProducer(uint64_t numRequests, std::optional seed, double rwRatio, - unsigned int clkMhz, std::optional addressIncrement, std::optional minAddress, std::optional maxAddress, @@ -56,7 +55,6 @@ public: Request nextRequest() override; uint64_t totalRequests() override { return numberOfRequests; } - sc_core::sc_time clkPeriod() override { return generatorPeriod; } void reset() override { generatedRequests = 0; } const uint64_t numberOfRequests; @@ -65,7 +63,6 @@ public: const uint64_t maxAddress; const uint64_t seed; const double rwRatio; - const sc_core::sc_time generatorPeriod; const unsigned int dataLength; std::default_random_engine randomGenerator; diff --git a/src/simulator/simulator/generator/TrafficGenerator.cpp b/src/simulator/simulator/generator/TrafficGenerator.cpp index 644f57b3..2a73e82d 100644 --- a/src/simulator/simulator/generator/TrafficGenerator.cpp +++ b/src/simulator/simulator/generator/TrafficGenerator.cpp @@ -35,43 +35,44 @@ #include "TrafficGenerator.h" -TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGeneratorStateMachine const &config, - MemoryManager &memoryManager, +TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGeneratorStateMachine const& config, + MemoryManager& memoryManager, uint64_t memorySize, unsigned int defaultDataLength, std::function transactionFinished, - std::function terminateInitiator) - : consumer( - config.name.c_str(), - memoryManager, - config.maxPendingReadRequests, - config.maxPendingWriteRequests, - [this] { return nextRequest(); }, - std::move(transactionFinished), - std::move(terminateInitiator)), - stateTransistions(config.transitions) + std::function terminateInitiator) : + issuer( + config.name.c_str(), + memoryManager, + config.clkMhz, + config.maxPendingReadRequests, + config.maxPendingWriteRequests, + [this] { return nextRequest(); }, + std::move(transactionFinished), + std::move(terminateInitiator)), + stateTransistions(config.transitions), + generatorPeriod(sc_core::sc_time(1.0 / static_cast(config.clkMhz), sc_core::SC_US)) { unsigned int dataLength = config.dataLength.value_or(defaultDataLength); unsigned int dataAlignment = config.dataAlignment.value_or(dataLength); - for (auto const &state : config.states) + for (auto const& state : config.states) { std::visit( - [=, &config](auto &&arg) + [=, &config](auto&& arg) { using DRAMSys::Config::TrafficGeneratorActiveState; using DRAMSys::Config::TrafficGeneratorIdleState; using T = std::decay_t; if constexpr (std::is_same_v) { - auto const &activeState = arg; + auto const& activeState = arg; if (activeState.addressDistribution == DRAMSys::Config::AddressDistribution::Random) { auto producer = std::make_unique(activeState.numRequests, config.seed, activeState.rwRatio, - config.clkMhz, activeState.minAddress, activeState.maxAddress, memorySize, @@ -86,7 +87,6 @@ TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGeneratorStateMachine std::make_unique(activeState.numRequests, config.seed, activeState.rwRatio, - config.clkMhz, activeState.addressIncrement, activeState.minAddress, activeState.maxAddress, @@ -98,7 +98,7 @@ TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGeneratorStateMachine } else if constexpr (std::is_same_v) { - auto const &idleState = arg; + auto const& idleState = arg; idleStateClks.emplace(idleState.id, idleState.idleClks); } }, @@ -106,20 +106,22 @@ TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGeneratorStateMachine } } -TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGenerator const &config, - MemoryManager &memoryManager, +TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGenerator const& config, + MemoryManager& memoryManager, uint64_t memorySize, unsigned int defaultDataLength, std::function transactionFinished, - std::function terminateInitiator) - : consumer( - config.name.c_str(), - memoryManager, - config.maxPendingReadRequests, - config.maxPendingWriteRequests, - [this] { return nextRequest(); }, - std::move(transactionFinished), - std::move(terminateInitiator)) + std::function terminateInitiator) : + issuer( + config.name.c_str(), + memoryManager, + config.clkMhz, + config.maxPendingReadRequests, + config.maxPendingWriteRequests, + [this] { return nextRequest(); }, + std::move(transactionFinished), + std::move(terminateInitiator)), + generatorPeriod(sc_core::sc_time(1.0 / static_cast(config.clkMhz), sc_core::SC_US)) { unsigned int dataLength = config.dataLength.value_or(defaultDataLength); unsigned int dataAlignment = config.dataAlignment.value_or(dataLength); @@ -129,7 +131,6 @@ TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGenerator const &conf auto producer = std::make_unique(config.numRequests, config.seed, config.rwRatio, - config.clkMhz, config.minAddress, config.maxAddress, memorySize, @@ -142,7 +143,6 @@ TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGenerator const &conf auto producer = std::make_unique(config.numRequests, config.seed, config.rwRatio, - config.clkMhz, config.addressIncrement, config.minAddress, config.maxAddress, @@ -183,9 +183,9 @@ Request TrafficGenerator::nextRequest() } requestsInState++; - + Request request = producers[currentState]->nextRequest(); - request.delay += producers[currentState]->clkPeriod() * clksToIdle; + request.delay += generatorPeriod * static_cast(clksToIdle); return request; } diff --git a/src/simulator/simulator/generator/TrafficGenerator.h b/src/simulator/simulator/generator/TrafficGenerator.h index ec2ec3a3..3636cc7b 100644 --- a/src/simulator/simulator/generator/TrafficGenerator.h +++ b/src/simulator/simulator/generator/TrafficGenerator.h @@ -60,7 +60,7 @@ public: std::function transactionFinished, std::function terminateInitiator); - void bind(tlm_utils::multi_target_base<> &target) override { consumer.iSocket.bind(target); } + void bind(tlm_utils::multi_target_base<> &target) override { issuer.iSocket.bind(target); } uint64_t totalRequests() override; Request nextRequest(); @@ -74,9 +74,10 @@ private: using IdleClks = uint64_t; std::unordered_map idleStateClks; + const sc_core::sc_time generatorPeriod; std::default_random_engine randomGenerator; std::unordered_map> producers; - RequestIssuer consumer; + RequestIssuer issuer; }; diff --git a/src/simulator/simulator/hammer/RowHammer.cpp b/src/simulator/simulator/hammer/RowHammer.cpp index 4ca7d7b3..feb18d04 100644 --- a/src/simulator/simulator/hammer/RowHammer.cpp +++ b/src/simulator/simulator/hammer/RowHammer.cpp @@ -36,11 +36,9 @@ #include "RowHammer.h" RowHammer::RowHammer(uint64_t numRequests, - unsigned int clkMhz, uint64_t rowIncrement, unsigned int dataLength) : numberOfRequests(numRequests), - generatorPeriod(sc_core::sc_time(1.0 / static_cast(clkMhz), sc_core::SC_US)), dataLength(dataLength), rowIncrement(rowIncrement) { @@ -62,6 +60,6 @@ Request RowHammer::nextRequest() request.address = currentAddress; request.command = Request::Command::Read; request.length = dataLength; - request.delay = generatorPeriod; + request.delay = sc_core::SC_ZERO_TIME; return request; } diff --git a/src/simulator/simulator/hammer/RowHammer.h b/src/simulator/simulator/hammer/RowHammer.h index 218a82c7..75996299 100644 --- a/src/simulator/simulator/hammer/RowHammer.h +++ b/src/simulator/simulator/hammer/RowHammer.h @@ -43,16 +43,13 @@ class RowHammer : public RequestProducer { public: RowHammer(uint64_t numRequests, - unsigned int clkMhz, uint64_t rowIncrement, unsigned int dataLength); Request nextRequest() override; - sc_core::sc_time clkPeriod() override { return generatorPeriod; } uint64_t totalRequests() override { return numberOfRequests; } const uint64_t numberOfRequests; - const sc_core::sc_time generatorPeriod; const unsigned int dataLength; const uint64_t rowIncrement; diff --git a/src/simulator/simulator/player/StlPlayer.cpp b/src/simulator/simulator/player/StlPlayer.cpp index d80a6157..5b29e773 100644 --- a/src/simulator/simulator/player/StlPlayer.cpp +++ b/src/simulator/simulator/player/StlPlayer.cpp @@ -94,17 +94,15 @@ Request StlPlayer::nextRequest() } } - sc_core::sc_time delay = readoutIt->delay; - sc_core::sc_time offset = playerPeriod - (sc_core::sc_time_stamp() % playerPeriod); - + sc_core::sc_time delay; if (traceType == TraceType::Absolute) { - delay = std::max(sc_core::sc_time_stamp() + offset, delay); - delay -= sc_core::sc_time_stamp(); + bool behindSchedule = sc_core::sc_time_stamp() > readoutIt->delay; + delay = behindSchedule ? sc_core::SC_ZERO_TIME : readoutIt->delay - sc_core::sc_time_stamp(); } else // if (traceType == TraceType::Relative) { - delay = offset + delay; + delay = readoutIt->delay; } Request request(*readoutIt); diff --git a/src/simulator/simulator/player/StlPlayer.h b/src/simulator/simulator/player/StlPlayer.h index 409b46cd..2e4b02d0 100644 --- a/src/simulator/simulator/player/StlPlayer.h +++ b/src/simulator/simulator/player/StlPlayer.h @@ -68,7 +68,6 @@ public: Request nextRequest() override; - sc_core::sc_time clkPeriod() override { return playerPeriod; } uint64_t totalRequests() override { return numberOfLines; } private: diff --git a/src/simulator/simulator/request/RequestIssuer.cpp b/src/simulator/simulator/request/RequestIssuer.cpp index 3a8bd7ba..2c96ea37 100644 --- a/src/simulator/simulator/request/RequestIssuer.cpp +++ b/src/simulator/simulator/request/RequestIssuer.cpp @@ -37,6 +37,7 @@ RequestIssuer::RequestIssuer(sc_core::sc_module_name const &name, MemoryManager &memoryManager, + unsigned int clkMhz, std::optional maxPendingReadRequests, std::optional maxPendingWriteRequests, std::function nextRequest, @@ -44,6 +45,7 @@ RequestIssuer::RequestIssuer(sc_core::sc_module_name const &name, std::function terminate) : sc_module(name), memoryManager(memoryManager), + clkPeriod(sc_core::sc_time(1.0 / static_cast(clkMhz), sc_core::SC_US)), maxPendingReadRequests(maxPendingReadRequests), maxPendingWriteRequests(maxPendingWriteRequests), nextRequest(std::move(nextRequest)), @@ -79,6 +81,13 @@ void RequestIssuer::sendNextRequest() tlm::tlm_phase phase = tlm::BEGIN_REQ; sc_core::sc_time delay = request.delay; + // Align to next clock + if (delay < clkPeriod && transactionsSent != 0) + { + delay = delay + clkPeriod; + delay -= delay % clkPeriod; + } + iSocket->nb_transport_fw(payload, phase, delay); if (request.command == Request::Command::Read) diff --git a/src/simulator/simulator/request/RequestIssuer.h b/src/simulator/simulator/request/RequestIssuer.h index 816f8138..2e318bfc 100644 --- a/src/simulator/simulator/request/RequestIssuer.h +++ b/src/simulator/simulator/request/RequestIssuer.h @@ -52,6 +52,7 @@ public: RequestIssuer(sc_core::sc_module_name const &name, MemoryManager &memoryManager, + unsigned int clkMhz, std::optional maxPendingReadRequests, std::optional maxPendingWriteRequests, std::function nextRequest, @@ -63,6 +64,8 @@ private: tlm_utils::peq_with_cb_and_phase payloadEventQueue; MemoryManager &memoryManager; + const sc_core::sc_time clkPeriod; + bool transactionPostponed = false; bool finished = false; diff --git a/src/simulator/simulator/request/RequestProducer.h b/src/simulator/simulator/request/RequestProducer.h index 212f14c6..a7df1935 100644 --- a/src/simulator/simulator/request/RequestProducer.h +++ b/src/simulator/simulator/request/RequestProducer.h @@ -44,6 +44,5 @@ public: virtual Request nextRequest() = 0; virtual uint64_t totalRequests() = 0; - virtual sc_core::sc_time clkPeriod() = 0; virtual void reset(){}; }; From 6e582907c0977b1719cc370917ea22af805149a1 Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Thu, 15 Jun 2023 11:32:51 +0200 Subject: [PATCH 03/28] Add checks for empty trace and catch conversion exceptions. --- src/simulator/simulator/player/StlPlayer.cpp | 118 ++++++++++--------- 1 file changed, 65 insertions(+), 53 deletions(-) diff --git a/src/simulator/simulator/player/StlPlayer.cpp b/src/simulator/simulator/player/StlPlayer.cpp index d80a6157..3cfca1e7 100644 --- a/src/simulator/simulator/player/StlPlayer.cpp +++ b/src/simulator/simulator/player/StlPlayer.cpp @@ -71,6 +71,9 @@ StlPlayer::StlPlayer(std::string_view tracePath, if (line.size() > 1 && line[0] != '#') numberOfLines++; } + if (numberOfLines == 0) + SC_REPORT_FATAL("StlPlayer", + (std::string("Empty trace ") + tracePath.data()).c_str()); traceFile.clear(); traceFile.seekg(0); } @@ -143,69 +146,78 @@ void StlPlayer::parseTraceFile() iss.str(line); - // Get the timestamp for the transaction. - iss >> element; - if (element.empty()) - SC_REPORT_FATAL( - "StlPlayer", - ("Malformed trace file line " + std::to_string(currentLine) + ".").c_str()); - - content.delay = playerPeriod * static_cast(std::stoull(element)); - - // Get the optional burst length and command - iss >> element; - if (element.empty()) - SC_REPORT_FATAL( - "StlPlayer", - ("Malformed trace file line " + std::to_string(currentLine) + ".").c_str()); - - if (element.at(0) == '(') + try { - element.erase(0, 1); - content.length = std::stoul(element); + // Get the timestamp for the transaction. iss >> element; if (element.empty()) SC_REPORT_FATAL( - "StlPlayer", - ("Malformed trace file line " + std::to_string(currentLine) + ".").c_str()); - } - else - content.length = defaultDataLength; + "StlPlayer", + ("Malformed trace file line " + std::to_string(currentLine) + ".").c_str()); - if (element == "read") - content.command = Request::Command::Read; - else if (element == "write") - content.command = Request::Command::Write; - else - SC_REPORT_FATAL( - "StlPlayer", - ("Malformed trace file line " + std::to_string(currentLine) + ".").c_str()); + content.delay = playerPeriod * static_cast(std::stoull(element)); - // Get the address. - iss >> element; - if (element.empty()) - SC_REPORT_FATAL( - "StlPlayer", - ("Malformed trace file line " + std::to_string(currentLine) + ".").c_str()); - content.address = std::stoull(element, nullptr, 16); - - // Get the data if necessary. - if (storageEnabled && content.command == Request::Command::Write) - { - // The input trace file must provide the data to be stored into the memory. + // Get the optional burst length and command iss >> element; - - // Check if data length in the trace file is correct. - // We need two characters to represent 1 byte in hexadecimal. Offset for 0x prefix. - if (element.length() != (content.length * 2 + 2)) + if (element.empty()) SC_REPORT_FATAL( + "StlPlayer", + ("Malformed trace file line " + std::to_string(currentLine) + ".").c_str()); + + if (element.at(0) == '(') + { + element.erase(0, 1); + content.length = std::stoul(element); + iss >> element; + if (element.empty()) + SC_REPORT_FATAL( + "StlPlayer", + ("Malformed trace file line " + std::to_string(currentLine) + ".").c_str()); + } + else + content.length = defaultDataLength; + + if (element == "read") + content.command = Request::Command::Read; + else if (element == "write") + content.command = Request::Command::Write; + else + SC_REPORT_FATAL( + "StlPlayer", + ("Malformed trace file line " + std::to_string(currentLine) + ".").c_str()); + + // Get the address. + iss >> element; + if (element.empty()) + SC_REPORT_FATAL( + "StlPlayer", + ("Malformed trace file line " + std::to_string(currentLine) + ".").c_str()); + content.address = std::stoull(element, nullptr, 16); + + // Get the data if necessary. + if (storageEnabled && content.command == Request::Command::Write) + { + // The input trace file must provide the data to be stored into the memory. + iss >> element; + + // Check if data length in the trace file is correct. + // We need two characters to represent 1 byte in hexadecimal. Offset for 0x prefix. + if (element.length() != (content.length * 2 + 2)) + SC_REPORT_FATAL( + "StlPlayer", + ("Malformed trace file line " + std::to_string(currentLine) + ".").c_str()); + + // Set data + for (unsigned i = 0; i < content.length; i++) + content.data.emplace_back(static_cast( + std::stoi(element.substr(i * 2 + 2, 2), nullptr, 16))); + } + } + catch (...) + { + SC_REPORT_FATAL( "StlPlayer", ("Malformed trace file line " + std::to_string(currentLine) + ".").c_str()); - - // Set data - for (unsigned i = 0; i < content.length; i++) - content.data.emplace_back(static_cast( - std::stoi(element.substr(i * 2 + 2, 2), nullptr, 16))); } } } From 5463d9d54e2dfe245347b9e2d9ed8c1879e6bfa1 Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Thu, 15 Jun 2023 13:55:41 +0200 Subject: [PATCH 04/28] Update readme. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2605c5cb..809303a3 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ DRAMSys Logo -**DRAMSys** is a flexible DRAM subsystem design space exploration framework based on SystemC TLM-2.0. It was developed by the [Microelectronic Systems Design Research Group](https://eit.rptu.de/en/fgs/ems/home/seite) at [RPTU Kaiserslautern-Landau](https://rptu.de/en/) and by [Fraunhofer IESE](https://www.iese.fraunhofer.de/en.html). +**DRAMSys** is a flexible DRAM subsystem design space exploration framework based on SystemC TLM-2.0. It was developed by the [Microelectronic Systems Design Research Group](https://eit.rptu.de/en/fgs/ems/home/seite) at [RPTU Kaiserslautern-Landau](https://rptu.de/en/), by [Fraunhofer IESE](https://www.iese.fraunhofer.de/en.html) and by the [Computer Engineering Group](https://www.informatik.uni-wuerzburg.de/ce/) at [JMU Würzburg](https://www.uni-wuerzburg.de/en/home/). \>> [Official Website](https://www.iese.fraunhofer.de/en/innovation_trends/autonomous-systems/memtonomy/DRAMSys.html) << @@ -47,7 +47,7 @@ If you are interested in the Trace Analyzer, if you need support with the setup ## Basic Setup -Start using DRAMSys by cloning the repository. +To use DRAMSys, first clone the repository. Make sure that Git LFS is installed on your machine. ### Dependencies From 72f3d04189956e39aad6a99ba08b7cb1ed758ce5 Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Fri, 16 Jun 2023 13:42:14 +0200 Subject: [PATCH 05/28] Fix bug in checker, remove redundant checks. --- .../controller/checker/CheckerHBM3.cpp | 66 +------------------ 1 file changed, 1 insertion(+), 65 deletions(-) diff --git a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp index 16b69f06..8327953f 100644 --- a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp +++ b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp @@ -95,7 +95,7 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); @@ -115,10 +115,6 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDRD + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; - if (lastCommandStart != scMaxTime) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); @@ -135,10 +131,6 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; - if (lastCommandStart != scMaxTime) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDL); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDL); @@ -167,30 +159,14 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDWR + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; - if (lastCommandStart != scMaxTime) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; - if (lastCommandStart != scMaxTime) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; - if (lastCommandStart != scMaxTime) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; - if (lastCommandStart != scMaxTime) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); @@ -219,10 +195,6 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDRD + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; - if (lastCommandStart != scMaxTime) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); @@ -272,30 +244,14 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDWR + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; - if (lastCommandStart != scMaxTime) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; - if (lastCommandStart != scMaxTime) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; - if (lastCommandStart != scMaxTime) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; - if (lastCommandStart != scMaxTime) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); @@ -382,10 +338,6 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RFMPB][bankGroup.ID()]; - if (lastCommandStart != scMaxTime) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank.ID()]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); @@ -533,10 +485,6 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::REFPB][bankGroup.ID()]; - if (lastCommandStart != scMaxTime) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); @@ -549,10 +497,6 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RFMPB][bankGroup.ID()]; - if (lastCommandStart != scMaxTime) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank.ID()]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); @@ -662,10 +606,6 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::REFPB][bankGroup.ID()]; - if (lastCommandStart != scMaxTime) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); @@ -678,10 +618,6 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RFMPB][bankGroup.ID()]; - if (lastCommandStart != scMaxTime) - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank.ID()]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); From d045af9d16e45f23e30a23fa02f9125d96dea4b9 Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Tue, 20 Jun 2023 13:54:36 +0200 Subject: [PATCH 06/28] Use type safe index vectors in timing checkers (1). --- .../DRAMSys/common/dramExtensions.h | 31 +++ .../controller/checker/CheckerDDR3.cpp | 174 ++++++------ .../DRAMSys/controller/checker/CheckerDDR3.h | 6 +- .../controller/checker/CheckerDDR4.cpp | 195 ++++++------- .../DRAMSys/controller/checker/CheckerDDR4.h | 8 +- .../controller/checker/CheckerGDDR5.cpp | 257 +++++++++--------- .../DRAMSys/controller/checker/CheckerGDDR5.h | 12 +- 7 files changed, 358 insertions(+), 325 deletions(-) diff --git a/src/libdramsys/DRAMSys/common/dramExtensions.h b/src/libdramsys/DRAMSys/common/dramExtensions.h index 215785f8..109a095f 100644 --- a/src/libdramsys/DRAMSys/common/dramExtensions.h +++ b/src/libdramsys/DRAMSys/common/dramExtensions.h @@ -38,6 +38,7 @@ #define DRAMEXTENSIONS_H #include +#include #include #include @@ -157,6 +158,36 @@ private: unsigned int id; }; +template +struct ControllerVector +{ +private: + std::vector baseVector; + +public: + ControllerVector(size_t size, const ValueType& value) + { + baseVector = std::vector(size, value); + } + + explicit ControllerVector(size_t size) + { + baseVector = std::vector(size); + } + + ControllerVector() = default; + + const ValueType& operator[](IndexType index) const + { + return baseVector[index.ID()]; + } + + ValueType& operator[](IndexType index) + { + return baseVector[index.ID()]; + } +}; + class ArbiterExtension : public tlm::tlm_extension { public: diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerDDR3.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerDDR3.cpp index 497f3bf3..0c9f9345 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerDDR3.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerDDR3.cpp @@ -50,13 +50,13 @@ CheckerDDR3::CheckerDDR3(const Configuration& config) if (memSpec == nullptr) SC_REPORT_FATAL("CheckerDDR3", "Wrong MemSpec chosen"); - lastScheduledByCommandAndBank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); - lastScheduledByCommandAndRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndRank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnBus = scMaxTime; - last4Activates = std::vector>(memSpec->ranksPerChannel); + last4Activates = ControllerVector>(memSpec->ranksPerChannel); tBURST = memSpec->defaultBurstLength / memSpec->dataRate * memSpec->tCK; tRDWR = memSpec->tRL + tBURST + 2 * memSpec->tCK - memSpec->tWL; @@ -81,34 +81,34 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, const tlm_generic { assert(ControllerExtension::getBurstLength(payload) == 8); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD - memSpec->tAL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); if (command == Command::RDA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE - memSpec->tRTP - memSpec->tAL); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD); @@ -116,7 +116,7 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD); @@ -124,11 +124,11 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSDLL); } @@ -136,286 +136,286 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, const tlm_generic { assert(ControllerExtension::getBurstLength(payload) == 8); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD - memSpec->tAL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSDLL); } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tAL + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); } else if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tAL + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tAL + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tAL + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::REFAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tAL + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::PDEA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tACTPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::PDXA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); } else if (command == Command::PDEP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::PDXP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); } else if (command == Command::SREFEN) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tRDPDEN, memSpec->tAL + memSpec->tRTP + memSpec->tRP)); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRP)); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::SREFEX) { - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKESR); } @@ -436,17 +436,17 @@ void CheckerDDR3::insert(Command command, const tlm_generic_payload& payload) PRINTDEBUGMESSAGE("CheckerDDR3", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); lastCommandOnBus = sc_time_stamp(); if (command == Command::ACT) { - if (last4Activates[rank.ID()].size() == 4) - last4Activates[rank.ID()].pop(); - last4Activates[rank.ID()].push(sc_time_stamp()); + if (last4Activates[rank].size() == 4) + last4Activates[rank].pop(); + last4Activates[rank].push(sc_time_stamp()); } } diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerDDR3.h b/src/libdramsys/DRAMSys/controller/checker/CheckerDDR3.h index 6b29108a..be4a0273 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerDDR3.h +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerDDR3.h @@ -55,13 +55,13 @@ public: private: const MemSpecDDR3 *memSpec; - std::vector> lastScheduledByCommandAndBank; - std::vector> lastScheduledByCommandAndRank; + std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndRank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnBus; // Four activate window - std::vector> last4Activates; + ControllerVector> last4Activates; const sc_core::sc_time scMaxTime = sc_core::sc_max_time(); sc_core::sc_time tBURST; diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerDDR4.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerDDR4.cpp index 10615c83..b3f11245 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerDDR4.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerDDR4.cpp @@ -50,15 +50,16 @@ CheckerDDR4::CheckerDDR4(const Configuration& config) if (memSpec == nullptr) SC_REPORT_FATAL("CheckerDDR4", "Wrong MemSpec chosen"); - lastScheduledByCommandAndBank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); - lastScheduledByCommandAndBankGroup = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->bankGroupsPerChannel, scMaxTime)); - lastScheduledByCommandAndRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndBankGroup = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->bankGroupsPerChannel, scMaxTime)); + lastScheduledByCommandAndRank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnBus = scMaxTime; - last4Activates = std::vector>(memSpec->ranksPerChannel); + last4Activates = ControllerVector>(memSpec->ranksPerChannel); tBURST = memSpec->defaultBurstLength / memSpec->dataRate * memSpec->tCK; tRDWR = memSpec->tRL + tBURST + memSpec->tCK - memSpec->tWL + memSpec->tWPRE; @@ -85,46 +86,46 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, const tlm_generic { assert(ControllerExtension::getBurstLength(payload) == 8); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD - memSpec->tAL); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_L); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_S); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_L); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_S); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); if (command == Command::RDA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE - memSpec->tRTP - memSpec->tAL); } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_L); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_S); @@ -132,11 +133,11 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_L); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_S); @@ -144,11 +145,11 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSDLL); } @@ -156,298 +157,298 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, const tlm_generic { assert(ControllerExtension::getBurstLength(payload) == 8); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD - memSpec->tAL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_L); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_S); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_L); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_S); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSDLL); } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD_L); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD_S); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tAL + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); } else if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tAL + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tAL + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tAL + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::REFAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tAL + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::PDEA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tACTPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::PDXA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); } else if (command == Command::PDEP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::PDXP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); } else if (command == Command::SREFEN) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tRDPDEN, memSpec->tAL + memSpec->tRTP + memSpec->tRP)); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRP)); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::SREFEX) { - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKESR); } @@ -469,17 +470,17 @@ void CheckerDDR4::insert(Command command, const tlm_generic_payload& payload) PRINTDEBUGMESSAGE("CheckerDDR4", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndBankGroup[command][bankGroup.ID()] = sc_time_stamp(); - lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); + lastScheduledByCommandAndBankGroup[command][bankGroup] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); lastCommandOnBus = sc_time_stamp(); if (command == Command::ACT) { - if (last4Activates[rank.ID()].size() == 4) - last4Activates[rank.ID()].pop(); - last4Activates[rank.ID()].push(sc_time_stamp()); + if (last4Activates[rank].size() == 4) + last4Activates[rank].pop(); + last4Activates[rank].push(sc_time_stamp()); } } diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerDDR4.h b/src/libdramsys/DRAMSys/controller/checker/CheckerDDR4.h index c48aad81..cde5690c 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerDDR4.h +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerDDR4.h @@ -57,14 +57,14 @@ public: private: const MemSpecDDR4 *memSpec; - std::vector> lastScheduledByCommandAndBank; - std::vector> lastScheduledByCommandAndBankGroup; - std::vector> lastScheduledByCommandAndRank; + std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndBankGroup; + std::vector> lastScheduledByCommandAndRank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnBus; // Four activate window - std::vector> last4Activates; + ControllerVector> last4Activates; const sc_core::sc_time scMaxTime = sc_core::sc_max_time(); sc_core::sc_time tBURST; diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5.cpp index f8320909..3b41577c 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5.cpp @@ -50,18 +50,19 @@ CheckerGDDR5::CheckerGDDR5(const Configuration& config) if (memSpec == nullptr) SC_REPORT_FATAL("CheckerGDDR5", "Wrong MemSpec chosen"); - lastScheduledByCommandAndBank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); - lastScheduledByCommandAndBankGroup = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->bankGroupsPerChannel, scMaxTime)); - lastScheduledByCommandAndRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndBankGroup = std::vector> + (Command::numberOfCommands(), + ControllerVector(memSpec->bankGroupsPerChannel, scMaxTime)); + lastScheduledByCommandAndRank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnBus = scMaxTime; - last4Activates = std::vector>(memSpec->ranksPerChannel); - last32Activates = std::vector>(memSpec->ranksPerChannel); + last4Activates = ControllerVector>(memSpec->ranksPerChannel); + last32Activates = ControllerVector>(memSpec->ranksPerChannel); - bankwiseRefreshCounter = std::vector(memSpec->ranksPerChannel); + bankwiseRefreshCounter = ControllerVector(memSpec->ranksPerChannel); tBURST = memSpec->defaultBurstLength / memSpec->dataRate * memSpec->tCK; tRDSRE = memSpec->tCL + memSpec->tWCK2CKPIN + memSpec->tWCK2CK + memSpec->tWCK2DQO + tBURST; @@ -86,70 +87,70 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, const tlm_generi { assert(ControllerExtension::getBurstLength(payload) == 8); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDRD); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); if (command == Command::RDA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE - memSpec->tRTP); } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_L); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_S); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_L); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_S); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tLK); } @@ -157,378 +158,378 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, const tlm_generi { assert(ControllerExtension::getBurstLength(payload) == 8); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDWR); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tLK); } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); - if (last32Activates[rank.ID()].size() >= 32) - earliestTimeToStart = std::max(earliestTimeToStart, last32Activates[rank.ID()].front() + memSpec->t32AW); + if (last32Activates[rank].size() >= 32) + earliestTimeToStart = std::max(earliestTimeToStart, last32Activates[rank].front() + memSpec->t32AW); } else if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN); } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); } else if (command == Command::REFAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::REFPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) { - if (bankwiseRefreshCounter[rank.ID()] == 0) + if (bankwiseRefreshCounter[rank] == 0) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); } - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); - if (last32Activates[rank.ID()].size() >= 32) - earliestTimeToStart = std::max(earliestTimeToStart, last32Activates[rank.ID()].front() + memSpec->t32AW); + if (last32Activates[rank].size() >= 32) + earliestTimeToStart = std::max(earliestTimeToStart, last32Activates[rank].front() + memSpec->t32AW); } else if (command == Command::PDEA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN); } else if (command == Command::PDXA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); } else if (command == Command::PDEP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::PDXP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); } else if (command == Command::SREFEN) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(memSpec->tRTP + memSpec->tRP, tRDSRE)); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::SREFEX) { - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } @@ -551,25 +552,25 @@ void CheckerGDDR5::insert(Command command, const tlm_generic_payload& payload) PRINTDEBUGMESSAGE("CheckerGDDR5", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndBankGroup[command][bankGroup.ID()] = sc_time_stamp(); - lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); + lastScheduledByCommandAndBankGroup[command][bankGroup] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); lastCommandOnBus = sc_time_stamp(); if (command == Command::ACT || command == Command::REFPB) { - if (last4Activates[rank.ID()].size() == 4) - last4Activates[rank.ID()].pop(); - last4Activates[rank.ID()].push(lastCommandOnBus); + if (last4Activates[rank].size() == 4) + last4Activates[rank].pop(); + last4Activates[rank].push(lastCommandOnBus); - if (last32Activates[rank.ID()].size() == 32) - last32Activates[rank.ID()].pop(); - last32Activates[rank.ID()].push(lastCommandOnBus); + if (last32Activates[rank].size() == 32) + last32Activates[rank].pop(); + last32Activates[rank].push(lastCommandOnBus); } if (command == Command::REFPB) - bankwiseRefreshCounter[rank.ID()] = (bankwiseRefreshCounter[rank.ID()] + 1) % memSpec->banksPerRank; + bankwiseRefreshCounter[rank] = (bankwiseRefreshCounter[rank] + 1) % memSpec->banksPerRank; } } // namespace DRAMSys diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5.h b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5.h index 61067704..59e965ba 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5.h +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5.h @@ -55,18 +55,18 @@ public: private: const MemSpecGDDR5 *memSpec; - std::vector> lastScheduledByCommandAndBank; - std::vector> lastScheduledByCommandAndBankGroup; - std::vector> lastScheduledByCommandAndRank; + std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndBankGroup; + std::vector> lastScheduledByCommandAndRank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnBus; // 4 and 32 activate window - std::vector> last4Activates; - std::vector> last32Activates; + ControllerVector> last4Activates; + ControllerVector> last32Activates; - std::vector bankwiseRefreshCounter; + ControllerVector bankwiseRefreshCounter; const sc_core::sc_time scMaxTime = sc_core::sc_max_time(); sc_core::sc_time tBURST; From ba3f3676760439e7daaa20aed68d0df77d25f1fe Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Wed, 21 Jun 2023 12:59:26 +0200 Subject: [PATCH 07/28] Use type safe index vectors in timing checkers (2/2). --- .../controller/checker/CheckerDDR5.cpp | 423 +++++++++--------- .../DRAMSys/controller/checker/CheckerDDR5.h | 28 +- .../controller/checker/CheckerHBM3.cpp | 306 ++++++------- .../DRAMSys/controller/checker/CheckerHBM3.h | 10 +- .../controller/checker/CheckerLPDDR5.cpp | 272 +++++------ .../controller/checker/CheckerLPDDR5.h | 14 +- .../DRAMSys/common/dramExtensions.h | 43 ++ .../controller/checker/CheckerGDDR5X.cpp | 257 +++++------ .../controller/checker/CheckerGDDR5X.h | 12 +- .../controller/checker/CheckerGDDR6.cpp | 255 +++++------ .../DRAMSys/controller/checker/CheckerGDDR6.h | 10 +- .../controller/checker/CheckerHBM2.cpp | 147 +++--- .../DRAMSys/controller/checker/CheckerHBM2.h | 10 +- .../controller/checker/CheckerLPDDR4.cpp | 218 ++++----- .../controller/checker/CheckerLPDDR4.h | 6 +- .../controller/checker/CheckerSTTMRAM.cpp | 152 +++---- .../controller/checker/CheckerSTTMRAM.h | 6 +- .../controller/checker/CheckerWideIO.cpp | 164 +++---- .../controller/checker/CheckerWideIO.h | 6 +- .../controller/checker/CheckerWideIO2.cpp | 204 ++++----- .../controller/checker/CheckerWideIO2.h | 6 +- 21 files changed, 1301 insertions(+), 1248 deletions(-) diff --git a/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.cpp b/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.cpp index 32b49f73..6092a53e 100644 --- a/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.cpp +++ b/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.cpp @@ -50,40 +50,43 @@ CheckerDDR5::CheckerDDR5(const Configuration& config) if (memSpec == nullptr) SC_REPORT_FATAL("CheckerDDR5", "Wrong MemSpec chosen"); - lastScheduledByCommandAndDimmRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->dimmRanksPerChannel, scMaxTime)); - lastScheduledByCommandAndPhysicalRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->physicalRanksPerChannel, scMaxTime)); - lastScheduledByCommandAndLogicalRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->logicalRanksPerChannel, scMaxTime)); - lastScheduledByCommandAndBankGroup = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->bankGroupsPerChannel, scMaxTime)); - lastScheduledByCommandAndBank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndDimmRank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->dimmRanksPerChannel, scMaxTime)); + lastScheduledByCommandAndPhysicalRank = std::vector> + (Command::numberOfCommands(), + ControllerVector(memSpec->physicalRanksPerChannel, scMaxTime)); + lastScheduledByCommandAndLogicalRank = std::vector> + (Command::numberOfCommands(), + ControllerVector(memSpec->logicalRanksPerChannel, scMaxTime)); + lastScheduledByCommandAndBankGroup = std::vector> + (Command::numberOfCommands(), + ControllerVector(memSpec->bankGroupsPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); // Required for Same Bank Refresh - lastScheduledByCommandAndBankInGroup = std::vector>(Command::numberOfCommands(), - std::vector(memSpec->ranksPerChannel * memSpec->banksPerGroup, scMaxTime)); + lastScheduledByCommandAndBankInGroup = std::vector>(Command::numberOfCommands(), + ControllerVector(memSpec->ranksPerChannel * memSpec->banksPerGroup, scMaxTime)); lastCommandOnBus = scMaxTime; dummyCommandOnBus.start = scMaxTime; dummyCommandOnBus.end = scMaxTime; - last4ActivatesLogical = std::vector>(memSpec->logicalRanksPerChannel); - last4ActivatesPhysical = std::vector>(memSpec->physicalRanksPerChannel); + last4ActivatesLogical = ControllerVector>(memSpec->logicalRanksPerChannel); + last4ActivatesPhysical = ControllerVector>(memSpec->physicalRanksPerChannel); - lastBurstLengthByCommandAndDimmRank = std::vector> - (Command::WRA + 1, std::vector(memSpec->dimmRanksPerChannel)); - lastBurstLengthByCommandAndPhysicalRank = std::vector> - (Command::WRA + 1, std::vector(memSpec->physicalRanksPerChannel)); - lastBurstLengthByCommandAndLogicalRank = std::vector> - (Command::WRA + 1, std::vector(memSpec->logicalRanksPerChannel)); - lastBurstLengthByCommandAndBankGroup = std::vector> - (Command::WRA + 1, std::vector(memSpec->bankGroupsPerChannel)); - lastBurstLengthByCommandAndBank = std::vector> - (Command::WRA + 1, std::vector(memSpec->banksPerChannel)); + lastBurstLengthByCommandAndDimmRank = std::vector> + (Command::WRA + 1, ControllerVector(memSpec->dimmRanksPerChannel)); + lastBurstLengthByCommandAndPhysicalRank = std::vector> + (Command::WRA + 1, ControllerVector(memSpec->physicalRanksPerChannel)); + lastBurstLengthByCommandAndLogicalRank = std::vector> + (Command::WRA + 1, ControllerVector(memSpec->logicalRanksPerChannel)); + lastBurstLengthByCommandAndBankGroup = std::vector> + (Command::WRA + 1, ControllerVector(memSpec->bankGroupsPerChannel)); + lastBurstLengthByCommandAndBank = std::vector> + (Command::WRA + 1, ControllerVector(memSpec->banksPerChannel)); lastBurstLengthByCommand = std::vector(Command::WRA + 1); - lastBurstLengthByCommandAndBankInGroup = std::vector> - (Command::WRA + 1, std::vector(memSpec->ranksPerChannel * memSpec->banksPerGroup)); + lastBurstLengthByCommandAndBankInGroup = std::vector> + (Command::WRA + 1, ControllerVector(memSpec->ranksPerChannel * memSpec->banksPerGroup)); cmdLengthDiff = memSpec->cmdMode * memSpec->tCK; @@ -123,9 +126,9 @@ CheckerDDR5::CheckerDDR5(const Configuration& config) sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic_payload& payload) const { - Rank logicalRank = ControllerExtension::getRank(payload); - Rank physicalRank = Rank(logicalRank.ID() / memSpec->logicalRanksPerPhysicalRank); - Rank dimmRank = Rank(physicalRank.ID() / memSpec->physicalRanksPerDimmRank); + LogicalRank logicalRank(ControllerExtension::getRank(payload).ID()); + PhysicalRank physicalRank(logicalRank.ID() / memSpec->logicalRanksPerPhysicalRank); + DimmRank dimmRank(physicalRank.ID() / memSpec->physicalRanksPerDimmRank); BankGroup bankGroup = ControllerExtension::getBankGroup(payload); Bank bank = ControllerExtension::getBank(payload); Bank bankInGroup = Bank(logicalRank.ID() * memSpec->banksPerGroup + bank.ID() % memSpec->banksPerGroup); @@ -140,37 +143,37 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic assert(!(burstLength == 32) || (memSpec->bitWidth == 4)); assert(burstLength <= memSpec->maxBurstLength); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_L_slr); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_M_slr); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RD][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RD][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_S_slr); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndPhysicalRank[Command::RD][physicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndPhysicalRank[Command::RD][physicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST32); earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_dlr); } lastCommandStart = lastScheduledByCommand[Command::RD]; - if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank.ID()]) // different physical rank + if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank]) // different physical rank { - if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RD][dimmRank.ID()]) // same DIMM + if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RD][dimmRank]) // same DIMM { - if (lastBurstLengthByCommandAndDimmRank[Command::RD][dimmRank.ID()] == 32) + if (lastBurstLengthByCommandAndDimmRank[Command::RD][dimmRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDRD_dpr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDRD_dpr); @@ -184,29 +187,29 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_M_slr); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RDA][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RDA][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_S_slr); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndPhysicalRank[Command::RDA][physicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndPhysicalRank[Command::RDA][physicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST32); earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_dlr); } lastCommandStart = lastScheduledByCommand[Command::RDA]; - if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank.ID()]) // different physical rank + if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank]) // different physical rank { - if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RDA][dimmRank.ID()]) // same DIMM + if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RDA][dimmRank]) // same DIMM { - if (lastBurstLengthByCommandAndDimmRank[Command::RDA][dimmRank.ID()] == 32) + if (lastBurstLengthByCommandAndDimmRank[Command::RDA][dimmRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDRD_dpr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDRD_dpr); @@ -222,58 +225,58 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic if (command == Command::RDA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::WR][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::WR][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDA + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDA); } } - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::WR][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::WR][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_WTR_slr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_WTR_slr); } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_M_WTR_slr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_M_WTR_slr); } - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WR][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WR][logicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndLogicalRank[Command::WR][logicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndLogicalRank[Command::WR][logicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_WTR_slr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_WTR_slr); } - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndPhysicalRank[Command::WR][physicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndPhysicalRank[Command::WR][physicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_WTR_dlr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_WTR_dlr); } lastCommandStart = lastScheduledByCommand[Command::WR]; - if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank.ID()]) // different physical rank + if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank]) // different physical rank { - if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WR][dimmRank.ID()]) // same DIMM + if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WR][dimmRank]) // same DIMM { - if (lastBurstLengthByCommandAndDimmRank[Command::WR][dimmRank.ID()] == 32) + if (lastBurstLengthByCommandAndDimmRank[Command::WR][dimmRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_dpr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_dpr); @@ -287,39 +290,39 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_M_WTR_slr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_M_WTR_slr); } - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndLogicalRank[Command::WRA][logicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndLogicalRank[Command::WRA][logicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_WTR_slr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_WTR_slr); } - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndPhysicalRank[Command::WRA][physicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndPhysicalRank[Command::WRA][physicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_WTR_dlr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_WTR_dlr); } lastCommandStart = lastScheduledByCommand[Command::WRA]; - if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank.ID()]) // different physical rank + if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank]) // different physical rank { - if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WRA][dimmRank.ID()]) // same DIMM + if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WRA][dimmRank]) // same DIMM { - if (lastBurstLengthByCommandAndDimmRank[Command::WRA][dimmRank.ID()] == 32) + if (lastBurstLengthByCommandAndDimmRank[Command::WRA][dimmRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_dpr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_dpr); @@ -340,43 +343,43 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic assert(!(burstLength == 32) || (memSpec->bitWidth == 4)); assert(burstLength <= memSpec->maxBurstLength); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::RD][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::RD][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_RTW_slr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_RTW_slr); } - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RD][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RD][logicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndLogicalRank[Command::RD][logicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndLogicalRank[Command::RD][logicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_RTW_slr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_RTW_slr); } - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndPhysicalRank[Command::RD][physicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndPhysicalRank[Command::RD][physicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_RTW_dlr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_RTW_dlr); } lastCommandStart = lastScheduledByCommand[Command::RD]; - if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank.ID()]) // different physical rank + if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank]) // different physical rank { - if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RD][dimmRank.ID()]) // same DIMM + if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RD][dimmRank]) // same DIMM { - if (lastBurstLengthByCommandAndDimmRank[Command::RD][dimmRank.ID()] == 32) + if (lastBurstLengthByCommandAndDimmRank[Command::RD][dimmRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_dpr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_dpr); @@ -390,39 +393,39 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::RDA][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::RDA][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_RTW_slr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_RTW_slr); } - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RDA][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RDA][logicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndLogicalRank[Command::RDA][logicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndLogicalRank[Command::RDA][logicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_RTW_slr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_RTW_slr); } - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndPhysicalRank[Command::RDA][physicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndPhysicalRank[Command::RDA][physicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_RTW_dlr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_RTW_dlr); } lastCommandStart = lastScheduledByCommand[Command::RDA]; - if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank.ID()]) // different physical rank + if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank]) // different physical rank { - if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RDA][dimmRank.ID()]) // same DIMM + if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RDA][dimmRank]) // same DIMM { - if (lastBurstLengthByCommandAndDimmRank[Command::RDA][dimmRank.ID()] == 32) + if (lastBurstLengthByCommandAndDimmRank[Command::RDA][dimmRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_dpr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_dpr); @@ -438,10 +441,10 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic if (burstLength == 16 && memSpec->bitWidth == 4) // second WR requires RMW { - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::WR][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::WR][bank] == 32) { earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST16 + memSpec->tCCD_L_WR_slr); } @@ -451,10 +454,10 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; - if (lastCommandStart != lastScheduledByCommandAndBank[Command::WR][bank.ID()]) // different bank + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; + if (lastCommandStart != lastScheduledByCommandAndBank[Command::WR][bank]) // different bank { - if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup] == 32) { earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST16 + memSpec->tCCD_M_WR_slr); } @@ -466,10 +469,10 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } else // no RMW { - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup] == 32) { earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST16 + memSpec->tCCD_L_WR2_slr); } @@ -480,25 +483,25 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } } - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WR][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WR][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_S_WR_slr); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndPhysicalRank[Command::WR][physicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndPhysicalRank[Command::WR][physicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST32); earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_WR_dlr); } lastCommandStart = lastScheduledByCommand[Command::WR]; - if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank.ID()]) // different physical rank + if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank]) // different physical rank { - if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WR][dimmRank.ID()]) // same DIMM + if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WR][dimmRank]) // same DIMM { - if (lastBurstLengthByCommandAndDimmRank[Command::WR][dimmRank.ID()] == 32) + if (lastBurstLengthByCommandAndDimmRank[Command::WR][dimmRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRWR_dpr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRWR_dpr); @@ -514,10 +517,10 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic if (burstLength == 16 && memSpec->bitWidth == 4) // second WR requires RMW { - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup] == 32) { earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST16 + memSpec->tCCD_M_WR_slr); } @@ -529,10 +532,10 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } else // no RMW { - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup] == 32) { earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST16 + memSpec->tCCD_L_WR2_slr); } @@ -543,25 +546,25 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } } - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_S_WR_slr); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndPhysicalRank[Command::WRA][physicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndPhysicalRank[Command::WRA][physicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST32); earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_WR_dlr); } lastCommandStart = lastScheduledByCommand[Command::WRA]; - if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank.ID()]) // different physical rank + if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank]) // different physical rank { - if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WRA][dimmRank.ID()]) // same DIMM + if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WRA][dimmRank]) // same DIMM { - if (lastBurstLengthByCommandAndDimmRank[Command::WRA][dimmRank.ID()] == 32) + if (lastBurstLengthByCommandAndDimmRank[Command::WRA][dimmRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRWR_dpr + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRWR_dpr); @@ -577,159 +580,159 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD_L_slr); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD_S_slr); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::ACT][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::ACT][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD_dlr); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDAACT); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::WRA][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::WRA][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAACT + tBURST16); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAACT); } - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREAB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREAB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PRESB][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PRESB][bankInGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr - cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMAB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMAB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr - cmdLengthDiff); // TODO: No tRFC_dlr and tRFC_dpr between REFAB and ACT? - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::REFSB][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::REFSB][bankInGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCsb_slr - cmdLengthDiff); // TODO: No tRFCsb_dlr between REFSB and ACT? - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFSB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFSB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFSBRD_slr - cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFSB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFSB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFSBRD_dlr - cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RFMSB][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RFMSB][bankInGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCsb_slr - cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMSB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMSB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFSBRD_slr - cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMSB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMSB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFSBRD_dlr - cmdLengthDiff); - if (last4ActivatesLogical[logicalRank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesLogical[logicalRank.ID()].front() + if (last4ActivatesLogical[logicalRank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesLogical[logicalRank].front() + memSpec->tFAW_slr - memSpec->longCmdOffset); - if (last4ActivatesPhysical[physicalRank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesPhysical[physicalRank.ID()].front() + if (last4ActivatesPhysical[physicalRank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesPhysical[physicalRank].front() + memSpec->tFAW_dlr - memSpec->longCmdOffset); } else if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::WR][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::WR][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + tBURST16 + cmdLengthDiff); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + cmdLengthDiff); } - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREAB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREAB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PRESB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PRESB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RD][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RD][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RDA][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RDA][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WR][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WR][logicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndLogicalRank[Command::WR][logicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndLogicalRank[Command::WR][logicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + tBURST16 + cmdLengthDiff); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + cmdLengthDiff); } - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndLogicalRank[Command::WRA][logicalRank.ID()]) + if (lastBurstLengthByCommandAndLogicalRank[Command::WRA][logicalRank]) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + tBURST16 + cmdLengthDiff); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + cmdLengthDiff); } - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREAB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREAB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); @@ -737,94 +740,94 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::PRESB) { - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::ACT][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::ACT][bankInGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RD][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RD][bankInGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RDA][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RDA][bankInGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::WR][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::WR][bankInGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankInGroup[Command::WR][bankInGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankInGroup[Command::WR][bankInGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + tBURST16 + cmdLengthDiff); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + cmdLengthDiff); } - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::WRA][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::WRA][bankInGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankInGroup[Command::WRA][bankInGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankInGroup[Command::WRA][bankInGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + tBURST16 + cmdLengthDiff); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + cmdLengthDiff); } - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); // PREA tRP - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PRESB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PRESB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); } else if (command == Command::REFAB || command == Command::RFMAB) { - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDAACT + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndLogicalRank[Command::WRA][logicalRank.ID()] == 32) + if (lastBurstLengthByCommandAndLogicalRank[Command::WRA][logicalRank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + tBURST16 + memSpec->tRP + cmdLengthDiff); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP + cmdLengthDiff); } - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREPB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREPB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREAB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREAB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFAB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFAB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dlr); - lastCommandStart = lastScheduledByCommandAndDimmRank[Command::REFAB][dimmRank.ID()]; + lastCommandStart = lastScheduledByCommandAndDimmRank[Command::REFAB][dimmRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dpr); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMAB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMAB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMAB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMAB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dlr); - lastCommandStart = lastScheduledByCommandAndDimmRank[Command::RFMAB][dimmRank.ID()]; + lastCommandStart = lastScheduledByCommandAndDimmRank[Command::RFMAB][dimmRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dpr); @@ -833,87 +836,87 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::REFSB || command == Command::RFMSB) { - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::ACT][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::ACT][bankInGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD_L_slr + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RDA][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RDA][bankInGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDAACT + cmdLengthDiff); - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::WRA][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::WRA][bankInGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankInGroup[Command::WRA][bankInGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankInGroup[Command::WRA][bankInGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAACT + tBURST16 + cmdLengthDiff); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAACT + cmdLengthDiff); } - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PREPB][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PREPB][bankInGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); // PREA tRP - lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PRESB][bankInGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PRESB][bankInGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr); // TODO: check this - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFAB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFAB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dlr); // TODO: check this - lastCommandStart = lastScheduledByCommandAndDimmRank[Command::REFAB][dimmRank.ID()]; + lastCommandStart = lastScheduledByCommandAndDimmRank[Command::REFAB][dimmRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dpr); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMAB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMAB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr); // TODO: check this - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMAB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMAB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dlr); // TODO: check this - lastCommandStart = lastScheduledByCommandAndDimmRank[Command::RFMAB][dimmRank.ID()]; + lastCommandStart = lastScheduledByCommandAndDimmRank[Command::RFMAB][dimmRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dpr); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFSB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFSB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCsb_slr); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFSB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFSB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCsb_dlr); - lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMSB][logicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMSB][logicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCsb_slr); - lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMSB][physicalRank.ID()]; + lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMSB][physicalRank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCsb_dlr); - if (last4ActivatesLogical[logicalRank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesLogical[logicalRank.ID()].front() + if (last4ActivatesLogical[logicalRank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesLogical[logicalRank].front() + memSpec->tFAW_slr - memSpec->shortCmdOffset); - if (last4ActivatesPhysical[physicalRank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesPhysical[physicalRank.ID()].front() + if (last4ActivatesPhysical[physicalRank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesPhysical[physicalRank].front() + memSpec->tFAW_dlr - memSpec->shortCmdOffset); } else @@ -935,9 +938,9 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic void CheckerDDR5::insert(Command command, const tlm_generic_payload& payload) { - Rank logicalRank = ControllerExtension::getRank(payload); - Rank physicalRank = Rank(logicalRank.ID() / memSpec->logicalRanksPerPhysicalRank); - Rank dimmRank = Rank(physicalRank.ID() / memSpec->physicalRanksPerDimmRank); + LogicalRank logicalRank(ControllerExtension::getRank(payload).ID()); + PhysicalRank physicalRank(logicalRank.ID() / memSpec->logicalRanksPerPhysicalRank); + DimmRank dimmRank(physicalRank.ID() / memSpec->physicalRanksPerDimmRank); BankGroup bankGroup = ControllerExtension::getBankGroup(payload); Bank bank = ControllerExtension::getBank(payload); Bank bankInGroup = Bank(logicalRank.ID() * memSpec->banksPerGroup + bank.ID() % memSpec->banksPerGroup); @@ -946,23 +949,23 @@ void CheckerDDR5::insert(Command command, const tlm_generic_payload& payload) PRINTDEBUGMESSAGE("CheckerDDR5", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndDimmRank[command][dimmRank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndPhysicalRank[command][physicalRank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndLogicalRank[command][logicalRank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndBankGroup[command][bankGroup.ID()] = sc_time_stamp(); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndDimmRank[command][dimmRank] = sc_time_stamp(); + lastScheduledByCommandAndPhysicalRank[command][physicalRank] = sc_time_stamp(); + lastScheduledByCommandAndLogicalRank[command][logicalRank] = sc_time_stamp(); + lastScheduledByCommandAndBankGroup[command][bankGroup] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); - lastScheduledByCommandAndBankInGroup[command][bankInGroup.ID()] = sc_time_stamp(); + lastScheduledByCommandAndBankInGroup[command][bankInGroup] = sc_time_stamp(); if (command.isCasCommand()) { - lastBurstLengthByCommandAndDimmRank[command][dimmRank.ID()] = burstLength; - lastBurstLengthByCommandAndPhysicalRank[command ][physicalRank.ID()] = burstLength; - lastBurstLengthByCommandAndLogicalRank[command][logicalRank.ID()] = burstLength; - lastBurstLengthByCommandAndBankGroup[command][bankGroup.ID()] = burstLength; - lastBurstLengthByCommandAndBank[command][bank.ID()] = burstLength; + lastBurstLengthByCommandAndDimmRank[command][dimmRank] = burstLength; + lastBurstLengthByCommandAndPhysicalRank[command ][physicalRank] = burstLength; + lastBurstLengthByCommandAndLogicalRank[command][logicalRank] = burstLength; + lastBurstLengthByCommandAndBankGroup[command][bankGroup] = burstLength; + lastBurstLengthByCommandAndBank[command][bank] = burstLength; lastBurstLengthByCommand[command] = burstLength; - lastBurstLengthByCommandAndBankInGroup[command][bankInGroup.ID()] = burstLength; + lastBurstLengthByCommandAndBankInGroup[command][bankInGroup] = burstLength; if (burstLength == 32) { @@ -975,13 +978,13 @@ void CheckerDDR5::insert(Command command, const tlm_generic_payload& payload) if (command == Command::ACT || command == Command::REFSB || command == Command::RFMSB) { - if (last4ActivatesLogical[logicalRank.ID()].size() == 4) - last4ActivatesLogical[logicalRank.ID()].pop(); - last4ActivatesLogical[logicalRank.ID()].push(lastCommandOnBus); + if (last4ActivatesLogical[logicalRank].size() == 4) + last4ActivatesLogical[logicalRank].pop(); + last4ActivatesLogical[logicalRank].push(lastCommandOnBus); - if (last4ActivatesPhysical[physicalRank.ID()].size() == 4) - last4ActivatesPhysical[physicalRank.ID()].pop(); - last4ActivatesPhysical[physicalRank.ID()].push(lastCommandOnBus); + if (last4ActivatesPhysical[physicalRank].size() == 4) + last4ActivatesPhysical[physicalRank].pop(); + last4ActivatesPhysical[physicalRank].push(lastCommandOnBus); } } diff --git a/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.h b/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.h index 96ca9291..db0c3144 100644 --- a/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.h +++ b/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.h @@ -57,28 +57,28 @@ public: private: const MemSpecDDR5 *memSpec; - std::vector> lastScheduledByCommandAndDimmRank; - std::vector> lastScheduledByCommandAndPhysicalRank; - std::vector> lastScheduledByCommandAndLogicalRank; - std::vector> lastScheduledByCommandAndBankGroup; - std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndDimmRank; + std::vector> lastScheduledByCommandAndPhysicalRank; + std::vector> lastScheduledByCommandAndLogicalRank; + std::vector> lastScheduledByCommandAndBankGroup; + std::vector> lastScheduledByCommandAndBank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnBus; TimeInterval dummyCommandOnBus; - std::vector> lastScheduledByCommandAndBankInGroup; + std::vector> lastScheduledByCommandAndBankInGroup; - std::vector> last4ActivatesPhysical; - std::vector> last4ActivatesLogical; + ControllerVector> last4ActivatesPhysical; + ControllerVector> last4ActivatesLogical; - std::vector> lastBurstLengthByCommandAndDimmRank; - std::vector> lastBurstLengthByCommandAndPhysicalRank; - std::vector> lastBurstLengthByCommandAndLogicalRank; - std::vector> lastBurstLengthByCommandAndBankGroup; - std::vector> lastBurstLengthByCommandAndBank; + std::vector> lastBurstLengthByCommandAndDimmRank; + std::vector> lastBurstLengthByCommandAndPhysicalRank; + std::vector> lastBurstLengthByCommandAndLogicalRank; + std::vector> lastBurstLengthByCommandAndBankGroup; + std::vector> lastBurstLengthByCommandAndBank; std::vector lastBurstLengthByCommand; - std::vector> lastBurstLengthByCommandAndBankInGroup; + std::vector> lastBurstLengthByCommandAndBankInGroup; // TODO: store BL of last RD and WR globally or for each hierarchy? diff --git a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp index 8327953f..c4d578cf 100644 --- a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp +++ b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp @@ -50,18 +50,18 @@ CheckerHBM3::CheckerHBM3(const Configuration &config) if (memSpec == nullptr) SC_REPORT_FATAL("CheckerHBM3", "Wrong MemSpec chosen"); - lastScheduledByCommandAndBank = std::vector>( - Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); - lastScheduledByCommandAndBankGroup = std::vector>( - Command::numberOfCommands(), std::vector(memSpec->bankGroupsPerChannel, scMaxTime)); - lastScheduledByCommandAndRank = std::vector>( - Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector>( + Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndBankGroup = std::vector>( + Command::numberOfCommands(), ControllerVector(memSpec->bankGroupsPerChannel, scMaxTime)); + lastScheduledByCommandAndRank = std::vector>( + Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnRasBus = scMaxTime; lastCommandOnCasBus = scMaxTime; - last4Activates = std::vector>(memSpec->ranksPerChannel); + last4Activates = ControllerVector>(memSpec->ranksPerChannel); - bankwiseRefreshCounter = std::vector(memSpec->ranksPerChannel); + bankwiseRefreshCounter = ControllerVector(memSpec->ranksPerChannel); tRDPDE = memSpec->tRL + memSpec->tPL + 2 * memSpec->tCK; tRDSRE = memSpec->tRL + memSpec->tPL + 3 * memSpec->tCK; @@ -83,27 +83,27 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); @@ -111,43 +111,43 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::RD) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDRD + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); @@ -155,35 +155,35 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::WR) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDWR + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); @@ -191,48 +191,48 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::RDA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDRD + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + 2 * memSpec->tCK + std::max(memSpec->tWR - memSpec->tRTP, memSpec->tWTRL)); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); @@ -240,35 +240,35 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::WRA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDWR + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); @@ -276,124 +276,124 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::REFPB][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::REFPB][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RFMPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RFMPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS - memSpec->tCK); - if (last4Activates[rank.ID()].size() >= 4) + if (last4Activates[rank].size() >= 4) earliestTimeToStart = - std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::REFAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); @@ -401,39 +401,39 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); @@ -441,120 +441,120 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::REFPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndBank[Command::RFMPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RFMPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) { - if (bankwiseRefreshCounter[rank.ID()] == 0) + if (bankwiseRefreshCounter[rank] == 0) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); } - if (last4Activates[rank.ID()].size() >= 4) + if (last4Activates[rank].size() >= 4) earliestTimeToStart = - std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::SREFEN) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(memSpec->tRTP + memSpec->tRP, tRDSRE)); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); @@ -562,23 +562,23 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::RFMAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); @@ -586,39 +586,39 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::RFMAB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndBank[Command::RFMPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RFMPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); @@ -626,23 +626,23 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::PDEA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); @@ -650,23 +650,23 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::PDEP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); @@ -674,7 +674,7 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::PDXP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); @@ -682,7 +682,7 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::PDXA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); @@ -690,7 +690,7 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::SREFEX) { - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKESR); @@ -717,9 +717,9 @@ void CheckerHBM3::insert(Command command, const tlm_generic_payload &payload) PRINTDEBUGMESSAGE("CheckerHBM3", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndBankGroup[command][bankGroup.ID()] = sc_time_stamp(); - lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); + lastScheduledByCommandAndBankGroup[command][bankGroup] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); if (command.isCasCommand()) @@ -731,13 +731,13 @@ void CheckerHBM3::insert(Command command, const tlm_generic_payload &payload) if (command == Command::ACT || command == Command::REFPB) { - if (last4Activates[rank.ID()].size() == 4) - last4Activates[rank.ID()].pop(); - last4Activates[rank.ID()].push(lastCommandOnRasBus); + if (last4Activates[rank].size() == 4) + last4Activates[rank].pop(); + last4Activates[rank].push(lastCommandOnRasBus); } if (command == Command::REFPB) - bankwiseRefreshCounter[rank.ID()] = (bankwiseRefreshCounter[rank.ID()] + 1) % memSpec->banksPerRank; + bankwiseRefreshCounter[rank] = (bankwiseRefreshCounter[rank] + 1) % memSpec->banksPerRank; } bool CheckerHBM3::isFullCycle(const sc_core::sc_time& time) const diff --git a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.h b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.h index 679b2aa5..979418a9 100644 --- a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.h +++ b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.h @@ -60,17 +60,17 @@ private: const MemSpecHBM3 *memSpec; - std::vector> lastScheduledByCommandAndBank; - std::vector> lastScheduledByCommandAndBankGroup; - std::vector> lastScheduledByCommandAndRank; + std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndBankGroup; + std::vector> lastScheduledByCommandAndRank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnRasBus; sc_core::sc_time lastCommandOnCasBus; // Four activate window - std::vector> last4Activates; - std::vector bankwiseRefreshCounter; + ControllerVector> last4Activates; + ControllerVector bankwiseRefreshCounter; const sc_core::sc_time scMaxTime = sc_core::sc_max_time(); sc_core::sc_time tRDPDE; diff --git a/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp b/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp index 81246e92..fa6a59ac 100644 --- a/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp +++ b/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp @@ -51,23 +51,24 @@ CheckerLPDDR5::CheckerLPDDR5(const Configuration& config) SC_REPORT_FATAL("CheckerLPDDR5", "Wrong MemSpec chosen"); else { - lastScheduledByCommandAndRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime)); - lastScheduledByCommandAndBankGroup = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->bankGroupsPerChannel, scMaxTime)); - lastScheduledByCommandAndBank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndRank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime)); + lastScheduledByCommandAndBankGroup = std::vector> + (Command::numberOfCommands(), + ControllerVector(memSpec->bankGroupsPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnBus = scMaxTime; - last4Activates = std::vector>(memSpec->ranksPerChannel); + last4Activates = ControllerVector>(memSpec->ranksPerChannel); - lastBurstLengthByCommandAndRank = std::vector> - (Command::WRA + 1, std::vector(memSpec->ranksPerChannel)); - lastBurstLengthByCommandAndBankGroup = std::vector> - (Command::WRA + 1, std::vector(memSpec->bankGroupsPerChannel)); - lastBurstLengthByCommandAndBank = std::vector> - (Command::WRA + 1, std::vector(memSpec->banksPerChannel)); + lastBurstLengthByCommandAndRank = std::vector> + (Command::WRA + 1, ControllerVector(memSpec->ranksPerChannel)); + lastBurstLengthByCommandAndBankGroup = std::vector> + (Command::WRA + 1, ControllerVector(memSpec->bankGroupsPerChannel)); + lastBurstLengthByCommandAndBank = std::vector> + (Command::WRA + 1, ControllerVector(memSpec->banksPerChannel)); lastBurstLengthByCommand = std::vector(Command::WRA + 1); tBURST16 = 16 / memSpec->dataRate * memSpec->tCK; @@ -92,23 +93,23 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener assert(!(memSpec->bankMode == MemSpecLPDDR5::BankMode::MBG) || (memSpec->dataRate == 8)); // BG mode -> 4:1 ratio assert(burstLength <= memSpec->maxBurstLength); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD_L + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::RD][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::RD][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_32); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_16); } - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::RD][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::RD][rank] == 32) { // TODO: model BG mode BL32 interleaved burst, remove this fix if (memSpec->bankMode == MemSpecLPDDR5::BankMode::MBG) @@ -120,7 +121,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_S_16); } - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) { @@ -132,19 +133,19 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tCK + memSpec->tRPST + memSpec->tRPRE); } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::RDA][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::RDA][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_32); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_16); } - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::RDA][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::RDA][rank] == 32) { // TODO: model BG mode BL32 interleaved burst, remove this fix if (memSpec->bankMode == MemSpecLPDDR5::BankMode::MBG) @@ -156,7 +157,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_S_16); } - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) { @@ -169,10 +170,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tCK + memSpec->tRPST + memSpec->tRPRE); } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_max_32 + memSpec->tWTR_L); else @@ -180,10 +181,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_max_16 + memSpec->tWTR_L); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::WR][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::WR][rank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_min_32 + memSpec->tWTR_S); else @@ -191,7 +192,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tWTR_S); } - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) { @@ -204,10 +205,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tWL + memSpec->BL_n_min_16 + memSpec->tCK - memSpec->tRL); } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_max_32 + memSpec->tWTR_L); else @@ -215,10 +216,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_max_16 + memSpec->tWTR_L); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::WRA][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::WRA][rank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_min_32 + memSpec->tWTR_S); else @@ -226,7 +227,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tWTR_S); } - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) { @@ -246,14 +247,14 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener assert(!(memSpec->bankMode == MemSpecLPDDR5::BankMode::MBG) || (memSpec->dataRate == 8)); // BG mode -> 4:1 ratio assert(burstLength <= memSpec->maxBurstLength); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD_S + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::RD][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::RD][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRL + memSpec->BL_n_max_32 + memSpec->tWCK2DQO - memSpec->tWL); else @@ -261,10 +262,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_max_16 + memSpec->tWCK2DQO - memSpec->tWL); } - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::RD][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::RD][rank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRL + memSpec->BL_n_min_32 + memSpec->tWCK2DQO - memSpec->tWL); else @@ -272,7 +273,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tWCK2DQO - memSpec->tWL); } - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) { @@ -285,10 +286,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tRL + memSpec->BL_n_min_16 + memSpec->tWCK2DQO + memSpec->tRPST - memSpec->tWL); } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::RDA][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::RDA][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRL + memSpec->BL_n_max_32 + memSpec->tWCK2DQO - memSpec->tWL); else @@ -296,10 +297,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_max_16 + memSpec->tWCK2DQO - memSpec->tWL); } - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::RDA][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::RDA][rank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRL + memSpec->BL_n_min_32 + memSpec->tWCK2DQO - memSpec->tWL); else @@ -307,7 +308,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tWCK2DQO - memSpec->tWL); } - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) { @@ -320,19 +321,19 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tRL + memSpec->BL_n_min_16 + memSpec->tWCK2DQO + memSpec->tRPST - memSpec->tWL); } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_32); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_16); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::WR][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::WR][rank] == 32) { // TODO: model BG mode BL32 interleaved burst, remove this fix if (memSpec->bankMode == MemSpecLPDDR5::BankMode::MBG) @@ -344,7 +345,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_S_16); } - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) { @@ -355,19 +356,19 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_16 + memSpec->tCK); } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup.ID()] == 32) + if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_32); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_16); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::WRA][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::WRA][rank] == 32) { // TODO: model BG mode BL32 interleaved burst, remove this fix if (memSpec->bankMode == MemSpecLPDDR5::BankMode::MBG) @@ -379,7 +380,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_S_16); } - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) { @@ -391,18 +392,18 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::RDA][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::RDA][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32 + memSpec->tRBTP + memSpec->tRPpb - memSpec->tCK); else @@ -410,10 +411,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tRBTP + memSpec->tRPpb - memSpec->tCK); } - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::RDA][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::RDA][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb - memSpec->tCK); else @@ -421,47 +422,47 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb - memSpec->tCK); } - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tpbR2act - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFP2B][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFP2B][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tpbR2act - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFP2B][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFP2B][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb - memSpec->tCK); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW - memSpec->tCK); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW - memSpec->tCK); } else if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::RD][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::RD][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32 + memSpec->tRBTP); else @@ -469,10 +470,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tRBTP); } - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::WR][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::WR][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR); else @@ -480,20 +481,20 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR); } - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::RD][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::RD][rank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32 + memSpec->tRBTP); else @@ -501,10 +502,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tRBTP); } - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::RDA][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::RDA][rank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32 + memSpec->tRBTP); else @@ -512,10 +513,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tRBTP); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::WR][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::WR][rank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR); else @@ -523,10 +524,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::WRA][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::WRA][rank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR); else @@ -534,20 +535,20 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR); } - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); } else if (command == Command::REFAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::RDA][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::RDA][rank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32 + memSpec->tRBTP + memSpec->tRPpb); else @@ -555,10 +556,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tRBTP + memSpec->tRPpb); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndRank[Command::WRA][rank.ID()] == 32) + if (lastBurstLengthByCommandAndRank[Command::WRA][rank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb); else @@ -566,32 +567,32 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb); } - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); } else if (command == Command::REFPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::RDA][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::RDA][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32 + memSpec->tRBTP + memSpec->tRPpb); else @@ -599,10 +600,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tRBTP + memSpec->tRPpb); } - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::WRA][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::WRA][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb); else @@ -610,45 +611,45 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb); } - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tpbR2pbR); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); } else if (command == Command::REFP2B) { Bank secondBank = Bank(bank.ID() + memSpec->getPer2BankOffset()); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][secondBank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][secondBank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::RDA][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::RDA][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32 + memSpec->tRBTP + memSpec->tRPpb); else @@ -656,10 +657,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tRBTP + memSpec->tRPpb); } - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][secondBank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][secondBank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::RDA][secondBank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::RDA][secondBank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32 + memSpec->tRBTP + memSpec->tRPpb); else @@ -667,10 +668,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->tRBTP + memSpec->tRPpb); } - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::WRA][bank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::WRA][bank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb); else @@ -678,10 +679,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb); } - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][secondBank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][secondBank]; if (lastCommandStart != scMaxTime) { - if (lastBurstLengthByCommandAndBank[Command::WRA][secondBank.ID()] == 32) + if (lastBurstLengthByCommandAndBank[Command::WRA][secondBank] == 32) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb); else @@ -689,28 +690,28 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener + memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb); } - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][secondBank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][secondBank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFP2B][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFP2B][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFP2B][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFP2B][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tpbR2pbR); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); } else SC_REPORT_FATAL("CheckerLPDDR5", "Unknown command!"); @@ -732,30 +733,33 @@ void CheckerLPDDR5::insert(Command command, const tlm_generic_payload& payload) PRINTDEBUGMESSAGE("CheckerLPDDR5", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndBankGroup[command][bankGroup.ID()] = sc_time_stamp(); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); + lastScheduledByCommandAndBankGroup[command][bankGroup] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); if (command.isCasCommand()) { - lastBurstLengthByCommandAndRank[command][rank.ID()] = burstLength; - lastBurstLengthByCommandAndBankGroup[command][bankGroup.ID()] = burstLength; - lastBurstLengthByCommandAndBank[command][bank.ID()] = burstLength; + lastBurstLengthByCommandAndRank[command][rank] = burstLength; + lastBurstLengthByCommandAndBankGroup[command][bankGroup] = burstLength; + lastBurstLengthByCommandAndBank[command][bank] = burstLength; lastBurstLengthByCommand[command] = burstLength; } if (command == Command::REFP2B) - lastScheduledByCommandAndBank[command][bank.ID() + memSpec->getPer2BankOffset()] = sc_time_stamp(); + { + Bank secondBank(bank.ID() + memSpec->getPer2BankOffset()); + lastScheduledByCommandAndBank[command][secondBank] = sc_time_stamp(); + } lastCommandOnBus = sc_time_stamp() + memSpec->getCommandLength(command) - memSpec->tCK; if (command == Command::ACT || command == Command::REFPB || command == Command::REFP2B || command == Command::RFMPB || command == Command::RFMP2B) { - if (last4Activates[rank.ID()].size() == 4) - last4Activates[rank.ID()].pop(); - last4Activates[rank.ID()].push(lastCommandOnBus); + if (last4Activates[rank].size() == 4) + last4Activates[rank].pop(); + last4Activates[rank].push(lastCommandOnBus); } } diff --git a/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.h b/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.h index 23ed17c2..7887dda3 100644 --- a/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.h +++ b/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.h @@ -57,16 +57,16 @@ public: private: const MemSpecLPDDR5 *memSpec; - std::vector> lastScheduledByCommandAndRank; - std::vector> lastScheduledByCommandAndBankGroup; - std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndRank; + std::vector> lastScheduledByCommandAndBankGroup; + std::vector> lastScheduledByCommandAndBank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnBus; - std::vector> last4Activates; + ControllerVector> last4Activates; - std::vector> lastBurstLengthByCommandAndRank; - std::vector> lastBurstLengthByCommandAndBankGroup; - std::vector> lastBurstLengthByCommandAndBank; + std::vector> lastBurstLengthByCommandAndRank; + std::vector> lastBurstLengthByCommandAndBankGroup; + std::vector> lastBurstLengthByCommandAndBank; std::vector lastBurstLengthByCommand; const sc_core::sc_time scMaxTime = sc_core::sc_max_time(); diff --git a/src/libdramsys/DRAMSys/common/dramExtensions.h b/src/libdramsys/DRAMSys/common/dramExtensions.h index 109a095f..feb24516 100644 --- a/src/libdramsys/DRAMSys/common/dramExtensions.h +++ b/src/libdramsys/DRAMSys/common/dramExtensions.h @@ -88,6 +88,49 @@ private: unsigned int id; }; +class LogicalRank +{ +public: + explicit LogicalRank(unsigned int id) : id(id) {} + + unsigned int ID() const + { + return id; + } + +private: + unsigned int id; +}; + + +class PhysicalRank +{ +public: + explicit PhysicalRank(unsigned int id) : id(id) {} + + unsigned int ID() const + { + return id; + } + +private: + unsigned int id; +}; + +class DimmRank +{ +public: + explicit DimmRank(unsigned int id) : id(id) {} + + unsigned int ID() const + { + return id; + } + +private: + unsigned int id; +}; + class BankGroup { public: diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.cpp index 682a2196..f4c04a16 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.cpp @@ -50,18 +50,19 @@ CheckerGDDR5X::CheckerGDDR5X(const Configuration& config) if (memSpec == nullptr) SC_REPORT_FATAL("CheckerGDDR5X", "Wrong MemSpec chosen"); - lastScheduledByCommandAndBank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); - lastScheduledByCommandAndBankGroup = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->bankGroupsPerChannel, scMaxTime)); - lastScheduledByCommandAndRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndBankGroup = std::vector> + (Command::numberOfCommands(), + ControllerVector(memSpec->bankGroupsPerChannel, scMaxTime)); + lastScheduledByCommandAndRank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnBus = scMaxTime; - last4Activates = std::vector>(memSpec->ranksPerChannel); - last32Activates = std::vector>(memSpec->ranksPerChannel); + last4Activates = ControllerVector>(memSpec->ranksPerChannel); + last32Activates = ControllerVector>(memSpec->ranksPerChannel); - bankwiseRefreshCounter = std::vector(memSpec->ranksPerChannel); + bankwiseRefreshCounter = ControllerVector(memSpec->ranksPerChannel); tBURST = memSpec->defaultBurstLength / memSpec->dataRate * memSpec->tCK; tRDSRE = memSpec->tRL + memSpec->tWCK2CKPIN + memSpec->tWCK2CK + memSpec->tWCK2DQO + tBURST; @@ -88,70 +89,70 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, const tlm_gener assert(!(memSpec->dataRate == 4) || (burstLength == 8)); // DDR mode (QDR wrt CK) assert(!(memSpec->dataRate == 8) || (burstLength == 16)); // QDR mode (ODR wrt CK) - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDRD); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); if (command == Command::RDA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE - memSpec->tRTP); } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_L); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_S); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_L); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_S); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tLK); } @@ -161,378 +162,378 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, const tlm_gener assert(!(memSpec->dataRate == 4) || (burstLength == 8)); // DDR mode (QDR wrt CK) assert(!(memSpec->dataRate == 8) || (burstLength == 16)); // QDR mode (ODR wrt CK) - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDWR); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tLK); } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); - if (last32Activates[rank.ID()].size() >= 32) - earliestTimeToStart = std::max(earliestTimeToStart, last32Activates[rank.ID()].front() + memSpec->t32AW); + if (last32Activates[rank].size() >= 32) + earliestTimeToStart = std::max(earliestTimeToStart, last32Activates[rank].front() + memSpec->t32AW); } else if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); } else if (command == Command::REFAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::REFPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) { - if (bankwiseRefreshCounter[rank.ID()] == 0) + if (bankwiseRefreshCounter[rank] == 0) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); } - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); - if (last32Activates[rank.ID()].size() >= 32) - earliestTimeToStart = std::max(earliestTimeToStart, last32Activates[rank.ID()].front() + memSpec->t32AW); + if (last32Activates[rank].size() >= 32) + earliestTimeToStart = std::max(earliestTimeToStart, last32Activates[rank].front() + memSpec->t32AW); } else if (command == Command::PDEA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::PDXA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); } else if (command == Command::PDEP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::PDXP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); } else if (command == Command::SREFEN) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(memSpec->tRTP + memSpec->tRP, tRDSRE)); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::SREFEX) { - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } @@ -555,25 +556,25 @@ void CheckerGDDR5X::insert(Command command, const tlm_generic_payload& payload) PRINTDEBUGMESSAGE("CheckerGDDR5X", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndBankGroup[command][bankGroup.ID()] = sc_time_stamp(); - lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); + lastScheduledByCommandAndBankGroup[command][bankGroup] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); lastCommandOnBus = sc_time_stamp(); if (command == Command::ACT || command == Command::REFPB) { - if (last4Activates[rank.ID()].size() == 4) - last4Activates[rank.ID()].pop(); - last4Activates[rank.ID()].push(lastCommandOnBus); + if (last4Activates[rank].size() == 4) + last4Activates[rank].pop(); + last4Activates[rank].push(lastCommandOnBus); - if (last32Activates[rank.ID()].size() == 32) - last32Activates[rank.ID()].pop(); - last32Activates[rank.ID()].push(lastCommandOnBus); + if (last32Activates[rank].size() == 32) + last32Activates[rank].pop(); + last32Activates[rank].push(lastCommandOnBus); } if (command == Command::REFPB) - bankwiseRefreshCounter[rank.ID()] = (bankwiseRefreshCounter[rank.ID()] + 1) % memSpec->banksPerRank; + bankwiseRefreshCounter[rank] = (bankwiseRefreshCounter[rank] + 1) % memSpec->banksPerRank; } } // namespace DRAMSys diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.h b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.h index 482f8e5e..c3d664c4 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.h +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.h @@ -55,18 +55,18 @@ public: private: const MemSpecGDDR5X *memSpec; - std::vector> lastScheduledByCommandAndBank; - std::vector> lastScheduledByCommandAndBankGroup; - std::vector> lastScheduledByCommandAndRank; + std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndBankGroup; + std::vector> lastScheduledByCommandAndRank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnBus; // 4 and 32 activate window - std::vector> last4Activates; - std::vector> last32Activates; + ControllerVector> last4Activates; + ControllerVector> last32Activates; - std::vector bankwiseRefreshCounter; + ControllerVector bankwiseRefreshCounter; const sc_core::sc_time scMaxTime = sc_core::sc_max_time(); sc_core::sc_time tBURST; diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.cpp index 7b90405e..28bd7f38 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.cpp @@ -50,17 +50,18 @@ CheckerGDDR6::CheckerGDDR6(const Configuration& config) if (memSpec == nullptr) SC_REPORT_FATAL("CheckerGDDR6", "Wrong MemSpec chosen"); - lastScheduledByCommandAndBank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); - lastScheduledByCommandAndBankGroup = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->bankGroupsPerChannel, scMaxTime)); - lastScheduledByCommandAndRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndBankGroup = std::vector> + (Command::numberOfCommands(), + ControllerVector(memSpec->bankGroupsPerChannel, scMaxTime)); + lastScheduledByCommandAndRank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnBus = scMaxTime; - last4Activates = std::vector>(memSpec->ranksPerChannel); + last4Activates = ControllerVector>(memSpec->ranksPerChannel); - bankwiseRefreshCounter = std::vector(memSpec->ranksPerChannel); + bankwiseRefreshCounter = ControllerVector(memSpec->ranksPerChannel); tBURST = memSpec->defaultBurstLength / memSpec->dataRate * memSpec->tCK; tRDSRE = memSpec->tRL + memSpec->tWCK2CKPIN + memSpec->tWCK2CK + memSpec->tWCK2DQO + tBURST; @@ -85,70 +86,70 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, const tlm_generi { assert(ControllerExtension::getBurstLength(payload) == 16); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDRD); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); if (command == Command::RDA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE - memSpec->tRTP); } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_L); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_S); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_L); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_S); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tLK); } @@ -156,400 +157,400 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, const tlm_generi { assert(ControllerExtension::getBurstLength(payload) == 16); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDWR); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tLK); } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); } else if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); } else if (command == Command::REFAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::REFPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) { - if (bankwiseRefreshCounter[rank.ID()] == 0) + if (bankwiseRefreshCounter[rank] == 0) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); } - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); } else if (command == Command::PDEA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tACTPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPREPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::PDXA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); } else if (command == Command::PDEP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPREPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPREPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFPDE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::PDXP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); } else if (command == Command::SREFEN) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDSRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(memSpec->tRTP + memSpec->tRP, tRDSRE)); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::SREFEX) { - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKESR); } @@ -572,21 +573,21 @@ void CheckerGDDR6::insert(Command command, const tlm_generic_payload& payload) PRINTDEBUGMESSAGE("CheckerGDDR6", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndBankGroup[command][bankGroup.ID()] = sc_time_stamp(); - lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); + lastScheduledByCommandAndBankGroup[command][bankGroup] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); lastCommandOnBus = sc_time_stamp(); if (command == Command::ACT || command == Command::REFPB) { - if (last4Activates[rank.ID()].size() == 4) - last4Activates[rank.ID()].pop(); - last4Activates[rank.ID()].push(lastCommandOnBus); + if (last4Activates[rank].size() == 4) + last4Activates[rank].pop(); + last4Activates[rank].push(lastCommandOnBus); } if (command == Command::REFPB) - bankwiseRefreshCounter[rank.ID()] = (bankwiseRefreshCounter[rank.ID()] + 1) % memSpec->banksPerRank; + bankwiseRefreshCounter[rank] = (bankwiseRefreshCounter[rank] + 1) % memSpec->banksPerRank; } } // namespace DRAMSys diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.h b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.h index c86de7f4..5446f520 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.h +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.h @@ -55,16 +55,16 @@ public: private: const MemSpecGDDR6 *memSpec; - std::vector> lastScheduledByCommandAndBank; - std::vector> lastScheduledByCommandAndBankGroup; - std::vector> lastScheduledByCommandAndRank; + std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndBankGroup; + std::vector> lastScheduledByCommandAndRank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnBus; // four activate window - std::vector> last4Activates; + ControllerVector> last4Activates; - std::vector bankwiseRefreshCounter; + ControllerVector bankwiseRefreshCounter; const sc_core::sc_time scMaxTime = sc_core::sc_max_time(); sc_core::sc_time tBURST; diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.cpp index 1e645b74..31f428ba 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.cpp @@ -50,18 +50,19 @@ CheckerHBM2::CheckerHBM2(const Configuration& config) if (memSpec == nullptr) SC_REPORT_FATAL("CheckerHBM2", "Wrong MemSpec chosen"); - lastScheduledByCommandAndBank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); - lastScheduledByCommandAndBankGroup = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->bankGroupsPerChannel, scMaxTime)); - lastScheduledByCommandAndRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndBankGroup = std::vector> + (Command::numberOfCommands(), + ControllerVector(memSpec->bankGroupsPerChannel, scMaxTime)); + lastScheduledByCommandAndRank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnRasBus = scMaxTime; lastCommandOnCasBus = scMaxTime; - last4Activates = std::vector>(memSpec->ranksPerChannel); + last4Activates = ControllerVector>(memSpec->ranksPerChannel); - bankwiseRefreshCounter = std::vector(memSpec->ranksPerChannel); + bankwiseRefreshCounter = ControllerVector(memSpec->ranksPerChannel); tBURST = memSpec->defaultBurstLength / memSpec->dataRate * memSpec->tCK; tRDPDE = memSpec->tRL + memSpec->tPL + tBURST + memSpec->tCK; @@ -88,46 +89,46 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic assert(!(memSpec->ranksPerChannel == 1) || (burstLength == 2 || burstLength == 4)); // Legacy mode assert(!(memSpec->ranksPerChannel == 2) || (burstLength == 4)); // Pseudo-channel mode - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDRD + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); if (command == Command::RDA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE - memSpec->tRTP); } - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDS); @@ -143,31 +144,31 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic assert(!(memSpec->ranksPerChannel == 1) || (burstLength == 2 || burstLength == 4)); // Legacy mode assert(!(memSpec->ranksPerChannel == 2) || (burstLength == 4)); // Pseudo-channel mode - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDWR + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS); @@ -179,31 +180,31 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - memSpec->tCK); @@ -215,15 +216,15 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCSB - memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD - memSpec->tCK); @@ -231,22 +232,22 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS - memSpec->tCK); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW - memSpec->tCK); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW - memSpec->tCK); earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); @@ -258,23 +259,23 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); @@ -282,7 +283,7 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCSB); @@ -290,23 +291,23 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::REFAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -314,11 +315,11 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCSB); @@ -330,31 +331,31 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic } else if (command == Command::REFPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()]; + lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS + memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); @@ -366,18 +367,18 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCSB); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) { - if (bankwiseRefreshCounter[rank.ID()] == 0) + if (bankwiseRefreshCounter[rank] == 0) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCSB); else earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); @@ -387,8 +388,8 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } @@ -530,9 +531,9 @@ void CheckerHBM2::insert(Command command, const tlm_generic_payload& payload) PRINTDEBUGMESSAGE("CheckerHBM2", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndBankGroup[command][bankGroup.ID()] = sc_time_stamp(); - lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); + lastScheduledByCommandAndBankGroup[command][bankGroup] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); if (command.isCasCommand()) @@ -544,13 +545,13 @@ void CheckerHBM2::insert(Command command, const tlm_generic_payload& payload) if (command == Command::ACT || command == Command::REFPB) { - if (last4Activates[rank.ID()].size() == 4) - last4Activates[rank.ID()].pop(); - last4Activates[rank.ID()].push(lastCommandOnRasBus); + if (last4Activates[rank].size() == 4) + last4Activates[rank].pop(); + last4Activates[rank].push(lastCommandOnRasBus); } if (command == Command::REFPB) - bankwiseRefreshCounter[rank.ID()] = (bankwiseRefreshCounter[rank.ID()] + 1) % memSpec->banksPerRank; + bankwiseRefreshCounter[rank] = (bankwiseRefreshCounter[rank] + 1) % memSpec->banksPerRank; } } // namespace DRAMSys diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.h b/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.h index 060e28f4..66e7e537 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.h +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.h @@ -55,17 +55,17 @@ public: private: const MemSpecHBM2 *memSpec; - std::vector> lastScheduledByCommandAndBank; - std::vector> lastScheduledByCommandAndBankGroup; - std::vector> lastScheduledByCommandAndRank; + std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndBankGroup; + std::vector> lastScheduledByCommandAndRank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnRasBus; sc_core::sc_time lastCommandOnCasBus; // Four activate window - std::vector> last4Activates; - std::vector bankwiseRefreshCounter; + ControllerVector> last4Activates; + ControllerVector bankwiseRefreshCounter; const sc_core::sc_time scMaxTime = sc_core::sc_max_time(); sc_core::sc_time tBURST; diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.cpp index f71b6502..8490480d 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.cpp @@ -50,13 +50,13 @@ CheckerLPDDR4::CheckerLPDDR4(const Configuration& config) if (memSpec == nullptr) SC_REPORT_FATAL("CheckerLPDDR4", "Wrong MemSpec chosen"); - lastScheduledByCommandAndBank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); - lastScheduledByCommandAndRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndRank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnBus = scMaxTime; - last4Activates = std::vector>(memSpec->ranksPerChannel); + last4Activates = ControllerVector>(memSpec->ranksPerChannel); tBURST = memSpec->defaultBurstLength / memSpec->dataRate * memSpec->tCK; tRDWR = memSpec->tRL + memSpec->tDQSCK + tBURST - memSpec->tWL + memSpec->tWPRE + memSpec->tRPST; @@ -89,50 +89,50 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, const tlm_gener assert((burstLength == 16) || (burstLength == 32)); // TODO: BL16/32 OTF assert(burstLength <= memSpec->maxBurstLength); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); if (command == Command::RDA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE - tRDPRE); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } @@ -142,367 +142,367 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, const tlm_gener assert((burstLength == 16) || (burstLength == 32)); assert(burstLength <= memSpec->maxBurstLength); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDAACT); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAACT); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb - 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab - 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab - 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb - 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD - 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR - 2 * memSpec->tCK); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW - 3 * memSpec->tCK); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW - 3 * memSpec->tCK); } else if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); } else if (command == Command::REFAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb + 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); } else if (command == Command::REFPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb + 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD + 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW - memSpec->tCK); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW - memSpec->tCK); } else if (command == Command::PDEA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tACTPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tREFPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::PDXA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::PDEP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tREFPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tREFPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); } else if (command == Command::PDXP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::SREFEN) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb + 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tRDPDEN, tRDPRE + memSpec->tRPpb)); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRPpb)); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); } else if (command == Command::SREFEX) { - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tSR); } @@ -524,17 +524,17 @@ void CheckerLPDDR4::insert(Command command, const tlm_generic_payload& payload) PRINTDEBUGMESSAGE("CheckerLPDDR4", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); lastCommandOnBus = sc_time_stamp() + memSpec->getCommandLength(command) - memSpec->tCK; if (command == Command::ACT || command == Command::REFPB) { - if (last4Activates[rank.ID()].size() == 4) - last4Activates[rank.ID()].pop(); - last4Activates[rank.ID()].push(lastCommandOnBus); + if (last4Activates[rank].size() == 4) + last4Activates[rank].pop(); + last4Activates[rank].push(lastCommandOnBus); } } diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.h b/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.h index 2cef3ddd..64a611bc 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.h +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.h @@ -55,13 +55,13 @@ public: private: const MemSpecLPDDR4 *memSpec; - std::vector> lastScheduledByCommandAndBank; - std::vector> lastScheduledByCommandAndRank; + std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndRank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnBus; // Four activate window - std::vector> last4Activates; + ControllerVector> last4Activates; const sc_core::sc_time scMaxTime = sc_core::sc_max_time(); sc_core::sc_time tBURST; diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.cpp index ab2833c6..292c31c5 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.cpp @@ -50,13 +50,13 @@ CheckerSTTMRAM::CheckerSTTMRAM(const Configuration& config) if (memSpec == nullptr) SC_REPORT_FATAL("CheckerSTTMRAM", "Wrong MemSpec chosen"); - lastScheduledByCommandAndBank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); - lastScheduledByCommandAndRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndRank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnBus = scMaxTime; - last4Activates = std::vector>(memSpec->ranksPerChannel); + last4Activates = ControllerVector>(memSpec->ranksPerChannel); tBURST = memSpec->defaultBurstLength / memSpec->dataRate * memSpec->tCK; tRDWR = memSpec->tRL + tBURST + 2 * memSpec->tCK - memSpec->tWL; @@ -81,36 +81,36 @@ sc_time CheckerSTTMRAM::timeToSatisfyConstraints(Command command, const tlm_gene { assert(ControllerExtension::getBurstLength(payload) == 8); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD - memSpec->tAL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); if (command == Command::RDA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE - memSpec->tRTP - memSpec->tAL); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD); @@ -118,7 +118,7 @@ sc_time CheckerSTTMRAM::timeToSatisfyConstraints(Command command, const tlm_gene if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD); @@ -126,11 +126,11 @@ sc_time CheckerSTTMRAM::timeToSatisfyConstraints(Command command, const tlm_gene if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSDLL); } @@ -138,240 +138,240 @@ sc_time CheckerSTTMRAM::timeToSatisfyConstraints(Command command, const tlm_gene { assert(ControllerExtension::getBurstLength(payload) == 8); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD - memSpec->tAL); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSDLL); } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tAL + memSpec->tRTP + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); } else if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tAL + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tAL + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tAL + memSpec->tRTP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::PDEA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tACTPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::PDXA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); } else if (command == Command::PDEP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::PDXP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); } else if (command == Command::SREFEN) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tRDPDEN, memSpec->tAL + memSpec->tRTP + memSpec->tRP)); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRP)); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); } else if (command == Command::SREFEX) { - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKESR); } @@ -392,17 +392,17 @@ void CheckerSTTMRAM::insert(Command command, const tlm_generic_payload& payload) PRINTDEBUGMESSAGE("CheckerSTTMRAM", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); lastCommandOnBus = sc_time_stamp(); if (command == Command::ACT) { - if (last4Activates[rank.ID()].size() == 4) - last4Activates[rank.ID()].pop(); - last4Activates[rank.ID()].push(sc_time_stamp()); + if (last4Activates[rank].size() == 4) + last4Activates[rank].pop(); + last4Activates[rank].push(sc_time_stamp()); } } diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.h b/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.h index 28d52e2e..eb2ab813 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.h +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.h @@ -55,13 +55,13 @@ public: private: const MemSpecSTTMRAM *memSpec; - std::vector> lastScheduledByCommandAndBank; - std::vector> lastScheduledByCommandAndRank; + std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndRank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnBus; // Four activate window - std::vector> last4Activates; + ControllerVector> last4Activates; const sc_core::sc_time scMaxTime = sc_core::sc_max_time(); sc_core::sc_time tBURST; diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.cpp index 25a91656..94174941 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.cpp @@ -50,13 +50,13 @@ CheckerWideIO::CheckerWideIO(const Configuration& config) if (memSpec == nullptr) SC_REPORT_FATAL("CheckerWideIO", "Wrong MemSpec chosen"); - lastScheduledByCommandAndBank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); - lastScheduledByCommandAndRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndRank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnBus = scMaxTime; - last2Activates = std::vector>(memSpec->ranksPerChannel); + last2Activates = ControllerVector>(memSpec->ranksPerChannel); tBURST = memSpec->defaultBurstLength * memSpec->tCK; tRDWR = memSpec->tRL + tBURST + memSpec->tCK; @@ -83,50 +83,50 @@ sc_time CheckerWideIO::timeToSatisfyConstraints(Command command, const tlm_gener assert((burstLength == 2) || (burstLength == 4)); assert(burstLength <= memSpec->maxBurstLength); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); if (command == Command::RDA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE - tBURST); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } @@ -136,262 +136,262 @@ sc_time CheckerWideIO::timeToSatisfyConstraints(Command command, const tlm_gener assert((burstLength == 2) || (burstLength == 4)); assert(burstLength <= memSpec->maxBurstLength); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); - if (last2Activates[rank.ID()].size() >= 2) - earliestTimeToStart = std::max(earliestTimeToStart, last2Activates[rank.ID()].front() + memSpec->tTAW); + if (last2Activates[rank].size() >= 2) + earliestTimeToStart = std::max(earliestTimeToStart, last2Activates[rank].front() + memSpec->tTAW); } else if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::REFAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); } else if (command == Command::PDEA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::PDXA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::PDEP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); } else if (command == Command::PDXP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::SREFEN) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tRDPDEN, tBURST + memSpec->tRP)); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRP)); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); } else if (command == Command::SREFEX) { - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKESR); } @@ -413,16 +413,16 @@ void CheckerWideIO::insert(Command command, const tlm_generic_payload& payload) PRINTDEBUGMESSAGE("CheckerWideIO", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); lastCommandOnBus = sc_time_stamp(); if (command == Command::ACT) { - if (last2Activates[rank.ID()].size() == 2) - last2Activates[rank.ID()].pop(); - last2Activates[rank.ID()].push(sc_time_stamp()); + if (last2Activates[rank].size() == 2) + last2Activates[rank].pop(); + last2Activates[rank].push(sc_time_stamp()); } } diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.h b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.h index c39d1e41..0a2c7032 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.h +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.h @@ -55,13 +55,13 @@ public: private: const MemSpecWideIO *memSpec; - std::vector> lastScheduledByCommandAndBank; - std::vector> lastScheduledByCommandAndRank; + std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndRank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnBus; // Four activate window - std::vector> last2Activates; + ControllerVector> last2Activates; const sc_core::sc_time scMaxTime = sc_core::sc_max_time(); sc_core::sc_time tBURST; diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.cpp index ebc6e967..cf92fc0d 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.cpp @@ -50,13 +50,13 @@ CheckerWideIO2::CheckerWideIO2(const Configuration& config) if (memSpec == nullptr) SC_REPORT_FATAL("CheckerWideIO2", "Wrong MemSpec chosen"); - lastScheduledByCommandAndBank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime)); - lastScheduledByCommandAndRank = std::vector> - (Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime)); + lastScheduledByCommandAndBank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime)); + lastScheduledByCommandAndRank = std::vector> + (Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime)); lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime); lastCommandOnBus = scMaxTime; - last4Activates = std::vector>(memSpec->ranksPerChannel); + last4Activates = ControllerVector>(memSpec->ranksPerChannel); tBURST = memSpec->defaultBurstLength / memSpec->dataRate * memSpec->tCK; tRDPRE = tBURST + std::max(2 * memSpec->tCK, memSpec->tRTP) - 2 * memSpec->tCK; @@ -84,50 +84,50 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, const tlm_gene assert((burstLength == 4) || (burstLength == 8)); // TODO: BL4/8 OTF assert(burstLength <= memSpec->maxBurstLength); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); if (command == Command::RDA) { - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE - tRDPRE); } - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } @@ -137,339 +137,339 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, const tlm_gene assert((burstLength == 4) || (burstLength == 8)); assert(burstLength <= memSpec->maxBurstLength); - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR); - lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ? lastScheduledByCommand[Command::RD] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ? lastScheduledByCommand[Command::RD] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR); - lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ? lastScheduledByCommand[Command::RDA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ? lastScheduledByCommand[Command::RDA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_R); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ? lastScheduledByCommand[Command::WR] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ? lastScheduledByCommand[Command::WR] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD); - lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ? lastScheduledByCommand[Command::WRA] : scMaxTime; + lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ? lastScheduledByCommand[Command::WRA] : scMaxTime; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST + memSpec->tRTRS); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::ACT) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); } else if (command == Command::PREPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE); - lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); } else if (command == Command::PREAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS); - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + 2 * memSpec->tCK); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); } else if(command == Command::REFAB) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); } else if(command == Command::REFPB) { - lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD); - lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()]; + lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); - if (last4Activates[rank.ID()].size() >= 4) - earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW); + if (last4Activates[rank].size() >= 4) + earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); } else if (command == Command::PDEA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::PDXA) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::PDEP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); } else if (command == Command::PDXP) { - lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); } else if (command == Command::SREFEN) { - lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tRDPDEN, tRDPRE + memSpec->tRPpb)); - lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRPpb)); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab); - lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab); - lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb); - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR); } else if (command == Command::SREFEX) { - lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank.ID()]; + lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKESR); } @@ -491,16 +491,16 @@ void CheckerWideIO2::insert(Command command, const tlm_generic_payload& payload) PRINTDEBUGMESSAGE("CheckerWideIO2", "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); - lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp(); - lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp(); + lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); + lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); lastScheduledByCommand[command] = sc_time_stamp(); lastCommandOnBus = sc_time_stamp(); if (command == Command::ACT || command == Command::REFPB) { - if (last4Activates[rank.ID()].size() == 4) - last4Activates[rank.ID()].pop(); - last4Activates[rank.ID()].push(sc_time_stamp()); + if (last4Activates[rank].size() == 4) + last4Activates[rank].pop(); + last4Activates[rank].push(sc_time_stamp()); } } diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.h b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.h index f68f551d..d787870b 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.h +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.h @@ -55,13 +55,13 @@ public: private: const MemSpecWideIO2 *memSpec; - std::vector> lastScheduledByCommandAndBank; - std::vector> lastScheduledByCommandAndRank; + std::vector> lastScheduledByCommandAndBank; + std::vector> lastScheduledByCommandAndRank; std::vector lastScheduledByCommand; sc_core::sc_time lastCommandOnBus; // Four activate window - std::vector> last4Activates; + ControllerVector> last4Activates; const sc_core::sc_time scMaxTime = sc_core::sc_max_time(); sc_core::sc_time tBURST; From c833471480af30cd245302e7672be40153239fa8 Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Wed, 21 Jun 2023 14:51:15 +0200 Subject: [PATCH 08/28] Use type safe index vectors in remaining controller. --- .../DRAMSys/common/dramExtensions.h | 17 +++- .../DRAMSys/controller/Controller.cpp | 81 ++++++++++--------- .../DRAMSys/controller/Controller.h | 10 +-- .../powerdown/PowerDownManagerStaggered.cpp | 2 +- .../powerdown/PowerDownManagerStaggered.h | 4 +- .../refresh/RefreshManagerAllBank.cpp | 3 +- .../refresh/RefreshManagerAllBank.h | 4 +- .../refresh/RefreshManagerPer2Bank.cpp | 15 ++-- .../refresh/RefreshManagerPer2Bank.h | 2 +- .../refresh/RefreshManagerPerBank.cpp | 3 +- .../refresh/RefreshManagerPerBank.h | 2 +- .../refresh/RefreshManagerSameBank.cpp | 8 +- .../refresh/RefreshManagerSameBank.h | 2 +- 13 files changed, 86 insertions(+), 67 deletions(-) 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; From 413921f420911dcd9c18370ae3efe701caa49fa2 Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Thu, 22 Jun 2023 10:19:34 +0200 Subject: [PATCH 09/28] Minor formatting. --- .../DRAMSys/common/dramExtensions.cpp | 5 - .../DRAMSys/common/dramExtensions.h | 132 ++++++++---------- .../DRAMSys/controller/BankMachine.h | 2 +- .../DRAMSys/controller/Controller.cpp | 7 +- 4 files changed, 64 insertions(+), 82 deletions(-) diff --git a/src/libdramsys/DRAMSys/common/dramExtensions.cpp b/src/libdramsys/DRAMSys/common/dramExtensions.cpp index 25b608a1..ad0f2b43 100644 --- a/src/libdramsys/DRAMSys/common/dramExtensions.cpp +++ b/src/libdramsys/DRAMSys/common/dramExtensions.cpp @@ -338,12 +338,8 @@ bool operator <(const Bank &lhs, const Bank &rhs) } //ROW -const Row Row::NO_ROW; - bool operator ==(const Row &lhs, const Row &rhs) { - if (lhs.isNoRow != rhs.isNoRow) - return false; return lhs.ID() == rhs.ID(); } @@ -352,7 +348,6 @@ bool operator !=(const Row &lhs, const Row &rhs) return !(lhs == rhs); } - //COLUMN bool operator ==(const Column &lhs, const Column &rhs) { diff --git a/src/libdramsys/DRAMSys/common/dramExtensions.h b/src/libdramsys/DRAMSys/common/dramExtensions.h index d02a8c8d..50258c08 100644 --- a/src/libdramsys/DRAMSys/common/dramExtensions.h +++ b/src/libdramsys/DRAMSys/common/dramExtensions.h @@ -48,157 +48,143 @@ namespace DRAMSys class Thread { -public: - explicit Thread(unsigned int id) : id(id) {} +private: + std::size_t id; - unsigned int ID() const +public: + explicit Thread(std::size_t id) : id(id) {} + + std::size_t ID() const { return id; } - -private: - unsigned int id; }; class Channel { -public: - explicit Channel(unsigned int id) : id(id) {} +private: + std::size_t id; - unsigned int ID() const +public: + explicit Channel(std::size_t id) : id(id) {} + + std::size_t ID() const { return id; } - -private: - unsigned int id; }; class Rank { -public: - explicit Rank(unsigned int id) : id(id) {} +private: + std::size_t id; - unsigned int ID() const +public: + explicit Rank(std::size_t id) : id(id) {} + + std::size_t ID() const { return id; } - -private: - unsigned int id; }; class LogicalRank { -public: - explicit LogicalRank(unsigned int id) : id(id) {} +private: + std::size_t id; - unsigned int ID() const +public: + explicit LogicalRank(std::size_t id) : id(id) {} + + std::size_t ID() const { return id; } - -private: - unsigned int id; }; class PhysicalRank { -public: - explicit PhysicalRank(unsigned int id) : id(id) {} +private: + std::size_t id; - unsigned int ID() const +public: + explicit PhysicalRank(std::size_t id) : id(id) {} + + std::size_t ID() const { return id; } - -private: - unsigned int id; }; class DimmRank { -public: - explicit DimmRank(unsigned int id) : id(id) {} +private: + std::size_t id; - unsigned int ID() const +public: + explicit DimmRank(std::size_t id) : id(id) {} + + std::size_t ID() const { return id; } - -private: - unsigned int id; }; class BankGroup { -public: - explicit BankGroup(unsigned int id) : id(id) {} +private: + std::size_t id; - unsigned int ID() const +public: + explicit BankGroup(std::size_t id) : id(id) {} + + std::size_t ID() const { return id; } - -private: - unsigned int id; }; class Bank { -public: - explicit Bank(unsigned int id) : id(id) {} +private: + std::size_t id; - unsigned int ID() const +public: + explicit Bank(std::size_t id) : id(id) {} + + std::size_t ID() const { return id; } - - std::string toString() const - { - return std::to_string(id); - } - -private: - unsigned int id; }; class Row { +private: + std::size_t id; + public: - static const Row NO_ROW; + explicit Row(std::size_t id) : id(id) {} - Row() : id(0), isNoRow(true) {} - - explicit Row(unsigned int id) : id(id), isNoRow(false) {} - - unsigned int ID() const + std::size_t ID() const { return id; } - - Row operator++(); - -private: - unsigned int id; - bool isNoRow; - - friend bool operator==(const Row &lhs, const Row &rhs); }; class Column { -public: - explicit Column(unsigned int id) : id(id) {} +private: + std::size_t id; - unsigned int ID() const +public: + explicit Column(std::size_t id) : id(id) {} + + std::size_t ID() const { return id; } - -private: - unsigned int id; }; template diff --git a/src/libdramsys/DRAMSys/controller/BankMachine.h b/src/libdramsys/DRAMSys/controller/BankMachine.h index d646555f..23ff09e9 100644 --- a/src/libdramsys/DRAMSys/controller/BankMachine.h +++ b/src/libdramsys/DRAMSys/controller/BankMachine.h @@ -72,7 +72,7 @@ protected: tlm::tlm_generic_payload* currentPayload = nullptr; const SchedulerIF& scheduler; Command nextCommand = Command::NOP; - Row openRow; + Row openRow = Row(0); const Bank bank; const BankGroup bankgroup; const Rank rank; diff --git a/src/libdramsys/DRAMSys/controller/Controller.cpp b/src/libdramsys/DRAMSys/controller/Controller.cpp index f13e0d2b..a3fd8175 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.cpp +++ b/src/libdramsys/DRAMSys/controller/Controller.cpp @@ -281,18 +281,19 @@ 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[Rank(rankID)]->getNextCommand(); + Rank rank(rankID); + commandTuple = powerDownManagers[rank]->getNextCommand(); if (std::get(commandTuple) != Command::NOP) readyCommands.emplace_back(commandTuple); else { // (4.2) Check for refresh commands (PREXX or REFXX) - commandTuple = refreshManagers[Rank(rankID)]->getNextCommand(); + commandTuple = refreshManagers[rank]->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[Rank(rankID)]) + for (auto it : bankMachinesOnRank[rank]) { commandTuple = it->getNextCommand(); if (std::get(commandTuple) != Command::NOP) From 4e0891affb7f83db78a17cb9049d47f35772a280 Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Mon, 26 Jun 2023 16:32:39 +0200 Subject: [PATCH 10/28] Inherit privately from std::vector. --- .../DRAMSys/common/dramExtensions.h | 48 +++++-------------- 1 file changed, 13 insertions(+), 35 deletions(-) diff --git a/src/libdramsys/DRAMSys/common/dramExtensions.h b/src/libdramsys/DRAMSys/common/dramExtensions.h index 50258c08..39dda2c0 100644 --- a/src/libdramsys/DRAMSys/common/dramExtensions.h +++ b/src/libdramsys/DRAMSys/common/dramExtensions.h @@ -188,47 +188,25 @@ public: }; template -class ControllerVector +class ControllerVector : private std::vector { -private: - std::vector baseVector; - public: - ControllerVector(size_t size, const ValueType& value) + ControllerVector(std::size_t size, const ValueType& value) : std::vector(size, value) {} + explicit ControllerVector(std::size_t size) : std::vector(size) {} + ControllerVector() : std::vector() {} + + using std::vector::push_back; + using std::vector::begin; + using std::vector::end; + + typename std::vector::const_reference operator[](IndexType index) const { - baseVector = std::vector(size, value); + return std::vector::operator[](index.ID()); } - explicit ControllerVector(size_t size) + typename std::vector::reference operator[](IndexType index) { - baseVector = std::vector(size); - } - - ControllerVector() = default; - - const ValueType& operator[](IndexType index) const - { - return baseVector[index.ID()]; - } - - ValueType& operator[](IndexType index) - { - 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(); + return std::vector::operator[](index.ID()); } }; From 12dcbfd917be8f5a68b2893b19e2fb5295fea7f6 Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Fri, 30 Jun 2023 15:49:41 +0200 Subject: [PATCH 11/28] Use scoped enums for DRAM types. --- .../controller/checker/CheckerDDR5.cpp | 24 +- .../controller/checker/CheckerLPDDR5.cpp | 6 +- src/libdramsys/DRAMSys/common/TlmRecorder.cpp | 14 +- .../DRAMSys/common/dramExtensions.cpp | 88 ------ .../DRAMSys/common/dramExtensions.h | 184 +------------ .../DRAMSys/controller/BankMachine.cpp | 3 +- .../DRAMSys/controller/Controller.cpp | 6 +- .../controller/checker/CheckerDDR3.cpp | 2 +- .../controller/checker/CheckerDDR4.cpp | 2 +- .../controller/checker/CheckerGDDR5.cpp | 2 +- .../controller/checker/CheckerGDDR5X.cpp | 2 +- .../controller/checker/CheckerGDDR6.cpp | 2 +- .../controller/checker/CheckerHBM2.cpp | 2 +- .../controller/checker/CheckerLPDDR4.cpp | 2 +- .../controller/checker/CheckerSTTMRAM.cpp | 2 +- .../controller/checker/CheckerWideIO.cpp | 2 +- .../controller/checker/CheckerWideIO2.cpp | 2 +- .../controller/refresh/RefreshManagerIF.h | 2 +- .../refresh/RefreshManagerPer2Bank.cpp | 4 +- .../refresh/RefreshManagerSameBank.cpp | 2 +- .../scheduler/BufferCounterBankwise.cpp | 4 +- .../scheduler/BufferCounterBankwise.h | 2 +- .../controller/scheduler/SchedulerFifo.cpp | 18 +- .../controller/scheduler/SchedulerFifo.h | 2 +- .../controller/scheduler/SchedulerFrFcfs.cpp | 22 +- .../controller/scheduler/SchedulerFrFcfs.h | 2 +- .../scheduler/SchedulerFrFcfsGrp.cpp | 22 +- .../controller/scheduler/SchedulerFrFcfsGrp.h | 2 +- .../scheduler/SchedulerGrpFrFcfs.cpp | 48 ++-- .../controller/scheduler/SchedulerGrpFrFcfs.h | 4 +- .../scheduler/SchedulerGrpFrFcfsWm.cpp | 36 +-- .../scheduler/SchedulerGrpFrFcfsWm.h | 4 +- src/libdramsys/DRAMSys/simulation/Arbiter.cpp | 258 +++++++++--------- src/libdramsys/DRAMSys/simulation/Arbiter.h | 36 +-- .../DRAMSys/simulation/dram/Dram.cpp | 2 +- 35 files changed, 288 insertions(+), 527 deletions(-) diff --git a/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.cpp b/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.cpp index 6092a53e..ffbc1803 100644 --- a/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.cpp +++ b/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.cpp @@ -126,13 +126,15 @@ CheckerDDR5::CheckerDDR5(const Configuration& config) sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic_payload& payload) const { - LogicalRank logicalRank(ControllerExtension::getRank(payload).ID()); - PhysicalRank physicalRank(logicalRank.ID() / memSpec->logicalRanksPerPhysicalRank); - DimmRank dimmRank(physicalRank.ID() / memSpec->physicalRanksPerDimmRank); + LogicalRank logicalRank = LogicalRank(ControllerExtension::getRank(payload)); + PhysicalRank physicalRank = PhysicalRank( + static_cast(logicalRank) / memSpec->logicalRanksPerPhysicalRank); + DimmRank dimmRank = DimmRank(static_cast(physicalRank) / memSpec->physicalRanksPerDimmRank); BankGroup bankGroup = ControllerExtension::getBankGroup(payload); Bank bank = ControllerExtension::getBank(payload); - Bank bankInGroup = Bank(logicalRank.ID() * memSpec->banksPerGroup + bank.ID() % memSpec->banksPerGroup); - + Bank bankInGroup = Bank(static_cast(logicalRank) * memSpec->banksPerGroup + + static_cast(bank) % memSpec->banksPerGroup); + sc_time lastCommandStart; sc_time earliestTimeToStart = sc_time_stamp(); @@ -938,15 +940,17 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic void CheckerDDR5::insert(Command command, const tlm_generic_payload& payload) { - LogicalRank logicalRank(ControllerExtension::getRank(payload).ID()); - PhysicalRank physicalRank(logicalRank.ID() / memSpec->logicalRanksPerPhysicalRank); - DimmRank dimmRank(physicalRank.ID() / memSpec->physicalRanksPerDimmRank); + LogicalRank logicalRank = LogicalRank(ControllerExtension::getRank(payload)); + PhysicalRank physicalRank = PhysicalRank( + static_cast(logicalRank) / memSpec->logicalRanksPerPhysicalRank); + DimmRank dimmRank = DimmRank(static_cast(physicalRank) / memSpec->physicalRanksPerDimmRank); BankGroup bankGroup = ControllerExtension::getBankGroup(payload); Bank bank = ControllerExtension::getBank(payload); - Bank bankInGroup = Bank(logicalRank.ID() * memSpec->banksPerGroup + bank.ID() % memSpec->banksPerGroup); + Bank bankInGroup = Bank(static_cast(logicalRank) * memSpec->banksPerGroup + + static_cast(bank) % memSpec->banksPerGroup); unsigned burstLength = ControllerExtension::getBurstLength(payload); - PRINTDEBUGMESSAGE("CheckerDDR5", "Changing state on bank " + std::to_string(bank.ID()) + PRINTDEBUGMESSAGE("CheckerDDR5", "Changing state on bank " + std::to_string(static_cast(bank)) + " command is " + command.toString()); lastScheduledByCommandAndDimmRank[command][dimmRank] = sc_time_stamp(); diff --git a/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp b/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp index fa6a59ac..52edc578 100644 --- a/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp +++ b/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp @@ -632,7 +632,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener } else if (command == Command::REFP2B) { - Bank secondBank = Bank(bank.ID() + memSpec->getPer2BankOffset()); + Bank secondBank = Bank(static_cast(bank) + memSpec->getPer2BankOffset()); lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank]; if (lastCommandStart != scMaxTime) @@ -730,7 +730,7 @@ void CheckerLPDDR5::insert(Command command, const tlm_generic_payload& payload) Bank bank = ControllerExtension::getBank(payload); unsigned burstLength = ControllerExtension::getBurstLength(payload); - PRINTDEBUGMESSAGE("CheckerLPDDR5", "Changing state on bank " + std::to_string(bank.ID()) + PRINTDEBUGMESSAGE("CheckerLPDDR5", "Changing state on bank " + std::to_string(static_cast(bank)) + " command is " + command.toString()); lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); @@ -748,7 +748,7 @@ void CheckerLPDDR5::insert(Command command, const tlm_generic_payload& payload) if (command == Command::REFP2B) { - Bank secondBank(bank.ID() + memSpec->getPer2BankOffset()); + Bank secondBank = Bank(static_cast(bank) + memSpec->getPer2BankOffset()); lastScheduledByCommandAndBank[command][secondBank] = sc_time_stamp(); } diff --git a/src/libdramsys/DRAMSys/common/TlmRecorder.cpp b/src/libdramsys/DRAMSys/common/TlmRecorder.cpp index 9bbb95c5..6bc51512 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorder.cpp +++ b/src/libdramsys/DRAMSys/common/TlmRecorder.cpp @@ -450,9 +450,9 @@ void TlmRecorder::insertTransactionInDB(const Transaction &recordingData) sqlite3_bind_int64(insertTransactionStatement, 3, static_cast(recordingData.address)); sqlite3_bind_int(insertTransactionStatement, 4, static_cast(recordingData.dataLength)); sqlite3_bind_int(insertTransactionStatement, 5, - static_cast(recordingData.thread.ID())); + static_cast(recordingData.thread)); sqlite3_bind_int(insertTransactionStatement, 6, - static_cast(recordingData.channel.ID())); + static_cast(recordingData.channel)); sqlite3_bind_int64(insertTransactionStatement, 7, static_cast(recordingData.timeOfGeneration.value())); sqlite3_bind_text(insertTransactionStatement, 8, @@ -477,11 +477,11 @@ void TlmRecorder::insertPhaseInDB(const Transaction::Phase& phase, uint64_t tran sqlite3_bind_int64(insertPhaseStatement, 3, static_cast(phase.interval.end.value())); sqlite3_bind_int64(insertPhaseStatement, 4, static_cast(phase.intervalOnDataStrobe.start.value())); sqlite3_bind_int64(insertPhaseStatement, 5, static_cast(phase.intervalOnDataStrobe.end.value())); - sqlite3_bind_int(insertPhaseStatement, 6, static_cast(phase.rank.ID())); - sqlite3_bind_int(insertPhaseStatement, 7, static_cast(phase.bankGroup.ID())); - sqlite3_bind_int(insertPhaseStatement, 8, static_cast(phase.bank.ID())); - sqlite3_bind_int(insertPhaseStatement, 9, static_cast(phase.row.ID())); - sqlite3_bind_int(insertPhaseStatement, 10, static_cast(phase.column.ID())); + sqlite3_bind_int(insertPhaseStatement, 6, static_cast(phase.rank)); + sqlite3_bind_int(insertPhaseStatement, 7, static_cast(phase.bankGroup)); + sqlite3_bind_int(insertPhaseStatement, 8, static_cast(phase.bank)); + sqlite3_bind_int(insertPhaseStatement, 9, static_cast(phase.row)); + sqlite3_bind_int(insertPhaseStatement, 10, static_cast(phase.column)); sqlite3_bind_int(insertPhaseStatement, 11, static_cast(phase.burstLength)); sqlite3_bind_int64(insertPhaseStatement, 12, static_cast(transactionID)); executeSqlStatement(insertPhaseStatement); diff --git a/src/libdramsys/DRAMSys/common/dramExtensions.cpp b/src/libdramsys/DRAMSys/common/dramExtensions.cpp index ad0f2b43..0ec5f106 100644 --- a/src/libdramsys/DRAMSys/common/dramExtensions.cpp +++ b/src/libdramsys/DRAMSys/common/dramExtensions.cpp @@ -272,94 +272,6 @@ unsigned ControllerExtension::getBurstLength(const tlm::tlm_generic_payload& tra return trans.get_extension()->burstLength; } -//THREAD -bool operator ==(const Thread &lhs, const Thread &rhs) -{ - return lhs.ID() == rhs.ID(); -} - -bool operator !=(const Thread &lhs, const Thread &rhs) -{ - return !(lhs == rhs); -} - -bool operator <(const Thread &lhs, const Thread &rhs) -{ - return lhs.ID() < rhs.ID(); -} - -//CHANNEL -bool operator ==(const Channel &lhs, const Channel &rhs) -{ - return lhs.ID() == rhs.ID(); -} - -bool operator !=(const Channel &lhs, const Channel &rhs) -{ - return !(lhs == rhs); -} - -//RANK -bool operator ==(const Rank &lhs, const Rank &rhs) -{ - return lhs.ID() == rhs.ID(); -} - -bool operator !=(const Rank &lhs, const Rank &rhs) -{ - return !(lhs == rhs); -} - -//BANKGROUP -bool operator ==(const BankGroup &lhs, const BankGroup &rhs) -{ - return lhs.ID() == rhs.ID(); -} - -bool operator !=(const BankGroup &lhs, const BankGroup &rhs) -{ - return !(lhs == rhs); -} - -//BANK -bool operator ==(const Bank &lhs, const Bank &rhs) -{ - return lhs.ID() == rhs.ID(); -} - -bool operator !=(const Bank &lhs, const Bank &rhs) -{ - return !(lhs == rhs); -} - -bool operator <(const Bank &lhs, const Bank &rhs) -{ - return lhs.ID() < rhs.ID(); -} - -//ROW -bool operator ==(const Row &lhs, const Row &rhs) -{ - return lhs.ID() == rhs.ID(); -} - -bool operator !=(const Row &lhs, const Row &rhs) -{ - return !(lhs == rhs); -} - -//COLUMN -bool operator ==(const Column &lhs, const Column &rhs) -{ - return lhs.ID() == rhs.ID(); -} - -bool operator !=(const Column &lhs, const Column &rhs) -{ - return !(lhs == rhs); -} - - tlm::tlm_extension_base* ChildExtension::clone() const { return new ChildExtension(*parentTrans); diff --git a/src/libdramsys/DRAMSys/common/dramExtensions.h b/src/libdramsys/DRAMSys/common/dramExtensions.h index 39dda2c0..4e273f12 100644 --- a/src/libdramsys/DRAMSys/common/dramExtensions.h +++ b/src/libdramsys/DRAMSys/common/dramExtensions.h @@ -46,167 +46,35 @@ namespace DRAMSys { -class Thread -{ -private: - std::size_t id; - -public: - explicit Thread(std::size_t id) : id(id) {} - - std::size_t ID() const - { - return id; - } -}; - -class Channel -{ -private: - std::size_t id; - -public: - explicit Channel(std::size_t id) : id(id) {} - - std::size_t ID() const - { - return id; - } -}; - -class Rank -{ -private: - std::size_t id; - -public: - explicit Rank(std::size_t id) : id(id) {} - - std::size_t ID() const - { - return id; - } -}; - -class LogicalRank -{ -private: - std::size_t id; - -public: - explicit LogicalRank(std::size_t id) : id(id) {} - - std::size_t ID() const - { - return id; - } -}; - - -class PhysicalRank -{ -private: - std::size_t id; - -public: - explicit PhysicalRank(std::size_t id) : id(id) {} - - std::size_t ID() const - { - return id; - } -}; - -class DimmRank -{ -private: - std::size_t id; - -public: - explicit DimmRank(std::size_t id) : id(id) {} - - std::size_t ID() const - { - return id; - } -}; - -class BankGroup -{ -private: - std::size_t id; - -public: - explicit BankGroup(std::size_t id) : id(id) {} - - std::size_t ID() const - { - return id; - } -}; - -class Bank -{ -private: - std::size_t id; - -public: - explicit Bank(std::size_t id) : id(id) {} - - std::size_t ID() const - { - return id; - } -}; - -class Row -{ -private: - std::size_t id; - -public: - explicit Row(std::size_t id) : id(id) {} - - std::size_t ID() const - { - return id; - } -}; - -class Column -{ -private: - std::size_t id; - -public: - explicit Column(std::size_t id) : id(id) {} - - std::size_t ID() const - { - return id; - } -}; +enum class Thread : std::size_t; +enum class Channel : std::size_t; +enum class Rank : std::size_t; +enum class LogicalRank : std::size_t; +enum class PhysicalRank : std::size_t; +enum class DimmRank : std::size_t; +enum class BankGroup : std::size_t; +enum class Bank : std::size_t; +enum class Row : std::size_t; +enum class Column : std::size_t; template class ControllerVector : private std::vector { public: - ControllerVector(std::size_t size, const ValueType& value) : std::vector(size, value) {} - explicit ControllerVector(std::size_t size) : std::vector(size) {} - ControllerVector() : std::vector() {} - + using std::vector::vector; using std::vector::push_back; using std::vector::begin; using std::vector::end; + using std::vector::front; typename std::vector::const_reference operator[](IndexType index) const { - return std::vector::operator[](index.ID()); + return std::vector::operator[](static_cast(index)); } typename std::vector::reference operator[](IndexType index) { - return std::vector::operator[](index.ID()); + return std::vector::operator[](static_cast(index)); } }; @@ -284,30 +152,6 @@ private: unsigned burstLength; }; - -bool operator==(const Thread &lhs, const Thread &rhs); -bool operator!=(const Thread &lhs, const Thread &rhs); -bool operator<(const Thread &lhs, const Thread &rhs); - -bool operator==(const Channel &lhs, const Channel &rhs); -bool operator!=(const Channel &lhs, const Channel &rhs); - -bool operator==(const Rank &lhs, const Rank &rhs); -bool operator!=(const Rank &lhs, const Rank &rhs); - -bool operator==(const BankGroup &lhs, const BankGroup &rhs); -bool operator!=(const BankGroup &lhs, const BankGroup &rhs); - -bool operator==(const Bank &lhs, const Bank &rhs); -bool operator!=(const Bank &lhs, const Bank &rhs); -bool operator<(const Bank &lhs, const Bank &rhs); - -bool operator==(const Row &lhs, const Row &rhs); -bool operator!=(const Row &lhs, const Row &rhs); - -bool operator==(const Column &lhs, const Column &rhs); -bool operator!=(const Column &lhs, const Column &rhs); - class ChildExtension : public tlm::tlm_extension { private: diff --git a/src/libdramsys/DRAMSys/controller/BankMachine.cpp b/src/libdramsys/DRAMSys/controller/BankMachine.cpp index 09b7ceec..02b090ea 100644 --- a/src/libdramsys/DRAMSys/controller/BankMachine.cpp +++ b/src/libdramsys/DRAMSys/controller/BankMachine.cpp @@ -46,7 +46,8 @@ namespace DRAMSys 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)), + bankgroup(BankGroup(static_cast(bank) / memSpec.banksPerGroup)), + rank(Rank(static_cast(bank) / memSpec.banksPerRank)), refreshManagement(config.refreshManagement) {} diff --git a/src/libdramsys/DRAMSys/controller/Controller.cpp b/src/libdramsys/DRAMSys/controller/Controller.cpp index a3fd8175..c87a21df 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.cpp +++ b/src/libdramsys/DRAMSys/controller/Controller.cpp @@ -281,7 +281,7 @@ 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) - Rank rank(rankID); + Rank rank = Rank(rankID); commandTuple = powerDownManagers[rank]->getNextCommand(); if (std::get(commandTuple) != Command::NOP) readyCommands.emplace_back(commandTuple); @@ -327,14 +327,14 @@ void Controller::controllerMethod() } else if (command.isGroupCommand()) { - for (unsigned bankID = (bank.ID() % memSpec.banksPerGroup); + for (std::size_t bankID = (static_cast(bank) % memSpec.banksPerGroup); bankID < memSpec.banksPerRank; bankID += memSpec.banksPerGroup) bankMachinesOnRank[rank][Bank(bankID)]->update(command); } else if (command.is2BankCommand()) { bankMachines[bank]->update(command); - bankMachines[Bank(bank.ID() + memSpec.getPer2BankOffset())]->update(command); + bankMachines[Bank(static_cast(bank) + memSpec.getPer2BankOffset())]->update(command); } else // if (isBankCommand(command)) bankMachines[bank]->update(command); diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerDDR3.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerDDR3.cpp index 0c9f9345..5f0e9406 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerDDR3.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerDDR3.cpp @@ -433,7 +433,7 @@ void CheckerDDR3::insert(Command command, const tlm_generic_payload& payload) Rank rank = ControllerExtension::getRank(payload); Bank bank = ControllerExtension::getBank(payload); - PRINTDEBUGMESSAGE("CheckerDDR3", "Changing state on bank " + std::to_string(bank.ID()) + PRINTDEBUGMESSAGE("CheckerDDR3", "Changing state on bank " + std::to_string(static_cast(bank)) + " command is " + command.toString()); lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerDDR4.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerDDR4.cpp index b3f11245..9f215a44 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerDDR4.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerDDR4.cpp @@ -467,7 +467,7 @@ void CheckerDDR4::insert(Command command, const tlm_generic_payload& payload) BankGroup bankGroup = ControllerExtension::getBankGroup(payload); Bank bank = ControllerExtension::getBank(payload); - PRINTDEBUGMESSAGE("CheckerDDR4", "Changing state on bank " + std::to_string(bank.ID()) + PRINTDEBUGMESSAGE("CheckerDDR4", "Changing state on bank " + std::to_string(static_cast(bank)) + " command is " + command.toString()); lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5.cpp index 3b41577c..a7c4b9e8 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5.cpp @@ -549,7 +549,7 @@ void CheckerGDDR5::insert(Command command, const tlm_generic_payload& payload) BankGroup bankGroup = ControllerExtension::getBankGroup(payload); Bank bank = ControllerExtension::getBank(payload); - PRINTDEBUGMESSAGE("CheckerGDDR5", "Changing state on bank " + std::to_string(bank.ID()) + PRINTDEBUGMESSAGE("CheckerGDDR5", "Changing state on bank " + std::to_string(static_cast(bank)) + " command is " + command.toString()); lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.cpp index f4c04a16..b92c614b 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR5X.cpp @@ -553,7 +553,7 @@ void CheckerGDDR5X::insert(Command command, const tlm_generic_payload& payload) BankGroup bankGroup = ControllerExtension::getBankGroup(payload); Bank bank = ControllerExtension::getBank(payload); - PRINTDEBUGMESSAGE("CheckerGDDR5X", "Changing state on bank " + std::to_string(bank.ID()) + PRINTDEBUGMESSAGE("CheckerGDDR5X", "Changing state on bank " + std::to_string(static_cast(bank)) + " command is " + command.toString()); lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.cpp index 28bd7f38..bfdb9185 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerGDDR6.cpp @@ -570,7 +570,7 @@ void CheckerGDDR6::insert(Command command, const tlm_generic_payload& payload) BankGroup bankGroup = ControllerExtension::getBankGroup(payload); Bank bank = ControllerExtension::getBank(payload); - PRINTDEBUGMESSAGE("CheckerGDDR6", "Changing state on bank " + std::to_string(bank.ID()) + PRINTDEBUGMESSAGE("CheckerGDDR6", "Changing state on bank " + std::to_string(static_cast(bank)) + " command is " + command.toString()); lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.cpp index 31f428ba..a33368a5 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.cpp @@ -528,7 +528,7 @@ void CheckerHBM2::insert(Command command, const tlm_generic_payload& payload) BankGroup bankGroup = ControllerExtension::getBankGroup(payload); Bank bank = ControllerExtension::getBank(payload); - PRINTDEBUGMESSAGE("CheckerHBM2", "Changing state on bank " + std::to_string(bank.ID()) + PRINTDEBUGMESSAGE("CheckerHBM2", "Changing state on bank " + std::to_string(static_cast(bank)) + " command is " + command.toString()); lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.cpp index 8490480d..037b78d9 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerLPDDR4.cpp @@ -521,7 +521,7 @@ void CheckerLPDDR4::insert(Command command, const tlm_generic_payload& payload) Rank rank = ControllerExtension::getRank(payload); Bank bank = ControllerExtension::getBank(payload); - PRINTDEBUGMESSAGE("CheckerLPDDR4", "Changing state on bank " + std::to_string(bank.ID()) + PRINTDEBUGMESSAGE("CheckerLPDDR4", "Changing state on bank " + std::to_string(static_cast(bank)) + " command is " + command.toString()); lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.cpp index 292c31c5..11c92ff3 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerSTTMRAM.cpp @@ -389,7 +389,7 @@ void CheckerSTTMRAM::insert(Command command, const tlm_generic_payload& payload) Rank rank = ControllerExtension::getRank(payload); Bank bank = ControllerExtension::getBank(payload); - PRINTDEBUGMESSAGE("CheckerSTTMRAM", "Changing state on bank " + std::to_string(bank.ID()) + PRINTDEBUGMESSAGE("CheckerSTTMRAM", "Changing state on bank " + std::to_string(static_cast(bank)) + " command is " + command.toString()); lastScheduledByCommandAndRank[command][rank] = sc_time_stamp(); diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.cpp index 94174941..5345c9d1 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO.cpp @@ -410,7 +410,7 @@ void CheckerWideIO::insert(Command command, const tlm_generic_payload& payload) Rank rank = ControllerExtension::getRank(payload); Bank bank = ControllerExtension::getBank(payload); - PRINTDEBUGMESSAGE("CheckerWideIO", "Changing state on bank " + std::to_string(bank.ID()) + PRINTDEBUGMESSAGE("CheckerWideIO", "Changing state on bank " + std::to_string(static_cast(bank)) + " command is " + command.toString()); lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.cpp index cf92fc0d..c23c5fc7 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerWideIO2.cpp @@ -488,7 +488,7 @@ void CheckerWideIO2::insert(Command command, const tlm_generic_payload& payload) Rank rank = ControllerExtension::getRank(payload); Bank bank = ControllerExtension::getBank(payload); - PRINTDEBUGMESSAGE("CheckerWideIO2", "Changing state on bank " + std::to_string(bank.ID()) + PRINTDEBUGMESSAGE("CheckerWideIO2", "Changing state on bank " + std::to_string(static_cast(bank)) + " command is " + command.toString()); lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); diff --git a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerIF.h b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerIF.h index fd2f579e..3f8b7d7d 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerIF.h +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerIF.h @@ -55,7 +55,7 @@ protected: Rank rank, unsigned numberOfRanks) { // Calculate bit-reversal rank ID - unsigned rankID = rank.ID(); + auto rankID = static_cast(rank); unsigned reverseRankID = 0; unsigned rankBits = 0; unsigned rankShift = numberOfRanks; diff --git a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPer2Bank.cpp b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPer2Bank.cpp index b84c096e..fe8151ee 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPer2Bank.cpp +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerPer2Bank.cpp @@ -58,8 +58,8 @@ RefreshManagerPer2Bank::RefreshManagerPer2Bank(const Configuration& config, { for (unsigned bankID = outerID; bankID < (outerID + memSpec.getPer2BankOffset()); bankID++) { - Bank firstBank(bankID); - Bank secondBank(bankID + memSpec.getPer2BankOffset()); + Bank firstBank = Bank(bankID); + Bank secondBank = Bank(bankID + memSpec.getPer2BankOffset()); setUpDummy(refreshPayloads[bankMachinesOnRank[firstBank]], 0, rank, bankMachinesOnRank[firstBank]->getBankGroup(), bankMachinesOnRank[firstBank]->getBank()); setUpDummy(refreshPayloads[bankMachinesOnRank[secondBank]], 0, rank, diff --git a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerSameBank.cpp b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerSameBank.cpp index 97e99a10..f1cb9013 100644 --- a/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerSameBank.cpp +++ b/src/libdramsys/DRAMSys/controller/refresh/RefreshManagerSameBank.cpp @@ -80,7 +80,7 @@ RefreshManagerSameBank::RefreshManagerSameBank(const Configuration& config, CommandTuple::Type RefreshManagerSameBank::getNextCommand() { return {nextCommand, - &refreshPayloads[currentIterator->front()->getBank().ID() % memSpec.banksPerGroup], + &refreshPayloads[static_cast(currentIterator->front()->getBank()) % memSpec.banksPerGroup], SC_ZERO_TIME}; } diff --git a/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterBankwise.cpp b/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterBankwise.cpp index 8ecf6bbb..29b5398a 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterBankwise.cpp +++ b/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterBankwise.cpp @@ -54,7 +54,7 @@ bool BufferCounterBankwise::hasBufferSpace() const void BufferCounterBankwise::storeRequest(const tlm_generic_payload& trans) { - lastBankID = ControllerExtension::getBank(trans).ID(); + lastBankID = static_cast(ControllerExtension::getBank(trans)); numRequestsOnBank[lastBankID]++; if (trans.is_read()) numReadRequests++; @@ -64,7 +64,7 @@ void BufferCounterBankwise::storeRequest(const tlm_generic_payload& trans) void BufferCounterBankwise::removeRequest(const tlm_generic_payload& trans) { - numRequestsOnBank[ControllerExtension::getBank(trans).ID()]--; + numRequestsOnBank[static_cast(ControllerExtension::getBank(trans))]--; if (trans.is_read()) numReadRequests--; else diff --git a/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterBankwise.h b/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterBankwise.h index 42b07fb7..c335cce3 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterBankwise.h +++ b/src/libdramsys/DRAMSys/controller/scheduler/BufferCounterBankwise.h @@ -57,7 +57,7 @@ public: private: const unsigned requestBufferSize; std::vector numRequestsOnBank; - unsigned lastBankID = 0; + std::size_t lastBankID = 0; unsigned numReadRequests = 0; unsigned numWriteRequests = 0; }; diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFifo.cpp b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFifo.cpp index 7744ccc4..046d83ca 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFifo.cpp +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFifo.cpp @@ -45,7 +45,7 @@ namespace DRAMSys SchedulerFifo::SchedulerFifo(const Configuration& config) { - buffer = std::vector>(config.memSpec->banksPerChannel); + buffer = ControllerVector>(config.memSpec->banksPerChannel); if (config.schedulerBuffer == Configuration::SchedulerBuffer::Bankwise) bufferCounter = std::make_unique(config.requestBufferSize, config.memSpec->banksPerChannel); @@ -62,30 +62,30 @@ bool SchedulerFifo::hasBufferSpace() const void SchedulerFifo::storeRequest(tlm_generic_payload& payload) { - buffer[ControllerExtension::getBank(payload).ID()].push_back(&payload); + buffer[ControllerExtension::getBank(payload)].push_back(&payload); bufferCounter->storeRequest(payload); } void SchedulerFifo::removeRequest(tlm_generic_payload& payload) { - buffer[ControllerExtension::getBank(payload).ID()].pop_front(); + buffer[ControllerExtension::getBank(payload)].pop_front(); bufferCounter->removeRequest(payload); } tlm_generic_payload* SchedulerFifo::getNextRequest(const BankMachine& bankMachine) const { - unsigned bankID = bankMachine.getBank().ID(); - if (!buffer[bankID].empty()) - return buffer[bankID].front(); + Bank bank = bankMachine.getBank(); + if (!buffer[bank].empty()) + return buffer[bank].front(); else return nullptr; } bool SchedulerFifo::hasFurtherRowHit(Bank bank, Row row, tlm_command command) const { - if (buffer[bank.ID()].size() >= 2) + if (buffer[bank].size() >= 2) { - tlm_generic_payload& nextRequest = *buffer[bank.ID()][1]; + tlm_generic_payload& nextRequest = *buffer[bank][1]; if (ControllerExtension::getRow(nextRequest) == row) return true; } @@ -94,7 +94,7 @@ bool SchedulerFifo::hasFurtherRowHit(Bank bank, Row row, tlm_command command) co bool SchedulerFifo::hasFurtherRequest(Bank bank, tlm_command command) const { - if (buffer[bank.ID()].size() >= 2) + if (buffer[bank].size() >= 2) return true; else return false; diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFifo.h b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFifo.h index bbeb3089..29c28b2d 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFifo.h +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFifo.h @@ -61,7 +61,7 @@ public: [[nodiscard]] const std::vector& getBufferDepth() const override; private: - std::vector> buffer; + ControllerVector> buffer; std::unique_ptr bufferCounter; }; diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfs.cpp b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfs.cpp index 8298d362..93eeb263 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfs.cpp +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfs.cpp @@ -45,7 +45,7 @@ namespace DRAMSys SchedulerFrFcfs::SchedulerFrFcfs(const Configuration& config) { - buffer = std::vector>(config.memSpec->banksPerChannel); + buffer = ControllerVector>(config.memSpec->banksPerChannel); if (config.schedulerBuffer == Configuration::SchedulerBuffer::Bankwise) bufferCounter = std::make_unique(config.requestBufferSize, config.memSpec->banksPerChannel); @@ -62,19 +62,19 @@ bool SchedulerFrFcfs::hasBufferSpace() const void SchedulerFrFcfs::storeRequest(tlm_generic_payload& trans) { - buffer[ControllerExtension::getBank(trans).ID()].push_back(&trans); + buffer[ControllerExtension::getBank(trans)].push_back(&trans); bufferCounter->storeRequest(trans); } void SchedulerFrFcfs::removeRequest(tlm_generic_payload& trans) { bufferCounter->removeRequest(trans); - unsigned bankID = ControllerExtension::getBank(trans).ID(); - for (auto it = buffer[bankID].begin(); it != buffer[bankID].end(); it++) + Bank bank = ControllerExtension::getBank(trans); + for (auto it = buffer[bank].begin(); it != buffer[bank].end(); it++) { if (*it == &trans) { - buffer[bankID].erase(it); + buffer[bank].erase(it); break; } } @@ -82,21 +82,21 @@ void SchedulerFrFcfs::removeRequest(tlm_generic_payload& trans) tlm_generic_payload* SchedulerFrFcfs::getNextRequest(const BankMachine& bankMachine) const { - unsigned bankID = bankMachine.getBank().ID(); - if (!buffer[bankID].empty()) + Bank bank = bankMachine.getBank(); + if (!buffer[bank].empty()) { if (bankMachine.isActivated()) { // Search for row hit Row openRow = bankMachine.getOpenRow(); - for (auto it : buffer[bankID]) + for (auto it : buffer[bank]) { if (ControllerExtension::getRow(*it) == openRow) return it; } } // No row hit found or bank precharged - return buffer[bankID].front(); + return buffer[bank].front(); } return nullptr; } @@ -104,7 +104,7 @@ tlm_generic_payload* SchedulerFrFcfs::getNextRequest(const BankMachine& bankMach bool SchedulerFrFcfs::hasFurtherRowHit(Bank bank, Row row, tlm_command command) const { unsigned rowHitCounter = 0; - for (auto it : buffer[bank.ID()]) + for (auto it : buffer[bank]) { if (ControllerExtension::getRow(*it) == row) { @@ -118,7 +118,7 @@ bool SchedulerFrFcfs::hasFurtherRowHit(Bank bank, Row row, tlm_command command) bool SchedulerFrFcfs::hasFurtherRequest(Bank bank, tlm_command command) const { - return (buffer[bank.ID()].size() >= 2); + return (buffer[bank].size() >= 2); } const std::vector& SchedulerFrFcfs::getBufferDepth() const diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfs.h b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfs.h index a91531ec..697b46c7 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfs.h +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfs.h @@ -61,7 +61,7 @@ public: [[nodiscard]] const std::vector& getBufferDepth() const override; private: - std::vector> buffer; + ControllerVector> buffer; std::unique_ptr bufferCounter; }; diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.cpp b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.cpp index 0cd7dc3b..22c0fdd9 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.cpp +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.cpp @@ -45,7 +45,7 @@ namespace DRAMSys SchedulerFrFcfsGrp::SchedulerFrFcfsGrp(const Configuration& config) { - buffer = std::vector>(config.memSpec->banksPerChannel); + buffer = ControllerVector>(config.memSpec->banksPerChannel); if (config.schedulerBuffer == Configuration::SchedulerBuffer::Bankwise) bufferCounter = std::make_unique(config.requestBufferSize, config.memSpec->banksPerChannel); @@ -62,7 +62,7 @@ bool SchedulerFrFcfsGrp::hasBufferSpace() const void SchedulerFrFcfsGrp::storeRequest(tlm_generic_payload& trans) { - buffer[ControllerExtension::getBank(trans).ID()].push_back(&trans); + buffer[ControllerExtension::getBank(trans)].push_back(&trans); bufferCounter->storeRequest(trans); } @@ -70,12 +70,12 @@ void SchedulerFrFcfsGrp::removeRequest(tlm_generic_payload& trans) { bufferCounter->removeRequest(trans); lastCommand = trans.get_command(); - unsigned bankID = ControllerExtension::getBank(trans).ID(); - for (auto it = buffer[bankID].begin(); it != buffer[bankID].end(); it++) + Bank bank = ControllerExtension::getBank(trans); + for (auto it = buffer[bank].begin(); it != buffer[bank].end(); it++) { if (*it == &trans) { - buffer[bankID].erase(it); + buffer[bank].erase(it); break; } } @@ -83,15 +83,15 @@ void SchedulerFrFcfsGrp::removeRequest(tlm_generic_payload& trans) tlm_generic_payload* SchedulerFrFcfsGrp::getNextRequest(const BankMachine& bankMachine) const { - unsigned bankID = bankMachine.getBank().ID(); - if (!buffer[bankID].empty()) + Bank bank = bankMachine.getBank(); + if (!buffer[bank].empty()) { if (bankMachine.isActivated()) { // Filter all row hits Row openRow = bankMachine.getOpenRow(); std::list rowHits; - for (auto it : buffer[bankID]) + for (auto it : buffer[bank]) { if (ControllerExtension::getRow(*it) == openRow) rowHits.push_back(it); @@ -121,7 +121,7 @@ tlm_generic_payload* SchedulerFrFcfsGrp::getNextRequest(const BankMachine& bankM } } // No row hit found or bank precharged - return buffer[bankID].front(); + return buffer[bank].front(); } return nullptr; } @@ -129,7 +129,7 @@ tlm_generic_payload* SchedulerFrFcfsGrp::getNextRequest(const BankMachine& bankM bool SchedulerFrFcfsGrp::hasFurtherRowHit(Bank bank, Row row, tlm_command command) const { unsigned rowHitCounter = 0; - for (auto it : buffer[bank.ID()]) + for (auto it : buffer[bank]) { if (ControllerExtension::getRow(*it) == row) { @@ -143,7 +143,7 @@ bool SchedulerFrFcfsGrp::hasFurtherRowHit(Bank bank, Row row, tlm_command comman bool SchedulerFrFcfsGrp::hasFurtherRequest(Bank bank, tlm_command command) const { - if (buffer[bank.ID()].size() >= 2) + if (buffer[bank].size() >= 2) return true; else return false; diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.h b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.h index 717a6c5a..5101313a 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.h +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerFrFcfsGrp.h @@ -61,7 +61,7 @@ public: [[nodiscard]] const std::vector& getBufferDepth() const override; private: - std::vector> buffer; + ControllerVector> buffer; tlm::tlm_command lastCommand = tlm::TLM_READ_COMMAND; std::unique_ptr bufferCounter; }; diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.cpp b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.cpp index 0d9075c9..806c554a 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.cpp +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.cpp @@ -45,8 +45,8 @@ namespace DRAMSys SchedulerGrpFrFcfs::SchedulerGrpFrFcfs(const Configuration& config) { - readBuffer = std::vector>(config.memSpec->banksPerChannel); - writeBuffer = std::vector>(config.memSpec->banksPerChannel); + readBuffer = ControllerVector>(config.memSpec->banksPerChannel); + writeBuffer = ControllerVector>(config.memSpec->banksPerChannel); if (config.schedulerBuffer == Configuration::SchedulerBuffer::Bankwise) bufferCounter = std::make_unique(config.requestBufferSize, config.memSpec->banksPerChannel); @@ -66,9 +66,9 @@ bool SchedulerGrpFrFcfs::hasBufferSpace() const void SchedulerGrpFrFcfs::storeRequest(tlm_generic_payload& trans) { if (trans.is_read()) - readBuffer[ControllerExtension::getBank(trans).ID()].push_back(&trans); + readBuffer[ControllerExtension::getBank(trans)].push_back(&trans); else - writeBuffer[ControllerExtension::getBank(trans).ID()].push_back(&trans); + writeBuffer[ControllerExtension::getBank(trans)].push_back(&trans); bufferCounter->storeRequest(trans); } @@ -76,86 +76,86 @@ void SchedulerGrpFrFcfs::removeRequest(tlm_generic_payload& trans) { bufferCounter->removeRequest(trans); lastCommand = trans.get_command(); - unsigned bankID = ControllerExtension::getBank(trans).ID(); + Bank bank = ControllerExtension::getBank(trans); if (trans.is_read()) - readBuffer[bankID].remove(&trans); + readBuffer[bank].remove(&trans); else - writeBuffer[bankID].remove(&trans); + writeBuffer[bank].remove(&trans); } tlm_generic_payload* SchedulerGrpFrFcfs::getNextRequest(const BankMachine& bankMachine) const { // search row hits, search wrd/wr hits // search rd/wr hits, search row hits - unsigned bankID = bankMachine.getBank().ID(); + Bank bank = bankMachine.getBank(); if (lastCommand == tlm::TLM_READ_COMMAND) { - if (!readBuffer[bankID].empty()) + if (!readBuffer[bank].empty()) { if (bankMachine.isActivated()) { // Search for read row hit Row openRow = bankMachine.getOpenRow(); - for (auto it : readBuffer[bankID]) + for (auto it : readBuffer[bank]) { if (ControllerExtension::getRow(*it) == openRow) return it; } } // No read row hit found or bank precharged - return readBuffer[bankID].front(); + return readBuffer[bank].front(); } - else if (!writeBuffer[bankID].empty()) + else if (!writeBuffer[bank].empty()) { if (bankMachine.isActivated()) { // Search for write row hit Row openRow = bankMachine.getOpenRow(); - for (auto it : writeBuffer[bankID]) + for (auto it : writeBuffer[bank]) { if (ControllerExtension::getRow(*it) == openRow) return it; } } // No write row hit found or bank precharged - return writeBuffer[bankID].front(); + return writeBuffer[bank].front(); } else return nullptr; } else { - if (!writeBuffer[bankID].empty()) + if (!writeBuffer[bank].empty()) { if (bankMachine.isActivated()) { // Search for write row hit Row openRow = bankMachine.getOpenRow(); - for (auto it : writeBuffer[bankID]) + for (auto it : writeBuffer[bank]) { if (ControllerExtension::getRow(*it) == openRow) return it; } } // No write row hit found or bank precharged - return writeBuffer[bankID].front(); + return writeBuffer[bank].front(); } - else if (!readBuffer[bankID].empty()) + else if (!readBuffer[bank].empty()) { if (bankMachine.isActivated()) { // Search for read row hit Row openRow = bankMachine.getOpenRow(); - for (auto it : readBuffer[bankID]) + for (auto it : readBuffer[bank]) { if (ControllerExtension::getRow(*it) == openRow) return it; } } // No read row hit found or bank precharged - return readBuffer[bankID].front(); + return readBuffer[bank].front(); } else return nullptr; @@ -168,7 +168,7 @@ bool SchedulerGrpFrFcfs::hasFurtherRowHit(Bank bank, Row row, tlm_command comman unsigned rowHitCounter = 0; if (command == tlm::TLM_READ_COMMAND) { - for (auto it : readBuffer[bank.ID()]) + for (auto it : readBuffer[bank]) { if (ControllerExtension::getRow(*it) == row) { @@ -181,7 +181,7 @@ bool SchedulerGrpFrFcfs::hasFurtherRowHit(Bank bank, Row row, tlm_command comman } else { - for (auto it : writeBuffer[bank.ID()]) + for (auto it : writeBuffer[bank]) { if (ControllerExtension::getRow(*it) == row) { @@ -198,14 +198,14 @@ bool SchedulerGrpFrFcfs::hasFurtherRequest(Bank bank, tlm_command command) const { if (command == tlm::TLM_READ_COMMAND) { - if (readBuffer[bank.ID()].size() >= 2) + if (readBuffer[bank].size() >= 2) return true; else return false; } else { - if (writeBuffer[bank.ID()].size() >= 2) + if (writeBuffer[bank].size() >= 2) return true; else return false; diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.h b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.h index 904064a9..cf14b49e 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.h +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfs.h @@ -61,8 +61,8 @@ public: [[nodiscard]] const std::vector& getBufferDepth() const override; private: - std::vector> readBuffer; - std::vector> writeBuffer; + ControllerVector> readBuffer; + ControllerVector> writeBuffer; tlm::tlm_command lastCommand = tlm::TLM_READ_COMMAND; std::unique_ptr bufferCounter; }; diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.cpp b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.cpp index f6f2c95c..7673b8fb 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.cpp +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.cpp @@ -46,8 +46,8 @@ namespace DRAMSys SchedulerGrpFrFcfsWm::SchedulerGrpFrFcfsWm(const Configuration& config) : lowWatermark(config.lowWatermark), highWatermark(config.highWatermark) { - readBuffer = std::vector>(config.memSpec->banksPerChannel); - writeBuffer = std::vector>(config.memSpec->banksPerChannel); + readBuffer = ControllerVector>(config.memSpec->banksPerChannel); + writeBuffer = ControllerVector>(config.memSpec->banksPerChannel); if (config.schedulerBuffer == Configuration::SchedulerBuffer::Bankwise) bufferCounter = std::make_unique(config.requestBufferSize, config.memSpec->banksPerChannel); @@ -70,9 +70,9 @@ bool SchedulerGrpFrFcfsWm::hasBufferSpace() const void SchedulerGrpFrFcfsWm::storeRequest(tlm_generic_payload& trans) { if (trans.is_read()) - readBuffer[ControllerExtension::getBank(trans).ID()].push_back(&trans); + readBuffer[ControllerExtension::getBank(trans)].push_back(&trans); else - writeBuffer[ControllerExtension::getBank(trans).ID()].push_back(&trans); + writeBuffer[ControllerExtension::getBank(trans)].push_back(&trans); bufferCounter->storeRequest(trans); evaluateWriteMode(); } @@ -80,56 +80,56 @@ void SchedulerGrpFrFcfsWm::storeRequest(tlm_generic_payload& trans) void SchedulerGrpFrFcfsWm::removeRequest(tlm_generic_payload& trans) { bufferCounter->removeRequest(trans); - unsigned bankID = ControllerExtension::getBank(trans).ID(); + Bank bank = ControllerExtension::getBank(trans); if (trans.is_read()) - readBuffer[bankID].remove(&trans); + readBuffer[bank].remove(&trans); else - writeBuffer[bankID].remove(&trans); + writeBuffer[bank].remove(&trans); evaluateWriteMode(); } tlm_generic_payload* SchedulerGrpFrFcfsWm::getNextRequest(const BankMachine& bankMachine) const { - unsigned bankID = bankMachine.getBank().ID(); + Bank bank = bankMachine.getBank(); if (!writeMode) { - if (!readBuffer[bankID].empty()) + if (!readBuffer[bank].empty()) { if (bankMachine.isActivated()) { // Search for read row hit Row openRow = bankMachine.getOpenRow(); - for (auto it : readBuffer[bankID]) + for (auto it : readBuffer[bank]) { if (ControllerExtension::getRow(*it) == openRow) return it; } } // No read row hit found or bank precharged - return readBuffer[bankID].front(); + return readBuffer[bank].front(); } else return nullptr; } else { - if (!writeBuffer[bankID].empty()) + if (!writeBuffer[bank].empty()) { if (bankMachine.isActivated()) { // Search for write row hit Row openRow = bankMachine.getOpenRow(); - for (auto it : writeBuffer[bankID]) + for (auto it : writeBuffer[bank]) { if (ControllerExtension::getRow(*it) == openRow) return it; } } // No row hit found or bank precharged - return writeBuffer[bankID].front(); + return writeBuffer[bank].front(); } else return nullptr; @@ -141,7 +141,7 @@ bool SchedulerGrpFrFcfsWm::hasFurtherRowHit(Bank bank, Row row, tlm::tlm_command unsigned rowHitCounter = 0; if (!writeMode) { - for (const auto* it : readBuffer[bank.ID()]) + for (const auto* it : readBuffer[bank]) { if (ControllerExtension::getRow(*it) == row) { @@ -154,7 +154,7 @@ bool SchedulerGrpFrFcfsWm::hasFurtherRowHit(Bank bank, Row row, tlm::tlm_command } else { - for (auto it : writeBuffer[bank.ID()]) + for (auto it : writeBuffer[bank]) { if (ControllerExtension::getRow(*it) == row) { @@ -170,9 +170,9 @@ bool SchedulerGrpFrFcfsWm::hasFurtherRowHit(Bank bank, Row row, tlm::tlm_command bool SchedulerGrpFrFcfsWm::hasFurtherRequest(Bank bank, tlm::tlm_command command) const { if (!writeMode) - return (readBuffer[bank.ID()].size() >= 2); + return (readBuffer[bank].size() >= 2); else - return (writeBuffer[bank.ID()].size() >= 2); + return (writeBuffer[bank].size() >= 2); } const std::vector& SchedulerGrpFrFcfsWm::getBufferDepth() const diff --git a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.h b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.h index d7ef4fed..85ef3b24 100644 --- a/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.h +++ b/src/libdramsys/DRAMSys/controller/scheduler/SchedulerGrpFrFcfsWm.h @@ -64,8 +64,8 @@ public: private: void evaluateWriteMode(); - std::vector> readBuffer; - std::vector> writeBuffer; + ControllerVector> readBuffer; + ControllerVector> writeBuffer; std::unique_ptr bufferCounter; const unsigned lowWatermark; const unsigned highWatermark; diff --git a/src/libdramsys/DRAMSys/simulation/Arbiter.cpp b/src/libdramsys/DRAMSys/simulation/Arbiter.cpp index d7a6c383..2b02b8ec 100644 --- a/src/libdramsys/DRAMSys/simulation/Arbiter.cpp +++ b/src/libdramsys/DRAMSys/simulation/Arbiter.cpp @@ -72,8 +72,8 @@ ArbiterSimple::ArbiterSimple(const sc_module_name& name, const Configuration& co ArbiterFifo::ArbiterFifo(const sc_module_name& name, const Configuration& config, const AddressDecoder& addressDecoder) : - Arbiter(name, config, addressDecoder), - maxActiveTransactions(config.maxActiveTransactions) {} + Arbiter(name, config, addressDecoder), + maxActiveTransactionsPerThread(config.maxActiveTransactions) {} ArbiterReorder::ArbiterReorder(const sc_module_name& name, const Configuration& config, const AddressDecoder& addressDecoder) : @@ -83,14 +83,14 @@ ArbiterReorder::ArbiterReorder(const sc_module_name& name, const Configuration& void Arbiter::end_of_elaboration() { // initiator side - threadIsBusy = std::vector(tSocket.size(), false); - nextThreadPayloadIDToAppend = std::vector(tSocket.size(), 1); + threadIsBusy = ControllerVector(tSocket.size(), false); + nextThreadPayloadIDToAppend = ControllerVector(tSocket.size(), 1); // channel side - channelIsBusy = std::vector(iSocket.size(), false); - pendingRequests = std::vector>(iSocket.size(), - std::queue()); - nextChannelPayloadIDToAppend = std::vector(iSocket.size(), 1); + channelIsBusy = ControllerVector(iSocket.size(), false); + pendingRequestsOnChannel = ControllerVector>( + iSocket.size(), std::queue()); + nextChannelPayloadIDToAppend = ControllerVector(iSocket.size(), 1); } void ArbiterSimple::end_of_elaboration() @@ -98,8 +98,8 @@ void ArbiterSimple::end_of_elaboration() Arbiter::end_of_elaboration(); // initiator side - pendingResponses = std::vector>(tSocket.size(), - std::queue()); + pendingResponsesOnThread = ControllerVector>( + tSocket.size(), std::queue()); } void ArbiterFifo::end_of_elaboration() @@ -107,13 +107,13 @@ void ArbiterFifo::end_of_elaboration() Arbiter::end_of_elaboration(); // initiator side - activeTransactions = std::vector(tSocket.size(), 0); - outstandingEndReq = std::vector(tSocket.size(), nullptr); - pendingResponses = std::vector>(tSocket.size(), - std::queue()); + activeTransactionsOnThread = ControllerVector(tSocket.size(), 0); + outstandingEndReqOnThread = ControllerVector(tSocket.size(), nullptr); + pendingResponsesOnThread = ControllerVector>( + tSocket.size(), std::queue()); - lastEndReq = std::vector(iSocket.size(), sc_max_time()); - lastEndResp = std::vector(tSocket.size(), sc_max_time()); + lastEndReqOnChannel = ControllerVector(iSocket.size(), sc_max_time()); + lastEndRespOnThread = ControllerVector(tSocket.size(), sc_max_time()); } void ArbiterReorder::end_of_elaboration() @@ -121,14 +121,14 @@ void ArbiterReorder::end_of_elaboration() Arbiter::end_of_elaboration(); // initiator side - activeTransactions = std::vector(tSocket.size(), 0); - outstandingEndReq = std::vector(tSocket.size(), nullptr); - pendingResponses = std::vector> + activeTransactionsOnThread = ControllerVector(tSocket.size(), 0); + outstandingEndReqOnThread = ControllerVector(tSocket.size(), nullptr); + pendingResponsesOnThread = ControllerVector> (tSocket.size(), std::set()); - nextThreadPayloadIDToReturn = std::vector(tSocket.size(), 1); + nextThreadPayloadIDToReturn = ControllerVector(tSocket.size(), 1); - lastEndReq = std::vector(iSocket.size(), sc_max_time()); - lastEndResp = std::vector(tSocket.size(), sc_max_time()); + lastEndReqOnChannel = ControllerVector(iSocket.size(), sc_max_time()); + lastEndRespOnThread = ControllerVector(tSocket.size(), sc_max_time()); } tlm_sync_enum Arbiter::nb_transport_fw(int id, tlm_generic_payload& trans, @@ -183,24 +183,24 @@ unsigned int Arbiter::transport_dbg(int /*id*/, tlm::tlm_generic_payload& trans) void ArbiterSimple::peqCallback(tlm_generic_payload& cbTrans, const tlm_phase& cbPhase) { - unsigned int threadId = ArbiterExtension::getThread(cbTrans).ID(); - unsigned int channelId = ArbiterExtension::getChannel(cbTrans).ID(); + Thread thread = ArbiterExtension::getThread(cbTrans); + Channel channel = ArbiterExtension::getChannel(cbTrans); if (cbPhase == BEGIN_REQ) // from initiator { - ArbiterExtension::setIDAndTimeOfGeneration(cbTrans, nextThreadPayloadIDToAppend[threadId]++, sc_time_stamp()); + ArbiterExtension::setIDAndTimeOfGeneration(cbTrans, nextThreadPayloadIDToAppend[thread]++, sc_time_stamp()); - if (!channelIsBusy[channelId]) + if (!channelIsBusy[channel]) { - channelIsBusy[channelId] = true; + channelIsBusy[channel] = true; tlm_phase tPhase = BEGIN_REQ; sc_time tDelay = arbitrationDelayFw; - iSocket[static_cast(channelId)]->nb_transport_fw(cbTrans, tPhase, tDelay); + iSocket[static_cast(channel)]->nb_transport_fw(cbTrans, tPhase, tDelay); } else - pendingRequests[channelId].push(&cbTrans); + pendingRequestsOnChannel[channel].push(&cbTrans); } else if (cbPhase == END_REQ) // from target { @@ -208,37 +208,37 @@ void ArbiterSimple::peqCallback(tlm_generic_payload& cbTrans, const tlm_phase& c tlm_phase tPhase = END_REQ; sc_time tDelay = SC_ZERO_TIME; - tSocket[static_cast(threadId)]->nb_transport_bw(cbTrans, tPhase, tDelay); + tSocket[static_cast(thread)]->nb_transport_bw(cbTrans, tPhase, tDelay); } - if (!pendingRequests[channelId].empty()) + if (!pendingRequestsOnChannel[channel].empty()) { - tlm_generic_payload &tPayload = *pendingRequests[channelId].front(); - pendingRequests[channelId].pop(); + tlm_generic_payload &tPayload = *pendingRequestsOnChannel[channel].front(); + pendingRequestsOnChannel[channel].pop(); tlm_phase tPhase = BEGIN_REQ; // do not send two requests in the same cycle sc_time tDelay = tCK + arbitrationDelayFw; - iSocket[static_cast(channelId)]->nb_transport_fw(tPayload, tPhase, tDelay); + iSocket[static_cast(channel)]->nb_transport_fw(tPayload, tPhase, tDelay); } else - channelIsBusy[channelId] = false; + channelIsBusy[channel] = false; } else if (cbPhase == BEGIN_RESP) // from memory controller { - if (!threadIsBusy[threadId]) + if (!threadIsBusy[thread]) { tlm_phase tPhase = BEGIN_RESP; sc_time tDelay = arbitrationDelayBw; - tlm_sync_enum returnValue = tSocket[static_cast(threadId)]->nb_transport_bw(cbTrans, tPhase, tDelay); + tlm_sync_enum returnValue = tSocket[static_cast(thread)]->nb_transport_bw(cbTrans, tPhase, tDelay); // Early completion from initiator if (returnValue == TLM_UPDATED) payloadEventQueue.notify(cbTrans, tPhase, tDelay); - threadIsBusy[threadId] = true; + threadIsBusy[thread] = true; } else - pendingResponses[threadId].push(&cbTrans); + pendingResponsesOnThread[thread].push(&cbTrans); } else if (cbPhase == END_RESP) // from initiator { @@ -246,25 +246,25 @@ void ArbiterSimple::peqCallback(tlm_generic_payload& cbTrans, const tlm_phase& c tlm_phase tPhase = END_RESP; sc_time tDelay = SC_ZERO_TIME; - iSocket[static_cast(channelId)]->nb_transport_fw(cbTrans, tPhase, tDelay); + iSocket[static_cast(channel)]->nb_transport_fw(cbTrans, tPhase, tDelay); } cbTrans.release(); - if (!pendingResponses[threadId].empty()) + if (!pendingResponsesOnThread[thread].empty()) { - tlm_generic_payload &tPayload = *pendingResponses[threadId].front(); - pendingResponses[threadId].pop(); + tlm_generic_payload &tPayload = *pendingResponsesOnThread[thread].front(); + pendingResponsesOnThread[thread].pop(); tlm_phase tPhase = BEGIN_RESP; // do not send two responses in the same cycle sc_time tDelay = tCK + arbitrationDelayBw; - tlm_sync_enum returnValue = tSocket[static_cast(threadId)]->nb_transport_bw(tPayload, tPhase, tDelay); + tlm_sync_enum returnValue = tSocket[static_cast(thread)]->nb_transport_bw(tPayload, tPhase, tDelay); // Early completion from initiator if (returnValue == TLM_UPDATED) payloadEventQueue.notify(tPayload, tPhase, tDelay); } else - threadIsBusy[threadId] = false; + threadIsBusy[thread] = false; } else SC_REPORT_FATAL(0, "Payload event queue in arbiter was triggered with unknown phase"); @@ -272,43 +272,43 @@ void ArbiterSimple::peqCallback(tlm_generic_payload& cbTrans, const tlm_phase& c void ArbiterFifo::peqCallback(tlm_generic_payload& cbTrans, const tlm_phase& cbPhase) { - unsigned int threadId = ArbiterExtension::getThread(cbTrans).ID(); - unsigned int channelId = ArbiterExtension::getChannel(cbTrans).ID(); + Thread thread = ArbiterExtension::getThread(cbTrans); + Channel channel = ArbiterExtension::getChannel(cbTrans); if (cbPhase == BEGIN_REQ) // from initiator { - if (activeTransactions[threadId] < maxActiveTransactions) + if (activeTransactionsOnThread[thread] < maxActiveTransactionsPerThread) { - activeTransactions[threadId]++; + activeTransactionsOnThread[thread]++; - ArbiterExtension::setIDAndTimeOfGeneration(cbTrans, nextThreadPayloadIDToAppend[threadId]++, + ArbiterExtension::setIDAndTimeOfGeneration(cbTrans, nextThreadPayloadIDToAppend[thread]++, sc_time_stamp()); tlm_phase tPhase = END_REQ; sc_time tDelay = SC_ZERO_TIME; - tSocket[static_cast(threadId)]->nb_transport_bw(cbTrans, tPhase, tDelay); + tSocket[static_cast(thread)]->nb_transport_bw(cbTrans, tPhase, tDelay); payloadEventQueue.notify(cbTrans, REQ_ARBITRATION, arbitrationDelayFw); } else - outstandingEndReq[threadId] = &cbTrans; + outstandingEndReqOnThread[thread] = &cbTrans; } else if (cbPhase == END_REQ) // from memory controller { - lastEndReq[channelId] = sc_time_stamp(); + lastEndReqOnChannel[channel] = sc_time_stamp(); - if (!pendingRequests[channelId].empty()) + if (!pendingRequestsOnChannel[channel].empty()) { - tlm_generic_payload &tPayload = *pendingRequests[channelId].front(); - pendingRequests[channelId].pop(); + tlm_generic_payload &tPayload = *pendingRequestsOnChannel[channel].front(); + pendingRequestsOnChannel[channel].pop(); tlm_phase tPhase = BEGIN_REQ; sc_time tDelay = tCK; - iSocket[static_cast(channelId)]->nb_transport_fw(tPayload, tPhase, tDelay); + iSocket[static_cast(channel)]->nb_transport_fw(tPayload, tPhase, tDelay); } else - channelIsBusy[channelId] = false; + channelIsBusy[channel] = false; } else if (cbPhase == BEGIN_RESP) // from memory controller { @@ -317,78 +317,78 @@ void ArbiterFifo::peqCallback(tlm_generic_payload& cbTrans, const tlm_phase& cbP tlm_phase tPhase = END_RESP; sc_time tDelay = SC_ZERO_TIME; - iSocket[static_cast(channelId)]->nb_transport_fw(cbTrans, tPhase, tDelay); + iSocket[static_cast(channel)]->nb_transport_fw(cbTrans, tPhase, tDelay); } payloadEventQueue.notify(cbTrans, RESP_ARBITRATION, arbitrationDelayBw); } else if (cbPhase == END_RESP) // from initiator { - lastEndResp[threadId] = sc_time_stamp(); + lastEndRespOnThread[thread] = sc_time_stamp(); cbTrans.release(); - if (outstandingEndReq[threadId] != nullptr) + if (outstandingEndReqOnThread[thread] != nullptr) { - tlm_generic_payload &tPayload = *outstandingEndReq[threadId]; - outstandingEndReq[threadId] = nullptr; + tlm_generic_payload &tPayload = *outstandingEndReqOnThread[thread]; + outstandingEndReqOnThread[thread] = nullptr; tlm_phase tPhase = END_REQ; sc_time tDelay = SC_ZERO_TIME; - ArbiterExtension::setIDAndTimeOfGeneration(tPayload, nextThreadPayloadIDToAppend[threadId]++, + ArbiterExtension::setIDAndTimeOfGeneration(tPayload, nextThreadPayloadIDToAppend[thread]++, sc_time_stamp()); - tSocket[static_cast(threadId)]->nb_transport_bw(tPayload, tPhase, tDelay); + tSocket[static_cast(thread)]->nb_transport_bw(tPayload, tPhase, tDelay); payloadEventQueue.notify(tPayload, REQ_ARBITRATION, arbitrationDelayFw); } else - activeTransactions[threadId]--; + activeTransactionsOnThread[thread]--; - if (!pendingResponses[threadId].empty()) + if (!pendingResponsesOnThread[thread].empty()) { - tlm_generic_payload &tPayload = *pendingResponses[threadId].front(); - pendingResponses[threadId].pop(); + tlm_generic_payload &tPayload = *pendingResponsesOnThread[thread].front(); + pendingResponsesOnThread[thread].pop(); tlm_phase tPhase = BEGIN_RESP; sc_time tDelay = tCK; - tlm_sync_enum returnValue = tSocket[static_cast(threadId)]->nb_transport_bw(tPayload, tPhase, tDelay); + tlm_sync_enum returnValue = tSocket[static_cast(thread)]->nb_transport_bw(tPayload, tPhase, tDelay); // Early completion from initiator if (returnValue == TLM_UPDATED) payloadEventQueue.notify(tPayload, tPhase, tDelay); } else - threadIsBusy[threadId] = false; + threadIsBusy[thread] = false; } else if (cbPhase == REQ_ARBITRATION) { - pendingRequests[channelId].push(&cbTrans); + pendingRequestsOnChannel[channel].push(&cbTrans); - if (!channelIsBusy[channelId]) + if (!channelIsBusy[channel]) { - channelIsBusy[channelId] = true; + channelIsBusy[channel] = true; - tlm_generic_payload &tPayload = *pendingRequests[channelId].front(); - pendingRequests[channelId].pop(); + tlm_generic_payload &tPayload = *pendingRequestsOnChannel[channel].front(); + pendingRequestsOnChannel[channel].pop(); tlm_phase tPhase = BEGIN_REQ; - sc_time tDelay = lastEndReq[channelId] == sc_time_stamp() ? tCK : SC_ZERO_TIME; + sc_time tDelay = lastEndReqOnChannel[channel] == sc_time_stamp() ? tCK : SC_ZERO_TIME; - iSocket[static_cast(channelId)]->nb_transport_fw(tPayload, tPhase, tDelay); + iSocket[static_cast(channel)]->nb_transport_fw(tPayload, tPhase, tDelay); } } else if (cbPhase == RESP_ARBITRATION) { - pendingResponses[threadId].push(&cbTrans); + pendingResponsesOnThread[thread].push(&cbTrans); - if (!threadIsBusy[threadId]) + if (!threadIsBusy[thread]) { - threadIsBusy[threadId] = true; + threadIsBusy[thread] = true; - tlm_generic_payload &tPayload = *pendingResponses[threadId].front(); - pendingResponses[threadId].pop(); + tlm_generic_payload &tPayload = *pendingResponsesOnThread[thread].front(); + pendingResponsesOnThread[thread].pop(); tlm_phase tPhase = BEGIN_RESP; - sc_time tDelay = lastEndResp[threadId] == sc_time_stamp() ? tCK : SC_ZERO_TIME; + sc_time tDelay = lastEndRespOnThread[thread] == sc_time_stamp() ? tCK : SC_ZERO_TIME; - tlm_sync_enum returnValue = tSocket[static_cast(threadId)]->nb_transport_bw(tPayload, tPhase, tDelay); + tlm_sync_enum returnValue = tSocket[static_cast(thread)]->nb_transport_bw(tPayload, tPhase, tDelay); // Early completion from initiator if (returnValue == TLM_UPDATED) payloadEventQueue.notify(tPayload, tPhase, tDelay); @@ -400,43 +400,43 @@ void ArbiterFifo::peqCallback(tlm_generic_payload& cbTrans, const tlm_phase& cbP void ArbiterReorder::peqCallback(tlm_generic_payload& cbTrans, const tlm_phase& cbPhase) { - unsigned int threadId = ArbiterExtension::getThread(cbTrans).ID(); - unsigned int channelId = ArbiterExtension::getChannel(cbTrans).ID(); + Thread thread = ArbiterExtension::getThread(cbTrans); + Channel channel = ArbiterExtension::getChannel(cbTrans); if (cbPhase == BEGIN_REQ) // from initiator { - if (activeTransactions[threadId] < maxActiveTransactions) + if (activeTransactionsOnThread[thread] < maxActiveTransactions) { - activeTransactions[threadId]++; + activeTransactionsOnThread[thread]++; - ArbiterExtension::setIDAndTimeOfGeneration(cbTrans, nextThreadPayloadIDToAppend[threadId]++, + ArbiterExtension::setIDAndTimeOfGeneration(cbTrans, nextThreadPayloadIDToAppend[thread]++, sc_time_stamp()); tlm_phase tPhase = END_REQ; sc_time tDelay = SC_ZERO_TIME; - tSocket[static_cast(threadId)]->nb_transport_bw(cbTrans, tPhase, tDelay); + tSocket[static_cast(thread)]->nb_transport_bw(cbTrans, tPhase, tDelay); payloadEventQueue.notify(cbTrans, REQ_ARBITRATION, arbitrationDelayFw); } else - outstandingEndReq[threadId] = &cbTrans; + outstandingEndReqOnThread[thread] = &cbTrans; } else if (cbPhase == END_REQ) // from memory controller { - lastEndReq[channelId] = sc_time_stamp(); + lastEndReqOnChannel[channel] = sc_time_stamp(); - if (!pendingRequests[channelId].empty()) + if (!pendingRequestsOnChannel[channel].empty()) { - tlm_generic_payload &tPayload = *pendingRequests[channelId].front(); - pendingRequests[channelId].pop(); + tlm_generic_payload &tPayload = *pendingRequestsOnChannel[channel].front(); + pendingRequestsOnChannel[channel].pop(); tlm_phase tPhase = BEGIN_REQ; sc_time tDelay = tCK; - iSocket[static_cast(channelId)]->nb_transport_fw(tPayload, tPhase, tDelay); + iSocket[static_cast(channel)]->nb_transport_fw(tPayload, tPhase, tDelay); } else - channelIsBusy[channelId] = false; + channelIsBusy[channel] = false; } else if (cbPhase == BEGIN_RESP) // from memory controller { @@ -444,86 +444,86 @@ void ArbiterReorder::peqCallback(tlm_generic_payload& cbTrans, const tlm_phase& { tlm_phase tPhase = END_RESP; sc_time tDelay = SC_ZERO_TIME; - iSocket[static_cast(channelId)]->nb_transport_fw(cbTrans, tPhase, tDelay); + iSocket[static_cast(channel)]->nb_transport_fw(cbTrans, tPhase, tDelay); } payloadEventQueue.notify(cbTrans, RESP_ARBITRATION, arbitrationDelayBw); } else if (cbPhase == END_RESP) // from initiator { - lastEndResp[threadId] = sc_time_stamp(); + lastEndRespOnThread[thread] = sc_time_stamp(); cbTrans.release(); - if (outstandingEndReq[threadId] != nullptr) + if (outstandingEndReqOnThread[thread] != nullptr) { - tlm_generic_payload &tPayload = *outstandingEndReq[threadId]; - outstandingEndReq[threadId] = nullptr; + tlm_generic_payload &tPayload = *outstandingEndReqOnThread[thread]; + outstandingEndReqOnThread[thread] = nullptr; tlm_phase tPhase = END_REQ; sc_time tDelay = SC_ZERO_TIME; - ArbiterExtension::setIDAndTimeOfGeneration(tPayload, nextThreadPayloadIDToAppend[threadId]++, + ArbiterExtension::setIDAndTimeOfGeneration(tPayload, nextThreadPayloadIDToAppend[thread]++, sc_time_stamp()); - tSocket[static_cast(threadId)]->nb_transport_bw(tPayload, tPhase, tDelay); + tSocket[static_cast(thread)]->nb_transport_bw(tPayload, tPhase, tDelay); payloadEventQueue.notify(tPayload, REQ_ARBITRATION, arbitrationDelayFw); } else - activeTransactions[threadId]--; + activeTransactionsOnThread[thread]--; - tlm_generic_payload &tPayload = **pendingResponses[threadId].begin(); + tlm_generic_payload &tPayload = **pendingResponsesOnThread[thread].begin(); - if (!pendingResponses[threadId].empty() && - ArbiterExtension::getThreadPayloadID(tPayload) == nextThreadPayloadIDToReturn[threadId]) + if (!pendingResponsesOnThread[thread].empty() && + ArbiterExtension::getThreadPayloadID(tPayload) == nextThreadPayloadIDToReturn[thread]) { - nextThreadPayloadIDToReturn[threadId]++; - pendingResponses[threadId].erase(pendingResponses[threadId].begin()); + nextThreadPayloadIDToReturn[thread]++; + pendingResponsesOnThread[thread].erase(pendingResponsesOnThread[thread].begin()); tlm_phase tPhase = BEGIN_RESP; sc_time tDelay = tCK; - tlm_sync_enum returnValue = tSocket[static_cast(threadId)]->nb_transport_bw(tPayload, tPhase, tDelay); + tlm_sync_enum returnValue = tSocket[static_cast(thread)]->nb_transport_bw(tPayload, tPhase, tDelay); // Early completion from initiator if (returnValue == TLM_UPDATED) payloadEventQueue.notify(tPayload, tPhase, tDelay); } else - threadIsBusy[threadId] = false; + threadIsBusy[thread] = false; } else if (cbPhase == REQ_ARBITRATION) { - pendingRequests[channelId].push(&cbTrans); + pendingRequestsOnChannel[channel].push(&cbTrans); - if (!channelIsBusy[channelId]) + if (!channelIsBusy[channel]) { - channelIsBusy[channelId] = true; + channelIsBusy[channel] = true; - tlm_generic_payload &tPayload = *pendingRequests[channelId].front(); - pendingRequests[channelId].pop(); + tlm_generic_payload &tPayload = *pendingRequestsOnChannel[channel].front(); + pendingRequestsOnChannel[channel].pop(); tlm_phase tPhase = BEGIN_REQ; - sc_time tDelay = lastEndReq[channelId] == sc_time_stamp() ? tCK : SC_ZERO_TIME; + sc_time tDelay = lastEndReqOnChannel[channel] == sc_time_stamp() ? tCK : SC_ZERO_TIME; - iSocket[static_cast(channelId)]->nb_transport_fw(tPayload, tPhase, tDelay); + iSocket[static_cast(channel)]->nb_transport_fw(tPayload, tPhase, tDelay); } } else if (cbPhase == RESP_ARBITRATION) { - pendingResponses[threadId].insert(&cbTrans); + pendingResponsesOnThread[thread].insert(&cbTrans); - if (!threadIsBusy[threadId]) + if (!threadIsBusy[thread]) { - tlm_generic_payload &tPayload = **pendingResponses[threadId].begin(); + tlm_generic_payload &tPayload = **pendingResponsesOnThread[thread].begin(); - if (ArbiterExtension::getThreadPayloadID(tPayload) == nextThreadPayloadIDToReturn[threadId]) + if (ArbiterExtension::getThreadPayloadID(tPayload) == nextThreadPayloadIDToReturn[thread]) { - threadIsBusy[threadId] = true; + threadIsBusy[thread] = true; - nextThreadPayloadIDToReturn[threadId]++; - pendingResponses[threadId].erase(pendingResponses[threadId].begin()); + nextThreadPayloadIDToReturn[thread]++; + pendingResponsesOnThread[thread].erase(pendingResponsesOnThread[thread].begin()); tlm_phase tPhase = BEGIN_RESP; - sc_time tDelay = lastEndResp[threadId] == sc_time_stamp() ? tCK : SC_ZERO_TIME; + sc_time tDelay = lastEndRespOnThread[thread] == sc_time_stamp() ? tCK : SC_ZERO_TIME; - tlm_sync_enum returnValue = tSocket[static_cast(threadId)]->nb_transport_bw(tPayload, tPhase, tDelay); + tlm_sync_enum returnValue = tSocket[static_cast(thread)]->nb_transport_bw(tPayload, tPhase, tDelay); // Early completion from initiator if (returnValue == TLM_UPDATED) payloadEventQueue.notify(tPayload, tPhase, tDelay); diff --git a/src/libdramsys/DRAMSys/simulation/Arbiter.h b/src/libdramsys/DRAMSys/simulation/Arbiter.h index 70e69c0d..b8bd1183 100644 --- a/src/libdramsys/DRAMSys/simulation/Arbiter.h +++ b/src/libdramsys/DRAMSys/simulation/Arbiter.h @@ -77,13 +77,13 @@ protected: tlm_utils::peq_with_cb_and_phase payloadEventQueue; virtual void peqCallback(tlm::tlm_generic_payload& payload, const tlm::tlm_phase& phase) = 0; - std::vector threadIsBusy; - std::vector channelIsBusy; + ControllerVector threadIsBusy; + ControllerVector channelIsBusy; - std::vector> pendingRequests; + ControllerVector> pendingRequestsOnChannel; - std::vector nextThreadPayloadIDToAppend; - std::vector nextChannelPayloadIDToAppend; + ControllerVector nextThreadPayloadIDToAppend; + ControllerVector nextChannelPayloadIDToAppend; tlm::tlm_sync_enum nb_transport_fw(int id, tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, sc_core::sc_time& fwDelay); @@ -111,7 +111,7 @@ private: void end_of_elaboration() override; void peqCallback(tlm::tlm_generic_payload& cbTrans, const tlm::tlm_phase& phase) override; - std::vector> pendingResponses; + ControllerVector> pendingResponsesOnThread; }; class ArbiterFifo final : public Arbiter @@ -125,14 +125,14 @@ private: void end_of_elaboration() override; void peqCallback(tlm::tlm_generic_payload& cbTrans, const tlm::tlm_phase& phase) override; - std::vector activeTransactions; - const unsigned maxActiveTransactions; + ControllerVector activeTransactionsOnThread; + const unsigned maxActiveTransactionsPerThread; - std::vector outstandingEndReq; - std::vector> pendingResponses; + ControllerVector outstandingEndReqOnThread; + ControllerVector> pendingResponsesOnThread; - std::vector lastEndReq; - std::vector lastEndResp; + ControllerVector lastEndReqOnChannel; + ControllerVector lastEndRespOnThread; }; class ArbiterReorder final : public Arbiter @@ -146,7 +146,7 @@ private: void end_of_elaboration() override; void peqCallback(tlm::tlm_generic_payload& cbTrans, const tlm::tlm_phase& phase) override; - std::vector activeTransactions; + ControllerVector activeTransactionsOnThread; const unsigned maxActiveTransactions; struct ThreadPayloadIDCompare @@ -157,13 +157,13 @@ private: } }; - std::vector outstandingEndReq; - std::vector> pendingResponses; + ControllerVector outstandingEndReqOnThread; + ControllerVector> pendingResponsesOnThread; - std::vector lastEndReq; - std::vector lastEndResp; + ControllerVector lastEndReqOnChannel; + ControllerVector lastEndRespOnThread; - std::vector nextThreadPayloadIDToReturn; + ControllerVector nextThreadPayloadIDToReturn; }; } // namespace DRAMSys diff --git a/src/libdramsys/DRAMSys/simulation/dram/Dram.cpp b/src/libdramsys/DRAMSys/simulation/dram/Dram.cpp index ff65b291..05f2c962 100644 --- a/src/libdramsys/DRAMSys/simulation/dram/Dram.cpp +++ b/src/libdramsys/DRAMSys/simulation/dram/Dram.cpp @@ -133,7 +133,7 @@ tlm_sync_enum Dram::nb_transport_fw(tlm_generic_payload& trans, tlm_phase& phase #ifdef DRAMPOWER if (powerAnalysis) { - int bank = static_cast(ControllerExtension::getBank(trans).ID()); + int bank = static_cast(ControllerExtension::getBank(trans)); int64_t cycle = std::lround((sc_time_stamp() + delay) / memSpec.tCK); DRAMPower->doCommand(phaseToDRAMPowerCommand(phase), bank, cycle); } From cacbf59d96e4f96542de017c921158d062df45af Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Fri, 30 Jun 2023 16:04:23 +0200 Subject: [PATCH 12/28] Missing refactoring. --- .../standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp index c4d578cf..0d0c83c2 100644 --- a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp +++ b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp @@ -714,8 +714,8 @@ void CheckerHBM3::insert(Command command, const tlm_generic_payload &payload) BankGroup bankGroup = ControllerExtension::getBankGroup(payload); Bank bank = ControllerExtension::getBank(payload); - PRINTDEBUGMESSAGE("CheckerHBM3", - "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString()); + PRINTDEBUGMESSAGE("CheckerHBM3", "Changing state on bank " + std::to_string(static_cast(bank)) + + " command is " + command.toString()); lastScheduledByCommandAndBank[command][bank] = sc_time_stamp(); lastScheduledByCommandAndBankGroup[command][bankGroup] = sc_time_stamp(); From 14ecc64ed0769a7a659d3fdd4a1a4c9cc8fa806a Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Fri, 14 Jul 2023 14:07:24 +0200 Subject: [PATCH 13/28] Introduce Simulator class --- .../apps/traceAnalyzer/simulationdialog.cpp | 16 +- .../DRAMSys/config/DRAMSysConfiguration.h | 4 +- src/configuration/DRAMSys/config/TraceSetup.h | 5 +- .../DRAMSys/configuration/Configuration.cpp | 2 +- src/simulator/main.cpp | 148 +-------------- src/simulator/simulator/Simulator.cpp | 171 ++++++++++++++++++ src/simulator/simulator/Simulator.h | 71 ++++++++ .../test_configuration.cpp | 4 +- 8 files changed, 263 insertions(+), 158 deletions(-) create mode 100644 src/simulator/simulator/Simulator.cpp create mode 100644 src/simulator/simulator/Simulator.h diff --git a/extensions/apps/traceAnalyzer/simulationdialog.cpp b/extensions/apps/traceAnalyzer/simulationdialog.cpp index 45d7f1b6..a50e474b 100644 --- a/extensions/apps/traceAnalyzer/simulationdialog.cpp +++ b/extensions/apps/traceAnalyzer/simulationdialog.cpp @@ -246,7 +246,7 @@ void SimulationDialog::loadConfigurationFromTextFields() MemSpec memSpec; SimConfig simConfig; std::string simulationId; - TraceSetup traceSetup; + std::vector traceSetup; simulationId = ui->simulationIdLineEdit->text().toStdString(); @@ -266,12 +266,14 @@ void SimulationDialog::loadConfigurationFromTextFields() return; } - configuration = DRAMSys::Config::Configuration{addressMapping, - mcConfig, - memSpec, - simConfig, - simulationId, - std::make_optional(std::move(traceSetup))}; + configuration = DRAMSys::Config::Configuration{ + addressMapping, + mcConfig, + memSpec, + simConfig, + simulationId, + std::make_optional>(std::move(traceSetup)) + }; loadConfiguration(); } diff --git a/src/configuration/DRAMSys/config/DRAMSysConfiguration.h b/src/configuration/DRAMSys/config/DRAMSysConfiguration.h index e899b19a..dce71332 100644 --- a/src/configuration/DRAMSys/config/DRAMSysConfiguration.h +++ b/src/configuration/DRAMSys/config/DRAMSysConfiguration.h @@ -62,13 +62,13 @@ namespace DRAMSys::Config { struct Configuration { static constexpr std::string_view KEY = "simulation"; - + AddressMapping addressmapping; McConfig mcconfig; MemSpec memspec; SimConfig simconfig; std::string simulationid; - std::optional tracesetup; + std::optional> tracesetup; }; NLOHMANN_JSONIFY_ALL_THINGS(Configuration, diff --git a/src/configuration/DRAMSys/config/TraceSetup.h b/src/configuration/DRAMSys/config/TraceSetup.h index 8f3e4fb4..9d7a5055 100644 --- a/src/configuration/DRAMSys/config/TraceSetup.h +++ b/src/configuration/DRAMSys/config/TraceSetup.h @@ -129,7 +129,7 @@ struct TrafficGenerator std::optional maxTransactions; std::optional dataLength; std::optional dataAlignment; - + uint64_t numRequests; double rwRatio; AddressDistribution addressDistribution; @@ -201,8 +201,7 @@ struct TraceSetupConstants static constexpr std::string_view SUB_DIR = "tracesetup"; }; -using TraceSetup = std::vector< - std::variant>; +using Initiator = std::variant; } // namespace Configuration diff --git a/src/libdramsys/DRAMSys/configuration/Configuration.cpp b/src/libdramsys/DRAMSys/configuration/Configuration.cpp index 41ea3f69..3eca6cbf 100644 --- a/src/libdramsys/DRAMSys/configuration/Configuration.cpp +++ b/src/libdramsys/DRAMSys/configuration/Configuration.cpp @@ -89,7 +89,7 @@ enum sc_time_unit string2TimeUnit(const std::string &s) } void Configuration::loadSimConfig(const DRAMSys::Config::SimConfig &simConfig) -{ +{ addressOffset = simConfig.AddressOffset.value_or(addressOffset); checkTLM2Protocol = simConfig.CheckTLM2Protocol.value_or(checkTLM2Protocol); databaseRecording = simConfig.DatabaseRecording.value_or(databaseRecording); diff --git a/src/simulator/main.cpp b/src/simulator/main.cpp index 80563366..8d8e1580 100644 --- a/src/simulator/main.cpp +++ b/src/simulator/main.cpp @@ -33,28 +33,13 @@ * Derek Christ */ -#include "simulator/Initiator.h" -#include "simulator/MemoryManager.h" -#include "simulator/SimpleInitiator.h" -#include "simulator/generator/TrafficGenerator.h" -#include "simulator/hammer/RowHammer.h" -#include "simulator/player/StlPlayer.h" -#include "simulator/util.h" +#include "simulator/Simulator.h" -#include - -#include -#include -#include -#include +#include #include -#include -#include -static constexpr std::string_view TRACE_DIRECTORY = "traces"; - -int sc_main(int argc, char **argv) +int sc_main(int argc, char** argv) { std::filesystem::path resourceDirectory = DRAMSYS_RESOURCE_DIR; if (argc >= 3) @@ -71,131 +56,8 @@ int sc_main(int argc, char **argv) DRAMSys::Config::Configuration configuration = DRAMSys::Config::from_path(baseConfig.c_str(), resourceDirectory.c_str()); - if (!configuration.tracesetup.has_value()) - SC_REPORT_FATAL("Simulator", "No traffic initiators specified"); - - std::unique_ptr dramSys; - if (configuration.simconfig.DatabaseRecording.value_or(false)) - { - dramSys = std::make_unique("DRAMSys", configuration); - } - else - { - dramSys = std::make_unique("DRAMSys", configuration); - } - - bool storageEnabled = dramSys->getConfig().storeMode == DRAMSys::Configuration::StoreMode::Store; - MemoryManager memoryManager(storageEnabled); - - std::vector> initiators; - - unsigned int terminatedInitiators = 0; - auto termianteInitiator = [&initiators, &terminatedInitiators]() - { - terminatedInitiators++; - - if (terminatedInitiators == initiators.size()) - sc_core::sc_stop(); - }; - - uint64_t totalTransactions{}; - uint64_t transactionsFinished = 0; - auto transactionFinished = [&totalTransactions, &transactionsFinished, &configuration]() - { - transactionsFinished++; - - if (configuration.simconfig.SimulationProgressBar.value_or(false)) - loadBar(transactionsFinished, totalTransactions); - }; - - for (auto const &initiator_config : configuration.tracesetup.value()) - { - uint64_t memorySize = dramSys->getConfig().memSpec->getSimMemSizeInBytes(); - unsigned int defaultDataLength = dramSys->getConfig().memSpec->defaultBytesPerBurst; - - auto initiator = std::visit( - [=, &memoryManager](auto &&config) -> std::unique_ptr - { - using T = std::decay_t; - if constexpr (std::is_same_v || - std::is_same_v) - { - return std::make_unique(config, - memoryManager, - memorySize, - defaultDataLength, - transactionFinished, - termianteInitiator); - } - else if constexpr (std::is_same_v) - { - std::filesystem::path tracePath = - resourceDirectory / TRACE_DIRECTORY / config.name; - - StlPlayer::TraceType traceType; - - auto extension = tracePath.extension(); - if (extension == ".stl") - traceType = StlPlayer::TraceType::Absolute; - else if (extension == ".rstl") - traceType = StlPlayer::TraceType::Relative; - else - { - std::string report = extension.string() + " is not a valid trace format."; - SC_REPORT_FATAL("Simulator", report.c_str()); - } - - StlPlayer player( - tracePath.c_str(), config.clkMhz, defaultDataLength, traceType, false); - - return std::make_unique>(config.name.c_str(), - memoryManager, - config.clkMhz, - std::nullopt, - std::nullopt, - transactionFinished, - termianteInitiator, - std::move(player)); - } - else if constexpr (std::is_same_v) - { - RowHammer hammer( - config.numRequests, config.rowIncrement, defaultDataLength); - - return std::make_unique>(config.name.c_str(), - memoryManager, - config.clkMhz, - 1, - 1, - transactionFinished, - termianteInitiator, - std::move(hammer)); - } - }, - initiator_config); - - totalTransactions += initiator->totalRequests(); - - initiator->bind(dramSys->tSocket); - initiators.push_back(std::move(initiator)); - } - - // Store the starting of the simulation in wall-clock time: - auto start = std::chrono::high_resolution_clock::now(); - - // Start the SystemC simulation - sc_set_stop_mode(sc_core::SC_STOP_FINISH_DELTA); - sc_core::sc_start(); - - if (!sc_core::sc_end_of_simulation_invoked()) - { - SC_REPORT_WARNING("sc_main", "Simulation stopped without explicit sc_stop()"); - sc_core::sc_stop(); - } - - auto finish = std::chrono::high_resolution_clock::now(); - std::chrono::duration elapsed = finish - start; - std::cout << "Simulation took " + std::to_string(elapsed.count()) + " seconds." << std::endl; + Simulator simulator(std::move(configuration), std::move(resourceDirectory)); + Simulator::run(); return 0; } diff --git a/src/simulator/simulator/Simulator.cpp b/src/simulator/simulator/Simulator.cpp new file mode 100644 index 00000000..823f55c1 --- /dev/null +++ b/src/simulator/simulator/Simulator.cpp @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2023, RPTU Kaiserslautern-Landau + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: + * Derek Christ + */ + +#include "Simulator.h" + +#include "SimpleInitiator.h" +#include "generator/TrafficGenerator.h" +#include "hammer/RowHammer.h" +#include "player/StlPlayer.h" +#include "util.h" + +Simulator::Simulator(DRAMSys::Config::Configuration configuration, + std::filesystem::path resourceDirectory) : + configuration(std::move(configuration)), + resourceDirectory(std::move(resourceDirectory)), + memoryManager(configuration.simconfig.StoreMode == DRAMSys::Config::StoreModeType::Store) +{ + if (this->configuration.simconfig.DatabaseRecording.value_or(false)) + { + dramSys = std::make_unique("DRAMSys", this->configuration); + } + else + { + dramSys = std::make_unique("DRAMSys", this->configuration); + } + + terminateInitiator = [this]() + { + terminatedInitiators++; + + if (terminatedInitiators == initiators.size()) + sc_core::sc_stop(); + }; + + finishTransaction = [this]() + { + transactionsFinished++; + + if (this->configuration.simconfig.SimulationProgressBar.value_or(false)) + loadBar(transactionsFinished, totalTransactions); + }; + + if (!configuration.tracesetup.has_value()) + SC_REPORT_FATAL("Simulator", "No traffic initiators specified"); + + for (const auto& initiatorConfig : *this->configuration.tracesetup) + { + auto initiator = instantiateInitiator(initiatorConfig); + totalTransactions += initiator->totalRequests(); + initiator->bind(dramSys->tSocket); + initiators.push_back(std::move(initiator)); + } +} + +std::unique_ptr +Simulator::instantiateInitiator(const DRAMSys::Config::Initiator& initiator) +{ + uint64_t memorySize = dramSys->getConfig().memSpec->getSimMemSizeInBytes(); + unsigned int defaultDataLength = dramSys->getConfig().memSpec->defaultBytesPerBurst; + + return std::visit( + [=](auto&& config) -> std::unique_ptr + { + using T = std::decay_t; + if constexpr (std::is_same_v || + std::is_same_v) + { + return std::make_unique(config, + memoryManager, + memorySize, + defaultDataLength, + finishTransaction, + terminateInitiator); + } + else if constexpr (std::is_same_v) + { + std::filesystem::path tracePath = resourceDirectory / TRACE_DIRECTORY / config.name; + + std::optional traceType; + + auto extension = tracePath.extension(); + if (extension == ".stl") + traceType = StlPlayer::TraceType::Absolute; + else if (extension == ".rstl") + traceType = StlPlayer::TraceType::Relative; + + if (!traceType.has_value()) + { + std::string report = extension.string() + " is not a valid trace format."; + SC_REPORT_FATAL("Simulator", report.c_str()); + } + + StlPlayer player( + tracePath.c_str(), config.clkMhz, defaultDataLength, *traceType, false); + + return std::make_unique>(config.name.c_str(), + memoryManager, + config.clkMhz, + std::nullopt, + std::nullopt, + finishTransaction, + terminateInitiator, + std::move(player)); + } + else if constexpr (std::is_same_v) + { + RowHammer hammer(config.numRequests, config.rowIncrement, defaultDataLength); + + return std::make_unique>(config.name.c_str(), + memoryManager, + config.clkMhz, + 1, + 1, + finishTransaction, + terminateInitiator, + std::move(hammer)); + } + }, + initiator); +} + +void Simulator::run() +{ + // Store the starting of the simulation in wall-clock time: + auto start = std::chrono::high_resolution_clock::now(); + + // Start the SystemC simulation + sc_core::sc_start(); + + if (!sc_core::sc_end_of_simulation_invoked()) + { + SC_REPORT_WARNING("Simulator", "Simulation stopped without explicit sc_stop()"); + sc_core::sc_stop(); + } + + auto finish = std::chrono::high_resolution_clock::now(); + std::chrono::duration elapsed = finish - start; + std::cout << "Simulation took " + std::to_string(elapsed.count()) + " seconds." << std::endl; +} diff --git a/src/simulator/simulator/Simulator.h b/src/simulator/simulator/Simulator.h new file mode 100644 index 00000000..0e39820b --- /dev/null +++ b/src/simulator/simulator/Simulator.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2023, RPTU Kaiserslautern-Landau + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: + * Derek Christ + */ + +#pragma once + +#include "Initiator.h" +#include "MemoryManager.h" + +#include +#include + +static constexpr std::string_view TRACE_DIRECTORY = "traces"; + +class Simulator +{ +public: + Simulator(DRAMSys::Config::Configuration configuration, + std::filesystem::path resourceDirectory); + + static void run(); + +private: + std::unique_ptr instantiateInitiator(const DRAMSys::Config::Initiator& initiator); + + MemoryManager memoryManager; + + DRAMSys::Config::Configuration configuration; + std::filesystem::path resourceDirectory; + + std::unique_ptr dramSys; + std::vector> initiators; + + std::function terminateInitiator; + std::function finishTransaction; + + unsigned int terminatedInitiators = 0; + uint64_t totalTransactions{}; + uint64_t transactionsFinished = 0; +}; diff --git a/tests/tests_configuration/test_configuration.cpp b/tests/tests_configuration/test_configuration.cpp index 52cd12df..7db7c887 100644 --- a/tests/tests_configuration/test_configuration.cpp +++ b/tests/tests_configuration/test_configuration.cpp @@ -110,7 +110,7 @@ protected: DRAMSys::Config::TrafficGenerator traceGeneratorOneState; DRAMSys::Config::TrafficGeneratorStateMachine traceGeneratorMultipleStates; DRAMSys::Config::RowHammer traceHammer; - DRAMSys::Config::TraceSetup traceSetup{{tracePlayer, traceGeneratorOneState, traceGeneratorMultipleStates, traceHammer}}; + std::vector traceSetup{{tracePlayer, traceGeneratorOneState, traceGeneratorMultipleStates, traceHammer}}; DRAMSys::Config::Configuration configuration{ addressMapping, @@ -302,7 +302,7 @@ TEST(RefreshPolicyType, BackwardsCompatibility) TEST_F(ConfigurationTest, SimConfig) { std::string_view simconfig_string = R"( - { + { "simconfig": { "AddressOffset": 0, "CheckTLM2Protocol": false, From 085bfbd8dec8334db908223c7ffe9b9c9434b9b6 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Fri, 21 Jul 2023 09:39:52 +0200 Subject: [PATCH 14/28] Don't create log file when debug is not enabled --- src/libdramsys/DRAMSys/simulation/DRAMSys.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp index 6c318b48..d7658cfa 100644 --- a/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp +++ b/src/libdramsys/DRAMSys/simulation/DRAMSys.cpp @@ -151,7 +151,7 @@ void DRAMSys::setupDebugManager([[maybe_unused]] const std::string& traceName) c bool writeToConsole = false; bool writeToFile = true; dbg.setup(debugEnabled, writeToConsole, writeToFile); - if (writeToFile) + if (debugEnabled && writeToFile) dbg.openDebugFile(traceName + ".txt"); #endif } From 24654be95220d3341cc7249cfb2a867e2d73085e Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Thu, 27 Jul 2023 11:02:45 +0200 Subject: [PATCH 15/28] Fix a timing issue in the traffic initiator When the generator clock did not match the memory clock, the generator always created a constant delay to the next transaction. This is not correct as due to rounding, the delay should be one cycle more or less depending on the current simulation time. --- .../simulator/request/RequestIssuer.cpp | 18 ++++++++++++++---- .../simulator/request/RequestIssuer.h | 1 + 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/simulator/simulator/request/RequestIssuer.cpp b/src/simulator/simulator/request/RequestIssuer.cpp index 2c96ea37..19796b7b 100644 --- a/src/simulator/simulator/request/RequestIssuer.cpp +++ b/src/simulator/simulator/request/RequestIssuer.cpp @@ -81,13 +81,21 @@ void RequestIssuer::sendNextRequest() tlm::tlm_phase phase = tlm::BEGIN_REQ; sc_core::sc_time delay = request.delay; - // Align to next clock - if (delay < clkPeriod && transactionsSent != 0) + sc_core::sc_time sendingTime = sc_core::sc_time_stamp() + delay; + + bool needsOffset = (sendingTime % clkPeriod) != sc_core::SC_ZERO_TIME; + if (needsOffset) { - delay = delay + clkPeriod; - delay -= delay % clkPeriod; + sendingTime += clkPeriod; + sendingTime -= sendingTime % clkPeriod; } + if (sendingTime == lastEndRequest) + { + sendingTime += clkPeriod; + } + + delay = sendingTime - sc_core::sc_time_stamp(); iSocket->nb_transport_fw(payload, phase, delay); if (request.command == Request::Command::Read) @@ -116,6 +124,8 @@ void RequestIssuer::peqCallback(tlm::tlm_generic_payload &payload, const tlm::tl { if (phase == tlm::END_REQ) { + lastEndRequest = sc_core::sc_time_stamp(); + if (nextRequestSendable()) sendNextRequest(); else diff --git a/src/simulator/simulator/request/RequestIssuer.h b/src/simulator/simulator/request/RequestIssuer.h index 2e318bfc..77af12ba 100644 --- a/src/simulator/simulator/request/RequestIssuer.h +++ b/src/simulator/simulator/request/RequestIssuer.h @@ -71,6 +71,7 @@ private: uint64_t transactionsSent = 0; uint64_t transactionsReceived = 0; + sc_core::sc_time lastEndRequest = sc_core::sc_max_time(); unsigned int pendingReadRequests = 0; unsigned int pendingWriteRequests = 0; From a064f46413fc63f5187b18864b1ddcb2bdf6bca6 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Thu, 3 Aug 2023 15:04:02 +0200 Subject: [PATCH 16/28] Fix includes that cause build errors on some platforms --- src/simulator/simulator/Cache.h | 1 + src/simulator/simulator/player/StlPlayer.h | 1 + 2 files changed, 2 insertions(+) diff --git a/src/simulator/simulator/Cache.h b/src/simulator/simulator/Cache.h index dc9ff74e..bd9df4a6 100644 --- a/src/simulator/simulator/Cache.h +++ b/src/simulator/simulator/Cache.h @@ -38,6 +38,7 @@ #include "MemoryManager.h" +#include #include #include #include diff --git a/src/simulator/simulator/player/StlPlayer.h b/src/simulator/simulator/player/StlPlayer.h index 2e4b02d0..76d2586f 100644 --- a/src/simulator/simulator/player/StlPlayer.h +++ b/src/simulator/simulator/player/StlPlayer.h @@ -46,6 +46,7 @@ #include #include +#include #include #include #include From d392d0ab9893bb357a51536ad06c846accfaa4a6 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Wed, 9 Aug 2023 11:55:10 +0200 Subject: [PATCH 17/28] Write GeneralInfo table at the beginning and do not include information in it that is only known at the end of the simulation. These can trivially be calculated by the trace itself and would be redundant information regardless. The TraceAnalyzer gets the number of transactions and the length of the trace by additional SQL queries. This enables us to inspect traces of simulations that were aborted without finishing cleanlywithout finishing cleanly. --- .../apps/traceAnalyzer/data/tracedb.cpp | 30 ++++++++++--- extensions/apps/traceAnalyzer/data/tracedb.h | 5 +-- src/libdramsys/DRAMSys/common/TlmRecorder.cpp | 43 +++++++++---------- src/libdramsys/DRAMSys/common/TlmRecorder.h | 2 - 4 files changed, 46 insertions(+), 34 deletions(-) diff --git a/extensions/apps/traceAnalyzer/data/tracedb.cpp b/extensions/apps/traceAnalyzer/data/tracedb.cpp index e3526b39..ec30ba0b 100644 --- a/extensions/apps/traceAnalyzer/data/tracedb.cpp +++ b/extensions/apps/traceAnalyzer/data/tracedb.cpp @@ -290,11 +290,6 @@ ID TraceDB::getTransactionIDFromPhaseID(ID phaseID) GeneralInfo TraceDB::getGeneralInfoFromDB() { QVariant parameter; - parameter = getParameterFromTable("NumberOfTransactions", "GeneralInfo"); - uint64_t numberOfTransactions = parameter.isValid() ? parameter.toULongLong() : 0; - parameter = getParameterFromTable("TraceEnd", "GeneralInfo"); - traceTime traceEnd = parameter.isValid() ? static_cast(parameter.toULongLong()) : 0; - parameter = getParameterFromTable("NumberOfRanks", "GeneralInfo"); unsigned numberOfRanks = parameter.isValid() ? parameter.toUInt() : 1; parameter = getParameterFromTable("NumberOfBankgroups", "GeneralInfo"); unsigned numberOfBankGroups = parameter.isValid() ? parameter.toUInt() : numberOfRanks; @@ -328,6 +323,8 @@ GeneralInfo TraceDB::getGeneralInfoFromDB() bool pseudoChannelMode = parameter.isValid() && parameter.toBool(); uint64_t numberOfPhases = getNumberOfPhases(); + uint64_t numberOfTransactions = getNumberOfTransactions(); + auto traceEnd = static_cast(getTraceLength()); QString description = (traces + "\n"); description += mcconfig + "\n"; @@ -417,6 +414,26 @@ QVariant TraceDB::getParameterFromTable(const std::string& parameter, const std: } } +uint64_t TraceDB::getTraceLength() +{ + QSqlQuery query(database); + query.prepare("SELECT MAX(PhaseEnd) FROM Phases"); + executeQuery(query); + + query.next(); + return query.value(0).toULongLong(); +} + +uint64_t TraceDB::getNumberOfTransactions() +{ + QSqlQuery query(database); + query.prepare("SELECT COUNT(ID) FROM Transactions"); + executeQuery(query); + + query.next(); + return query.value(0).toULongLong(); +} + uint64_t TraceDB::getNumberOfPhases() { QSqlQuery query(database); @@ -480,7 +497,7 @@ DependencyInfos TraceDB::getDependencyInfos(DependencyInfos::Type infoType) selectTimeDependencyPercentages = QSqlQuery(database); if (!selectTimeDependencyPercentages.prepare(queryTexts.selectTimeDependencyPercentages)) qDebug() << database.lastError().text(); - + executeQuery(selectTimeDependencyPercentages); return parseDependencyInfos(selectTimeDependencyPercentages, infoType); } @@ -714,4 +731,3 @@ void TraceDB::executeScriptFile(const QString& fileName) } } } - diff --git a/extensions/apps/traceAnalyzer/data/tracedb.h b/extensions/apps/traceAnalyzer/data/tracedb.h index 47232ce4..c4e38be6 100644 --- a/extensions/apps/traceAnalyzer/data/tracedb.h +++ b/extensions/apps/traceAnalyzer/data/tracedb.h @@ -145,6 +145,8 @@ private: void executeScriptFile(const QString& fileName); void dropAndCreateTables(); + uint64_t getTraceLength(); + uint64_t getNumberOfTransactions(); uint64_t getNumberOfPhases(); GeneralInfo getGeneralInfoFromDB(); CommandLengths getCommandLengthsFromDB(); @@ -174,6 +176,3 @@ public: } }; #endif // TRACEDB_H - - - diff --git a/src/libdramsys/DRAMSys/common/TlmRecorder.cpp b/src/libdramsys/DRAMSys/common/TlmRecorder.cpp index 9bbb95c5..47644d38 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorder.cpp +++ b/src/libdramsys/DRAMSys/common/TlmRecorder.cpp @@ -73,6 +73,9 @@ TlmRecorder::TlmRecorder(const std::string& name, const Configuration& config, c executeInitialSqlCommand(); prepareSqlStatements(); + insertGeneralInfo(); + insertCommandLengths(); + PRINTDEBUGMESSAGE(name, "Starting new database transaction"); } @@ -352,7 +355,7 @@ void TlmRecorder::prepareSqlStatements() insertGeneralInfoString = "INSERT INTO GeneralInfo VALUES" - "(:numberOfTransactions, :end, :numberOfRanks, :numberOfBankGroups, :numberOfBanks, :clk, :unitOfTime, " + "(:numberOfRanks, :numberOfBankGroups, :numberOfBanks, :clk, :unitOfTime, " ":mcconfig, :memspec, :traces, :windowSize, :refreshMaxPostponed, :refreshMaxPulledin, :controllerThread, " ":maxBufferDepth, :per2BankOffset, :rowColumnCommandBus, :pseudoChannelMode)"; @@ -388,27 +391,25 @@ void TlmRecorder::insertDebugMessageInDB(const std::string &message, const sc_ti void TlmRecorder::insertGeneralInfo() { - sqlite3_bind_int64(insertGeneralInfoStatement, 1, static_cast(totalNumTransactions)); - sqlite3_bind_int64(insertGeneralInfoStatement, 2, static_cast(simulationTimeCoveredByRecording.value())); - sqlite3_bind_int(insertGeneralInfoStatement, 3, static_cast(config.memSpec->ranksPerChannel)); - sqlite3_bind_int(insertGeneralInfoStatement, 4, static_cast(config.memSpec->bankGroupsPerChannel)); - sqlite3_bind_int(insertGeneralInfoStatement, 5, static_cast(config.memSpec->banksPerChannel)); - sqlite3_bind_int64(insertGeneralInfoStatement, 6, static_cast(config.memSpec->tCK.value())); - sqlite3_bind_text(insertGeneralInfoStatement, 7, "PS", 2, nullptr); + sqlite3_bind_int(insertGeneralInfoStatement, 1, static_cast(config.memSpec->ranksPerChannel)); + sqlite3_bind_int(insertGeneralInfoStatement, 2, static_cast(config.memSpec->bankGroupsPerChannel)); + sqlite3_bind_int(insertGeneralInfoStatement, 3, static_cast(config.memSpec->banksPerChannel)); + sqlite3_bind_int64(insertGeneralInfoStatement, 4, static_cast(config.memSpec->tCK.value())); + sqlite3_bind_text(insertGeneralInfoStatement, 5, "PS", 2, nullptr); - sqlite3_bind_text(insertGeneralInfoStatement, 8, mcconfig.c_str(), static_cast(mcconfig.length()), nullptr); - sqlite3_bind_text(insertGeneralInfoStatement, 9, memspec.c_str(), static_cast(memspec.length()), nullptr); - sqlite3_bind_text(insertGeneralInfoStatement, 10, traces.c_str(), static_cast(traces.length()), nullptr); + sqlite3_bind_text(insertGeneralInfoStatement, 6, mcconfig.c_str(), static_cast(mcconfig.length()), nullptr); + sqlite3_bind_text(insertGeneralInfoStatement, 7, memspec.c_str(), static_cast(memspec.length()), nullptr); + sqlite3_bind_text(insertGeneralInfoStatement, 8, traces.c_str(), static_cast(traces.length()), nullptr); if (config.enableWindowing) - sqlite3_bind_int64(insertGeneralInfoStatement, 11, static_cast((config.memSpec->tCK + sqlite3_bind_int64(insertGeneralInfoStatement, 9, static_cast((config.memSpec->tCK * config.windowSize).value())); else - sqlite3_bind_int64(insertGeneralInfoStatement, 11, 0); - sqlite3_bind_int(insertGeneralInfoStatement, 12, static_cast(config.refreshMaxPostponed)); - sqlite3_bind_int(insertGeneralInfoStatement, 13, static_cast(config.refreshMaxPulledin)); - sqlite3_bind_int(insertGeneralInfoStatement, 14, static_cast(UINT_MAX)); - sqlite3_bind_int(insertGeneralInfoStatement, 15, static_cast(config.requestBufferSize)); - sqlite3_bind_int(insertGeneralInfoStatement, 16, static_cast(config.memSpec->getPer2BankOffset())); + sqlite3_bind_int64(insertGeneralInfoStatement, 9, 0); + sqlite3_bind_int(insertGeneralInfoStatement, 10, static_cast(config.refreshMaxPostponed)); + sqlite3_bind_int(insertGeneralInfoStatement, 11, static_cast(config.refreshMaxPulledin)); + sqlite3_bind_int(insertGeneralInfoStatement, 12, static_cast(UINT_MAX)); + sqlite3_bind_int(insertGeneralInfoStatement, 13, static_cast(config.requestBufferSize)); + sqlite3_bind_int(insertGeneralInfoStatement, 14, static_cast(config.memSpec->getPer2BankOffset())); const MemSpec& memSpec = *config.memSpec; const auto memoryType = memSpec.memoryType; @@ -422,8 +423,8 @@ void TlmRecorder::insertGeneralInfo() return memSpec.pseudoChannelsPerChannel != 1; }(); - sqlite3_bind_int(insertGeneralInfoStatement, 17, static_cast(rowColumnCommandBus)); - sqlite3_bind_int(insertGeneralInfoStatement, 18, static_cast(pseudoChannelMode)); + sqlite3_bind_int(insertGeneralInfoStatement, 15, static_cast(rowColumnCommandBus)); + sqlite3_bind_int(insertGeneralInfoStatement, 16, static_cast(pseudoChannelMode)); executeSqlStatement(insertGeneralInfoStatement); } @@ -519,8 +520,6 @@ void TlmRecorder::closeConnection() storageThread.join(); std::swap(currentDataBuffer, storageDataBuffer); commitRecordedDataToDB(); - insertGeneralInfo(); - insertCommandLengths(); PRINTDEBUGMESSAGE(name, "Number of transactions written to DB: " + std::to_string(totalNumTransactions)); PRINTDEBUGMESSAGE(name, "tlmPhaseRecorder:\tEnd Recording"); diff --git a/src/libdramsys/DRAMSys/common/TlmRecorder.h b/src/libdramsys/DRAMSys/common/TlmRecorder.h index 7a950f2e..0164ed32 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorder.h +++ b/src/libdramsys/DRAMSys/common/TlmRecorder.h @@ -205,8 +205,6 @@ private: "); \n" " \n" "CREATE TABLE GeneralInfo( \n" - " NumberOfTransactions INTEGER, \n" - " TraceEnd INTEGER, \n" " NumberOfRanks INTEGER, \n" " NumberOfBankgroups INTEGER, \n" " NumberOfBanks INTEGER, \n" From ccc1bc73c49e5036f93fd11303195ba9f2928e03 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Wed, 9 Aug 2023 14:57:29 +0200 Subject: [PATCH 18/28] Disable CMake diagnostics print --- extensions/apps/traceAnalyzer/CMakeLists.txt | 7 +++---- src/configuration/CMakeLists.txt | 11 +++++------ src/libdramsys/CMakeLists.txt | 5 ++--- src/util/CMakeLists.txt | 9 ++++----- 4 files changed, 14 insertions(+), 18 deletions(-) diff --git a/extensions/apps/traceAnalyzer/CMakeLists.txt b/extensions/apps/traceAnalyzer/CMakeLists.txt index 82cd3c90..eb3c0574 100644 --- a/extensions/apps/traceAnalyzer/CMakeLists.txt +++ b/extensions/apps/traceAnalyzer/CMakeLists.txt @@ -28,7 +28,7 @@ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # -# Authors: +# Authors: # Matthias Jung # Lukas Steiner # Derek Christ @@ -94,10 +94,9 @@ target_link_libraries(TraceAnalyzer set(DRAMSYS_TRACEANALYZER_DIR "${CMAKE_CURRENT_SOURCE_DIR}") -target_compile_definitions(${PROJECT_NAME} - PUBLIC +target_compile_definitions(${PROJECT_NAME} + PUBLIC DRAMSYS_TRACEANALYZER_DIR="${DRAMSYS_TRACEANALYZER_DIR}" ) build_source_group() -diagnostics_print(${PROJECT_NAME}) diff --git a/src/configuration/CMakeLists.txt b/src/configuration/CMakeLists.txt index 8d875e41..d64f76a0 100644 --- a/src/configuration/CMakeLists.txt +++ b/src/configuration/CMakeLists.txt @@ -45,17 +45,16 @@ add_library(${PROJECT_NAME} STATIC ${SOURCE_FILES} ${HEADER_FILES}) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(${PROJECT_NAME} - PUBLIC +target_link_libraries(${PROJECT_NAME} + PUBLIC DRAMSys::util ) -target_compile_definitions(${PROJECT_NAME} - PUBLIC +target_compile_definitions(${PROJECT_NAME} + PUBLIC DRAMSYS_RESOURCE_DIR="${DRAMSYS_RESOURCE_DIR}" ) add_library(DRAMSys::config ALIAS ${PROJECT_NAME}) -build_source_group() -diagnostics_print(${PROJECT_NAME}) \ No newline at end of file +build_source_group() \ No newline at end of file diff --git a/src/libdramsys/CMakeLists.txt b/src/libdramsys/CMakeLists.txt index f7ad7214..13819ab6 100644 --- a/src/libdramsys/CMakeLists.txt +++ b/src/libdramsys/CMakeLists.txt @@ -45,8 +45,8 @@ add_library(${PROJECT_NAME} STATIC ${SOURCE_FILES} ${HEADER_FILES}) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(${PROJECT_NAME} - PUBLIC +target_link_libraries(${PROJECT_NAME} + PUBLIC SystemC::systemc DRAMSys::util DRAMSys::config @@ -61,4 +61,3 @@ endif () add_library(DRAMSys::libdramsys ALIAS ${PROJECT_NAME}) build_source_group() -diagnostics_print(${PROJECT_NAME}) diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt index 6fed3aa0..b9ee220d 100644 --- a/src/util/CMakeLists.txt +++ b/src/util/CMakeLists.txt @@ -45,13 +45,13 @@ add_library(${PROJECT_NAME} STATIC ${SOURCE_FILES} ${HEADER_FILES}) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(${PROJECT_NAME} - PUBLIC +target_link_libraries(${PROJECT_NAME} + PUBLIC nlohmann_json::nlohmann_json ) -target_compile_definitions(${PROJECT_NAME} - PUBLIC +target_compile_definitions(${PROJECT_NAME} + PUBLIC DRAMSYS_RESOURCE_DIR="${DRAMSYS_RESOURCE_DIR}" ) @@ -59,4 +59,3 @@ add_library(DRAMSys::util ALIAS ${PROJECT_NAME}) build_source_group() -diagnostics_print(${PROJECT_NAME}) From a6e1f8357057589a23fa8475f7ea78c9bd891441 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Wed, 9 Aug 2023 16:00:43 +0200 Subject: [PATCH 19/28] Remove unnecessary includes from Cache --- src/simulator/simulator/Cache.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/simulator/simulator/Cache.cpp b/src/simulator/simulator/Cache.cpp index 06739cfe..f9b982c2 100644 --- a/src/simulator/simulator/Cache.cpp +++ b/src/simulator/simulator/Cache.cpp @@ -2,11 +2,6 @@ #include "MemoryManager.h" #include -#include -#include -#include -#include -#include using namespace tlm; using namespace sc_core; @@ -50,7 +45,7 @@ Cache::Cache(const sc_module_name &name, if (storageEnabled) { dataMemory.reserve(size); - + for (std::size_t set = 0; set < lineTable.size(); set++) { for (std::size_t way = 0; way < lineTable[set].size(); way++) @@ -552,7 +547,7 @@ void Cache::accessCacheAndSendResponse(tlm_generic_payload &trans) sc_time bwDelay = SC_ZERO_TIME; trans.set_response_status(tlm::TLM_OK_RESPONSE); - + tlm_sync_enum returnValue = tSocket->nb_transport_bw(trans, bwPhase, bwDelay); if (returnValue == tlm::TLM_UPDATED) // TODO tlm_completed payloadEventQueue.notify(trans, bwPhase, bwDelay); From 42d1caa3729fa93abcaac4e2fe0c55c284bc1a08 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Mon, 26 Jun 2023 11:38:35 +0200 Subject: [PATCH 20/28] Add HBM3 regression test --- tests/tests_regression/CMakeLists.txt | 1 + .../DRAMSys_hbm3-example_hbm3_ch0.tdb | 3 + tests/tests_regression/HBM3/hbm3-example.json | 138 ++++++++++++++++++ .../HBM3/traces/trace1_test4.stl | 3 + .../HBM3/traces/trace2_test4.stl | 3 + 5 files changed, 148 insertions(+) create mode 100644 tests/tests_regression/HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb create mode 100644 tests/tests_regression/HBM3/hbm3-example.json create mode 100644 tests/tests_regression/HBM3/traces/trace1_test4.stl create mode 100644 tests/tests_regression/HBM3/traces/trace2_test4.stl diff --git a/tests/tests_regression/CMakeLists.txt b/tests/tests_regression/CMakeLists.txt index 21babc71..875fb59c 100644 --- a/tests/tests_regression/CMakeLists.txt +++ b/tests/tests_regression/CMakeLists.txt @@ -95,3 +95,4 @@ test_standard(DDR4 ${CMAKE_CURRENT_SOURCE_DIR}/DDR4/ddr4-example.json ${CMAKE_CU test_standard(LPDDR4 ${CMAKE_CURRENT_SOURCE_DIR}/LPDDR4/lpddr4-example.json ${CMAKE_CURRENT_SOURCE_DIR}/LPDDR4 DRAMSys_lpddr4-example_lpddr4_ch0.tdb) test_standard(HBM2.Ch0 ${CMAKE_CURRENT_SOURCE_DIR}/HBM2/hbm2-example.json ${CMAKE_CURRENT_SOURCE_DIR}/HBM2 DRAMSys_hbm2-example_hbm2_ch0.tdb) test_standard(HBM2.Ch1 ${CMAKE_CURRENT_SOURCE_DIR}/HBM2/hbm2-example.json ${CMAKE_CURRENT_SOURCE_DIR}/HBM2 DRAMSys_hbm2-example_hbm2_ch1.tdb) +test_standard(HBM3 ${CMAKE_CURRENT_SOURCE_DIR}/HBM3/hbm3-example.json ${CMAKE_CURRENT_SOURCE_DIR}/HBM3 DRAMSys_hbm3-example_hbm3_ch0.tdb) diff --git a/tests/tests_regression/HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb b/tests/tests_regression/HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb new file mode 100644 index 00000000..e68e22a4 --- /dev/null +++ b/tests/tests_regression/HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25448feb56b34e07ba079b7561a696eb4be67248b87d709fc50dae8ab8f342fc +size 1212416 diff --git a/tests/tests_regression/HBM3/hbm3-example.json b/tests/tests_regression/HBM3/hbm3-example.json new file mode 100644 index 00000000..883c70dc --- /dev/null +++ b/tests/tests_regression/HBM3/hbm3-example.json @@ -0,0 +1,138 @@ +{ + "simulation": { + "addressmapping": { + "PSEUDOCHANNEL_BIT":[ + 29 + ], + "BANKGROUP_BIT":[ + 27, + 28 + ], + "BANK_BIT": [ + 25, + 26 + ], + "BYTE_BIT": [ + 0, + 1 + ], + "COLUMN_BIT": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "ROW_BIT": [ + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ] + }, + "mcconfig": { + "PagePolicy": "Closed", + "Scheduler": "Fifo", + "RequestBufferSize": 8, + "CmdMux": "Strict", + "RespQueue": "Fifo", + "RefreshPolicy": "NoRefresh", + "RefreshMaxPostponed": 0, + "RefreshMaxPulledin": 0, + "PowerDownPolicy": "NoPowerDown", + "PowerDownTimeout": 100 + }, + "memspec": { + "memarchitecturespec": { + "burstLength": 8, + "dataRate": 4, + "nbrOfBankGroups": 4, + "nbrOfBanks": 16, + "nbrOfColumns": 128, + "nbrOfPseudoChannels": 2, + "nbrOfRows": 65536, + "width": 32, + "nbrOfDevices": 1, + "nbrOfChannels": 1, + "RAAIMT" : 16, + "RAAMMT" : 96, + "RAADEC" : 16 + }, + "memoryId": "", + "memoryType": "HBM3", + "memtimingspec": { + "CCDL": 4, + "CCDS": 2, + "CKE": 8, + "DQSCK": 1, + "FAW": 16, + "PL": 0, + "PPD": 2, + "RAS": 28, + "RC": 42, + "RCDRD": 12, + "RCDWR": 6, + "REFI": 3900, + "REFIPB": 122, + "RFC": 260, + "RFCPB": 96, + "RL": 17, + "RP": 14, + "RRDL": 6, + "RRDS": 4, + "RREFD": 8, + "RTP": 5, + "RTW": 18, + "WL": 12, + "WR": 23, + "WTRL": 9, + "WTRS": 4, + "XP": 8, + "XS": 260, + "clkMhz": 1600 + } + }, + "simconfig": { + "AddressOffset": 0, + "CheckTLM2Protocol": false, + "DatabaseRecording": true, + "Debug": false, + "ECCControllerMode": "Disabled", + "EnableWindowing": false, + "ErrorCSVFile": "", + "ErrorChipSeed": 42, + "PowerAnalysis": false, + "SimulationName": "hbm3", + "SimulationProgressBar": true, + "StoreMode": "NoStorage", + "ThermalSimulation": false, + "UseMalloc": false, + "WindowSize": 1000 + }, + "simulationid": "hbm3-example", + "tracesetup": [ + { + "clkMhz": 1000, + "name": "trace1_test4.stl" + }, + { + "clkMhz": 1000, + "name": "trace2_test4.stl" + } + ] + } +} diff --git a/tests/tests_regression/HBM3/traces/trace1_test4.stl b/tests/tests_regression/HBM3/traces/trace1_test4.stl new file mode 100644 index 00000000..7a9997f6 --- /dev/null +++ b/tests/tests_regression/HBM3/traces/trace1_test4.stl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71afd569906e35192e0709e3a754f68c4d51200e37ce55c6b0faff0711e6c1e4 +size 52137 diff --git a/tests/tests_regression/HBM3/traces/trace2_test4.stl b/tests/tests_regression/HBM3/traces/trace2_test4.stl new file mode 100644 index 00000000..5a2d7ff4 --- /dev/null +++ b/tests/tests_regression/HBM3/traces/trace2_test4.stl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6aafee02dedc1f89edcb335175064a9ecbcdef5eecc4c51dcd2154cfe85d6ea +size 50089 From 599761c341cf5bea46020fada4ee6793f168c0ef Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Wed, 28 Jun 2023 10:17:22 +0200 Subject: [PATCH 21/28] Add regression test for DDR5 --- tests/tests_regression/CMakeLists.txt | 40 +++-- tests/tests_regression/DDR5/ddr5-example.json | 165 ++++++++++++++++++ .../DRAMSys_ddr5-example_ddr5_ch0.tdb | 3 + .../DRAMSys_ddr5-example_ddr5_ch1.tdb | 3 + .../DDR5/traces/trace_test3.stl | 3 + .../DRAMSys_hbm2-example_hbm2_ch0.tdb | 2 +- tests/tests_regression/HBM2/hbm2.txt | 0 .../DRAMSys_hbm3-example_hbm3_ch0.tdb | 4 +- 8 files changed, 198 insertions(+), 22 deletions(-) create mode 100644 tests/tests_regression/DDR5/ddr5-example.json create mode 100644 tests/tests_regression/DDR5/expected/DRAMSys_ddr5-example_ddr5_ch0.tdb create mode 100644 tests/tests_regression/DDR5/expected/DRAMSys_ddr5-example_ddr5_ch1.tdb create mode 100644 tests/tests_regression/DDR5/traces/trace_test3.stl create mode 100644 tests/tests_regression/HBM2/hbm2.txt diff --git a/tests/tests_regression/CMakeLists.txt b/tests/tests_regression/CMakeLists.txt index 875fb59c..394ecc5c 100644 --- a/tests/tests_regression/CMakeLists.txt +++ b/tests/tests_regression/CMakeLists.txt @@ -53,46 +53,48 @@ set(TABLES_TO_COMPARE Power ) -function(test_standard standard base_config resource_dir output_filename) +function(test_standard standard test_name base_config resource_dir output_filename) # Put all the generated files into a subdirectory - file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${standard}) + file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${test_name}) - configure_file(compare.sh ${standard}/compare.sh) + configure_file(compare.sh ${test_name}/compare.sh) # Test to create database add_test( - NAME Regression${standard}.CreateDatabase - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${standard} + NAME Regression${test_name}.CreateDatabase + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${test_name} COMMAND $ ${base_config} ${resource_dir} ) - set_tests_properties(Regression${standard}.CreateDatabase PROPERTIES FIXTURES_SETUP Regression${standard}.CreateDatabase) + set_tests_properties(Regression${test_name}.CreateDatabase PROPERTIES FIXTURES_SETUP Regression${test_name}.CreateDatabase) # Test to diff the whole database. This test should not fail. # The purpose of this test is solely to output the differences of the two databases # so that they can be inspected easily. add_test( - NAME Regression${standard}.SqlDiff - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${standard} + NAME Regression${test_name}.SqlDiff + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${test_name} COMMAND compare.sh ) - set_tests_properties(Regression${standard}.SqlDiff PROPERTIES FIXTURES_REQUIRED Regression${standard}.CreateDatabase) + set_tests_properties(Regression${test_name}.SqlDiff PROPERTIES FIXTURES_REQUIRED Regression${test_name}.CreateDatabase) # Tests to diff individual tables foreach(table IN LISTS TABLES_TO_COMPARE) - configure_file(compare_table.sh ${standard}/compare_table-${table}.sh) + configure_file(compare_table.sh ${test_name}/compare_table-${table}.sh) add_test( - NAME Regression${standard}.SqlDiff.${table} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${standard} + NAME Regression${test_name}.SqlDiff.${table} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${test_name} COMMAND compare_table-${table}.sh ) - set_tests_properties(Regression${standard}.SqlDiff.${table} PROPERTIES FIXTURES_REQUIRED Regression${standard}.CreateDatabase) + set_tests_properties(Regression${test_name}.SqlDiff.${table} PROPERTIES FIXTURES_REQUIRED Regression${test_name}.CreateDatabase) endforeach() endfunction() -test_standard(DDR3 ${CMAKE_CURRENT_SOURCE_DIR}/DDR3/ddr3-example.json ${CMAKE_CURRENT_SOURCE_DIR}/DDR3 DRAMSys_ddr3-dual-rank_ddr3_ch0.tdb) -test_standard(DDR4 ${CMAKE_CURRENT_SOURCE_DIR}/DDR4/ddr4-example.json ${CMAKE_CURRENT_SOURCE_DIR}/DDR4 DRAMSys_ddr4-bankgrp_ddr4_ch0.tdb) -test_standard(LPDDR4 ${CMAKE_CURRENT_SOURCE_DIR}/LPDDR4/lpddr4-example.json ${CMAKE_CURRENT_SOURCE_DIR}/LPDDR4 DRAMSys_lpddr4-example_lpddr4_ch0.tdb) -test_standard(HBM2.Ch0 ${CMAKE_CURRENT_SOURCE_DIR}/HBM2/hbm2-example.json ${CMAKE_CURRENT_SOURCE_DIR}/HBM2 DRAMSys_hbm2-example_hbm2_ch0.tdb) -test_standard(HBM2.Ch1 ${CMAKE_CURRENT_SOURCE_DIR}/HBM2/hbm2-example.json ${CMAKE_CURRENT_SOURCE_DIR}/HBM2 DRAMSys_hbm2-example_hbm2_ch1.tdb) -test_standard(HBM3 ${CMAKE_CURRENT_SOURCE_DIR}/HBM3/hbm3-example.json ${CMAKE_CURRENT_SOURCE_DIR}/HBM3 DRAMSys_hbm3-example_hbm3_ch0.tdb) +test_standard(DDR3 DDR3 ${CMAKE_CURRENT_SOURCE_DIR}/DDR3/ddr3-example.json ${CMAKE_CURRENT_SOURCE_DIR}/DDR3 DRAMSys_ddr3-dual-rank_ddr3_ch0.tdb) +test_standard(DDR4 DDR4 ${CMAKE_CURRENT_SOURCE_DIR}/DDR4/ddr4-example.json ${CMAKE_CURRENT_SOURCE_DIR}/DDR4 DRAMSys_ddr4-bankgrp_ddr4_ch0.tdb) +test_standard(DDR5 DDR5.Ch0 ${CMAKE_CURRENT_SOURCE_DIR}/DDR5/ddr5-example.json ${CMAKE_CURRENT_SOURCE_DIR}/DDR5 DRAMSys_ddr5-example_ddr5_ch0.tdb) +test_standard(DDR5 DDR5.Ch1 ${CMAKE_CURRENT_SOURCE_DIR}/DDR5/ddr5-example.json ${CMAKE_CURRENT_SOURCE_DIR}/DDR5 DRAMSys_ddr5-example_ddr5_ch1.tdb) +test_standard(LPDDR4 LPDDR4 ${CMAKE_CURRENT_SOURCE_DIR}/LPDDR4/lpddr4-example.json ${CMAKE_CURRENT_SOURCE_DIR}/LPDDR4 DRAMSys_lpddr4-example_lpddr4_ch0.tdb) +test_standard(HBM2 HBM2.Ch0 ${CMAKE_CURRENT_SOURCE_DIR}/HBM2/hbm2-example.json ${CMAKE_CURRENT_SOURCE_DIR}/HBM2 DRAMSys_hbm2-example_hbm2_ch0.tdb) +test_standard(HBM2 HBM2.Ch1 ${CMAKE_CURRENT_SOURCE_DIR}/HBM2/hbm2-example.json ${CMAKE_CURRENT_SOURCE_DIR}/HBM2 DRAMSys_hbm2-example_hbm2_ch1.tdb) +test_standard(HBM3 HBM3 ${CMAKE_CURRENT_SOURCE_DIR}/HBM3/hbm3-example.json ${CMAKE_CURRENT_SOURCE_DIR}/HBM3 DRAMSys_hbm3-example_hbm3_ch0.tdb) diff --git a/tests/tests_regression/DDR5/ddr5-example.json b/tests/tests_regression/DDR5/ddr5-example.json new file mode 100644 index 00000000..f6445f7c --- /dev/null +++ b/tests/tests_regression/DDR5/ddr5-example.json @@ -0,0 +1,165 @@ +{ + "simulation": { + "addressmapping": { + "BANKGROUP_BIT": [ + 13, + 14, + 15 + ], + "BANK_BIT": [ + 16 + ], + "BYTE_BIT": [ + 0, + 1 + ], + "CHANNEL_BIT": [ + 33 + ], + "COLUMN_BIT": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12 + ], + "ROW_BIT": [ + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32 + ] + }, + "mcconfig": { + "Arbiter": "Simple", + "CmdMux": "Oldest", + "MaxActiveTransactions": 128, + "PagePolicy": "Open", + "PowerDownPolicy": "NoPowerDown", + "RefreshManagement": false, + "RefreshMaxPostponed": 0, + "RefreshMaxPulledin": 0, + "RefreshPolicy": "AllBank", + "RequestBufferSize": 8, + "RespQueue": "Fifo", + "Scheduler": "FrFcfs", + "SchedulerBuffer": "Bankwise" + }, + "memspec": { + "memarchitecturespec": { + "RAADEC": 16, + "RAAIMT": 32, + "RAAMMT": 96, + "burstLength": 16, + "cmdMode": 1, + "dataRate": 2, + "nbrOfBankGroups": 8, + "nbrOfBanks": 16, + "nbrOfChannels": 2, + "nbrOfColumns": 2048, + "nbrOfDIMMRanks": 1, + "nbrOfDevices": 8, + "nbrOfLogicalRanks": 1, + "nbrOfPhysicalRanks": 1, + "nbrOfRanks": 1, + "nbrOfRows": 65536, + "refMode": 1, + "width": 4 + }, + "memoryId": "JEDEC_2x8x2Gbx4_DDR5-3200A", + "memoryType": "DDR5", + "memtimingspec": { + "ACTPDEN": 2, + "CCD_L_WR2_slr": 16, + "CCD_L_WR_slr": 32, + "CCD_L_slr": 8, + "CCD_M_WR_slr": 32, + "CCD_M_slr": 8, + "CCD_S_WR_slr": 8, + "CCD_S_slr": 8, + "CCD_WR_dlr": 0, + "CCD_WR_dpr": 0, + "CCD_dlr": 0, + "CPDED": 8, + "FAW_dlr": 0, + "FAW_slr": 32, + "PD": 12, + "PPD": 2, + "PRPDEN": 2, + "RAS": 52, + "RCD": 22, + "RDDQS": 0, + "REFI1": 6240, + "REFI2": 3120, + "REFISB": 1560, + "REFPDEN": 2, + "REFSBRD_dlr": 0, + "REFSBRD_slr": 48, + "RFC1_dlr": 0, + "RFC1_dpr": 0, + "RFC1_slr": 312, + "RFC2_dlr": 0, + "RFC2_dpr": 0, + "RFC2_slr": 208, + "RFCsb_dlr": 0, + "RFCsb_slr": 184, + "RL": 22, + "RP": 22, + "RPRE": 1, + "RPST": 0, + "RRD_L_slr": 8, + "RRD_S_slr": 8, + "RRD_dlr": 0, + "RTP": 12, + "RTRS": 2, + "WL": 20, + "WPRE": 2, + "WPST": 0, + "WR": 48, + "WTR_L": 16, + "WTR_M": 16, + "WTR_S": 4, + "XP": 12, + "clkMhz": 1600 + } + }, + "simconfig": { + "AddressOffset": 0, + "CheckTLM2Protocol": false, + "DatabaseRecording": true, + "Debug": false, + "EnableWindowing": false, + "PowerAnalysis": false, + "SimulationName": "ddr5", + "SimulationProgressBar": true, + "StoreMode": "NoStorage", + "UseMalloc": false, + "WindowSize": 1000 + }, + "simulationid": "ddr5-example", + "tracesetup": [ + { + "clkMhz": 933, + "name": "trace_test3.stl" + } + ] + } +} \ No newline at end of file diff --git a/tests/tests_regression/DDR5/expected/DRAMSys_ddr5-example_ddr5_ch0.tdb b/tests/tests_regression/DDR5/expected/DRAMSys_ddr5-example_ddr5_ch0.tdb new file mode 100644 index 00000000..5705dd3e --- /dev/null +++ b/tests/tests_regression/DDR5/expected/DRAMSys_ddr5-example_ddr5_ch0.tdb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:655d10bfd7b648e0f8121cd6d78652a86d2abc899a2181aaac33e87b5bed4833 +size 6045696 diff --git a/tests/tests_regression/DDR5/expected/DRAMSys_ddr5-example_ddr5_ch1.tdb b/tests/tests_regression/DDR5/expected/DRAMSys_ddr5-example_ddr5_ch1.tdb new file mode 100644 index 00000000..d76dbe0a --- /dev/null +++ b/tests/tests_regression/DDR5/expected/DRAMSys_ddr5-example_ddr5_ch1.tdb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d919de55d4f608730cf65fe7fa58d61630dca3188f56748a461b57e6c154ca71 +size 94208 diff --git a/tests/tests_regression/DDR5/traces/trace_test3.stl b/tests/tests_regression/DDR5/traces/trace_test3.stl new file mode 100644 index 00000000..9227758b --- /dev/null +++ b/tests/tests_regression/DDR5/traces/trace_test3.stl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4d7378afb7d050ffb7c99db95d66f2997e994ef4d41aab4e9e09fb15ff64a46 +size 433662 diff --git a/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch0.tdb b/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch0.tdb index db33da5a..61bd8510 100644 --- a/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch0.tdb +++ b/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch0.tdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:356f3a4042e88412dd834add20f753a1b26d5743571cd799f3bd07362a4dfab4 +oid sha256:e28815053438678605ceadfd76441dbffb54568b96f09ec458ad6376e5d3f2d4 size 643072 diff --git a/tests/tests_regression/HBM2/hbm2.txt b/tests/tests_regression/HBM2/hbm2.txt new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_regression/HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb b/tests/tests_regression/HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb index e68e22a4..ef4589ab 100644 --- a/tests/tests_regression/HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb +++ b/tests/tests_regression/HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:25448feb56b34e07ba079b7561a696eb4be67248b87d709fc50dae8ab8f342fc -size 1212416 +oid sha256:433b011ba87ca51869cca6694c67fd21e8087048a57b7157f4e0a09204c1c37b +size 1220608 From e3bd773cac5dcaa1dffe30c3f7f8555dd513e1cb Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Tue, 4 Jul 2023 10:14:29 +0200 Subject: [PATCH 22/28] Implement isFullCycle, alignAtNext functions in utils and add tests --- src/libdramsys/DRAMSys/common/utils.cpp | 10 +++++ src/libdramsys/DRAMSys/common/utils.h | 3 ++ .../DRAMSys/controller/Controller.cpp | 8 +--- .../DRAMSys/controller/Controller.h | 2 - tests/tests_dramsys/test_utils.cpp | 42 +++++++++++++++++++ 5 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 tests/tests_dramsys/test_utils.cpp diff --git a/src/libdramsys/DRAMSys/common/utils.cpp b/src/libdramsys/DRAMSys/common/utils.cpp index ab919c30..7eaf2ff6 100644 --- a/src/libdramsys/DRAMSys/common/utils.cpp +++ b/src/libdramsys/DRAMSys/common/utils.cpp @@ -86,4 +86,14 @@ void setUpDummy(tlm_generic_payload &payload, uint64_t channelPayloadID, Rank ra ArbiterExtension::setExtension(payload, Thread(UINT_MAX), Channel(0), 0, SC_ZERO_TIME); } +bool isFullCycle(sc_core::sc_time time, sc_core::sc_time cycleTime) +{ + return alignAtNext(time, cycleTime) == time; +} + +sc_time alignAtNext(sc_time time, sc_time alignment) +{ + return std::ceil(time / alignment) * alignment; +} + } // namespace DRAMSys diff --git a/src/libdramsys/DRAMSys/common/utils.h b/src/libdramsys/DRAMSys/common/utils.h index 47e3164e..a6f922be 100644 --- a/src/libdramsys/DRAMSys/common/utils.h +++ b/src/libdramsys/DRAMSys/common/utils.h @@ -69,6 +69,9 @@ std::string getPhaseName(const tlm::tlm_phase &phase); void setUpDummy(tlm::tlm_generic_payload &payload, uint64_t channelPayloadID, Rank rank = Rank(0), BankGroup bankGroup = BankGroup(0), Bank bank = Bank(0)); +bool isFullCycle(sc_core::sc_time time, sc_core::sc_time cycleTime); +sc_core::sc_time alignAtNext(sc_core::sc_time time, sc_core::sc_time alignment); + } // namespace DRAMSys #endif // UTILS_H diff --git a/src/libdramsys/DRAMSys/controller/Controller.cpp b/src/libdramsys/DRAMSys/controller/Controller.cpp index c87a21df..2c40fa11 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.cpp +++ b/src/libdramsys/DRAMSys/controller/Controller.cpp @@ -258,7 +258,7 @@ Controller::Controller(const sc_module_name& name, const Configuration& config, void Controller::controllerMethod() { - if (isFullCycle(sc_time_stamp())) + if (isFullCycle(sc_time_stamp(), memSpec.tCK)) { // (1) Finish last response (END_RESP) and start new response (BEGIN_RESP) manageResponses(); @@ -685,10 +685,4 @@ void Controller::createChildTranses(tlm::tlm_generic_payload& parentTrans) ParentExtension::setExtension(parentTrans, std::move(childTranses)); } -bool Controller::isFullCycle(const sc_core::sc_time& time) const -{ - sc_time alignedAtHalfCycle = std::floor((time * 2 / memSpec.tCK + 0.5)) / 2 * memSpec.tCK; - return sc_time::from_value(alignedAtHalfCycle.value() % memSpec.tCK.value()) == SC_ZERO_TIME; -} - } // namespace DRAMSys diff --git a/src/libdramsys/DRAMSys/controller/Controller.h b/src/libdramsys/DRAMSys/controller/Controller.h index 4c598f70..7fa929bf 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.h +++ b/src/libdramsys/DRAMSys/controller/Controller.h @@ -106,8 +106,6 @@ private: void manageResponses(); void manageRequests(const sc_core::sc_time& delay); - bool isFullCycle(const sc_core::sc_time& time) const; - sc_core::sc_event beginReqEvent, endRespEvent, controllerEvent, dataResponseEvent; const unsigned minBytesPerBurst; diff --git a/tests/tests_dramsys/test_utils.cpp b/tests/tests_dramsys/test_utils.cpp new file mode 100644 index 00000000..a2cddc04 --- /dev/null +++ b/tests/tests_dramsys/test_utils.cpp @@ -0,0 +1,42 @@ +#include + +#include + +using sc_core::sc_time; +using sc_core::SC_NS; +using sc_core::SC_US; + +TEST(AlignAtNext, FullCycle) +{ + EXPECT_EQ(DRAMSys::alignAtNext(sc_time(5, SC_NS), sc_time(1, SC_NS)), sc_time(5, SC_NS)); + EXPECT_EQ(DRAMSys::alignAtNext(sc_time(10, SC_NS), sc_time(2, SC_NS)), sc_time(10, SC_NS)); + EXPECT_EQ(DRAMSys::alignAtNext(sc_time(10, SC_NS), sc_time(10, SC_NS)), sc_time(10, SC_NS)); + EXPECT_EQ(DRAMSys::alignAtNext(sc_time(100, SC_NS), sc_time(10, SC_NS)), sc_time(100, SC_NS)); +} + +TEST(AlignAtNext, HalfCycle) +{ + EXPECT_EQ(DRAMSys::alignAtNext(sc_time(0.5, SC_NS), sc_time(1, SC_NS)), sc_time(1, SC_NS)); + EXPECT_EQ(DRAMSys::alignAtNext(sc_time(5, SC_NS), sc_time(10, SC_NS)), sc_time(10, SC_NS)); + EXPECT_EQ(DRAMSys::alignAtNext(sc_time(22.5, SC_NS), sc_time(5, SC_NS)), sc_time(25, SC_NS)); + EXPECT_EQ(DRAMSys::alignAtNext(sc_time(55, SC_NS), sc_time(5, SC_NS)), sc_time(55, SC_NS)); +} + +TEST(AlignAtNext, ArbitraryCycle) +{ + EXPECT_EQ(DRAMSys::alignAtNext(sc_time(0.37, SC_NS), sc_time(1, SC_NS)), sc_time(1, SC_NS)); + EXPECT_EQ(DRAMSys::alignAtNext(sc_time(5, SC_NS), sc_time(6.67, SC_NS)), sc_time(6.67, SC_NS)); + EXPECT_EQ(DRAMSys::alignAtNext(sc_time(4.99, SC_NS), sc_time(5, SC_NS)), sc_time(5, SC_NS)); + EXPECT_EQ(DRAMSys::alignAtNext(sc_time(0, SC_NS), sc_time(7.77, SC_NS)), sc_time(0, SC_NS)); + EXPECT_EQ(DRAMSys::alignAtNext(sc_time(4.49, SC_US), sc_time(500, SC_NS)), sc_time(4.5, SC_US)); +} + +TEST(IsFullCycle, IsFullCycle) +{ + EXPECT_TRUE(DRAMSys::isFullCycle(sc_time(0, SC_NS), sc_time(1, SC_NS))); + EXPECT_TRUE(DRAMSys::isFullCycle(sc_time(0, SC_NS), sc_time(1000, SC_US))); + EXPECT_TRUE(DRAMSys::isFullCycle(sc_time(5, SC_NS), sc_time(1, SC_NS))); + EXPECT_FALSE(DRAMSys::isFullCycle(sc_time(0.5, SC_NS), sc_time(1, SC_NS))); + EXPECT_TRUE(DRAMSys::isFullCycle(sc_time(67, SC_US), sc_time(1, SC_NS))); + EXPECT_FALSE(DRAMSys::isFullCycle(sc_time(67.05, SC_US), sc_time(100, SC_NS))); +} From 81eaccf3d6ae151c3d2ffe8c26b1c6357faa6727 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Tue, 4 Jul 2023 10:27:41 +0200 Subject: [PATCH 23/28] Add lastCommandOn{C,R}asBus != scMaxTime check for HBM2 and HBM3 --- .../controller/checker/CheckerHBM3.cpp | 53 +++++++++++++------ .../controller/checker/CheckerHBM2.cpp | 28 +--------- .../DRAMSys_hbm2-example_hbm2_ch0.tdb | 2 +- .../DRAMSys_hbm2-example_hbm2_ch1.tdb | 2 +- .../DRAMSys_hbm3-example_hbm3_ch0.tdb | 4 +- 5 files changed, 41 insertions(+), 48 deletions(-) diff --git a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp index 0d0c83c2..f081e85a 100644 --- a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp +++ b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp @@ -107,7 +107,8 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK / 2); + if (lastCommandOnRasBus != scMaxTime) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK / 2); } else if (command == Command::RD) { @@ -151,7 +152,8 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnCasBus + memSpec->tCK); + if (lastCommandOnCasBus != scMaxTime) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnCasBus + memSpec->tCK); } else if (command == Command::WR) { @@ -187,7 +189,8 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnCasBus + memSpec->tCK); + if (lastCommandOnCasBus != scMaxTime) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnCasBus + memSpec->tCK); } else if (command == Command::RDA) { @@ -236,7 +239,8 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnCasBus + memSpec->tCK); + if (lastCommandOnCasBus != scMaxTime) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnCasBus + memSpec->tCK); } else if (command == Command::WRA) { @@ -272,7 +276,8 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnCasBus + memSpec->tCK); + if (lastCommandOnCasBus != scMaxTime) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnCasBus + memSpec->tCK); } else if (command == Command::ACT) { @@ -349,7 +354,9 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (last4Activates[rank].size() >= 4) earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); + + if (lastCommandOnRasBus != scMaxTime) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::REFAB) { @@ -397,7 +404,8 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); + if (lastCommandOnRasBus != scMaxTime) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::PREAB) { @@ -437,7 +445,8 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK / 2); + if (lastCommandOnRasBus != scMaxTime) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK / 2); } else if (command == Command::REFPB) { @@ -517,7 +526,9 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (last4Activates[rank].size() >= 4) earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); + + if (lastCommandOnRasBus != scMaxTime) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::SREFEN) { @@ -558,7 +569,8 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); + if (lastCommandOnRasBus != scMaxTime) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::RFMAB) { @@ -582,7 +594,8 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB); - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); + if (lastCommandOnRasBus != scMaxTime) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::RFMAB) { @@ -622,7 +635,8 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD); - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); + if (lastCommandOnRasBus != scMaxTime) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::PDEA) { @@ -646,7 +660,8 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); + if (lastCommandOnRasBus != scMaxTime) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::PDEP) { @@ -670,7 +685,8 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); + if (lastCommandOnRasBus != scMaxTime) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::PDXP) { @@ -678,7 +694,8 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); + if (lastCommandOnRasBus != scMaxTime) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::PDXA) { @@ -686,7 +703,8 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); + if (lastCommandOnRasBus != scMaxTime) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::SREFEX) { @@ -694,7 +712,8 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKESR); - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); + if (lastCommandOnRasBus != scMaxTime) + earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else { diff --git a/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.cpp b/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.cpp index a33368a5..638c76ad 100644 --- a/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.cpp +++ b/src/libdramsys/DRAMSys/controller/checker/CheckerHBM2.cpp @@ -79,7 +79,7 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic Rank rank = ControllerExtension::getRank(payload); BankGroup bankGroup = ControllerExtension::getBankGroup(payload); Bank bank = ControllerExtension::getBank(payload); - + sc_time lastCommandStart; sc_time earliestTimeToStart = sc_time_stamp(); @@ -135,8 +135,6 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic lastCommandStart = lastScheduledByCommand[Command::PDXA]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnCasBus + memSpec->tCK); } else if (command == Command::WR || command == Command::WRA) { @@ -175,8 +173,6 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic lastCommandStart = lastScheduledByCommand[Command::PDXA]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnCasBus + memSpec->tCK); } else if (command == Command::ACT) { @@ -234,8 +230,6 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic if (last4Activates[rank].size() >= 4) earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW - memSpec->tCK); - - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::PREPB) { @@ -254,8 +248,6 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic lastCommandStart = lastScheduledByCommand[Command::PDXA]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP); - - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::PREAB) { @@ -286,8 +278,6 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCSB); - - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::REFAB) { @@ -326,8 +316,6 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic lastCommandStart = lastScheduledByCommand[Command::SREFEX]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::REFPB) { @@ -390,8 +378,6 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic if (last4Activates[rank].size() >= 4) earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW); - - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::PDEA) { @@ -414,16 +400,12 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic lastCommandStart = lastScheduledByCommand[Command::PDXA]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE); - - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::PDXA) { lastCommandStart = lastScheduledByCommand[Command::PDEA]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); - - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::PDEP) { @@ -446,16 +428,12 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic lastCommandStart = lastScheduledByCommand[Command::SREFEX]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::PDXP) { lastCommandStart = lastScheduledByCommand[Command::PDEP]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD); - - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::SREFEN) { @@ -494,16 +472,12 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, const tlm_generic lastCommandStart = lastScheduledByCommand[Command::SREFEX]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS); - - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else if (command == Command::SREFEX) { lastCommandStart = lastScheduledByCommand[Command::SREFEN]; if (lastCommandStart != scMaxTime) earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKESR); - - earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK); } else SC_REPORT_FATAL("CheckerHBM2", "Unknown command!"); diff --git a/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch0.tdb b/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch0.tdb index 61bd8510..d9cb9ea2 100644 --- a/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch0.tdb +++ b/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch0.tdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e28815053438678605ceadfd76441dbffb54568b96f09ec458ad6376e5d3f2d4 +oid sha256:7af52c46889918140537dea5459526d20e008ce78bfc02b5589b5b636f79e60f size 643072 diff --git a/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch1.tdb b/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch1.tdb index a9aedd34..6e8988b2 100644 --- a/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch1.tdb +++ b/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch1.tdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ed3b44b05059fe6e8ff8006584c83f9f9f9682c8b6c30cc3ab922b70ef6b8ba5 +oid sha256:78832b68a732318c46a4b88e70438845f2ff46092d99193eba3454daf9a4a91c size 643072 diff --git a/tests/tests_regression/HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb b/tests/tests_regression/HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb index ef4589ab..d8958fa8 100644 --- a/tests/tests_regression/HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb +++ b/tests/tests_regression/HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:433b011ba87ca51869cca6694c67fd21e8087048a57b7157f4e0a09204c1c37b -size 1220608 +oid sha256:ae0c65a452d5e9291c4dcd0198ab4aec027c9bb9620427b87e6aa143f69898e5 +size 1212416 From 0fc74e93c4a5f3d15b32c00c752126b92d697d88 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Thu, 6 Jul 2023 10:46:02 +0200 Subject: [PATCH 24/28] Add LPDDR5 regression test --- tests/tests_configuration/simpletest.cpp | 216 ------------------ tests/tests_regression/CMakeLists.txt | 6 + .../DRAMSys_lpddr4-example_lpddr4_ch0.tdb | 3 + .../DRAMSys_lpddr5-example_lpddr5_ch0.tdb | 0 .../LPDDR5/lpddr5-example.json | 141 ++++++++++++ .../LPDDR5/traces/trace_lpddr5.stl | 3 + 6 files changed, 153 insertions(+), 216 deletions(-) delete mode 100644 tests/tests_configuration/simpletest.cpp create mode 100644 tests/tests_regression/LPDDR5/expected/DRAMSys_lpddr4-example_lpddr4_ch0.tdb create mode 100644 tests/tests_regression/LPDDR5/expected/DRAMSys_lpddr5-example_lpddr5_ch0.tdb create mode 100644 tests/tests_regression/LPDDR5/lpddr5-example.json create mode 100644 tests/tests_regression/LPDDR5/traces/trace_lpddr5.stl diff --git a/tests/tests_configuration/simpletest.cpp b/tests/tests_configuration/simpletest.cpp deleted file mode 100644 index 6138808b..00000000 --- a/tests/tests_configuration/simpletest.cpp +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright (c) 2021, RPTU Kaiserslautern-Landau - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: - * Derek Christ - */ - -#include - -#include - -#include -#include - -using namespace DRAMSys::Config; - -DRAMSys::Config::AddressMapping getAddressMapping() -{ - return DRAMSys::Config::AddressMapping{ - {{0, 1}}, - {{2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}}, - {{16}}, - {{13, 14, 15}}, - {{17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}}, - {{33}}, - {{}}, - {{}} - }; -} - -DRAMSys::Config::McConfig getMcConfig() -{ - return McConfig{ - PagePolicy::Open, - Scheduler::FrFcfs, - 0, - 0, - SchedulerBuffer::Bankwise, - 8, - CmdMux::Oldest, - RespQueue::Fifo, - RefreshPolicy::AllBank, - 0, - 0, - PowerDownPolicy::NoPowerDown, - Arbiter::Simple, - 128, - {} - }; -} - -DRAMSys::Config::SimConfig getSimConfig() -{ - return DRAMSys::Config::SimConfig{ - 0, false, true, false, false, {"error.csv"}, - 42, false, {"ddr5"}, true, DRAMSys::Config::StoreMode::NoStorage, false, false, - 1000}; -} - -DRAMSys::Config::TracePlayer getTracePlayer() -{ - DRAMSys::Config::TracePlayer player; - player.clkMhz = 100; - player.name = "mytrace.stl"; - - return player; -} - -DRAMSys::Config::TraceGenerator getTraceGeneratorOneState() -{ - DRAMSys::Config::TraceGenerator gen; - gen.clkMhz = 100; - gen.name = "MyTestGen"; - - DRAMSys::Config::TraceGeneratorTrafficState state0; - state0.numRequests = 1000; - state0.rwRatio = 0.5; - state0.addressDistribution = DRAMSys::Config::AddressDistribution::Random; - state0.addressIncrement = {}; - state0.minAddress = {}; - state0.maxAddress = {}; - state0.clksPerRequest = {}; - - gen.states.emplace(0, state0); - - return gen; -} - -DRAMSys::Config::TraceGenerator getTraceGeneratorMultipleStates() -{ - DRAMSys::Config::TraceGenerator gen; - - gen.clkMhz = 100; - gen.name = "MyTestGen"; - gen.maxPendingReadRequests = 8; - - DRAMSys::Config::TraceGeneratorTrafficState state0; - state0.numRequests = 1000; - state0.rwRatio = 0.5; - state0.addressDistribution = DRAMSys::Config::AddressDistribution::Sequential; - state0.addressIncrement = 256; - state0.minAddress = {}; - state0.maxAddress = 1024; - state0.clksPerRequest = {}; - - DRAMSys::Config::TraceGeneratorTrafficState state1; - state1.numRequests = 100; - state1.rwRatio = 0.75; - state1.addressDistribution = DRAMSys::Config::AddressDistribution::Sequential; - state1.addressIncrement = 512; - state1.minAddress = 1024; - state1.maxAddress = 2048; - state1.clksPerRequest = {}; - - gen.states.emplace(0, state0); - gen.states.emplace(1, state1); - - DRAMSys::Config::TraceGeneratorStateTransition transistion0{1, 1.0}; - - gen.transitions.emplace(0, transistion0); - - return gen; -} - -DRAMSys::Config::TraceHammer getTraceHammer() -{ - DRAMSys::Config::TraceHammer hammer; - - hammer.clkMhz = 100; - hammer.name = "MyTestHammer"; - hammer.numRequests = 4000; - hammer.rowIncrement = 2097152; - - return hammer; -} - -DRAMSys::Config::TraceSetup getTraceSetup() -{ - using namespace DRAMSys::Config; - - std::vector> initiators; - initiators.emplace_back(getTracePlayer()); - initiators.emplace_back(getTraceGeneratorOneState()); - initiators.emplace_back(getTraceGeneratorMultipleStates()); - initiators.emplace_back(getTraceHammer()); - - return DRAMSys::Config::TraceSetup{initiators}; -} - -DRAMSys::Config::Configuration getConfig(const DRAMSys::Config::MemSpec &memSpec) -{ - return DRAMSys::Config::Configuration{ - getAddressMapping(), - getMcConfig(), - memSpec, - getSimConfig(), - "std::string_simulationId", - // {{}, false}, works too - getTraceSetup(), - }; -} - -int main() -{ - DRAMSys::Config::Configuration conf = DRAMSys::Config::from_path("ddr5.json"); - std::ofstream fileout("myjson.json"); - json_t j_my; - j_my["simulation"] = getConfig(conf.memSpec); // just copy memspec over - fileout << j_my.dump(4); - - std::ifstream file2("hbm2.json"); - json_t hbm2_j = json_t::parse(file2, nullptr, false); - json_t hbm2_config = hbm2_j.at("simulation"); - DRAMSys::Config::Configuration hbm2conf = hbm2_config.get(); - std::ofstream filehbm2("myhbm2.json"); - json_t j_myhbm2; - j_myhbm2["simulation"] = hbm2conf; - filehbm2 << j_myhbm2.dump(4); - - std::ifstream file3("myjson.json"); - json_t ddr5_old = json_t::parse(file3, nullptr, false); - json_t ddr5_old_conf = ddr5_old.at("simulation"); - DRAMSys::Config::Configuration ddr5_old_config = ddr5_old_conf.get(); - std::ofstream fileoldout("myjson2.json"); - json_t j_oldconfconv; - j_oldconfconv["simulation"] = ddr5_old_config; - fileoldout << j_oldconfconv.dump(4); -} diff --git a/tests/tests_regression/CMakeLists.txt b/tests/tests_regression/CMakeLists.txt index 394ecc5c..c87dd68a 100644 --- a/tests/tests_regression/CMakeLists.txt +++ b/tests/tests_regression/CMakeLists.txt @@ -54,6 +54,11 @@ set(TABLES_TO_COMPARE ) function(test_standard standard test_name base_config resource_dir output_filename) + if(NOT IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${standard}) + message(WARNING "Cannot find regression test ${standard}") + return() + endif() + # Put all the generated files into a subdirectory file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${test_name}) @@ -95,6 +100,7 @@ test_standard(DDR4 DDR4 ${CMAKE_CURRENT_SOURCE_DIR}/DDR4/ddr4-example.json ${CMA test_standard(DDR5 DDR5.Ch0 ${CMAKE_CURRENT_SOURCE_DIR}/DDR5/ddr5-example.json ${CMAKE_CURRENT_SOURCE_DIR}/DDR5 DRAMSys_ddr5-example_ddr5_ch0.tdb) test_standard(DDR5 DDR5.Ch1 ${CMAKE_CURRENT_SOURCE_DIR}/DDR5/ddr5-example.json ${CMAKE_CURRENT_SOURCE_DIR}/DDR5 DRAMSys_ddr5-example_ddr5_ch1.tdb) test_standard(LPDDR4 LPDDR4 ${CMAKE_CURRENT_SOURCE_DIR}/LPDDR4/lpddr4-example.json ${CMAKE_CURRENT_SOURCE_DIR}/LPDDR4 DRAMSys_lpddr4-example_lpddr4_ch0.tdb) +test_standard(LPDDR5 LPDDR5 ${CMAKE_CURRENT_SOURCE_DIR}/LPDDR5/lpddr5-example.json ${CMAKE_CURRENT_SOURCE_DIR}/LPDDR5 DRAMSys_lpddr5-example_lpddr5_ch0.tdb) test_standard(HBM2 HBM2.Ch0 ${CMAKE_CURRENT_SOURCE_DIR}/HBM2/hbm2-example.json ${CMAKE_CURRENT_SOURCE_DIR}/HBM2 DRAMSys_hbm2-example_hbm2_ch0.tdb) test_standard(HBM2 HBM2.Ch1 ${CMAKE_CURRENT_SOURCE_DIR}/HBM2/hbm2-example.json ${CMAKE_CURRENT_SOURCE_DIR}/HBM2 DRAMSys_hbm2-example_hbm2_ch1.tdb) test_standard(HBM3 HBM3 ${CMAKE_CURRENT_SOURCE_DIR}/HBM3/hbm3-example.json ${CMAKE_CURRENT_SOURCE_DIR}/HBM3 DRAMSys_hbm3-example_hbm3_ch0.tdb) diff --git a/tests/tests_regression/LPDDR5/expected/DRAMSys_lpddr4-example_lpddr4_ch0.tdb b/tests/tests_regression/LPDDR5/expected/DRAMSys_lpddr4-example_lpddr4_ch0.tdb new file mode 100644 index 00000000..b2c11196 --- /dev/null +++ b/tests/tests_regression/LPDDR5/expected/DRAMSys_lpddr4-example_lpddr4_ch0.tdb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64acfb8c773c65c91a3bcad996419de80cff7780378a663c9ead2e53da0030c2 +size 2826240 diff --git a/tests/tests_regression/LPDDR5/expected/DRAMSys_lpddr5-example_lpddr5_ch0.tdb b/tests/tests_regression/LPDDR5/expected/DRAMSys_lpddr5-example_lpddr5_ch0.tdb new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_regression/LPDDR5/lpddr5-example.json b/tests/tests_regression/LPDDR5/lpddr5-example.json new file mode 100644 index 00000000..0c07fa7d --- /dev/null +++ b/tests/tests_regression/LPDDR5/lpddr5-example.json @@ -0,0 +1,141 @@ +{ + "simulation": { + "addressmapping": { + "BANKGROUP_BIT": [ + 5, + 6 + ], + "BANK_BIT": [ + 7, + 8 + ], + "BYTE_BIT": [ + 0 + ], + "COLUMN_BIT": [ + 1, + 2, + 3, + 4, + 9, + 10, + 11, + 12, + 13, + 14 + ], + "ROW_BIT": [ + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30 + ] + }, + "mcconfig": { + "Arbiter": "Simple", + "CmdMux": "Oldest", + "MaxActiveTransactions": 128, + "PagePolicy": "Open", + "PowerDownPolicy": "NoPowerDown", + "RefreshManagement": false, + "RefreshMaxPostponed": 0, + "RefreshMaxPulledin": 0, + "RefreshPolicy": "Per2Bank", + "RequestBufferSize": 8, + "RespQueue": "Fifo", + "Scheduler": "FrFcfs", + "SchedulerBuffer": "Bankwise" + }, + "memspec": { + "memarchitecturespec": { + "burstLength": 16, + "dataRate": 8, + "nbrOfBankGroups": 4, + "nbrOfBanks": 16, + "nbrOfChannels": 1, + "nbrOfColumns": 1024, + "nbrOfDevices": 1, + "nbrOfRanks": 1, + "nbrOfRows": 65536, + "per2BankOffset": 8, + "width": 16 + }, + "memoryId": "JEDEC_1Gbx16_BG_LPDDR5-6400", + "memoryType": "LPDDR5", + "memtimingspec": { + "BL_n_L_16": 4, + "BL_n_L_32": 8, + "BL_n_S_16": 2, + "BL_n_S_32": 2, + "BL_n_max_16": 4, + "BL_n_max_32": 8, + "BL_n_min_16": 2, + "BL_n_min_32": 6, + "CCDMW": 16, + "FAW": 16, + "PPD": 2, + "RAS": 34, + "RBTP": 4, + "RCD_L": 15, + "RCD_S": 15, + "RCab": 51, + "RCpb": 48, + "REFI": 3124, + "REFIpb": 390, + "RFCab": 224, + "RFCpb": 112, + "RL": 17, + "RPRE": 0, + "RPST": 0, + "RPab": 17, + "RPpb": 15, + "RRD": 4, + "RTRS": 1, + "WCK2CK": 0, + "WCK2DQI": 0, + "WCK2DQO": 1, + "WL": 9, + "WPRE": 0, + "WPST": 0, + "WR": 28, + "WTR_L": 10, + "WTR_S": 5, + "clkMhz": 800, + "pbR2act": 6, + "pbR2pbR": 72 + } + }, + "simconfig": { + "AddressOffset": 0, + "CheckTLM2Protocol": false, + "DatabaseRecording": true, + "Debug": false, + "EnableWindowing": false, + "PowerAnalysis": false, + "SimulationName": "example", + "SimulationProgressBar": true, + "StoreMode": "NoStorage", + "UseMalloc": false, + "WindowSize": 1000 + }, + "simulationid": "lpddr5-example", + "tracesetup": [ + { + "clkMhz": 1600, + "name": "trace_lpddr5.stl" + } + ] + } +} \ No newline at end of file diff --git a/tests/tests_regression/LPDDR5/traces/trace_lpddr5.stl b/tests/tests_regression/LPDDR5/traces/trace_lpddr5.stl new file mode 100644 index 00000000..1b3f9958 --- /dev/null +++ b/tests/tests_regression/LPDDR5/traces/trace_lpddr5.stl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69b0d83057ff4da0f60f8f66e2f253c94f6744efcd71ece8ee2e1eaa5111c634 +size 254470 From b988544be2861b53176068de8325545049ea4bea Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Thu, 6 Jul 2023 10:46:34 +0200 Subject: [PATCH 25/28] Enable PerBank refresh in HBM2,HBM3 regression test --- .../HBM2/expected/DRAMSys_hbm2-example_hbm2_ch0.tdb | 4 ++-- .../HBM2/expected/DRAMSys_hbm2-example_hbm2_ch1.tdb | 4 ++-- tests/tests_regression/HBM2/hbm2-example.json | 2 +- .../HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb | 4 ++-- tests/tests_regression/HBM3/hbm3-example.json | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch0.tdb b/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch0.tdb index d9cb9ea2..606e62e0 100644 --- a/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch0.tdb +++ b/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch0.tdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7af52c46889918140537dea5459526d20e008ce78bfc02b5589b5b636f79e60f -size 643072 +oid sha256:951ff2fb9a982cb421748222c8fffcfd1e1856b831ee17ccdb30ef93f1ee309c +size 671744 diff --git a/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch1.tdb b/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch1.tdb index 6e8988b2..dbc252d2 100644 --- a/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch1.tdb +++ b/tests/tests_regression/HBM2/expected/DRAMSys_hbm2-example_hbm2_ch1.tdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:78832b68a732318c46a4b88e70438845f2ff46092d99193eba3454daf9a4a91c -size 643072 +oid sha256:c7465ec3484b87ecd8a75491b34e86f4e9cf716fad1f12fe59a1099572c8c586 +size 675840 diff --git a/tests/tests_regression/HBM2/hbm2-example.json b/tests/tests_regression/HBM2/hbm2-example.json index b17b6b48..1dae5688 100644 --- a/tests/tests_regression/HBM2/hbm2-example.json +++ b/tests/tests_regression/HBM2/hbm2-example.json @@ -51,7 +51,7 @@ "RequestBufferSize": 8, "CmdMux": "Strict", "RespQueue": "Fifo", - "RefreshPolicy": "NoRefresh", + "RefreshPolicy": "PerBank", "RefreshMaxPostponed": 0, "RefreshMaxPulledin": 0, "PowerDownPolicy": "NoPowerDown", diff --git a/tests/tests_regression/HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb b/tests/tests_regression/HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb index d8958fa8..1444f081 100644 --- a/tests/tests_regression/HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb +++ b/tests/tests_regression/HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ae0c65a452d5e9291c4dcd0198ab4aec027c9bb9620427b87e6aa143f69898e5 -size 1212416 +oid sha256:a83949f53b32360d25095f5a344c9aae5fdcfe5b8516b63adf779c405f06c1a0 +size 1462272 diff --git a/tests/tests_regression/HBM3/hbm3-example.json b/tests/tests_regression/HBM3/hbm3-example.json index 883c70dc..a35e6a1e 100644 --- a/tests/tests_regression/HBM3/hbm3-example.json +++ b/tests/tests_regression/HBM3/hbm3-example.json @@ -50,7 +50,7 @@ "RequestBufferSize": 8, "CmdMux": "Strict", "RespQueue": "Fifo", - "RefreshPolicy": "NoRefresh", + "RefreshPolicy": "PerBank", "RefreshMaxPostponed": 0, "RefreshMaxPulledin": 0, "PowerDownPolicy": "NoPowerDown", From c352ca43721a2c5dcfa17a2f9d462a1ff940a795 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Thu, 20 Jul 2023 11:25:24 +0200 Subject: [PATCH 26/28] Remove compare.sh scripts and invoke sqldiff directly from CMake --- tests/tests_regression/CMakeLists.txt | 13 ++++++------- tests/tests_regression/compare.sh | 9 --------- tests/tests_regression/compare_table.sh | 10 ---------- 3 files changed, 6 insertions(+), 26 deletions(-) delete mode 100755 tests/tests_regression/compare.sh delete mode 100755 tests/tests_regression/compare_table.sh diff --git a/tests/tests_regression/CMakeLists.txt b/tests/tests_regression/CMakeLists.txt index c87dd68a..1ed6addf 100644 --- a/tests/tests_regression/CMakeLists.txt +++ b/tests/tests_regression/CMakeLists.txt @@ -28,7 +28,7 @@ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # -# Authors: +# Authors: # Derek Christ ############################################### @@ -62,8 +62,6 @@ function(test_standard standard test_name base_config resource_dir output_filena # Put all the generated files into a subdirectory file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${test_name}) - configure_file(compare.sh ${test_name}/compare.sh) - # Test to create database add_test( NAME Regression${test_name}.CreateDatabase @@ -78,20 +76,21 @@ function(test_standard standard test_name base_config resource_dir output_filena add_test( NAME Regression${test_name}.SqlDiff WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${test_name} - COMMAND compare.sh + COMMAND sqldiff ${CMAKE_CURRENT_SOURCE_DIR}/${standard}/expected/${output_filename} ${output_filename} ) set_tests_properties(Regression${test_name}.SqlDiff PROPERTIES FIXTURES_REQUIRED Regression${test_name}.CreateDatabase) # Tests to diff individual tables foreach(table IN LISTS TABLES_TO_COMPARE) - configure_file(compare_table.sh ${test_name}/compare_table-${table}.sh) - add_test( NAME Regression${test_name}.SqlDiff.${table} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${test_name} - COMMAND compare_table-${table}.sh + COMMAND sqldiff --table ${table} ${CMAKE_CURRENT_SOURCE_DIR}/${standard}/expected/${output_filename} ${output_filename} ) set_tests_properties(Regression${test_name}.SqlDiff.${table} PROPERTIES FIXTURES_REQUIRED Regression${test_name}.CreateDatabase) + + # Only pass test if output is empty + set_tests_properties(Regression${test_name}.SqlDiff.${table} PROPERTIES PASS_REGULAR_EXPRESSION "^$") endforeach() endfunction() diff --git a/tests/tests_regression/compare.sh b/tests/tests_regression/compare.sh deleted file mode 100755 index 859e8044..00000000 --- a/tests/tests_regression/compare.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -# When comparing the whole database, we do not care if there are differences or not. -# The tables that need to be checked have their own tests. -# The purpose of this script is solely to output the differences of the two databases -# so that they can be inspected easily. - -sqldiff ${CMAKE_CURRENT_SOURCE_DIR}/${standard}/expected/${output_filename} ${output_filename} -exit 0 diff --git a/tests/tests_regression/compare_table.sh b/tests/tests_regression/compare_table.sh deleted file mode 100755 index 1e709f07..00000000 --- a/tests/tests_regression/compare_table.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -stdout=$(sqldiff --table ${table} ${CMAKE_CURRENT_SOURCE_DIR}/${standard}/expected/${output_filename} ${output_filename}) - -if [[ $stdout ]]; then - echo $stdout - exit -1 -else - exit 0 -fi From a18bbc7465e258b038bb238fcea8cb3ebeb38ae1 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Mon, 14 Aug 2023 10:38:36 +0200 Subject: [PATCH 27/28] Add the resource directory option to the json converter --- tests/tests_configuration/jsonconverter.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/tests_configuration/jsonconverter.cpp b/tests/tests_configuration/jsonconverter.cpp index 8f39999c..1fadba54 100644 --- a/tests/tests_configuration/jsonconverter.cpp +++ b/tests/tests_configuration/jsonconverter.cpp @@ -41,14 +41,18 @@ int main(int argc, char **argv) { - if (argc != 2) + if (argc < 2) { std::cerr << "Must specify a simulation json as single argument.\n"; return -1; } std::string pathToJson = argv[1]; - auto configuration = DRAMSys::Config::from_path(pathToJson); + std::string resourceDirectory = argc <= 2 ? DRAMSYS_RESOURCE_DIR : argv[2]; + + auto configuration = DRAMSys::Config::from_path(pathToJson, resourceDirectory); + + nlohmann::json json; json["simulation"] = configuration; From a4342f71044d4801aff0cdd9f468a7eaaa9e2cab Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Tue, 15 Aug 2023 11:28:03 +0200 Subject: [PATCH 28/28] Update expected traces for DDR5 and HBM3 --- tests/tests_regression/CMakeLists.txt | 5 ++--- tests/tests_regression/DDR5/ddr5-example.json | 2 +- .../DDR5/expected/DRAMSys_ddr5-example_ddr5_ch0.tdb | 4 ++-- .../DDR5/expected/DRAMSys_ddr5-example_ddr5_ch1.tdb | 2 +- .../HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb | 4 ++-- tests/tests_regression/HBM3/hbm3-example.json | 6 +++--- 6 files changed, 11 insertions(+), 12 deletions(-) diff --git a/tests/tests_regression/CMakeLists.txt b/tests/tests_regression/CMakeLists.txt index 1ed6addf..e1d97ebf 100644 --- a/tests/tests_regression/CMakeLists.txt +++ b/tests/tests_regression/CMakeLists.txt @@ -39,11 +39,10 @@ cmake_minimum_required(VERSION 3.1.0) project(tests_regression) -find_program(Bash bash) find_program(SqlDiff sqldiff) -if(NOT Bash OR NOT SqlDiff) - message(WARNING "Regression tests require bash and sqldiff to be installed") +if(NOT SqlDiff) + message(WARNING "Regression tests require sqldiff to be installed") return() endif() diff --git a/tests/tests_regression/DDR5/ddr5-example.json b/tests/tests_regression/DDR5/ddr5-example.json index f6445f7c..3d2b0cbd 100644 --- a/tests/tests_regression/DDR5/ddr5-example.json +++ b/tests/tests_regression/DDR5/ddr5-example.json @@ -157,7 +157,7 @@ "simulationid": "ddr5-example", "tracesetup": [ { - "clkMhz": 933, + "clkMhz": 1600, "name": "trace_test3.stl" } ] diff --git a/tests/tests_regression/DDR5/expected/DRAMSys_ddr5-example_ddr5_ch0.tdb b/tests/tests_regression/DDR5/expected/DRAMSys_ddr5-example_ddr5_ch0.tdb index 5705dd3e..f8d7441f 100644 --- a/tests/tests_regression/DDR5/expected/DRAMSys_ddr5-example_ddr5_ch0.tdb +++ b/tests/tests_regression/DDR5/expected/DRAMSys_ddr5-example_ddr5_ch0.tdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:655d10bfd7b648e0f8121cd6d78652a86d2abc899a2181aaac33e87b5bed4833 -size 6045696 +oid sha256:5e0c71bd6f04a8e5547ef4207740b00b5ca68e02c6a7b99d998365809b54fc9d +size 6041600 diff --git a/tests/tests_regression/DDR5/expected/DRAMSys_ddr5-example_ddr5_ch1.tdb b/tests/tests_regression/DDR5/expected/DRAMSys_ddr5-example_ddr5_ch1.tdb index d76dbe0a..7ebed659 100644 --- a/tests/tests_regression/DDR5/expected/DRAMSys_ddr5-example_ddr5_ch1.tdb +++ b/tests/tests_regression/DDR5/expected/DRAMSys_ddr5-example_ddr5_ch1.tdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d919de55d4f608730cf65fe7fa58d61630dca3188f56748a461b57e6c154ca71 +oid sha256:efd6b710929d4d02b83950b5e4bc2b5fed39c66a6d6d850802902b8db3f8c17d size 94208 diff --git a/tests/tests_regression/HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb b/tests/tests_regression/HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb index 1444f081..20997b20 100644 --- a/tests/tests_regression/HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb +++ b/tests/tests_regression/HBM3/expected/DRAMSys_hbm3-example_hbm3_ch0.tdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a83949f53b32360d25095f5a344c9aae5fdcfe5b8516b63adf779c405f06c1a0 -size 1462272 +oid sha256:7609241e093ada5c641a7ff1ddbb0227c735f08095cd29f093e83c600462ab7b +size 1458176 diff --git a/tests/tests_regression/HBM3/hbm3-example.json b/tests/tests_regression/HBM3/hbm3-example.json index a35e6a1e..fb1fb047 100644 --- a/tests/tests_regression/HBM3/hbm3-example.json +++ b/tests/tests_regression/HBM3/hbm3-example.json @@ -79,7 +79,7 @@ "CCDS": 2, "CKE": 8, "DQSCK": 1, - "FAW": 16, + "FAW": 16, "PL": 0, "PPD": 2, "RAS": 28, @@ -126,11 +126,11 @@ "simulationid": "hbm3-example", "tracesetup": [ { - "clkMhz": 1000, + "clkMhz": 1600, "name": "trace1_test4.stl" }, { - "clkMhz": 1000, + "clkMhz": 1600, "name": "trace2_test4.stl" } ]