From b477424a98d22f80b4e44f2ec66208f503fb594a Mon Sep 17 00:00:00 2001 From: "Lukas Steiner (2)" Date: Tue, 30 Jul 2019 13:30:59 +0200 Subject: [PATCH] Bugfix: Commands on one bank can overlap now. --- .../library/src/controller/BankMachine.cpp | 30 ++---------- DRAMSys/library/src/controller/BankMachine.h | 7 +-- .../library/src/controller/ControllerNew.cpp | 49 ++++++++----------- .../library/src/controller/ControllerNew.h | 3 +- .../src/controller/ControllerRecordable.cpp | 1 - 5 files changed, 28 insertions(+), 62 deletions(-) diff --git a/DRAMSys/library/src/controller/BankMachine.cpp b/DRAMSys/library/src/controller/BankMachine.cpp index 65f51c20..ab17ed03 100644 --- a/DRAMSys/library/src/controller/BankMachine.cpp +++ b/DRAMSys/library/src/controller/BankMachine.cpp @@ -3,26 +3,6 @@ BankMachine::BankMachine(SchedulerIF *scheduler, CheckerDDR3New *checker, Bank bank) : scheduler(scheduler), checker(checker), bank(bank) {} -tlm_generic_payload *BankMachine::getNextStateAndResult() -{ - tlm_generic_payload *payloadToReturn = nullptr; - - 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!"); - - return payloadToReturn; -} - sc_time BankMachine::startBankMachine() { if (currentPayload == nullptr) @@ -80,13 +60,11 @@ std::pair BankMachine::getNextCommand() void BankMachine::updateState(Command command) { if (command == Command::ACT) - currentState = BmState::Activating; + currentState = BmState::Activated; else if (command == Command::PRE) - currentState = BmState::Precharging; - else if (command == Command::RD) - currentState = BmState::Reading; - else if (command == Command::WR) - currentState = BmState::Writing; + currentState = BmState::Precharged; + else if (command == Command::RD || command == Command::WR) + currentPayload = nullptr; else SC_REPORT_FATAL("BankMachine", "Unknown phase"); } diff --git a/DRAMSys/library/src/controller/BankMachine.h b/DRAMSys/library/src/controller/BankMachine.h index 383a7e4c..33750f44 100644 --- a/DRAMSys/library/src/controller/BankMachine.h +++ b/DRAMSys/library/src/controller/BankMachine.h @@ -18,18 +18,13 @@ class CheckerDDR3New; enum class BmState { Precharged, - Activated, - Precharging, - Activating, - Reading, - Writing + Activated }; class BankMachine { public: BankMachine(SchedulerIF *, CheckerDDR3New*, Bank); - tlm_generic_payload *getNextStateAndResult(); sc_time startBankMachine(); std::pair getNextCommand(); void updateState(Command); diff --git a/DRAMSys/library/src/controller/ControllerNew.cpp b/DRAMSys/library/src/controller/ControllerNew.cpp index ea047f85..27f19437 100644 --- a/DRAMSys/library/src/controller/ControllerNew.cpp +++ b/DRAMSys/library/src/controller/ControllerNew.cpp @@ -21,13 +21,10 @@ ControllerNew::ControllerNew(sc_module_name name) : state = new ControllerState("Controller", &Configuration::getInstance()); checker = new CheckerDDR3New(Configuration::getInstance(), *state); - scheduler = new SchedulerFrFcfs(); + scheduler = new SchedulerFifo(); for (unsigned bankID = 0; bankID < Configuration::getInstance().memSpec->NumberOfBanks; bankID++) - { bankMachines[Bank(bankID)] = new BankMachine(scheduler, checker, Bank(bankID)); - commandFinishedTime[Bank(bankID)] = SC_ZERO_TIME; - } - commandMux = new CmdMuxOldest(); + commandMux = new CmdMuxStrict(); } ControllerNew::~ControllerNew() @@ -71,9 +68,12 @@ tlm_sync_enum ControllerNew::nb_transport_bw(tlm_generic_payload &trans, { printDebugMessage("[bw] " + phaseNameToString(phase) + " notification in " + delay.to_string()); - Bank bank = DramExtension::getExtension(trans).getBank(); - commandFinishedTime[bank] = sc_time_stamp() + delay; triggerEventQueueAfterDelay(delay); + if (phase == END_RD || phase == END_WR) + { + std::pair element((sc_time_stamp() + delay), &trans); + responseQueue.push(element); + } return TLM_ACCEPTED; } @@ -120,29 +120,23 @@ void ControllerNew::controllerMethod() printDebugMessage("Total number of payloads exceeded, backpressure!"); } - // (3) Update states of bank machines and get results if ready - for (auto it : bankMachines) + // (3) Send result to arbiter + if (payloadToRelease == nullptr && !responseQueue.empty()) { - if (commandFinishedTime[it.first] == sc_time_stamp()) + std::pair element = responseQueue.front(); + if (sc_time_stamp() >= element.first) { - tlm_generic_payload *result = it.second->getNextStateAndResult(); - if (result != nullptr) - responseQueue.push(result); + payloadToRelease = element.second; + responseQueue.pop(); + sendToFrontend(payloadToRelease, BEGIN_RESP); } } - // (4) Send result to arbiter - if (payloadToRelease == nullptr && !responseQueue.empty()) - { - payloadToRelease = responseQueue.front(); - sendToFrontend(payloadToRelease, BEGIN_RESP); - } - - // (5) Start bank machines to issue new requests for current time + // (4) Start bank machines to issue new requests for current time for (auto it : bankMachines) it.second->startBankMachine(); - // (6) Choose one request and send it to DRAM + // (5) Choose one request and send it to DRAM std::vector> readyCommands; std::pair result; for (auto it : bankMachines) @@ -155,10 +149,14 @@ void ControllerNew::controllerMethod() { result = commandMux->selectCommand(readyCommands); if (result.second != nullptr) + { + Bank bank = DramExtension::getBank(result.second); + bankMachines[bank]->updateState(result.first); sendToDram(result.first, result.second); + } } - // (7) Restart bank machines to issue new requests for the future + // (6) Restart bank machines to issue new requests for the future for (auto it : bankMachines) { sc_time delay = it.second->startBankMachine(); @@ -172,7 +170,6 @@ void ControllerNew::releasePayload() uint64_t id = DramExtension::getPayloadID(payloadToRelease); printDebugMessage("Payload " + std::to_string(id) + " left system."); - responseQueue.pop(); payloadToRelease->release(); numberOfPayloads--; payloadToRelease = nullptr; @@ -186,10 +183,8 @@ void ControllerNew::acquirePayload() scheduler->storeRequest(payloadToAcquire); payloadToAcquire->acquire(); numberOfPayloads++; - payloadToAcquire->set_response_status(TLM_OK_RESPONSE); sendToFrontend(payloadToAcquire, END_REQ); - payloadToAcquire = nullptr; } @@ -205,8 +200,6 @@ void ControllerNew::sendToDram(Command command, tlm_generic_payload *payload) ScheduledCommand scheduledCommand(command, sc_time_stamp(), execTime, *payload); state->cleanUp(sc_time_stamp()); state->change(scheduledCommand); - Bank bank = scheduledCommand.getBank(); - bankMachines[bank]->updateState(command); sc_time delay = SC_ZERO_TIME; tlm_phase phase; diff --git a/DRAMSys/library/src/controller/ControllerNew.h b/DRAMSys/library/src/controller/ControllerNew.h index 48874d3b..aae06319 100644 --- a/DRAMSys/library/src/controller/ControllerNew.h +++ b/DRAMSys/library/src/controller/ControllerNew.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -49,7 +50,7 @@ protected: sc_time timeToAcquire = SC_ZERO_TIME; tlm_generic_payload *payloadToRelease = nullptr; sc_time timeToRelease = SC_ZERO_TIME; - std::queue responseQueue; + std::queue> responseQueue; DebugManager *debugManager; diff --git a/DRAMSys/library/src/controller/ControllerRecordable.cpp b/DRAMSys/library/src/controller/ControllerRecordable.cpp index d6d6480b..30a54c7b 100644 --- a/DRAMSys/library/src/controller/ControllerRecordable.cpp +++ b/DRAMSys/library/src/controller/ControllerRecordable.cpp @@ -29,7 +29,6 @@ void ControllerRecordable::sendToDram(Command command, tlm_generic_payload *payl state->cleanUp(sc_time_stamp()); state->change(scheduledCommand); Bank bank = scheduledCommand.getBank(); - bankMachines[bank]->updateState(command); sc_time delay = SC_ZERO_TIME; tlm_phase phase;