diff --git a/DRAMSys/library/src/controller/BankMachine.cpp b/DRAMSys/library/src/controller/BankMachine.cpp index ed821c19..82259337 100644 --- a/DRAMSys/library/src/controller/BankMachine.cpp +++ b/DRAMSys/library/src/controller/BankMachine.cpp @@ -44,12 +44,9 @@ BankMachine::BankMachine(SchedulerIF *scheduler, CheckerIF *checker, Bank bank) bankgroup = BankGroup(bank.ID() / memSpec->banksPerGroup); } -std::tuple BankMachine::getNextCommand() +std::tuple BankMachine::getNextCommand() { - if (sc_time_stamp() == timeToSchedule) - return std::tuple(nextCommand, currentPayload); - else - return std::tuple(Command::NOP, nullptr); + return std::tuple(nextCommand, currentPayload, timeToSchedule); } void BankMachine::updateState(Command command) @@ -124,6 +121,7 @@ BankMachineOpen::BankMachineOpen(SchedulerIF *scheduler, CheckerIF *checker, Ban sc_time BankMachineOpen::start() { timeToSchedule = sc_max_time(); + nextCommand = Command::NOP; if (sleeping) return timeToSchedule; @@ -134,30 +132,26 @@ sc_time BankMachineOpen::start() if (currentState == BmState::Precharged && !blocked) // row miss { - timeToSchedule = checker->timeToSatisfyConstraints(Command::ACT, rank, bankgroup, bank); nextCommand = Command::ACT; + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, bankgroup, bank); } else if (currentState == BmState::Activated) { if (DramExtension::getRow(currentPayload) == currentRow) // row hit { - if (currentPayload->get_command() == TLM_READ_COMMAND) - { - timeToSchedule = checker->timeToSatisfyConstraints(Command::RD, rank, bankgroup, bank); + if (currentPayload->get_command() == TLM_READ_COMMAND) nextCommand = Command::RD; - } else if (currentPayload->get_command() == TLM_WRITE_COMMAND) - { - timeToSchedule = checker->timeToSatisfyConstraints(Command::WR, rank, bankgroup, bank); nextCommand = Command::WR; - } else SC_REPORT_FATAL("BankMachine", "Wrong TLM command"); + + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, bankgroup, bank); } else if (!blocked) // row miss { - timeToSchedule = checker->timeToSatisfyConstraints(Command::PRE, rank, bankgroup, bank); nextCommand = Command::PRE; + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, bankgroup, bank); } } return timeToSchedule; @@ -169,6 +163,7 @@ BankMachineClosed::BankMachineClosed(SchedulerIF *scheduler, CheckerIF *checker, sc_time BankMachineClosed::start() { timeToSchedule = sc_max_time(); + nextCommand = Command::NOP; if (sleeping) return timeToSchedule; @@ -179,23 +174,19 @@ sc_time BankMachineClosed::start() if (currentState == BmState::Precharged && !blocked) // row miss { - timeToSchedule = checker->timeToSatisfyConstraints(Command::ACT, rank, bankgroup, bank); nextCommand = Command::ACT; + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, bankgroup, bank); } else if (currentState == BmState::Activated) { if (currentPayload->get_command() == TLM_READ_COMMAND) - { - timeToSchedule = checker->timeToSatisfyConstraints(Command::RDA, rank, bankgroup, bank); nextCommand = Command::RDA; - } else if (currentPayload->get_command() == TLM_WRITE_COMMAND) - { - timeToSchedule = checker->timeToSatisfyConstraints(Command::WRA, rank, bankgroup, bank); nextCommand = Command::WRA; - } else SC_REPORT_FATAL("BankMachine", "Wrong TLM command"); + + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, bankgroup, bank); } return timeToSchedule; } @@ -206,6 +197,7 @@ BankMachineOpenAdaptive::BankMachineOpenAdaptive(SchedulerIF *scheduler, Checker sc_time BankMachineOpenAdaptive::start() { timeToSchedule = sc_max_time(); + nextCommand = Command::NOP; if (sleeping) return timeToSchedule; @@ -216,8 +208,8 @@ sc_time BankMachineOpenAdaptive::start() if (currentState == BmState::Precharged && !blocked) // row miss { - timeToSchedule = checker->timeToSatisfyConstraints(Command::ACT, rank, bankgroup, bank); nextCommand = Command::ACT; + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, bankgroup, bank); } else if (currentState == BmState::Activated) { @@ -226,38 +218,27 @@ sc_time BankMachineOpenAdaptive::start() if (scheduler->hasFurtherRequest(bank) && !scheduler->hasFurtherRowHit(bank, currentRow)) { if (currentPayload->get_command() == TLM_READ_COMMAND) - { - timeToSchedule = checker->timeToSatisfyConstraints(Command::RDA, rank, bankgroup, bank); nextCommand = Command::RDA; - } else if (currentPayload->get_command() == TLM_WRITE_COMMAND) - { - timeToSchedule = checker->timeToSatisfyConstraints(Command::WRA, rank, bankgroup, bank); nextCommand = Command::WRA; - } else SC_REPORT_FATAL("BankMachine", "Wrong TLM command"); } else { if (currentPayload->get_command() == TLM_READ_COMMAND) - { - timeToSchedule = checker->timeToSatisfyConstraints(Command::RD, rank, bankgroup, bank); nextCommand = Command::RD; - } else if (currentPayload->get_command() == TLM_WRITE_COMMAND) - { - timeToSchedule = checker->timeToSatisfyConstraints(Command::WR, rank, bankgroup, bank); nextCommand = Command::WR; - } else - SC_REPORT_FATAL("BankMachine", "Wrong TLM command"); + SC_REPORT_FATAL("BankMachine", "Wrong TLM command"); } + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, bankgroup, bank); } else if (!blocked) // row miss { - timeToSchedule = checker->timeToSatisfyConstraints(Command::PRE, rank, bankgroup, bank); nextCommand = Command::PRE; + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, bankgroup, bank); } } return timeToSchedule; @@ -269,6 +250,7 @@ BankMachineClosedAdaptive::BankMachineClosedAdaptive(SchedulerIF *scheduler, Che sc_time BankMachineClosedAdaptive::start() { timeToSchedule = sc_max_time(); + nextCommand = Command::NOP; if (sleeping) return timeToSchedule; @@ -279,8 +261,8 @@ sc_time BankMachineClosedAdaptive::start() if (currentState == BmState::Precharged && !blocked) // row miss { - timeToSchedule = checker->timeToSatisfyConstraints(Command::ACT, rank, bankgroup, bank); nextCommand = Command::ACT; + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, bankgroup, bank); } else if (currentState == BmState::Activated) { @@ -289,38 +271,27 @@ sc_time BankMachineClosedAdaptive::start() if (scheduler->hasFurtherRowHit(bank, currentRow)) { if (currentPayload->get_command() == TLM_READ_COMMAND) - { - timeToSchedule = checker->timeToSatisfyConstraints(Command::RD, rank, bankgroup, bank); nextCommand = Command::RD; - } else if (currentPayload->get_command() == TLM_WRITE_COMMAND) - { - timeToSchedule = checker->timeToSatisfyConstraints(Command::WR, rank, bankgroup, bank); nextCommand = Command::WR; - } else SC_REPORT_FATAL("BankMachine", "Wrong TLM command"); } else { if (currentPayload->get_command() == TLM_READ_COMMAND) - { - timeToSchedule = checker->timeToSatisfyConstraints(Command::RDA, rank, bankgroup, bank); nextCommand = Command::RDA; - } else if (currentPayload->get_command() == TLM_WRITE_COMMAND) - { - timeToSchedule = checker->timeToSatisfyConstraints(Command::WRA, rank, bankgroup, bank); nextCommand = Command::WRA; - } else SC_REPORT_FATAL("BankMachine", "Wrong TLM command"); } + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, bankgroup, bank); } else if (!blocked) // row miss TODO: remove this, can never happen { - timeToSchedule = checker->timeToSatisfyConstraints(Command::PRE, rank, bankgroup, bank); nextCommand = Command::PRE; + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, bankgroup, bank); SC_REPORT_FATAL("BankMachine", "Should never be reached for this policy"); } } diff --git a/DRAMSys/library/src/controller/BankMachine.h b/DRAMSys/library/src/controller/BankMachine.h index 9c3b4cfc..651f8da7 100644 --- a/DRAMSys/library/src/controller/BankMachine.h +++ b/DRAMSys/library/src/controller/BankMachine.h @@ -58,7 +58,7 @@ class BankMachine public: virtual ~BankMachine() {} virtual sc_time start() = 0; - std::tuple getNextCommand(); + std::tuple getNextCommand(); void updateState(Command); void block(); @@ -74,7 +74,7 @@ protected: tlm::tlm_generic_payload *currentPayload = nullptr; SchedulerIF *scheduler; CheckerIF *checker; - Command nextCommand; + Command nextCommand = Command::NOP; BmState currentState = BmState::Precharged; Row currentRow; sc_time timeToSchedule = sc_max_time(); diff --git a/DRAMSys/library/src/controller/Controller.cpp b/DRAMSys/library/src/controller/Controller.cpp index a9265dbd..f3bba1e3 100644 --- a/DRAMSys/library/src/controller/Controller.cpp +++ b/DRAMSys/library/src/controller/Controller.cpp @@ -239,30 +239,26 @@ void Controller::controllerMethod() it->start(); // (5) Choose one request and send it to DRAM - std::tuple commandTuple; - std::vector> readyCommands; - // (5.1) Check for power-down commands (PDEA/PDEP/SREFEN or PDXA/PDXP/SREFEX) + std::tuple commandTuple; + std::list> readyCommands; for (unsigned rankID = 0; rankID < memSpec->numberOfRanks; rankID++) { + // (5.1) Check for power-down commands (PDEA/PDEP/SREFEN or PDXA/PDXP/SREFEX) commandTuple = powerDownManagers[rankID]->getNextCommand(); - if (std::get<1>(commandTuple) != nullptr) + if (std::get<0>(commandTuple) != Command::NOP) readyCommands.push_back(commandTuple); - else + + // (5.2) Check for refresh commands (PREA/PRE or REFA/REFB) + commandTuple = refreshManagers[rankID]->getNextCommand(); + if (std::get<0>(commandTuple) != Command::NOP) + readyCommands.push_back(commandTuple); + + // (5.3) Check for bank commands (PRE, ACT, RD/RDA or WR/WRA) + for (auto it : bankMachinesOnRank[rankID]) { - // (5.2) Check for refresh commands (PREA/PRE or REFA/REFB) - commandTuple = refreshManagers[rankID]->getNextCommand(); - if (std::get<1>(commandTuple) != nullptr) + commandTuple = it->getNextCommand(); + if (std::get<0>(commandTuple) != Command::NOP) readyCommands.push_back(commandTuple); - else - { - // (5.3) Check for bank commands (PRE, ACT, RD/RDA or WR/WRA) - for (auto it : bankMachinesOnRank[rankID]) - { - commandTuple = it->getNextCommand(); - if (std::get<1>(commandTuple) != nullptr) - readyCommands.push_back(commandTuple); - } - } } } @@ -270,7 +266,7 @@ void Controller::controllerMethod() if (!readyCommands.empty()) { commandTuple = cmdMux->selectCommand(readyCommands); - if (std::get<1>(commandTuple) != nullptr) // can happen with FIFO strict + if (std::get<0>(commandTuple) != Command::NOP) // can happen with FIFO strict { Rank rank = DramExtension::getRank(std::get<1>(commandTuple)); BankGroup bankgroup = DramExtension::getBankGroup(std::get<1>(commandTuple)); @@ -305,7 +301,10 @@ void Controller::controllerMethod() sendToDram(std::get<0>(commandTuple), std::get<1>(commandTuple)); } else + { + //std::cout << "Ready command blocked at " << sc_time_stamp() << std::endl; readyCmdBlocked = true; + } } // (6) Accept request from arbiter if scheduler is not full, otherwise backpressure (start END_REQ) diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxIF.h b/DRAMSys/library/src/controller/cmdmux/CmdMuxIF.h index 5c683cbd..8f671327 100644 --- a/DRAMSys/library/src/controller/cmdmux/CmdMuxIF.h +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxIF.h @@ -35,17 +35,18 @@ #ifndef CMDMUXIF_H #define CMDMUXIF_H +#include #include #include -#include +#include #include "../Command.h" class CmdMuxIF { public: virtual ~CmdMuxIF() {} - virtual std::tuple - selectCommand(std::vector> &) = 0; + virtual std::tuple + selectCommand(std::list> &) = 0; }; #endif // CMDMUXIF_H diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.cpp b/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.cpp index 4ddedb5e..9d002b90 100644 --- a/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.cpp +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.cpp @@ -38,23 +38,30 @@ using namespace tlm; -std::tuple -CmdMuxOldest::selectCommand(std::vector> &readyCommands) -{ - auto it = readyCommands.begin(); - auto result = it; - uint64_t lastPayloadID = DramExtension::getPayloadID(std::get<1>(*it)); - it++; +std::tuple +CmdMuxOldest::selectCommand(std::list> &readyCommands) +{ + readyCommands.remove_if([](std::tuple element){return std::get<2>(element) != sc_time_stamp();}); - while (it != readyCommands.end()) + if (!readyCommands.empty()) { - uint64_t newPayloadID = DramExtension::getPayloadID(std::get<1>(*it)); - if (newPayloadID < lastPayloadID) - { - lastPayloadID = newPayloadID; - result = it; - } + auto it = readyCommands.begin(); + auto result = it; + uint64_t lastPayloadID = DramExtension::getPayloadID(std::get<1>(*it)); it++; + + while (it != readyCommands.end()) + { + uint64_t newPayloadID = DramExtension::getPayloadID(std::get<1>(*it)); + if (newPayloadID < lastPayloadID) + { + lastPayloadID = newPayloadID; + result = it; + } + it++; + } + return *result; } - return *result; + else + return std::tuple(Command::NOP, nullptr, sc_max_time()); } diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.h b/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.h index 8f5131af..40c69ff9 100644 --- a/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.h +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.h @@ -40,8 +40,8 @@ class CmdMuxOldest : public CmdMuxIF { public: - std::tuple - selectCommand(std::vector> &); + std::tuple + selectCommand(std::list> &); }; #endif // CMDMUXOLDEST_H diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp index d91ac117..87c34f05 100644 --- a/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp @@ -38,24 +38,29 @@ using namespace tlm; -std::tuple -CmdMuxStrict::selectCommand(std::vector> &readyCommands) +std::tuple +CmdMuxStrict::selectCommand(std::list> &readyCommands) { - for (auto it : readyCommands) + readyCommands.remove_if([](std::tuple element){return std::get<2>(element) != sc_time_stamp();}); + + if (!readyCommands.empty()) { - if (isCasCommand(std::get<0>(it))) + for (auto it : readyCommands) { - if (DramExtension::getPayloadID(std::get<1>(it)) == nextPayloadID) + if (isCasCommand(std::get<0>(it))) { - nextPayloadID++; - return it; + if (DramExtension::getPayloadID(std::get<1>(it)) == nextPayloadID) + { + nextPayloadID++; + return it; + } } } + for (auto it : readyCommands) + { + if (isRasCommand(std::get<0>(it))) + return it; + } } - for (auto it : readyCommands) - { - if (isRasCommand(std::get<0>(it))) - return it; - } - return std::pair(Command::NOP, nullptr); + return std::tuple(Command::NOP, nullptr, sc_max_time()); } diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.h b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.h index fd388350..a0389771 100644 --- a/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.h +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.h @@ -40,8 +40,8 @@ class CmdMuxStrict : public CmdMuxIF { public: - std::tuple - selectCommand(std::vector> &); + std::tuple + selectCommand(std::list> &); private: uint64_t nextPayloadID = 0; diff --git a/DRAMSys/library/src/controller/powerdown/PowerDownManagerDummy.cpp b/DRAMSys/library/src/controller/powerdown/PowerDownManagerDummy.cpp index 2e810c17..8439982f 100644 --- a/DRAMSys/library/src/controller/powerdown/PowerDownManagerDummy.cpp +++ b/DRAMSys/library/src/controller/powerdown/PowerDownManagerDummy.cpp @@ -36,9 +36,9 @@ using namespace tlm; -std::tuple PowerDownManagerDummy::getNextCommand() +std::tuple PowerDownManagerDummy::getNextCommand() { - return std::tuple(Command::NOP, nullptr); + return std::tuple(Command::NOP, nullptr, sc_max_time()); } sc_time PowerDownManagerDummy::start() diff --git a/DRAMSys/library/src/controller/powerdown/PowerDownManagerDummy.h b/DRAMSys/library/src/controller/powerdown/PowerDownManagerDummy.h index 4f6e763f..82b5e60e 100644 --- a/DRAMSys/library/src/controller/powerdown/PowerDownManagerDummy.h +++ b/DRAMSys/library/src/controller/powerdown/PowerDownManagerDummy.h @@ -46,7 +46,7 @@ public: virtual void triggerExit() override {} virtual void triggerInterruption() override {} - virtual std::tuple getNextCommand() override; + virtual std::tuple getNextCommand() override; virtual void updateState(Command) override {} virtual sc_time start() override; }; diff --git a/DRAMSys/library/src/controller/powerdown/PowerDownManagerIF.h b/DRAMSys/library/src/controller/powerdown/PowerDownManagerIF.h index 5d0614f4..b501c10e 100644 --- a/DRAMSys/library/src/controller/powerdown/PowerDownManagerIF.h +++ b/DRAMSys/library/src/controller/powerdown/PowerDownManagerIF.h @@ -49,7 +49,7 @@ public: virtual void triggerExit() = 0; virtual void triggerInterruption() = 0; - virtual std::tuple getNextCommand() = 0; + virtual std::tuple getNextCommand() = 0; virtual void updateState(Command) = 0; virtual sc_time start() = 0; }; diff --git a/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.cpp b/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.cpp index 8fca2304..9fca93cd 100644 --- a/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.cpp +++ b/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.cpp @@ -69,17 +69,15 @@ void PowerDownManagerStaggered::triggerInterruption() exitTriggered = true; } -std::tuple PowerDownManagerStaggered::getNextCommand() +std::tuple PowerDownManagerStaggered::getNextCommand() { - if (sc_time_stamp() == timeToSchedule) - return std::tuple(nextCommand, &powerDownPayload); - else - return std::tuple(Command::NOP, nullptr); + return std::tuple(nextCommand, &powerDownPayload, timeToSchedule); } sc_time PowerDownManagerStaggered::start() { timeToSchedule = sc_max_time(); + nextCommand = Command::NOP; if (exitTriggered) { diff --git a/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.h b/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.h index 5f41a72a..5f4120e1 100644 --- a/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.h +++ b/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.h @@ -48,7 +48,7 @@ public: virtual void triggerExit() override; virtual void triggerInterruption() override; - virtual std::tuple getNextCommand() override; + virtual std::tuple getNextCommand() override; virtual void updateState(Command) override; virtual sc_time start() override; @@ -59,7 +59,7 @@ private: CheckerIF *checker; sc_time timeToSchedule = sc_max_time(); - Command nextCommand; + Command nextCommand = Command::NOP; bool controllerIdle = true; bool entryTriggered = true; diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp index 77e95938..76d74352 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp @@ -54,23 +54,22 @@ RefreshManagerBankwise::RefreshManagerBankwise(std::vector &bankM allBankMachines.push_back(bankMachines[bankID]); } remainingBankMachines = allBankMachines; + currentBankMachine = *remainingBankMachines.begin(); maxPostponed = config.refreshMaxPostponed * memSpec->banksPerRank; maxPulledin = -(config.refreshMaxPulledin * memSpec->banksPerRank); } -std::tuple RefreshManagerBankwise::getNextCommand() +std::tuple RefreshManagerBankwise::getNextCommand() { - if (sc_time_stamp() == timeToSchedule) - return std::tuple - (nextCommand, &refreshPayloads[currentBankMachine->getBank().ID() % memSpec->banksPerRank]); - else - return std::tuple(Command::NOP, nullptr); + return std::tuple + (nextCommand, &refreshPayloads[currentBankMachine->getBank().ID() % memSpec->banksPerRank], timeToSchedule); } sc_time RefreshManagerBankwise::start() { timeToSchedule = sc_max_time(); + nextCommand = Command::NOP; if (sc_time_stamp() >= timeForNextTrigger) { diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.h b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.h index c6dfbf63..9e7752fb 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.h +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.h @@ -48,7 +48,7 @@ class RefreshManagerBankwise final : public RefreshManagerIF public: RefreshManagerBankwise(std::vector &, PowerDownManagerIF *, Rank, CheckerIF *); - virtual std::tuple getNextCommand() override; + virtual std::tuple getNextCommand() override; virtual sc_time start() override; virtual void updateState(Command) override; @@ -62,7 +62,7 @@ private: sc_time timeToSchedule = sc_max_time(); Rank rank; CheckerIF *checker; - Command nextCommand; + Command nextCommand = Command::NOP; std::list remainingBankMachines; std::list allBankMachines; diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerDummy.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerDummy.cpp index db03b731..33206fc6 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerDummy.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerDummy.cpp @@ -36,9 +36,9 @@ using namespace tlm; -std::tuple RefreshManagerDummy::getNextCommand() +std::tuple RefreshManagerDummy::getNextCommand() { - return std::tuple(Command::NOP, nullptr); + return std::tuple(Command::NOP, nullptr, sc_max_time()); } sc_time RefreshManagerDummy::start() diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerDummy.h b/DRAMSys/library/src/controller/refresh/RefreshManagerDummy.h index 93021627..a7a26f79 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerDummy.h +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerDummy.h @@ -44,7 +44,7 @@ class RefreshManagerDummy final : public RefreshManagerIF { public: - virtual std::tuple getNextCommand() override; + virtual std::tuple getNextCommand() override; virtual sc_time start() override; virtual void updateState(Command) override {} }; diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerIF.h b/DRAMSys/library/src/controller/refresh/RefreshManagerIF.h index 3dd53d07..ff8bc949 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerIF.h +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerIF.h @@ -45,7 +45,7 @@ class RefreshManagerIF public: virtual ~RefreshManagerIF() {} - virtual std::tuple getNextCommand() = 0; + virtual std::tuple getNextCommand() = 0; virtual sc_time start() = 0; virtual void updateState(Command) = 0; }; diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerRankwise.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerRankwise.cpp index e59a82b1..956982c8 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerRankwise.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerRankwise.cpp @@ -52,17 +52,15 @@ RefreshManagerRankwise::RefreshManagerRankwise(std::vector &bankM maxPulledin = -config.refreshMaxPulledin; } -std::tuple RefreshManagerRankwise::getNextCommand() +std::tuple RefreshManagerRankwise::getNextCommand() { - if (sc_time_stamp() == timeToSchedule) - return std::tuple(nextCommand, &refreshPayload); - else - return std::tuple(Command::NOP, nullptr); + return std::tuple(nextCommand, &refreshPayload, timeToSchedule); } sc_time RefreshManagerRankwise::start() { timeToSchedule = sc_max_time(); + nextCommand = Command::NOP; if (sc_time_stamp() >= timeForNextTrigger) { @@ -130,7 +128,7 @@ sc_time RefreshManagerRankwise::start() } else { - // nextCommand stays Command::REFA + nextCommand = Command::REFA; timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, rank, BankGroup(0), Bank(0)); return timeToSchedule; } diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerRankwise.h b/DRAMSys/library/src/controller/refresh/RefreshManagerRankwise.h index 6b336754..778e0045 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerRankwise.h +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerRankwise.h @@ -46,7 +46,7 @@ class RefreshManagerRankwise final : public RefreshManagerIF public: RefreshManagerRankwise(std::vector &, PowerDownManagerIF *, Rank, CheckerIF *); - virtual std::tuple getNextCommand() override; + virtual std::tuple getNextCommand() override; virtual sc_time start() override; virtual void updateState(Command) override; @@ -60,7 +60,7 @@ private: sc_time timeToSchedule = sc_max_time(); Rank rank; CheckerIF *checker; - Command nextCommand; + Command nextCommand = Command::NOP; unsigned activatedBanks = 0; diff --git a/README.md b/README.md index b6351eb5..909d2fe4 100644 --- a/README.md +++ b/README.md @@ -204,7 +204,7 @@ The content of [ddr3.json](DRAMSys/library/resources/configs/simulator/ddr3.json } ``` - - *SimulationName* (boolean) + - *SimulationName* (string) - Give the name of the simulation for distinguishing from other simulations. - *Debug* (boolean) - true: enables debug output on console (only supported by a debug build)