From 3187c59183c0082522d4df676156855f699de8d4 Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Wed, 20 Jan 2021 11:30:37 +0100 Subject: [PATCH] Stagger refresh on different ranks. --- .../refresh/RefreshManagerAllBank.cpp | 3 +- .../src/controller/refresh/RefreshManagerIF.h | 30 +++++++++++++++++++ .../refresh/RefreshManagerPerBank.cpp | 3 +- .../refresh/RefreshManagerSameBank.cpp | 3 +- 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerAllBank.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerAllBank.cpp index 63d41ee2..c6e50e3e 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerAllBank.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerAllBank.cpp @@ -45,7 +45,8 @@ RefreshManagerAllBank::RefreshManagerAllBank(std::vector &bankMac { Configuration &config = Configuration::getInstance(); memSpec = config.memSpec; - timeForNextTrigger = memSpec->getRefreshIntervalAB(); + timeForNextTrigger = getTimeForFirstTrigger(memSpec->getRefreshIntervalAB(), + rank, memSpec->numberOfRanks); setUpDummy(refreshPayload, 0, rank); maxPostponed = static_cast(config.refreshMaxPostponed); diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerIF.h b/DRAMSys/library/src/controller/refresh/RefreshManagerIF.h index e404037e..3f6684f8 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerIF.h +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerIF.h @@ -39,6 +39,7 @@ #include #include #include "../Command.h" +#include "../../configuration/Configuration.h" class RefreshManagerIF { @@ -48,6 +49,35 @@ public: virtual CommandTuple::Type getNextCommand() = 0; virtual sc_time start() = 0; virtual void updateState(Command) = 0; + +protected: + sc_time getTimeForFirstTrigger(sc_time refreshInterval, Rank rank, unsigned numberOfRanks) + { + // Calculate bit-reversal rank ID + unsigned rankID = rank.ID(); + unsigned reverseRankID = 0; + unsigned rankBits = 0; + unsigned rankShift = numberOfRanks; + + while (rankShift >>= 1) + rankBits++; + + rankBits--; + + while (rankID != 0) + { + reverseRankID |= (rankID & 1) << rankBits; + rankID >>= 1; + rankBits--; + } + + // Use bit-reversal order for refreshes on ranks + sc_time timeForFirstTrigger = refreshInterval - reverseRankID * (refreshInterval / numberOfRanks); + sc_time tCK = Configuration::getInstance().memSpec->tCK; + timeForFirstTrigger = std::ceil(timeForFirstTrigger / tCK) * tCK; + + return timeForFirstTrigger; + } }; #endif // REFRESHMANAGERIF_H diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerPerBank.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerPerBank.cpp index 236ce8c6..484d063b 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerPerBank.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerPerBank.cpp @@ -45,7 +45,8 @@ RefreshManagerPerBank::RefreshManagerPerBank(std::vector &bankMac { Configuration &config = Configuration::getInstance(); memSpec = config.memSpec; - timeForNextTrigger = memSpec->getRefreshIntervalPB(); + timeForNextTrigger = getTimeForFirstTrigger(memSpec->getRefreshIntervalPB(), + rank, memSpec->numberOfRanks); refreshPayloads = std::vector(memSpec->banksPerRank); for (unsigned bankID = 0; bankID < memSpec->banksPerRank; bankID++) diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerSameBank.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerSameBank.cpp index e1d5c7fb..8b5210e3 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerSameBank.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerSameBank.cpp @@ -45,7 +45,8 @@ RefreshManagerSameBank::RefreshManagerSameBank(std::vector &bankM { Configuration &config = Configuration::getInstance(); memSpec = config.memSpec; - timeForNextTrigger = memSpec->getRefreshIntervalSB(); + timeForNextTrigger = getTimeForFirstTrigger(memSpec->getRefreshIntervalSB(), + rank, memSpec->numberOfRanks); refreshPayloads = std::vector(memSpec->banksPerGroup); for (unsigned bankID = 0; bankID < memSpec->banksPerGroup; bankID++)