diff --git a/DRAMSys/simulator/src/simulation/Dram.h b/DRAMSys/simulator/src/simulation/Dram.h index 98376ab8..4d1ac62d 100644 --- a/DRAMSys/simulator/src/simulation/Dram.h +++ b/DRAMSys/simulator/src/simulation/Dram.h @@ -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; } };