ARM - DRAMSys Patch

This commit is contained in:
Felipe Salerno Prado
2016-05-09 15:24:27 +02:00
parent a88d17976a
commit d359ed6ac3

View File

@@ -89,7 +89,7 @@ struct Dram : sc_module
if(powerAnalysis == true)
{
sc_time clk = Configuration::getInstance().memSpec.clk;
MemArchitectureSpec memArchSpec;
memArchSpec.burstLength = Configuration::getInstance().memSpec.BurstLength;
memArchSpec.dataRate = Configuration::getInstance().memSpec.DataRate;
@@ -162,7 +162,7 @@ struct Dram : sc_module
memPowerSpec.vdd2 = Configuration::getInstance().memSpec.vDD2;
MemorySpecification memSpec;
memSpec.memTimingSpec = memTimingSpec;
memSpec.memTimingSpec = memTimingSpec;
memSpec.memPowerSpec = memPowerSpec;
memSpec.memArchSpec = memArchSpec;
@@ -192,58 +192,59 @@ struct Dram : sc_module
~Dram()
{
if(powerAnalysis == true)
{
if (powerAnalysis == true) {
// Obtain the residual energy which was not covered by previous windows
DRAMPower->updateCounters(true);
DRAMPower->calcEnergy();
// Calculate the residual power and energy which was not covered by previous windows...
printDebugMessage(string("\tCurrent Energy: \t") + to_string(DRAMPower->getEnergy().total_energy - totalEnergy));
printDebugMessage(string("\tAverage Power: \t") + to_string((DRAMPower->getEnergy().total_energy - totalEnergy)/powerWindowSize.value()));
double energy = sumOfEnergyWindows + DRAMPower->getEnergy().total_energy;
double averagePower = energy / sc_time_stamp().to_seconds();
double currentTotalEnergy = DRAMPower->getEnergy().total_energy - totalEnergy;
double currentAveragePower = currentTotalEnergy/powerWindowSize.value();
sumOfEnergyWindows += currentTotalEnergy;
tlmRecorder->recordPower(sc_time_stamp().to_seconds(),currentAveragePower);
totalEnergy = DRAMPower->getEnergy().total_energy;
tlmRecorder->recordPower(sc_time_stamp().to_seconds(), averagePower);
// Make sure that the summed energy of the windows is the same as the final value provided by DRAMPower:
assert(sumOfEnergyWindows == totalEnergy);
// Print Final Total Power Values:
cout << name() << string("\tTotal Energy: \t") + to_string(totalEnergy) << endl;
cout << name() << string("\tAverage Power: \t") + to_string(DRAMPower->getPower().average_power) << endl;
// Print Final Total Power Values
cout << name() << string("\tTotal Energy: \t") + to_string(energy) + string("\t[pJ]") << endl;
cout << name() << string("\tAverage Power: \t") + to_string(averagePower) + string("\t[pW]") << endl;
}
// Clean up:
for (auto e : ememory) {
delete e;
}
//std::cout << "Simulated Memory Size: " << memory.size() << endl; // TODO Aufrauemen
}
// This Thread is only triggered when Power Simulation is enabled.
// It estimates the current average power which will be stored in the trace database for visualization purposes.
void powerWindow()
{
double currentAveragePower = 0;
double currentTotalEnergy = 0;
unsigned long long c = 0;
do {
c = sc_time_stamp().value() / Configuration::getInstance().memSpec.clk.value();
DRAMPower->doCommand(MemCommand::NOP, 0, c);
DRAMPower->updateCounters(false);
DRAMPower->calcEnergy();
currentTotalEnergy = DRAMPower->getEnergy().total_energy - totalEnergy;
currentAveragePower = currentTotalEnergy/powerWindowSize.value();
tlmRecorder->recordPower(sc_time_stamp().to_seconds(),currentAveragePower);
totalEnergy = DRAMPower->getEnergy().total_energy;
currentTotalEnergy = DRAMPower->getEnergy().total_energy;
//assert(currentTotalEnergy != 0);
DRAMPower->clearCounters(c);
sumOfEnergyWindows += currentTotalEnergy;
// [pW] = [pJ] / [s] (here considering that DRAMPower provides the value always in pJ)
currentAveragePower = currentTotalEnergy / powerWindowSize.to_seconds();
tlmRecorder->recordPower(sc_time_stamp().to_seconds(), currentAveragePower);
printDebugMessage(string("\tCurrent Energy: \t") + to_string(currentTotalEnergy) + string("\t[pJ]"));
printDebugMessage(string("\tAverage Power: \t") + to_string(currentAveragePower) + string("\t[pW]"));
printDebugMessage(string("\tCurrent Energy: \t") + to_string(currentTotalEnergy));
printDebugMessage(string("\tAverage Power: \t") + to_string(currentAveragePower));
wait(powerWindowSize);
}
while(true);
} while(true);
}
virtual tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload& payload, tlm::tlm_phase& phase, sc_time& delay)
@@ -508,7 +509,7 @@ struct Dram : sc_module
void setTlmRecorder(TlmRecorder *rec)
{
tlmRecorder = rec;
tlmRecorder = rec;
}
};