From b6cc348146ac3d7669ea3013c4624347c4f8749f Mon Sep 17 00:00:00 2001 From: Matthias Jung Date: Wed, 1 Sep 2021 14:53:17 +0200 Subject: [PATCH] Added Hammer Generator and some Refactorings --- .../JEDEC_2x2x8x4Gbx4_DDR5-3200A.json | 6 +- .../resources/simulations/ddr5-rfm.json | 13 +++-- .../library/src/controller/BankMachine.cpp | 14 ++++- .../refresh/RefreshManagerAllBank.cpp | 58 ++++++++++--------- DRAMSys/simulator/TraceSetup.cpp | 10 ++++ DRAMSys/simulator/TrafficGenerator.cpp | 21 +++++++ DRAMSys/simulator/TrafficGenerator.h | 14 +++++ 7 files changed, 101 insertions(+), 35 deletions(-) diff --git a/DRAMSys/library/resources/configs/memspecs/JEDEC_2x2x8x4Gbx4_DDR5-3200A.json b/DRAMSys/library/resources/configs/memspecs/JEDEC_2x2x8x4Gbx4_DDR5-3200A.json index e3dc6461..7e3db80b 100644 --- a/DRAMSys/library/resources/configs/memspecs/JEDEC_2x2x8x4Gbx4_DDR5-3200A.json +++ b/DRAMSys/library/resources/configs/memspecs/JEDEC_2x2x8x4Gbx4_DDR5-3200A.json @@ -16,9 +16,9 @@ "nbrOfChannels": 2, "cmdMode": 1, "refMode": 1, - "RAAIMT" : 3, - "RAAMMT" : 1, - "RAADEC" : 3 + "RAAIMT" : 32, + "RAAMMT" : 64, + "RAADEC" : 16 }, "memoryId": "JEDEC_2x8x2Gbx4_DDR5-3200A", "memoryType": "DDR5", diff --git a/DRAMSys/library/resources/simulations/ddr5-rfm.json b/DRAMSys/library/resources/simulations/ddr5-rfm.json index 77dfdc27..ebd2c27b 100644 --- a/DRAMSys/library/resources/simulations/ddr5-rfm.json +++ b/DRAMSys/library/resources/simulations/ddr5-rfm.json @@ -11,14 +11,19 @@ "clkMhz": 2000, "type": "generator", "name": "gen0", - "numRequests": 2000, + "numRequests": 4000, "rwRatio": 0.85, "addressDistribution": "random", "seed": 123456, - "maxPendingReadRequests": 8, - "maxPendingWriteRequests": 8 + "maxPendingReadRequests": 24, + "maxPendingWriteRequests": 24 + }, + { + "clkMhz": 4000, + "type": "hammer", + "name": "ham0", + "numRequests": 4000 } - ] } } diff --git a/DRAMSys/library/src/controller/BankMachine.cpp b/DRAMSys/library/src/controller/BankMachine.cpp index 153954eb..82f4310f 100644 --- a/DRAMSys/library/src/controller/BankMachine.cpp +++ b/DRAMSys/library/src/controller/BankMachine.cpp @@ -75,7 +75,7 @@ void BankMachine::updateState(Command command) case Command::PDEA: case Command::PDEP: case Command::SREFEN: sleeping = true; break; - case Command::REFA: case Command::REFB: case Command::REFSB: case Command::RFMAB: case Command::RFMSB: + case Command::REFA: case Command::REFB: case Command::REFSB: sleeping = false; blocked = false; @@ -87,6 +87,18 @@ void BankMachine::updateState(Command command) } } break; + case Command::RFMAB: case Command::RFMSB: + sleeping = false; + blocked = false; + + if(Configuration::getInstance().RFM == true) { + if (RFMCounter > Configuration::getInstance().memSpec->getRAAIMT()) { + RFMCounter -= Configuration::getInstance().memSpec->getRAAIMT(); + } else { + RFMCounter = 0; + } + } + break; case Command::PDXA: case Command::PDXP: sleeping = false; break; diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerAllBank.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerAllBank.cpp index 824c80a3..b54e5e6f 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerAllBank.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerAllBank.cpp @@ -65,19 +65,6 @@ sc_time RefreshManagerAllBank::start() timeToSchedule = sc_max_time(); nextCommand = Command::NOP; -// TODO nach unten ziehen, und in BM auslagern.... - bool RFMRequired = false; - - if(Configuration::getInstance().RFM == true) { - for(auto bm : bankMachinesOnRank) { - uint64_t threshold = memSpec->getRAAIMT() * memSpec->getRAAMMT(); - if(bm->getRFMCounter() >= threshold) { - RFMRequired = true; - break; - } - } - } - if (sc_time_stamp() >= timeForNextTrigger) { powerDownManager->triggerInterruption(); @@ -151,21 +138,38 @@ sc_time RefreshManagerAllBank::start() } } } - else if (RFMRequired) - { - if (activatedBanks > 0) - nextCommand = Command::PREA; - else - nextCommand = Command::RFMAB; - - for (auto it : bankMachinesOnRank) - it->block(); - - timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, &refreshPayload); - return timeToSchedule; - } else - return timeForNextTrigger; + { + bool RFMRequired = false; + + if(Configuration::getInstance().RFM == true) { + for(auto bm : bankMachinesOnRank) { + uint64_t lowerThreshold = memSpec->getRAAIMT(); + uint64_t upperThreshold = memSpec->getRAAMMT(); + + if(bm->getRFMCounter() >= lowerThreshold) { + RFMRequired = true; + break; + } + } + } + + if(RFMRequired) + { + if (activatedBanks > 0) + nextCommand = Command::PREA; + else + nextCommand = Command::RFMAB; + + for (auto it : bankMachinesOnRank) + it->block(); + + timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, &refreshPayload); + return timeToSchedule; + } + else + return timeForNextTrigger; + } } void RefreshManagerAllBank::updateState(Command command) diff --git a/DRAMSys/simulator/TraceSetup.cpp b/DRAMSys/simulator/TraceSetup.cpp index 06ab0ccd..7e68ba72 100644 --- a/DRAMSys/simulator/TraceSetup.cpp +++ b/DRAMSys/simulator/TraceSetup.cpp @@ -171,6 +171,16 @@ TraceSetup::TraceSetup(const std::string &uri, totalTransactions += numRequests; } + else if (type == "hammer") + { + if (!value["numRequests"].is_number_unsigned()) + SC_REPORT_FATAL("TraceSetup", "Number of requests is not a number."); + + uint64_t numRequests = value["numRequests"]; + + auto generator = new TrafficGeneratorHammer(name.c_str(), playerClk, numRequests, this); + players.push_back(generator); + } } } diff --git a/DRAMSys/simulator/TrafficGenerator.cpp b/DRAMSys/simulator/TrafficGenerator.cpp index 4d9936f8..d8b62369 100644 --- a/DRAMSys/simulator/TrafficGenerator.cpp +++ b/DRAMSys/simulator/TrafficGenerator.cpp @@ -147,3 +147,24 @@ uint64_t TrafficGeneratorSequential::getNextAddress() currentAddress += addressIncrement; return address; } + + +TrafficGeneratorHammer::TrafficGeneratorHammer(const sc_core::sc_module_name &name, + const sc_core::sc_time &generatorClk, + uint64_t numRequests, + TraceSetup *setup) : + TrafficGenerator(name, generatorClk, numRequests, 0, 0, 1, 1, setup) +{ + +} + +uint64_t TrafficGeneratorHammer::getNextAddress() +{ + uint64_t address = currentAddress; + if(currentAddress == 0) { + currentAddress += 2097152; + } else { + currentAddress = 0; + } + return address; +} diff --git a/DRAMSys/simulator/TrafficGenerator.h b/DRAMSys/simulator/TrafficGenerator.h index 6f8006e2..8cbc566a 100644 --- a/DRAMSys/simulator/TrafficGenerator.h +++ b/DRAMSys/simulator/TrafficGenerator.h @@ -108,4 +108,18 @@ private: uint64_t addressIncrement; }; +class TrafficGeneratorHammer final : public TrafficGenerator +{ +public: + TrafficGeneratorHammer(const sc_core::sc_module_name &name, + const sc_core::sc_time &generatorClk, + uint64_t numRequests, + TraceSetup *setup); + +private: + uint64_t getNextAddress() override; + + uint64_t currentAddress = 0x0; +}; + #endif // TRAFFICGENERATOR_H