Adapted bankwise refresh manager to new controller functionality.

This commit is contained in:
Lukas Steiner (2)
2019-12-11 11:11:21 +01:00
parent 5111973983
commit 10f577c38f
2 changed files with 31 additions and 48 deletions

View File

@@ -49,8 +49,9 @@ RefreshManagerBankwise::RefreshManagerBankwise(std::vector<BankMachine *> &bankM
for (unsigned bankID = 0; bankID < memSpec->BanksPerRank; bankID++)
{
setUpDummy(refreshPayloads[bankID], rank, bankMachines[bankID]->getBank());
remainingBankMachines.push_back(bankMachines[bankID]);
allBankMachines.push_back(bankMachines[bankID]);
}
remainingBankMachines = allBankMachines;
if (config.ControllerCoreRefEnablePostpone)
maxPostponed = config.ControllerCoreRefMaxPostponed * memSpec->BanksPerRank;
@@ -73,6 +74,10 @@ sc_time RefreshManagerBankwise::start()
if (sc_time_stamp() >= timeForNextTrigger)
{
powerDownManager->triggerExit(TriggerSource::RefreshManager);
if (blocked)
return sc_max_time() - sc_time_stamp();
if (sc_time_stamp() >= timeForNextTrigger + memSpec->getRefreshIntervalPB())
{
timeForNextTrigger += memSpec->getRefreshIntervalPB();
@@ -104,31 +109,19 @@ sc_time RefreshManagerBankwise::start()
timeForNextTrigger += memSpec->getRefreshIntervalPB();
return timeForNextTrigger - sc_time_stamp();
}
else if (currentBankMachine->getState() == BmState::Activated)
{
if (forcedRefresh)
currentBankMachine->block();
nextCommand = Command::PRE;
delay = checker->delayToSatisfyConstraints(Command::PRE, rank,
currentBankMachine->getBankGroup(), currentBankMachine->getBank());
timeToSchedule = sc_time_stamp() + delay;
return delay;
}
else
{
if (forcedRefresh)
{
currentBankMachine->block();
state = RmState::Precharged;
}
nextCommand = Command::REFB;
delay = checker->delayToSatisfyConstraints(Command::REFB, rank,
if (currentBankMachine->getState() == BmState::Activated)
nextCommand = Command::PRE;
else
nextCommand = Command::REFB;
delay = checker->delayToSatisfyConstraints(nextCommand, rank,
currentBankMachine->getBankGroup(), currentBankMachine->getBank());
timeToSchedule = sc_time_stamp() + delay;
return delay;
}
}
else if (state == RmState::Pulledin)
else // if (state == RmState::Pulledin)
{
bool allBanksBusy = true;
@@ -149,31 +142,18 @@ sc_time RefreshManagerBankwise::start()
timeForNextTrigger += memSpec->getRefreshIntervalPB();
return timeForNextTrigger - sc_time_stamp();
}
else if (currentBankMachine->getState() == BmState::Activated)
{
nextCommand = Command::PRE;
delay = checker->delayToSatisfyConstraints(Command::PRE, rank,
currentBankMachine->getBankGroup(), currentBankMachine->getBank());
timeToSchedule = sc_time_stamp() + delay;
return delay;
}
else
{
nextCommand = Command::REFB;
delay = checker->delayToSatisfyConstraints(Command::REFB, rank,
if (currentBankMachine->getState() == BmState::Activated)
nextCommand = Command::PRE;
else
nextCommand = Command::REFB;
delay = checker->delayToSatisfyConstraints(nextCommand, rank,
currentBankMachine->getBankGroup(), currentBankMachine->getBank());
timeToSchedule = sc_time_stamp() + delay;
return delay;
}
}
else // if (state == RmState::Precharged)
{
nextCommand = Command::REFB;
delay = checker->delayToSatisfyConstraints(Command::REFB, rank,
currentBankMachine->getBankGroup(), currentBankMachine->getBank());
timeToSchedule = sc_time_stamp() + delay;
return delay;
}
}
else
return timeForNextTrigger - sc_time_stamp();
@@ -185,10 +165,7 @@ void RefreshManagerBankwise::updateState(Command command, tlm_generic_payload *p
{
remainingBankMachines.erase(currentIterator);
if (remainingBankMachines.empty())
{
for (unsigned bankID = 0; bankID < memSpec->BanksPerRank; bankID++)
remainingBankMachines.push_back(bankMachines[bankID]);
}
remainingBankMachines = allBankMachines;
if (state == RmState::Pulledin)
flexibilityCounter--;
@@ -199,18 +176,23 @@ void RefreshManagerBankwise::updateState(Command command, tlm_generic_payload *p
{
state = RmState::Regular;
timeForNextTrigger += memSpec->getRefreshIntervalPB();
powerDownManager->triggerEntry(TriggerSource::RefreshManager);
}
}
else if (command == Command::PRE)
else if (command == Command::REFA)
{
if (nextCommand == Command::PRE && DramExtension::getBank(payload) == currentBankMachine->getBank())
{
currentBankMachine->block();
state = RmState::Precharged;
}
// Refresh command after SREFEX
state = RmState::Regular; // TODO: check if this assignment is necessary
timeForNextTrigger = sc_time_stamp() + memSpec->getRefreshIntervalPB();
blocked = false;
}
else if (command == Command::PDEA || command == Command::PDEP)
blocked = true;
else if (command == Command::SREFEN)
{
blocked = true;
timeForNextTrigger = sc_max_time();
}
else if (command == Command::PDXA || command == Command::PDXP)
blocked = false;
}

View File

@@ -58,7 +58,7 @@ public:
virtual void notifyIdle() override {}
private:
enum class RmState {Regular, Precharged, Pulledin} state = RmState::Regular;
enum class RmState {Regular, Pulledin} state = RmState::Regular;
const MemSpec *memSpec;
std::vector<BankMachine *> &bankMachines;
PowerDownManagerIF *powerDownManager;
@@ -70,6 +70,7 @@ private:
Command nextCommand;
std::list<BankMachine *> remainingBankMachines;
std::list<BankMachine *> allBankMachines;
std::list<BankMachine *>::iterator currentIterator;
BankMachine *currentBankMachine;