Files
DRAMSys/dram/src/controller/core/refresh/RefreshManager.cpp
Éder Ferreira Zulian 18025343cd Warnings eliminated.
Variables initialized.

Variables removed with small changes in the code accordingly.

Some warnings suppressed with __attribute__((unused)).
2015-04-24 11:20:44 +02:00

86 lines
2.9 KiB
C++

/*
* RefreshManager.cpp
*
* Created on: Mar 29, 2014
* Author: robert
*/
#include "RefreshManager.h"
#include "../ControllerCore.h"
#include "../TimingCalculation.h"
#include "../../../common/Utils.h"
#include "../TimingCalculation.h"
using namespace tlm;
RefreshManager::RefreshManager(ControllerCore& controller) :
controllerCore(controller), timing(controller.config.memSpec.refreshTimings[Bank(0)]), nextPlannedRefresh(SC_ZERO_TIME)
{
for (Bank bank : controller.getBanks())
{
setUpDummy(refreshPayloads[bank], bank);
}
planNextRefresh();
}
RefreshManager::~RefreshManager()
{
}
bool RefreshManager::hasCollision(const ScheduledCommand& command)
{
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)
{
sc_assert(!isInvalidated(payload, time));
if (!controllerCore.state.rowBufferStates.allRowBuffersAreClosed())
{
ScheduledCommand prechargeAllMaster(Command::PrechargeAll, time, getExecutionTime(Command::PrechargeAll, refreshPayloads[Bank(0)]),
refreshPayloads[Bank(0)]);
controllerCore.getCommandChecker(Command::PrechargeAll).delayToSatisfyConstraints(prechargeAllMaster);
for (Bank bank : controllerCore.getBanks())
{
ScheduledCommand prechargeAll(Command::PrechargeAll, prechargeAllMaster.getStart(), prechargeAllMaster.getExecutionTime(),
refreshPayloads[bank]);
controllerCore.state.change(prechargeAll);
controllerCore.controller.send(prechargeAll, refreshPayloads[bank]);
}
}
ScheduledCommand refreshAllMaster(Command::AutoRefresh, time, getExecutionTime(Command::AutoRefresh, refreshPayloads[Bank(0)]),
DramExtension::getExtension(refreshPayloads[Bank(0)]));
controllerCore.getCommandChecker(Command::AutoRefresh).delayToSatisfyConstraints(refreshAllMaster);
for (Bank bank : controllerCore.getBanks())
{
ScheduledCommand refresh(Command::AutoRefresh, refreshAllMaster.getStart(), refreshAllMaster.getExecutionTime(),refreshPayloads[bank]);
controllerCore.state.change(refresh);
controllerCore.controller.send(refresh, refreshPayloads[bank]);
DramExtension::getExtension(refreshPayloads[bank]).incrementRow();
}
planNextRefresh();
}
void RefreshManager::planNextRefresh()
{
nextPlannedRefresh += timing.tREFI;
controllerCore.controller.send(REFTrigger, nextPlannedRefresh, refreshPayloads[Bank(0)]);
}
void RefreshManager::reInitialize(Bank /*bank*/, sc_time time)
{
nextPlannedRefresh = clkAlign(time, Alignment::DOWN);
planNextRefresh();
}
bool RefreshManager::isInvalidated(tlm::tlm_generic_payload& payload __attribute((unused)), sc_time time)
{
return nextPlannedRefresh > time;
}