Stagger refresh on different ranks.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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++)
|
||||
|
||||
@@ -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++)
|
||||
|
||||
Reference in New Issue
Block a user