constrained refresh/powerdown to both/none bankwise
This commit is contained in:
3
dram/.gitignore
vendored
3
dram/.gitignore
vendored
@@ -1,3 +1,4 @@
|
||||
/build-simulation
|
||||
*.tdb
|
||||
*.tdb-journal
|
||||
*.tdb-journal
|
||||
*.out
|
||||
@@ -15,7 +15,7 @@ namespace core{
|
||||
|
||||
struct Configuration
|
||||
{
|
||||
Configuration(): NumberOfBanks(8), NumberOfBankGroups(4), Burstlength(2), Timings(NumberOfBanks), BankwiseRefresh(false),BankwisePowerDown(false),
|
||||
Configuration(): NumberOfBanks(8), NumberOfBankGroups(4), Burstlength(2), Timings(NumberOfBanks), BankwiseRefresh(true),BankwisePowerDown(true),
|
||||
nActivate(2)
|
||||
{}
|
||||
unsigned int NumberOfBanks;
|
||||
|
||||
@@ -24,9 +24,11 @@ namespace core {
|
||||
|
||||
std::string ControllerCore::senderName = "Controller Core";
|
||||
|
||||
ControllerCore::ControllerCore(IWrapperConnector& wrapperConnector, std::map<Bank, int>& numberOfPayloads) :
|
||||
config(), state(&config), wrapper(wrapperConnector), commandChecker(), numberOfPayloads(numberOfPayloads), savedState(
|
||||
&config), commandSequenceGenerator(state), commandSequenceScheduler(*this)
|
||||
ControllerCore::ControllerCore(IWrapperConnector& wrapperConnector,
|
||||
std::map<Bank, int>& numberOfPayloads) :
|
||||
config(), state(&config), wrapper(wrapperConnector), commandChecker(), numberOfPayloads(
|
||||
numberOfPayloads), savedState(&config), commandSequenceGenerator(state), commandSequenceScheduler(
|
||||
*this)
|
||||
|
||||
{
|
||||
commandChecker[Command::Activate] = new ActivateChecker(config, state);
|
||||
@@ -76,21 +78,25 @@ void ControllerCore::triggerRefresh(tlm::tlm_generic_payload& payload, sc_time t
|
||||
if (refreshManager->isInvalidated(payload, time))
|
||||
return;
|
||||
|
||||
if (!powerDownManager->isInSelfRefresh(bank))
|
||||
if (config.BankwisePowerDown && config.BankwiseRefresh)
|
||||
{
|
||||
if(config.BankwiseRefresh)
|
||||
if (!powerDownManager->isInSelfRefresh(bank))
|
||||
{
|
||||
printDebugMessage("Waking up bank " + to_string(bank.ID()) + " for refresh");
|
||||
powerDownManager->wakeUpForRefresh(bank, time);//expects PDNA and PDNP to exit without delay
|
||||
powerDownManager->wakeUpForRefresh(bank, time); //expects PDNA and PDNP to exit without delay
|
||||
refreshManager->scheduleRefresh(payload, time);
|
||||
}
|
||||
else
|
||||
}
|
||||
else if (!config.BankwisePowerDown && !config.BankwiseRefresh)
|
||||
{
|
||||
if (!powerDownManager->allBanksInSelfRefresh())
|
||||
{
|
||||
printDebugMessage("Waking up all banks for refresh");
|
||||
powerDownManager->wakeUpAllForRefresh(time);
|
||||
refreshManager->scheduleRefresh(payload, time);
|
||||
}
|
||||
|
||||
refreshManager->scheduleRefresh(payload, time);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void ControllerCore::triggerWakeUp(tlm::tlm_generic_payload& payload, sc_time time)
|
||||
@@ -184,7 +190,6 @@ void ControllerCore::send(const CommandSchedule& schedule, tlm::tlm_generic_payl
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ICommandChecker& ControllerCore::getCommandChecker(Command command)
|
||||
{
|
||||
return *getElementFromMap(commandChecker, command);
|
||||
|
||||
@@ -114,6 +114,16 @@ bool PowerDownManager::isInSelfRefresh(Bank bank)
|
||||
return getPowerDownState(bank) == PowerDownState::PDNSelfRefresh;
|
||||
}
|
||||
|
||||
bool PowerDownManager::allBanksInSelfRefresh()
|
||||
{
|
||||
for (Bank bank : controller.getBanks())
|
||||
{
|
||||
if(!isInSelfRefresh(bank))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PowerDownManager::isAwakeForRefresh(Bank bank)
|
||||
{
|
||||
return getPowerDownState(bank) == PowerDownState::AwakeForRefresh;
|
||||
|
||||
@@ -37,6 +37,7 @@ public:
|
||||
virtual void wakeUpAllForRefresh(sc_time time);
|
||||
|
||||
virtual bool isInSelfRefresh(Bank bank);
|
||||
virtual bool allBanksInSelfRefresh();
|
||||
virtual bool isInPowerDown(Bank bank);
|
||||
virtual bool isAwake(Bank bank);
|
||||
virtual bool isAwakeForRefresh(Bank bank);
|
||||
|
||||
Reference in New Issue
Block a user