Files
DRAMSys/dram/src/core/refresh/RefreshManager.cpp
2014-03-29 11:48:18 +01:00

91 lines
2.3 KiB
C++

/*
* RefreshManager.cpp
*
* Created on: Mar 29, 2014
* Author: robert
*/
#include "RefreshManager.h"
#include "../Controller.h"
using namespace tlm;
namespace core {
RefreshManager::RefreshManager(Controller& controller) :
controller(controller), nextPlannedRefresh(SC_ZERO_TIME), timing(controller.config.Timings.refreshTimings.at(0)),
refreshPayloads(controller.state.bankStates.getNumberOfBanks())
{
setupTransactions();
planNextRefresh();
}
RefreshManager::~RefreshManager()
{
}
bool RefreshManager::hasCollision(const CommandSchedule& schedule)
{
return !(schedule.getEnd() < nextPlannedRefresh);
}
void RefreshManager::scheduleRefresh(tlm::tlm_generic_payload& payload, sc_time time)
{
if (time != nextPlannedRefresh)
return;
ScheduledCommand nextRefresh(refreshPayloads.at(0), Command::AutoRefresh, time, timing.tRFC);
if (!controller.state.bankStates.allRowBuffersAreClosed())
{
ScheduledCommand precharge(refreshPayloads.at(0), Command::PrechargeAll, time,
controller.config.Timings.tRP);
nextRefresh.setStart(precharge.getEnd());
controller.state.change(precharge);
for (tlm::tlm_generic_payload& payload : refreshPayloads)
{
ScheduledCommand prechargeToSend(payload, Command::PrechargeAll, precharge.getStart(),
controller.config.Timings.tRP);
controller.wrapper.send(prechargeToSend);
}
}
controller.state.change(nextRefresh);
for (tlm::tlm_generic_payload& payload : refreshPayloads)
{
ScheduledCommand refreshToSend(payload, Command::AutoRefresh, nextRefresh.getStart(),
timing.tRFC);
controller.wrapper.send(refreshToSend);
}
planNextRefresh();
}
void RefreshManager::planNextRefresh()
{
nextPlannedRefresh += timing.tREFI;
controller.wrapper.send(RefreshTrigger, nextPlannedRefresh, refreshPayloads.at(0));
}
void RefreshManager::setupTransactions()
{
for (Bank bank : controller.state.bankStates.getBanks())
{
tlm_generic_payload& payload = refreshPayloads.at(bank.ID());
payload.set_address(getStartAddress(bank));
payload.set_command(tlm::TLM_READ_COMMAND);
payload.set_data_length(0);
payload.set_response_status(tlm::TLM_OK_RESPONSE);
payload.set_dmi_allowed(false);
payload.set_byte_enable_length(0);
payload.set_streaming_width(0);
payload.set_extension(new DramExtension(Thread(0), bank, Row(0), Column(0))); //payload takes ownership
}
}
} /* namespace core */