Moved if statements from inner methods to controllerMethod().
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -70,9 +70,7 @@ private:
|
||||
|
||||
void releasePayload();
|
||||
void acquirePayload();
|
||||
void getNextBmStates();
|
||||
void sendToFrontend();
|
||||
void startBankMachines();
|
||||
};
|
||||
|
||||
#endif // CONTROLLERNEW_H
|
||||
|
||||
Reference in New Issue
Block a user