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:
Matthias Jung
2015-09-17 16:11:20 +02:00
parent b225bd6367
commit 55a9acb1aa
2 changed files with 26 additions and 10 deletions

View File

@@ -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)
{

View File

@@ -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;