Trigger power down interruption outside of refresh manager.

This commit is contained in:
Lukas Steiner
2021-05-19 14:03:13 +02:00
parent 49838ea7d8
commit ff265a8a95
5 changed files with 196 additions and 186 deletions

View File

@@ -261,20 +261,21 @@ void Controller::controllerMethod()
commandTuple = powerDownManagers[rankID]->getNextCommand();
if (std::get<CommandTuple::Command>(commandTuple) != Command::NOP)
readyCommands.emplace_back(commandTuple);
else
// (4.2) Check for refresh commands (PREA/PRE or REFA/REFB)
commandTuple = refreshManagers[rankID]->getNextCommand();
if (std::get<CommandTuple::Command>(commandTuple) != Command::NOP)
{
// (4.2) Check for refresh commands (PREA/PRE or REFA/REFB)
commandTuple = refreshManagers[rankID]->getNextCommand();
readyCommands.emplace_back(commandTuple);
powerDownManagers[rankID]->triggerInterruption();
}
// (4.3) Check for bank commands (PRE, ACT, RD/RDA or WR/WRA)
for (auto it : bankMachinesOnRank[rankID])
{
commandTuple = it->getNextCommand();
if (std::get<CommandTuple::Command>(commandTuple) != Command::NOP)
readyCommands.emplace_back(commandTuple);
// (4.3) Check for bank commands (PRE, ACT, RD/RDA or WR/WRA)
for (auto it : bankMachinesOnRank[rankID])
{
commandTuple = it->getNextCommand();
if (std::get<CommandTuple::Command>(commandTuple) != Command::NOP)
readyCommands.emplace_back(commandTuple);
}
}
}

View File

@@ -114,55 +114,55 @@ void PowerDownManagerStaggered::updateState(Command command)
{
switch (command)
{
case Command::ACT:
activatedBanks++;
break;
case Command::PRE:
activatedBanks--;
break;
case Command::PREA:
activatedBanks = 0;
break;
case Command::PDEA:
state = State::ActivePdn;
entryTriggered = false;
break;
case Command::PDEP:
state = State::PrechargePdn;
entryTriggered = false;
break;
case Command::SREFEN:
state = State::SelfRefresh;
entryTriggered = false;
enterSelfRefresh = false;
break;
case Command::PDXA:
state = State::Idle;
exitTriggered = false;
break;
case Command::PDXP:
state = State::Idle;
exitTriggered = false;
if (controllerIdle)
enterSelfRefresh = true;
break;
case Command::SREFEX:
state = State::ExtraRefresh;
break;
case Command::REFA:
if (state == State::ExtraRefresh)
{
case Command::ACT:
activatedBanks++;
break;
case Command::PRE:
activatedBanks--;
break;
case Command::PREA:
activatedBanks = 0;
break;
case Command::PDEA:
state = State::ActivePdn;
entryTriggered = false;
break;
case Command::PDEP:
state = State::PrechargePdn;
entryTriggered = false;
break;
case Command::SREFEN:
state = State::SelfRefresh;
entryTriggered = false;
enterSelfRefresh = false;
break;
case Command::PDXA:
state = State::Idle;
exitTriggered = false;
}
else if (controllerIdle)
entryTriggered = true;
break;
case Command::REFB:
if (controllerIdle)
entryTriggered = true;
break;
default:
break;
break;
case Command::PDXP:
state = State::Idle;
exitTriggered = false;
if (controllerIdle)
enterSelfRefresh = true;
break;
case Command::SREFEX:
state = State::ExtraRefresh;
break;
case Command::REFA:
if (state == State::ExtraRefresh)
{
state = State::Idle;
exitTriggered = false;
}
else if (controllerIdle)
entryTriggered = true;
break;
case Command::REFB:
if (controllerIdle)
entryTriggered = true;
break;
default:
break;
}
}

View File

@@ -66,9 +66,9 @@ sc_time RefreshManagerAllBank::start()
if (sc_time_stamp() >= timeForNextTrigger)
{
powerDownManager->triggerInterruption();
if (sleeping)
return timeToSchedule;
// powerDownManager->triggerInterruption();
// if (sleeping)
// return timeToSchedule;
if (sc_time_stamp() >= timeForNextTrigger + memSpec->getRefreshIntervalAB())
{
@@ -107,7 +107,9 @@ sc_time RefreshManagerAllBank::start()
nextCommand = Command::PREA;
else
nextCommand = Command::REFA;
timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, BankGroup(0), Bank(0));
if (!sleeping)
timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, BankGroup(0), Bank(0));
return timeToSchedule;
}
else // if (state == RmState::Pulledin)
@@ -131,7 +133,9 @@ sc_time RefreshManagerAllBank::start()
else
{
nextCommand = Command::REFA;
timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, BankGroup(0), Bank(0));
if (!sleeping)
timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, BankGroup(0), Bank(0));
return timeToSchedule;
}
}
@@ -144,48 +148,48 @@ void RefreshManagerAllBank::updateState(Command command)
{
switch (command)
{
case Command::ACT:
activatedBanks++;
break;
case Command::PRE: case Command::RDA: case Command::WRA:
activatedBanks--;
break;
case Command::PREA:
activatedBanks = 0;
break;
case Command::REFA:
if (sleeping)
{
// Refresh command after SREFEX
state = State::Regular; // TODO: check if this assignment is necessary
timeForNextTrigger = sc_time_stamp() + memSpec->getRefreshIntervalAB();
sleeping = false;
}
else
{
if (state == State::Pulledin)
flexibilityCounter--;
else
state = State::Pulledin;
if (flexibilityCounter == maxPulledin)
case Command::ACT:
activatedBanks++;
break;
case Command::PRE: case Command::RDA: case Command::WRA:
activatedBanks--;
break;
case Command::PREA:
activatedBanks = 0;
break;
case Command::REFA:
if (sleeping)
{
state = State::Regular;
timeForNextTrigger += memSpec->getRefreshIntervalAB();
// Refresh command after SREFEX
state = State::Regular; // TODO: check if this assignment is necessary
timeForNextTrigger = sc_time_stamp() + memSpec->getRefreshIntervalAB();
sleeping = false;
}
}
break;
case Command::PDEA: case Command::PDEP:
sleeping = true;
break;
case Command::SREFEN:
sleeping = true;
timeForNextTrigger = sc_max_time();
break;
case Command::PDXA: case Command::PDXP:
sleeping = false;
break;
default:
break;
else
{
if (state == State::Pulledin)
flexibilityCounter--;
else
state = State::Pulledin;
if (flexibilityCounter == maxPulledin)
{
state = State::Regular;
timeForNextTrigger += memSpec->getRefreshIntervalAB();
}
}
break;
case Command::PDEA: case Command::PDEP:
sleeping = true;
break;
case Command::SREFEN:
sleeping = true;
timeForNextTrigger = sc_max_time();
break;
case Command::PDXA: case Command::PDXP:
sleeping = false;
break;
default:
break;
}
}

View File

@@ -76,9 +76,9 @@ sc_time RefreshManagerPerBank::start()
if (sc_time_stamp() >= timeForNextTrigger)
{
powerDownManager->triggerInterruption();
if (sleeping)
return timeToSchedule;
// powerDownManager->triggerInterruption();
// if (sleeping)
// return timeToSchedule;
if (sc_time_stamp() >= timeForNextTrigger + memSpec->getRefreshIntervalPB())
{
@@ -129,8 +129,9 @@ sc_time RefreshManagerPerBank::start()
}
}
timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank,
currentBankMachine->getBankGroup(), currentBankMachine->getBank());
if (!sleeping)
timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank,
currentBankMachine->getBankGroup(), currentBankMachine->getBank());
return timeToSchedule;
}
}
@@ -161,8 +162,10 @@ sc_time RefreshManagerPerBank::start()
nextCommand = Command::PRE;
else
nextCommand = Command::REFB;
timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank,
currentBankMachine->getBankGroup(), currentBankMachine->getBank());
if (!sleeping)
timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank,
currentBankMachine->getBankGroup(), currentBankMachine->getBank());
return timeToSchedule;
}
}
@@ -175,40 +178,40 @@ void RefreshManagerPerBank::updateState(Command command)
{
switch (command)
{
case Command::REFB:
skipSelection = false;
remainingBankMachines.erase(currentIterator);
if (remainingBankMachines.empty())
remainingBankMachines = allBankMachines;
case Command::REFB:
skipSelection = false;
remainingBankMachines.erase(currentIterator);
if (remainingBankMachines.empty())
remainingBankMachines = allBankMachines;
if (state == State::Pulledin)
flexibilityCounter--;
else
state = State::Pulledin;
if (state == State::Pulledin)
flexibilityCounter--;
else
state = State::Pulledin;
if (flexibilityCounter == maxPulledin)
{
state = State::Regular;
timeForNextTrigger += memSpec->getRefreshIntervalPB();
}
break;
case Command::REFA:
// Refresh command after SREFEX
state = State::Regular; // TODO: check if this assignment is necessary
timeForNextTrigger = sc_time_stamp() + memSpec->getRefreshIntervalPB();
sleeping = false;
break;
case Command::PDEA: case Command::PDEP:
sleeping = true;
break;
case Command::SREFEN:
sleeping = true;
timeForNextTrigger = sc_max_time();
break;
case Command::PDXA: case Command::PDXP:
sleeping = false;
break;
default:
break;
if (flexibilityCounter == maxPulledin)
{
state = State::Regular;
timeForNextTrigger += memSpec->getRefreshIntervalPB();
}
break;
case Command::REFA:
// Refresh command after SREFEX
state = State::Regular; // TODO: check if this assignment is necessary
timeForNextTrigger = sc_time_stamp() + memSpec->getRefreshIntervalPB();
sleeping = false;
break;
case Command::PDEA: case Command::PDEP:
sleeping = true;
break;
case Command::SREFEN:
sleeping = true;
timeForNextTrigger = sc_max_time();
break;
case Command::PDXA: case Command::PDXP:
sleeping = false;
break;
default:
break;
}
}

View File

@@ -85,9 +85,9 @@ sc_time RefreshManagerSameBank::start()
if (sc_time_stamp() >= timeForNextTrigger)
{
powerDownManager->triggerInterruption();
if (sleeping)
return timeToSchedule;
// powerDownManager->triggerInterruption();
// if (sleeping)
// return timeToSchedule;
if (sc_time_stamp() >= timeForNextTrigger + memSpec->getRefreshIntervalSB())
{
@@ -148,8 +148,9 @@ sc_time RefreshManagerSameBank::start()
skipSelection = true;
}
timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank,
currentIterator->front()->getBankGroup(), currentIterator->front()->getBank());
if (!sleeping)
timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank,
currentIterator->front()->getBankGroup(), currentIterator->front()->getBank());
return timeToSchedule;
}
}
@@ -195,8 +196,9 @@ sc_time RefreshManagerSameBank::start()
}
}
timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank,
currentIterator->front()->getBankGroup(), currentIterator->front()->getBank());
if (!sleeping)
timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank,
currentIterator->front()->getBankGroup(), currentIterator->front()->getBank());
return timeToSchedule;
}
}
@@ -209,41 +211,41 @@ void RefreshManagerSameBank::updateState(Command command)
{
switch (command)
{
case Command::REFSB:
skipSelection = false;
remainingBankMachines.erase(currentIterator);
if (remainingBankMachines.empty())
remainingBankMachines = allBankMachines;
currentIterator = remainingBankMachines.begin();
case Command::REFSB:
skipSelection = false;
remainingBankMachines.erase(currentIterator);
if (remainingBankMachines.empty())
remainingBankMachines = allBankMachines;
currentIterator = remainingBankMachines.begin();
if (state == State::Pulledin)
flexibilityCounter--;
else
state = State::Pulledin;
if (state == State::Pulledin)
flexibilityCounter--;
else
state = State::Pulledin;
if (flexibilityCounter == maxPulledin)
{
state = State::Regular;
timeForNextTrigger += memSpec->getRefreshIntervalSB();
}
break;
case Command::REFA:
// Refresh command after SREFEX
state = State::Regular; // TODO: check if this assignment is necessary
timeForNextTrigger = sc_time_stamp() + memSpec->getRefreshIntervalSB();
sleeping = false;
break;
case Command::PDEA: case Command::PDEP:
sleeping = true;
break;
case Command::SREFEN:
sleeping = true;
timeForNextTrigger = sc_max_time();
break;
case Command::PDXA: case Command::PDXP:
sleeping = false;
break;
default:
break;
if (flexibilityCounter == maxPulledin)
{
state = State::Regular;
timeForNextTrigger += memSpec->getRefreshIntervalSB();
}
break;
case Command::REFA:
// Refresh command after SREFEX
state = State::Regular; // TODO: check if this assignment is necessary
timeForNextTrigger = sc_time_stamp() + memSpec->getRefreshIntervalSB();
sleeping = false;
break;
case Command::PDEA: case Command::PDEP:
sleeping = true;
break;
case Command::SREFEN:
sleeping = true;
timeForNextTrigger = sc_max_time();
break;
case Command::PDXA: case Command::PDXP:
sleeping = false;
break;
default:
break;
}
}