Issue #76 fixed and some improvements

This commit is contained in:
sprado
2016-05-19 15:28:27 +02:00
parent fb5a49224a
commit 1bbce84a5f
5 changed files with 81 additions and 34 deletions

View File

@@ -117,10 +117,12 @@ def power_window(connection, tracePath):
cursor.execute(""" SELECT * FROM Power """)
time = [0] * (steps+1)
power = [0] * (steps+1)
for i in range((steps+1)):
time[0] = 0
power[0] = 0
for i in range((steps)):
result = cursor.fetchone()
time[i] = float(result[0])*1000000000
power[i] = float(result[1])/1000000000
time[i+1] = float(result[0])*1000000000
power[i+1] = float(result[1])/1000000000
name = ntpath.basename(tracePath)
basename, extension = os.path.splitext(name)

View File

@@ -139,11 +139,13 @@ void ControllerCore::triggerRefresh(tlm::tlm_generic_payload& payload)
void ControllerCore::scheduleRequest(Command command, tlm::tlm_generic_payload &payload)
{
sc_time start = clkAlign(sc_time_stamp());
state->cleanUp(start);
ScheduledCommand scheduledCommand = schedule(command, start, payload);
state->change(scheduledCommand);
controller.send(scheduledCommand, payload);
if(!(command == Command::Precharge && refreshManager->hasCollision(scheduledCommand)))
{
state->cleanUp(start);
state->change(scheduledCommand);
controller.send(scheduledCommand, payload);
}
}
ScheduledCommand ControllerCore::schedule(Command command, sc_time start,

View File

@@ -58,7 +58,7 @@ RefreshManager::~RefreshManager()
bool RefreshManager::hasCollision(const ScheduledCommand& command)
{
return command.getStart() < controllerCore.state->getLastCommand(Command::AutoRefresh).getEnd() || command.getEnd() > nextPlannedRefresh;
return command.getStart() < controllerCore.state->getLastCommand(Command::AutoRefresh).getEnd() || command.getEnd() >= nextPlannedRefresh;
}
void RefreshManager::scheduleRefresh(tlm::tlm_generic_payload& payload __attribute__((unused)), sc_time time)

View File

@@ -37,45 +37,87 @@
#include "RefreshChecker.h"
#include "../../TimingCalculation.h"
void RefreshChecker::delayToSatisfyConstraints(ScheduledCommand& command) const
{
sc_assert(command.getCommand() == Command::AutoRefresh);
ScheduledCommand lastCommandOnBank = state.getLastScheduledCommand(command.getBank());
if (lastCommandOnBank.isValidCommand())
if(config.BankwiseLogic)
{
if (lastCommandOnBank.getCommand() == Command::Precharge || lastCommandOnBank.getCommand() == Command::PrechargeAll)
ScheduledCommand lastCommandOnBank = state.getLastScheduledCommand(command.getBank());
if (lastCommandOnBank.isValidCommand())
{
command.establishMinDistanceFromStart(lastCommandOnBank.getStart(), config.memSpec.tRP);
if (lastCommandOnBank.getCommand() == Command::Precharge || lastCommandOnBank.getCommand() == Command::PrechargeAll)
{
command.establishMinDistanceFromStart(lastCommandOnBank.getStart(), config.memSpec.tRP);
}
else if (lastCommandOnBank.getCommand() == Command::ReadA)
{
command.establishMinDistanceFromStart(lastCommandOnBank.getStart(), config.memSpec.tRTP + config.memSpec.tRP);
}
else if (lastCommandOnBank.getCommand() == Command::WriteA)
{
command.establishMinDistanceFromStart(lastCommandOnBank.getStart(),
config.memSpec.tWL + getWriteAccessTime() + config.memSpec.tWR + config.memSpec.tRP);
}
else if (lastCommandOnBank.getCommand() == Command::PDNPX || lastCommandOnBank.getCommand() == Command::PDNAX)
{
command.establishMinDistanceFromStart(lastCommandOnBank.getStart(), config.memSpec.tXP);
}
else if (lastCommandOnBank.getCommand() == Command::SREFX)
{
command.establishMinDistanceFromStart(lastCommandOnBank.getStart(), config.memSpec.tXSR);
}
else if (lastCommandOnBank.getCommand() == Command::AutoRefresh)
{
}
else
reportFatal("Refresh Checker", "Refresh can not follow " + commandToString(lastCommandOnBank.getCommand()));
}
else if (lastCommandOnBank.getCommand() == Command::ReadA)
}
else
{
for (unsigned int bank = 0; bank < config.memSpec.NumberOfBanks; ++bank)
{
command.establishMinDistanceFromStart(lastCommandOnBank.getStart(), config.memSpec.tRTP + config.memSpec.tRP);
}
else if (lastCommandOnBank.getCommand() == Command::WriteA)
{
command.establishMinDistanceFromStart(lastCommandOnBank.getStart(),
config.memSpec.tWL + getWriteAccessTime() + config.memSpec.tWR + config.memSpec.tRP);
}
else if (lastCommandOnBank.getCommand() == Command::PDNPX || lastCommandOnBank.getCommand() == Command::PDNAX)
{
command.establishMinDistanceFromStart(lastCommandOnBank.getStart(), config.memSpec.tXP);
}
else if (lastCommandOnBank.getCommand() == Command::SREFX)
ScheduledCommand lastCommand = state.getLastScheduledCommand(Bank(bank));
if (lastCommand.isValidCommand())
{
if(lastCommand.getCommand() == Command::Precharge || lastCommand.getCommand() == Command::PrechargeAll)
{
command.establishMinDistanceFromStart(lastCommandOnBank.getStart(), config.memSpec.tXSR);
command.establishMinDistanceFromStart(lastCommand.getStart(), config.memSpec.tRP);
}
else if (lastCommandOnBank.getCommand() == Command::AutoRefresh)
{
else if(lastCommand.getCommand() == Command::Activate)
{
command.establishMinDistanceFromStart(lastCommand.getStart(), config.memSpec.tRCD);
}
else if (lastCommand.getCommand() == Command::ReadA)
{
command.establishMinDistanceFromStart(lastCommand.getStart(), config.memSpec.tRTP + config.memSpec.tRP);
}
else if(lastCommand.getCommand() == Command::WriteA)
{
command.establishMinDistanceFromStart(lastCommand.getStart(), config.memSpec.tWL + getWriteAccessTime() + config.memSpec.tWR + config.memSpec.tRP);
}
else if (lastCommand.getCommand() == Command::PDNAX || lastCommand.getCommand() == Command::PDNPX)
{
command.establishMinDistanceFromStart(lastCommand.getStart(), config.memSpec.tXP);
}
else if (lastCommand.getCommand() == Command::SREFX)
{
command.establishMinDistanceFromStart(lastCommand.getEnd(), config.memSpec.tXSR);
}
else if (lastCommand.getCommand() == Command::AutoRefresh)
{
}
else
reportFatal("Refresh Checker", "Refresh can not follow " + commandToString(lastCommand.getCommand()));
}
}
else
reportFatal("Refresh Checker", "Refresh can not follow " + commandToString(lastCommandOnBank.getCommand()));
}
state.bus.moveCommandToNextFreeSlot(command);
}

View File

@@ -222,6 +222,8 @@ struct Dram : sc_module
unsigned long long c = 0;
do {
wait(powerWindowSize);
c = sc_time_stamp().value() / Configuration::getInstance().memSpec.clk.value();
DRAMPower->doCommand(MemCommand::NOP, 0, c);
@@ -243,7 +245,6 @@ struct Dram : sc_module
printDebugMessage(string("\tCurrent Energy: \t") + to_string(currentTotalEnergy) + string("\t[pJ]"));
printDebugMessage(string("\tAverage Power: \t") + to_string(currentAveragePower) + string("\t[pW]"));
wait(powerWindowSize);
} while(true);
}