diff --git a/DRAMSys/library/src/common/dramExtensions.cpp b/DRAMSys/library/src/common/dramExtensions.cpp index cce8f853..399d1b2f 100644 --- a/DRAMSys/library/src/common/dramExtensions.cpp +++ b/DRAMSys/library/src/common/dramExtensions.cpp @@ -42,22 +42,21 @@ using namespace tlm; - DramExtension::DramExtension() : - thread(0), channel(0), bank(0), bankgroup(0), + thread(0), channel(0), rank(0), bankgroup(0), bank(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, +DramExtension::DramExtension(const Thread &thread, const Rank &rank, const BankGroup &bankgroup, + const Bank &bank, const Row &row, const Column &column, unsigned int burstlength, uint64_t payloadID) : - thread(thread), channel(0), bank(bank), bankgroup(bankgroup), row(row), - column(column), burstlength(burstlength), payloadID(payloadID) {} + thread(thread), channel(0), rank(rank), bankgroup(bankgroup), bank(bank), + row(row), column(column), burstlength(burstlength), payloadID(payloadID) {} -DramExtension::DramExtension(const Thread &thread, const Channel &channel, - const Bank &bank, const BankGroup &bankgroup, const Row &row, +DramExtension::DramExtension(const Thread &thread, const Channel &channel, const Rank &rank, + const BankGroup &bankgroup, const Bank &bank, const Row &row, const Column &column, unsigned int burstlength, uint64_t payloadID) : - thread(thread), channel(channel), bank(bank), bankgroup(bankgroup), row(row), - column(column), burstlength(burstlength), payloadID(payloadID) {} + thread(thread), channel(channel), rank(rank), bankgroup(bankgroup), bank(bank), + row(row), column(column), burstlength(burstlength), payloadID(payloadID) {} DramExtension &DramExtension::getExtension(const tlm_generic_payload *payload) { @@ -73,14 +72,14 @@ DramExtension &DramExtension::getExtension(const tlm_generic_payload &payload) return DramExtension::getExtension(&payload); } -Bank DramExtension::getBank(const tlm_generic_payload *payload) +Thread DramExtension::getThread(const tlm_generic_payload *payload) { - return DramExtension::getExtension(payload).getBank(); + return DramExtension::getExtension(payload).getThread(); } -Bank DramExtension::getBank(const tlm_generic_payload &payload) +Thread DramExtension::getThread(const tlm_generic_payload &payload) { - return DramExtension::getBank(&payload); + return DramExtension::getThread(&payload); } Channel DramExtension::getChannel(const tlm_generic_payload *payload) @@ -93,14 +92,34 @@ Channel DramExtension::getChannel(const tlm_generic_payload &payload) return DramExtension::getChannel(&payload); } -Thread DramExtension::getThread(const tlm_generic_payload *payload) +Rank DramExtension::getRank(const tlm_generic_payload *payload) { - return DramExtension::getExtension(payload).getThread(); + return DramExtension::getExtension(payload).getRank(); } -Thread DramExtension::getThread(const tlm_generic_payload &payload) +Rank DramExtension::getRank(const tlm_generic_payload &payload) { - return DramExtension::getThread(&payload); + return DramExtension::getRank(&payload); +} + +BankGroup DramExtension::getBankGroup(const tlm_generic_payload *payload) +{ + return DramExtension::getExtension(payload).getBankGroup(); +} + +BankGroup DramExtension::getBankGroup(const tlm_generic_payload &payload) +{ + return DramExtension::getBankGroup(&payload); +} + +Bank DramExtension::getBank(const tlm_generic_payload *payload) +{ + return DramExtension::getExtension(payload).getBank(); +} + +Bank DramExtension::getBank(const tlm_generic_payload &payload) +{ + return DramExtension::getBank(&payload); } Row DramExtension::getRow(const tlm_generic_payload *payload) @@ -113,6 +132,16 @@ Row DramExtension::getRow(const tlm_generic_payload &payload) return DramExtension::getRow(&payload); } +Column DramExtension::getColumn(const tlm_generic_payload *payload) +{ + return DramExtension::getExtension(payload).getColumn(); +} + +Column DramExtension::getColumn(const tlm_generic_payload &payload) +{ + return DramExtension::getColumn(&payload); +} + uint64_t DramExtension::getPayloadID(const tlm_generic_payload *payload) { return DramExtension::getExtension(payload).getPayloadID(); @@ -125,15 +154,17 @@ uint64_t DramExtension::getPayloadID(const tlm_generic_payload &payload) tlm_extension_base *DramExtension::clone() const { - return new DramExtension(thread, bank, bankgroup, row, column, burstlength, payloadID); + return new DramExtension(thread, channel, rank, bankgroup, bank, row, column, burstlength, payloadID); } void DramExtension::copy_from(const tlm_extension_base &ext) { const DramExtension &cpyFrom = static_cast(ext); thread = cpyFrom.thread; - bank = cpyFrom.bank; + channel = cpyFrom.channel; + rank = cpyFrom.rank; bankgroup = cpyFrom.bankgroup; + bank = cpyFrom.bank; row = cpyFrom.row; column = cpyFrom.column; burstlength = cpyFrom.burstlength; @@ -149,9 +180,9 @@ Channel DramExtension::getChannel() const return channel; } -Bank DramExtension::getBank() const +Rank DramExtension::getRank() const { - return bank; + return rank; } BankGroup DramExtension::getBankGroup() const @@ -159,6 +190,11 @@ BankGroup DramExtension::getBankGroup() const return bankgroup; } +Bank DramExtension::getBank() const +{ + return bank; +} + Row DramExtension::getRow() const { return row; @@ -191,14 +227,12 @@ tlm_extension_base *GenerationExtension::clone() const void GenerationExtension::copy_from(const tlm_extension_base &ext) { - const GenerationExtension &cpyFrom = static_cast - (ext); + const GenerationExtension &cpyFrom = static_cast(ext); timeOfGeneration = cpyFrom.timeOfGeneration; } -GenerationExtension &GenerationExtension::getExtension(const - tlm::tlm_generic_payload *payload) +GenerationExtension &GenerationExtension::getExtension(const tlm_generic_payload *payload) { GenerationExtension *result = NULL; payload->get_extension(result); @@ -206,14 +240,12 @@ GenerationExtension &GenerationExtension::getExtension(const return *result; } -sc_time GenerationExtension::getTimeOfGeneration(const tlm::tlm_generic_payload - *payload) +sc_time GenerationExtension::getTimeOfGeneration(const tlm_generic_payload *payload) { return GenerationExtension::getExtension(payload).TimeOfGeneration(); } -sc_time GenerationExtension::getTimeOfGeneration(const tlm::tlm_generic_payload - &payload) +sc_time GenerationExtension::getTimeOfGeneration(const tlm_generic_payload &payload) { return GenerationExtension::getTimeOfGeneration(&payload); } @@ -245,6 +277,16 @@ bool operator !=(const Channel &lhs, const Channel &rhs) return !(lhs == rhs); } +//RANK +bool operator ==(const Rank &lhs, const Rank &rhs) +{ + return lhs.ID() == rhs.ID(); +} + +bool operator !=(const Rank &lhs, const Rank &rhs) +{ + return !(lhs == rhs); +} //BANKGROUP bool operator ==(const BankGroup &lhs, const BankGroup &rhs) diff --git a/DRAMSys/library/src/common/dramExtensions.h b/DRAMSys/library/src/common/dramExtensions.h index aa3a176b..0bb74af1 100644 --- a/DRAMSys/library/src/common/dramExtensions.h +++ b/DRAMSys/library/src/common/dramExtensions.h @@ -41,6 +41,8 @@ #include #include +using namespace tlm; + class Thread { public: @@ -69,6 +71,20 @@ private: unsigned int id; }; +class Rank +{ +public: + explicit Rank(unsigned int id) : id(id) {} + + unsigned int ID() const + { + return id; + } + +private: + unsigned int id; +}; + class BankGroup { public: @@ -145,39 +161,46 @@ private: }; -class DramExtension : public tlm::tlm_extension +class DramExtension : public tlm_extension { public: DramExtension(); - DramExtension(const Thread &thread, const Bank &bank, - const BankGroup &bankgroup, const Row &row, const Column &column, + DramExtension(const Thread &thread, const Rank &rank, const BankGroup &bankgroup, + const Bank &bank, const Row &row, const Column &column, unsigned int burstlength, uint64_t payloadID); - DramExtension(const Thread &thread, const Channel &channel, const Bank &bank, - const BankGroup &bankgroup, const Row &row, + DramExtension(const Thread &thread, const Channel &channel, const Rank &rank, + const BankGroup &bankgroup, const Bank &bank, const Row &row, const Column &column, unsigned int burstlength, uint64_t payloadID); virtual tlm_extension_base *clone() const; virtual void copy_from(const tlm_extension_base &ext); - static DramExtension &getExtension(const tlm::tlm_generic_payload *payload); - static DramExtension &getExtension(const tlm::tlm_generic_payload &payload); + static DramExtension &getExtension(const tlm_generic_payload *payload); + static DramExtension &getExtension(const tlm_generic_payload &payload); // Used for convience, caller could also use getExtension(..) to access these field - static Bank getBank(const tlm::tlm_generic_payload *payload); - static Bank getBank(const tlm::tlm_generic_payload &payload); - static Channel getChannel(const tlm::tlm_generic_payload *payload); - static Channel getChannel(const tlm::tlm_generic_payload &payload); - static Thread getThread(const tlm::tlm_generic_payload *payload); - 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 uint64_t getPayloadID(const tlm::tlm_generic_payload *payload); - static uint64_t getPayloadID(const tlm::tlm_generic_payload &payload); + static Thread getThread(const tlm_generic_payload *payload); + static Thread getThread(const tlm_generic_payload &payload); + static Channel getChannel(const tlm_generic_payload *payload); + static Channel getChannel(const tlm_generic_payload &payload); + static Rank getRank(const tlm_generic_payload *payload); + static Rank getRank(const tlm_generic_payload &payload); + static BankGroup getBankGroup(const tlm_generic_payload *payload); + static BankGroup getBankGroup(const tlm_generic_payload &payload); + static Bank getBank(const tlm_generic_payload *payload); + static Bank getBank(const tlm_generic_payload &payload); + static Row getRow(const tlm_generic_payload *payload); + static Row getRow(const tlm_generic_payload &payload); + static Column getColumn(const tlm_generic_payload *payload); + static Column getColumn(const tlm_generic_payload &payload); + static uint64_t getPayloadID(const tlm_generic_payload *payload); + static uint64_t getPayloadID(const tlm_generic_payload &payload); Thread getThread() const; Channel getChannel() const; - Bank getBank() const; + Rank getRank() const; BankGroup getBankGroup() const; + Bank getBank() const; Row getRow() const; Column getColumn() const; @@ -188,8 +211,9 @@ public: private: Thread thread; Channel channel; - Bank bank; + Rank rank; BankGroup bankgroup; + Bank bank; Row row; Column column; unsigned int burstlength; @@ -200,21 +224,21 @@ private: // Used to indicate the time when a payload is created (in a traceplayer or in a core) // Note that this time can be different from the time the payload enters the DRAM system //(at that time the phase BEGIN_REQ is recorded), so timeOfGeneration =< time(BEGIN_REQ) -class GenerationExtension : public tlm::tlm_extension +class GenerationExtension : public tlm_extension { public: - GenerationExtension(sc_time timeOfGeneration) : timeOfGeneration( - timeOfGeneration) {} + GenerationExtension(sc_time timeOfGeneration) + : timeOfGeneration(timeOfGeneration) {} virtual tlm_extension_base *clone() const; virtual void copy_from(const tlm_extension_base &ext); - static GenerationExtension &getExtension(const tlm::tlm_generic_payload - *payload); + static GenerationExtension + &getExtension(const tlm_generic_payload *payload); sc_time TimeOfGeneration() const { return timeOfGeneration; } - static sc_time getTimeOfGeneration(const tlm::tlm_generic_payload *payload); - static sc_time getTimeOfGeneration(const tlm::tlm_generic_payload &payload); + static sc_time getTimeOfGeneration(const tlm_generic_payload *payload); + static sc_time getTimeOfGeneration(const tlm_generic_payload &payload); private: sc_time timeOfGeneration; @@ -228,6 +252,9 @@ bool operator<(const Thread &lhs, const Thread &rhs); bool operator==(const Channel &lhs, const Channel &rhs); bool operator!=(const Channel &lhs, const Channel &rhs); +bool operator==(const Rank &lhs, const Rank &rhs); +bool operator!=(const Rank &lhs, const Rank &rhs); + bool operator==(const BankGroup &lhs, const BankGroup &rhs); bool operator!=(const BankGroup &lhs, const BankGroup &rhs); diff --git a/DRAMSys/library/src/common/utils.cpp b/DRAMSys/library/src/common/utils.cpp index 4f7c1489..af4890f0 100644 --- a/DRAMSys/library/src/common/utils.cpp +++ b/DRAMSys/library/src/common/utils.cpp @@ -43,6 +43,7 @@ using namespace std; using namespace tinyxml2; +using namespace tlm; bool TimeInterval::timeIsInInterval(sc_time time) { @@ -68,7 +69,7 @@ void reportFatal(std::string sender, std::string message) SC_REPORT_FATAL(sender.c_str(), message.c_str()); } -std::string phaseNameToString(tlm::tlm_phase phase) +std::string phaseNameToString(tlm_phase phase) { std::ostringstream oss; oss << phase; @@ -235,17 +236,17 @@ string loadTextFileContents(string filename) } } -void setUpDummy(tlm::tlm_generic_payload &payload, Bank bank) +void setUpDummy(tlm_generic_payload &payload, Rank rank, Bank bank) { payload.set_address(bank.getStartAddress()); - payload.set_command(tlm::TLM_READ_COMMAND); + payload.set_command(TLM_READ_COMMAND); payload.set_data_length(0); - payload.set_response_status(tlm::TLM_OK_RESPONSE); + payload.set_response_status(TLM_OK_RESPONSE); payload.set_dmi_allowed(false); payload.set_byte_enable_length(0); payload.set_streaming_width(0); - payload.set_extension(new DramExtension(Thread(UINT_MAX), bank, BankGroup(0), - Row(0), Column(0), 0, 0)); + payload.set_extension(new DramExtension(Thread(UINT_MAX), rank, BankGroup(0), + bank, Row(0), Column(0), 0, 0)); // payload takes ownership // TODO: Dummies muessen noch banggruppe und rank sauber bekommen .. noch was ueberlegen!!! } diff --git a/DRAMSys/library/src/common/utils.h b/DRAMSys/library/src/common/utils.h index d856c96e..003c6829 100644 --- a/DRAMSys/library/src/common/utils.h +++ b/DRAMSys/library/src/common/utils.h @@ -146,7 +146,7 @@ std::string queryStringParameter(tinyxml2::XMLElement *node, std::string name); bool queryBoolParameter(tinyxml2::XMLElement *node, std::string name); double queryDoubleParameter(tinyxml2::XMLElement *node, std::string name); -void setUpDummy(tlm::tlm_generic_payload &payload, Bank bank = Bank(0)); +void setUpDummy(tlm::tlm_generic_payload &payload, Rank rank = Rank(0), Bank bank = Bank(0)); #endif // UTILS_H diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp index 113e07d0..0a5c0d7d 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerBankwise.cpp @@ -41,14 +41,14 @@ RefreshManagerBankwise::RefreshManagerBankwise(std::map &ba : bankMachines(bankMachines) { memSpec = Configuration::getInstance().memSpec; - + // TODO: implement for multiple ranks sc_time currentREFB = memSpec->tREFI - memSpec->clk * (memSpec->NumberOfBanks - 1); sc_time currentPRE = currentREFB - std::max(memSpec->clk * memSpec->NumberOfBanks, memSpec->tRP); timeForNextTrigger = currentPRE; for (unsigned bankID = 0; bankID < memSpec->NumberOfBanks; bankID++) { states[Bank(bankID)] = RmState::IDLE; - setUpDummy(refreshPayloads[Bank(bankID)], Bank(bankID)); + setUpDummy(refreshPayloads[Bank(bankID)], Rank(0), Bank(bankID)); triggerTimes.insert(std::pair(currentREFB, Bank(bankID))); triggerTimes.insert(std::pair(currentPRE, Bank(bankID))); currentREFB += memSpec->clk; diff --git a/DRAMSys/library/src/simulation/Arbiter.cpp b/DRAMSys/library/src/simulation/Arbiter.cpp index a5543332..62c7642a 100644 --- a/DRAMSys/library/src/simulation/Arbiter.cpp +++ b/DRAMSys/library/src/simulation/Arbiter.cpp @@ -216,8 +216,9 @@ 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), + DramExtension *extension = new DramExtension(Thread(socketId), + Channel(decodedAddress.channel), Rank(decodedAddress.rank), + BankGroup(decodedAddress.bankgroup), Bank(decodedAddress.bank), Row(decodedAddress.row), Column(decodedAddress.column), burstlength, nextPayloadID[decodedAddress.channel]++); payload.set_auto_extension(extension); @@ -226,7 +227,7 @@ void Arbiter::appendDramExtension(int socketId, tlm_generic_payload &payload) } } -bool Arbiter::addressIsValid(DecodedAddress &decodedAddress) +bool Arbiter::addressIsValid(DecodedAddress &decodedAddress) { if (decodedAddress.channel >= AddressDecoder::getInstance().amount["channel"]) { return false;