From 3f913b5c16787c79dfb0b3a15e372bcc6b3ca290 Mon Sep 17 00:00:00 2001 From: "Lukas Steiner (2)" Date: Fri, 26 Jul 2019 15:48:58 +0200 Subject: [PATCH] Arbiter now assigns each payload an ID for transaction order decision in CommandMux. --- DRAMSys/DRAMSys.pro | 4 +-- DRAMSys/library/src/common/dramExtensions.cpp | 33 ++++++++++++------- DRAMSys/library/src/common/dramExtensions.h | 8 +++-- DRAMSys/library/src/common/utils.cpp | 8 ++--- .../library/src/controller/BankMachine.cpp | 2 +- DRAMSys/library/src/controller/CommandMux.cpp | 10 ++---- DRAMSys/library/src/controller/CommandMux.h | 4 +-- .../library/src/controller/ControllerNew.cpp | 14 ++++---- DRAMSys/library/src/simulation/Arbiter.cpp | 9 ++--- DRAMSys/library/src/simulation/Arbiter.h | 1 + DRAMSys/library/src/simulation/IArbiter.h | 2 +- 11 files changed, 53 insertions(+), 42 deletions(-) diff --git a/DRAMSys/DRAMSys.pro b/DRAMSys/DRAMSys.pro index d4a5e29e..6070fb7b 100644 --- a/DRAMSys/DRAMSys.pro +++ b/DRAMSys/DRAMSys.pro @@ -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 diff --git a/DRAMSys/library/src/common/dramExtensions.cpp b/DRAMSys/library/src/common/dramExtensions.cpp index ed1d0b0d..18ae9a40 100644 --- a/DRAMSys/library/src/common/dramExtensions.cpp +++ b/DRAMSys/library/src/common/dramExtensions.cpp @@ -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; diff --git a/DRAMSys/library/src/common/dramExtensions.h b/DRAMSys/library/src/common/dramExtensions.h index 3a4b1a51..4491f3ca 100644 --- a/DRAMSys/library/src/common/dramExtensions.h +++ b/DRAMSys/library/src/common/dramExtensions.h @@ -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; }; diff --git a/DRAMSys/library/src/common/utils.cpp b/DRAMSys/library/src/common/utils.cpp index 69c6f899..f80d2af9 100644 --- a/DRAMSys/library/src/common/utils.cpp +++ b/DRAMSys/library/src/common/utils.cpp @@ -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) diff --git a/DRAMSys/library/src/controller/BankMachine.cpp b/DRAMSys/library/src/controller/BankMachine.cpp index fe6606b0..fac96d37 100644 --- a/DRAMSys/library/src/controller/BankMachine.cpp +++ b/DRAMSys/library/src/controller/BankMachine.cpp @@ -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) { diff --git a/DRAMSys/library/src/controller/CommandMux.cpp b/DRAMSys/library/src/controller/CommandMux.cpp index 866e38a7..3a075e4c 100644 --- a/DRAMSys/library/src/controller/CommandMux.cpp +++ b/DRAMSys/library/src/controller/CommandMux.cpp @@ -1,9 +1,5 @@ #include "CommandMux.h" - -void CommandMux::insertPayload(tlm_generic_payload *payload) -{ - payloadOrder.push(payload); -} +#include "../common/dramExtensions.h" std::pair CommandMux::selectCommand(std::vector> &readyCommands) @@ -17,9 +13,9 @@ CommandMux::selectCommand(std::vector> { 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; } } diff --git a/DRAMSys/library/src/controller/CommandMux.h b/DRAMSys/library/src/controller/CommandMux.h index 67cb4f79..9f071a8e 100644 --- a/DRAMSys/library/src/controller/CommandMux.h +++ b/DRAMSys/library/src/controller/CommandMux.h @@ -13,10 +13,10 @@ using namespace tlm; class CommandMux { public: - void insertPayload(tlm_generic_payload *); std::pair selectCommand(std::vector> &); + private: - std::queue payloadOrder; + unsigned nextPayloadID = 0; }; #endif // COMMANDMUX_H diff --git a/DRAMSys/library/src/controller/ControllerNew.cpp b/DRAMSys/library/src/controller/ControllerNew.cpp index 1e99b479..39f5a184 100644 --- a/DRAMSys/library/src/controller/ControllerNew.cpp +++ b/DRAMSys/library/src/controller/ControllerNew.cpp @@ -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; diff --git a/DRAMSys/library/src/simulation/Arbiter.cpp b/DRAMSys/library/src/simulation/Arbiter.cpp index c68927f8..1c1074a2 100644 --- a/DRAMSys/library/src/simulation/Arbiter.cpp +++ b/DRAMSys/library/src/simulation/Arbiter.cpp @@ -51,6 +51,7 @@ Arbiter::Arbiter(sc_module_name /*name*/) : payloadEventQueue(this, &Arbiter::pe { channelIsFree.push_back(true); pendingRequests.push_back(queue()); + 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"); diff --git a/DRAMSys/library/src/simulation/Arbiter.h b/DRAMSys/library/src/simulation/Arbiter.h index 672862c8..206cd605 100644 --- a/DRAMSys/library/src/simulation/Arbiter.h +++ b/DRAMSys/library/src/simulation/Arbiter.h @@ -96,6 +96,7 @@ private: const tlm_phase &phase, const sc_time &delay); void appendDramExtension(int socketId, tlm_generic_payload &payload); + std::vector nextPayloadID; bool addressIsValid(DecodedAddress &decodedAddress); diff --git a/DRAMSys/library/src/simulation/IArbiter.h b/DRAMSys/library/src/simulation/IArbiter.h index 872fd929..a9c5ebd4 100644 --- a/DRAMSys/library/src/simulation/IArbiter.h +++ b/DRAMSys/library/src/simulation/IArbiter.h @@ -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");