constrained refresh/powerdown to both/none bankwise

This commit is contained in:
robert
2014-04-08 11:17:42 +02:00
parent c1841e4102
commit 5b14ec3583
5 changed files with 29 additions and 12 deletions

3
dram/.gitignore vendored
View File

@@ -1,3 +1,4 @@
/build-simulation
*.tdb
*.tdb-journal
*.tdb-journal
*.out

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);