diff --git a/src/simulator/simulator/SimpleInitiator.h b/src/simulator/simulator/SimpleInitiator.h index 410588d4..8c134b1a 100644 --- a/src/simulator/simulator/SimpleInitiator.h +++ b/src/simulator/simulator/SimpleInitiator.h @@ -43,7 +43,7 @@ template class SimpleInitiator : public Initiator public: SimpleInitiator(sc_core::sc_module_name const& name, MemoryManager& memoryManager, - unsigned int clkMhz, + sc_core::sc_time interfaceClk, std::optional maxPendingReadRequests, std::optional maxPendingWriteRequests, std::function transactionFinished, @@ -53,7 +53,7 @@ public: issuer( name, memoryManager, - clkMhz, + interfaceClk, maxPendingReadRequests, maxPendingWriteRequests, [this] { return this->producer.nextRequest(); }, diff --git a/src/simulator/simulator/Simulator.cpp b/src/simulator/simulator/Simulator.cpp index 24443a64..09b87ff0 100644 --- a/src/simulator/simulator/Simulator.cpp +++ b/src/simulator/simulator/Simulator.cpp @@ -84,6 +84,7 @@ std::unique_ptr Simulator::instantiateInitiator(const DRAMSys::Config::Initiator& initiator) { uint64_t memorySize = dramSys->getMemSpec().getSimMemSizeInBytes(); + sc_core::sc_time interfaceClk = dramSys->getMemSpec().tCK; unsigned int defaultDataLength = dramSys->getMemSpec().defaultBytesPerBurst; return std::visit( @@ -94,9 +95,10 @@ Simulator::instantiateInitiator(const DRAMSys::Config::Initiator& initiator) std::is_same_v) { return std::make_unique(config, - memoryManager, + interfaceClk, memorySize, defaultDataLength, + memoryManager, finishTransaction, terminateInitiator); } @@ -126,7 +128,7 @@ Simulator::instantiateInitiator(const DRAMSys::Config::Initiator& initiator) return std::make_unique>(config.name.c_str(), memoryManager, - config.clkMhz, + interfaceClk, std::nullopt, std::nullopt, finishTransaction, @@ -139,7 +141,7 @@ Simulator::instantiateInitiator(const DRAMSys::Config::Initiator& initiator) return std::make_unique>(config.name.c_str(), memoryManager, - config.clkMhz, + interfaceClk, 1, 1, finishTransaction, diff --git a/src/simulator/simulator/generator/TrafficGenerator.cpp b/src/simulator/simulator/generator/TrafficGenerator.cpp index b3318040..d4928a23 100644 --- a/src/simulator/simulator/generator/TrafficGenerator.cpp +++ b/src/simulator/simulator/generator/TrafficGenerator.cpp @@ -35,10 +35,14 @@ #include "TrafficGenerator.h" +#include "RandomProducer.h" +#include "SequentialProducer.h" + TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGeneratorStateMachine const& config, - MemoryManager& memoryManager, + sc_core::sc_time interfaceClk, uint64_t memorySize, unsigned int defaultDataLength, + MemoryManager& memoryManager, std::function transactionFinished, std::function terminateInitiator) : stateTransistions(config.transitions), @@ -46,7 +50,7 @@ TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGeneratorStateMachine issuer( config.name.c_str(), memoryManager, - config.clkMhz, + interfaceClk, config.maxPendingReadRequests, config.maxPendingWriteRequests, [this] { return nextRequest(); }, @@ -107,16 +111,17 @@ TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGeneratorStateMachine } TrafficGenerator::TrafficGenerator(DRAMSys::Config::TrafficGenerator const& config, - MemoryManager& memoryManager, + sc_core::sc_time interfaceClk, uint64_t memorySize, unsigned int defaultDataLength, + MemoryManager& memoryManager, std::function transactionFinished, std::function terminateInitiator) : generatorPeriod(sc_core::sc_time(1.0 / static_cast(config.clkMhz), sc_core::SC_US)), issuer( config.name.c_str(), memoryManager, - config.clkMhz, + interfaceClk, config.maxPendingReadRequests, config.maxPendingWriteRequests, [this] { return nextRequest(); }, diff --git a/src/simulator/simulator/generator/TrafficGenerator.h b/src/simulator/simulator/generator/TrafficGenerator.h index 8892494c..335abc2d 100644 --- a/src/simulator/simulator/generator/TrafficGenerator.h +++ b/src/simulator/simulator/generator/TrafficGenerator.h @@ -35,28 +35,31 @@ #pragma once -#include "RandomProducer.h" -#include "SequentialProducer.h" #include "simulator/Initiator.h" #include "simulator/MemoryManager.h" #include "simulator/request/RequestIssuer.h" #include +#include + +class RequestProducer; class TrafficGenerator : public Initiator { public: TrafficGenerator(DRAMSys::Config::TrafficGenerator const& config, - MemoryManager& memoryManager, + sc_core::sc_time interfaceClk, uint64_t memorySize, unsigned int defaultDataLength, + MemoryManager& memoryManager, std::function transactionFinished, std::function terminateInitiator); TrafficGenerator(DRAMSys::Config::TrafficGeneratorStateMachine const& config, - MemoryManager& memoryManager, + sc_core::sc_time interfaceClk, uint64_t memorySize, unsigned int defaultDataLength, + MemoryManager& memoryManager, std::function transactionFinished, std::function terminateInitiator); diff --git a/src/simulator/simulator/request/RequestIssuer.cpp b/src/simulator/simulator/request/RequestIssuer.cpp index a91f138e..d1d46f45 100644 --- a/src/simulator/simulator/request/RequestIssuer.cpp +++ b/src/simulator/simulator/request/RequestIssuer.cpp @@ -37,7 +37,7 @@ RequestIssuer::RequestIssuer(sc_core::sc_module_name const& name, MemoryManager& memoryManager, - unsigned int clkMhz, + sc_core::sc_time interfaceClk, std::optional maxPendingReadRequests, std::optional maxPendingWriteRequests, std::function nextRequest, @@ -46,7 +46,7 @@ RequestIssuer::RequestIssuer(sc_core::sc_module_name const& name, sc_module(name), payloadEventQueue(this, &RequestIssuer::peqCallback), memoryManager(memoryManager), - clkPeriod(sc_core::sc_time(1.0 / static_cast(clkMhz), sc_core::SC_US)), + interfaceClk(interfaceClk), maxPendingReadRequests(maxPendingReadRequests), maxPendingWriteRequests(maxPendingWriteRequests), transactionFinished(std::move(transactionFinished)), @@ -85,13 +85,6 @@ void RequestIssuer::sendNextRequest() sc_core::sc_time sendingTime = sc_core::sc_time_stamp() + delay; - bool needsOffset = (sendingTime % clkPeriod) != sc_core::SC_ZERO_TIME; - if (needsOffset) - { - sendingTime += clkPeriod; - sendingTime -= sendingTime % clkPeriod; - } - delay = sendingTime - sc_core::sc_time_stamp(); iSocket->nb_transport_fw(payload, phase, delay); @@ -131,7 +124,7 @@ void RequestIssuer::peqCallback(tlm::tlm_generic_payload& payload, const tlm::tl else if (phase == tlm::BEGIN_RESP) { tlm::tlm_phase nextPhase = tlm::END_RESP; - sc_core::sc_time delay = clkPeriod; + sc_core::sc_time delay = interfaceClk; iSocket->nb_transport_fw(payload, nextPhase, delay); payload.release(); diff --git a/src/simulator/simulator/request/RequestIssuer.h b/src/simulator/simulator/request/RequestIssuer.h index 2d21c38b..1c86b70d 100644 --- a/src/simulator/simulator/request/RequestIssuer.h +++ b/src/simulator/simulator/request/RequestIssuer.h @@ -52,7 +52,7 @@ public: RequestIssuer(sc_core::sc_module_name const& name, MemoryManager& memoryManager, - unsigned int clkMhz, + sc_core::sc_time interfaceClk, std::optional maxPendingReadRequests, std::optional maxPendingWriteRequests, std::function nextRequest, @@ -64,7 +64,7 @@ private: tlm_utils::peq_with_cb_and_phase payloadEventQueue; MemoryManager& memoryManager; - const sc_core::sc_time clkPeriod; + sc_core::sc_time interfaceClk; bool transactionPostponed = false; bool finished = false; @@ -75,8 +75,8 @@ private: unsigned int pendingReadRequests = 0; unsigned int pendingWriteRequests = 0; - const std::optional maxPendingReadRequests; - const std::optional maxPendingWriteRequests; + std::optional maxPendingReadRequests; + std::optional maxPendingWriteRequests; std::function transactionFinished; std::function terminate;