Repaired powerdown after Refresh, however the DRAM should be awake again
for the interval... I think this commit will break the nightly test so I will fix that soon.
This commit is contained in:
@@ -495,17 +495,21 @@ void Controller<BUSWIDTH>::dramPEQCallback(tlm_generic_payload &payload, const t
|
||||
else if (phase == END_REFA)
|
||||
{
|
||||
printDebugMessage("Finished auto refresh on all banks ");
|
||||
|
||||
bool sleepy = true;
|
||||
for(Bank bank : controllerCore->getBanks())
|
||||
{
|
||||
if(numberOfPayloadsInSystem[bank] == 0)
|
||||
{
|
||||
controllerCore->powerDownManager->sleep(bank,sc_time_stamp());
|
||||
}
|
||||
else
|
||||
if(numberOfPayloadsInSystem[bank] != 0)
|
||||
{
|
||||
sleepy = false;
|
||||
scheduleNextFromScheduler(bank);
|
||||
}
|
||||
}
|
||||
|
||||
if(sleepy == true)
|
||||
{
|
||||
controllerCore->powerDownManager->sleep(0,sc_time_stamp());
|
||||
}
|
||||
}
|
||||
else if(phase == END_REFB)
|
||||
{
|
||||
|
||||
@@ -59,14 +59,23 @@ PowerDownManagerTimeout::~PowerDownManagerTimeout()
|
||||
|
||||
void PowerDownManagerTimeout::sleep(Bank bank, sc_time time)
|
||||
{
|
||||
if(canSleep() && !isInPowerDown() && (time - controllerCore.state.getLastScheduledCommand().getEnd()) >= Configuration::getInstance().getPowerDownTimeout())
|
||||
bool test_canSleep = canSleep();
|
||||
bool test_isInPowerDown = isInPowerDown();
|
||||
sc_time last_scheduled_command = controllerCore.state.getLastScheduledCommand().getEnd();
|
||||
sc_time power_down_timeout = Configuration::getInstance().getPowerDownTimeout();
|
||||
bool test_timeCondition = (time - last_scheduled_command) >= power_down_timeout;
|
||||
bool test_awakeForRefresh = (powerDownState == PowerDownState::AwakeForRefresh);
|
||||
|
||||
//test_awakeForRefresh = false;
|
||||
|
||||
if( test_canSleep && !test_isInPowerDown && (test_timeCondition || test_awakeForRefresh ))
|
||||
{
|
||||
PowerDownState newState;
|
||||
if(Configuration::getInstance().PowerDownMode == EPowerDownMode::TimeoutPDN)
|
||||
{
|
||||
newState = controllerCore.state.rowBufferStates.allRowBuffersAreClosed() ? PowerDownState::PDNPrecharge : PowerDownState::PDNActive;
|
||||
}
|
||||
else
|
||||
else // PowerDownMode == TimeoutSREF
|
||||
{
|
||||
newState = PowerDownState::PDNSelfRefresh;
|
||||
}
|
||||
@@ -91,8 +100,9 @@ void PowerDownManagerTimeout::sleep(Bank bank, sc_time time)
|
||||
|
||||
bool PowerDownManagerTimeout::isInPowerDown()
|
||||
{
|
||||
return (powerDownState == PowerDownState::PDNActive || powerDownState == PowerDownState::PDNPrecharge
|
||||
|| powerDownState == PowerDownState::PDNSelfRefresh);
|
||||
return ( powerDownState == PowerDownState::PDNActive
|
||||
|| powerDownState == PowerDownState::PDNPrecharge
|
||||
|| powerDownState == PowerDownState::PDNSelfRefresh);
|
||||
}
|
||||
|
||||
void PowerDownManagerTimeout::setPowerDownState(PowerDownState state)
|
||||
@@ -129,6 +139,8 @@ void PowerDownManagerTimeout::wakeUpForRefresh(Bank bank, sc_time time)
|
||||
|
||||
setPowerDownState(PowerDownState::AwakeForRefresh);
|
||||
sendPowerDownPayloads(pdn);
|
||||
|
||||
// Schedule Next Powerdown after Refresh:
|
||||
}
|
||||
}
|
||||
|
||||
@@ -149,7 +161,7 @@ bool PowerDownManagerTimeout::canSleep()
|
||||
{
|
||||
for (Bank bank : controllerCore.getBanks())
|
||||
{
|
||||
if (!controllerCore.numberOfPayloads[bank] == 0)
|
||||
if (controllerCore.numberOfPayloads[bank] != 0)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user