Moved if statements from inner methods to controllerMethod().

This commit is contained in:
Lukas Steiner (2)
2019-07-23 15:10:19 +02:00
parent e7552f6916
commit 1e8b8e37ea
4 changed files with 70 additions and 86 deletions

View File

@@ -10,25 +10,28 @@ void BankMachine::setCommandFinishedTime(sc_time time)
commandFinishedTime = time;
}
sc_time BankMachine::getCommandFinishedTime()
{
return commandFinishedTime;
}
tlm_generic_payload *BankMachine::getNextStateAndResult()
{
tlm_generic_payload *payloadToReturn = nullptr;
if (commandFinishedTime == sc_time_stamp())
if (currentState == BmState::Activating)
currentState = BmState::Activated;
else if (currentState == BmState::Precharging)
currentState = BmState::Precharged;
else if (currentState == BmState::Reading || currentState == BmState::Writing)
{
if (currentState == BmState::Activating)
currentState = BmState::Activated;
else if (currentState == BmState::Precharging)
currentState = BmState::Precharged;
else if (currentState == BmState::Reading || currentState == BmState::Writing)
{
currentState = BmState::Activated;
payloadToReturn = currentPayload;
currentPayload = nullptr;
}
else
SC_REPORT_FATAL(("BankMachine " + bank.toString()).c_str(), "Wrong command!");
currentState = BmState::Activated;
payloadToReturn = currentPayload;
currentPayload = nullptr;
}
else
SC_REPORT_FATAL(("BankMachine " + bank.toString()).c_str(), "Wrong command!");
return payloadToReturn;
}

View File

@@ -28,6 +28,7 @@ class BankMachine
public:
BankMachine(ControllerNew *, SchedulerNew *, CheckerDDR3New*, Bank);
void setCommandFinishedTime(sc_time);
sc_time getCommandFinishedTime();
tlm_generic_payload *getNextStateAndResult();
void startBankMachine();
std::pair<Command, tlm_generic_payload *> getNextCommand();

View File

@@ -48,15 +48,11 @@ tlm_sync_enum ControllerNew::nb_transport_fw(tlm_generic_payload &trans,
}
else if (phase = END_RESP)
{
// FIXME: synchronization!
notificationDelay += Configuration::getInstance().memSpec->clk;
timeToRelease = sc_time_stamp() + notificationDelay;
}
else
{
SC_REPORT_FATAL(0,
"Front-end PEQ in controller wrapper was triggered with unknown phase");
}
SC_REPORT_FATAL(0, "Front-end PEQ in controller wrapper was triggered with unknown phase");
printDebugMessage("[fw] " + phaseNameToString(phase) + " notification in " +
notificationDelay.to_string());
@@ -110,17 +106,13 @@ void ControllerNew::recordPhase(tlm_generic_payload &trans, tlm_phase phase, sc_
void ControllerNew::triggerEventAfterDelay(sc_time delay)
{
if (delay != SC_ZERO_TIME)
{
triggerEvent.notify(delay);
}
}
void ControllerNew::triggerEventQueueAfterDelay(sc_time delay)
{
if (delay != SC_ZERO_TIME)
{
triggerEventQueue.notify(delay);
}
}
void ControllerNew::controllerMethod()
@@ -129,84 +121,74 @@ void ControllerNew::controllerMethod()
if (lastTimeCalled != sc_time_stamp())
{
lastTimeCalled = sc_time_stamp();
releasePayload();
acquirePayload();
getNextBmStates();
sendToFrontend();
startBankMachines();
if (sc_time_stamp() == timeToRelease && payloadToRelease != nullptr)
releasePayload();
if (sc_time_stamp() >= timeToAcquire && payloadToAcquire != nullptr)
acquirePayload();
for (auto it : bankMachines)
{
if (it.second->getCommandFinishedTime() == sc_time_stamp())
{
tlm_generic_payload *result = it.second->getNextStateAndResult();
if (result != nullptr)
responseQueue.push(result);
}
}
if (payloadToRelease == nullptr && !responseQueue.empty())
sendToFrontend();
for (auto it : bankMachines)
it.second->startBankMachine();
commandMux->selectCommand();
startBankMachines();
for (auto it : bankMachines)
it.second->startBankMachine();
}
}
void ControllerNew::releasePayload()
{
if (sc_time_stamp() == timeToRelease && payloadToRelease != nullptr)
{
responseQueue.pop();
payloadToRelease->release();
payloadToRelease = nullptr;
numberOfPayloads--;
// TODO: insert payload ID
printDebugMessage("Payload ID left system.");
}
responseQueue.pop();
payloadToRelease->release();
payloadToRelease = nullptr;
numberOfPayloads--;
// TODO: insert payload ID
printDebugMessage("Payload ID left system.");
}
void ControllerNew::acquirePayload()
{
if (sc_time_stamp() >= timeToAcquire && payloadToAcquire != nullptr)
if (numberOfPayloads < Configuration::getInstance().MaxNrOfTransactions)
{
if (numberOfPayloads < Configuration::getInstance().MaxNrOfTransactions)
{
payloadToAcquire->acquire();
scheduler->storeRequest(payloadToAcquire);
commandMux->insertPayload(payloadToAcquire);
numberOfPayloads++;
// TODO: insert payload ID
printDebugMessage("Payload ID entered system.");
payloadToAcquire->set_response_status(TLM_OK_RESPONSE);
tlm_phase tPhase = END_REQ;
sc_time tDelay = SC_ZERO_TIME;
recordPhase(*payloadToAcquire, tPhase, tDelay);
tSocket->nb_transport_bw(*payloadToAcquire, tPhase, tDelay);
payloadToAcquire = nullptr;
}
else
printDebugMessage("Total number of payloads exceeded, backpressure!");
}
}
void ControllerNew::getNextBmStates()
{
for (auto it : bankMachines)
{
tlm_generic_payload *result = it.second->getNextStateAndResult();
if (result != nullptr)
{
responseQueue.push(result);
}
payloadToAcquire->acquire();
scheduler->storeRequest(payloadToAcquire);
commandMux->insertPayload(payloadToAcquire);
numberOfPayloads++;
// TODO: insert payload ID
printDebugMessage("Payload ID entered system.");
payloadToAcquire->set_response_status(TLM_OK_RESPONSE);
tlm_phase tPhase = END_REQ;
sc_time tDelay = SC_ZERO_TIME;
recordPhase(*payloadToAcquire, tPhase, tDelay);
tSocket->nb_transport_bw(*payloadToAcquire, tPhase, tDelay);
payloadToAcquire = nullptr;
}
else
printDebugMessage("Total number of payloads exceeded, backpressure!");
}
void ControllerNew::sendToFrontend()
{
if (payloadToRelease == nullptr)
{
if (!responseQueue.empty())
{
payloadToRelease = responseQueue.front();
tlm_phase tPhase = BEGIN_RESP;
sc_time tDelay = SC_ZERO_TIME;
recordPhase(*payloadToRelease, tPhase, tDelay);
tSocket->nb_transport_bw(*payloadToRelease, tPhase, tDelay);
}
}
}
void ControllerNew::startBankMachines()
{
for (auto it : bankMachines)
it.second->startBankMachine();
payloadToRelease = responseQueue.front();
tlm_phase tPhase = BEGIN_RESP;
sc_time tDelay = SC_ZERO_TIME;
recordPhase(*payloadToRelease, tPhase, tDelay);
tSocket->nb_transport_bw(*payloadToRelease, tPhase, tDelay);
}
void ControllerNew::sendToDram(Command command, tlm_generic_payload *payload)

View File

@@ -70,9 +70,7 @@ private:
void releasePayload();
void acquirePayload();
void getNextBmStates();
void sendToFrontend();
void startBankMachines();
};
#endif // CONTROLLERNEW_H