diff --git a/dram/.gitignore b/dram/.gitignore index 2825cd92..c1bea3e6 100644 --- a/dram/.gitignore +++ b/dram/.gitignore @@ -1,3 +1,4 @@ /build-simulation *.tdb -*.tdb-journal \ No newline at end of file +*.tdb-journal +*.out \ No newline at end of file diff --git a/dram/src/core/Configuration.h b/dram/src/core/Configuration.h index 3b6399e2..3e4224ff 100644 --- a/dram/src/core/Configuration.h +++ b/dram/src/core/Configuration.h @@ -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; diff --git a/dram/src/core/ControllerCore.cpp b/dram/src/core/ControllerCore.cpp index a43bac47..df47f4ef 100644 --- a/dram/src/core/ControllerCore.cpp +++ b/dram/src/core/ControllerCore.cpp @@ -24,9 +24,11 @@ namespace core { std::string ControllerCore::senderName = "Controller Core"; -ControllerCore::ControllerCore(IWrapperConnector& wrapperConnector, std::map& numberOfPayloads) : - config(), state(&config), wrapper(wrapperConnector), commandChecker(), numberOfPayloads(numberOfPayloads), savedState( - &config), commandSequenceGenerator(state), commandSequenceScheduler(*this) +ControllerCore::ControllerCore(IWrapperConnector& wrapperConnector, + std::map& 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); diff --git a/dram/src/core/powerdown/PowerDownManager.cpp b/dram/src/core/powerdown/PowerDownManager.cpp index 1f1c29b0..98a53fc8 100644 --- a/dram/src/core/powerdown/PowerDownManager.cpp +++ b/dram/src/core/powerdown/PowerDownManager.cpp @@ -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; diff --git a/dram/src/core/powerdown/PowerDownManager.h b/dram/src/core/powerdown/PowerDownManager.h index 4ae685e0..62b274dc 100644 --- a/dram/src/core/powerdown/PowerDownManager.h +++ b/dram/src/core/powerdown/PowerDownManager.h @@ -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);