Fixed BM deadlock.

This commit is contained in:
Lukas Steiner (2)
2019-10-15 16:09:59 +02:00
parent 04a59c8bd2
commit 2aa5d125c7
2 changed files with 17 additions and 6 deletions

View File

@@ -112,12 +112,15 @@ BankMachineOpen::BankMachineOpen(SchedulerIF *scheduler, CheckerIF *checker, Ban
sc_time BankMachineOpen::start()
{
if (currentPayload == nullptr)
if (blocked)
return sc_max_time() - sc_time_stamp();
else if (currentPayload == nullptr)
{
currentPayload = scheduler->getNextRequest(this);
if (currentPayload == nullptr)
return sc_max_time() - sc_time_stamp();
}
sc_time delay;
DramExtension extension = DramExtension::getExtension(currentPayload);
if (currentState == BmState::Precharged) // row miss
@@ -159,12 +162,15 @@ BankMachineClosed::BankMachineClosed(SchedulerIF *scheduler, CheckerIF *checker,
sc_time BankMachineClosed::start()
{
if (currentPayload == nullptr)
if (blocked)
return sc_max_time() - sc_time_stamp();
else if (currentPayload == nullptr)
{
currentPayload = scheduler->getNextRequest(this);
if (currentPayload == nullptr)
return sc_max_time() - sc_time_stamp();
}
sc_time delay;
DramExtension extension = DramExtension::getExtension(currentPayload);
if (currentState == BmState::Precharged) // row miss
@@ -206,12 +212,15 @@ BankMachineOpenAdaptive::BankMachineOpenAdaptive(SchedulerIF *scheduler, Checker
sc_time BankMachineOpenAdaptive::start()
{
if (currentPayload == nullptr)
if (blocked)
return sc_max_time() - sc_time_stamp();
else if (currentPayload == nullptr)
{
currentPayload = scheduler->getNextRequest(this);
if (currentPayload == nullptr)
return sc_max_time() - sc_time_stamp();
}
sc_time delay;
DramExtension extension = DramExtension::getExtension(currentPayload);
if (currentState == BmState::Precharged) // row miss
@@ -271,12 +280,15 @@ BankMachineClosedAdaptive::BankMachineClosedAdaptive(SchedulerIF *scheduler, Che
sc_time BankMachineClosedAdaptive::start()
{
if (currentPayload == nullptr)
if (blocked)
return sc_max_time() - sc_time_stamp();
else if (currentPayload == nullptr)
{
currentPayload = scheduler->getNextRequest(this);
if (currentPayload == nullptr)
return sc_max_time() - sc_time_stamp();
}
sc_time delay;
DramExtension extension = DramExtension::getExtension(currentPayload);
if (currentState == BmState::Precharged) // row miss

View File

@@ -201,8 +201,7 @@ void RefreshManagerBankwise::updateState(Command command, tlm_generic_payload *p
}
else if (command == Command::PRE)
{
if (nextCommand == Command::PRE && state == RmState::Regular
&& DramExtension::getBank(payload) == currentBankMachine->getBank())
if (nextCommand == Command::PRE && DramExtension::getBank(payload) == currentBankMachine->getBank())
{
currentBankMachine->block();
state = RmState::Precharged;