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

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