refresh manger and bankwise refresh manager
This commit is contained in:
@@ -1,46 +1,90 @@
|
||||
/*
|
||||
* BankwiseRefreshManager.cpp
|
||||
* RefreshManager.cpp
|
||||
*
|
||||
* Created on: Mar 9, 2014
|
||||
* Author: jonny
|
||||
* Created on: Mar 29, 2014
|
||||
* Author: robert
|
||||
*/
|
||||
|
||||
#include "RefreshManager.h"
|
||||
#include "../Controller.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
using namespace tlm;
|
||||
namespace core {
|
||||
|
||||
RefreshManager::RefreshManager(Controller& controller) : controller(controller)
|
||||
RefreshManager::RefreshManager(Controller& controller) :
|
||||
controller(controller), nextPlannedRefresh(SC_ZERO_TIME), timing(controller.config.Timings.refreshTimings.at(0)),
|
||||
refreshPayloads(controller.state.bankStates.getNumberOfBanks())
|
||||
{
|
||||
assert(!controller.config.Timings.refreshTimings.empty());
|
||||
|
||||
for(Bank bank : controller.state.bankStates.getBanks())
|
||||
{
|
||||
refreshManagerForBanks.push_back(new RefreshManagerForBank(controller, bank));
|
||||
}
|
||||
setupTransactions();
|
||||
planNextRefresh();
|
||||
}
|
||||
|
||||
RefreshManager::~RefreshManager()
|
||||
{
|
||||
|
||||
for(RefreshManagerForBank* manager : refreshManagerForBanks)
|
||||
{
|
||||
delete manager;
|
||||
}
|
||||
}
|
||||
|
||||
bool RefreshManager::hasCollision(const CommandSchedule& schedule)
|
||||
{
|
||||
RefreshManagerForBank& manager = *refreshManagerForBanks.at(schedule.getBank().ID());
|
||||
return manager.hasCollision(schedule);
|
||||
return !(schedule.getEnd() < nextPlannedRefresh);
|
||||
}
|
||||
|
||||
void RefreshManager::scheduleRefresh(tlm::tlm_generic_payload& payload, sc_time time)
|
||||
{
|
||||
RefreshManagerForBank& manager = *refreshManagerForBanks.at(DramExtension::getExtension(payload).getBank().ID());
|
||||
manager.scheduleRefresh(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();
|
||||
|
||||
}
|
||||
|
||||
} /* namespace controller */
|
||||
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 */
|
||||
|
||||
Reference in New Issue
Block a user