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);