Files
DRAMSys/dram/src/core/refresh/RefreshManager.cpp
2014-04-16 12:38:48 +02:00

102 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;
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.getStart() < controller.state.getLastCommand(Command::AutoRefresh).getEnd() || schedule.getEnd() > nextPlannedRefresh;
}
bool RefreshManager::hasCollision(const ScheduledCommand& command)
{
return command.getStart() < controller.state.getLastCommand(Command::AutoRefresh).getEnd() || 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 */