diff --git a/DRAMSys/library/library.pro b/DRAMSys/library/library.pro index 5d29f14e..8f8d6e9f 100644 --- a/DRAMSys/library/library.pro +++ b/DRAMSys/library/library.pro @@ -151,11 +151,11 @@ SOURCES += \ src/controller/core/configuration/MemSpec.cpp \ src/controller/core/scheduling/checker/CheckerDDR3New.cpp \ src/controller/BankMachine.cpp \ - src/controller/CommandMux.cpp \ src/controller/ControllerNew.cpp \ - src/controller/SchedulerNew.cpp \ src/controller/scheduler/SchedulerFifo.cpp \ - src/controller/scheduler/SchedulerFrFcfs.cpp + src/controller/scheduler/SchedulerFrFcfs.cpp \ + src/controller/cmdmux/CmdMuxStrict.cpp \ + src/controller/cmdmux/CmdMuxOldest.cpp HEADERS += \ src/common/third_party/tinyxml2/tinyxml2.h \ @@ -240,12 +240,13 @@ HEADERS += \ src/controller/GenericController.h \ src/controller/core/scheduling/checker/CheckerDDR3New.h \ src/controller/BankMachine.h \ - src/controller/CommandMux.h \ src/controller/ControllerNew.h \ - src/controller/SchedulerNew.h \ src/controller/scheduler/SchedulerIF.h \ src/controller/scheduler/SchedulerFifo.h \ - src/controller/scheduler/SchedulerFrFcfs.h + src/controller/scheduler/SchedulerFrFcfs.h \ + src/controller/cmdmux/CmdMuxIF.h \ + src/controller/cmdmux/CmdMuxStrict.h \ + src/controller/cmdmux/CmdMuxOldest.h #src/common/third_party/json/include/nlohmann/json.hpp \ thermalsim = $$(THERMALSIM) diff --git a/DRAMSys/library/src/controller/BankMachine.cpp b/DRAMSys/library/src/controller/BankMachine.cpp index cda7bf3f..2a2e09e0 100644 --- a/DRAMSys/library/src/controller/BankMachine.cpp +++ b/DRAMSys/library/src/controller/BankMachine.cpp @@ -1,6 +1,6 @@ #include "BankMachine.h" -BankMachine::BankMachine(SchedulerNew *scheduler, CheckerDDR3New *checker, Bank bank) +BankMachine::BankMachine(SchedulerIF *scheduler, CheckerDDR3New *checker, Bank bank) : scheduler(scheduler), checker(checker), bank(bank) {} tlm_generic_payload *BankMachine::getNextStateAndResult() @@ -27,7 +27,7 @@ sc_time BankMachine::startBankMachine() { if (currentPayload == nullptr) { - currentPayload = scheduler->getNextRequest(bank); + currentPayload = scheduler->getNextRequest(bank, currentState, currentRow); if (currentPayload == nullptr) return SC_ZERO_TIME; } diff --git a/DRAMSys/library/src/controller/BankMachine.h b/DRAMSys/library/src/controller/BankMachine.h index b0698bdc..535b1296 100644 --- a/DRAMSys/library/src/controller/BankMachine.h +++ b/DRAMSys/library/src/controller/BankMachine.h @@ -7,13 +7,12 @@ #include "../common/dramExtensions.h" #include "ControllerNew.h" #include "Command.h" -#include "SchedulerNew.h" +#include "scheduler/SchedulerIF.h" #include "core/scheduling/checker/CheckerDDR3New.h" using namespace tlm; -class ControllerNew; -class SchedulerNew; +class SchedulerIF; class CheckerDDR3New; enum class BmState @@ -29,7 +28,7 @@ enum class BmState class BankMachine { public: - BankMachine(SchedulerNew *, CheckerDDR3New*, Bank); + BankMachine(SchedulerIF *, CheckerDDR3New*, Bank); tlm_generic_payload *getNextStateAndResult(); sc_time startBankMachine(); std::pair getNextCommand(); @@ -41,8 +40,7 @@ private: Row currentRow = Row(0); Command nextCommand = Command::NOP; sc_time timeToSchedule = SC_ZERO_TIME; - ControllerNew *controller; - SchedulerNew *scheduler; + SchedulerIF *scheduler; CheckerDDR3New *checker; }; diff --git a/DRAMSys/library/src/controller/CommandMux.h b/DRAMSys/library/src/controller/CommandMux.h deleted file mode 100644 index 9f071a8e..00000000 --- a/DRAMSys/library/src/controller/CommandMux.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef COMMANDMUX_H -#define COMMANDMUX_H - -#include -#include -#include -#include -#include -#include "Command.h" - -using namespace tlm; - -class CommandMux -{ -public: - std::pair selectCommand(std::vector> &); - -private: - unsigned nextPayloadID = 0; -}; - -#endif // COMMANDMUX_H diff --git a/DRAMSys/library/src/controller/ControllerNew.cpp b/DRAMSys/library/src/controller/ControllerNew.cpp index a50d8761..72ee2b2d 100644 --- a/DRAMSys/library/src/controller/ControllerNew.cpp +++ b/DRAMSys/library/src/controller/ControllerNew.cpp @@ -1,6 +1,9 @@ #include "ControllerNew.h" #include "core/configuration/Configuration.h" -#include "scheduler/FifoStrict.h" +#include "scheduler/SchedulerFifo.h" +#include "scheduler/SchedulerFrFcfs.h" +#include "cmdmux/CmdMuxStrict.h" +#include "cmdmux/CmdMuxOldest.h" #include "../common/dramExtensions.h" #include "../common/protocol.h" #include "core/scheduling/ScheduledCommand.h" @@ -18,13 +21,13 @@ ControllerNew::ControllerNew(sc_module_name name, TlmRecorder *tlmRecorder) : state = new ControllerState("Controller", &Configuration::getInstance()); checker = new CheckerDDR3New(Configuration::getInstance(), *state); - scheduler = new SchedulerNew(); + scheduler = new SchedulerFrFcfs(); 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 CommandMux(); + commandMux = new CmdMuxOldest(); } ControllerNew::~ControllerNew() diff --git a/DRAMSys/library/src/controller/ControllerNew.h b/DRAMSys/library/src/controller/ControllerNew.h index cad2cbf6..7fa4ab94 100644 --- a/DRAMSys/library/src/controller/ControllerNew.h +++ b/DRAMSys/library/src/controller/ControllerNew.h @@ -10,8 +10,8 @@ #include #include "../common/dramExtensions.h" #include "BankMachine.h" -#include "CommandMux.h" -#include "SchedulerNew.h" +#include "cmdmux/CmdMuxIF.h" +#include "scheduler/SchedulerIF.h" #include "../common/TlmRecorder.h" #include "../common/DebugManager.h" #include "core/scheduling/checker/CheckerDDR3New.h" @@ -19,9 +19,8 @@ using namespace tlm; -class SchedulerNew; class BankMachine; -class CommandMux; +class SchedulerIF; class ControllerNew : public sc_module { @@ -55,8 +54,8 @@ private: ControllerState *state; std::map bankMachines; - CommandMux *commandMux; - SchedulerNew *scheduler; + CmdMuxIF *commandMux; + SchedulerIF *scheduler; CheckerDDR3New *checker; void releasePayload(); diff --git a/DRAMSys/library/src/controller/SchedulerNew.cpp b/DRAMSys/library/src/controller/SchedulerNew.cpp deleted file mode 100644 index bef8b8b9..00000000 --- a/DRAMSys/library/src/controller/SchedulerNew.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "SchedulerNew.h" -#include "../common/DebugManager.h" - -void SchedulerNew::storeRequest(tlm_generic_payload *payload) -{ - Bank bank = DramExtension::getBank(payload); - buffer[bank].emplace_back(payload); -} - -tlm_generic_payload *SchedulerNew::getNextRequest(Bank bank) -{ - if (!buffer[bank].empty()) - { - tlm_generic_payload *payload = buffer[bank].front(); - buffer[bank].pop_front(); - return payload; - } - else - return nullptr; -} - -void SchedulerNew::printDebugMessage(std::string message) -{ - DebugManager::getInstance().printDebugMessage("Scheduler", message); -} diff --git a/DRAMSys/library/src/controller/SchedulerNew.h b/DRAMSys/library/src/controller/SchedulerNew.h deleted file mode 100644 index e5dcf6d6..00000000 --- a/DRAMSys/library/src/controller/SchedulerNew.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef SCHEDULERNEW_H -#define SCHEDULERNEW_H - -#include -#include -#include -#include -#include "../common/dramExtensions.h" - -using namespace tlm; - -class SchedulerNew -{ -public: - void storeRequest(tlm_generic_payload *); - tlm_generic_payload *getNextRequest(Bank bank); -private: - void printDebugMessage(std::string message); - std::map> buffer; -}; - -#endif // SCHEDULERNEW_H diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxIF.h b/DRAMSys/library/src/controller/cmdmux/CmdMuxIF.h new file mode 100644 index 00000000..7e700862 --- /dev/null +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxIF.h @@ -0,0 +1,19 @@ +#ifndef CMDMUXIF_H +#define CMDMUXIF_H + +#include +#include +#include +#include "../Command.h" + +using namespace tlm; + +class CmdMuxIF +{ +public: + virtual ~CmdMuxIF() {} + virtual std::pair + selectCommand(std::vector> &) = 0; +}; + +#endif // CMDMUXIF_H diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.cpp b/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.cpp new file mode 100644 index 00000000..d912e4de --- /dev/null +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.cpp @@ -0,0 +1,23 @@ +#include "CmdMuxOldest.h" +#include "../../common/dramExtensions.h" + +std::pair +CmdMuxOldest::selectCommand(std::vector> &readyCommands) +{ + auto it = readyCommands.begin(); + auto result = it; + unsigned lastPayloadID = DramExtension::getPayloadID(it->second); + it++; + + while (it != readyCommands.end()) + { + unsigned newPayloadID = DramExtension::getPayloadID(it->second); + if (newPayloadID < lastPayloadID) + { + lastPayloadID = newPayloadID; + result = it; + } + it++; + } + return *result; +} diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.h b/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.h new file mode 100644 index 00000000..cb3c1d1d --- /dev/null +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.h @@ -0,0 +1,13 @@ +#ifndef CMDMUXOLDEST_H +#define CMDMUXOLDEST_H + +#include "CmdMuxIF.h" + +class CmdMuxOldest : public CmdMuxIF +{ +public: + std::pair + selectCommand(std::vector> &); +}; + +#endif // CMDMUXOLDEST_H diff --git a/DRAMSys/library/src/controller/CommandMux.cpp b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp similarity index 76% rename from DRAMSys/library/src/controller/CommandMux.cpp rename to DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp index 3a075e4c..0b39329e 100644 --- a/DRAMSys/library/src/controller/CommandMux.cpp +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.cpp @@ -1,8 +1,8 @@ -#include "CommandMux.h" -#include "../common/dramExtensions.h" +#include "CmdMuxStrict.h" +#include "../../common/dramExtensions.h" std::pair -CommandMux::selectCommand(std::vector> &readyCommands) +CmdMuxStrict::selectCommand(std::vector> &readyCommands) { for (auto it : readyCommands) { diff --git a/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.h b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.h new file mode 100644 index 00000000..1b70b695 --- /dev/null +++ b/DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.h @@ -0,0 +1,16 @@ +#ifndef CMDMUXSTRICT_H +#define CMDMUXSTRICT_H + +#include "CmdMuxIF.h" + +class CmdMuxStrict : public CmdMuxIF +{ +public: + std::pair + selectCommand(std::vector> &); + +private: + unsigned nextPayloadID = 0; +}; + +#endif // CMDMUXSTRICT_H diff --git a/DRAMSys/library/src/controller/scheduler/SchedulerIF.h b/DRAMSys/library/src/controller/scheduler/SchedulerIF.h index da72118e..7170591c 100644 --- a/DRAMSys/library/src/controller/scheduler/SchedulerIF.h +++ b/DRAMSys/library/src/controller/scheduler/SchedulerIF.h @@ -8,6 +8,8 @@ using namespace tlm; +enum class BmState; + class SchedulerIF { public: