precharge all checker, redesign of powerndown manager

This commit is contained in:
robert
2014-04-04 01:16:44 +02:00
47 changed files with 1179 additions and 213 deletions

View File

@@ -12,8 +12,8 @@ using namespace tlm;
namespace core {
RefreshManager::RefreshManager(Controller& controller) :
controller(controller), nextPlannedRefresh(SC_ZERO_TIME), timing(controller.config.Timings.refreshTimings.at(0)),
refreshPayloads(controller.state.bankStates.getNumberOfBanks())
controller(controller), timing(controller.config.Timings.refreshTimings.at(0)), nextPlannedRefresh(SC_ZERO_TIME),
refreshPayloads(controller.config.NumberOfBanks)
{
setupTransactions();
planNextRefresh();
@@ -30,8 +30,7 @@ bool RefreshManager::hasCollision(const CommandSchedule& schedule)
void RefreshManager::scheduleRefresh(tlm::tlm_generic_payload& payload, sc_time time)
{
if (time != nextPlannedRefresh)
return;
sc_assert(!isInvalidated(payload, time));
ScheduledCommand nextRefresh(Command::AutoRefresh, time, timing.tRFC, DramExtension::getExtension(refreshPayloads.at(0)));
@@ -40,25 +39,25 @@ void RefreshManager::scheduleRefresh(tlm::tlm_generic_payload& payload, sc_time
ScheduledCommand precharge(Command::PrechargeAll, time,
controller.config.Timings.tRP, DramExtension::getExtension(refreshPayloads.at(0)));
controller.commandChecker.at(Command::PrechargeAll)->delayToSatisfyConstraints(precharge);
controller.getCommandChecker(Command::PrechargeAll).delayToSatisfyConstraints(precharge);
nextRefresh.setStart(precharge.getEnd());
controller.state.change(precharge);
for (tlm::tlm_generic_payload& payload : refreshPayloads)
{
ScheduledCommand prechargeToSend(Command::PrechargeAll, precharge.getStart(),
controller.config.Timings.tRP, DramExtension::getExtension(payload));
controller.state.change(prechargeToSend);
controller.wrapper.send(prechargeToSend, payload);
}
}
controller.state.change(nextRefresh);
for (tlm::tlm_generic_payload& payload : refreshPayloads)
{
ScheduledCommand refreshToSend(Command::AutoRefresh, nextRefresh.getStart(),
timing.tRFC, DramExtension::getExtension(payload));
controller.state.change(refreshToSend);
controller.wrapper.send(refreshToSend, payload);
}
@@ -72,9 +71,20 @@ void RefreshManager::planNextRefresh()
controller.wrapper.send(RefreshTrigger, nextPlannedRefresh, refreshPayloads.at(0));
}
void RefreshManager::reInitialize(tlm::tlm_generic_payload& payload, sc_time time)
{
nextPlannedRefresh = clkAlign(time, controller.config.Timings.clk, Alignment::DOWN);
planNextRefresh();
}
bool core::RefreshManager::isInvalidated(tlm::tlm_generic_payload& payload, sc_time time)
{
return nextPlannedRefresh > time;
}
void RefreshManager::setupTransactions()
{
for (Bank bank : controller.state.bankStates.getBanks())
for (Bank bank : controller.getBanks())
{
tlm_generic_payload& payload = refreshPayloads.at(bank.ID());
payload.set_address(getStartAddress(bank));
@@ -89,3 +99,4 @@ void RefreshManager::setupTransactions()
}
} /* namespace core */