added refresh checker

This commit is contained in:
Janik Schlemminger
2014-04-11 16:05:35 +02:00
parent 82395b21bf
commit 646f68aa4b
17 changed files with 207 additions and 111 deletions

View File

@@ -97,24 +97,24 @@
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
<storageModule moduleId="refreshScope" versionNumber="2">
<configuration configurationName="unit_test"/>
<configuration configurationName="Release">
<resource resourceType="PROJECT" workspacePath="/DRAM-Model"/>
</configuration>
<configuration configurationName="unit_test"/>
<configuration configurationName="platformArchitect">
<resource resourceType="PROJECT" workspacePath="/DRAM"/>
</configuration>
<configuration configurationName="build-simulation"/>
<configuration configurationName="testing"/>
<configuration configurationName="simulation-build">
<resource resourceType="PROJECT" workspacePath="/dram"/>
</configuration>
<configuration configurationName="Debug">
<resource resourceType="PROJECT" workspacePath="/DRAM-Model"/>
</configuration>
<configuration configurationName="simulation-build">
<resource resourceType="PROJECT" workspacePath="/dram"/>
</configuration>
<configuration configurationName="standalone"/>
<configuration configurationName="simulation"/>
<configuration configurationName="build-testing"/>
<configuration configurationName="simulation"/>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings">
<doc-comment-owner id="org.eclipse.cdt.internal.ui.text.doctools.NullDocCommentOwner">
@@ -166,4 +166,4 @@
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
</scannerConfigBuildInfo>
</storageModule>
</cproject>
</cproject>

View File

@@ -4,7 +4,7 @@
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-60060699001507781" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} -E -P -v -dD &quot;${INPUTS}&quot; -std=c++11">
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-2055719358" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} -E -P -v -dD &quot;${INPUTS}&quot; -std=c++11">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>

View File

@@ -166,7 +166,7 @@ org.eclipse.cdt.core.formatter.keep_else_statement_on_same_line=false
org.eclipse.cdt.core.formatter.keep_empty_array_initializer_on_one_line=false
org.eclipse.cdt.core.formatter.keep_imple_if_on_one_line=false
org.eclipse.cdt.core.formatter.keep_then_statement_on_same_line=false
org.eclipse.cdt.core.formatter.lineSplit=100
org.eclipse.cdt.core.formatter.lineSplit=130
org.eclipse.cdt.core.formatter.number_of_empty_lines_to_preserve=1
org.eclipse.cdt.core.formatter.put_empty_statement_on_new_line=true
org.eclipse.cdt.core.formatter.tabulation.char=tab

View File

@@ -25,14 +25,11 @@ void PowerDownManager::sleep(Bank bank, sc_time time)
assert(canSleep(bank));
PowerDownState state = getPowerDownState(bank);
sc_time minTime = controller.config.Timings.tCKE;
if (state == PowerDownState::Awake) //coming from active
{
if (controller.state.bankStates.rowBufferIsOpen(bank))
setState(PowerDownState::PDNActive, bank);
else
setState(PowerDownState::PDNPrecharge, bank);
sendPowerDownPayload(time, bank, getSleepCommand(getPowerDownState(bank)));
state = controller.state.bankStates.rowBufferIsOpen(bank) ? PowerDownState::PDNActive : PowerDownState::PDNPrecharge;
}
else if (state == PowerDownState::AwakeForRefresh) //coming from refresh interrupting power down
{
@@ -40,12 +37,24 @@ void PowerDownManager::sleep(Bank bank, sc_time time)
if (controller.state.getLastCommand(Command::PDNA, bank).getStart()
> controller.state.getLastCommand(Command::PDNP, bank).getStart())
setState(PowerDownState::PDNPrecharge, bank);
state = PowerDownState::PDNPrecharge;
else
setState(PowerDownState::PDNSelfRefresh, bank);
sendPowerDownPayload(time, bank, getSleepCommand(getPowerDownState(bank)));
{
state = PowerDownState::PDNSelfRefresh;
minTime = controller.config.Timings.tCKESR;
}
}
ScheduledCommand pdn(getSleepCommand(state), time, minTime, DramExtension::getExtension(getPayload(bank)));
//check if pdna or pdnp tcke collides with next refresh
if (state != PowerDownState::PDNSelfRefresh && controller.refreshManager->hasCollision(pdn))
{
return;
}
setState(state, bank);
sendPowerDownPayload(pdn);
}
void PowerDownManager::wakeUp(Bank bank, sc_time time)
@@ -57,33 +66,34 @@ void PowerDownManager::wakeUp(Bank bank, sc_time time)
}
else if (isInPowerDown(bank))
{
time = clkAlign(time);
//Request wakes up power down
sc_time delay(SC_ZERO_TIME);
sc_time start(SC_ZERO_TIME);
switch (getPowerDownState(bank))
{
case PowerDownState::PDNActive:
start = max(time, controller.state.getLastCommand(Command::PDNA).getEnd());
break;
case PowerDownState::PDNPrecharge:
start = max(time, controller.state.getLastCommand(Command::PDNP).getEnd());
break;
case PowerDownState::PDNSelfRefresh:
delay = getDelayToMeetConstraint(
controller.state.getLastCommand(Command::SREF).getStart(), time,
controller.config.Timings.tCKESR);
start = max(time, controller.state.getLastCommand(Command::SREF).getEnd());
controller.refreshManager->reInitialize(bank, start + controller.config.Timings.clk);
break;
default:
break;
}
if (delay == SC_ZERO_TIME)
{
sendPowerDownPayload(time, bank, getWakeUpCommand(getPowerDownState(bank)));
setState(PowerDownState::Awake, bank);
}
else
{
tlm_generic_payload& p = getPayload(bank);
controller.wrapper.send(WakeUpTrigger, time + delay, p);
}
ScheduledCommand pdn(getWakeUpCommand(getPowerDownState(bank)), start, controller.config.Timings.clk,
DramExtension::getExtension(getPayload(bank)));
setState(PowerDownState::Awake, bank);
sendPowerDownPayload(pdn);
}
}
@@ -91,8 +101,10 @@ void PowerDownManager::wakeUpForRefresh(Bank bank, sc_time time)
{
if (isInPowerDown(bank))
{
sendPowerDownPayload(time, bank, getWakeUpCommand(getPowerDownState(bank)));
ScheduledCommand pdn(getWakeUpCommand(getPowerDownState(bank)), time, controller.config.Timings.clk,
DramExtension::getExtension(getPayload(bank)));
setState(PowerDownState::AwakeForRefresh, bank);
sendPowerDownPayload(pdn);
}
}
@@ -106,8 +118,8 @@ void PowerDownManager::wakeUpAllForRefresh(sc_time time)
bool PowerDownManager::isInPowerDown(Bank bank)
{
return isIn(getPowerDownState(bank), { PowerDownState::PDNActive, PowerDownState::PDNPrecharge,
PowerDownState::PDNSelfRefresh });
return isIn(getPowerDownState(bank),
{ PowerDownState::PDNActive, PowerDownState::PDNPrecharge, PowerDownState::PDNSelfRefresh });
}
bool PowerDownManager::isInSelfRefresh(Bank bank)
@@ -119,8 +131,8 @@ bool PowerDownManager::allBanksInSelfRefresh()
{
for (Bank bank : controller.getBanks())
{
if(!isInSelfRefresh(bank))
return false;
if (!isInSelfRefresh(bank))
return false;
}
return true;
}
@@ -206,15 +218,11 @@ Command PowerDownManager::getWakeUpCommand(PowerDownState state)
return cmd;
}
void PowerDownManager::sendPowerDownPayload(sc_time time, Bank bank, Command cmd)
void PowerDownManager::sendPowerDownPayload(ScheduledCommand& pdn)
{
time = clkAlign(time); //TODO is clkaligned already?
tlm_generic_payload& payload = getPayload(bank);
ScheduledCommand pdn(cmd, time, controller.config.Timings.clk, DramExtension::getExtension(payload));
controller.state.bus.moveCommandToNextFreeSlot(pdn);
controller.state.change(pdn);
controller.wrapper.send(pdn, payload);
controller.wrapper.send(pdn, powerDownPayloads[pdn.getBank()]);
}
PowerDownState& PowerDownManager::getPowerDownState(Bank bank)
@@ -255,8 +263,7 @@ void PowerDownManager::init()
setUpDummy(payload, bank);
//send payload
ScheduledCommand pdn(Command::PDNP, SC_ZERO_TIME, SC_ZERO_TIME,
DramExtension::getExtension(payload));
ScheduledCommand pdn(Command::PDNP, SC_ZERO_TIME, SC_ZERO_TIME, DramExtension::getExtension(payload));
controller.state.change(pdn);
controller.wrapper.send(pdn, payload);
powerDownStates[bank] = PowerDownState::PDNPrecharge;

View File

@@ -14,6 +14,7 @@
#include <string>
#include "../Command.h"
#include "../../common/dramExtension.h"
#include "../scheduling/ScheduledCommand.h"
namespace core {
@@ -58,7 +59,7 @@ protected:
Command getWakeUpCommand(PowerDownState state);
Command getSleepCommand(PowerDownState state);
void sendPowerDownPayload(sc_time time, Bank bank, Command cmd);
void sendPowerDownPayload(ScheduledCommand& pdn);
void init();
};

View File

@@ -11,8 +11,10 @@ class IRefreshManager
public:
virtual ~IRefreshManager(){};
virtual bool hasCollision(const CommandSchedule& schedule) = 0;
virtual bool hasCollision(const ScheduledCommand& command) = 0;
virtual void scheduleRefresh(tlm::tlm_generic_payload& payload, sc_time time) = 0;
virtual void reInitialize(tlm::tlm_generic_payload& payload, sc_time time) = 0;
virtual void reInitialize(Bank bank, sc_time time) = 0;
virtual bool isInvalidated(tlm::tlm_generic_payload& payload, sc_time time) = 0;
};

View File

@@ -29,20 +29,21 @@ bool RefreshManager::hasCollision(const CommandSchedule& schedule)
return !(schedule.getEnd() < nextPlannedRefresh);
}
bool RefreshManager::hasCollision(const ScheduledCommand& command)
{
return !(command.getEnd() < nextPlannedRefresh);
}
void RefreshManager::scheduleRefresh(tlm::tlm_generic_payload& payload, sc_time time)
{
sc_assert(!isInvalidated(payload, time));
ScheduledCommand nextRefresh(Command::AutoRefresh, time, timing.tRFC,
DramExtension::getExtension(refreshPayloads[Bank(0)]));
if (!controller.state.bankStates.allRowBuffersAreClosed())
{
ScheduledCommand precharge(Command::PrechargeAll, time, controller.config.Timings.tRP,
DramExtension::getExtension(refreshPayloads[Bank(0)]));
controller.getCommandChecker(Command::PrechargeAll).delayToSatisfyConstraints(precharge);
nextRefresh.setStart(precharge.getEnd());
for (Bank bank : controller.getBanks())
{
@@ -53,11 +54,13 @@ void RefreshManager::scheduleRefresh(tlm::tlm_generic_payload& payload, sc_time
controller.wrapper.send(prechargeToSend, payload);
}
}
else
{
//no precharge all
controller.state.bus.moveCommandToNextFreeSlot(nextRefresh);
}
ScheduledCommand nextRefresh(Command::AutoRefresh, time, timing.tRFC,
DramExtension::getExtension(refreshPayloads[Bank(0)]));
controller.getCommandChecker(Command::AutoRefresh).delayToSatisfyConstraints(nextRefresh);
for (Bank bank : controller.getBanks())
{
tlm_generic_payload& payload = refreshPayloads[bank];
@@ -67,11 +70,9 @@ void RefreshManager::scheduleRefresh(tlm::tlm_generic_payload& payload, sc_time
DramExtension::getExtension(payload));
controller.state.change(refreshToSend);
controller.wrapper.send(refreshToSend, payload);
}
planNextRefresh();
}
void RefreshManager::planNextRefresh()
@@ -80,7 +81,7 @@ void RefreshManager::planNextRefresh()
controller.wrapper.send(RefreshTrigger, nextPlannedRefresh, refreshPayloads[Bank(0)]);
}
void RefreshManager::reInitialize(tlm::tlm_generic_payload& payload, sc_time time)
void RefreshManager::reInitialize(Bank bank, sc_time time)
{
nextPlannedRefresh = clkAlign(time, Alignment::DOWN);
planNextRefresh();

View File

@@ -22,9 +22,10 @@ public:
virtual ~RefreshManager();
bool hasCollision(const CommandSchedule& schedule) override;
bool hasCollision(const ScheduledCommand& command) override;
void scheduleRefresh(tlm::tlm_generic_payload& payload, sc_time time) override;
void reInitialize(tlm::tlm_generic_payload& payload, sc_time time) override;
void reInitialize(Bank bank, sc_time time) override;
bool isInvalidated(tlm::tlm_generic_payload& payload, sc_time time) override;

View File

@@ -16,8 +16,6 @@ namespace core {
RefreshManagerBankwise::RefreshManagerBankwise(ControllerCore& controller) :
controller(controller)
{
assert(!controller.config.Timings.refreshTimings.empty());
for (Bank bank : controller.getBanks())
{
refreshManagerForBanks[bank] = new RefreshManagerForBank(controller, bank);
@@ -38,18 +36,22 @@ bool RefreshManagerBankwise::hasCollision(const CommandSchedule& schedule)
return manager.hasCollision(schedule);
}
bool RefreshManagerBankwise::hasCollision(const ScheduledCommand& command)
{
RefreshManagerForBank& manager = *refreshManagerForBanks[command.getBank()];
return manager.hasCollision(command);
}
void RefreshManagerBankwise::scheduleRefresh(tlm::tlm_generic_payload& payload, sc_time time)
{
sc_assert(!isInvalidated(payload, time));
RefreshManagerForBank& manager =
*refreshManagerForBanks[DramExtension::getExtension(payload).getBank()];
RefreshManagerForBank& manager = *refreshManagerForBanks[DramExtension::getExtension(payload).getBank()];
manager.scheduleRefresh(time);
}
RefreshManagerBankwise::RefreshManagerForBank::RefreshManagerForBank(ControllerCore& controller,
Bank bank) :
controller(controller), timing(controller.config.Timings.refreshTimings[bank]), bank(
bank), nextPlannedRefresh(SC_ZERO_TIME)
RefreshManagerBankwise::RefreshManagerForBank::RefreshManagerForBank(ControllerCore& controller, Bank bank) :
controller(controller), timing(controller.config.Timings.refreshTimings[bank]), bank(bank), nextPlannedRefresh(
SC_ZERO_TIME)
{
setupTransaction();
planNextRefresh();
@@ -59,21 +61,18 @@ RefreshManagerBankwise::RefreshManagerForBank::~RefreshManagerForBank()
{
}
/*
* Checks for a scheduled CommandSequence, if there is a collision with the current planned,
* not yet scheduled, refresh command. In case of a collision the manager schedules the refresh
* (sends it out) and plans the next refresh. Afterwards the CommandSequence is re-scheduled
* with the new controller state (earliest start time is the end of the just scheduled refresh).
*/
bool RefreshManagerBankwise::RefreshManagerForBank::hasCollision(const CommandSchedule& schedule)
{
return !(schedule.getEnd() < nextPlannedRefresh);
}
bool RefreshManagerBankwise::RefreshManagerForBank::hasCollision(const ScheduledCommand& command)
{
return !(command.getEnd() < nextPlannedRefresh);
}
void RefreshManagerBankwise::RefreshManagerForBank::scheduleRefresh(sc_time time)
{
ScheduledCommand nextRefresh(Command::AutoRefresh, time, timing.tRFC,
DramExtension::getExtension(refreshPayload));
ScheduledCommand nextRefresh(Command::AutoRefresh, time, timing.tRFC, DramExtension::getExtension(refreshPayload));
if (controller.state.bankStates.rowBufferIsOpen(bank))
{
@@ -89,8 +88,7 @@ void RefreshManagerBankwise::RefreshManagerForBank::scheduleRefresh(sc_time time
controller.state.bus.moveCommandToNextFreeSlot(nextRefresh);
controller.state.change(nextRefresh);
Row currentrow = DramExtension::getExtension(refreshPayload).getRow();
DramExtension::getExtension(refreshPayload).setRow(
Row((currentrow.ID() + 1) % Configuration::getInstance().NumberOfBanks));
DramExtension::getExtension(refreshPayload).setRow(Row((currentrow.ID() + 1) % Configuration::getInstance().NumberOfBanks));
controller.wrapper.send(nextRefresh, refreshPayload);
planNextRefresh();
@@ -102,8 +100,7 @@ void RefreshManagerBankwise::RefreshManagerForBank::planNextRefresh()
controller.wrapper.send(RefreshTrigger, nextPlannedRefresh, refreshPayload);
}
void RefreshManagerBankwise::RefreshManagerForBank::reInitialize(tlm::tlm_generic_payload& payload,
sc_time time)
void RefreshManagerBankwise::RefreshManagerForBank::reInitialize(Bank bank, sc_time time)
{
nextPlannedRefresh = clkAlign(time, Alignment::DOWN);
planNextRefresh();
@@ -119,17 +116,15 @@ void RefreshManagerBankwise::RefreshManagerForBank::setupTransaction()
setUpDummy(refreshPayload, bank);
}
void RefreshManagerBankwise::reInitialize(tlm::tlm_generic_payload& payload, sc_time time)
void RefreshManagerBankwise::reInitialize(Bank bank, sc_time time)
{
refreshManagerForBanks[DramExtension::getExtension(payload).getBank()]->reInitialize(payload,
time);
refreshManagerForBanks[bank]->reInitialize(bank, time);
}
bool RefreshManagerBankwise::isInvalidated(tlm::tlm_generic_payload& payload, sc_time time)
{
RefreshManagerForBank& manager =
*refreshManagerForBanks[DramExtension::getExtension(payload).getBank()];
RefreshManagerForBank& manager = *refreshManagerForBanks[DramExtension::getExtension(payload).getBank()];
return manager.isInvalidated(time);
}

View File

@@ -24,9 +24,10 @@ public:
virtual ~RefreshManagerBankwise();
virtual bool hasCollision(const CommandSchedule& schedule) override;
virtual bool hasCollision(const ScheduledCommand& command) override;
virtual void scheduleRefresh(tlm::tlm_generic_payload& payload, sc_time time) override;
void reInitialize(tlm::tlm_generic_payload& payload, sc_time time) override;
void reInitialize(Bank bank, sc_time time) override;
bool isInvalidated(tlm::tlm_generic_payload& payload,sc_time time) override;
@@ -39,9 +40,10 @@ private:
~RefreshManagerForBank();
bool hasCollision(const CommandSchedule& schedule);
bool hasCollision(const ScheduledCommand& command);
void scheduleRefresh(sc_time time);
void reInitialize(tlm::tlm_generic_payload& payload, sc_time time);
void reInitialize(Bank bank, sc_time time);
bool isInvalidated(sc_time);
private:

View File

@@ -21,36 +21,40 @@ void PrechargeAllChecker::delayToSatisfyConstraints(ScheduledCommand& command) c
{
if (lastCommand.getCommand() == Command::Read)
{
command.delayToMeetConstraint(lastCommand.getStart(),
lastCommand.getBurstLength() * config.Timings.clk);
command.delayToMeetConstraint(lastCommand.getStart(), lastCommand.getBurstLength() * config.Timings.clk);
}
else if (lastCommand.getCommand() == Command::Write)
{
command.delayToMeetConstraint(lastCommand.getEnd(), config.Timings.tWR);
}
else if(lastCommand.getCommand() == Command::WriteA)
else if (lastCommand.getCommand() == Command::WriteA)
{
command.delayToMeetConstraint(lastCommand.getEnd(), SC_ZERO_TIME);
if(config.Timings.tWR > config.Timings.tRP)
if (config.Timings.tWR > config.Timings.tRP)
command.delayToMeetConstraint(lastCommand.getEnd(), config.Timings.tWR - config.Timings.tRP);
}
else if (lastCommand.commandIsIn( {Command::ReadA, Command::PDNAX, Command::PDNPX, Command::SREFX,
Command::AutoRefresh }))
else if (lastCommand.commandIsIn( { Command::PDNAX, Command::PDNPX }))
{
command.delayToMeetConstraint(lastCommand.getEnd(), config.Timings.tXP);
}
else if (lastCommand.getCommand() == Command::SREFX)
{
command.delayToMeetConstraint(lastCommand.getEnd(), config.Timings.tXSR);
}
else if (lastCommand.commandIsIn( { Command::ReadA, Command::AutoRefresh }))
{
command.delayToMeetConstraint(lastCommand.getEnd(), SC_ZERO_TIME);
}
else
reportFatal("Precharge All Checker",
"Precharge All can not follow "
+ commandToString(lastCommand.getCommand()));
"Precharge All can not follow " + commandToString(lastCommand.getCommand()));
}
}
state.bus.moveCommandToNextFreeSlot(command);
}
sc_time PrechargeAllChecker::getExecutionTime(const tlm::tlm_generic_payload& payload,
Command command) const
sc_time PrechargeAllChecker::getExecutionTime(const tlm::tlm_generic_payload& payload, Command command) const
{
sc_assert(command == Command::PrechargeAll);
return config.Timings.tRP;

View File

@@ -31,7 +31,7 @@ void PrechargeChecker::delayToSatisfyConstraints(ScheduledCommand& command) cons
}
else if (lastCommand.getCommand() == Command::PDNAX)
{
command.delayToMeetConstraint(lastCommand.getEnd(), SC_ZERO_TIME);
command.delayToMeetConstraint(lastCommand.getEnd(), config.Timings.tXP);//TODO right?
}
else
reportFatal("Precharge Checker",

View File

@@ -29,7 +29,7 @@ void ReadChecker::delayToSatisfyConstraints(ScheduledCommand& command) const
}
else if (lastCommand.getCommand() == Command::PDNAX)
{
command.delayToMeetConstraint(lastCommand.getEnd(), config.Timings.tXP);
command.delayToMeetConstraint(lastCommand.getEnd(), config.Timings.tXP);//TODO DLL also for PDNP and SREF .. not onyl last command
}
else
reportFatal("Read Checker",

View File

@@ -0,0 +1,52 @@
/*
* RefreshChecker.cpp
*
* Created on: Apr 11, 2014
* Author: jonny
*/
#include "RefreshChecker.h"
#include "../../../common/Utils.h"
namespace core {
void RefreshChecker::delayToSatisfyConstraints(ScheduledCommand& command) const
{
sc_assert(command.getCommand() == Command::AutoRefresh);
ScheduledCommand lastCommandOnBank = state.getLastScheduledCommand(command.getBank());
if (lastCommandOnBank.isValidCommand())
{
if (lastCommandOnBank.getCommand() == Command::Precharge || lastCommandOnBank.getCommand() == Command::PrechargeAll )
{
command.delayToMeetConstraint(lastCommandOnBank.getEnd(), SC_ZERO_TIME);
}
else if (lastCommandOnBank.getCommand() == Command::PDNPX)
{
command.delayToMeetConstraint(lastCommandOnBank.getEnd(), config.Timings.tXP);
}
else if (lastCommandOnBank.getCommand() == Command::SREFX)
{
command.delayToMeetConstraint(lastCommandOnBank.getEnd(), config.Timings.tXSR);
}
else
reportFatal("Refresh Checker", "Refresh can not follow " + commandToString(lastCommandOnBank.getCommand()));
}
while (!state.bus.isFree(command.getStart()))
{
command.delayStart(config.Timings.clk);
}
}
sc_time RefreshChecker::getExecutionTime(const tlm::tlm_generic_payload& payload, Command command) const
{
assert(command == Command::AutoRefresh);
Bank bank = DramExtension::getExtension(payload).getBank();
RefreshTiming timing = config.Timings.refreshTimings.at(bank);
return timing.tRFC;
}
} /* namespace core */

View File

@@ -0,0 +1,40 @@
/*
* RefreshChecker.h
*
* Created on: Apr 11, 2014
* Author: jonny
*/
#ifndef REFRESHCHECKER_H_
#define REFRESHCHECKER_H_
#include "ICommandChecker.h"
#include "../../ControllerState.h"
#include "../../configuration/Configuration.h"
#include <systemc>
namespace core {
class RefreshChecker: ICommandChecker
{
public:
RefreshChecker(const Configuration& config, ControllerState& state) :
config(config), state(state)
{
}
virtual ~RefreshChecker()
{
}
virtual void delayToSatisfyConstraints(ScheduledCommand& command) const override;
virtual sc_time getExecutionTime(const tlm::tlm_generic_payload& payload, Command command) const override;
private:
const Configuration& config;
ControllerState& state;
};
} /* namespace core */
#endif /* REFRESHCHECKER_H_ */

View File

@@ -265,12 +265,6 @@ private:
void scheduleNextPayload(Bank bank)
{
if (bank.ID() == 5)
{
int i = 5;
++i;
}
printDebugMessage("Triggering schedule next payload on bank " + to_string(bank.ID()));
if (scheduler->hasTransactionForBank(bank))
{
@@ -280,11 +274,11 @@ private:
printDebugMessage("\t-> break: controller is busy");
return;
}
if (controller->powerDownManager->isInPowerDown(bank))
{
printDebugMessage("\t-> break: wake up bank first");
printDebugMessage("\t-> wake up bank first");
controller->powerDownManager->wakeUp(bank, sc_time_stamp());
return;
}
else if (controller->powerDownManager->isAwakeForRefresh(bank))
{
@@ -401,9 +395,6 @@ private:
"Leaving PowerDown " + phaseNameToString(phase) + " on bank "
+ to_string(bank.ID()));
sendToDram(payload, phase, SC_ZERO_TIME);
if (phase == END_SREF)
controller->refreshManager->reInitialize(payload, sc_time_stamp());
scheduleNextPayload(bank);
}
else if (phase == BEGIN_AUTO_REFRESH)
{

View File

@@ -99,7 +99,7 @@ int sc_main(int argc, char **argv)
string trace2 = "empty.stl";
string trace1 = "chstone-jpeg_32.stl";
trace1 = "trace.stl";
//trace1 = "trace.stl";
if (runSimulation(resources, traceName, setup, { Device(trace1), Device(trace2) }))
startTraceAnalyzer(traceName);