Adapted bankwise refresh manager to new controller functionality.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user