diff --git a/DRAMSys/simulator/src/controller/Command.cpp b/DRAMSys/simulator/src/controller/Command.cpp index e85f4d91..4c5f4aa2 100644 --- a/DRAMSys/simulator/src/controller/Command.cpp +++ b/DRAMSys/simulator/src/controller/Command.cpp @@ -87,6 +87,10 @@ std::string commandToString(Command command) return "SREFX"; break; + case Command::NOP: + return "NOP"; + break; + default: SC_REPORT_FATAL("command", "commandToString was called with unknown command"); break; diff --git a/DRAMSys/simulator/src/controller/Controller.h b/DRAMSys/simulator/src/controller/Controller.h index e3f11ff5..38a8142e 100644 --- a/DRAMSys/simulator/src/controller/Controller.h +++ b/DRAMSys/simulator/src/controller/Controller.h @@ -460,7 +460,7 @@ void Controller::scheduleNextFromScheduler(Bank bank) { controllerCore->powerDownManager->wakeUp(DramExtension::getExtension(nextRequest.second).getBank(), sc_time_stamp()); controllerCore->scheduleRequest(nextRequest.first, *nextRequest.second); - printDebugMessage("\t-> Next payload was scheduled by core"); + printDebugMessage("\t-> Next payload was scheduled by core [" + commandToString(nextRequest.first) + "]"); } while (!blockedRequests.empty()) { @@ -471,7 +471,7 @@ void Controller::scheduleNextFromScheduler(Bank bank) if (nextRequest.second != NULL) { controllerCore->powerDownManager->wakeUp(DramExtension::getExtension(nextRequest.second).getBank(), sc_time_stamp()); controllerCore->scheduleRequest(nextRequest.first, *nextRequest.second); - printDebugMessage("\t-> Next payload was scheduled by core"); + printDebugMessage("\t-> Next payload was scheduled by core [" + commandToString(nextRequest.first) + "] (unblocked)"); } } diff --git a/DRAMSys/simulator/src/controller/ControllerState.cpp b/DRAMSys/simulator/src/controller/ControllerState.cpp index 4d841f4e..653cb666 100644 --- a/DRAMSys/simulator/src/controller/ControllerState.cpp +++ b/DRAMSys/simulator/src/controller/ControllerState.cpp @@ -73,6 +73,8 @@ const ScheduledCommand ControllerState::getLastScheduledCommand() } } + printDebugMessage("Last scheduled command was " + commandToString(lastCommand.getCommand())); + return lastCommand; } @@ -87,6 +89,8 @@ const ScheduledCommand ControllerState::getLastScheduledCommand(Bank bank) lastCommand = current; } + printDebugMessage("Last scheduled command on bank " + to_string(bank.ID()) + " was " + commandToString(lastCommand.getCommand())); + return lastCommand; } @@ -145,3 +149,9 @@ void ControllerState::cleanUp(sc_time time) if(time >= config->memSpec.tActHistory()) lastActivates.erase(lastActivates.begin(), lastActivates.lower_bound(time - config->memSpec.tActHistory())); } + +void ControllerState::printDebugMessage(std::string message) +{ + DebugManager::getInstance().printDebugMessage(ownerName, message); +} + diff --git a/DRAMSys/simulator/src/controller/ControllerState.h b/DRAMSys/simulator/src/controller/ControllerState.h index 4c991133..bcbaa9fa 100644 --- a/DRAMSys/simulator/src/controller/ControllerState.h +++ b/DRAMSys/simulator/src/controller/ControllerState.h @@ -48,9 +48,9 @@ class ControllerState { public: - ControllerState(std::string ownerName, Configuration* config) : bus(config->memSpec.clk), config(config) + ControllerState(std::string ownerName, Configuration* config) : bus(config->memSpec.clk), config(config), ownerName(ownerName) { - rowBufferStates = new RowBufferState(ownerName); + rowBufferStates = new RowBufferState(ownerName); } virtual ~ControllerState(){} @@ -75,7 +75,9 @@ public: std::map lastActivates; private: + std::string ownerName; Configuration* config; + void printDebugMessage(std::string message); }; #endif /* CONTROLLER_STATE_H_ */ diff --git a/DRAMSys/simulator/src/controller/core/powerdown/IPowerDownManager.h b/DRAMSys/simulator/src/controller/core/powerdown/IPowerDownManager.h index b74ff975..48972149 100644 --- a/DRAMSys/simulator/src/controller/core/powerdown/IPowerDownManager.h +++ b/DRAMSys/simulator/src/controller/core/powerdown/IPowerDownManager.h @@ -82,6 +82,7 @@ inline Command IPowerDownManager::getSleepCommand(PowerDownState state) break; default: SC_REPORT_FATAL("In PowerDownManager sendPowerdownBegin", "invalid powerDownState"); + break; } return cmd; } diff --git a/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManager.cpp b/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManager.cpp index 6877c17a..80493bb4 100644 --- a/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManager.cpp +++ b/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManager.cpp @@ -105,6 +105,8 @@ void PowerDownManager::sleep(Bank bank, sc_time time) void PowerDownManager::wakeUp(Bank bank, sc_time time) { + printDebugMessage("Waking up at " + time.to_string() + " current power down state is " + powerDownStateToString(powerDownState)); + if (isAwakeForRefresh()) //Request enters system during Refresh { setPowerDownState(PowerDownState::Awake); @@ -116,16 +118,25 @@ void PowerDownManager::wakeUp(Bank bank, sc_time time) DramExtension::getExtension(powerDownPayloads[bank])); controllerCore.getCommandChecker(cmd).delayToSatisfyConstraints(pdn); - if (cmd == Command::SREFX) + if (cmd == Command::SREFX) { + // Leaving Self Refresh. Plan the next refresh. controllerCore.refreshManager->reInitialize(bank, pdn.getEnd()); + printDebugMessage("Waking up. Leaving Self Refresh at " + time.to_string() + " next refresh planned to " + pdn.getEnd().to_string()); + } setPowerDownState(PowerDownState::Awake); + + printDebugMessage("Sending power down exit command " + commandToString(cmd) + " on all banks"); sendPowerDownPayloads(pdn); } + + printDebugMessage("Awaken at " + time.to_string() + " current power down state is " + powerDownStateToString(powerDownState)); } void PowerDownManager::wakeUpForRefresh(Bank bank, sc_time time) { + printDebugMessage("Waking up for refresh at " + time.to_string() + " current power down state is " + powerDownStateToString(powerDownState)); + if (isInPowerDown()) { Command cmd = IPowerDownManager::getWakeUpCommand(powerDownState); @@ -133,8 +144,12 @@ void PowerDownManager::wakeUpForRefresh(Bank bank, sc_time time) DramExtension::getExtension(powerDownPayloads[bank])); setPowerDownState(PowerDownState::AwakeForRefresh); + + printDebugMessage("Sending power down exit command " + commandToString(cmd) + " on all banks"); sendPowerDownPayloads(pdn); } + + printDebugMessage("Awaken for refresh at " + time.to_string() + " current power down state is " + powerDownStateToString(powerDownState)); } void PowerDownManager::sendPowerDownPayloads(ScheduledCommand& cmd) @@ -144,9 +159,9 @@ void PowerDownManager::sendPowerDownPayloads(ScheduledCommand& cmd) { tlm_generic_payload& payloadToSend = powerDownPayloads[bank]; - ScheduledCommand pdnToSend(cmd.getCommand(), cmd.getStart(), cmd.getExecutionTime(), - DramExtension::getExtension(payloadToSend)); + ScheduledCommand pdnToSend(cmd.getCommand(), cmd.getStart(), cmd.getExecutionTime(), DramExtension::getExtension(payloadToSend)); controllerCore.state->change(pdnToSend); + printDebugMessage("Sending power down command " + commandToString(pdnToSend.getCommand()) + " on bank " + to_string(pdnToSend.getBank().ID()) + " start time " + pdnToSend.getStart().to_string() + " end time " + pdnToSend.getEnd().to_string()); controllerCore.controller.send(pdnToSend, payloadToSend); } } diff --git a/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerBankwise.cpp b/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerBankwise.cpp index a3ef6df1..266c4f26 100644 --- a/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerBankwise.cpp +++ b/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerBankwise.cpp @@ -110,7 +110,6 @@ void PowerDownManagerBankwise::wakeUp(Bank bank, sc_time time) // Leaving Self Refresh. Plan the next refresh. controllerCore.refreshManager->reInitialize(bank, pdnExit.getEnd()); printDebugMessage("Waking up. Leaving Self Refresh on Bank " + to_string(bank.ID()) + " at " + time.to_string() + " next refresh planned to " + pdnExit.getEnd().to_string()); - } setState(PowerDownState::Awake, bank); diff --git a/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerTimeout.cpp b/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerTimeout.cpp index 42ebadb3..a1763d18 100644 --- a/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerTimeout.cpp +++ b/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerTimeout.cpp @@ -46,6 +46,7 @@ using namespace tlm; PowerDownManagerTimeout::PowerDownManagerTimeout(sc_module_name /*name*/, ControllerCore& controller): controllerCore(controller) { + powerDownState = PowerDownState::Awake; for (Bank bank : controller.getBanks()) { setUpDummy(powerDownPayloads[bank], bank); @@ -113,6 +114,8 @@ void PowerDownManagerTimeout::setPowerDownState(PowerDownState state) void PowerDownManagerTimeout::wakeUp(Bank bank, sc_time time) { + printDebugMessage("Waking up at " + time.to_string() + " current power down state is " + powerDownStateToString(powerDownState)); + if (isInPowerDown()) //Request wakes up power down { Command cmd = IPowerDownManager::getWakeUpCommand(powerDownState); @@ -120,16 +123,25 @@ void PowerDownManagerTimeout::wakeUp(Bank bank, sc_time time) DramExtension::getExtension(powerDownPayloads[bank])); controllerCore.getCommandChecker(cmd).delayToSatisfyConstraints(pdn); - if (cmd == Command::SREFX) + if (cmd == Command::SREFX) { + // Leaving Self Refresh. Plan the next refresh. controllerCore.refreshManager->reInitialize(bank, pdn.getEnd()); + printDebugMessage("Waking up. Leaving Self Refresh at " + time.to_string() + " next refresh planned to " + pdn.getEnd().to_string()); + } setPowerDownState(PowerDownState::Awake); + + printDebugMessage("Sending power down exit command " + commandToString(cmd) + " on all banks"); sendPowerDownPayloads(pdn); } + + printDebugMessage("Awaken at " + time.to_string() + " current power down state is " + powerDownStateToString(powerDownState)); } void PowerDownManagerTimeout::wakeUpForRefresh(Bank bank, sc_time time) { + printDebugMessage("Waking up for refresh at " + time.to_string() + " current power down state is " + powerDownStateToString(powerDownState)); + if (isInPowerDown()) { Command cmd = IPowerDownManager::getWakeUpCommand(powerDownState); @@ -137,10 +149,14 @@ void PowerDownManagerTimeout::wakeUpForRefresh(Bank bank, sc_time time) DramExtension::getExtension(powerDownPayloads[bank])); setPowerDownState(PowerDownState::AwakeForRefresh); + + printDebugMessage("Sending power down exit command " + commandToString(cmd) + " on all banks"); sendPowerDownPayloads(pdn); // Schedule Next Powerdown after Refresh: } + + printDebugMessage("Awaken for refresh at " + time.to_string() + " current power down state is " + powerDownStateToString(powerDownState)); } void PowerDownManagerTimeout::triggerSleep(Bank /*bank*/, sc_time time) diff --git a/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerTimeout.h b/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerTimeout.h index a8c1feb5..46dfb866 100644 --- a/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerTimeout.h +++ b/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerTimeout.h @@ -66,7 +66,7 @@ private: std::map powerDownPayloads; void sendPowerDownPayloads(ScheduledCommand& cmd); - PowerDownState powerDownState = PowerDownState::Awake; + PowerDownState powerDownState; void setPowerDownState(PowerDownState state); bool isInPowerDown(); void printDebugMessage(std::string message);