Included command mux which selects the oldest payload and a command mux interface.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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<Command, tlm_generic_payload *> 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;
|
||||
};
|
||||
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
#ifndef COMMANDMUX_H
|
||||
#define COMMANDMUX_H
|
||||
|
||||
#include <systemc.h>
|
||||
#include <tlm.h>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#include <queue>
|
||||
#include "Command.h"
|
||||
|
||||
using namespace tlm;
|
||||
|
||||
class CommandMux
|
||||
{
|
||||
public:
|
||||
std::pair<Command, tlm_generic_payload *> selectCommand(std::vector<std::pair<Command, tlm_generic_payload *>> &);
|
||||
|
||||
private:
|
||||
unsigned nextPayloadID = 0;
|
||||
};
|
||||
|
||||
#endif // COMMANDMUX_H
|
||||
@@ -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()
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
#include <tlm_utils/simple_target_socket.h>
|
||||
#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<Bank, BankMachine *> bankMachines;
|
||||
CommandMux *commandMux;
|
||||
SchedulerNew *scheduler;
|
||||
CmdMuxIF *commandMux;
|
||||
SchedulerIF *scheduler;
|
||||
CheckerDDR3New *checker;
|
||||
|
||||
void releasePayload();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
#ifndef SCHEDULERNEW_H
|
||||
#define SCHEDULERNEW_H
|
||||
|
||||
#include <systemc.h>
|
||||
#include <tlm.h>
|
||||
#include <map>
|
||||
#include <deque>
|
||||
#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<Bank, std::deque<tlm_generic_payload *>> buffer;
|
||||
};
|
||||
|
||||
#endif // SCHEDULERNEW_H
|
||||
19
DRAMSys/library/src/controller/cmdmux/CmdMuxIF.h
Normal file
19
DRAMSys/library/src/controller/cmdmux/CmdMuxIF.h
Normal file
@@ -0,0 +1,19 @@
|
||||
#ifndef CMDMUXIF_H
|
||||
#define CMDMUXIF_H
|
||||
|
||||
#include <tlm.h>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#include "../Command.h"
|
||||
|
||||
using namespace tlm;
|
||||
|
||||
class CmdMuxIF
|
||||
{
|
||||
public:
|
||||
virtual ~CmdMuxIF() {}
|
||||
virtual std::pair<Command, tlm_generic_payload *>
|
||||
selectCommand(std::vector<std::pair<Command, tlm_generic_payload *>> &) = 0;
|
||||
};
|
||||
|
||||
#endif // CMDMUXIF_H
|
||||
23
DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.cpp
Normal file
23
DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.cpp
Normal file
@@ -0,0 +1,23 @@
|
||||
#include "CmdMuxOldest.h"
|
||||
#include "../../common/dramExtensions.h"
|
||||
|
||||
std::pair<Command, tlm_generic_payload *>
|
||||
CmdMuxOldest::selectCommand(std::vector<std::pair<Command, tlm_generic_payload *>> &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;
|
||||
}
|
||||
13
DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.h
Normal file
13
DRAMSys/library/src/controller/cmdmux/CmdMuxOldest.h
Normal file
@@ -0,0 +1,13 @@
|
||||
#ifndef CMDMUXOLDEST_H
|
||||
#define CMDMUXOLDEST_H
|
||||
|
||||
#include "CmdMuxIF.h"
|
||||
|
||||
class CmdMuxOldest : public CmdMuxIF
|
||||
{
|
||||
public:
|
||||
std::pair<Command, tlm_generic_payload *>
|
||||
selectCommand(std::vector<std::pair<Command, tlm_generic_payload *>> &);
|
||||
};
|
||||
|
||||
#endif // CMDMUXOLDEST_H
|
||||
@@ -1,8 +1,8 @@
|
||||
#include "CommandMux.h"
|
||||
#include "../common/dramExtensions.h"
|
||||
#include "CmdMuxStrict.h"
|
||||
#include "../../common/dramExtensions.h"
|
||||
|
||||
std::pair<Command, tlm_generic_payload *>
|
||||
CommandMux::selectCommand(std::vector<std::pair<Command, tlm_generic_payload *>> &readyCommands)
|
||||
CmdMuxStrict::selectCommand(std::vector<std::pair<Command, tlm_generic_payload *>> &readyCommands)
|
||||
{
|
||||
for (auto it : readyCommands)
|
||||
{
|
||||
16
DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.h
Normal file
16
DRAMSys/library/src/controller/cmdmux/CmdMuxStrict.h
Normal file
@@ -0,0 +1,16 @@
|
||||
#ifndef CMDMUXSTRICT_H
|
||||
#define CMDMUXSTRICT_H
|
||||
|
||||
#include "CmdMuxIF.h"
|
||||
|
||||
class CmdMuxStrict : public CmdMuxIF
|
||||
{
|
||||
public:
|
||||
std::pair<Command, tlm_generic_payload *>
|
||||
selectCommand(std::vector<std::pair<Command, tlm_generic_payload *>> &);
|
||||
|
||||
private:
|
||||
unsigned nextPayloadID = 0;
|
||||
};
|
||||
|
||||
#endif // CMDMUXSTRICT_H
|
||||
@@ -8,6 +8,8 @@
|
||||
|
||||
using namespace tlm;
|
||||
|
||||
enum class BmState;
|
||||
|
||||
class SchedulerIF
|
||||
{
|
||||
public:
|
||||
|
||||
Reference in New Issue
Block a user