diff --git a/configs/addressmapping/am_hbm3_8Gb_pc_brc.json b/configs/addressmapping/am_hbm3_8Gb_pc_brc.json index de2b3b26..4299c781 100644 --- a/configs/addressmapping/am_hbm3_8Gb_pc_brc.json +++ b/configs/addressmapping/am_hbm3_8Gb_pc_brc.json @@ -1,5 +1,8 @@ { "addressmapping": { + "STACK_BIT":[ + 30 + ], "PSEUDOCHANNEL_BIT":[ 29 ], diff --git a/configs/hbm3-example.json b/configs/hbm3-example.json index 4d3505b8..019ad37f 100644 --- a/configs/hbm3-example.json +++ b/configs/hbm3-example.json @@ -7,8 +7,12 @@ "simulationid": "hbm3-example", "tracesetup": [ { - "clkMhz": 1000, - "name": "example.stl" + "clkMhz": 2000, + "type": "generator", + "name": "gen0", + "numRequests": 2000, + "rwRatio": 0.5, + "addressDistribution": "random" } ] } diff --git a/configs/memspec/HBM3.json b/configs/memspec/HBM3.json index a550c49d..10519dc9 100644 --- a/configs/memspec/HBM3.json +++ b/configs/memspec/HBM3.json @@ -7,6 +7,7 @@ "nbrOfBanks": 16, "nbrOfColumns": 128, "nbrOfPseudoChannels": 2, + "nbrOfStacks": 2, "nbrOfRows": 65536, "width": 32, "nbrOfDevices": 1, @@ -20,6 +21,7 @@ "memtimingspec": { "CCDL": 4, "CCDS": 2, + "CCDR": 3, "CKE": 8, "DQSCK": 1, "FAW": 16, diff --git a/extensions/standards/HBM3/DRAMSys/configuration/memspec/MemSpecHBM3.cpp b/extensions/standards/HBM3/DRAMSys/configuration/memspec/MemSpecHBM3.cpp index 3ec5431b..78199622 100644 --- a/extensions/standards/HBM3/DRAMSys/configuration/memspec/MemSpecHBM3.cpp +++ b/extensions/standards/HBM3/DRAMSys/configuration/memspec/MemSpecHBM3.cpp @@ -58,6 +58,7 @@ MemSpecHBM3::MemSpecHBM3(const Config::MemSpec& memSpec) : memSpec.memarchitecturespec.entries.at("nbrOfBankGroups") * memSpec.memarchitecturespec.entries.at("nbrOfPseudoChannels"), memSpec.memarchitecturespec.entries.at("nbrOfDevices")), + stacksPerChannel(memSpec.memarchitecturespec.entries.at("nbrOfStacks")), RAAIMT(memSpec.memarchitecturespec.entries.at("RAAIMT")), RAAMMT(memSpec.memarchitecturespec.entries.at("RAAMMT")), RAADEC(memSpec.memarchitecturespec.entries.at("RAADEC")), @@ -77,6 +78,7 @@ MemSpecHBM3::MemSpecHBM3(const Config::MemSpec& memSpec) : tWR(tCK * memSpec.memtimingspec.entries.at("WR")), tCCDL(tCK * memSpec.memtimingspec.entries.at("CCDL")), tCCDS(tCK * memSpec.memtimingspec.entries.at("CCDS")), + tCCDR(tCK * memSpec.memtimingspec.entries.at("CCDR")), tWTRL(tCK * memSpec.memtimingspec.entries.at("WTRL")), tWTRS(tCK * memSpec.memtimingspec.entries.at("WTRS")), tRTW(tCK * memSpec.memtimingspec.entries.at("RTW")), diff --git a/extensions/standards/HBM3/DRAMSys/configuration/memspec/MemSpecHBM3.h b/extensions/standards/HBM3/DRAMSys/configuration/memspec/MemSpecHBM3.h index 41e3cb62..d8aa459b 100644 --- a/extensions/standards/HBM3/DRAMSys/configuration/memspec/MemSpecHBM3.h +++ b/extensions/standards/HBM3/DRAMSys/configuration/memspec/MemSpecHBM3.h @@ -48,6 +48,8 @@ class MemSpecHBM3 final : public MemSpec public: explicit MemSpecHBM3(const Config::MemSpec& memSpec); + const unsigned stacksPerChannel; + const unsigned RAAIMT; const unsigned RAAMMT; const unsigned RAADEC; @@ -70,7 +72,7 @@ public: const sc_core::sc_time tWR; const sc_core::sc_time tCCDL; const sc_core::sc_time tCCDS; - // sc_time tCCDR; // TODO: consecutive reads to different stack IDs + const sc_core::sc_time tCCDR; const sc_core::sc_time tWTRL; const sc_core::sc_time tWTRS; const sc_core::sc_time tRTW; diff --git a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp index 3a0a5204..da454759 100644 --- a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp +++ b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp @@ -52,6 +52,7 @@ CheckerHBM3::CheckerHBM3(const MemSpecHBM3& memSpec) : memSpec(memSpec) nextCommandByBank.fill({BankVector(memSpec.banksPerChannel, SC_ZERO_TIME)}); nextCommandByBankGroup.fill({BankGroupVector(memSpec.bankGroupsPerChannel, SC_ZERO_TIME)}); nextCommandByRank.fill({RankVector(memSpec.ranksPerChannel, SC_ZERO_TIME)}); + nextCommandByStack.fill({StackVector(memSpec.stacksPerChannel, SC_ZERO_TIME)}); last4ActivatesOnRank = RankVector>(memSpec.ranksPerChannel); tRDPDE = ((memSpec.tRL + memSpec.tPL) + (memSpec.tCK * 2)); @@ -70,6 +71,7 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic Bank bank = ControllerExtension::getBank(payload); BankGroup bankGroup = ControllerExtension::getBankGroup(payload); Rank rank = ControllerExtension::getRank(payload); + Stack stack = ControllerExtension::getStack(payload); sc_time earliestTimeToStart = sc_time_stamp(); @@ -78,6 +80,7 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic earliestTimeToStart = std::max(earliestTimeToStart, nextCommandByBank[command][bank]); earliestTimeToStart = std::max(earliestTimeToStart, nextCommandByBankGroup[command][bankGroup]); earliestTimeToStart = std::max(earliestTimeToStart, nextCommandByRank[command][rank]); + earliestTimeToStart = std::max(earliestTimeToStart, nextCommandByStack[command][stack]); if (command.isRasCommand()) { earliestTimeToStart = std::max(earliestTimeToStart, nextCommandOnRasBus); @@ -99,6 +102,7 @@ void CheckerHBM3::insert(Command command, const tlm_generic_payload& payload) const Bank bank = ControllerExtension::getBank(payload); const BankGroup bankGroup = ControllerExtension::getBankGroup(payload); const Rank rank = ControllerExtension::getRank(payload); + const Stack stack = ControllerExtension::getStack(payload); PRINTDEBUGMESSAGE("CheckerHBM3", "Changing state on bank " + std::to_string(static_cast(bank)) @@ -198,6 +202,36 @@ void CheckerHBM3::insert(Command command, const tlm_generic_payload& payload) earliestTimeToStart = std::max(earliestTimeToStart, constraint); } + // Channel (RD,RD) memSpec.tCCDR [] Different(level=) + { + const sc_time constraint = currentTime + memSpec.tCCDR; + for (unsigned int i = memSpec.stacksPerChannel * static_cast(0); i < memSpec.stacksPerChannel * (1 + static_cast(0)); i++) + { + Stack currentStack{i}; + + if (currentStack == stack) + continue; + + sc_time &earliestTimeToStart = nextCommandByStack[Command::RD][currentStack]; + earliestTimeToStart = std::max(earliestTimeToStart, constraint); + } + } + + // Channel (RD,RDA) memSpec.tCCDR [] Different(level=) + { + const sc_time constraint = currentTime + memSpec.tCCDR; + for (unsigned int i = memSpec.stacksPerChannel * static_cast(0); i < memSpec.stacksPerChannel * (1 + static_cast(0)); i++) + { + Stack currentStack{i}; + + if (currentStack == stack) + continue; + + sc_time &earliestTimeToStart = nextCommandByStack[Command::RDA][currentStack]; + earliestTimeToStart = std::max(earliestTimeToStart, constraint); + } + } + break; } @@ -542,6 +576,36 @@ void CheckerHBM3::insert(Command command, const tlm_generic_payload& payload) earliestTimeToStart = std::max(earliestTimeToStart, constraint); } + // Channel (RDA,RD) memSpec.tCCDR [] Different(level=) + { + const sc_time constraint = currentTime + memSpec.tCCDR; + for (unsigned int i = memSpec.stacksPerChannel * static_cast(0); i < memSpec.stacksPerChannel * (1 + static_cast(0)); i++) + { + Stack currentStack{i}; + + if (currentStack == stack) + continue; + + sc_time &earliestTimeToStart = nextCommandByStack[Command::RD][currentStack]; + earliestTimeToStart = std::max(earliestTimeToStart, constraint); + } + } + + // Channel (RDA,RDA) memSpec.tCCDR [] Different(level=) + { + const sc_time constraint = currentTime + memSpec.tCCDR; + for (unsigned int i = memSpec.stacksPerChannel * static_cast(0); i < memSpec.stacksPerChannel * (1 + static_cast(0)); i++) + { + Stack currentStack{i}; + + if (currentStack == stack) + continue; + + sc_time &earliestTimeToStart = nextCommandByStack[Command::RDA][currentStack]; + earliestTimeToStart = std::max(earliestTimeToStart, constraint); + } + } + break; } diff --git a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.h b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.h index 983e76af..efaca154 100644 --- a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.h +++ b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.h @@ -71,11 +71,14 @@ private: using BankGroupVector = ControllerVector; template using RankVector = ControllerVector; + template + using StackVector = ControllerVector; CommandArray> nextCommandByBank; CommandArray> nextCommandByBankGroup; CommandArray> nextCommandByRank; + CommandArray> nextCommandByStack; RankVector> last4ActivatesOnRank; ControllerVector bankwiseRefreshCounter; diff --git a/src/configuration/DRAMSys/config/AddressMapping.h b/src/configuration/DRAMSys/config/AddressMapping.h index 0c4806ed..5e805793 100644 --- a/src/configuration/DRAMSys/config/AddressMapping.h +++ b/src/configuration/DRAMSys/config/AddressMapping.h @@ -56,6 +56,7 @@ struct AddressMapping std::optional> BANK_BIT; std::optional> BANKGROUP_BIT; std::optional> RANK_BIT; + std::optional> STACK_BIT; std::optional> PSEUDOCHANNEL_BIT; std::optional> CHANNEL_BIT; }; @@ -67,6 +68,7 @@ NLOHMANN_JSONIFY_ALL_THINGS(AddressMapping, BANK_BIT, BANKGROUP_BIT, RANK_BIT, + STACK_BIT, PSEUDOCHANNEL_BIT, CHANNEL_BIT) diff --git a/src/libdramsys/DRAMSys/common/dramExtensions.cpp b/src/libdramsys/DRAMSys/common/dramExtensions.cpp index d19d3509..e8a31abd 100644 --- a/src/libdramsys/DRAMSys/common/dramExtensions.cpp +++ b/src/libdramsys/DRAMSys/common/dramExtensions.cpp @@ -33,6 +33,7 @@ * Janik Schlemminger * Robert Gernhardt * Matthias Jung + * Derek Christ */ #include "dramExtensions.h" @@ -157,6 +158,7 @@ sc_time ArbiterExtension::getTimeOfGeneration(const tlm::tlm_generic_payload& tr ControllerExtension::ControllerExtension(uint64_t channelPayloadID, Rank rank, + Stack stack, BankGroup bankGroup, Bank bank, Row row, @@ -164,6 +166,7 @@ ControllerExtension::ControllerExtension(uint64_t channelPayloadID, unsigned int burstLength) : channelPayloadID(channelPayloadID), rank(rank), + stack(stack), bankGroup(bankGroup), bank(bank), row(row), @@ -175,6 +178,7 @@ ControllerExtension::ControllerExtension(uint64_t channelPayloadID, void ControllerExtension::setAutoExtension(tlm::tlm_generic_payload& trans, uint64_t channelPayloadID, Rank rank, + Stack stack, BankGroup bankGroup, Bank bank, Row row, @@ -196,7 +200,7 @@ void ControllerExtension::setAutoExtension(tlm::tlm_generic_payload& trans, else { extension = new ControllerExtension( - channelPayloadID, rank, bankGroup, bank, row, column, burstLength); + channelPayloadID, rank, stack, bankGroup, bank, row, column, burstLength); trans.set_auto_extension(extension); } } @@ -204,6 +208,7 @@ void ControllerExtension::setAutoExtension(tlm::tlm_generic_payload& trans, void ControllerExtension::setExtension(tlm::tlm_generic_payload& trans, uint64_t channelPayloadID, Rank rank, + Stack stack, BankGroup bankGroup, Bank bank, Row row, @@ -211,15 +216,15 @@ void ControllerExtension::setExtension(tlm::tlm_generic_payload& trans, unsigned int burstLength) { assert(trans.get_extension() == nullptr); - auto* extension = - new ControllerExtension(channelPayloadID, rank, bankGroup, bank, row, column, burstLength); + auto* extension = new ControllerExtension( + channelPayloadID, rank, stack, bankGroup, bank, row, column, burstLength); trans.set_extension(extension); } tlm_extension_base* ControllerExtension::clone() const { return new ControllerExtension( - channelPayloadID, rank, bankGroup, bank, row, column, burstLength); + channelPayloadID, rank, stack, bankGroup, bank, row, column, burstLength); } void ControllerExtension::copy_from(const tlm_extension_base& ext) @@ -244,6 +249,11 @@ Rank ControllerExtension::getRank() const return rank; } +Stack ControllerExtension::getStack() const +{ + return stack; +} + BankGroup ControllerExtension::getBankGroup() const { return bankGroup; @@ -284,6 +294,11 @@ Rank ControllerExtension::getRank(const tlm::tlm_generic_payload& trans) return trans.get_extension()->rank; } +Stack ControllerExtension::getStack(const tlm::tlm_generic_payload& trans) +{ + return trans.get_extension()->stack; +} + BankGroup ControllerExtension::getBankGroup(const tlm::tlm_generic_payload& trans) { return trans.get_extension()->bankGroup; diff --git a/src/libdramsys/DRAMSys/common/dramExtensions.h b/src/libdramsys/DRAMSys/common/dramExtensions.h index f6d56f1c..aeaaeb7f 100644 --- a/src/libdramsys/DRAMSys/common/dramExtensions.h +++ b/src/libdramsys/DRAMSys/common/dramExtensions.h @@ -32,12 +32,12 @@ * Authors: * Robert Gernhardt * Matthias Jung + * Derek Christ */ #ifndef DRAMEXTENSIONS_H #define DRAMEXTENSIONS_H -#include #include #include @@ -49,6 +49,7 @@ namespace DRAMSys enum class Thread : std::size_t; enum class Channel : std::size_t; enum class Rank : std::size_t; +enum class Stack : std::size_t; enum class LogicalRank : std::size_t; enum class PhysicalRank : std::size_t; enum class DimmRank : std::size_t; @@ -122,6 +123,7 @@ public: static void setAutoExtension(tlm::tlm_generic_payload& trans, uint64_t channelPayloadID, Rank rank, + Stack stack, BankGroup bankGroup, Bank bank, Row row, @@ -131,6 +133,7 @@ public: static void setExtension(tlm::tlm_generic_payload& trans, uint64_t channelPayloadID, Rank rank, + Stack stack, BankGroup bankGroup, Bank bank, Row row, @@ -143,6 +146,7 @@ public: void copy_from(const tlm::tlm_extension_base& ext) override; [[nodiscard]] uint64_t getChannelPayloadID() const; + [[nodiscard]] Stack getStack() const; [[nodiscard]] Rank getRank() const; [[nodiscard]] BankGroup getBankGroup() const; [[nodiscard]] Bank getBank() const; @@ -152,6 +156,7 @@ public: static const ControllerExtension& getExtension(const tlm::tlm_generic_payload& trans); static uint64_t getChannelPayloadID(const tlm::tlm_generic_payload& trans); + static Stack getStack(const tlm::tlm_generic_payload& trans); static Rank getRank(const tlm::tlm_generic_payload& trans); static BankGroup getBankGroup(const tlm::tlm_generic_payload& trans); static Bank getBank(const tlm::tlm_generic_payload& trans); @@ -162,6 +167,7 @@ public: private: ControllerExtension(uint64_t channelPayloadID, Rank rank, + Stack stack, BankGroup bankGroup, Bank bank, Row row, @@ -169,6 +175,7 @@ private: unsigned burstLength); uint64_t channelPayloadID; Rank rank; + Stack stack; BankGroup bankGroup; Bank bank; Row row; diff --git a/src/libdramsys/DRAMSys/common/utils.cpp b/src/libdramsys/DRAMSys/common/utils.cpp index c0400fab..72108875 100644 --- a/src/libdramsys/DRAMSys/common/utils.cpp +++ b/src/libdramsys/DRAMSys/common/utils.cpp @@ -86,7 +86,7 @@ void setUpDummy(tlm_generic_payload& payload, payload.set_byte_enable_length(0); payload.set_streaming_width(0); ControllerExtension::setExtension( - payload, channelPayloadID, rank, bankGroup, bank, Row(0), Column(0), 0); + payload, channelPayloadID, rank, Stack(0), bankGroup, bank, Row(0), Column(0), 0); ArbiterExtension::setExtension(payload, Thread(UINT_MAX), Channel(0), 0, SC_ZERO_TIME); } diff --git a/src/libdramsys/DRAMSys/controller/Controller.cpp b/src/libdramsys/DRAMSys/controller/Controller.cpp index 19a0ff8c..8a509147 100644 --- a/src/libdramsys/DRAMSys/controller/Controller.cpp +++ b/src/libdramsys/DRAMSys/controller/Controller.cpp @@ -566,6 +566,7 @@ void Controller::manageRequests(const sc_time& delay) ControllerExtension::setAutoExtension(*transToAcquire.payload, nextChannelPayloadIDToAppend++, Rank(decodedAddress.rank), + Stack(decodedAddress.stack), BankGroup(decodedAddress.bankgroup), Bank(decodedAddress.bank), Row(decodedAddress.row), @@ -764,6 +765,7 @@ void Controller::createChildTranses(tlm::tlm_generic_payload& parentTrans) ControllerExtension::setAutoExtension(*childTrans, nextChannelPayloadIDToAppend, Rank(decodedAddress.rank), + Stack(decodedAddress.stack), BankGroup(decodedAddress.bankgroup), Bank(decodedAddress.bank), Row(decodedAddress.row), diff --git a/src/libdramsys/DRAMSys/simulation/AddressDecoder.cpp b/src/libdramsys/DRAMSys/simulation/AddressDecoder.cpp index bff01a41..ee2f0a9d 100644 --- a/src/libdramsys/DRAMSys/simulation/AddressDecoder.cpp +++ b/src/libdramsys/DRAMSys/simulation/AddressDecoder.cpp @@ -82,6 +82,11 @@ AddressDecoder::AddressDecoder(const Config::AddressMapping& addressMapping) addMapping(*rankBits, vRankBits, vXor); } + if (const auto& stackBits = addressMapping.STACK_BIT) + { + addMapping(*stackBits, vStackBits, vXor); + } + // HBM pseudo channels are internally modelled as ranks if (const auto& pseudoChannelBits = addressMapping.PSEUDOCHANNEL_BIT) { @@ -132,6 +137,7 @@ void AddressDecoder::plausibilityCheck(const MemSpec& memSpec) { unsigned channels = std::lround(std::pow(2.0, vChannelBits.size())); unsigned ranks = std::lround(std::pow(2.0, vRankBits.size())); + unsigned stacks = std::lround(std::pow(2.0, vStackBits.size())); unsigned bankGroups = std::lround(std::pow(2.0, vBankGroupBits.size())); unsigned banks = std::lround(std::pow(2.0, vBankBits.size())); unsigned rows = std::lround(std::pow(2.0, vRowBits.size())); @@ -139,13 +145,14 @@ void AddressDecoder::plausibilityCheck(const MemSpec& memSpec) unsigned bytes = std::lround(std::pow(2.0, vByteBits.size())); maximumAddress = - static_cast(bytes) * columns * rows * banks * bankGroups * ranks * channels - 1; + static_cast(bytes) * columns * rows * banks * bankGroups * stacks * ranks * channels - 1; auto totalAddressBits = static_cast(std::log2(maximumAddress)); for (unsigned bitPosition = 0; bitPosition < totalAddressBits; bitPosition++) { if (std::count(vChannelBits.begin(), vChannelBits.end(), bitPosition) + std::count(vRankBits.begin(), vRankBits.end(), bitPosition) + + std::count(vStackBits.begin(), vStackBits.end(), bitPosition) + std::count(vBankGroupBits.begin(), vBankGroupBits.end(), bitPosition) + std::count(vBankBits.begin(), vBankBits.end(), bitPosition) + std::count(vRowBits.begin(), vRowBits.end(), bitPosition) + @@ -222,6 +229,9 @@ DecodedAddress AddressDecoder::decodeAddress(uint64_t encAddr) const for (unsigned it = 0; it < vRankBits.size(); it++) decAddr.rank |= ((encAddr >> vRankBits[it]) & UINT64_C(1)) << it; + for (unsigned it = 0; it < vStackBits.size(); it++) + decAddr.stack |= ((encAddr >> vStackBits[it]) & UINT64_C(1)) << it; + for (unsigned it = 0; it < vBankGroupBits.size(); it++) decAddr.bankgroup |= ((encAddr >> vBankGroupBits[it]) & UINT64_C(1)) << it; @@ -290,6 +300,9 @@ uint64_t AddressDecoder::encodeAddress(DecodedAddress decodedAddress) const for (unsigned i = 0; i < vRankBits.size(); i++) address |= ((decodedAddress.rank >> i) & 0x1) << vRankBits[i]; + for (unsigned i = 0; i < vStackBits.size(); i++) + address |= ((decodedAddress.stack >> i) & 0x1) << vStackBits[i]; + for (unsigned i = 0; i < vBankGroupBits.size(); i++) address |= ((decodedAddress.bankgroup >> i) & 0x1) << vBankGroupBits[i]; @@ -348,6 +361,22 @@ void AddressDecoder::print() const << std::endl; } + for (int it = static_cast(vStackBits.size() - 1); it >= 0; it--) + { + uint64_t addressBits = + (UINT64_C(1) << vStackBits[static_cast::size_type>(it)]); + for (auto xorMapping : vXor) + { + if (xorMapping.at(0) == vStackBits[static_cast::size_type>(it)]) + { + for (auto it = xorMapping.cbegin() + 1; it != xorMapping.cend(); it++) + addressBits |= (UINT64_C(1) << *it); + } + } + std::cout << " SID " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) + << std::endl; + } + for (int it = static_cast(vBankGroupBits.size() - 1); it >= 0; it--) { uint64_t addressBits = diff --git a/src/libdramsys/DRAMSys/simulation/AddressDecoder.h b/src/libdramsys/DRAMSys/simulation/AddressDecoder.h index 540dfe92..b2ab3642 100644 --- a/src/libdramsys/DRAMSys/simulation/AddressDecoder.h +++ b/src/libdramsys/DRAMSys/simulation/AddressDecoder.h @@ -52,6 +52,7 @@ struct DecodedAddress { DecodedAddress(unsigned channel, unsigned rank, + unsigned stack, unsigned bankgroup, unsigned bank, unsigned row, @@ -59,6 +60,7 @@ struct DecodedAddress unsigned bytes) : channel(channel), rank(rank), + stack(stack), bankgroup(bankgroup), bank(bank), row(row), @@ -71,6 +73,7 @@ struct DecodedAddress unsigned channel = 0; unsigned rank = 0; + unsigned stack = 0; unsigned bankgroup = 0; unsigned bank = 0; unsigned row = 0; @@ -102,6 +105,7 @@ private: std::vector> vXor; std::vector vChannelBits; std::vector vRankBits; + std::vector vStackBits; std::vector vBankGroupBits; std::vector vBankBits; std::vector vRowBits; diff --git a/tests/tests_configuration/test_configuration.cpp b/tests/tests_configuration/test_configuration.cpp index 7312be2b..10ffbed3 100644 --- a/tests/tests_configuration/test_configuration.cpp +++ b/tests/tests_configuration/test_configuration.cpp @@ -75,6 +75,7 @@ protected: addressMapBitVector({17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}), addressMapBitVector({33}), std::nullopt, + std::nullopt, std::nullopt}; DRAMSys::Config::McConfig mcConfig{PagePolicyType::Open, diff --git a/tests/tests_dramsys/AddressDecoderTests.cpp b/tests/tests_dramsys/AddressDecoderTests.cpp index 4abd9705..dd5c6ade 100644 --- a/tests/tests_dramsys/AddressDecoderTests.cpp +++ b/tests/tests_dramsys/AddressDecoderTests.cpp @@ -81,13 +81,14 @@ TEST_F(AddressDecoderFixture, Encoding) { unsigned int channel = 0; unsigned int rank = 0; + unsigned int stack = 0; unsigned int bankgroup = 3; unsigned int bank = 12; unsigned int row = 29874; unsigned int column = 170; unsigned int byte = 0; - DRAMSys::DecodedAddress decodedAddress(channel, rank, bankgroup, bank, row, column, byte); + DRAMSys::DecodedAddress decodedAddress(channel, rank, stack, bankgroup, bank, row, column, byte); uint64_t address = addressDecoder.encodeAddress(decodedAddress); EXPECT_EQ(address, 0x3A59'1474); diff --git a/tests/tests_regression/HBM3/hbm3-example.json b/tests/tests_regression/HBM3/hbm3-example.json index 2126eebd..1fba3b38 100644 --- a/tests/tests_regression/HBM3/hbm3-example.json +++ b/tests/tests_regression/HBM3/hbm3-example.json @@ -64,6 +64,7 @@ "nbrOfBanks": 16, "nbrOfColumns": 128, "nbrOfPseudoChannels": 2, + "nbrOfStacks": 1, "nbrOfRows": 65536, "width": 32, "nbrOfDevices": 1, @@ -77,6 +78,7 @@ "memtimingspec": { "CCDL": 4, "CCDS": 2, + "CCDR": 3, "CKE": 8, "DQSCK": 1, "FAW": 16,