/* * 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; namespace core { RefreshManager::RefreshManager(ControllerCore& controller) : controller(controller), timing(controller.config.Timings.refreshTimings[Bank(0)]), nextPlannedRefresh(SC_ZERO_TIME) { setupTransactions(); planNextRefresh(); } RefreshManager::~RefreshManager() { } 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)); if (!controller.state.bankStates.allRowBuffersAreClosed()) { ScheduledCommand precharge(Command::PrechargeAll, time, getExecutionTime(Command::PrechargeAll, refreshPayloads[Bank(0)]), DramExtension::getExtension(refreshPayloads[Bank(0)])); controller.getCommandChecker(Command::PrechargeAll).delayToSatisfyConstraints(precharge); sendToAllBanks(precharge); } ScheduledCommand nextRefresh(Command::AutoRefresh, time, getExecutionTime(Command::AutoRefresh, refreshPayloads[Bank(0)]), DramExtension::getExtension(refreshPayloads[Bank(0)])); controller.getCommandChecker(Command::AutoRefresh).delayToSatisfyConstraints(nextRefresh); sendToAllBanks(nextRefresh); for (Bank bank : controller.getBanks()) { DramExtension::getExtension(refreshPayloads[bank]).increaseRow(); } planNextRefresh(); } void RefreshManager::sendToAllBanks(ScheduledCommand& command) { for (Bank bank : controller.getBanks()) { tlm_generic_payload& payload = refreshPayloads[bank]; DramExtension extension = DramExtension::getExtension(payload); ScheduledCommand cmd(command.getCommand(), command.getStart(), command.getExecutionTime(), extension); controller.state.change(cmd); controller.wrapper.send(cmd, payload); } } void RefreshManager::planNextRefresh() { nextPlannedRefresh += timing.tREFI; controller.wrapper.send(RefreshTrigger, nextPlannedRefresh, refreshPayloads[Bank(0)]); } void RefreshManager::reInitialize(Bank bank, sc_time time) { nextPlannedRefresh = clkAlign(time, 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.getBanks()) { setUpDummy(refreshPayloads[bank], bank); } } } /* namespace core */