diff --git a/DRAMSys/library/src/controller/BankMachine.cpp b/DRAMSys/library/src/controller/BankMachine.cpp index 993ff42d..012c76ed 100644 --- a/DRAMSys/library/src/controller/BankMachine.cpp +++ b/DRAMSys/library/src/controller/BankMachine.cpp @@ -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; } diff --git a/DRAMSys/library/src/controller/BankMachine.h b/DRAMSys/library/src/controller/BankMachine.h index 0d02269f..e699d711 100644 --- a/DRAMSys/library/src/controller/BankMachine.h +++ b/DRAMSys/library/src/controller/BankMachine.h @@ -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 getNextCommand(); diff --git a/DRAMSys/library/src/controller/ControllerNew.cpp b/DRAMSys/library/src/controller/ControllerNew.cpp index 5eee0316..f58bc9dc 100644 --- a/DRAMSys/library/src/controller/ControllerNew.cpp +++ b/DRAMSys/library/src/controller/ControllerNew.cpp @@ -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) diff --git a/DRAMSys/library/src/controller/ControllerNew.h b/DRAMSys/library/src/controller/ControllerNew.h index ea059eb5..824978d5 100644 --- a/DRAMSys/library/src/controller/ControllerNew.h +++ b/DRAMSys/library/src/controller/ControllerNew.h @@ -70,9 +70,7 @@ private: void releasePayload(); void acquirePayload(); - void getNextBmStates(); void sendToFrontend(); - void startBankMachines(); }; #endif // CONTROLLERNEW_H