diff --git a/DRAMSys/library/src/controller/ControllerNew.cpp b/DRAMSys/library/src/controller/ControllerNew.cpp index 99316ec5..2a1963e1 100644 --- a/DRAMSys/library/src/controller/ControllerNew.cpp +++ b/DRAMSys/library/src/controller/ControllerNew.cpp @@ -50,7 +50,8 @@ ControllerNew::ControllerNew(sc_module_name name) : GenericController(name) { SC_METHOD(controllerMethod); - sensitive << triggerEvent << triggerEventQueue; + sensitive << beginReqEvent << endRespEvent << bankMachineEvent + << refreshEvent << dataResponseEventQueue; dont_initialize(); Configuration config = Configuration::getInstance(); @@ -61,7 +62,7 @@ ControllerNew::ControllerNew(sc_module_name name) : else { refreshManager = new RefreshManager(); - triggerEventQueue.notify(refreshManager->getInitialDelay()); + refreshEvent.notify(refreshManager->getInitialDelay()); } if (config.Scheduler == "FifoStrict") { @@ -126,6 +127,8 @@ ControllerNew::~ControllerNew() delete it.second; delete scheduler; delete commandMux; + + std::cout << "Total method calls: " << methodCalls << ", false triggered: " << falseTriggered << std::endl; } tlm_sync_enum ControllerNew::nb_transport_fw(tlm_generic_payload &trans, @@ -138,18 +141,19 @@ tlm_sync_enum ControllerNew::nb_transport_fw(tlm_generic_payload &trans, notificationDelay += Configuration::getInstance().memSpec->clk; payloadToAcquire = &trans; timeToAcquire = sc_time_stamp() + notificationDelay; + beginReqEvent.notify(notificationDelay); } else if (phase = END_RESP) { notificationDelay += Configuration::getInstance().memSpec->clk; timeToRelease = sc_time_stamp() + notificationDelay; + endRespEvent.notify(notificationDelay); } else SC_REPORT_FATAL(0, "nb_transport_fw in controller was triggered with unknown phase"); PRINTDEBUGMESSAGE(name(), "[fw] " + phaseNameToString(phase) + " notification in " + notificationDelay.to_string()); - triggerEventQueueAfterDelay(notificationDelay); return TLM_ACCEPTED; } @@ -159,12 +163,12 @@ tlm_sync_enum ControllerNew::nb_transport_bw(tlm_generic_payload &trans, { PRINTDEBUGMESSAGE(name(), "[bw] " + phaseNameToString(phase) + " notification in " + delay.to_string()); - //triggerEventQueueAfterDelay(delay); // TODO: Why do we always trigger the queue? + if (phase == END_RD || phase == END_WR) { std::pair element((sc_time_stamp() + delay), &trans); responseQueue.push(element); - triggerEventQueueAfterDelay(delay); + dataResponseEventQueue.notify(delay); } return TLM_ACCEPTED; } @@ -175,20 +179,9 @@ unsigned int ControllerNew::transport_dbg(tlm_generic_payload &) return 0; } -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() { + methodCalls++; static sc_time lastTimeCalled = SC_ZERO_TIME; if (lastTimeCalled != sc_time_stamp()) { @@ -230,7 +223,7 @@ void ControllerNew::controllerMethod() if (result.second != nullptr) { sc_time delay = refreshManager->updateState(); - triggerEventQueueAfterDelay(delay); + refreshEvent.notify(delay); if (result.first == Command::PREA) { bool forcedPrecharges = false; @@ -269,9 +262,12 @@ void ControllerNew::controllerMethod() for (auto it : bankMachines) { sc_time delay = it.second->startBankMachine(); - triggerEventAfterDelay(delay); + if (delay != SC_ZERO_TIME) // must be checked to avoid + bankMachineEvent.notify(delay); } } + else + falseTriggered++; } void ControllerNew::releasePayload() diff --git a/DRAMSys/library/src/controller/ControllerNew.h b/DRAMSys/library/src/controller/ControllerNew.h index 0ed2e785..31b26d0c 100644 --- a/DRAMSys/library/src/controller/ControllerNew.h +++ b/DRAMSys/library/src/controller/ControllerNew.h @@ -90,10 +90,8 @@ private: void acquirePayload(); void controllerMethod(); - sc_event triggerEvent; - void triggerEventAfterDelay(sc_time); - sc_event_queue triggerEventQueue; - void triggerEventQueueAfterDelay(sc_time); + sc_event beginReqEvent, endRespEvent, bankMachineEvent, refreshEvent; + sc_event_queue dataResponseEventQueue; std::map commandFinishedTime; @@ -105,6 +103,9 @@ private: void endBandwithIdleCollector(); uint64_t numberOfTransactionsServed = 0; + + unsigned methodCalls = 0; + unsigned falseTriggered = 0; }; #endif // CONTROLLERNEW_H diff --git a/DRAMSys/library/src/controller/refresh/RefreshManager.cpp b/DRAMSys/library/src/controller/refresh/RefreshManager.cpp index 9ae16379..e2890c02 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManager.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManager.cpp @@ -41,7 +41,7 @@ RefreshManager::RefreshManager() // TODO: Change time of generation? refreshPayload.set_extension(new GenerationExtension(SC_ZERO_TIME)); refreshPayload.set_extension(new DramExtension()); - memSpec = static_cast(Configuration::getInstance().memSpec); + memSpec = dynamic_cast(Configuration::getInstance().memSpec); if (memSpec == nullptr) SC_REPORT_FATAL("CheckerDDR3", "Wrong MemSpec chosen");