Arbiter now assigns each payload an ID for transaction order decision in CommandMux.
This commit is contained in:
@@ -25,12 +25,12 @@ isEmpty(systemc_home) {
|
||||
message(SystemC home is $${systemc_home})
|
||||
|
||||
SUBDIRS += library
|
||||
SUBDIRS += unitTests
|
||||
#SUBDIRS += unitTests
|
||||
SUBDIRS += simulator
|
||||
SUBDIRS += traceAnalyzer
|
||||
|
||||
library.subdir = library
|
||||
unitTests.subdir = unitTests
|
||||
#unitTests.subdir = unitTests
|
||||
simulator.subdir = simulator
|
||||
traceAnalyzer.subdir = traceAnalyzer
|
||||
|
||||
|
||||
@@ -44,25 +44,20 @@ using namespace tlm;
|
||||
|
||||
|
||||
DramExtension::DramExtension() :
|
||||
thread(0), channel(0), bank(0), bankgroup(0), row(0), column(0), burstlength(0)
|
||||
{
|
||||
}
|
||||
thread(0), channel(0), bank(0), bankgroup(0),
|
||||
row(0), column(0), burstlength(0), payloadID(0) {}
|
||||
|
||||
DramExtension::DramExtension(const Thread &thread, const Bank &bank,
|
||||
const BankGroup &bankgroup, const Row &row, const Column &column,
|
||||
unsigned int burstlength) :
|
||||
unsigned int burstlength, unsigned int payloadID) :
|
||||
thread(thread), channel(0), bank(bank), bankgroup(bankgroup), row(row),
|
||||
column(column), burstlength(burstlength)
|
||||
{
|
||||
}
|
||||
column(column), burstlength(burstlength), payloadID(payloadID) {}
|
||||
|
||||
DramExtension::DramExtension(const Thread &thread, const Channel &channel,
|
||||
const Bank &bank, const BankGroup &bankgroup, const Row &row,
|
||||
const Column &column, unsigned int burstlength) :
|
||||
const Column &column, unsigned int burstlength, unsigned int payloadID) :
|
||||
thread(thread), channel(channel), bank(bank), bankgroup(bankgroup), row(row),
|
||||
column(column), burstlength(burstlength)
|
||||
{
|
||||
}
|
||||
column(column), burstlength(burstlength), payloadID(payloadID) {}
|
||||
|
||||
DramExtension &DramExtension::getExtension(const tlm_generic_payload *payload)
|
||||
{
|
||||
@@ -118,10 +113,19 @@ Row DramExtension::getRow(const tlm_generic_payload &payload)
|
||||
return DramExtension::getRow(&payload);
|
||||
}
|
||||
|
||||
unsigned int DramExtension::getPayloadID(const tlm_generic_payload *payload)
|
||||
{
|
||||
return DramExtension::getExtension(payload).getPayloadID();
|
||||
}
|
||||
|
||||
unsigned int DramExtension::getPayloadID(const tlm_generic_payload &payload)
|
||||
{
|
||||
return DramExtension::getPayloadID(&payload);
|
||||
}
|
||||
|
||||
tlm_extension_base *DramExtension::clone() const
|
||||
{
|
||||
return new DramExtension(thread, bank, bankgroup, row, column, burstlength);
|
||||
return new DramExtension(thread, bank, bankgroup, row, column, burstlength, payloadID);
|
||||
}
|
||||
|
||||
void DramExtension::copy_from(const tlm_extension_base &ext)
|
||||
@@ -170,6 +174,11 @@ unsigned int DramExtension::getBurstlength() const
|
||||
return burstlength;
|
||||
}
|
||||
|
||||
unsigned int DramExtension::getPayloadID() const
|
||||
{
|
||||
return payloadID;
|
||||
}
|
||||
|
||||
void DramExtension::incrementRow()
|
||||
{
|
||||
++row;
|
||||
|
||||
@@ -151,10 +151,10 @@ public:
|
||||
DramExtension();
|
||||
DramExtension(const Thread &thread, const Bank &bank,
|
||||
const BankGroup &bankgroup, const Row &row, const Column &column,
|
||||
unsigned int burstlength = 0);
|
||||
unsigned int burstlength, unsigned int payloadID);
|
||||
DramExtension(const Thread &thread, const Channel &channel, const Bank &bank,
|
||||
const BankGroup &bankgroup, const Row &row,
|
||||
const Column &column, unsigned int burstlength = 0);
|
||||
const Column &column, unsigned int burstlength, unsigned int payloadID);
|
||||
|
||||
virtual tlm_extension_base *clone() const;
|
||||
virtual void copy_from(const tlm_extension_base &ext);
|
||||
@@ -171,6 +171,8 @@ public:
|
||||
static Thread getThread(const tlm::tlm_generic_payload &payload);
|
||||
static Row getRow(const tlm::tlm_generic_payload *payload);
|
||||
static Row getRow(const tlm::tlm_generic_payload &payload);
|
||||
static unsigned int getPayloadID(const tlm::tlm_generic_payload *payload);
|
||||
static unsigned int getPayloadID(const tlm::tlm_generic_payload &payload);
|
||||
|
||||
Thread getThread() const;
|
||||
Channel getChannel() const;
|
||||
@@ -180,6 +182,7 @@ public:
|
||||
Column getColumn() const;
|
||||
|
||||
unsigned int getBurstlength() const;
|
||||
unsigned int getPayloadID() const;
|
||||
void incrementRow();
|
||||
|
||||
private:
|
||||
@@ -190,6 +193,7 @@ private:
|
||||
Row row;
|
||||
Column column;
|
||||
unsigned int burstlength;
|
||||
unsigned int payloadID;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -245,10 +245,10 @@ void setUpDummy(tlm::tlm_generic_payload &payload, Bank &bank)
|
||||
payload.set_dmi_allowed(false);
|
||||
payload.set_byte_enable_length(0);
|
||||
payload.set_streaming_width(0);
|
||||
payload.set_extension(new DramExtension(Thread(
|
||||
Controller::ControllerThreadId()), bank, BankGroup(0), Row(0),
|
||||
Column(0))); //payload takes ownership
|
||||
//TODO .. Dummies muessen noch banggruppe und rank sauber bekommen .. noch was ueberlegen!!!
|
||||
payload.set_extension(new DramExtension(Thread(Controller::ControllerThreadId()),
|
||||
bank, BankGroup(0), Row(0), Column(0), 0, 0));
|
||||
// payload takes ownership
|
||||
// TODO: Dummies muessen noch banggruppe und rank sauber bekommen .. noch was ueberlegen!!!
|
||||
}
|
||||
|
||||
std::string getFileName(std::string uri)
|
||||
|
||||
@@ -23,7 +23,7 @@ tlm_generic_payload *BankMachine::getNextStateAndResult()
|
||||
return payloadToReturn;
|
||||
}
|
||||
|
||||
void BankMachine::startBankMachine()
|
||||
void BankMachine::startBankMachine() // TODO: return delay, do not trigger event inside
|
||||
{
|
||||
if (currentPayload == nullptr)
|
||||
{
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
#include "CommandMux.h"
|
||||
|
||||
void CommandMux::insertPayload(tlm_generic_payload *payload)
|
||||
{
|
||||
payloadOrder.push(payload);
|
||||
}
|
||||
#include "../common/dramExtensions.h"
|
||||
|
||||
std::pair<Command, tlm_generic_payload *>
|
||||
CommandMux::selectCommand(std::vector<std::pair<Command, tlm_generic_payload *>> &readyCommands)
|
||||
@@ -17,9 +13,9 @@ CommandMux::selectCommand(std::vector<std::pair<Command, tlm_generic_payload *>>
|
||||
{
|
||||
if (it.first == Command::RD || it.first == Command::WR)
|
||||
{
|
||||
if (it.second == payloadOrder.front())
|
||||
if (DramExtension::getPayloadID(it.second) == nextPayloadID)
|
||||
{
|
||||
payloadOrder.pop();
|
||||
nextPayloadID++;
|
||||
return it;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,10 +13,10 @@ using namespace tlm;
|
||||
class CommandMux
|
||||
{
|
||||
public:
|
||||
void insertPayload(tlm_generic_payload *);
|
||||
std::pair<Command, tlm_generic_payload *> selectCommand(std::vector<std::pair<Command, tlm_generic_payload *>> &);
|
||||
|
||||
private:
|
||||
std::queue<tlm_generic_payload *> payloadOrder;
|
||||
unsigned nextPayloadID = 0;
|
||||
};
|
||||
|
||||
#endif // COMMANDMUX_H
|
||||
|
||||
@@ -97,11 +97,12 @@ void ControllerNew::recordPhase(tlm_generic_payload &trans, tlm_phase phase, sc_
|
||||
unsigned int bank = DramExtension::getExtension(trans).getBank().ID();
|
||||
unsigned int row = DramExtension::getExtension(trans).getRow().ID();
|
||||
unsigned int col = DramExtension::getExtension(trans).getColumn().ID();
|
||||
unsigned int id = DramExtension::getExtension(trans).getPayloadID();
|
||||
|
||||
printDebugMessage("Recording " + phaseNameToString(phase) + " thread " +
|
||||
to_string(thr) + " channel " + to_string(ch) + " bank group " + to_string(
|
||||
bg) + " bank " + to_string(bank) + " row " + to_string(row) + " column " +
|
||||
to_string(col) + " at " + recTime.to_string());
|
||||
to_string(col) + " id " + to_string(id) + " at " + recTime.to_string());
|
||||
|
||||
tlmRecorder->recordPhase(trans, phase, recTime);
|
||||
}
|
||||
@@ -125,7 +126,7 @@ void ControllerNew::controllerMethod()
|
||||
{
|
||||
lastTimeCalled = sc_time_stamp();
|
||||
// Release payload if arbiter has accepted the result
|
||||
if (sc_time_stamp() == timeToRelease && payloadToRelease != nullptr)
|
||||
if (sc_time_stamp() == timeToRelease /*&& payloadToRelease != nullptr*/)
|
||||
releasePayload();
|
||||
// Accept new request from arbiter
|
||||
if (sc_time_stamp() >= timeToAcquire && payloadToAcquire != nullptr)
|
||||
@@ -169,24 +170,23 @@ void ControllerNew::controllerMethod()
|
||||
|
||||
void ControllerNew::releasePayload()
|
||||
{
|
||||
unsigned id = DramExtension::getPayloadID(payloadToRelease);
|
||||
responseQueue.pop();
|
||||
payloadToRelease->release();
|
||||
payloadToRelease = nullptr;
|
||||
numberOfPayloads--;
|
||||
// TODO: insert payload ID
|
||||
printDebugMessage("Payload ID left system.");
|
||||
printDebugMessage("Payload " + std::to_string(id) + " left system.");
|
||||
}
|
||||
|
||||
void ControllerNew::acquirePayload()
|
||||
{
|
||||
if (numberOfPayloads < Configuration::getInstance().MaxNrOfTransactions)
|
||||
{
|
||||
unsigned id = DramExtension::getPayloadID(payloadToAcquire);
|
||||
payloadToAcquire->acquire();
|
||||
scheduler->storeRequest(payloadToAcquire);
|
||||
commandMux->insertPayload(payloadToAcquire);
|
||||
numberOfPayloads++;
|
||||
// TODO: insert payload ID
|
||||
printDebugMessage("Payload ID entered system.");
|
||||
printDebugMessage("Payload " + std::to_string(id) + " entered system.");
|
||||
payloadToAcquire->set_response_status(TLM_OK_RESPONSE);
|
||||
tlm_phase tPhase = END_REQ;
|
||||
sc_time tDelay = SC_ZERO_TIME;
|
||||
|
||||
@@ -51,6 +51,7 @@ Arbiter::Arbiter(sc_module_name /*name*/) : payloadEventQueue(this, &Arbiter::pe
|
||||
{
|
||||
channelIsFree.push_back(true);
|
||||
pendingRequests.push_back(queue<tlm_generic_payload *>());
|
||||
nextPayloadID.push_back(0);
|
||||
}
|
||||
|
||||
// One or more devices can accesss all the memory units through the arbiter.
|
||||
@@ -214,10 +215,10 @@ void Arbiter::appendDramExtension(int socketId, tlm_generic_payload &payload)
|
||||
DecodedAddress decodedAddress = AddressDecoder::getInstance().decodeAddress(payload.get_address());
|
||||
// Check the valid range of decodedAddress
|
||||
if (addressIsValid(decodedAddress)) {
|
||||
DramExtension *extension = new DramExtension(Thread(socketId),
|
||||
Channel(decodedAddress.channel), Bank(decodedAddress.bank),
|
||||
BankGroup(decodedAddress.bankgroup), Row(decodedAddress.row),
|
||||
Column(decodedAddress.column), burstlength);
|
||||
DramExtension *extension = new DramExtension(Thread(socketId), Channel(decodedAddress.channel),
|
||||
Bank(decodedAddress.bank), BankGroup(decodedAddress.bankgroup),
|
||||
Row(decodedAddress.row), Column(decodedAddress.column),
|
||||
burstlength, nextPayloadID[decodedAddress.channel]++);
|
||||
payload.set_auto_extension(extension);
|
||||
} else {
|
||||
SC_REPORT_FATAL("Arbiter", "Decoded Address is not inside the valid range");
|
||||
|
||||
@@ -96,6 +96,7 @@ private:
|
||||
const tlm_phase &phase, const sc_time &delay);
|
||||
|
||||
void appendDramExtension(int socketId, tlm_generic_payload &payload);
|
||||
std::vector<unsigned int> nextPayloadID;
|
||||
|
||||
bool addressIsValid(DecodedAddress &decodedAddress);
|
||||
|
||||
|
||||
@@ -109,7 +109,7 @@ protected:
|
||||
DramExtension *extension = new DramExtension(Thread(socketId + 1),
|
||||
Channel(decodedAddress.channel), Bank(decodedAddress.bank),
|
||||
BankGroup(decodedAddress.bankgroup), Row(decodedAddress.row),
|
||||
Column(decodedAddress.column), burstlength);
|
||||
Column(decodedAddress.column), burstlength, 0);
|
||||
payload.set_auto_extension(extension);
|
||||
} else {
|
||||
SC_REPORT_FATAL("Arbiter", "Decoded Address are not inside the valid range");
|
||||
|
||||
Reference in New Issue
Block a user