Included command mux which selects the oldest payload and a command mux interface.

This commit is contained in:
Lukas Steiner
2019-07-27 21:12:22 +02:00
parent 215790a931
commit 733525e787
14 changed files with 100 additions and 95 deletions

View File

@@ -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)

View File

@@ -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;
}

View File

@@ -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;
};

View File

@@ -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

View File

@@ -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()

View File

@@ -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();

View File

@@ -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);
}

View File

@@ -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

View 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

View 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;
}

View 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

View File

@@ -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)
{

View 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

View File

@@ -8,6 +8,8 @@
using namespace tlm;
enum class BmState;
class SchedulerIF
{
public: