Remove checker from BM, RM and PDM.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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};
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user