From e1e2e9c0f9ebc08430fc49cef8d91a70802b9723 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Mon, 3 Jan 2022 15:20:03 +0100 Subject: [PATCH] Add clksPerRequest field to state definition --- .../library/src/common/configuration/TraceSetup.cpp | 5 +++++ .../library/src/common/configuration/TraceSetup.h | 1 + DRAMSys/simulator/TrafficGenerator.cpp | 12 +++++++++++- DRAMSys/simulator/TrafficGenerator.h | 4 ++++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/DRAMSys/library/src/common/configuration/TraceSetup.cpp b/DRAMSys/library/src/common/configuration/TraceSetup.cpp index 0963db41..e6bc15d4 100644 --- a/DRAMSys/library/src/common/configuration/TraceSetup.cpp +++ b/DRAMSys/library/src/common/configuration/TraceSetup.cpp @@ -72,6 +72,7 @@ void to_json(json &j, const TraceSetup &c) initiator_j["addressIncrement"] = state.addressIncrement; initiator_j["minAddress"] = state.minAddress; initiator_j["maxAddress"] = state.maxAddress; + initiator_j["clksPerRequest"] = state.clksPerRequest; } else { @@ -87,6 +88,7 @@ void to_json(json &j, const TraceSetup &c) state_j["addressIncrement"] = state.second.addressIncrement; state_j["minAddress"] = state.second.minAddress; state_j["maxAddress"] = state.second.maxAddress; + state_j["clksPerRequest"] = state.second.clksPerRequest; remove_null_values(state_j); states_j.insert(states_j.end(), state_j); } @@ -155,6 +157,9 @@ void from_json(const json &j, TraceSetup &c) if (state_j.contains("maxAddress")) state_j.at("maxAddress").get_to(state.maxAddress); + if (state_j.contains("clksPerRequest")) + state_j.at("clksPerRequest").get_to(state.clksPerRequest); + // Default to 0 unsigned int id = 0; diff --git a/DRAMSys/library/src/common/configuration/TraceSetup.h b/DRAMSys/library/src/common/configuration/TraceSetup.h index bb861571..4340805d 100644 --- a/DRAMSys/library/src/common/configuration/TraceSetup.h +++ b/DRAMSys/library/src/common/configuration/TraceSetup.h @@ -91,6 +91,7 @@ struct TraceGeneratorState Optional addressIncrement; Optional minAddress; Optional maxAddress; + Optional clksPerRequest; }; struct TraceGeneratorStateTransition diff --git a/DRAMSys/simulator/TrafficGenerator.cpp b/DRAMSys/simulator/TrafficGenerator.cpp index e6ea1cf8..cf609702 100644 --- a/DRAMSys/simulator/TrafficGenerator.cpp +++ b/DRAMSys/simulator/TrafficGenerator.cpp @@ -84,7 +84,7 @@ void TrafficGeneratorIf::sendNextPayload() if (transactionsSent == 0) sendingOffset = SC_ZERO_TIME; else - sendingOffset = generatorClk - (sc_time_stamp() % generatorClk); + sendingOffset = (generatorClk * clksPerRequest()) - (sc_time_stamp() % generatorClk); // TODO: do not send two requests in the same cycle sendToTarget(*payload, tlm::BEGIN_REQ, sendingOffset); @@ -123,6 +123,7 @@ TrafficGenerator::TrafficGenerator(const sc_module_name &name, const DRAMSysConf uint64_t minAddress = evaluateMinAddress(conf.states.at(currentState)); uint64_t maxAddress = evaluateMaxAddress(conf.states.at(currentState)); randomAddressDistribution = std::uniform_int_distribution(minAddress, maxAddress); + currentClksPerRequest = evaluateClksPerRequest(conf.states.at(currentState)); calculateTransitions(); } @@ -212,6 +213,7 @@ void TrafficGenerator::transitionToNextState() uint64_t minAddress = evaluateMinAddress(conf.states.at(currentState)); uint64_t maxAddress = evaluateMaxAddress(conf.states.at(currentState)); randomAddressDistribution = std::uniform_int_distribution (minAddress, maxAddress); + currentClksPerRequest = evaluateClksPerRequest(conf.states.at(currentState)); currentAddress = 0x00; transactionsSentInCurrentState = 0; @@ -311,6 +313,14 @@ uint64_t TrafficGenerator::evaluateAddressIncrement(const DRAMSysConfiguration:: return 0x00; } +uint64_t TrafficGenerator::evaluateClksPerRequest(const DRAMSysConfiguration::TraceGeneratorState &state) +{ + if (state.clksPerRequest.isValid()) + return state.clksPerRequest.getValue(); + else + return 1; +} + TrafficGeneratorHammer::TrafficGeneratorHammer(const sc_core::sc_module_name &name, const DRAMSysConfiguration::TraceHammer &conf, TraceSetup *setup) : TrafficGeneratorIf(name, setup, 1, 1), generatorClk(evaluateGeneratorClk(conf)), rowIncrement(conf.rowIncrement), diff --git a/DRAMSys/simulator/TrafficGenerator.h b/DRAMSys/simulator/TrafficGenerator.h index d2a25c90..a258b6e2 100644 --- a/DRAMSys/simulator/TrafficGenerator.h +++ b/DRAMSys/simulator/TrafficGenerator.h @@ -57,6 +57,7 @@ private: virtual tlm::tlm_command getNextCommand() = 0; virtual sc_core::sc_time getGeneratorClk() = 0; virtual void payloadSent(){}; + virtual uint64_t clksPerRequest() { return 1; } }; class TrafficGenerator : public TrafficGeneratorIf @@ -73,12 +74,14 @@ private: static uint64_t evaluateMinAddress(const DRAMSysConfiguration::TraceGeneratorState &state); static uint64_t evaluateMaxAddress(const DRAMSysConfiguration::TraceGeneratorState &state); static uint64_t evaluateAddressIncrement(const DRAMSysConfiguration::TraceGeneratorState &state); + static uint64_t evaluateClksPerRequest(const DRAMSysConfiguration::TraceGeneratorState &state); void prepareNextPayload() override; uint64_t getNextAddress() override; tlm::tlm_command getNextCommand() override; sc_core::sc_time getGeneratorClk() override; void payloadSent() override; + uint64_t clksPerRequest() override { return currentClksPerRequest; }; void calculateTransitions(); void transitionToNextState(); @@ -88,6 +91,7 @@ private: const DRAMSysConfiguration::TraceGenerator &conf; unsigned int currentState = 0; uint64_t currentAddress = 0x00; + uint64_t currentClksPerRequest = 1; uint64_t transactionsSentInCurrentState = 0; const uint64_t maxTransactions;