/* * 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; }