From 2540c9d194f8728cf54f0fa4e6dc8554d5f8b6ef Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Mon, 3 Jan 2022 11:05:20 +0100 Subject: [PATCH] Implement maxTransactions for TrafficGenerator SM --- .../src/common/configuration/TraceSetup.cpp | 4 +++ .../src/common/configuration/TraceSetup.h | 1 + DRAMSys/simulator/TrafficGenerator.cpp | 33 +++++++++++++++---- DRAMSys/simulator/TrafficGenerator.h | 11 ++++--- 4 files changed, 38 insertions(+), 11 deletions(-) diff --git a/DRAMSys/library/src/common/configuration/TraceSetup.cpp b/DRAMSys/library/src/common/configuration/TraceSetup.cpp index bba018c5..0963db41 100644 --- a/DRAMSys/library/src/common/configuration/TraceSetup.cpp +++ b/DRAMSys/library/src/common/configuration/TraceSetup.cpp @@ -60,6 +60,7 @@ void to_json(json &j, const TraceSetup &c) { initiator_j["type"] = "generator"; initiator_j["seed"] = generator->seed; + initiator_j["maxTransactions"] = generator->maxTransactions; // When there are less than 2 states, flatten out the json. if (generator->states.size() == 1) @@ -189,6 +190,9 @@ void from_json(const json &j, TraceSetup &c) if (initiator_j.contains("seed")) initiator_j.at("seed").get_to(generator->seed); + if (initiator_j.contains("maxTransactions")) + initiator_j.at("maxTransactions").get_to(generator->maxTransactions); + initiator = std::unique_ptr(generator); } else if (type == TrafficInitiatorType::Hammer) diff --git a/DRAMSys/library/src/common/configuration/TraceSetup.h b/DRAMSys/library/src/common/configuration/TraceSetup.h index 4fc804d8..bb861571 100644 --- a/DRAMSys/library/src/common/configuration/TraceSetup.h +++ b/DRAMSys/library/src/common/configuration/TraceSetup.h @@ -102,6 +102,7 @@ struct TraceGeneratorStateTransition struct TraceGenerator : public TrafficInitiator { Optional seed; + Optional maxTransactions; std::map states; std::multimap transitions; }; diff --git a/DRAMSys/simulator/TrafficGenerator.cpp b/DRAMSys/simulator/TrafficGenerator.cpp index 0dba0717..e6ea1cf8 100644 --- a/DRAMSys/simulator/TrafficGenerator.cpp +++ b/DRAMSys/simulator/TrafficGenerator.cpp @@ -38,6 +38,8 @@ #include "TrafficGenerator.h" +#include + using namespace sc_core; using namespace tlm; @@ -95,7 +97,7 @@ void TrafficGeneratorIf::sendNextPayload() TrafficGenerator::TrafficGenerator(const sc_module_name &name, const DRAMSysConfiguration::TraceGenerator &conf, TraceSetup *setup) : TrafficGeneratorIf(name, setup, evaluateMaxPendingReadRequests(conf), evaluateMaxPendingWriteRequests(conf)), - generatorClk(TrafficInitiator::evaluateGeneratorClk(conf)), conf(conf), + generatorClk(TrafficInitiator::evaluateGeneratorClk(conf)), conf(conf), maxTransactions(evaluateMaxTransactions(conf)), randomGenerator(std::default_random_engine(evaluateSeed(conf))) { // Perform checks for all states @@ -128,6 +130,7 @@ TrafficGenerator::TrafficGenerator(const sc_module_name &name, const DRAMSysConf void TrafficGenerator::calculateTransitions() { unsigned int state = 0; + uint64_t totalTransactions = 0; stateSequence.push_back(state); while (true) @@ -165,7 +168,12 @@ void TrafficGenerator::calculateTransitions() } if (transitionFound) - continue; + { + totalTransactions += conf.states.at(state).numRequests; + + if (totalTransactions < maxTransactions) + continue; + } break; } @@ -182,6 +190,9 @@ uint64_t TrafficGenerator::getTotalTransactions() const totalTransactions += conf.states.at(state).numRequests; } + if (totalTransactions > maxTransactions) + totalTransactions = maxTransactions; + return totalTransactions; } @@ -189,7 +200,7 @@ void TrafficGenerator::transitionToNextState() { ++stateIt; - if (stateIt == stateSequence.cend()) + if (stateIt == stateSequence.cend() || transactionsSent >= maxTransactions) { // No transition performed. finished = true; @@ -260,7 +271,7 @@ uint64_t TrafficGenerator::getNextAddress() } } -unsigned int TrafficGenerator::evaluateSeed(const DRAMSysConfiguration::TraceGenerator &conf) +uint64_t TrafficGenerator::evaluateSeed(const DRAMSysConfiguration::TraceGenerator &conf) { if (conf.seed.isValid()) return conf.seed.getValue(); @@ -268,7 +279,15 @@ unsigned int TrafficGenerator::evaluateSeed(const DRAMSysConfiguration::TraceGen return 0; } -unsigned int TrafficGenerator::evaluateMinAddress(const DRAMSysConfiguration::TraceGeneratorState &state) +uint64_t TrafficGenerator::evaluateMaxTransactions(const DRAMSysConfiguration::TraceGenerator &conf) +{ + if (conf.maxTransactions.isValid()) + return conf.maxTransactions.getValue(); + else + return std::numeric_limits::max(); +} + +uint64_t TrafficGenerator::evaluateMinAddress(const DRAMSysConfiguration::TraceGeneratorState &state) { if (state.minAddress.isValid()) return state.minAddress.getValue(); @@ -276,7 +295,7 @@ unsigned int TrafficGenerator::evaluateMinAddress(const DRAMSysConfiguration::Tr return 0x00; } -unsigned int TrafficGenerator::evaluateMaxAddress(const DRAMSysConfiguration::TraceGeneratorState &state) +uint64_t TrafficGenerator::evaluateMaxAddress(const DRAMSysConfiguration::TraceGeneratorState &state) { if (state.maxAddress.isValid()) return state.maxAddress.getValue(); @@ -284,7 +303,7 @@ unsigned int TrafficGenerator::evaluateMaxAddress(const DRAMSysConfiguration::Tr return Configuration::getInstance().memSpec->getSimMemSizeInBytes() - 1; } -unsigned int TrafficGenerator::evaluateAddressIncrement(const DRAMSysConfiguration::TraceGeneratorState &state) +uint64_t TrafficGenerator::evaluateAddressIncrement(const DRAMSysConfiguration::TraceGeneratorState &state) { if (state.addressIncrement.isValid()) return state.addressIncrement.getValue(); diff --git a/DRAMSys/simulator/TrafficGenerator.h b/DRAMSys/simulator/TrafficGenerator.h index b4337ad9..d2a25c90 100644 --- a/DRAMSys/simulator/TrafficGenerator.h +++ b/DRAMSys/simulator/TrafficGenerator.h @@ -68,10 +68,11 @@ public: uint64_t getTotalTransactions() const; private: - static unsigned int evaluateSeed(const DRAMSysConfiguration::TraceGenerator &conf); - static unsigned int evaluateMinAddress(const DRAMSysConfiguration::TraceGeneratorState &state); - static unsigned int evaluateMaxAddress(const DRAMSysConfiguration::TraceGeneratorState &state); - static unsigned int evaluateAddressIncrement(const DRAMSysConfiguration::TraceGeneratorState &state); + static uint64_t evaluateSeed(const DRAMSysConfiguration::TraceGenerator &conf); + static uint64_t evaluateMaxTransactions(const DRAMSysConfiguration::TraceGenerator &conf); + static uint64_t evaluateMinAddress(const DRAMSysConfiguration::TraceGeneratorState &state); + static uint64_t evaluateMaxAddress(const DRAMSysConfiguration::TraceGeneratorState &state); + static uint64_t evaluateAddressIncrement(const DRAMSysConfiguration::TraceGeneratorState &state); void prepareNextPayload() override; uint64_t getNextAddress() override; @@ -89,6 +90,8 @@ private: uint64_t currentAddress = 0x00; uint64_t transactionsSentInCurrentState = 0; + const uint64_t maxTransactions; + std::vector stateSequence; std::vector::const_iterator stateIt;