diff --git a/dram/resources/simulations/sim-batch.xml b/dram/resources/simulations/sim-batch.xml index 6956da22..7b793ec0 100644 --- a/dram/resources/simulations/sim-batch.xml +++ b/dram/resources/simulations/sim-batch.xml @@ -16,7 +16,7 @@ - mediabench-epic_32.stl + mediabench-epic_32.stl diff --git a/dram/src/controller/core/TimingCalculation.cpp b/dram/src/controller/core/TimingCalculation.cpp index b9dafb6a..407a9fbb 100644 --- a/dram/src/controller/core/TimingCalculation.cpp +++ b/dram/src/controller/core/TimingCalculation.cpp @@ -23,6 +23,11 @@ sc_time getDelayToMeetConstraint(sc_time previous, sc_time start, sc_time constr return SC_ZERO_TIME; } +const sc_time FrequencyToClk(double frequencyMhz) +{ + return sc_time(1 / frequencyMhz, SC_US); +} + const sc_time clkAlign(sc_time time, Alignment alignment) { sc_time clk = Configuration::getInstance().Timings.clk; diff --git a/dram/src/controller/core/TimingCalculation.h b/dram/src/controller/core/TimingCalculation.h index 9ba13135..9b513f69 100644 --- a/dram/src/controller/core/TimingCalculation.h +++ b/dram/src/controller/core/TimingCalculation.h @@ -26,6 +26,7 @@ sc_time getDelayToMeetConstraint(sc_time previous, sc_time start, sc_time constr enum Alignment {UP, DOWN}; const sc_time clkAlign(sc_time time, Alignment alignment = UP); bool isClkAligned(sc_time time, sc_time clk); +const sc_time FrequencyToClk(double frequencyMhz); } diff --git a/dram/src/controller/core/configuration/MemSpecLoader.cpp b/dram/src/controller/core/configuration/MemSpecLoader.cpp index 21536582..517ef18d 100644 --- a/dram/src/controller/core/configuration/MemSpecLoader.cpp +++ b/dram/src/controller/core/configuration/MemSpecLoader.cpp @@ -7,6 +7,7 @@ #include "MemSpecLoader.h" #include "TimingConfiguration.h" +#include "../TimingCalculation.h" using namespace tinyxml2; using namespace std; @@ -91,9 +92,8 @@ void MemSpecLoader::loadDDR4(Configuration& config, XMLElement* memspec) //MemTimings XMLElement* timings = memspec->FirstChildElement("memtimingspec"); double clkMhz = queryDoubleParameter(timings, "clkMhz"); - sc_time clk = sc_time(1 / clkMhz, SC_US); - config.Timings.clk = clk; - + config.Timings.clk = FrequencyToClk(clkMhz); + sc_time clk = config.Timings.clk; config.Timings.tRP = clk * queryUIntParameter(timings, "RP"); config.Timings.tRAS = clk * queryUIntParameter(timings, "RAS"); config.Timings.tRC = clk * queryUIntParameter(timings, "RC"); diff --git a/dram/src/simulation/Simulation.cpp b/dram/src/simulation/Simulation.cpp index 80af5417..8d86220b 100644 --- a/dram/src/simulation/Simulation.cpp +++ b/dram/src/simulation/Simulation.cpp @@ -83,10 +83,10 @@ void Simulation::instantiateModules(const string &pathToResources, const std::ve arbiter = new Arbiter("arbiter"); controller = new Controller<>("controller"); - player1 = new TracePlayer<>("player1", pathToResources + string("traces/") + devices[0].trace, devices[0].burstLength, this); - player2 = new TracePlayer<>("player2", pathToResources + string("traces/") + devices[1].trace, devices[1].burstLength, this); - player3 = new TracePlayer<>("player3", pathToResources + string("traces/") + devices[2].trace, devices[2].burstLength, this); - player4 = new TracePlayer<>("player4", pathToResources + string("traces/") + devices[3].trace, devices[3].burstLength, this); + player1 = new TracePlayer<>("player1", pathToResources + string("traces/") + devices[0].trace, devices[0].burstLength, devices[0].clk, this); + player2 = new TracePlayer<>("player2", pathToResources + string("traces/") + devices[1].trace, devices[1].burstLength, devices[1].clk, this); + player3 = new TracePlayer<>("player3", pathToResources + string("traces/") + devices[2].trace, devices[2].burstLength, devices[2].clk, this); + player4 = new TracePlayer<>("player4", pathToResources + string("traces/") + devices[3].trace, devices[3].burstLength, devices[3].clk, this); } void Simulation::bindSockets() diff --git a/dram/src/simulation/Simulation.h b/dram/src/simulation/Simulation.h index 463911e9..c5ca2af2 100644 --- a/dram/src/simulation/Simulation.h +++ b/dram/src/simulation/Simulation.h @@ -30,10 +30,11 @@ struct DramSetup struct Device { Device():trace("empty.stl"), burstLength(0){} - Device(std::string trace, unsigned int burstLength = 8) : trace(trace), burstLength(burstLength) + Device(std::string trace, sc_time clk, unsigned int burstLength = 8) : trace(trace), clk (clk), burstLength(burstLength) { } std::string trace; + sc_time clk; unsigned int burstLength; }; diff --git a/dram/src/simulation/SimulationManager.cpp b/dram/src/simulation/SimulationManager.cpp index fdc9fc4b..e53f8dcc 100644 --- a/dram/src/simulation/SimulationManager.cpp +++ b/dram/src/simulation/SimulationManager.cpp @@ -149,7 +149,7 @@ void SimulationManager::addTraceSetup(SimulationBatch& batch, tinyxml2::XMLEleme vector devices; for (XMLElement* device = element->FirstChildElement("device"); device != NULL; device = device->NextSiblingElement("device")) { - devices.push_back(Device(device->GetText(), device->IntAttribute("bl"))); + devices.push_back(Device(device->GetText(), FrequencyToClk(device->DoubleAttribute("clkMhz")), device->IntAttribute("bl"))); } while (devices.size() < Simulation::NumberOfTracePlayers) { diff --git a/dram/src/simulation/TracePlayer.h b/dram/src/simulation/TracePlayer.h index 1c76277a..8aa2028b 100644 --- a/dram/src/simulation/TracePlayer.h +++ b/dram/src/simulation/TracePlayer.h @@ -31,7 +31,7 @@ struct TracePlayer: public sc_module { public: tlm_utils::simple_initiator_socket iSocket; - TracePlayer(sc_module_name /*name*/, string pathToTrace, unsigned int burstLength, + TracePlayer(sc_module_name /*name*/, string pathToTrace, unsigned int burstLength, sc_time clk, simulation::ISimulation* simulationManager); void start(); @@ -46,6 +46,7 @@ private: MemoryManager memoryManager; ifstream file; unsigned int burstlenght; + sc_time clk; unsigned int numberOfPendingTransactions; unsigned int transactionsSent; unsigned int transactionsReceived; @@ -54,8 +55,8 @@ private: template -TracePlayer::TracePlayer(sc_module_name, string pathToTrace, unsigned int burstLength, simulation::ISimulation *simulationManager) : - payloadEventQueue(this, &TracePlayer::peqCallback), file(pathToTrace), burstlenght(burstLength), +TracePlayer::TracePlayer(sc_module_name, string pathToTrace, unsigned int burstLength, sc_time clk, simulation::ISimulation *simulationManager) : + payloadEventQueue(this, &TracePlayer::peqCallback), file(pathToTrace), burstlenght(burstLength), clk(clk), numberOfPendingTransactions(0), transactionsSent(0), transactionsReceived(0), simulationManager(simulationManager) { if (!file.is_open()) @@ -112,7 +113,7 @@ void TracePlayer::generateNextPayload() payload->set_byte_enable_length(0); payload->set_streaming_width(burstlenght); - sc_time sendingTime = sc_time(std::stoi(time.c_str()), SC_NS); + sc_time sendingTime = std::stoi(time.c_str())*clk; GenerationExtension* genExtension = new GenerationExtension(sendingTime); payload->set_auto_extension(genExtension);