diff --git a/DRAMSys/library/src/common/TlmRecorder.cpp b/DRAMSys/library/src/common/TlmRecorder.cpp index 4b4aba97..0a2f0c19 100644 --- a/DRAMSys/library/src/common/TlmRecorder.cpp +++ b/DRAMSys/library/src/common/TlmRecorder.cpp @@ -205,8 +205,8 @@ void TlmRecorder::Transaction::insertPhase(string name, sc_time begin) void TlmRecorder::Transaction::setPhaseEnd(string name, sc_time end) { // Find the latest recorder phase for that transaction with a matching name and update it - // Note: Transaction have the same phase multiple times (e.g. PRE->ACT->REF->ACT->RD) only update the latest - // one that has been recorder + // Note: Transactions might have the same phase multiple times (e.g. PRE->ACT->REF->ACT->RD) + // only update the latest one that has been recorded for (int i = recordedPhases.size() - 1; i >= 0; i--) { Phase &data = recordedPhases[i]; if (data.name == name) { diff --git a/DRAMSys/library/src/controller/BankMachine.cpp b/DRAMSys/library/src/controller/BankMachine.cpp index 753ebcce..cf3238b8 100644 --- a/DRAMSys/library/src/controller/BankMachine.cpp +++ b/DRAMSys/library/src/controller/BankMachine.cpp @@ -112,6 +112,8 @@ BankMachineOpen::BankMachineOpen(SchedulerIF *scheduler, CheckerIF *checker, Ban sc_time BankMachineOpen::start() { + timeToSchedule = sc_max_time(); + if (blocked) return sc_max_time() - sc_time_stamp(); else if (currentPayload == nullptr) @@ -120,7 +122,6 @@ sc_time BankMachineOpen::start() if (currentPayload == nullptr) return sc_max_time() - sc_time_stamp(); } - sc_time delay; DramExtension extension = DramExtension::getExtension(currentPayload); if (currentState == BmState::Precharged) // row miss @@ -162,6 +163,8 @@ BankMachineClosed::BankMachineClosed(SchedulerIF *scheduler, CheckerIF *checker, sc_time BankMachineClosed::start() { + timeToSchedule = sc_max_time(); + if (blocked) return sc_max_time() - sc_time_stamp(); else if (currentPayload == nullptr) @@ -170,7 +173,6 @@ sc_time BankMachineClosed::start() if (currentPayload == nullptr) return sc_max_time() - sc_time_stamp(); } - sc_time delay; DramExtension extension = DramExtension::getExtension(currentPayload); if (currentState == BmState::Precharged) // row miss @@ -212,6 +214,8 @@ BankMachineOpenAdaptive::BankMachineOpenAdaptive(SchedulerIF *scheduler, Checker sc_time BankMachineOpenAdaptive::start() { + timeToSchedule = sc_max_time(); + if (blocked) return sc_max_time() - sc_time_stamp(); else if (currentPayload == nullptr) @@ -220,7 +224,6 @@ sc_time BankMachineOpenAdaptive::start() if (currentPayload == nullptr) return sc_max_time() - sc_time_stamp(); } - sc_time delay; DramExtension extension = DramExtension::getExtension(currentPayload); if (currentState == BmState::Precharged) // row miss @@ -280,6 +283,8 @@ BankMachineClosedAdaptive::BankMachineClosedAdaptive(SchedulerIF *scheduler, Che sc_time BankMachineClosedAdaptive::start() { + timeToSchedule = sc_max_time(); + if (blocked) return sc_max_time() - sc_time_stamp(); else if (currentPayload == nullptr) @@ -288,7 +293,6 @@ sc_time BankMachineClosedAdaptive::start() if (currentPayload == nullptr) return sc_max_time() - sc_time_stamp(); } - sc_time delay; DramExtension extension = DramExtension::getExtension(currentPayload); if (currentState == BmState::Precharged) // row miss diff --git a/DRAMSys/library/src/controller/BankMachine.h b/DRAMSys/library/src/controller/BankMachine.h index bf7ca2f5..1e8e8d2c 100644 --- a/DRAMSys/library/src/controller/BankMachine.h +++ b/DRAMSys/library/src/controller/BankMachine.h @@ -80,7 +80,7 @@ protected: Row nextRow; BmState currentState = BmState::Precharged; Row currentRow; - sc_time timeToSchedule = SC_ZERO_TIME; + sc_time timeToSchedule = sc_max_time(); Rank rank = Rank(0); BankGroup bankgroup = BankGroup(0); Bank bank; diff --git a/DRAMSys/library/src/controller/Controller.cpp b/DRAMSys/library/src/controller/Controller.cpp index 5ddbc4ca..f3359a0f 100644 --- a/DRAMSys/library/src/controller/Controller.cpp +++ b/DRAMSys/library/src/controller/Controller.cpp @@ -124,7 +124,10 @@ Controller::Controller(sc_module_name name) : } if (config.ControllerCoreRefDisable) - refreshManagers.push_back(new RefreshManagerDummy()); + { + for (unsigned rankID = 0; rankID < memSpec->NumberOfRanks; rankID++) + refreshManagers.push_back(new RefreshManagerDummy()); + } else if (config.BankwiseLogic) { for (unsigned rankID = 0; rankID < memSpec->NumberOfRanks; rankID++) @@ -307,8 +310,9 @@ void Controller::releasePayload() payloadToRelease->release(); numberOfPayloads--; payloadToRelease = nullptr; - + timeToRelease = sc_max_time(); numberOfTransactionsServed++; + if (numberOfPayloads == 0) startBandwidthIdleCollector(); } @@ -327,6 +331,7 @@ void Controller::acquirePayload() payloadToAcquire->set_response_status(TLM_OK_RESPONSE); sendToFrontend(payloadToAcquire, END_REQ); payloadToAcquire = nullptr; + timeToAcquire = sc_max_time(); } void Controller::sendToFrontend(tlm_generic_payload *payload, tlm_phase phase) diff --git a/DRAMSys/library/src/controller/Controller.h b/DRAMSys/library/src/controller/Controller.h index fd08a178..11e7e831 100644 --- a/DRAMSys/library/src/controller/Controller.h +++ b/DRAMSys/library/src/controller/Controller.h @@ -75,9 +75,9 @@ private: unsigned numberOfPayloads = 0; unsigned maxNumberOfPayloads; tlm_generic_payload *payloadToAcquire = nullptr; - sc_time timeToAcquire = SC_ZERO_TIME; + sc_time timeToAcquire = sc_max_time(); tlm_generic_payload *payloadToRelease = nullptr; - sc_time timeToRelease = SC_ZERO_TIME; + sc_time timeToRelease = sc_max_time(); std::queue> responseQueue; std::vector bankMachines; diff --git a/DRAMSys/library/src/controller/refresh/RefreshManager.cpp b/DRAMSys/library/src/controller/refresh/RefreshManager.cpp index 220a5f07..1abdf2ca 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManager.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManager.cpp @@ -61,7 +61,8 @@ std::pair RefreshManager::getNextCommand() sc_time RefreshManager::start() { - timeToSchedule = SC_ZERO_TIME; + timeToSchedule = sc_max_time(); + if (sc_time_stamp() >= timeForNextTrigger) { if (sc_time_stamp() >= timeForNextTrigger + memSpec->getRefreshIntervalAB()) diff --git a/DRAMSys/library/src/controller/refresh/RefreshManager.h b/DRAMSys/library/src/controller/refresh/RefreshManager.h index e30ebc83..542108a8 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManager.h +++ b/DRAMSys/library/src/controller/refresh/RefreshManager.h @@ -56,8 +56,8 @@ private: const MemSpec *memSpec; std::vector bankMachines; tlm_generic_payload refreshPayload; - sc_time timeForNextTrigger; - sc_time timeToSchedule = SC_ZERO_TIME; + sc_time timeForNextTrigger = sc_max_time(); + sc_time timeToSchedule = sc_max_time(); Rank rank; CheckerIF *checker; Command nextCommand; diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp index 5ed1f428..e412d594 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp @@ -68,7 +68,8 @@ std::pair RefreshManagerBankwise::getNextCommand sc_time RefreshManagerBankwise::start() { - timeToSchedule = SC_ZERO_TIME; + timeToSchedule = sc_max_time(); + if (sc_time_stamp() >= timeForNextTrigger) { if (sc_time_stamp() >= timeForNextTrigger + memSpec->getRefreshIntervalPB()) diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.h b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.h index 4b176148..5f7b6948 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.h +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.h @@ -58,8 +58,8 @@ private: const MemSpec *memSpec; std::vector bankMachines; std::vector refreshPayloads; - sc_time timeForNextTrigger; - sc_time timeToSchedule = SC_ZERO_TIME; + sc_time timeForNextTrigger = sc_max_time(); + sc_time timeToSchedule = sc_max_time(); Rank rank; CheckerIF *checker; Command nextCommand; diff --git a/DRAMSys/library/src/simulation/StlPlayer.h b/DRAMSys/library/src/simulation/StlPlayer.h index 3f27b624..e45e1233 100644 --- a/DRAMSys/library/src/simulation/StlPlayer.h +++ b/DRAMSys/library/src/simulation/StlPlayer.h @@ -89,6 +89,7 @@ public: } // Allocate a generic payload for this request. gp *payload = this->allocatePayload(); + payload->acquire(); unsigned char *data = payload->get_data_ptr(); // Trace files MUST provide timestamp, command and address for every diff --git a/DRAMSys/library/src/simulation/TraceGenerator.h b/DRAMSys/library/src/simulation/TraceGenerator.h index b96b5456..4631c5a9 100644 --- a/DRAMSys/library/src/simulation/TraceGenerator.h +++ b/DRAMSys/library/src/simulation/TraceGenerator.h @@ -64,7 +64,7 @@ public: } gp *payload = this->allocatePayload(); - + payload->acquire(); unsigned char *dataElement = new unsigned char[16]; // TODO: column / burst breite diff --git a/DRAMSys/library/src/simulation/TracePlayer.cpp b/DRAMSys/library/src/simulation/TracePlayer.cpp index ad727568..f9aa8fb6 100644 --- a/DRAMSys/library/src/simulation/TracePlayer.cpp +++ b/DRAMSys/library/src/simulation/TracePlayer.cpp @@ -77,16 +77,14 @@ void TracePlayer::peqCallback(tlm_generic_payload &payload, const tlm_phase &phase) { if (phase == BEGIN_REQ) { - payload.acquire(); sendToTarget(payload, phase, SC_ZERO_TIME); - transactionsSent++; PRINTDEBUGMESSAGE(name(), "Performing request #" + std::to_string(transactionsSent)); } else if (phase == END_REQ) { nextPayload(); } else if (phase == BEGIN_RESP) { - sendToTarget(payload, END_RESP, SC_ZERO_TIME); payload.release(); + sendToTarget(payload, END_RESP, SC_ZERO_TIME); if (Configuration::getInstance().SimulationProgressBar) listener->transactionFinished();