Stagger refresh on different ranks.

This commit is contained in:
Lukas Steiner
2021-01-20 11:30:37 +01:00
parent c50b089f76
commit 3187c59183
4 changed files with 36 additions and 3 deletions

View File

@@ -45,7 +45,8 @@ RefreshManagerAllBank::RefreshManagerAllBank(std::vector<BankMachine *> &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<int>(config.refreshMaxPostponed);

View File

@@ -39,6 +39,7 @@
#include <tlm.h>
#include <utility>
#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

View File

@@ -45,7 +45,8 @@ RefreshManagerPerBank::RefreshManagerPerBank(std::vector<BankMachine *> &bankMac
{
Configuration &config = Configuration::getInstance();
memSpec = config.memSpec;
timeForNextTrigger = memSpec->getRefreshIntervalPB();
timeForNextTrigger = getTimeForFirstTrigger(memSpec->getRefreshIntervalPB(),
rank, memSpec->numberOfRanks);
refreshPayloads = std::vector<tlm_generic_payload>(memSpec->banksPerRank);
for (unsigned bankID = 0; bankID < memSpec->banksPerRank; bankID++)

View File

@@ -45,7 +45,8 @@ RefreshManagerSameBank::RefreshManagerSameBank(std::vector<BankMachine *> &bankM
{
Configuration &config = Configuration::getInstance();
memSpec = config.memSpec;
timeForNextTrigger = memSpec->getRefreshIntervalSB();
timeForNextTrigger = getTimeForFirstTrigger(memSpec->getRefreshIntervalSB(),
rank, memSpec->numberOfRanks);
refreshPayloads = std::vector<tlm_generic_payload>(memSpec->banksPerGroup);
for (unsigned bankID = 0; bankID < memSpec->banksPerGroup; bankID++)