Remove checker from BM, RM and PDM.

This commit is contained in:
Lukas Steiner
2023-04-13 09:57:50 +02:00
parent 088621880c
commit 65a20e9827
19 changed files with 158 additions and 187 deletions

View File

@@ -41,15 +41,15 @@
using namespace sc_core;
using namespace tlm;
BankMachine::BankMachine(const Configuration& config, const SchedulerIF& scheduler, const CheckerIF& checker, Bank bank)
: scheduler(scheduler), checker(checker), memSpec(*config.memSpec), bank(bank),
BankMachine::BankMachine(const Configuration& config, const SchedulerIF& scheduler, Bank bank)
: scheduler(scheduler), memSpec(*config.memSpec), bank(bank),
bankgroup(BankGroup(bank.ID() / memSpec.banksPerGroup)), rank(Rank(bank.ID() / memSpec.banksPerRank)),
refreshManagement(config.refreshManagement)
{}
CommandTuple::Type BankMachine::getNextCommand()
{
return {nextCommand, currentPayload, std::max(timeToSchedule, sc_time_stamp())};
return {nextCommand, currentPayload, SC_ZERO_TIME};
}
void BankMachine::update(Command command)
@@ -121,7 +121,6 @@ uint64_t BankMachine::getRefreshManagementCounter() const
void BankMachine::block()
{
blocked = true;
timeToSchedule = sc_max_time();
nextCommand = Command::NOP;
}
@@ -160,13 +159,11 @@ bool BankMachine::isPrecharged() const
return state == State::Precharged;
}
BankMachineOpen::BankMachineOpen(const Configuration& config, const SchedulerIF& scheduler, const CheckerIF& checker,
Bank bank)
: BankMachine(config, scheduler, checker, bank) {}
BankMachineOpen::BankMachineOpen(const Configuration& config, const SchedulerIF& scheduler, Bank bank)
: BankMachine(config, scheduler, bank) {}
sc_time BankMachineOpen::evaluate()
void BankMachineOpen::evaluate()
{
timeToSchedule = sc_max_time();
nextCommand = Command::NOP;
if (!(sleeping || blocked))
@@ -174,7 +171,7 @@ sc_time BankMachineOpen::evaluate()
tlm_generic_payload* newPayload = scheduler.getNextRequest(*this);
if (newPayload == nullptr)
{
return timeToSchedule;
return;
}
else
{
@@ -204,21 +201,15 @@ sc_time BankMachineOpen::evaluate()
else // row miss
nextCommand = Command::PREPB;
}
timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, *currentPayload);
return timeToSchedule;
}
}
else
return timeToSchedule;
}
BankMachineClosed::BankMachineClosed(const Configuration& config, const SchedulerIF& scheduler,
const CheckerIF& checker, Bank bank)
: BankMachine(config, scheduler, checker, bank) {}
BankMachineClosed::BankMachineClosed(const Configuration& config, const SchedulerIF& scheduler, Bank bank)
: BankMachine(config, scheduler, bank) {}
sc_time BankMachineClosed::evaluate()
void BankMachineClosed::evaluate()
{
timeToSchedule = sc_max_time();
nextCommand = Command::NOP;
if (!(sleeping || blocked))
@@ -226,7 +217,7 @@ sc_time BankMachineClosed::evaluate()
tlm_generic_payload* newPayload = scheduler.getNextRequest(*this);
if (newPayload == nullptr)
{
return timeToSchedule;
return;
}
else
{
@@ -251,21 +242,15 @@ sc_time BankMachineClosed::evaluate()
else
nextCommand = Command::WRA;
}
timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, *currentPayload);
return timeToSchedule;
}
}
else
return timeToSchedule;
}
BankMachineOpenAdaptive::BankMachineOpenAdaptive(const Configuration& config, const SchedulerIF& scheduler,
const CheckerIF& checker, Bank bank)
: BankMachine(config, scheduler, checker, bank) {}
BankMachineOpenAdaptive::BankMachineOpenAdaptive(const Configuration& config, const SchedulerIF& scheduler, Bank bank)
: BankMachine(config, scheduler, bank) {}
sc_time BankMachineOpenAdaptive::evaluate()
void BankMachineOpenAdaptive::evaluate()
{
timeToSchedule = sc_max_time();
nextCommand = Command::NOP;
if (!(sleeping || blocked))
@@ -273,7 +258,7 @@ sc_time BankMachineOpenAdaptive::evaluate()
tlm_generic_payload* newPayload = scheduler.getNextRequest(*this);
if (newPayload == nullptr)
{
return timeToSchedule;
return;
}
else
{
@@ -315,21 +300,16 @@ sc_time BankMachineOpenAdaptive::evaluate()
else // row miss
nextCommand = Command::PREPB;
}
timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, *currentPayload);
return timeToSchedule;
}
}
else
return timeToSchedule;
}
BankMachineClosedAdaptive::BankMachineClosedAdaptive(const Configuration& config, const SchedulerIF& scheduler,
const CheckerIF& checker, Bank bank)
: BankMachine(config, scheduler, checker, bank) {}
Bank bank)
: BankMachine(config, scheduler, bank) {}
sc_time BankMachineClosedAdaptive::evaluate()
void BankMachineClosedAdaptive::evaluate()
{
timeToSchedule = sc_max_time();
nextCommand = Command::NOP;
if (!(sleeping || blocked))
@@ -337,7 +317,7 @@ sc_time BankMachineClosedAdaptive::evaluate()
tlm_generic_payload* newPayload = scheduler.getNextRequest(*this);
if (newPayload == nullptr)
{
return timeToSchedule;
return;
}
else
{
@@ -378,10 +358,6 @@ sc_time BankMachineClosedAdaptive::evaluate()
else // row miss, can happen when RD/WR mode is switched
nextCommand = Command::PREPB;
}
timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, *currentPayload);
return timeToSchedule;
}
}
else
return timeToSchedule;
}

View File

@@ -49,7 +49,7 @@ class BankMachine
{
public:
virtual ~BankMachine() = default;
virtual sc_core::sc_time evaluate() = 0;
virtual void evaluate() = 0;
CommandTuple::Type getNextCommand();
void update(Command);
void block();
@@ -65,14 +65,12 @@ public:
protected:
enum class State {Precharged, Activated} state = State::Precharged;
BankMachine(const Configuration& config, const SchedulerIF& scheduler, const CheckerIF& checker, Bank bank);
BankMachine(const Configuration& config, const SchedulerIF& scheduler, Bank bank);
const MemSpec& memSpec;
tlm::tlm_generic_payload* currentPayload = nullptr;
const SchedulerIF& scheduler;
const CheckerIF& checker;
Command nextCommand = Command::NOP;
Row openRow;
sc_core::sc_time timeToSchedule = sc_core::sc_max_time();
const Bank bank;
const BankGroup bankgroup;
const Rank rank;
@@ -86,31 +84,29 @@ protected:
class BankMachineOpen final : public BankMachine
{
public:
BankMachineOpen(const Configuration& config, const SchedulerIF& scheduler, const CheckerIF& checker, Bank bank);
sc_core::sc_time evaluate() override;
BankMachineOpen(const Configuration& config, const SchedulerIF& scheduler, Bank bank);
void evaluate() override;
};
class BankMachineClosed final : public BankMachine
{
public:
BankMachineClosed(const Configuration& config, const SchedulerIF& scheduler, const CheckerIF& checker, Bank bank);
sc_core::sc_time evaluate() override;
BankMachineClosed(const Configuration& config, const SchedulerIF& scheduler, Bank bank);
void evaluate() override;
};
class BankMachineOpenAdaptive final : public BankMachine
{
public:
BankMachineOpenAdaptive(const Configuration& config, const SchedulerIF& scheduler, const CheckerIF& checker,
Bank bank);
sc_core::sc_time evaluate() override;
BankMachineOpenAdaptive(const Configuration& config, const SchedulerIF& scheduler, Bank bank);
void evaluate() override;
};
class BankMachineClosedAdaptive final : public BankMachine
{
public:
BankMachineClosedAdaptive(const Configuration& config, const SchedulerIF& scheduler, const CheckerIF& checker,
Bank bank);
sc_core::sc_time evaluate() override;
BankMachineClosedAdaptive(const Configuration& config, const SchedulerIF& scheduler, Bank bank);
void evaluate() override;
};
#endif // BANKMACHINE_H

View File

@@ -164,25 +164,25 @@ Controller::Controller(const sc_module_name& name, const Configuration& config,
{
for (unsigned bankID = 0; bankID < memSpec.banksPerChannel; bankID++)
bankMachines.emplace_back(std::make_unique<BankMachineOpen>
(config, *scheduler, *checker, Bank(bankID)));
(config, *scheduler, Bank(bankID)));
}
else if (config.pagePolicy == Configuration::PagePolicy::OpenAdaptive)
{
for (unsigned bankID = 0; bankID < memSpec.banksPerChannel; bankID++)
bankMachines.emplace_back(std::make_unique<BankMachineOpenAdaptive>
(config, *scheduler, *checker, Bank(bankID)));
(config, *scheduler, Bank(bankID)));
}
else if (config.pagePolicy == Configuration::PagePolicy::Closed)
{
for (unsigned bankID = 0; bankID < memSpec.banksPerChannel; bankID++)
bankMachines.emplace_back(std::make_unique<BankMachineClosed>
(config, *scheduler, *checker, Bank(bankID)));
(config, *scheduler, Bank(bankID)));
}
else if (config.pagePolicy == Configuration::PagePolicy::ClosedAdaptive)
{
for (unsigned bankID = 0; bankID < memSpec.banksPerChannel; bankID++)
bankMachines.emplace_back(std::make_unique<BankMachineClosedAdaptive>
(config, *scheduler, *checker, Bank(bankID)));
(config, *scheduler, Bank(bankID)));
}
bankMachinesOnRank = std::vector<std::vector<BankMachine*>>(memSpec.ranksPerChannel,
@@ -219,7 +219,7 @@ Controller::Controller(const sc_module_name& name, const Configuration& config,
for (unsigned rankID = 0; rankID < memSpec.ranksPerChannel; rankID++)
{
refreshManagers.emplace_back(std::make_unique<RefreshManagerAllBank>
(config, bankMachinesOnRank[rankID], *powerDownManagers[rankID].get(), Rank(rankID), *checker));
(config, bankMachinesOnRank[rankID], *powerDownManagers[rankID].get(), Rank(rankID)));
}
}
else if (config.refreshPolicy == Configuration::RefreshPolicy::SameBank)
@@ -227,7 +227,7 @@ Controller::Controller(const sc_module_name& name, const Configuration& config,
for (unsigned rankID = 0; rankID < memSpec.ranksPerChannel; rankID++)
{
refreshManagers.emplace_back(std::make_unique<RefreshManagerSameBank>
(config, bankMachinesOnRank[rankID], *powerDownManagers[rankID].get(), Rank(rankID), *checker));
(config, bankMachinesOnRank[rankID], *powerDownManagers[rankID].get(), Rank(rankID)));
}
}
else if (config.refreshPolicy == Configuration::RefreshPolicy::PerBank)
@@ -236,7 +236,7 @@ Controller::Controller(const sc_module_name& name, const Configuration& config,
{
// TODO: remove bankMachines in constructor
refreshManagers.emplace_back(std::make_unique<RefreshManagerPerBank>
(config, bankMachinesOnRank[rankID], *powerDownManagers[rankID], Rank(rankID), *checker));
(config, bankMachinesOnRank[rankID], *powerDownManagers[rankID], Rank(rankID)));
}
}
else if (config.refreshPolicy == Configuration::RefreshPolicy::Per2Bank)
@@ -245,7 +245,7 @@ Controller::Controller(const sc_module_name& name, const Configuration& config,
{
// TODO: remove bankMachines in constructor
refreshManagers.emplace_back(std::make_unique<RefreshManagerPer2Bank>
(config, bankMachinesOnRank[rankID], *powerDownManagers[rankID], Rank(rankID), *checker));
(config, bankMachinesOnRank[rankID], *powerDownManagers[rankID], Rank(rankID)));
}
}
else
@@ -301,6 +301,12 @@ void Controller::controllerMethod()
bool readyCmdBlocked = false;
if (!readyCommands.empty())
{
for (auto& it : readyCommands)
{
Command command = std::get<CommandTuple::Command>(it);
tlm_generic_payload* trans = std::get<CommandTuple::Payload>(it);
std::get<CommandTuple::Timestamp>(it) = checker->timeToSatisfyConstraints(command, *trans);
}
commandTuple = cmdMux->selectCommand(readyCommands);
Command command = std::get<CommandTuple::Command>(commandTuple);
tlm_generic_payload* trans = std::get<CommandTuple::Payload>(commandTuple);
@@ -363,21 +369,46 @@ void Controller::controllerMethod()
sc_time localTime;
for (auto& it : bankMachines)
{
localTime = it->evaluate();
if (!(localTime == sc_time_stamp() && readyCmdBlocked))
timeForNextTrigger = std::min(timeForNextTrigger, localTime);
it->evaluate();
commandTuple = it->getNextCommand();
Command command = std::get<CommandTuple::Command>(commandTuple);
tlm_generic_payload* trans = std::get<CommandTuple::Payload>(commandTuple);
if (command != Command::NOP)
{
localTime = checker->timeToSatisfyConstraints(command, *trans);
if (!(localTime == sc_time_stamp() && readyCmdBlocked))
timeForNextTrigger = std::min(timeForNextTrigger, localTime);
}
}
for (auto& it : refreshManagers)
{
localTime = it->evaluate();
if (!(localTime == sc_time_stamp() && readyCmdBlocked))
timeForNextTrigger = std::min(timeForNextTrigger, localTime);
it->evaluate();
commandTuple = it->getNextCommand();
Command command = std::get<CommandTuple::Command>(commandTuple);
tlm_generic_payload* trans = std::get<CommandTuple::Payload>(commandTuple);
if (command != Command::NOP)
{
localTime = checker->timeToSatisfyConstraints(command, *trans);
if (!(localTime == sc_time_stamp() && readyCmdBlocked))
timeForNextTrigger = std::min(timeForNextTrigger, localTime);
}
else
{
timeForNextTrigger = std::min(timeForNextTrigger, it->getTimeForNextTrigger());
}
}
for (auto& it : powerDownManagers)
{
localTime = it->evaluate();
if (!(localTime == sc_time_stamp() && readyCmdBlocked))
timeForNextTrigger = std::min(timeForNextTrigger, localTime);
it->evaluate();
commandTuple = it->getNextCommand();
Command command = std::get<CommandTuple::Command>(commandTuple);
tlm_generic_payload* trans = std::get<CommandTuple::Payload>(commandTuple);
if (command != Command::NOP)
{
localTime = checker->timeToSatisfyConstraints(command, *trans);
if (!(localTime == sc_time_stamp() && readyCmdBlocked))
timeForNextTrigger = std::min(timeForNextTrigger, localTime);
}
}
if (timeForNextTrigger != sc_max_time())

View File

@@ -39,10 +39,5 @@ using namespace tlm;
CommandTuple::Type PowerDownManagerDummy::getNextCommand()
{
return {Command::NOP, nullptr, sc_max_time()};
}
sc_time PowerDownManagerDummy::evaluate()
{
return sc_max_time();
return {Command::NOP, nullptr, SC_ZERO_TIME};
}

View File

@@ -48,7 +48,7 @@ public:
CommandTuple::Type getNextCommand() override;
void update(Command) override {}
sc_core::sc_time evaluate() override;
void evaluate() override {}
};
#endif // POWERDOWNMANAGERDUMMY_H

View File

@@ -50,7 +50,7 @@ public:
virtual CommandTuple::Type getNextCommand() = 0;
virtual void update(Command) = 0;
virtual sc_core::sc_time evaluate() = 0;
virtual void evaluate() = 0;
};
#endif // POWERDOWNMANAGERIF_H

View File

@@ -41,7 +41,7 @@ using namespace tlm;
PowerDownManagerStaggered::PowerDownManagerStaggered(std::vector<BankMachine*>& bankMachinesOnRank,
Rank rank, CheckerIF& checker)
: bankMachinesOnRank(bankMachinesOnRank), checker(checker)
: bankMachinesOnRank(bankMachinesOnRank)
{
setUpDummy(powerDownPayload, UINT64_MAX - 1, rank);
}
@@ -74,12 +74,11 @@ void PowerDownManagerStaggered::triggerInterruption()
CommandTuple::Type PowerDownManagerStaggered::getNextCommand()
{
return {nextCommand, &powerDownPayload, std::max(timeToSchedule, sc_time_stamp())};
return {nextCommand, &powerDownPayload, SC_ZERO_TIME};
}
sc_time PowerDownManagerStaggered::evaluate()
void PowerDownManagerStaggered::evaluate()
{
timeToSchedule = sc_max_time();
nextCommand = Command::NOP;
if (exitTriggered)
@@ -92,8 +91,6 @@ sc_time PowerDownManagerStaggered::evaluate()
nextCommand = Command::SREFEX;
else if (state == State::ExtraRefresh)
nextCommand = Command::REFAB;
timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, powerDownPayload);
}
else if (entryTriggered)
{
@@ -106,16 +103,11 @@ sc_time PowerDownManagerStaggered::evaluate()
break;
}
}
timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, powerDownPayload);
}
else if (enterSelfRefresh)
{
nextCommand = Command::SREFEN;
timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, powerDownPayload);
}
return timeToSchedule;
}
void PowerDownManagerStaggered::update(Command command)

View File

@@ -55,15 +55,12 @@ public:
CommandTuple::Type getNextCommand() override;
void update(Command) override;
sc_core::sc_time evaluate() override;
void evaluate() override;
private:
enum class State {Idle, ActivePdn, PrechargePdn, SelfRefresh, ExtraRefresh} state = State::Idle;
tlm::tlm_generic_payload powerDownPayload;
std::vector<BankMachine*>& bankMachinesOnRank;
CheckerIF& checker;
sc_core::sc_time timeToSchedule = sc_core::sc_max_time();
Command nextCommand = Command::NOP;
bool controllerIdle = true;

View File

@@ -42,8 +42,8 @@ using namespace sc_core;
using namespace tlm;
RefreshManagerAllBank::RefreshManagerAllBank(const Configuration& config, std::vector<BankMachine*>& bankMachinesOnRank,
PowerDownManagerIF& powerDownManager, Rank rank, const CheckerIF& checker)
: bankMachinesOnRank(bankMachinesOnRank), powerDownManager(powerDownManager), checker(checker),
PowerDownManagerIF& powerDownManager, Rank rank)
: bankMachinesOnRank(bankMachinesOnRank), powerDownManager(powerDownManager),
memSpec(*config.memSpec), maxPostponed(static_cast<int>(config.refreshMaxPostponed)),
maxPulledin(-static_cast<int>(config.refreshMaxPulledin)), refreshManagement(config.refreshManagement)
{
@@ -54,12 +54,11 @@ RefreshManagerAllBank::RefreshManagerAllBank(const Configuration& config, std::v
CommandTuple::Type RefreshManagerAllBank::getNextCommand()
{
return {nextCommand, &refreshPayload, std::max(timeToSchedule, sc_time_stamp())};
return {nextCommand, &refreshPayload, SC_ZERO_TIME};
}
sc_time RefreshManagerAllBank::evaluate()
void RefreshManagerAllBank::evaluate()
{
timeToSchedule = sc_max_time();
nextCommand = Command::NOP;
if (sc_time_stamp() >= timeForNextTrigger) // Normal refresh
@@ -67,7 +66,7 @@ sc_time RefreshManagerAllBank::evaluate()
powerDownManager.triggerInterruption();
if (sleeping)
return timeToSchedule;
return;
if (sc_time_stamp() >= timeForNextTrigger + memSpec.getRefreshIntervalAB())
{
@@ -104,8 +103,7 @@ sc_time RefreshManagerAllBank::evaluate()
else
nextCommand = Command::REFAB;
timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, refreshPayload);
return timeToSchedule;
return;
}
}
else // if (state == RmState::Pulledin)
@@ -126,8 +124,7 @@ sc_time RefreshManagerAllBank::evaluate()
{
assert(activatedBanks == 0);
nextCommand = Command::REFAB;
timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, refreshPayload);
return timeToSchedule;
return;
}
}
}
@@ -168,12 +165,9 @@ sc_time RefreshManagerAllBank::evaluate()
else
nextCommand = Command::RFMAB;
timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, refreshPayload);
return timeToSchedule;
return;
}
}
return timeForNextTrigger;
}
void RefreshManagerAllBank::update(Command command)
@@ -225,3 +219,8 @@ void RefreshManagerAllBank::update(Command command)
break;
}
}
sc_time RefreshManagerAllBank::getTimeForNextTrigger()
{
return timeForNextTrigger;
}

View File

@@ -51,11 +51,12 @@ class RefreshManagerAllBank final : public RefreshManagerIF
{
public:
RefreshManagerAllBank(const Configuration& config, std::vector<BankMachine*>& bankMachinesOnRank,
PowerDownManagerIF& powerDownManager, Rank rank, const CheckerIF& checker);
PowerDownManagerIF& powerDownManager, Rank rank);
CommandTuple::Type getNextCommand() override;
sc_core::sc_time evaluate() override;
void evaluate() override;
void update(Command) override;
sc_core::sc_time getTimeForNextTrigger() override;
private:
enum class State {Regular, Pulledin} state = State::Regular;
@@ -64,8 +65,6 @@ private:
PowerDownManagerIF& powerDownManager;
tlm::tlm_generic_payload refreshPayload;
sc_core::sc_time timeForNextTrigger = sc_core::sc_max_time();
sc_core::sc_time timeToSchedule = sc_core::sc_max_time();
const CheckerIF& checker;
Command nextCommand = Command::NOP;
unsigned activatedBanks = 0;

View File

@@ -39,10 +39,10 @@ using namespace tlm;
CommandTuple::Type RefreshManagerDummy::getNextCommand()
{
return {Command::NOP, nullptr, sc_max_time()};
return {Command::NOP, nullptr, SC_ZERO_TIME};
}
sc_time RefreshManagerDummy::evaluate()
sc_time RefreshManagerDummy::getTimeForNextTrigger()
{
return sc_max_time();
}
}

View File

@@ -43,8 +43,9 @@ class RefreshManagerDummy final : public RefreshManagerIF
{
public:
CommandTuple::Type getNextCommand() override;
sc_core::sc_time evaluate() override;
void evaluate() override {}
void update(Command) override {}
sc_core::sc_time getTimeForNextTrigger() override;
};
#endif // REFRESHMANAGERDUMMY_H

View File

@@ -48,8 +48,9 @@ public:
virtual ~RefreshManagerIF() = default;
virtual CommandTuple::Type getNextCommand() = 0;
virtual sc_core::sc_time evaluate() = 0;
virtual void evaluate() = 0;
virtual void update(Command) = 0;
virtual sc_core::sc_time getTimeForNextTrigger() = 0;
protected:
static sc_core::sc_time getTimeForFirstTrigger(const sc_core::sc_time& tCK, const sc_core::sc_time &refreshInterval,

View File

@@ -42,9 +42,8 @@ using namespace tlm;
RefreshManagerPer2Bank::RefreshManagerPer2Bank(const Configuration& config,
std::vector<BankMachine*>& bankMachinesOnRank,
PowerDownManagerIF& powerDownManager, Rank rank,
const CheckerIF& checker)
: powerDownManager(powerDownManager), checker(checker), memSpec(*config.memSpec),
PowerDownManagerIF& powerDownManager, Rank rank)
: powerDownManager(powerDownManager), memSpec(*config.memSpec),
maxPostponed(static_cast<int>(config.refreshMaxPostponed * memSpec.banksPerRank / 2)),
maxPulledin(-static_cast<int>(config.refreshMaxPulledin * memSpec.banksPerRank / 2))
{
@@ -72,19 +71,18 @@ RefreshManagerPer2Bank::RefreshManagerPer2Bank(const Configuration& config,
CommandTuple::Type RefreshManagerPer2Bank::getNextCommand()
{
return {nextCommand, currentRefreshPayload, std::max(timeToSchedule, sc_time_stamp())};
return {nextCommand, currentRefreshPayload, SC_ZERO_TIME};
}
sc_time RefreshManagerPer2Bank::evaluate()
void RefreshManagerPer2Bank::evaluate()
{
timeToSchedule = sc_max_time();
nextCommand = Command::NOP;
if (sc_time_stamp() >= timeForNextTrigger)
{
powerDownManager.triggerInterruption();
if (sleeping)
return timeToSchedule;
return;
if (sc_time_stamp() >= timeForNextTrigger + memSpec.getRefreshIntervalP2B())
{
@@ -124,7 +122,7 @@ sc_time RefreshManagerPer2Bank::evaluate()
{
flexibilityCounter++;
timeForNextTrigger += memSpec.getRefreshIntervalP2B();
return timeForNextTrigger;
return;
}
else
{
@@ -147,9 +145,7 @@ sc_time RefreshManagerPer2Bank::evaluate()
it->block();
skipSelection = true;
}
timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, *currentRefreshPayload);
return timeToSchedule;
return;
}
}
else // if (state == RmState::Pulledin)
@@ -180,7 +176,7 @@ sc_time RefreshManagerPer2Bank::evaluate()
{
state = State::Regular;
timeForNextTrigger += memSpec.getRefreshIntervalP2B();
return timeForNextTrigger;
return;
}
else
{
@@ -195,14 +191,10 @@ sc_time RefreshManagerPer2Bank::evaluate()
break;
}
}
timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, *currentRefreshPayload);
return timeToSchedule;
return;
}
}
}
else
return timeForNextTrigger;
}
void RefreshManagerPer2Bank::update(Command command)
@@ -250,3 +242,8 @@ void RefreshManagerPer2Bank::update(Command command)
break;
}
}
sc_time RefreshManagerPer2Bank::getTimeForNextTrigger()
{
return timeForNextTrigger;
}

View File

@@ -53,11 +53,12 @@ class RefreshManagerPer2Bank final : public RefreshManagerIF
{
public:
RefreshManagerPer2Bank(const Configuration& config, std::vector<BankMachine*>& bankMachinesOnRank,
PowerDownManagerIF& powerDownManager, Rank rank, const CheckerIF& checker);
PowerDownManagerIF& powerDownManager, Rank rank);
CommandTuple::Type getNextCommand() override;
sc_core::sc_time evaluate() override;
void evaluate() override;
void update(Command) override;
sc_core::sc_time getTimeForNextTrigger() override;
private:
enum class State {Regular, Pulledin} state = State::Regular;
@@ -66,8 +67,6 @@ private:
std::unordered_map<BankMachine*, tlm::tlm_generic_payload> refreshPayloads;
tlm::tlm_generic_payload* currentRefreshPayload;
sc_core::sc_time timeForNextTrigger = sc_core::sc_max_time();
sc_core::sc_time timeToSchedule = sc_core::sc_max_time();
const CheckerIF& checker;
Command nextCommand = Command::NOP;
std::list<std::vector<BankMachine*>> remainingBankMachines;

View File

@@ -41,8 +41,8 @@ using namespace sc_core;
using namespace tlm;
RefreshManagerPerBank::RefreshManagerPerBank(const Configuration& config, std::vector<BankMachine*>& bankMachinesOnRank,
PowerDownManagerIF& powerDownManager, Rank rank, const CheckerIF& checker)
: powerDownManager(powerDownManager), checker(checker), memSpec(*config.memSpec),
PowerDownManagerIF& powerDownManager, Rank rank)
: powerDownManager(powerDownManager), memSpec(*config.memSpec),
maxPostponed(static_cast<int>(config.refreshMaxPostponed * memSpec.banksPerRank)),
maxPulledin(-static_cast<int>(config.refreshMaxPulledin * memSpec.banksPerRank))
{
@@ -60,19 +60,18 @@ RefreshManagerPerBank::RefreshManagerPerBank(const Configuration& config, std::v
CommandTuple::Type RefreshManagerPerBank::getNextCommand()
{
return {nextCommand, &refreshPayloads.at(*currentIterator), std::max(timeToSchedule, sc_time_stamp())};
return {nextCommand, &refreshPayloads.at(*currentIterator), SC_ZERO_TIME};
}
sc_time RefreshManagerPerBank::evaluate()
void RefreshManagerPerBank::evaluate()
{
timeToSchedule = sc_max_time();
nextCommand = Command::NOP;
if (sc_time_stamp() >= timeForNextTrigger)
{
powerDownManager.triggerInterruption();
if (sleeping)
return timeToSchedule;
return;
if (sc_time_stamp() >= timeForNextTrigger + memSpec.getRefreshIntervalPB())
{
@@ -104,7 +103,7 @@ sc_time RefreshManagerPerBank::evaluate()
{
flexibilityCounter++;
timeForNextTrigger += memSpec.getRefreshIntervalPB();
return timeForNextTrigger;
return;
}
else
{
@@ -121,9 +120,7 @@ sc_time RefreshManagerPerBank::evaluate()
skipSelection = true;
}
}
timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, refreshPayloads.at(*currentIterator));
return timeToSchedule;
return;
}
}
else // if (state == RmState::Pulledin)
@@ -144,7 +141,7 @@ sc_time RefreshManagerPerBank::evaluate()
{
state = State::Regular;
timeForNextTrigger += memSpec.getRefreshIntervalPB();
return timeForNextTrigger;
return;
}
else
{
@@ -153,13 +150,10 @@ sc_time RefreshManagerPerBank::evaluate()
else
nextCommand = Command::REFPB;
timeToSchedule = checker.timeToSatisfyConstraints(nextCommand, refreshPayloads.at(*currentIterator));
return timeToSchedule;
return;
}
}
}
else
return timeForNextTrigger;
}
void RefreshManagerPerBank::update(Command command)
@@ -207,3 +201,8 @@ void RefreshManagerPerBank::update(Command command)
break;
}
}
sc_time RefreshManagerPerBank::getTimeForNextTrigger()
{
return timeForNextTrigger;
}

View File

@@ -53,11 +53,12 @@ class RefreshManagerPerBank final : public RefreshManagerIF
{
public:
RefreshManagerPerBank(const Configuration& config, std::vector<BankMachine *>& bankMachinesOnRank,
PowerDownManagerIF& powerDownManager, Rank rank, const CheckerIF& checker);
PowerDownManagerIF& powerDownManager, Rank rank);
CommandTuple::Type getNextCommand() override;
sc_core::sc_time evaluate() override;
void evaluate() override;
void update(Command) override;
sc_core::sc_time getTimeForNextTrigger() override;
private:
enum class State {Regular, Pulledin} state = State::Regular;
@@ -65,8 +66,6 @@ private:
PowerDownManagerIF& powerDownManager;
std::unordered_map<BankMachine*, tlm::tlm_generic_payload> refreshPayloads;
sc_core::sc_time timeForNextTrigger = sc_core::sc_max_time();
sc_core::sc_time timeToSchedule = sc_core::sc_max_time();
const CheckerIF& checker;
Command nextCommand = Command::NOP;
std::list<BankMachine*> remainingBankMachines;

View File

@@ -42,9 +42,8 @@ using namespace tlm;
RefreshManagerSameBank::RefreshManagerSameBank(const Configuration& config,
std::vector<BankMachine*>& bankMachinesOnRank,
PowerDownManagerIF& powerDownManager, Rank rank,
const CheckerIF& checker)
: powerDownManager(powerDownManager), checker(checker), memSpec(*config.memSpec),
PowerDownManagerIF& powerDownManager, Rank rank)
: powerDownManager(powerDownManager), memSpec(*config.memSpec),
maxPostponed(static_cast<int>(config.refreshMaxPostponed * memSpec.banksPerGroup)),
maxPulledin(-static_cast<int>(config.refreshMaxPulledin * memSpec.banksPerGroup)),
refreshManagement(config.refreshManagement)
@@ -79,19 +78,18 @@ CommandTuple::Type RefreshManagerSameBank::getNextCommand()
{
return {nextCommand,
&refreshPayloads[currentIterator->front()->getBank().ID() % memSpec.banksPerGroup],
std::max(timeToSchedule, sc_time_stamp())};
SC_ZERO_TIME};
}
sc_time RefreshManagerSameBank::evaluate()
void RefreshManagerSameBank::evaluate()
{
timeToSchedule = sc_max_time();
nextCommand = Command::NOP;
if (sc_time_stamp() >= timeForNextTrigger)
{
powerDownManager.triggerInterruption();
if (sleeping)
return timeToSchedule;
return;
if (sc_time_stamp() >= timeForNextTrigger + memSpec.getRefreshIntervalSB())
{
@@ -152,10 +150,7 @@ sc_time RefreshManagerSameBank::evaluate()
it->block();
skipSelection = true;
}
timeToSchedule = checker.timeToSatisfyConstraints(nextCommand,
refreshPayloads[currentIterator->front()->getBank().ID() % memSpec.banksPerGroup]);
return timeToSchedule;
return;
}
}
else // if (state == RmState::Pulledin)
@@ -198,10 +193,7 @@ sc_time RefreshManagerSameBank::evaluate()
break;
}
}
timeToSchedule = checker.timeToSatisfyConstraints(nextCommand,
refreshPayloads[currentIterator->front()->getBank().ID() % memSpec.banksPerGroup]);
return timeToSchedule;
return;
}
}
}
@@ -237,9 +229,7 @@ sc_time RefreshManagerSameBank::evaluate()
if (groupIt->isActivated())
nextCommand = Command::PRESB;
}
timeToSchedule = checker.timeToSatisfyConstraints(nextCommand,
refreshPayloads[currentIterator->front()->getBank().ID() % memSpec.banksPerGroup]);
return timeToSchedule;
return;
}
else if (!imtCandidates.empty())
{
@@ -274,14 +264,10 @@ sc_time RefreshManagerSameBank::evaluate()
break;
}
}
timeToSchedule = checker.timeToSatisfyConstraints(nextCommand,
refreshPayloads[currentIterator->front()->getBank().ID() % memSpec.banksPerGroup]);
return timeToSchedule;
return;
}
}
}
return timeForNextTrigger;
}
void RefreshManagerSameBank::update(Command command)
@@ -329,3 +315,8 @@ void RefreshManagerSameBank::update(Command command)
break;
}
}
sc_time RefreshManagerSameBank::getTimeForNextTrigger()
{
return timeForNextTrigger;
}

View File

@@ -52,11 +52,12 @@ class RefreshManagerSameBank final : public RefreshManagerIF
{
public:
RefreshManagerSameBank(const Configuration& config, std::vector<BankMachine *>& bankMachinesOnRank,
PowerDownManagerIF& powerDownManager, Rank rank, const CheckerIF& checker);
PowerDownManagerIF& powerDownManager, Rank rank);
CommandTuple::Type getNextCommand() override;
sc_core::sc_time evaluate() override;
void evaluate() override;
void update(Command) override;
sc_core::sc_time getTimeForNextTrigger() override;
private:
enum class State {Regular, Pulledin} state = State::Regular;
@@ -64,8 +65,6 @@ private:
PowerDownManagerIF& powerDownManager;
std::vector<tlm::tlm_generic_payload> refreshPayloads;
sc_core::sc_time timeForNextTrigger = sc_core::sc_max_time();
sc_core::sc_time timeToSchedule = sc_core::sc_max_time();
const CheckerIF& checker;
Command nextCommand = Command::NOP;
std::list<std::vector<BankMachine *>> remainingBankMachines;