102 lines
2.7 KiB
C++
102 lines
2.7 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.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 */
|
|
|