Removed refresh and power down.

This commit is contained in:
Lukas Steiner (2)
2019-07-19 10:29:14 +02:00
parent f43ea71e95
commit 41e2db0b5a
21 changed files with 2211 additions and 2210 deletions

View File

@@ -249,12 +249,12 @@ void Controller::controllerCorePEQCallback(tlm_generic_payload &payload,
{
if (phase == REF_TRIGGER)
{
controllerCore->triggerRefresh(payload);
//controllerCore->triggerRefresh(payload);
}
else if (phase == PDN_TRIGGER)
{
controllerCore->powerDownManager->sleep(DramExtension::getExtension(
payload).getBank(), sc_time_stamp());
//controllerCore->powerDownManager->sleep(DramExtension::getExtension(
// payload).getBank(), sc_time_stamp());
}
else
{
@@ -343,6 +343,7 @@ void Controller::frontendPEQCallback(tlm_generic_payload &payload,
sendToFrontend(payload, END_REQ, SC_ZERO_TIME);
scheduler->storeRequest(&payload);
// TODO: remove this
scheduleNextFromScheduler(DramExtension::getExtension(payload).getBank());
}
}
@@ -403,7 +404,7 @@ void Controller::payloadLeavesSystem(tlm_generic_payload &payload)
"Payload left system on bank " + to_string(bank.ID()) +
". Total number of payloads in Controller: "
+ to_string(getTotalNumberOfPayloadsInSystem()));
controllerCore->powerDownManager->triggerSleep(bank, sc_time_stamp());
//controllerCore->powerDownManager->triggerSleep(bank, sc_time_stamp());
}
unsigned int Controller::getTotalNumberOfPayloadsInSystem()
@@ -477,8 +478,8 @@ void Controller::scheduleNextFromScheduler(Bank bank)
void Controller::schedule(Command command, gp &payload)
{
controllerCore->powerDownManager->wakeUp(DramExtension::getBank(payload),
sc_time_stamp());
//controllerCore->powerDownManager->wakeUp(DramExtension::getBank(payload),
// sc_time_stamp());
if (controllerCore->scheduleRequest(command, payload))
{
printDebugMessage("\t-> Next payload was scheduled by core [" + commandToString(
@@ -538,15 +539,15 @@ void Controller::dramPEQCallback(tlm_generic_payload &payload,
scheduleNextFromScheduler(bank);
}
}
if (sleepy == true)
controllerCore->powerDownManager->sleep(0, sc_time_stamp());
//if (sleepy == true)
//controllerCore->powerDownManager->sleep(0, sc_time_stamp());
}
else if (phase == END_REFB)
{
printDebugMessage("Finished auto refresh on bank " + to_string(bank.ID()));
if (numberOfPayloadsInSystem[bank] == 0)
controllerCore->powerDownManager->sleep(bank, sc_time_stamp());
if (numberOfPayloadsInSystem[bank] == 0) {}
//controllerCore->powerDownManager->sleep(bank, sc_time_stamp());
else
scheduleNextFromScheduler(bank);
@@ -603,10 +604,10 @@ void Controller::terminateSimulation()
{
if (Configuration::getInstance().BankwiseLogic) {
for (Bank bank : controllerCore->getBanks()) {
controllerCore->powerDownManager->wakeUp(bank, clkAlign(sc_time_stamp()));
//controllerCore->powerDownManager->wakeUp(bank, clkAlign(sc_time_stamp()));
}
} else {
controllerCore->powerDownManager->wakeUp(0, clkAlign(sc_time_stamp()));
//controllerCore->powerDownManager->wakeUp(0, clkAlign(sc_time_stamp()));
}
endTime = sc_time_stamp();

View File

@@ -89,33 +89,33 @@ ControllerCore::ControllerCore(sc_module_name /*name*/,
timingChecker = new CheckerDDR3New(config, *state);
if (config.RowGranularRef) {
refreshManager = new RGR("RGR", *this);
} else {
if (config.BankwiseLogic) {
refreshManager = new RefreshManagerBankwise("refManagerBw", *this);
} else {
refreshManager = new RefreshManager("refManager", *this);
}
}
// if (config.RowGranularRef) {
// refreshManager = new RGR("RGR", *this);
// } else {
// if (config.BankwiseLogic) {
// refreshManager = new RefreshManagerBankwise("refManagerBw", *this);
// } else {
// refreshManager = new RefreshManager("refManager", *this);
// }
// }
if (config.PowerDownMode == EPowerDownMode::Staggered) {
if (config.BankwiseLogic)
powerDownManager = new PowerDownManagerBankwise("pdnManagerBw", *this);
else
powerDownManager = new PowerDownManager("pdnManager", *this);
} else if (config.PowerDownMode == EPowerDownMode::TimeoutPDN
|| config.PowerDownMode == EPowerDownMode::TimeoutSREF) {
if (config.BankwiseLogic)
powerDownManager = new PowerDownManagerTimeoutBankwise("pdnManagerBw", *this);
else
powerDownManager = new PowerDownManagerTimeout("pdnManager", *this);
} else if (config.PowerDownMode == EPowerDownMode::NoPowerDown) {
powerDownManager = new NoPowerDown();
} else {
SC_REPORT_FATAL(0,
"Unsupported powerdown mode in constructor of controller core");
}
// if (config.PowerDownMode == EPowerDownMode::Staggered) {
// if (config.BankwiseLogic)
// powerDownManager = new PowerDownManagerBankwise("pdnManagerBw", *this);
// else
// powerDownManager = new PowerDownManager("pdnManager", *this);
// } else if (config.PowerDownMode == EPowerDownMode::TimeoutPDN
// || config.PowerDownMode == EPowerDownMode::TimeoutSREF) {
// if (config.BankwiseLogic)
// powerDownManager = new PowerDownManagerTimeoutBankwise("pdnManagerBw", *this);
// else
// powerDownManager = new PowerDownManagerTimeout("pdnManager", *this);
// } else if (config.PowerDownMode == EPowerDownMode::NoPowerDown) {
// powerDownManager = new NoPowerDown();
// } else {
// SC_REPORT_FATAL(0,
// "Unsupported powerdown mode in constructor of controller core");
// }
}
ControllerCore::~ControllerCore()
@@ -128,38 +128,38 @@ ControllerCore::~ControllerCore()
delete commandChecker[Command::REFA];
delete commandChecker[Command::PDEA];
delete timingChecker;
delete refreshManager;
delete powerDownManager;
//delete refreshManager;
//delete powerDownManager;
delete state;
}
void ControllerCore::triggerRefresh(tlm::tlm_generic_payload &payload)
{
/* Refresh can be disabled for tests purpose */
if (config.ControllerCoreRefDisable == false)
{
sc_time time = sc_time_stamp();
Bank bank = DramExtension::getExtension(payload).getBank();
//void ControllerCore::triggerRefresh(tlm::tlm_generic_payload &payload)
//{
// /* Refresh can be disabled for tests purpose */
// if (config.ControllerCoreRefDisable == false)
// {
// sc_time time = sc_time_stamp();
// Bank bank = DramExtension::getExtension(payload).getBank();
state->cleanUp(time);
// state->cleanUp(time);
if (!refreshManager->isInvalidated(payload, time)
&& !powerDownManager->isInSelfRefresh(bank))
{
printDebugMessage("Triggering refresh on bank " + to_string(bank.ID()));
powerDownManager->wakeUpForRefresh(bank,
time); //expects PDNA and PDNP to exit without delay
bool pdnpToSrefTransition = false;
if (config.PowerDownMode == EPowerDownMode::Staggered)
pdnpToSrefTransition = (state->getLastCommand(Command::PDXP,
bank).getStart() >= time);
if (pdnpToSrefTransition)
powerDownManager->sleep(bank, time);
else
refreshManager->scheduleRefresh(payload, time);
}
}
}
// if (!refreshManager->isInvalidated(payload, time)
// && !powerDownManager->isInSelfRefresh(bank))
// {
// printDebugMessage("Triggering refresh on bank " + to_string(bank.ID()));
// powerDownManager->wakeUpForRefresh(bank,
// time); //expects PDNA and PDNP to exit without delay
// bool pdnpToSrefTransition = false;
// if (config.PowerDownMode == EPowerDownMode::Staggered)
// pdnpToSrefTransition = (state->getLastCommand(Command::PDXP,
// bank).getStart() >= time);
// if (pdnpToSrefTransition)
// powerDownManager->sleep(bank, time);
// else
// refreshManager->scheduleRefresh(payload, time);
// }
// }
//}
bool ControllerCore::scheduleRequest(Command command,
tlm::tlm_generic_payload &payload)
@@ -167,23 +167,23 @@ bool ControllerCore::scheduleRequest(Command command,
sc_time start = clkAlign(sc_time_stamp());
state->cleanUp(start);
ScheduledCommand scheduledCommand = schedule(command, start, payload);
if (config.ControllerCoreRefDisable)
{
//if (config.ControllerCoreRefDisable)
//{
state->change(scheduledCommand);
controller.send(scheduledCommand, payload);
return true;
}
else
{
if (!((command == Command::PRE || command == Command::ACT)
&& refreshManager->hasCollision(scheduledCommand)))
{
state->change(scheduledCommand);
controller.send(scheduledCommand, payload);
return true;
}
}
return false;
// }
// else
// {
// if (!((command == Command::PRE || command == Command::ACT)
// && refreshManager->hasCollision(scheduledCommand)))
// {
// state->change(scheduledCommand);
// controller.send(scheduledCommand, payload);
// return true;
// }
// }
// return false;
}
ScheduledCommand ControllerCore::schedule(Command command, sc_time start,

View File

@@ -59,7 +59,7 @@ public:
virtual ~ControllerCore();
bool scheduleRequest(Command command, tlm::tlm_generic_payload &payload);
void triggerRefresh(tlm::tlm_generic_payload &payload);
//void triggerRefresh(tlm::tlm_generic_payload &payload);
const std::vector<Bank> &getBanks();
std::vector<Bank> getFreeBanks();
@@ -76,8 +76,8 @@ public:
Configuration config;
ControllerState *state;
IController &controller;
IPowerDownManager *powerDownManager;
IRefreshManager *refreshManager;
//IPowerDownManager *powerDownManager;
//IRefreshManager *refreshManager;
std::map<Bank, int> &numberOfPayloads;
private:

View File

@@ -1,129 +1,129 @@
/*
* Copyright (c) 2015, University of Kaiserslautern
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors:
* Janik Schlemminger
* Matthias Jung
*/
///*
// * Copyright (c) 2015, University of Kaiserslautern
// * All rights reserved.
// *
// * Redistribution and use in source and binary forms, with or without
// * modification, are permitted provided that the following conditions are
// * met:
// *
// * 1. Redistributions of source code must retain the above copyright notice,
// * this list of conditions and the following disclaimer.
// *
// * 2. Redistributions in binary form must reproduce the above copyright
// * notice, this list of conditions and the following disclaimer in the
// * documentation and/or other materials provided with the distribution.
// *
// * 3. Neither the name of the copyright holder nor the names of its
// * contributors may be used to endorse or promote products derived from
// * this software without specific prior written permission.
// *
// * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
// * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// *
// * Authors:
// * Janik Schlemminger
// * Matthias Jung
// */
#ifndef IPOWERDOWNMANAGER_H
#define IPOWERDOWNMANAGER_H
//#ifndef IPOWERDOWNMANAGER_H
//#define IPOWERDOWNMANAGER_H
#include <systemc.h>
#include "../../../common/dramExtensions.h"
#include "../../Command.h"
//#include <systemc.h>
//#include "../../../common/dramExtensions.h"
//#include "../../Command.h"
enum class PowerDownState {
Awake, AwakeForRefresh, PDNActive, PDNPrecharge, PDNSelfRefresh
};
//enum class PowerDownState {
// Awake, AwakeForRefresh, PDNActive, PDNPrecharge, PDNSelfRefresh
//};
class IPowerDownManager
{
public:
virtual ~IPowerDownManager() {}
//class IPowerDownManager
//{
//public:
// virtual ~IPowerDownManager() {}
virtual void sleep(Bank bank, sc_time time) = 0;
virtual void triggerSleep(Bank bank, sc_time time) = 0;
// virtual void sleep(Bank bank, sc_time time) = 0;
// virtual void triggerSleep(Bank bank, sc_time time) = 0;
virtual void wakeUp(Bank bank, sc_time time) = 0;
virtual void wakeUpForRefresh(Bank bank, sc_time time) = 0;
// virtual void wakeUp(Bank bank, sc_time time) = 0;
// virtual void wakeUpForRefresh(Bank bank, sc_time time) = 0;
virtual bool isInSelfRefresh(Bank bank) = 0;
// virtual bool isInSelfRefresh(Bank bank) = 0;
protected:
Command getSleepCommand(PowerDownState state);
Command getWakeUpCommand(PowerDownState state);
//protected:
// Command getSleepCommand(PowerDownState state);
// Command getWakeUpCommand(PowerDownState state);
};
//};
inline Command IPowerDownManager::getSleepCommand(PowerDownState state)
{
Command cmd(Command::NOP);
switch (state) {
case PowerDownState::PDNActive:
cmd = Command::PDEA;
break;
case PowerDownState::PDNPrecharge:
cmd = Command::PDEP;
break;
case PowerDownState::PDNSelfRefresh:
cmd = Command::SREFEN;
break;
default:
SC_REPORT_FATAL("In PowerDownManager sendPowerdownBegin",
"invalid powerDownState");
break;
}
return cmd;
}
//inline Command IPowerDownManager::getSleepCommand(PowerDownState state)
//{
// Command cmd(Command::NOP);
// switch (state) {
// case PowerDownState::PDNActive:
// cmd = Command::PDEA;
// break;
// case PowerDownState::PDNPrecharge:
// cmd = Command::PDEP;
// break;
// case PowerDownState::PDNSelfRefresh:
// cmd = Command::SREFEN;
// break;
// default:
// SC_REPORT_FATAL("In PowerDownManager sendPowerdownBegin",
// "invalid powerDownState");
// break;
// }
// return cmd;
//}
inline Command IPowerDownManager::getWakeUpCommand(PowerDownState state)
//inline Command IPowerDownManager::getWakeUpCommand(PowerDownState state)
{
Command cmd(Command::NOP);
switch (state) {
case PowerDownState::PDNActive:
cmd = Command::PDXA;
break;
case PowerDownState::PDNPrecharge:
cmd = Command::PDXP;
break;
case PowerDownState::PDNSelfRefresh:
cmd = Command::SREFEX;
break;
default:
SC_REPORT_FATAL("In PowerDownManager sendPowerdownEnd",
"invalid powerDownState");
}
return cmd;
}
//{
// Command cmd(Command::NOP);
// switch (state) {
// case PowerDownState::PDNActive:
// cmd = Command::PDXA;
// break;
// case PowerDownState::PDNPrecharge:
// cmd = Command::PDXP;
// break;
// case PowerDownState::PDNSelfRefresh:
// cmd = Command::SREFEX;
// break;
// default:
// SC_REPORT_FATAL("In PowerDownManager sendPowerdownEnd",
// "invalid powerDownState");
// }
// return cmd;
//}
inline std::string powerDownStateToString(PowerDownState powerDownState)
{
switch (powerDownState) {
case PowerDownState::Awake:
return "Awake";
case PowerDownState::AwakeForRefresh:
return "Awake for refresh";
case PowerDownState::PDNActive:
return "PDN Active";
case PowerDownState::PDNPrecharge:
return "PDN Precharged";
case PowerDownState::PDNSelfRefresh:
return "PDN Self refresh";
default:
return "unknown state";
}
}
//inline std::string powerDownStateToString(PowerDownState powerDownState)
//{
// switch (powerDownState) {
// case PowerDownState::Awake:
// return "Awake";
// case PowerDownState::AwakeForRefresh:
// return "Awake for refresh";
// case PowerDownState::PDNActive:
// return "PDN Active";
// case PowerDownState::PDNPrecharge:
// return "PDN Precharged";
// case PowerDownState::PDNSelfRefresh:
// return "PDN Self refresh";
// default:
// return "unknown state";
// }
//}
#endif // IPOWERDOWNMANAGER_H
//#endif // IPOWERDOWNMANAGER_H

View File

@@ -1,63 +1,63 @@
/*
* Copyright (c) 2015, University of Kaiserslautern
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors:
* Janik Schlemminger
* Robert Gernhardt
* Matthias Jung
*/
///*
// * Copyright (c) 2015, University of Kaiserslautern
// * All rights reserved.
// *
// * Redistribution and use in source and binary forms, with or without
// * modification, are permitted provided that the following conditions are
// * met:
// *
// * 1. Redistributions of source code must retain the above copyright notice,
// * this list of conditions and the following disclaimer.
// *
// * 2. Redistributions in binary form must reproduce the above copyright
// * notice, this list of conditions and the following disclaimer in the
// * documentation and/or other materials provided with the distribution.
// *
// * 3. Neither the name of the copyright holder nor the names of its
// * contributors may be used to endorse or promote products derived from
// * this software without specific prior written permission.
// *
// * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
// * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// *
// * Authors:
// * Janik Schlemminger
// * Robert Gernhardt
// * Matthias Jung
// */
#include "NoPowerDown.h"
//#include "NoPowerDown.h"
void NoPowerDown::triggerSleep(Bank /*bank*/, sc_time /*time*/)
{
return;
}
//void NoPowerDown::triggerSleep(Bank /*bank*/, sc_time /*time*/)
//{
// return;
//}
void NoPowerDown::sleep(Bank /*bank*/, sc_time /*time*/)
{
return;
}
//void NoPowerDown::sleep(Bank /*bank*/, sc_time /*time*/)
//{
// return;
//}
void NoPowerDown::wakeUp(Bank /*bank*/, sc_time /*time*/)
{
return;
}
//void NoPowerDown::wakeUp(Bank /*bank*/, sc_time /*time*/)
//{
// return;
//}
void NoPowerDown::wakeUpForRefresh(Bank /*bank*/, sc_time /*time*/)
{
return;
}
//void NoPowerDown::wakeUpForRefresh(Bank /*bank*/, sc_time /*time*/)
//{
// return;
//}
bool NoPowerDown::isInSelfRefresh(Bank /*bank*/)
{
return false;
}
//bool NoPowerDown::isInSelfRefresh(Bank /*bank*/)
//{
// return false;
//}

View File

@@ -1,65 +1,65 @@
/*
* Copyright (c) 2015, University of Kaiserslautern
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors:
* Janik Schlemminger
* Robert Gernhardt
* Matthias Jung
*/
///*
// * Copyright (c) 2015, University of Kaiserslautern
// * All rights reserved.
// *
// * Redistribution and use in source and binary forms, with or without
// * modification, are permitted provided that the following conditions are
// * met:
// *
// * 1. Redistributions of source code must retain the above copyright notice,
// * this list of conditions and the following disclaimer.
// *
// * 2. Redistributions in binary form must reproduce the above copyright
// * notice, this list of conditions and the following disclaimer in the
// * documentation and/or other materials provided with the distribution.
// *
// * 3. Neither the name of the copyright holder nor the names of its
// * contributors may be used to endorse or promote products derived from
// * this software without specific prior written permission.
// *
// * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
// * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// *
// * Authors:
// * Janik Schlemminger
// * Robert Gernhardt
// * Matthias Jung
// */
#ifndef NOPOWERDOWN_H
#define NOPOWERDOWN_H
//#ifndef NOPOWERDOWN_H
//#define NOPOWERDOWN_H
#include "PowerDownManager.h"
#include <systemc.h>
#include "../../../common/dramExtensions.h"
#include "../scheduling/ScheduledCommand.h"
//#include "PowerDownManager.h"
//#include <systemc.h>
//#include "../../../common/dramExtensions.h"
//#include "../scheduling/ScheduledCommand.h"
class NoPowerDown : public IPowerDownManager
{
public:
NoPowerDown() {}
virtual ~NoPowerDown() {}
//class NoPowerDown : public IPowerDownManager
//{
//public:
// NoPowerDown() {}
// virtual ~NoPowerDown() {}
virtual void triggerSleep(Bank bank, sc_time time) override;
virtual void sleep(Bank bank, sc_time time) override;
// virtual void triggerSleep(Bank bank, sc_time time) override;
// virtual void sleep(Bank bank, sc_time time) override;
virtual void wakeUp(Bank bank, sc_time time) override;
virtual void wakeUpForRefresh(Bank bank, sc_time time) override;
// virtual void wakeUp(Bank bank, sc_time time) override;
// virtual void wakeUpForRefresh(Bank bank, sc_time time) override;
virtual bool isInSelfRefresh(Bank bank) override;
};
// virtual bool isInSelfRefresh(Bank bank) override;
//};
#endif // NOPOWERDOWN_H
//#endif // NOPOWERDOWN_H

View File

@@ -1,220 +1,220 @@
/*
* Copyright (c) 2015, University of Kaiserslautern
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors:
* Janik Schlemminger
* Matthias Jung
* Felipe S. Prado
*/
///*
// * Copyright (c) 2015, University of Kaiserslautern
// * All rights reserved.
// *
// * Redistribution and use in source and binary forms, with or without
// * modification, are permitted provided that the following conditions are
// * met:
// *
// * 1. Redistributions of source code must retain the above copyright notice,
// * this list of conditions and the following disclaimer.
// *
// * 2. Redistributions in binary form must reproduce the above copyright
// * notice, this list of conditions and the following disclaimer in the
// * documentation and/or other materials provided with the distribution.
// *
// * 3. Neither the name of the copyright holder nor the names of its
// * contributors may be used to endorse or promote products derived from
// * this software without specific prior written permission.
// *
// * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
// * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// *
// * Authors:
// * Janik Schlemminger
// * Matthias Jung
// * Felipe S. Prado
// */
#include <algorithm>
#include <string>
#include "PowerDownManager.h"
#include "../ControllerCore.h"
#include "../timingCalculations.h"
#include "../../../common/DebugManager.h"
#include <algorithm>
#include "../../../common/utils.h"
//#include <algorithm>
//#include <string>
//#include "PowerDownManager.h"
//#include "../ControllerCore.h"
//#include "../timingCalculations.h"
//#include "../../../common/DebugManager.h"
//#include <algorithm>
//#include "../../../common/utils.h"
using namespace tlm;
using namespace std;
//using namespace tlm;
//using namespace std;
PowerDownManager::PowerDownManager(sc_module_name /*name*/,
ControllerCore &controller) :
controllerCore(controller)
{
powerDownState = PowerDownState::Awake;
for (Bank bank : controller.getBanks()) {
setUpDummy(powerDownPayloads[bank], bank);
}
//controllerCore.controller.send(PDNTrigger, sc_time_stamp(), powerDownPayloads[Bank(0)]);
}
//PowerDownManager::PowerDownManager(sc_module_name /*name*/,
// ControllerCore &controller) :
// controllerCore(controller)
//{
// powerDownState = PowerDownState::Awake;
// for (Bank bank : controller.getBanks()) {
// setUpDummy(powerDownPayloads[bank], bank);
// }
// //controllerCore.controller.send(PDNTrigger, sc_time_stamp(), powerDownPayloads[Bank(0)]);
//}
PowerDownManager::~PowerDownManager()
{
//PowerDownManager::~PowerDownManager()
//{
}
//}
void PowerDownManager::sleep(Bank /*bank*/, sc_time time)
{
if (!canSleep() || isInPowerDown())
return;
//void PowerDownManager::sleep(Bank /*bank*/, sc_time time)
//{
// if (!canSleep() || isInPowerDown())
// return;
PowerDownState state = powerDownState;
// PowerDownState state = powerDownState;
if (state == PowerDownState::Awake) { //coming from active
state = controllerCore.state->rowBufferStates->allRowBuffersAreClosed() ?
PowerDownState::PDNPrecharge : PowerDownState::PDNActive;
} else if (state ==
PowerDownState::AwakeForRefresh) { //coming from refresh interrupting power down
sc_assert(controllerCore.state->rowBufferStates->allRowBuffersAreClosed());
// if (state == PowerDownState::Awake) { //coming from active
// state = controllerCore.state->rowBufferStates->allRowBuffersAreClosed() ?
// PowerDownState::PDNPrecharge : PowerDownState::PDNActive;
// } else if (state ==
// PowerDownState::AwakeForRefresh) { //coming from refresh interrupting power down
// sc_assert(controllerCore.state->rowBufferStates->allRowBuffersAreClosed());
if (controllerCore.state->getLastCommand(Command::PDEA).getStart()
>= controllerCore.state->getLastCommand(Command::PDEP).getStart())
state = PowerDownState::PDNPrecharge;
else {
state = PowerDownState::PDNSelfRefresh;
}
}
// if (controllerCore.state->getLastCommand(Command::PDEA).getStart()
// >= controllerCore.state->getLastCommand(Command::PDEP).getStart())
// state = PowerDownState::PDNPrecharge;
// else {
// state = PowerDownState::PDNSelfRefresh;
// }
// }
Command cmd = IPowerDownManager::getSleepCommand(state);
ScheduledCommand pdn(cmd, time,
Configuration::getInstance().memSpec->getMinExecutionTimeForPowerDownCmd(cmd),
DramExtension::getExtension(powerDownPayloads[Bank(0)]));
// Command cmd = IPowerDownManager::getSleepCommand(state);
// ScheduledCommand pdn(cmd, time,
// Configuration::getInstance().memSpec->getMinExecutionTimeForPowerDownCmd(cmd),
// DramExtension::getExtension(powerDownPayloads[Bank(0)]));
controllerCore.getCommandChecker(cmd).delayToSatisfyConstraints(pdn);
// controllerCore.getCommandChecker(cmd).delayToSatisfyConstraints(pdn);
if (state != PowerDownState::PDNSelfRefresh
&& controllerCore.refreshManager->hasCollision(pdn)) {
return;
} else {
setPowerDownState(state);
sendPowerDownPayload(pdn);
}
}
// if (state != PowerDownState::PDNSelfRefresh
// && controllerCore.refreshManager->hasCollision(pdn)) {
// return;
// } else {
// setPowerDownState(state);
// sendPowerDownPayload(pdn);
// }
//}
void PowerDownManager::wakeUp(Bank bank, sc_time time)
{
printDebugMessage("Waking up at " + time.to_string() +
" current power down state is " + powerDownStateToString(powerDownState));
//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);
} else if (isInPowerDown()) { //Request wakes up power down
Command cmd = IPowerDownManager::getWakeUpCommand(powerDownState);
ScheduledCommand pdn(cmd, time, Configuration::getInstance().memSpec->getExecutionTime(cmd,
powerDownPayloads[Bank(0)]),
DramExtension::getExtension(powerDownPayloads[Bank(0)]));
controllerCore.getCommandChecker(cmd).delayToSatisfyConstraints(pdn);
// if (isAwakeForRefresh()) { //Request enters system during Refresh
// setPowerDownState(PowerDownState::Awake);
// } else if (isInPowerDown()) { //Request wakes up power down
// Command cmd = IPowerDownManager::getWakeUpCommand(powerDownState);
// ScheduledCommand pdn(cmd, time, Configuration::getInstance().memSpec->getExecutionTime(cmd,
// powerDownPayloads[Bank(0)]),
// DramExtension::getExtension(powerDownPayloads[Bank(0)]));
// controllerCore.getCommandChecker(cmd).delayToSatisfyConstraints(pdn);
if (cmd == Command::SREFEX) {
// 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());
}
// if (cmd == Command::SREFEX) {
// // 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);
// setPowerDownState(PowerDownState::Awake);
printDebugMessage("Sending power down exit command " + commandToString(
cmd) + " on all banks");
sendPowerDownPayload(pdn);
}
// printDebugMessage("Sending power down exit command " + commandToString(
// cmd) + " on all banks");
// sendPowerDownPayload(pdn);
// }
printDebugMessage("Awaken at " + time.to_string() +
" current power down state is " + powerDownStateToString(powerDownState));
}
// 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));
//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);
ScheduledCommand pdn(cmd, time, Configuration::getInstance().memSpec->getExecutionTime(cmd,
powerDownPayloads[Bank(0)]),
DramExtension::getExtension(powerDownPayloads[Bank(0)]));
// if (isInPowerDown()) {
// Command cmd = IPowerDownManager::getWakeUpCommand(powerDownState);
// ScheduledCommand pdn(cmd, time, Configuration::getInstance().memSpec->getExecutionTime(cmd,
// powerDownPayloads[Bank(0)]),
// DramExtension::getExtension(powerDownPayloads[Bank(0)]));
setPowerDownState(PowerDownState::AwakeForRefresh);
// setPowerDownState(PowerDownState::AwakeForRefresh);
printDebugMessage("Sending power down exit command " + commandToString(
cmd) + " on all banks");
sendPowerDownPayload(pdn);
}
// printDebugMessage("Sending power down exit command " + commandToString(
// cmd) + " on all banks");
// sendPowerDownPayload(pdn);
// }
printDebugMessage("Awaken for refresh at " + time.to_string() +
" current power down state is " + powerDownStateToString(powerDownState));
}
// printDebugMessage("Awaken for refresh at " + time.to_string() +
// " current power down state is " + powerDownStateToString(powerDownState));
//}
void PowerDownManager::sendPowerDownPayload(ScheduledCommand &pdnToSend)
{
controllerCore.state->bus.moveCommandToNextFreeSlot(pdnToSend);
for (size_t bank = 1; bank < controllerCore.getBanks().size(); bank++) {
tlm_generic_payload &payloadToSend = powerDownPayloads[bank];
//void PowerDownManager::sendPowerDownPayload(ScheduledCommand &pdnToSend)
//{
// controllerCore.state->bus.moveCommandToNextFreeSlot(pdnToSend);
// for (size_t bank = 1; bank < controllerCore.getBanks().size(); bank++) {
// tlm_generic_payload &payloadToSend = powerDownPayloads[bank];
ScheduledCommand pdn(pdnToSend.getCommand(), pdnToSend.getStart(),
pdnToSend.getExecutionTime(), DramExtension::getExtension(payloadToSend));
controllerCore.state->change(pdn);
// ScheduledCommand pdn(pdnToSend.getCommand(), pdnToSend.getStart(),
// pdnToSend.getExecutionTime(), DramExtension::getExtension(payloadToSend));
// controllerCore.state->change(pdn);
}
controllerCore.state->change(pdnToSend);
controllerCore.controller.send(pdnToSend, powerDownPayloads[Bank(0)]);
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.state->change(pdnToSend);
// controllerCore.controller.send(pdnToSend, powerDownPayloads[Bank(0)]);
// 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());
//}
void PowerDownManager::setPowerDownState(PowerDownState state)
{
powerDownState = state;
printDebugMessage("Is now in state " + powerDownStateToString(
powerDownState) + " on all banks");
}
//void PowerDownManager::setPowerDownState(PowerDownState state)
//{
// powerDownState = state;
// printDebugMessage("Is now in state " + powerDownStateToString(
// powerDownState) + " on all banks");
//}
bool PowerDownManager::isInPowerDown()
{
return (powerDownState == PowerDownState::PDNActive
|| powerDownState == PowerDownState::PDNPrecharge
|| powerDownState == PowerDownState::PDNSelfRefresh);
}
//bool PowerDownManager::isInPowerDown()
//{
// return (powerDownState == PowerDownState::PDNActive
// || powerDownState == PowerDownState::PDNPrecharge
// || powerDownState == PowerDownState::PDNSelfRefresh);
//}
bool PowerDownManager::canSleep()
{
for (Bank bank : controllerCore.getBanks()) {
if (!controllerCore.numberOfPayloads[bank] == 0)
return false;
}
return true;
}
//bool PowerDownManager::canSleep()
//{
// for (Bank bank : controllerCore.getBanks()) {
// if (!controllerCore.numberOfPayloads[bank] == 0)
// return false;
// }
// return true;
//}
bool PowerDownManager::isInSelfRefresh(Bank /*bank*/)
{
return powerDownState == PowerDownState::PDNSelfRefresh;
}
//bool PowerDownManager::isInSelfRefresh(Bank /*bank*/)
//{
// return powerDownState == PowerDownState::PDNSelfRefresh;
//}
bool PowerDownManager::isAwakeForRefresh()
{
return powerDownState == PowerDownState::AwakeForRefresh;
}
//bool PowerDownManager::isAwakeForRefresh()
//{
// return powerDownState == PowerDownState::AwakeForRefresh;
//}
void PowerDownManager::triggerSleep(Bank bank, sc_time time)
{
sleep(bank, time);
}
//void PowerDownManager::triggerSleep(Bank bank, sc_time time)
//{
// sleep(bank, time);
//}
void PowerDownManager::printDebugMessage(std::string message)
{
DebugManager::getInstance().printDebugMessage(this->name(), message);
}
//void PowerDownManager::printDebugMessage(std::string message)
//{
// DebugManager::getInstance().printDebugMessage(this->name(), message);
//}

View File

@@ -1,71 +1,71 @@
/*
* Copyright (c) 2015, University of Kaiserslautern
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors:
* Janik Schlemminger
* Matthias Jung
*/
///*
// * Copyright (c) 2015, University of Kaiserslautern
// * All rights reserved.
// *
// * Redistribution and use in source and binary forms, with or without
// * modification, are permitted provided that the following conditions are
// * met:
// *
// * 1. Redistributions of source code must retain the above copyright notice,
// * this list of conditions and the following disclaimer.
// *
// * 2. Redistributions in binary form must reproduce the above copyright
// * notice, this list of conditions and the following disclaimer in the
// * documentation and/or other materials provided with the distribution.
// *
// * 3. Neither the name of the copyright holder nor the names of its
// * contributors may be used to endorse or promote products derived from
// * this software without specific prior written permission.
// *
// * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
// * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// *
// * Authors:
// * Janik Schlemminger
// * Matthias Jung
// */
#ifndef POWERDOWNMANAGER_H
#define POWERDOWNMANAGER_H
//#ifndef POWERDOWNMANAGER_H
//#define POWERDOWNMANAGER_H
#include "PowerDownManagerBankwise.h"
//#include "PowerDownManagerBankwise.h"
class ControllerCore;
//class ControllerCore;
class PowerDownManager: public IPowerDownManager, public sc_module
{
public:
PowerDownManager(sc_module_name /*name*/, ControllerCore &controllerCore);
virtual ~PowerDownManager();
//class PowerDownManager: public IPowerDownManager, public sc_module
//{
//public:
// PowerDownManager(sc_module_name /*name*/, ControllerCore &controllerCore);
// virtual ~PowerDownManager();
virtual void triggerSleep(Bank bank, sc_time time) override;
virtual void sleep(Bank /*bank*/, sc_time time) override;
virtual void wakeUp(Bank bank, sc_time time) override;
virtual void wakeUpForRefresh(Bank bank, sc_time time) override;
virtual bool isInSelfRefresh(Bank bank) override;
// virtual void triggerSleep(Bank bank, sc_time time) override;
// virtual void sleep(Bank /*bank*/, sc_time time) override;
// virtual void wakeUp(Bank bank, sc_time time) override;
// virtual void wakeUpForRefresh(Bank bank, sc_time time) override;
// virtual bool isInSelfRefresh(Bank bank) override;
protected:
void sendPowerDownPayload(ScheduledCommand &pdnToSend);
bool isInPowerDown();
void setPowerDownState(PowerDownState state);
bool canSleep();
bool isAwakeForRefresh();
//protected:
// void sendPowerDownPayload(ScheduledCommand &pdnToSend);
// bool isInPowerDown();
// void setPowerDownState(PowerDownState state);
// bool canSleep();
// bool isAwakeForRefresh();
PowerDownState powerDownState;
std::map<Bank, tlm::tlm_generic_payload> powerDownPayloads;
ControllerCore &controllerCore;
void printDebugMessage(std::string message);
};
// PowerDownState powerDownState;
// std::map<Bank, tlm::tlm_generic_payload> powerDownPayloads;
// ControllerCore &controllerCore;
// void printDebugMessage(std::string message);
//};
#endif // POWERDOWNMANAGER_H
//#endif // POWERDOWNMANAGER_H

View File

@@ -1,216 +1,216 @@
/*
* Copyright (c) 2015, University of Kaiserslautern
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors:
* Janik Schlemminger
* Matthias Jung
*/
///*
// * Copyright (c) 2015, University of Kaiserslautern
// * All rights reserved.
// *
// * Redistribution and use in source and binary forms, with or without
// * modification, are permitted provided that the following conditions are
// * met:
// *
// * 1. Redistributions of source code must retain the above copyright notice,
// * this list of conditions and the following disclaimer.
// *
// * 2. Redistributions in binary form must reproduce the above copyright
// * notice, this list of conditions and the following disclaimer in the
// * documentation and/or other materials provided with the distribution.
// *
// * 3. Neither the name of the copyright holder nor the names of its
// * contributors may be used to endorse or promote products derived from
// * this software without specific prior written permission.
// *
// * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
// * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// *
// * Authors:
// * Janik Schlemminger
// * Matthias Jung
// */
#include "PowerDownManager.h"
#include "../ControllerCore.h"
#include "../../../common/utils.h"
#include "../../../common/DebugManager.h"
#include "../timingCalculations.h"
//#include "PowerDownManager.h"
//#include "../ControllerCore.h"
//#include "../../../common/utils.h"
//#include "../../../common/DebugManager.h"
//#include "../timingCalculations.h"
using namespace tlm;
//using namespace tlm;
PowerDownManagerBankwise::PowerDownManagerBankwise(sc_module_name /*name*/,
ControllerCore &controllerCore) : controllerCore(controllerCore)
{
for (Bank bank : controllerCore.getBanks()) {
setUpDummy(powerDownPayloads[bank], bank);
powerDownStates[bank] = PowerDownState::Awake;
//controllerCore.controller.send(PDNTrigger, sc_time_stamp(), powerDownPayloads[bank]);
}
}
//PowerDownManagerBankwise::PowerDownManagerBankwise(sc_module_name /*name*/,
// ControllerCore &controllerCore) : controllerCore(controllerCore)
//{
// for (Bank bank : controllerCore.getBanks()) {
// setUpDummy(powerDownPayloads[bank], bank);
// powerDownStates[bank] = PowerDownState::Awake;
// //controllerCore.controller.send(PDNTrigger, sc_time_stamp(), powerDownPayloads[bank]);
// }
//}
void PowerDownManagerBankwise::sleep(Bank bank, sc_time time)
{
if (!canSleep(bank) || isInPowerDown(bank))
return;
//void PowerDownManagerBankwise::sleep(Bank bank, sc_time time)
//{
// if (!canSleep(bank) || isInPowerDown(bank))
// return;
tlm_generic_payload &payload = powerDownPayloads[bank];
// tlm_generic_payload &payload = powerDownPayloads[bank];
PowerDownState state = powerDownStates[bank];
if (state == PowerDownState::Awake) { //coming from active
state = controllerCore.state->rowBufferStates->rowBufferIsOpen(
bank) ? PowerDownState::PDNActive : PowerDownState::PDNPrecharge;
} else if (state ==
PowerDownState::AwakeForRefresh) { //coming from refresh interrupting power down
sc_assert(!controllerCore.state->rowBufferStates->rowBufferIsOpen(bank));
// PowerDownState state = powerDownStates[bank];
// if (state == PowerDownState::Awake) { //coming from active
// state = controllerCore.state->rowBufferStates->rowBufferIsOpen(
// bank) ? PowerDownState::PDNActive : PowerDownState::PDNPrecharge;
// } else if (state ==
// PowerDownState::AwakeForRefresh) { //coming from refresh interrupting power down
// sc_assert(!controllerCore.state->rowBufferStates->rowBufferIsOpen(bank));
if (controllerCore.state->getLastCommand(Command::PDEA, bank).getStart()
>= controllerCore.state->getLastCommand(Command::PDEP, bank).getStart())
state = PowerDownState::PDNPrecharge;
else {
state = PowerDownState::PDNSelfRefresh;
}
}
// if (controllerCore.state->getLastCommand(Command::PDEA, bank).getStart()
// >= controllerCore.state->getLastCommand(Command::PDEP, bank).getStart())
// state = PowerDownState::PDNPrecharge;
// else {
// state = PowerDownState::PDNSelfRefresh;
// }
// }
Command cmd = IPowerDownManager::getSleepCommand(state);
ScheduledCommand pdn(cmd, time,
Configuration::getInstance().memSpec->getMinExecutionTimeForPowerDownCmd(cmd),
DramExtension::getExtension(payload));
controllerCore.getCommandChecker(cmd).delayToSatisfyConstraints(pdn);
// Command cmd = IPowerDownManager::getSleepCommand(state);
// ScheduledCommand pdn(cmd, time,
// Configuration::getInstance().memSpec->getMinExecutionTimeForPowerDownCmd(cmd),
// DramExtension::getExtension(payload));
// controllerCore.getCommandChecker(cmd).delayToSatisfyConstraints(pdn);
if (state != PowerDownState::PDNSelfRefresh
&& controllerCore.refreshManager->hasCollision(pdn)) {
return;
} else {
setPowerDownState(state, bank);
sendPowerDownPayload(pdn);
}
}
// if (state != PowerDownState::PDNSelfRefresh
// && controllerCore.refreshManager->hasCollision(pdn)) {
// return;
// } else {
// setPowerDownState(state, bank);
// sendPowerDownPayload(pdn);
// }
//}
void PowerDownManagerBankwise::wakeUp(Bank bank, sc_time time)
{
printDebugMessage("Waking up on bank " + to_string(bank.ID()) + " at " +
time.to_string() + " current power down state is " + powerDownStateToString(
powerDownStates[bank]));
//void PowerDownManagerBankwise::wakeUp(Bank bank, sc_time time)
//{
// printDebugMessage("Waking up on bank " + to_string(bank.ID()) + " at " +
// time.to_string() + " current power down state is " + powerDownStateToString(
// powerDownStates[bank]));
if (isAwakeForRefresh(bank)) {
printDebugMessage("It was already awake for refresh on bank " + to_string(
bank.ID()) + " at " + time.to_string());
setPowerDownState(PowerDownState::Awake, bank);
} else if (isInPowerDown(bank)) {
// Request wake up from power down. A Power Down Exit request will be generated (PDNAX, PDNPX, SREFX).
Command pdnExitCmd = IPowerDownManager::getWakeUpCommand(powerDownStates[bank]);
// Mount the command to be scheduled
ScheduledCommand pdnExit(pdnExitCmd, time, Configuration::getInstance().memSpec->getExecutionTime(pdnExitCmd,
powerDownPayloads[bank]), DramExtension::getExtension(powerDownPayloads[bank]));
// Ensure that time constraints are respected
controllerCore.getCommandChecker(pdnExitCmd).delayToSatisfyConstraints(pdnExit);
// if (isAwakeForRefresh(bank)) {
// printDebugMessage("It was already awake for refresh on bank " + to_string(
// bank.ID()) + " at " + time.to_string());
// setPowerDownState(PowerDownState::Awake, bank);
// } else if (isInPowerDown(bank)) {
// // Request wake up from power down. A Power Down Exit request will be generated (PDNAX, PDNPX, SREFX).
// Command pdnExitCmd = IPowerDownManager::getWakeUpCommand(powerDownStates[bank]);
// // Mount the command to be scheduled
// ScheduledCommand pdnExit(pdnExitCmd, time, Configuration::getInstance().memSpec->getExecutionTime(pdnExitCmd,
// powerDownPayloads[bank]), DramExtension::getExtension(powerDownPayloads[bank]));
// // Ensure that time constraints are respected
// controllerCore.getCommandChecker(pdnExitCmd).delayToSatisfyConstraints(pdnExit);
if (pdnExitCmd == Command::SREFEX) {
// 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());
}
// if (pdnExitCmd == Command::SREFEX) {
// // 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());
// }
setPowerDownState(PowerDownState::Awake, bank);
// setPowerDownState(PowerDownState::Awake, bank);
printDebugMessage("Sending power down exit command " + commandToString(
pdnExitCmd) + " on bank " + to_string(bank.ID()) + " at " + time.to_string() +
" start time " + pdnExit.getStart().to_string() + " end time " +
pdnExit.getEnd().to_string());
sendPowerDownPayload(pdnExit);
}
// printDebugMessage("Sending power down exit command " + commandToString(
// pdnExitCmd) + " on bank " + to_string(bank.ID()) + " at " + time.to_string() +
// " start time " + pdnExit.getStart().to_string() + " end time " +
// pdnExit.getEnd().to_string());
// sendPowerDownPayload(pdnExit);
// }
printDebugMessage("Awaken on bank " + to_string(bank.ID()) + " at " +
time.to_string() + " current power down state is " + powerDownStateToString(
powerDownStates[bank]));
}
// printDebugMessage("Awaken on bank " + to_string(bank.ID()) + " at " +
// time.to_string() + " current power down state is " + powerDownStateToString(
// powerDownStates[bank]));
//}
void PowerDownManagerBankwise::wakeUpForRefresh(Bank bank, sc_time time)
{
printDebugMessage("Waking up for refresh on bank " + to_string(
bank.ID()) + " at " + time.to_string() + " current power down state is " +
powerDownStateToString(powerDownStates[bank]));
//void PowerDownManagerBankwise::wakeUpForRefresh(Bank bank, sc_time time)
//{
// printDebugMessage("Waking up for refresh on bank " + to_string(
// bank.ID()) + " at " + time.to_string() + " current power down state is " +
// powerDownStateToString(powerDownStates[bank]));
if (isInPowerDown(bank)) {
// A Power Down Exit request will be generated (PDNAX, PDNPX, SREFX).
Command pdnExitCmd = IPowerDownManager::getWakeUpCommand(powerDownStates[bank]);
// Get the execution time for this request
sc_time executionTime = Configuration::getInstance().memSpec->getExecutionTime(pdnExitCmd, powerDownPayloads[bank]);
// Mount the command to be scheduled
ScheduledCommand pdnExit(pdnExitCmd, time, executionTime,
DramExtension::getExtension(powerDownPayloads[bank]));
// if (isInPowerDown(bank)) {
// // A Power Down Exit request will be generated (PDNAX, PDNPX, SREFX).
// Command pdnExitCmd = IPowerDownManager::getWakeUpCommand(powerDownStates[bank]);
// // Get the execution time for this request
// sc_time executionTime = Configuration::getInstance().memSpec->getExecutionTime(pdnExitCmd, powerDownPayloads[bank]);
// // Mount the command to be scheduled
// ScheduledCommand pdnExit(pdnExitCmd, time, executionTime,
// DramExtension::getExtension(powerDownPayloads[bank]));
setPowerDownState(PowerDownState::AwakeForRefresh, bank);
// setPowerDownState(PowerDownState::AwakeForRefresh, bank);
printDebugMessage("Sending power down exit command " + commandToString(
pdnExitCmd) + " on bank " + to_string(bank.ID()) + " at " + time.to_string() +
" start time " + pdnExit.getStart().to_string() + " end time " +
pdnExit.getEnd().to_string());
sendPowerDownPayload(pdnExit);
}
// printDebugMessage("Sending power down exit command " + commandToString(
// pdnExitCmd) + " on bank " + to_string(bank.ID()) + " at " + time.to_string() +
// " start time " + pdnExit.getStart().to_string() + " end time " +
// pdnExit.getEnd().to_string());
// sendPowerDownPayload(pdnExit);
// }
printDebugMessage("Awaken for refresh on bank " + to_string(
bank.ID()) + " at " + time.to_string() + " current power down state is " +
powerDownStateToString(powerDownStates[bank]));
}
// printDebugMessage("Awaken for refresh on bank " + to_string(
// bank.ID()) + " at " + time.to_string() + " current power down state is " +
// powerDownStateToString(powerDownStates[bank]));
//}
bool PowerDownManagerBankwise::isInPowerDown(Bank bank)
{
return isIn(powerDownStates[bank], { PowerDownState::PDNActive, PowerDownState::PDNPrecharge, PowerDownState::PDNSelfRefresh });
}
//bool PowerDownManagerBankwise::isInPowerDown(Bank bank)
//{
// return isIn(powerDownStates[bank], { PowerDownState::PDNActive, PowerDownState::PDNPrecharge, PowerDownState::PDNSelfRefresh });
//}
bool PowerDownManagerBankwise::isInSelfRefresh(Bank bank)
{
return powerDownStates[bank] == PowerDownState::PDNSelfRefresh;
}
//bool PowerDownManagerBankwise::isInSelfRefresh(Bank bank)
//{
// return powerDownStates[bank] == PowerDownState::PDNSelfRefresh;
//}
bool PowerDownManagerBankwise::isAwakeForRefresh(Bank bank)
{
return powerDownStates[bank] == PowerDownState::AwakeForRefresh;
}
//bool PowerDownManagerBankwise::isAwakeForRefresh(Bank bank)
//{
// return powerDownStates[bank] == PowerDownState::AwakeForRefresh;
//}
bool PowerDownManagerBankwise::isAwake(Bank bank)
{
return powerDownStates[bank] == PowerDownState::Awake;
}
//bool PowerDownManagerBankwise::isAwake(Bank bank)
//{
// return powerDownStates[bank] == PowerDownState::Awake;
//}
void PowerDownManagerBankwise::setPowerDownState(PowerDownState state,
Bank bank)
{
PowerDownState &bankstate = powerDownStates[bank];
bankstate = state;
printDebugMessage("Is now in state " + powerDownStateToString(
state) + " on Bank " + to_string(bank.ID()));
}
//void PowerDownManagerBankwise::setPowerDownState(PowerDownState state,
// Bank bank)
//{
// PowerDownState &bankstate = powerDownStates[bank];
// bankstate = state;
// printDebugMessage("Is now in state " + powerDownStateToString(
// state) + " on Bank " + to_string(bank.ID()));
//}
void PowerDownManagerBankwise::sendPowerDownPayload(ScheduledCommand &pdn)
{
controllerCore.state->bus.moveCommandToNextFreeSlot(pdn);
controllerCore.state->change(pdn);
printDebugMessage("Sending power down command " + commandToString(
pdn.getCommand()) + " on bank " + to_string(pdn.getBank().ID()) + " start time "
+ pdn.getStart().to_string() + " end time " + pdn.getEnd().to_string());
controllerCore.controller.send(pdn, powerDownPayloads[pdn.getBank()]);
}
//void PowerDownManagerBankwise::sendPowerDownPayload(ScheduledCommand &pdn)
//{
// controllerCore.state->bus.moveCommandToNextFreeSlot(pdn);
// controllerCore.state->change(pdn);
// printDebugMessage("Sending power down command " + commandToString(
// pdn.getCommand()) + " on bank " + to_string(pdn.getBank().ID()) + " start time "
// + pdn.getStart().to_string() + " end time " + pdn.getEnd().to_string());
// controllerCore.controller.send(pdn, powerDownPayloads[pdn.getBank()]);
//}
bool PowerDownManagerBankwise::canSleep(Bank bank)
{
return controllerCore.numberOfPayloads[bank] == 0;
}
//bool PowerDownManagerBankwise::canSleep(Bank bank)
//{
// return controllerCore.numberOfPayloads[bank] == 0;
//}
void PowerDownManagerBankwise::triggerSleep(Bank bank, sc_time time)
{
sleep(bank, time);
}
//void PowerDownManagerBankwise::triggerSleep(Bank bank, sc_time time)
//{
// sleep(bank, time);
//}
void PowerDownManagerBankwise::printDebugMessage(std::string message)
{
DebugManager::getInstance().printDebugMessage(this->name(), message);
}
//void PowerDownManagerBankwise::printDebugMessage(std::string message)
//{
// DebugManager::getInstance().printDebugMessage(this->name(), message);
//}

View File

@@ -1,86 +1,86 @@
/*
* Copyright (c) 2015, University of Kaiserslautern
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors:
* Janik Schlemminger
* Matthias Jung
*/
///*
// * Copyright (c) 2015, University of Kaiserslautern
// * All rights reserved.
// *
// * Redistribution and use in source and binary forms, with or without
// * modification, are permitted provided that the following conditions are
// * met:
// *
// * 1. Redistributions of source code must retain the above copyright notice,
// * this list of conditions and the following disclaimer.
// *
// * 2. Redistributions in binary form must reproduce the above copyright
// * notice, this list of conditions and the following disclaimer in the
// * documentation and/or other materials provided with the distribution.
// *
// * 3. Neither the name of the copyright holder nor the names of its
// * contributors may be used to endorse or promote products derived from
// * this software without specific prior written permission.
// *
// * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
// * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// *
// * Authors:
// * Janik Schlemminger
// * Matthias Jung
// */
#ifndef POWERDOWNMANAGERBANKWISE_H
#define POWERDOWNMANAGERBANKWISE_H
//#ifndef POWERDOWNMANAGERBANKWISE_H
//#define POWERDOWNMANAGERBANKWISE_H
#include <systemc.h>
#include <tlm.h>
#include <map>
#include <string>
#include "../../Command.h"
#include "../../../common/dramExtensions.h"
#include "../scheduling/ScheduledCommand.h"
#include "IPowerDownManager.h"
//#include <systemc.h>
//#include <tlm.h>
//#include <map>
//#include <string>
//#include "../../Command.h"
//#include "../../../common/dramExtensions.h"
//#include "../scheduling/ScheduledCommand.h"
//#include "IPowerDownManager.h"
class ControllerCore;
//class ControllerCore;
class PowerDownManagerBankwise : public sc_module, public IPowerDownManager
{
public:
PowerDownManagerBankwise(sc_module_name /*name*/,
ControllerCore &controllerCore);
virtual ~PowerDownManagerBankwise() {}
virtual void triggerSleep(Bank bank, sc_time time) override;
virtual void sleep(Bank bank, sc_time time) override;
virtual void wakeUp(Bank bank, sc_time time) override;
virtual void wakeUpForRefresh(Bank bank, sc_time time) override;
virtual bool isInSelfRefresh(Bank bank) override;
//class PowerDownManagerBankwise : public sc_module, public IPowerDownManager
//{
//public:
// PowerDownManagerBankwise(sc_module_name /*name*/,
// ControllerCore &controllerCore);
// virtual ~PowerDownManagerBankwise() {}
// virtual void triggerSleep(Bank bank, sc_time time) override;
// virtual void sleep(Bank bank, sc_time time) override;
// virtual void wakeUp(Bank bank, sc_time time) override;
// virtual void wakeUpForRefresh(Bank bank, sc_time time) override;
// virtual bool isInSelfRefresh(Bank bank) override;
protected:
virtual bool isInPowerDown(Bank bank);
virtual bool isAwake(Bank bank);
virtual bool isAwakeForRefresh(Bank bank);
//protected:
// virtual bool isInPowerDown(Bank bank);
// virtual bool isAwake(Bank bank);
// virtual bool isAwakeForRefresh(Bank bank);
ControllerCore &controllerCore;
std::map<Bank, tlm::tlm_generic_payload> powerDownPayloads;
std::map<Bank, PowerDownState> powerDownStates;
// ControllerCore &controllerCore;
// std::map<Bank, tlm::tlm_generic_payload> powerDownPayloads;
// std::map<Bank, PowerDownState> powerDownStates;
virtual bool canSleep(Bank bank);
// virtual bool canSleep(Bank bank);
void setPowerDownState(PowerDownState state, Bank bank);
// void setPowerDownState(PowerDownState state, Bank bank);
Command getWakeUpCommand(PowerDownState state);
Command getSleepCommand(PowerDownState state);
// Command getWakeUpCommand(PowerDownState state);
// Command getSleepCommand(PowerDownState state);
void sendPowerDownPayload(ScheduledCommand &pdn);
// void sendPowerDownPayload(ScheduledCommand &pdn);
void printDebugMessage(std::string message);
};
// void printDebugMessage(std::string message);
//};
#endif // POWERDOWNMANAGERBANKWISE_H
//#endif // POWERDOWNMANAGERBANKWISE_H

View File

@@ -1,142 +1,142 @@
/*
* Copyright (c) 2015, University of Kaiserslautern
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors:
* Janik Schlemminger
* Robert Gernhardt
* Matthias Jung
* Felipe S. Prado
*/
///*
// * Copyright (c) 2015, University of Kaiserslautern
// * All rights reserved.
// *
// * Redistribution and use in source and binary forms, with or without
// * modification, are permitted provided that the following conditions are
// * met:
// *
// * 1. Redistributions of source code must retain the above copyright notice,
// * this list of conditions and the following disclaimer.
// *
// * 2. Redistributions in binary form must reproduce the above copyright
// * notice, this list of conditions and the following disclaimer in the
// * documentation and/or other materials provided with the distribution.
// *
// * 3. Neither the name of the copyright holder nor the names of its
// * contributors may be used to endorse or promote products derived from
// * this software without specific prior written permission.
// *
// * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
// * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// *
// * Authors:
// * Janik Schlemminger
// * Robert Gernhardt
// * Matthias Jung
// * Felipe S. Prado
// */
#include "PowerDownManagerTimeout.h"
#include "../ControllerCore.h"
#include "../../../common/utils.h"
#include "../../../common/DebugManager.h"
#include "../timingCalculations.h"
//#include "PowerDownManagerTimeout.h"
//#include "../ControllerCore.h"
//#include "../../../common/utils.h"
//#include "../../../common/DebugManager.h"
//#include "../timingCalculations.h"
using namespace tlm;
//using namespace tlm;
PowerDownManagerTimeout::PowerDownManagerTimeout(sc_module_name name,
ControllerCore &controllerCore):
PowerDownManager(name, controllerCore)
{
//controllerCore.controller.send(PDNTrigger, Configuration::getInstance().getPowerDownTimeout(), powerDownPayloads[Bank(0)]);
}
//PowerDownManagerTimeout::PowerDownManagerTimeout(sc_module_name name,
// ControllerCore &controllerCore):
// PowerDownManager(name, controllerCore)
//{
// //controllerCore.controller.send(PDNTrigger, Configuration::getInstance().getPowerDownTimeout(), powerDownPayloads[Bank(0)]);
//}
PowerDownManagerTimeout::~PowerDownManagerTimeout()
{
// TODO Auto-generated destructor stub
}
//PowerDownManagerTimeout::~PowerDownManagerTimeout()
//{
// // TODO Auto-generated destructor stub
//}
void PowerDownManagerTimeout::sleep(Bank /*bank*/, sc_time time)
{
bool timeoutTest;
if (!isAwakeForRefresh()) {
sc_time lastReadScheduled;
sc_time lastWriteScheduled;
if (Configuration::getInstance().OpenPagePolicy) {
lastReadScheduled = controllerCore.state->getLastCommand(
Command::RD).getEnd();
lastWriteScheduled = controllerCore.state->getLastCommand(
Command::WR).getEnd();
} else {
lastReadScheduled = controllerCore.state->getLastCommand(
Command::RDA).getEnd();
lastWriteScheduled = controllerCore.state->getLastCommand(
Command::WRA).getEnd();
}
sc_time lastScheduledCommand = max(lastReadScheduled, lastWriteScheduled);
timeoutTest = (time - lastScheduledCommand) >=
Configuration::getInstance().getPowerDownTimeout();
} else {
timeoutTest = true;
}
//void PowerDownManagerTimeout::sleep(Bank /*bank*/, sc_time time)
//{
// bool timeoutTest;
// if (!isAwakeForRefresh()) {
// sc_time lastReadScheduled;
// sc_time lastWriteScheduled;
// if (Configuration::getInstance().OpenPagePolicy) {
// lastReadScheduled = controllerCore.state->getLastCommand(
// Command::RD).getEnd();
// lastWriteScheduled = controllerCore.state->getLastCommand(
// Command::WR).getEnd();
// } else {
// lastReadScheduled = controllerCore.state->getLastCommand(
// Command::RDA).getEnd();
// lastWriteScheduled = controllerCore.state->getLastCommand(
// Command::WRA).getEnd();
// }
// sc_time lastScheduledCommand = max(lastReadScheduled, lastWriteScheduled);
// timeoutTest = (time - lastScheduledCommand) >=
// Configuration::getInstance().getPowerDownTimeout();
// } else {
// timeoutTest = true;
// }
//test_awakeForRefresh = false;
// //test_awakeForRefresh = false;
if ( canSleep() && !isInPowerDown() && timeoutTest) {
// if ( canSleep() && !isInPowerDown() && timeoutTest) {
PowerDownState newState;
if (Configuration::getInstance().PowerDownMode == EPowerDownMode::TimeoutPDN) {
newState = controllerCore.state->rowBufferStates->allRowBuffersAreClosed() ?
PowerDownState::PDNPrecharge : PowerDownState::PDNActive;
} else { // PowerDownMode == TimeoutSREF
if (!controllerCore.state->rowBufferStates->allRowBuffersAreClosed()) {
ScheduledCommand prechargeAllMaster(Command::PREA, time,
Configuration::getInstance().memSpec->getExecutionTime(
Command::PREA, powerDownPayloads[Bank(0)]),
DramExtension::getExtension(powerDownPayloads[Bank(0)]));
// PowerDownState newState;
// if (Configuration::getInstance().PowerDownMode == EPowerDownMode::TimeoutPDN) {
// newState = controllerCore.state->rowBufferStates->allRowBuffersAreClosed() ?
// PowerDownState::PDNPrecharge : PowerDownState::PDNActive;
// } else { // PowerDownMode == TimeoutSREF
// if (!controllerCore.state->rowBufferStates->allRowBuffersAreClosed()) {
// ScheduledCommand prechargeAllMaster(Command::PREA, time,
// Configuration::getInstance().memSpec->getExecutionTime(
// Command::PREA, powerDownPayloads[Bank(0)]),
// DramExtension::getExtension(powerDownPayloads[Bank(0)]));
controllerCore.getCommandChecker(
Command::PREA).delayToSatisfyConstraints(prechargeAllMaster);
// controllerCore.getCommandChecker(
// Command::PREA).delayToSatisfyConstraints(prechargeAllMaster);
if (controllerCore.refreshManager->hasCollision(prechargeAllMaster)) {
return;
} else {
for (size_t i = 1; i < controllerCore.getBanks().size(); i++) {
ScheduledCommand prechargeAll(Command::PREA,
prechargeAllMaster.getStart(), prechargeAllMaster.getExecutionTime(),
powerDownPayloads[Bank(i)]);
controllerCore.state->change(prechargeAll);
}
controllerCore.state->change(prechargeAllMaster);
controllerCore.controller.send(prechargeAllMaster, powerDownPayloads[Bank(0)]);
}
// if (controllerCore.refreshManager->hasCollision(prechargeAllMaster)) {
// return;
// } else {
// for (size_t i = 1; i < controllerCore.getBanks().size(); i++) {
// ScheduledCommand prechargeAll(Command::PREA,
// prechargeAllMaster.getStart(), prechargeAllMaster.getExecutionTime(),
// powerDownPayloads[Bank(i)]);
// controllerCore.state->change(prechargeAll);
// }
// controllerCore.state->change(prechargeAllMaster);
// controllerCore.controller.send(prechargeAllMaster, powerDownPayloads[Bank(0)]);
// }
}
// }
newState = PowerDownState::PDNSelfRefresh;
}
// newState = PowerDownState::PDNSelfRefresh;
// }
Command cmd = IPowerDownManager::getSleepCommand(newState);
ScheduledCommand pdn(cmd, time,
Configuration::getInstance().memSpec->getMinExecutionTimeForPowerDownCmd(cmd),
DramExtension::getExtension(powerDownPayloads[Bank(0)]));
// Command cmd = IPowerDownManager::getSleepCommand(newState);
// ScheduledCommand pdn(cmd, time,
// Configuration::getInstance().memSpec->getMinExecutionTimeForPowerDownCmd(cmd),
// DramExtension::getExtension(powerDownPayloads[Bank(0)]));
controllerCore.getCommandChecker(cmd).delayToSatisfyConstraints(pdn);
// controllerCore.getCommandChecker(cmd).delayToSatisfyConstraints(pdn);
if (controllerCore.refreshManager->hasCollision(pdn)) {
return;
} else {
setPowerDownState(newState);
sendPowerDownPayload(pdn);
}
}
}
// if (controllerCore.refreshManager->hasCollision(pdn)) {
// return;
// } else {
// setPowerDownState(newState);
// sendPowerDownPayload(pdn);
// }
// }
//}
void PowerDownManagerTimeout::triggerSleep(Bank /*bank*/, sc_time time)
{
if (canSleep() && !isInPowerDown()) {
controllerCore.controller.send(PDNTrigger,
time + controllerCore.config.getPowerDownTimeout(), powerDownPayloads[Bank(0)]);
}
}
//void PowerDownManagerTimeout::triggerSleep(Bank /*bank*/, sc_time time)
//{
// if (canSleep() && !isInPowerDown()) {
// controllerCore.controller.send(PDNTrigger,
// time + controllerCore.config.getPowerDownTimeout(), powerDownPayloads[Bank(0)]);
// }
//}

View File

@@ -1,63 +1,63 @@
/*
* Copyright (c) 2015, University of Kaiserslautern
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors:
* Janik Schlemminger
* Robert Gernhardt
* Matthias Jung
* Felipe S. Prado
*/
///*
// * Copyright (c) 2015, University of Kaiserslautern
// * All rights reserved.
// *
// * Redistribution and use in source and binary forms, with or without
// * modification, are permitted provided that the following conditions are
// * met:
// *
// * 1. Redistributions of source code must retain the above copyright notice,
// * this list of conditions and the following disclaimer.
// *
// * 2. Redistributions in binary form must reproduce the above copyright
// * notice, this list of conditions and the following disclaimer in the
// * documentation and/or other materials provided with the distribution.
// *
// * 3. Neither the name of the copyright holder nor the names of its
// * contributors may be used to endorse or promote products derived from
// * this software without specific prior written permission.
// *
// * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
// * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// *
// * Authors:
// * Janik Schlemminger
// * Robert Gernhardt
// * Matthias Jung
// * Felipe S. Prado
// */
#ifndef POWERDOWNMANAGERTIMEOUT_H
#define POWERDOWNMANAGERTIMEOUT_H
//#ifndef POWERDOWNMANAGERTIMEOUT_H
//#define POWERDOWNMANAGERTIMEOUT_H
#include "PowerDownManager.h"
#include <systemc.h>
#include "../../../common/dramExtensions.h"
#include "../scheduling/ScheduledCommand.h"
#include <map>
//#include "PowerDownManager.h"
//#include <systemc.h>
//#include "../../../common/dramExtensions.h"
//#include "../scheduling/ScheduledCommand.h"
//#include <map>
class ControllerCore;
//class ControllerCore;
class PowerDownManagerTimeout: public PowerDownManager
{
public:
PowerDownManagerTimeout(sc_module_name /*name*/,
ControllerCore &controllerCore);
virtual ~PowerDownManagerTimeout();
//class PowerDownManagerTimeout: public PowerDownManager
//{
//public:
// PowerDownManagerTimeout(sc_module_name /*name*/,
// ControllerCore &controllerCore);
// virtual ~PowerDownManagerTimeout();
virtual void triggerSleep(Bank /*bank*/, sc_time time);
virtual void sleep(Bank /*bank*/, sc_time time);
};
// virtual void triggerSleep(Bank /*bank*/, sc_time time);
// virtual void sleep(Bank /*bank*/, sc_time time);
//};
#endif // POWERDOWNMANAGERTIMEOUT_H
//#endif // POWERDOWNMANAGERTIMEOUT_H

View File

@@ -1,135 +1,135 @@
/*
* Copyright (c) 2015, University of Kaiserslautern
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors:
* Janik Schlemminger
* Robert Gernhardt
* Matthias Jung
* Felipe S. Prado
*/
///*
// * Copyright (c) 2015, University of Kaiserslautern
// * All rights reserved.
// *
// * Redistribution and use in source and binary forms, with or without
// * modification, are permitted provided that the following conditions are
// * met:
// *
// * 1. Redistributions of source code must retain the above copyright notice,
// * this list of conditions and the following disclaimer.
// *
// * 2. Redistributions in binary form must reproduce the above copyright
// * notice, this list of conditions and the following disclaimer in the
// * documentation and/or other materials provided with the distribution.
// *
// * 3. Neither the name of the copyright holder nor the names of its
// * contributors may be used to endorse or promote products derived from
// * this software without specific prior written permission.
// *
// * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
// * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// *
// * Authors:
// * Janik Schlemminger
// * Robert Gernhardt
// * Matthias Jung
// * Felipe S. Prado
// */
#include "PowerDownManagerTimeoutBankwise.h"
#include "../ControllerCore.h"
#include "../../../common/utils.h"
#include "../../../common/DebugManager.h"
#include "../timingCalculations.h"
//#include "PowerDownManagerTimeoutBankwise.h"
//#include "../ControllerCore.h"
//#include "../../../common/utils.h"
//#include "../../../common/DebugManager.h"
//#include "../timingCalculations.h"
using namespace tlm;
//using namespace tlm;
PowerDownManagerTimeoutBankwise::PowerDownManagerTimeoutBankwise(
sc_module_name name, ControllerCore &controllerCore):
PowerDownManagerBankwise(name, controllerCore)
{
/*for (Bank bank : controllerCore.getBanks())
{
controllerCore.controller.send(PDNTrigger, controllerCore.config.getPowerDownTimeout(), powerDownPayloads[bank]);
}*/
}
//PowerDownManagerTimeoutBankwise::PowerDownManagerTimeoutBankwise(
// sc_module_name name, ControllerCore &controllerCore):
// PowerDownManagerBankwise(name, controllerCore)
//{
// /*for (Bank bank : controllerCore.getBanks())
// {
// controllerCore.controller.send(PDNTrigger, controllerCore.config.getPowerDownTimeout(), powerDownPayloads[bank]);
// }*/
//}
PowerDownManagerTimeoutBankwise::~PowerDownManagerTimeoutBankwise()
{
// TODO Auto-generated destructor stub
}
//PowerDownManagerTimeoutBankwise::~PowerDownManagerTimeoutBankwise()
//{
// // TODO Auto-generated destructor stub
//}
void PowerDownManagerTimeoutBankwise::sleep(Bank bank, sc_time time)
{
bool timeoutTest;
if (!isAwakeForRefresh(bank)) {
sc_time lastReadScheduled;
sc_time lastWriteScheduled;
if (Configuration::getInstance().OpenPagePolicy) {
lastReadScheduled = controllerCore.state->getLastCommand(Command::RD,
bank).getEnd();
lastWriteScheduled = controllerCore.state->getLastCommand(Command::WR,
bank).getEnd();
} else {
lastReadScheduled = controllerCore.state->getLastCommand(Command::RDA,
bank).getEnd();
lastWriteScheduled = controllerCore.state->getLastCommand(Command::WRA,
bank).getEnd();
}
sc_time lastScheduledCommand = max(lastReadScheduled, lastWriteScheduled);
timeoutTest = (time - lastScheduledCommand) >=
Configuration::getInstance().getPowerDownTimeout();
} else {
timeoutTest = true;
}
//void PowerDownManagerTimeoutBankwise::sleep(Bank bank, sc_time time)
//{
// bool timeoutTest;
// if (!isAwakeForRefresh(bank)) {
// sc_time lastReadScheduled;
// sc_time lastWriteScheduled;
// if (Configuration::getInstance().OpenPagePolicy) {
// lastReadScheduled = controllerCore.state->getLastCommand(Command::RD,
// bank).getEnd();
// lastWriteScheduled = controllerCore.state->getLastCommand(Command::WR,
// bank).getEnd();
// } else {
// lastReadScheduled = controllerCore.state->getLastCommand(Command::RDA,
// bank).getEnd();
// lastWriteScheduled = controllerCore.state->getLastCommand(Command::WRA,
// bank).getEnd();
// }
// sc_time lastScheduledCommand = max(lastReadScheduled, lastWriteScheduled);
// timeoutTest = (time - lastScheduledCommand) >=
// Configuration::getInstance().getPowerDownTimeout();
// } else {
// timeoutTest = true;
// }
if ( canSleep(bank) && !isInPowerDown(bank) && timeoutTest) {
PowerDownState newState;
if (Configuration::getInstance().PowerDownMode == EPowerDownMode::TimeoutPDN) {
newState = controllerCore.state->rowBufferStates->rowBufferIsOpen(
bank) ? PowerDownState::PDNActive : PowerDownState::PDNPrecharge;
} else { // PowerDownMode == TimeoutSREF
if (controllerCore.state->rowBufferStates->rowBufferIsOpen(bank)) {
ScheduledCommand precharge(Command::PRE, time,
Configuration::getInstance().memSpec->getExecutionTime(Command::PRE, powerDownPayloads[bank]),
DramExtension::getExtension(powerDownPayloads[bank]));
// if ( canSleep(bank) && !isInPowerDown(bank) && timeoutTest) {
// PowerDownState newState;
// if (Configuration::getInstance().PowerDownMode == EPowerDownMode::TimeoutPDN) {
// newState = controllerCore.state->rowBufferStates->rowBufferIsOpen(
// bank) ? PowerDownState::PDNActive : PowerDownState::PDNPrecharge;
// } else { // PowerDownMode == TimeoutSREF
// if (controllerCore.state->rowBufferStates->rowBufferIsOpen(bank)) {
// ScheduledCommand precharge(Command::PRE, time,
// Configuration::getInstance().memSpec->getExecutionTime(Command::PRE, powerDownPayloads[bank]),
// DramExtension::getExtension(powerDownPayloads[bank]));
controllerCore.getCommandChecker(Command::PRE).delayToSatisfyConstraints(
precharge);
// controllerCore.getCommandChecker(Command::PRE).delayToSatisfyConstraints(
// precharge);
if (controllerCore.refreshManager->hasCollision(precharge)) {
return;
} else {
controllerCore.state->change(precharge);
controllerCore.controller.send(precharge, powerDownPayloads[bank]);
}
// if (controllerCore.refreshManager->hasCollision(precharge)) {
// return;
// } else {
// controllerCore.state->change(precharge);
// controllerCore.controller.send(precharge, powerDownPayloads[bank]);
// }
}
// }
newState = PowerDownState::PDNSelfRefresh;
}
// newState = PowerDownState::PDNSelfRefresh;
// }
Command cmd = IPowerDownManager::getSleepCommand(newState);
ScheduledCommand pdn(cmd, time,
Configuration::getInstance().memSpec->getMinExecutionTimeForPowerDownCmd(cmd),
DramExtension::getExtension(powerDownPayloads[bank]));
// Command cmd = IPowerDownManager::getSleepCommand(newState);
// ScheduledCommand pdn(cmd, time,
// Configuration::getInstance().memSpec->getMinExecutionTimeForPowerDownCmd(cmd),
// DramExtension::getExtension(powerDownPayloads[bank]));
controllerCore.getCommandChecker(cmd).delayToSatisfyConstraints(pdn);
// controllerCore.getCommandChecker(cmd).delayToSatisfyConstraints(pdn);
if (controllerCore.refreshManager->hasCollision(pdn)) {
return;
} else {
setPowerDownState(newState, bank);
sendPowerDownPayload(pdn);
}
}
}
// if (controllerCore.refreshManager->hasCollision(pdn)) {
// return;
// } else {
// setPowerDownState(newState, bank);
// sendPowerDownPayload(pdn);
// }
// }
//}
void PowerDownManagerTimeoutBankwise::triggerSleep(Bank bank, sc_time time)
{
if (canSleep(bank) && !isInPowerDown(bank)) {
controllerCore.controller.send(PDNTrigger,
time + controllerCore.config.getPowerDownTimeout(), powerDownPayloads[bank]);
}
}
//void PowerDownManagerTimeoutBankwise::triggerSleep(Bank bank, sc_time time)
//{
// if (canSleep(bank) && !isInPowerDown(bank)) {
// controllerCore.controller.send(PDNTrigger,
// time + controllerCore.config.getPowerDownTimeout(), powerDownPayloads[bank]);
// }
//}

View File

@@ -1,63 +1,63 @@
/*
* Copyright (c) 2015, University of Kaiserslautern
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors:
* Janik Schlemminger
* Robert Gernhardt
* Matthias Jung
* Felipe S. Prado
*/
///*
// * Copyright (c) 2015, University of Kaiserslautern
// * All rights reserved.
// *
// * Redistribution and use in source and binary forms, with or without
// * modification, are permitted provided that the following conditions are
// * met:
// *
// * 1. Redistributions of source code must retain the above copyright notice,
// * this list of conditions and the following disclaimer.
// *
// * 2. Redistributions in binary form must reproduce the above copyright
// * notice, this list of conditions and the following disclaimer in the
// * documentation and/or other materials provided with the distribution.
// *
// * 3. Neither the name of the copyright holder nor the names of its
// * contributors may be used to endorse or promote products derived from
// * this software without specific prior written permission.
// *
// * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
// * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// *
// * Authors:
// * Janik Schlemminger
// * Robert Gernhardt
// * Matthias Jung
// * Felipe S. Prado
// */
#ifndef POWERDOWNMANAGERTIMEOUTBANKWISE_H
#define POWERDOWNMANAGERTIMEOUTBANKWISE_H
//#ifndef POWERDOWNMANAGERTIMEOUTBANKWISE_H
//#define POWERDOWNMANAGERTIMEOUTBANKWISE_H
#include "PowerDownManager.h"
#include <systemc.h>
#include "../../../common/dramExtensions.h"
#include "../scheduling/ScheduledCommand.h"
#include <map>
//#include "PowerDownManager.h"
//#include <systemc.h>
//#include "../../../common/dramExtensions.h"
//#include "../scheduling/ScheduledCommand.h"
//#include <map>
class ControllerCore;
//class ControllerCore;
class PowerDownManagerTimeoutBankwise: public PowerDownManagerBankwise
{
public:
PowerDownManagerTimeoutBankwise(sc_module_name /*name*/,
ControllerCore &controllerCore);
virtual ~PowerDownManagerTimeoutBankwise();
//class PowerDownManagerTimeoutBankwise: public PowerDownManagerBankwise
//{
//public:
// PowerDownManagerTimeoutBankwise(sc_module_name /*name*/,
// ControllerCore &controllerCore);
// virtual ~PowerDownManagerTimeoutBankwise();
virtual void triggerSleep(Bank bank, sc_time time);
virtual void sleep(Bank bank, sc_time time);
};
// virtual void triggerSleep(Bank bank, sc_time time);
// virtual void sleep(Bank bank, sc_time time);
//};
#endif // POWERDOWNMANAGERTIMEOUTBANKWISE_H
//#endif // POWERDOWNMANAGERTIMEOUTBANKWISE_H

View File

@@ -1,66 +1,66 @@
/*
* Copyright (c) 2015, University of Kaiserslautern
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors:
* Janik Schlemminger
* Robert Gernhardt
* Matthias Jung
*/
///*
// * Copyright (c) 2015, University of Kaiserslautern
// * All rights reserved.
// *
// * Redistribution and use in source and binary forms, with or without
// * modification, are permitted provided that the following conditions are
// * met:
// *
// * 1. Redistributions of source code must retain the above copyright notice,
// * this list of conditions and the following disclaimer.
// *
// * 2. Redistributions in binary form must reproduce the above copyright
// * notice, this list of conditions and the following disclaimer in the
// * documentation and/or other materials provided with the distribution.
// *
// * 3. Neither the name of the copyright holder nor the names of its
// * contributors may be used to endorse or promote products derived from
// * this software without specific prior written permission.
// *
// * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
// * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// *
// * Authors:
// * Janik Schlemminger
// * Robert Gernhardt
// * Matthias Jung
// */
#ifndef IREFRESHMANAGER_H
#define IREFRESHMANAGER_H
//#ifndef IREFRESHMANAGER_H
//#define IREFRESHMANAGER_H
#include <systemc.h>
#include "../scheduling/ScheduledCommand.h"
//#include <systemc.h>
//#include "../scheduling/ScheduledCommand.h"
// Flex. refresh (pull-in, postpone)
typedef enum {
ST_REFRESH = 0,
ST_PULLIN,
ST_POSTPONE,
ST_SKIP,
ST_BURST,
ST_ALIGN
} ref_fsm_state_t;
//// Flex. refresh (pull-in, postpone)
//typedef enum {
// ST_REFRESH = 0,
// ST_PULLIN,
// ST_POSTPONE,
// ST_SKIP,
// ST_BURST,
// ST_ALIGN
//} ref_fsm_state_t;
class IRefreshManager
{
public:
virtual ~IRefreshManager() {};
virtual bool hasCollision(const ScheduledCommand &command) = 0;
virtual void scheduleRefresh(tlm::tlm_generic_payload &payload,
sc_time time) = 0;
virtual void reInitialize(Bank bank, sc_time time) = 0;
virtual bool isInvalidated(tlm::tlm_generic_payload &payload, sc_time time) = 0;
};
//class IRefreshManager
//{
//public:
// virtual ~IRefreshManager() {};
// virtual bool hasCollision(const ScheduledCommand &command) = 0;
// virtual void scheduleRefresh(tlm::tlm_generic_payload &payload,
// sc_time time) = 0;
// virtual void reInitialize(Bank bank, sc_time time) = 0;
// virtual bool isInvalidated(tlm::tlm_generic_payload &payload, sc_time time) = 0;
//};
#endif // IREFRESHMANAGER_H
//#endif // IREFRESHMANAGER_H

View File

@@ -1,275 +1,275 @@
/*
* Copyright (c) 2017, University of Kaiserslautern
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Author: Éder F. Zulian
*/
///*
// * Copyright (c) 2017, University of Kaiserslautern
// * All rights reserved.
// *
// * Redistribution and use in source and binary forms, with or without
// * modification, are permitted provided that the following conditions are
// * met:
// *
// * 1. Redistributions of source code must retain the above copyright notice,
// * this list of conditions and the following disclaimer.
// *
// * 2. Redistributions in binary form must reproduce the above copyright
// * notice, this list of conditions and the following disclaimer in the
// * documentation and/or other materials provided with the distribution.
// *
// * 3. Neither the name of the copyright holder nor the names of its
// * contributors may be used to endorse or promote products derived from
// * this software without specific prior written permission.
// *
// * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
// * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// *
// * Author: Éder F. Zulian
// */
#include <math.h>
//#include <math.h>
#include "RGR.h"
#include "../ControllerCore.h"
#include "../timingCalculations.h"
#include "../../../common/utils.h"
//#include "RGR.h"
//#include "../ControllerCore.h"
//#include "../timingCalculations.h"
//#include "../../../common/utils.h"
#define TRUE 1
#define FALSE !(TRUE)
#define INITIAL_DISPLACEMENT FALSE
//#define TRUE 1
//#define FALSE !(TRUE)
//#define INITIAL_DISPLACEMENT FALSE
using namespace std;
//using namespace std;
RGR::RGR(sc_module_name, ControllerCore &ctrlcore) : ccore(ctrlcore),
timing(ctrlcore.config.memSpec->refreshTimings[ccore.getBanks()[0]])
{
fmb = ccore.config.ControllerCoreRefForceMaxPostponeBurst;
bwl = ccore.config.BankwiseLogic;
ri = ccore.config.getRowInc();
auto nr = ccore.config.memSpec->NumberOfRows;
auto nar = ccore.config.getNumAR();
auto m = ccore.config.getRefMode();
rpr = (nr / m) / nar;
assert(rpr > 0);
tREFIx = timing.tREFI / m;
trp = ccore.config.getTrpb();
trcd = ccore.config.memSpec->tRCD;
postponeEnabled = ccore.config.ControllerCoreRefEnablePostpone;
pullInEnabled = ccore.config.ControllerCoreRefEnablePullIn;
maxpostpone = ccore.config.ControllerCoreRefMaxPostponed * m;
maxpullin = ccore.config.ControllerCoreRefMaxPulledIn * m;
for (Bank b : ccore.getBanks()) {
pulledin[b] = 0;
postponed[b] = 0;
currentState[b] = ST_REFRESH;
previousState[b] = ST_REFRESH;
nextState[b] = ST_REFRESH;
setUpDummy(rps[b], b);
}
#if INITIAL_DISPLACEMENT == TRUE
if (bwl) {
auto nbs = ccore.config.memSpec->NumberOfBanks;
for (Bank b : ccore.getBanks()) {
nextPlannedRefreshs[b] = b.ID() * tREFIx / nbs;
}
}
#else
for (Bank b : ccore.getBanks()) {
nextPlannedRefreshs[b] = SC_ZERO_TIME;
}
#endif
if (bwl) {
for (Bank b : ccore.getBanks()) {
planNextRefresh(b, tREFIx, false);
}
} else {
planNextRefresh(ccore.getBanks()[0], tREFIx, false);
}
}
//RGR::RGR(sc_module_name, ControllerCore &ctrlcore) : ccore(ctrlcore),
// timing(ctrlcore.config.memSpec->refreshTimings[ccore.getBanks()[0]])
//{
// fmb = ccore.config.ControllerCoreRefForceMaxPostponeBurst;
// bwl = ccore.config.BankwiseLogic;
// ri = ccore.config.getRowInc();
// auto nr = ccore.config.memSpec->NumberOfRows;
// auto nar = ccore.config.getNumAR();
// auto m = ccore.config.getRefMode();
// rpr = (nr / m) / nar;
// assert(rpr > 0);
// tREFIx = timing.tREFI / m;
// trp = ccore.config.getTrpb();
// trcd = ccore.config.memSpec->tRCD;
// postponeEnabled = ccore.config.ControllerCoreRefEnablePostpone;
// pullInEnabled = ccore.config.ControllerCoreRefEnablePullIn;
// maxpostpone = ccore.config.ControllerCoreRefMaxPostponed * m;
// maxpullin = ccore.config.ControllerCoreRefMaxPulledIn * m;
// for (Bank b : ccore.getBanks()) {
// pulledin[b] = 0;
// postponed[b] = 0;
// currentState[b] = ST_REFRESH;
// previousState[b] = ST_REFRESH;
// nextState[b] = ST_REFRESH;
// setUpDummy(rps[b], b);
// }
//#if INITIAL_DISPLACEMENT == TRUE
// if (bwl) {
// auto nbs = ccore.config.memSpec->NumberOfBanks;
// for (Bank b : ccore.getBanks()) {
// nextPlannedRefreshs[b] = b.ID() * tREFIx / nbs;
// }
// }
//#else
// for (Bank b : ccore.getBanks()) {
// nextPlannedRefreshs[b] = SC_ZERO_TIME;
// }
//#endif
// if (bwl) {
// for (Bank b : ccore.getBanks()) {
// planNextRefresh(b, tREFIx, false);
// }
// } else {
// planNextRefresh(ccore.getBanks()[0], tREFIx, false);
// }
//}
RGR::~RGR()
{
}
//RGR::~RGR()
//{
//}
bool RGR::hasCollision(const ScheduledCommand &cmd)
{
Bank b = cmd.getBank();
if (currentState[b] == ST_BURST) {
// A burst due to postponed refreshes shall not be interrupted.
return true;
}
return false;
}
//bool RGR::hasCollision(const ScheduledCommand &cmd)
//{
// Bank b = cmd.getBank();
// if (currentState[b] == ST_BURST) {
// // A burst due to postponed refreshes shall not be interrupted.
// return true;
// }
// return false;
//}
sc_time RGR::doRefresh(tlm::tlm_generic_payload &p, sc_time t)
{
sc_assert(!isInvalidated(p, t));
Bank b = DramExtension::getExtension(p).getBank();
bool openBank = ccore.state->rowBufferStates->rowBufferIsOpen(b);
bool allClosed = ccore.state->rowBufferStates->allRowBuffersAreClosed();
bool pre = bwl ? openBank : !allClosed;
sc_time trfcx = SC_ZERO_TIME;
//sc_time RGR::doRefresh(tlm::tlm_generic_payload &p, sc_time t)
//{
// sc_assert(!isInvalidated(p, t));
// Bank b = DramExtension::getExtension(p).getBank();
// bool openBank = ccore.state->rowBufferStates->rowBufferIsOpen(b);
// bool allClosed = ccore.state->rowBufferStates->allRowBuffersAreClosed();
// bool pre = bwl ? openBank : !allClosed;
// sc_time trfcx = SC_ZERO_TIME;
if (!bwl) {
for (Bank b : ccore.getBanks()) {
currentRefresh[b] = t;
}
} else {
currentRefresh[b] = t;
}
// if (!bwl) {
// for (Bank b : ccore.getBanks()) {
// currentRefresh[b] = t;
// }
// } else {
// currentRefresh[b] = t;
// }
if (pre) {
trfcx += trp;
if (bwl) {
if (ccore.config.getRGRBank(b.ID())) {
ccore.scheduleRequest(Command::PREB, rps[b]);
}
} else {
for (Bank b : ccore.getBanks()) {
auto rgrb = ccore.config.getRGRBank(b.ID());
if (ccore.state->rowBufferStates->rowBufferIsOpen(b) && rgrb) {
ccore.scheduleRequest(Command::PREB, rps[Bank(b)]);
}
}
}
}
// if (pre) {
// trfcx += trp;
// if (bwl) {
// if (ccore.config.getRGRBank(b.ID())) {
// ccore.scheduleRequest(Command::PREB, rps[b]);
// }
// } else {
// for (Bank b : ccore.getBanks()) {
// auto rgrb = ccore.config.getRGRBank(b.ID());
// if (ccore.state->rowBufferStates->rowBufferIsOpen(b) && rgrb) {
// ccore.scheduleRequest(Command::PREB, rps[Bank(b)]);
// }
// }
// }
// }
for (unsigned r = 0; r < rpr; r += ri) {
trfcx += trcd + trp;
if (bwl) {
if (ccore.config.getRGRBank(b.ID())) {
ccore.scheduleRequest(Command::ACTB, rps[b]);
ccore.scheduleRequest(Command::PREB, rps[b]);
}
DramExtension::getExtension(p).incrementRow();
} else {
for (Bank b : ccore.getBanks()) {
if (ccore.config.getRGRBank(b.ID())) {
ccore.scheduleRequest(Command::ACTB, rps[b]);
ccore.scheduleRequest(Command::PREB, rps[b]);
}
DramExtension::getExtension(rps[b]).incrementRow();
}
}
}
// for (unsigned r = 0; r < rpr; r += ri) {
// trfcx += trcd + trp;
// if (bwl) {
// if (ccore.config.getRGRBank(b.ID())) {
// ccore.scheduleRequest(Command::ACTB, rps[b]);
// ccore.scheduleRequest(Command::PREB, rps[b]);
// }
// DramExtension::getExtension(p).incrementRow();
// } else {
// for (Bank b : ccore.getBanks()) {
// if (ccore.config.getRGRBank(b.ID())) {
// ccore.scheduleRequest(Command::ACTB, rps[b]);
// ccore.scheduleRequest(Command::PREB, rps[b]);
// }
// DramExtension::getExtension(rps[b]).incrementRow();
// }
// }
// }
return trfcx;
}
// return trfcx;
//}
void RGR::scheduleRefresh(tlm::tlm_generic_payload &p, sc_time t)
{
sc_time nrt;
sc_time trfcx;
Bank b = DramExtension::getExtension(p).getBank();
bool preq = bwl ? ccore.hasPendingRequests(b) : ccore.hasPendingRequests();
bool postpone = postponeEnabled && preq && (postponed[b] < maxpostpone);
bool pullIn = pullInEnabled && !preq && (pulledin[b] < maxpullin);
previousState[b] = currentState[b];
currentState[b] = nextState[b];
bool align = false;
//void RGR::scheduleRefresh(tlm::tlm_generic_payload &p, sc_time t)
//{
// sc_time nrt;
// sc_time trfcx;
// Bank b = DramExtension::getExtension(p).getBank();
// bool preq = bwl ? ccore.hasPendingRequests(b) : ccore.hasPendingRequests();
// bool postpone = postponeEnabled && preq && (postponed[b] < maxpostpone);
// bool pullIn = pullInEnabled && !preq && (pulledin[b] < maxpullin);
// previousState[b] = currentState[b];
// currentState[b] = nextState[b];
// bool align = false;
switch (currentState[b]) {
case ST_REFRESH:
assert(pulledin[b] == 0 && postponed[b] == 0);
if (postpone) {
nrt = SC_ZERO_TIME;
nextState[b] = ST_POSTPONE;
} else if (pullIn) {
trfcx = doRefresh(p, t);
nrt = trfcx;
nextState[b] = ST_PULLIN;
} else {
doRefresh(p, t);
nrt = tREFIx;
nextState[b] = ST_REFRESH;
}
break;
case ST_PULLIN:
if (pullIn) {
trfcx = doRefresh(p, t);
pulledin[b]++;
nrt = trfcx;
nextState[b] = ST_PULLIN;
} else {
nrt = SC_ZERO_TIME;
nextState[b] = ST_ALIGN;
}
break;
case ST_SKIP:
if (pulledin[b] == 0) {
nrt = SC_ZERO_TIME;
nextState[b] = ST_REFRESH;
} else {
pulledin[b]--;
nrt = tREFIx;
nextState[b] = ST_SKIP;
}
break;
case ST_POSTPONE:
postponed[b]++;
if ((postponed[b] > maxpostpone) || (!preq && !fmb)) {
// Burst triggered by inactivity or max postpone value reached.
nrt = SC_ZERO_TIME;
nextState[b] = ST_BURST;
} else {
nrt = tREFIx;
nextState[b] = ST_POSTPONE;
}
break;
case ST_BURST:
doRefresh(p, t);
postponed[b]--;
if (postponed[b] == 0) {
nrt = SC_ZERO_TIME;
nextState[b] = ST_ALIGN;
} else {
nrt = SC_ZERO_TIME;
nextState[b] = ST_BURST;
}
break;
case ST_ALIGN:
nrt = tREFIx;
align = true;
if (previousState[b] == ST_PULLIN) {
nextState[b] = ST_SKIP;
} else {
nextState[b] = ST_REFRESH;
}
break;
default:
SC_REPORT_FATAL(this->name(), "RGR flex FSM invalid state.");
break;
}
planNextRefresh(bwl ? b : ccore.getBanks()[0], nrt, align);
}
// switch (currentState[b]) {
// case ST_REFRESH:
// assert(pulledin[b] == 0 && postponed[b] == 0);
// if (postpone) {
// nrt = SC_ZERO_TIME;
// nextState[b] = ST_POSTPONE;
// } else if (pullIn) {
// trfcx = doRefresh(p, t);
// nrt = trfcx;
// nextState[b] = ST_PULLIN;
// } else {
// doRefresh(p, t);
// nrt = tREFIx;
// nextState[b] = ST_REFRESH;
// }
// break;
// case ST_PULLIN:
// if (pullIn) {
// trfcx = doRefresh(p, t);
// pulledin[b]++;
// nrt = trfcx;
// nextState[b] = ST_PULLIN;
// } else {
// nrt = SC_ZERO_TIME;
// nextState[b] = ST_ALIGN;
// }
// break;
// case ST_SKIP:
// if (pulledin[b] == 0) {
// nrt = SC_ZERO_TIME;
// nextState[b] = ST_REFRESH;
// } else {
// pulledin[b]--;
// nrt = tREFIx;
// nextState[b] = ST_SKIP;
// }
// break;
// case ST_POSTPONE:
// postponed[b]++;
// if ((postponed[b] > maxpostpone) || (!preq && !fmb)) {
// // Burst triggered by inactivity or max postpone value reached.
// nrt = SC_ZERO_TIME;
// nextState[b] = ST_BURST;
// } else {
// nrt = tREFIx;
// nextState[b] = ST_POSTPONE;
// }
// break;
// case ST_BURST:
// doRefresh(p, t);
// postponed[b]--;
// if (postponed[b] == 0) {
// nrt = SC_ZERO_TIME;
// nextState[b] = ST_ALIGN;
// } else {
// nrt = SC_ZERO_TIME;
// nextState[b] = ST_BURST;
// }
// break;
// case ST_ALIGN:
// nrt = tREFIx;
// align = true;
// if (previousState[b] == ST_PULLIN) {
// nextState[b] = ST_SKIP;
// } else {
// nextState[b] = ST_REFRESH;
// }
// break;
// default:
// SC_REPORT_FATAL(this->name(), "RGR flex FSM invalid state.");
// break;
// }
// planNextRefresh(bwl ? b : ccore.getBanks()[0], nrt, align);
//}
void RGR::planNextRefresh(Bank b, sc_time t, bool align)
{
if (align) {
nextPlannedRefreshs[b] = trunc(nextPlannedRefreshs[b].to_double() /
tREFIx.to_double()) * tREFIx;
}
nextPlannedRefreshs[b] += t;
ccore.controller.send(REFTrigger, nextPlannedRefreshs[b], rps[b]);
}
//void RGR::planNextRefresh(Bank b, sc_time t, bool align)
//{
// if (align) {
// nextPlannedRefreshs[b] = trunc(nextPlannedRefreshs[b].to_double() /
// tREFIx.to_double()) * tREFIx;
// }
// nextPlannedRefreshs[b] += t;
// ccore.controller.send(REFTrigger, nextPlannedRefreshs[b], rps[b]);
//}
void RGR::reInitialize(Bank b, sc_time t)
{
nextPlannedRefreshs[b] = clkAlign(t, Alignment::DOWN);
planNextRefresh(b, tREFIx, true);
}
//void RGR::reInitialize(Bank b, sc_time t)
//{
// nextPlannedRefreshs[b] = clkAlign(t, Alignment::DOWN);
// planNextRefresh(b, tREFIx, true);
//}
bool RGR::isInvalidated(tlm::tlm_generic_payload &p, sc_time t)
{
return nextPlannedRefreshs[DramExtension::getExtension(p).getBank()] > t;
}
//bool RGR::isInvalidated(tlm::tlm_generic_payload &p, sc_time t)
//{
// return nextPlannedRefreshs[DramExtension::getExtension(p).getBank()] > t;
//}
void RGR::printDebugMessage(std::string msg)
{
DebugManager::getInstance().printDebugMessage(this->name(), msg);
}
//void RGR::printDebugMessage(std::string msg)
//{
// DebugManager::getInstance().printDebugMessage(this->name(), msg);
//}

View File

@@ -1,81 +1,81 @@
/*
* Copyright (c) 2017, University of Kaiserslautern
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Author: Éder F. Zulian
*/
///*
// * Copyright (c) 2017, University of Kaiserslautern
// * All rights reserved.
// *
// * Redistribution and use in source and binary forms, with or without
// * modification, are permitted provided that the following conditions are
// * met:
// *
// * 1. Redistributions of source code must retain the above copyright notice,
// * this list of conditions and the following disclaimer.
// *
// * 2. Redistributions in binary form must reproduce the above copyright
// * notice, this list of conditions and the following disclaimer in the
// * documentation and/or other materials provided with the distribution.
// *
// * 3. Neither the name of the copyright holder nor the names of its
// * contributors may be used to endorse or promote products derived from
// * this software without specific prior written permission.
// *
// * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
// * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// *
// * Author: Éder F. Zulian
// */
#ifndef RGR_H
#define RGR_H
//#ifndef RGR_H
//#define RGR_H
#include "../../../common/dramExtensions.h"
#include "../configuration/MemSpec.h"
#include "IRefreshManager.h"
//#include "../../../common/dramExtensions.h"
//#include "../configuration/MemSpec.h"
//#include "IRefreshManager.h"
class ControllerCore;
//class ControllerCore;
class RGR : public IRefreshManager, public sc_module
{
public:
RGR(sc_module_name, ControllerCore &ctrlcore);
virtual ~RGR();
virtual bool hasCollision(const ScheduledCommand &cmd) override;
virtual void scheduleRefresh(tlm::tlm_generic_payload &p, sc_time t) override;
void reInitialize(Bank bank, sc_time time) override;
bool isInvalidated(tlm::tlm_generic_payload &payload, sc_time time) override;
private:
bool fmb;
bool bwl;
unsigned int ri;
unsigned int rpr;
sc_time trp;
sc_time trcd;
sc_time tREFIx;
ControllerCore &ccore;
RefreshTiming &timing;
std::map<Bank, tlm::tlm_generic_payload> rps;
std::map<Bank, sc_time> nextPlannedRefreshs;
std::map<Bank, sc_time> currentRefresh;
bool postponeEnabled;
bool pullInEnabled;
unsigned int maxpostpone;
unsigned int maxpullin;
std::map<Bank, unsigned int> pulledin;
std::map<Bank, unsigned int> postponed;
std::map<Bank, ref_fsm_state_t> currentState;
std::map<Bank, ref_fsm_state_t> previousState;
std::map<Bank, ref_fsm_state_t> nextState;
sc_time doRefresh(tlm::tlm_generic_payload &p, sc_time t);
void planNextRefresh(Bank b, sc_time t, bool align);
void printDebugMessage(std::string message);
};
//class RGR : public IRefreshManager, public sc_module
//{
//public:
// RGR(sc_module_name, ControllerCore &ctrlcore);
// virtual ~RGR();
// virtual bool hasCollision(const ScheduledCommand &cmd) override;
// virtual void scheduleRefresh(tlm::tlm_generic_payload &p, sc_time t) override;
// void reInitialize(Bank bank, sc_time time) override;
// bool isInvalidated(tlm::tlm_generic_payload &payload, sc_time time) override;
//private:
// bool fmb;
// bool bwl;
// unsigned int ri;
// unsigned int rpr;
// sc_time trp;
// sc_time trcd;
// sc_time tREFIx;
// ControllerCore &ccore;
// RefreshTiming &timing;
// std::map<Bank, tlm::tlm_generic_payload> rps;
// std::map<Bank, sc_time> nextPlannedRefreshs;
// std::map<Bank, sc_time> currentRefresh;
// bool postponeEnabled;
// bool pullInEnabled;
// unsigned int maxpostpone;
// unsigned int maxpullin;
// std::map<Bank, unsigned int> pulledin;
// std::map<Bank, unsigned int> postponed;
// std::map<Bank, ref_fsm_state_t> currentState;
// std::map<Bank, ref_fsm_state_t> previousState;
// std::map<Bank, ref_fsm_state_t> nextState;
// sc_time doRefresh(tlm::tlm_generic_payload &p, sc_time t);
// void planNextRefresh(Bank b, sc_time t, bool align);
// void printDebugMessage(std::string message);
//};
#endif // RGR_H
//#endif // RGR_H

View File

@@ -1,275 +1,275 @@
/*
* Copyright (c) 2015, University of Kaiserslautern
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors:
* Robert Gernhardt
* Matthias Jung
* Felipe S. Prado
* Ana Mativi
* Éder F. Zulian
*/
///*
// * Copyright (c) 2015, University of Kaiserslautern
// * All rights reserved.
// *
// * Redistribution and use in source and binary forms, with or without
// * modification, are permitted provided that the following conditions are
// * met:
// *
// * 1. Redistributions of source code must retain the above copyright notice,
// * this list of conditions and the following disclaimer.
// *
// * 2. Redistributions in binary form must reproduce the above copyright
// * notice, this list of conditions and the following disclaimer in the
// * documentation and/or other materials provided with the distribution.
// *
// * 3. Neither the name of the copyright holder nor the names of its
// * contributors may be used to endorse or promote products derived from
// * this software without specific prior written permission.
// *
// * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
// * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// *
// * Authors:
// * Robert Gernhardt
// * Matthias Jung
// * Felipe S. Prado
// * Ana Mativi
// * Éder F. Zulian
// */
#include "RefreshManager.h"
#include "../ControllerCore.h"
#include "../timingCalculations.h"
#include "../../../common/utils.h"
//#include "RefreshManager.h"
//#include "../ControllerCore.h"
//#include "../timingCalculations.h"
//#include "../../../common/utils.h"
using namespace tlm;
//using namespace tlm;
RefreshManager::RefreshManager(sc_module_name,
ControllerCore &controller) : controllerCore(controller),
timing(controller.config.memSpec->refreshTimings[Bank(0)])
{
auto m = controllerCore.config.getRefMode();
tREFIx = timing.tREFI / m;
tRFCx = timing.tRFC;
postponeEnabled = controllerCore.config.ControllerCoreRefEnablePostpone;
pullInEnabled = controllerCore.config.ControllerCoreRefEnablePullIn;
maxpostpone = controllerCore.config.ControllerCoreRefMaxPostponed * m;
maxpullin = controllerCore.config.ControllerCoreRefMaxPulledIn * m;
pulledin = 0;
postponed = 0;
currentState = ST_REFRESH;
previousState = ST_REFRESH;
nextState = ST_REFRESH;
nextPlannedRefresh = SC_ZERO_TIME;
for (Bank bank : controller.getBanks()) {
setUpDummy(refreshPayloads[bank], bank);
}
planNextRefresh(tREFIx, false);
}
//RefreshManager::RefreshManager(sc_module_name,
// ControllerCore &controller) : controllerCore(controller),
// timing(controller.config.memSpec->refreshTimings[Bank(0)])
//{
// auto m = controllerCore.config.getRefMode();
// tREFIx = timing.tREFI / m;
// tRFCx = timing.tRFC;
// postponeEnabled = controllerCore.config.ControllerCoreRefEnablePostpone;
// pullInEnabled = controllerCore.config.ControllerCoreRefEnablePullIn;
// maxpostpone = controllerCore.config.ControllerCoreRefMaxPostponed * m;
// maxpullin = controllerCore.config.ControllerCoreRefMaxPulledIn * m;
// pulledin = 0;
// postponed = 0;
// currentState = ST_REFRESH;
// previousState = ST_REFRESH;
// nextState = ST_REFRESH;
// nextPlannedRefresh = SC_ZERO_TIME;
// for (Bank bank : controller.getBanks()) {
// setUpDummy(refreshPayloads[bank], bank);
// }
// planNextRefresh(tREFIx, false);
//}
RefreshManager::~RefreshManager()
{
}
//RefreshManager::~RefreshManager()
//{
//}
//Check if a command will be scheduled during the next refresh period
bool RefreshManager::hasCollision(const ScheduledCommand &command)
{
bool collisionWithPreviousRefEnd = command.getStart() <
controllerCore.state->getLastCommand(Command::REFA).getEnd();
bool collisionWithNextRefStart = command.getEnd() >= nextPlannedRefresh;
if (controllerCore.config.ControllerCoreRefEnablePostpone
&& (postponed < maxpostpone)) {
// Flexible refresh is on and have "credits" to postpone.
// Then there will not be a collision with next refresh because
// nextPlannedRefresh will be updated.
collisionWithNextRefStart = false;
}
if (currentState == ST_BURST) {
// A burst due to postponed refreshes shall not be interrupted.
collisionWithNextRefStart = true;
}
return collisionWithPreviousRefEnd || collisionWithNextRefStart;
}
////Check if a command will be scheduled during the next refresh period
//bool RefreshManager::hasCollision(const ScheduledCommand &command)
//{
// bool collisionWithPreviousRefEnd = command.getStart() <
// controllerCore.state->getLastCommand(Command::REFA).getEnd();
// bool collisionWithNextRefStart = command.getEnd() >= nextPlannedRefresh;
// if (controllerCore.config.ControllerCoreRefEnablePostpone
// && (postponed < maxpostpone)) {
// // Flexible refresh is on and have "credits" to postpone.
// // Then there will not be a collision with next refresh because
// // nextPlannedRefresh will be updated.
// collisionWithNextRefStart = false;
// }
// if (currentState == ST_BURST) {
// // A burst due to postponed refreshes shall not be interrupted.
// collisionWithNextRefStart = true;
// }
// return collisionWithPreviousRefEnd || collisionWithNextRefStart;
//}
bool RefreshManager::doRefresh(tlm::tlm_generic_payload &payload, sc_time time)
{
sc_assert(!isInvalidated(payload, time));
bool pre = false;
// If any row is open, precharge all.
if (!controllerCore.state->rowBufferStates->allRowBuffersAreClosed()) {
pre = true;
ScheduledCommand prechargeAllMaster(Command::PREA, time,
Configuration::getInstance().memSpec->getExecutionTime(
Command::PREA, refreshPayloads[Bank(0)]),
refreshPayloads[Bank(0)]);
controllerCore.getCommandChecker(
Command::PREA).delayToSatisfyConstraints(prechargeAllMaster);
//bool RefreshManager::doRefresh(tlm::tlm_generic_payload &payload, sc_time time)
//{
// sc_assert(!isInvalidated(payload, time));
// bool pre = false;
// // If any row is open, precharge all.
// if (!controllerCore.state->rowBufferStates->allRowBuffersAreClosed()) {
// pre = true;
// ScheduledCommand prechargeAllMaster(Command::PREA, time,
// Configuration::getInstance().memSpec->getExecutionTime(
// Command::PREA, refreshPayloads[Bank(0)]),
// refreshPayloads[Bank(0)]);
// controllerCore.getCommandChecker(
// Command::PREA).delayToSatisfyConstraints(prechargeAllMaster);
for (size_t i = 1; i < controllerCore.getBanks().size(); i++) {
ScheduledCommand prechargeAll(Command::PREA,
prechargeAllMaster.getStart(), prechargeAllMaster.getExecutionTime(),
refreshPayloads[Bank(i)]);
controllerCore.state->change(prechargeAll);
}
controllerCore.state->change(prechargeAllMaster);
controllerCore.controller.send(prechargeAllMaster, refreshPayloads[Bank(0)]);
}
// for (size_t i = 1; i < controllerCore.getBanks().size(); i++) {
// ScheduledCommand prechargeAll(Command::PREA,
// prechargeAllMaster.getStart(), prechargeAllMaster.getExecutionTime(),
// refreshPayloads[Bank(i)]);
// controllerCore.state->change(prechargeAll);
// }
// controllerCore.state->change(prechargeAllMaster);
// controllerCore.controller.send(prechargeAllMaster, refreshPayloads[Bank(0)]);
// }
//Otherwise just the AutoRefresh command is scheduled.
ScheduledCommand refreshAllMaster(Command::REFA, time,
Configuration::getInstance().memSpec->getExecutionTime(
Command::REFA, refreshPayloads[Bank(0)]),
DramExtension::getExtension(refreshPayloads[Bank(0)]));
controllerCore.getCommandChecker(
Command::REFA).delayToSatisfyConstraints(refreshAllMaster);
// //Otherwise just the AutoRefresh command is scheduled.
// ScheduledCommand refreshAllMaster(Command::REFA, time,
// Configuration::getInstance().memSpec->getExecutionTime(
// Command::REFA, refreshPayloads[Bank(0)]),
// DramExtension::getExtension(refreshPayloads[Bank(0)]));
// controllerCore.getCommandChecker(
// Command::REFA).delayToSatisfyConstraints(refreshAllMaster);
for (size_t i = 1; i < controllerCore.getBanks().size(); i++) {
ScheduledCommand refresh(Command::REFA, refreshAllMaster.getStart(),
refreshAllMaster.getExecutionTime(), refreshPayloads[Bank(i)]);
controllerCore.state->change(refresh);
DramExtension::getExtension(refreshPayloads[Bank(i)]).incrementRow();
}
controllerCore.state->change(refreshAllMaster);
DramExtension::getExtension(refreshPayloads[Bank(0)]).incrementRow();
controllerCore.controller.send(refreshAllMaster, refreshPayloads[Bank(0)]);
return pre;
}
// for (size_t i = 1; i < controllerCore.getBanks().size(); i++) {
// ScheduledCommand refresh(Command::REFA, refreshAllMaster.getStart(),
// refreshAllMaster.getExecutionTime(), refreshPayloads[Bank(i)]);
// controllerCore.state->change(refresh);
// DramExtension::getExtension(refreshPayloads[Bank(i)]).incrementRow();
// }
// controllerCore.state->change(refreshAllMaster);
// DramExtension::getExtension(refreshPayloads[Bank(0)]).incrementRow();
// controllerCore.controller.send(refreshAllMaster, refreshPayloads[Bank(0)]);
// return pre;
//}
void RefreshManager::scheduleRefresh(tlm::tlm_generic_payload &payload,
sc_time time)
{
sc_time nextRefTiming;
bool pendingReq = controllerCore.hasPendingRequests();
bool canPostpone = postponeEnabled && pendingReq && (postponed < maxpostpone);
bool canPullIn = pullInEnabled && !pendingReq && (pulledin < maxpullin);
previousState = currentState;
currentState = nextState;
bool align = false;
sc_time nrt;
bool pre;
//void RefreshManager::scheduleRefresh(tlm::tlm_generic_payload &payload,
// sc_time time)
//{
// sc_time nextRefTiming;
// bool pendingReq = controllerCore.hasPendingRequests();
// bool canPostpone = postponeEnabled && pendingReq && (postponed < maxpostpone);
// bool canPullIn = pullInEnabled && !pendingReq && (pulledin < maxpullin);
// previousState = currentState;
// currentState = nextState;
// bool align = false;
// sc_time nrt;
// bool pre;
switch (currentState) {
case ST_REFRESH:
// Regular Refresh. It's possible to migrate from this to the flexible
// refresh states
assert(pulledin == 0 && postponed == 0);
if (canPostpone) {
nextRefTiming = SC_ZERO_TIME;
nextState = ST_POSTPONE;
} else if (canPullIn) {
pre = doRefresh(payload, time);
nrt = tRFCx;
if (pre)
nrt += controllerCore.config.memSpec->tRP_old;
nextRefTiming = nrt;
nextState = ST_PULLIN;
} else {
doRefresh(payload, time);
nextRefTiming = tREFIx;
nextState = ST_REFRESH;
}
break;
case ST_PULLIN:
// Pull-in a refresh. Try to pull-in refreshes as long it is possible.
if (canPullIn) {
pulledin++;
pre = doRefresh(payload, time);
nrt = tRFCx;
if (pre)
nrt += controllerCore.config.memSpec->tRP_old;
nextRefTiming = nrt;
nextState = ST_PULLIN;
} else {
nextRefTiming = SC_ZERO_TIME;
nextState = ST_ALIGN;
}
break;
case ST_SKIP:
// Skip the pulled-in refreshes.
if (pulledin == 0) {
nextRefTiming = SC_ZERO_TIME;
nextState = ST_REFRESH;
} else {
pulledin--;
nextRefTiming = tREFIx;
nextState = ST_SKIP;
}
break;
case ST_POSTPONE:
// Postpone Refresh. Delaying refreshes as long as there are pending
// requests and credits to postpone. Should be followed by a burst
// refresh.
postponed++;
if ((postponed > maxpostpone) || (!pendingReq
&& !controllerCore.config.ControllerCoreRefForceMaxPostponeBurst)) {
// Burst triggered by inactivity or max postpone value reached.
nextRefTiming = SC_ZERO_TIME;
nextState = ST_BURST;
} else {
nextRefTiming = tREFIx;
nextState = ST_POSTPONE;
}
break;
case ST_BURST:
// Burst postponed refreshes.
pre = doRefresh(payload, time);
postponed--;
if (postponed == 0) {
// All refreshes issued, next state will align to tREFIx
nextRefTiming = SC_ZERO_TIME;
nextState = ST_ALIGN;
} else {
nrt = tRFCx;
if (pre)
nrt += controllerCore.config.memSpec->tRP_old;
nextRefTiming = nrt;
nextState = ST_BURST;
}
break;
case ST_ALIGN:
// Align Refresh. Adjusting the timing so the next REF timing will be
// a in a time multiple of tREFIx
nextRefTiming = tREFIx;
align = true;
if (previousState == ST_PULLIN) {
nextState = ST_SKIP;
} else {
nextState = ST_REFRESH;
}
break;
default:
SC_REPORT_FATAL(this->name(), "Invalid state in flexible refresh FSM.");
break;
}
planNextRefresh(nextRefTiming, align);
}
// switch (currentState) {
// case ST_REFRESH:
// // Regular Refresh. It's possible to migrate from this to the flexible
// // refresh states
// assert(pulledin == 0 && postponed == 0);
// if (canPostpone) {
// nextRefTiming = SC_ZERO_TIME;
// nextState = ST_POSTPONE;
// } else if (canPullIn) {
// pre = doRefresh(payload, time);
// nrt = tRFCx;
// if (pre)
// nrt += controllerCore.config.memSpec->tRP_old;
// nextRefTiming = nrt;
// nextState = ST_PULLIN;
// } else {
// doRefresh(payload, time);
// nextRefTiming = tREFIx;
// nextState = ST_REFRESH;
// }
// break;
// case ST_PULLIN:
// // Pull-in a refresh. Try to pull-in refreshes as long it is possible.
// if (canPullIn) {
// pulledin++;
// pre = doRefresh(payload, time);
// nrt = tRFCx;
// if (pre)
// nrt += controllerCore.config.memSpec->tRP_old;
// nextRefTiming = nrt;
// nextState = ST_PULLIN;
// } else {
// nextRefTiming = SC_ZERO_TIME;
// nextState = ST_ALIGN;
// }
// break;
// case ST_SKIP:
// // Skip the pulled-in refreshes.
// if (pulledin == 0) {
// nextRefTiming = SC_ZERO_TIME;
// nextState = ST_REFRESH;
// } else {
// pulledin--;
// nextRefTiming = tREFIx;
// nextState = ST_SKIP;
// }
// break;
// case ST_POSTPONE:
// // Postpone Refresh. Delaying refreshes as long as there are pending
// // requests and credits to postpone. Should be followed by a burst
// // refresh.
// postponed++;
// if ((postponed > maxpostpone) || (!pendingReq
// && !controllerCore.config.ControllerCoreRefForceMaxPostponeBurst)) {
// // Burst triggered by inactivity or max postpone value reached.
// nextRefTiming = SC_ZERO_TIME;
// nextState = ST_BURST;
// } else {
// nextRefTiming = tREFIx;
// nextState = ST_POSTPONE;
// }
// break;
// case ST_BURST:
// // Burst postponed refreshes.
// pre = doRefresh(payload, time);
// postponed--;
// if (postponed == 0) {
// // All refreshes issued, next state will align to tREFIx
// nextRefTiming = SC_ZERO_TIME;
// nextState = ST_ALIGN;
// } else {
// nrt = tRFCx;
// if (pre)
// nrt += controllerCore.config.memSpec->tRP_old;
// nextRefTiming = nrt;
// nextState = ST_BURST;
// }
// break;
// case ST_ALIGN:
// // Align Refresh. Adjusting the timing so the next REF timing will be
// // a in a time multiple of tREFIx
// nextRefTiming = tREFIx;
// align = true;
// if (previousState == ST_PULLIN) {
// nextState = ST_SKIP;
// } else {
// nextState = ST_REFRESH;
// }
// break;
// default:
// SC_REPORT_FATAL(this->name(), "Invalid state in flexible refresh FSM.");
// break;
// }
// planNextRefresh(nextRefTiming, align);
//}
void RefreshManager::planNextRefresh(sc_time nextRefTiming, bool align)
{
if (align) {
nextPlannedRefresh = trunc(nextPlannedRefresh.to_double() / tREFIx.to_double())
* tREFIx;
}
nextPlannedRefresh += nextRefTiming;
controllerCore.controller.send(REFTrigger, nextPlannedRefresh,
refreshPayloads[Bank(0)]);
}
//void RefreshManager::planNextRefresh(sc_time nextRefTiming, bool align)
//{
// if (align) {
// nextPlannedRefresh = trunc(nextPlannedRefresh.to_double() / tREFIx.to_double())
// * tREFIx;
// }
// nextPlannedRefresh += nextRefTiming;
// controllerCore.controller.send(REFTrigger, nextPlannedRefresh,
// refreshPayloads[Bank(0)]);
//}
void RefreshManager::reInitialize(Bank, sc_time time)
{
nextPlannedRefresh = clkAlign(time, Alignment::DOWN);
planNextRefresh(tREFIx, true);
}
//void RefreshManager::reInitialize(Bank, sc_time time)
//{
// nextPlannedRefresh = clkAlign(time, Alignment::DOWN);
// planNextRefresh(tREFIx, true);
//}
bool RefreshManager::isInvalidated(tlm::tlm_generic_payload &payload
__attribute__((unused)), sc_time time)
{
return nextPlannedRefresh > time;
}
//bool RefreshManager::isInvalidated(tlm::tlm_generic_payload &payload
// __attribute__((unused)), sc_time time)
//{
// return nextPlannedRefresh > time;
//}
void RefreshManager::printDebugMessage(std::string message)
{
DebugManager::getInstance().printDebugMessage(this->name(), message);
}
//void RefreshManager::printDebugMessage(std::string message)
//{
// DebugManager::getInstance().printDebugMessage(this->name(), message);
//}

View File

@@ -1,82 +1,82 @@
/*
* Copyright (c) 2015, University of Kaiserslautern
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors:
* Robert Gernhardt
* Matthias Jung
* Éder F. Zulian
*/
///*
// * Copyright (c) 2015, University of Kaiserslautern
// * All rights reserved.
// *
// * Redistribution and use in source and binary forms, with or without
// * modification, are permitted provided that the following conditions are
// * met:
// *
// * 1. Redistributions of source code must retain the above copyright notice,
// * this list of conditions and the following disclaimer.
// *
// * 2. Redistributions in binary form must reproduce the above copyright
// * notice, this list of conditions and the following disclaimer in the
// * documentation and/or other materials provided with the distribution.
// *
// * 3. Neither the name of the copyright holder nor the names of its
// * contributors may be used to endorse or promote products derived from
// * this software without specific prior written permission.
// *
// * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
// * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// *
// * Authors:
// * Robert Gernhardt
// * Matthias Jung
// * Éder F. Zulian
// */
#ifndef REFRESHMANAGER_H
#define REFRESHMANAGER_H
//#ifndef REFRESHMANAGER_H
//#define REFRESHMANAGER_H
#include "IRefreshManager.h"
#include "../configuration/MemSpec.h"
//#include "IRefreshManager.h"
//#include "../configuration/MemSpec.h"
class ControllerCore;
//class ControllerCore;
class RefreshManager : public IRefreshManager, public sc_module
{
public:
RefreshManager(sc_module_name /*name*/, ControllerCore &controllerCore);
virtual ~RefreshManager();
//class RefreshManager : public IRefreshManager, public sc_module
//{
//public:
// RefreshManager(sc_module_name /*name*/, ControllerCore &controllerCore);
// virtual ~RefreshManager();
virtual bool hasCollision(const ScheduledCommand &command) override;
virtual void scheduleRefresh(tlm::tlm_generic_payload &payload,
sc_time time) override;
void reInitialize(Bank bank, sc_time time) override;
virtual bool isInvalidated(tlm::tlm_generic_payload &payload,
sc_time time) override;
// virtual bool hasCollision(const ScheduledCommand &command) override;
// virtual void scheduleRefresh(tlm::tlm_generic_payload &payload,
// sc_time time) override;
// void reInitialize(Bank bank, sc_time time) override;
// virtual bool isInvalidated(tlm::tlm_generic_payload &payload,
// sc_time time) override;
private:
ControllerCore &controllerCore;
RefreshTiming &timing;
sc_time nextPlannedRefresh;
sc_time tREFIx;
sc_time tRFCx;
std::map<Bank, tlm::tlm_generic_payload> refreshPayloads;
bool postponeEnabled;
bool pullInEnabled;
unsigned int maxpostpone;
unsigned int maxpullin;
unsigned int pulledin;
unsigned int postponed;
ref_fsm_state_t currentState;
ref_fsm_state_t previousState;
ref_fsm_state_t nextState;
//private:
// ControllerCore &controllerCore;
// RefreshTiming &timing;
// sc_time nextPlannedRefresh;
// sc_time tREFIx;
// sc_time tRFCx;
// std::map<Bank, tlm::tlm_generic_payload> refreshPayloads;
// bool postponeEnabled;
// bool pullInEnabled;
// unsigned int maxpostpone;
// unsigned int maxpullin;
// unsigned int pulledin;
// unsigned int postponed;
// ref_fsm_state_t currentState;
// ref_fsm_state_t previousState;
// ref_fsm_state_t nextState;
bool doRefresh(tlm::tlm_generic_payload &payload, sc_time time);
void planNextRefresh(sc_time time, bool align);
void printDebugMessage(std::string message);
};
// bool doRefresh(tlm::tlm_generic_payload &payload, sc_time time);
// void planNextRefresh(sc_time time, bool align);
// void printDebugMessage(std::string message);
//};
#endif // REFRESHMANAGER_H
//#endif // REFRESHMANAGER_H

View File

@@ -1,265 +1,265 @@
/*
* Copyright (c) 2015, University of Kaiserslautern
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors:
* Janik Schlemminger
* Matthias Jung
* Éder F. Zulian
*/
///*
// * Copyright (c) 2015, University of Kaiserslautern
// * All rights reserved.
// *
// * Redistribution and use in source and binary forms, with or without
// * modification, are permitted provided that the following conditions are
// * met:
// *
// * 1. Redistributions of source code must retain the above copyright notice,
// * this list of conditions and the following disclaimer.
// *
// * 2. Redistributions in binary form must reproduce the above copyright
// * notice, this list of conditions and the following disclaimer in the
// * documentation and/or other materials provided with the distribution.
// *
// * 3. Neither the name of the copyright holder nor the names of its
// * contributors may be used to endorse or promote products derived from
// * this software without specific prior written permission.
// *
// * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
// * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// *
// * Authors:
// * Janik Schlemminger
// * Matthias Jung
// * Éder F. Zulian
// */
#include "RefreshManagerBankwise.h"
#include "../ControllerCore.h"
#include "../timingCalculations.h"
#include "../../../common/utils.h"
//#include "RefreshManagerBankwise.h"
//#include "../ControllerCore.h"
//#include "../timingCalculations.h"
//#include "../../../common/utils.h"
using namespace std;
//using namespace std;
RefreshManagerBankwise::RefreshManagerBankwise(sc_module_name,
ControllerCore &controller) : controllerCore(controller),
timing(controller.config.memSpec->refreshTimings[Bank(0)])
{
auto m = controllerCore.config.getRefMode();
tREFIx = timing.tREFI / m;
tRFCx = timing.tRFC;
postponeEnabled = controllerCore.config.ControllerCoreRefEnablePostpone;
pullInEnabled = controllerCore.config.ControllerCoreRefEnablePullIn;
maxpostpone = controllerCore.config.ControllerCoreRefMaxPostponed * m;
maxpullin = controllerCore.config.ControllerCoreRefMaxPulledIn * m;
for (Bank bank : controller.getBanks()) {
nextPlannedRefreshs[bank] = SC_ZERO_TIME;
pulledin[bank] = 0;
postponed[bank] = 0;
currentState[bank] = ST_REFRESH;
previousState[bank] = ST_REFRESH;
nextState[bank] = ST_REFRESH;
setUpDummy(refreshPayloads[bank], bank);
planNextRefresh(bank, tREFIx, false);
}
}
//RefreshManagerBankwise::RefreshManagerBankwise(sc_module_name,
// ControllerCore &controller) : controllerCore(controller),
// timing(controller.config.memSpec->refreshTimings[Bank(0)])
//{
// auto m = controllerCore.config.getRefMode();
// tREFIx = timing.tREFI / m;
// tRFCx = timing.tRFC;
// postponeEnabled = controllerCore.config.ControllerCoreRefEnablePostpone;
// pullInEnabled = controllerCore.config.ControllerCoreRefEnablePullIn;
// maxpostpone = controllerCore.config.ControllerCoreRefMaxPostponed * m;
// maxpullin = controllerCore.config.ControllerCoreRefMaxPulledIn * m;
// for (Bank bank : controller.getBanks()) {
// nextPlannedRefreshs[bank] = SC_ZERO_TIME;
// pulledin[bank] = 0;
// postponed[bank] = 0;
// currentState[bank] = ST_REFRESH;
// previousState[bank] = ST_REFRESH;
// nextState[bank] = ST_REFRESH;
// setUpDummy(refreshPayloads[bank], bank);
// planNextRefresh(bank, tREFIx, false);
// }
//}
RefreshManagerBankwise::~RefreshManagerBankwise()
{
}
//RefreshManagerBankwise::~RefreshManagerBankwise()
//{
//}
bool RefreshManagerBankwise::hasCollision(const ScheduledCommand &command)
{
Bank bank = command.getBank();
bool collisionWithPreviousRefEnd = command.getStart() <
controllerCore.state->getLastCommand(Command::REFA, bank).getEnd();
bool collisionWithNextRefStart = command.getEnd() >= nextPlannedRefreshs[bank];
if (controllerCore.config.ControllerCoreRefEnablePostpone
&& (postponed[bank] < maxpostpone)) {
// Flexible refresh is on and have "credits" to postpone.
// Then there will not be a collision with next refresh because
// nextPlannedRefresh will be updated.
collisionWithNextRefStart = false;
}
if (currentState[bank] == ST_BURST) {
// A burst due to postponed refreshes shall not be interrupted.
collisionWithNextRefStart = true;
}
return collisionWithPreviousRefEnd || collisionWithNextRefStart;
}
//bool RefreshManagerBankwise::hasCollision(const ScheduledCommand &command)
//{
// Bank bank = command.getBank();
// bool collisionWithPreviousRefEnd = command.getStart() <
// controllerCore.state->getLastCommand(Command::REFA, bank).getEnd();
// bool collisionWithNextRefStart = command.getEnd() >= nextPlannedRefreshs[bank];
// if (controllerCore.config.ControllerCoreRefEnablePostpone
// && (postponed[bank] < maxpostpone)) {
// // Flexible refresh is on and have "credits" to postpone.
// // Then there will not be a collision with next refresh because
// // nextPlannedRefresh will be updated.
// collisionWithNextRefStart = false;
// }
// if (currentState[bank] == ST_BURST) {
// // A burst due to postponed refreshes shall not be interrupted.
// collisionWithNextRefStart = true;
// }
// return collisionWithPreviousRefEnd || collisionWithNextRefStart;
//}
bool RefreshManagerBankwise::doRefresh(tlm::tlm_generic_payload &payload,
sc_time time)
{
sc_assert(!isInvalidated(payload, time));
bool pre = false;
tlm::tlm_generic_payload &refreshPayload =
refreshPayloads[DramExtension::getExtension(payload).getBank()];
DramExtension &extension = DramExtension::getExtension(refreshPayload);
//bool RefreshManagerBankwise::doRefresh(tlm::tlm_generic_payload &payload,
// sc_time time)
//{
// sc_assert(!isInvalidated(payload, time));
// bool pre = false;
// tlm::tlm_generic_payload &refreshPayload =
// refreshPayloads[DramExtension::getExtension(payload).getBank()];
// DramExtension &extension = DramExtension::getExtension(refreshPayload);
if (controllerCore.state->rowBufferStates->rowBufferIsOpen(
extension.getBank())) {
pre = true;
ScheduledCommand precharge(Command::PRE, time,
Configuration::getInstance().memSpec->getExecutionTime(
Command::PRE, refreshPayload), extension);
controllerCore.getCommandChecker(Command::PRE).delayToSatisfyConstraints(
precharge);
controllerCore.state->change(precharge);
controllerCore.controller.send(precharge, refreshPayload);
}
// if (controllerCore.state->rowBufferStates->rowBufferIsOpen(
// extension.getBank())) {
// pre = true;
// ScheduledCommand precharge(Command::PRE, time,
// Configuration::getInstance().memSpec->getExecutionTime(
// Command::PRE, refreshPayload), extension);
// controllerCore.getCommandChecker(Command::PRE).delayToSatisfyConstraints(
// precharge);
// controllerCore.state->change(precharge);
// controllerCore.controller.send(precharge, refreshPayload);
// }
ScheduledCommand refresh(Command::REFA, time,
Configuration::getInstance().memSpec->getExecutionTime(
Command::REFA, refreshPayload), extension);
controllerCore.getCommandChecker(
Command::REFA).delayToSatisfyConstraints(refresh);
controllerCore.state->change(refresh);
extension.incrementRow();
controllerCore.controller.send(refresh, refreshPayload);
return pre;
}
// ScheduledCommand refresh(Command::REFA, time,
// Configuration::getInstance().memSpec->getExecutionTime(
// Command::REFA, refreshPayload), extension);
// controllerCore.getCommandChecker(
// Command::REFA).delayToSatisfyConstraints(refresh);
// controllerCore.state->change(refresh);
// extension.incrementRow();
// controllerCore.controller.send(refresh, refreshPayload);
// return pre;
//}
void RefreshManagerBankwise::scheduleRefresh(tlm::tlm_generic_payload &payload,
sc_time time)
{
sc_time nextRefTiming;
Bank bank = DramExtension::getExtension(payload).getBank();
bool pendingReq = controllerCore.hasPendingRequests(bank);
bool canPostpone = postponeEnabled && pendingReq
&& (postponed[bank] < maxpostpone);
bool canPullIn = pullInEnabled && !pendingReq && (pulledin[bank] < maxpullin);
previousState[bank] = currentState[bank];
currentState[bank] = nextState[bank];
bool align = false;
sc_time nrt;
bool pre;
//void RefreshManagerBankwise::scheduleRefresh(tlm::tlm_generic_payload &payload,
// sc_time time)
//{
// sc_time nextRefTiming;
// Bank bank = DramExtension::getExtension(payload).getBank();
// bool pendingReq = controllerCore.hasPendingRequests(bank);
// bool canPostpone = postponeEnabled && pendingReq
// && (postponed[bank] < maxpostpone);
// bool canPullIn = pullInEnabled && !pendingReq && (pulledin[bank] < maxpullin);
// previousState[bank] = currentState[bank];
// currentState[bank] = nextState[bank];
// bool align = false;
// sc_time nrt;
// bool pre;
switch (currentState[bank]) {
case ST_REFRESH:
// Regular Refresh. It's possible to migrate from this to the flexible
// refresh states
assert(pulledin[bank] == 0 && postponed[bank] == 0);
if (canPostpone) {
nextRefTiming = SC_ZERO_TIME;
nextState[bank] = ST_POSTPONE;
} else if (canPullIn) {
pre = doRefresh(payload, time);
nrt = tRFCx;
if (pre)
nrt += controllerCore.config.memSpec->tRP_old;
nextRefTiming = nrt;
nextState[bank] = ST_PULLIN;
} else {
doRefresh(payload, time);
nextRefTiming = tREFIx;
nextState[bank] = ST_REFRESH;
}
break;
case ST_PULLIN:
// Pull-in a refresh. Try to pull-in refreshes as long it is possible.
if (canPullIn) {
pulledin[bank]++;
pre = doRefresh(payload, time);
nrt = tRFCx;
if (pre)
nrt += controllerCore.config.memSpec->tRP_old;
nextRefTiming = nrt;
nextState[bank] = ST_PULLIN;
} else {
nextRefTiming = SC_ZERO_TIME;
nextState[bank] = ST_ALIGN;
}
break;
case ST_SKIP:
// Skip the pulled-in refreshes.
if (pulledin[bank] == 0) {
nextRefTiming = SC_ZERO_TIME;
nextState[bank] = ST_REFRESH;
} else {
pulledin[bank]--;
nextRefTiming = tREFIx;
nextState[bank] = ST_SKIP;
}
break;
case ST_POSTPONE:
// Postpone Refresh. Delaying refreshes as long as there are pending
// requests and credits to postpone. Should be followed by a burst
// refresh.
postponed[bank]++;
if ((postponed[bank] > maxpostpone) || (!pendingReq
&& !controllerCore.config.ControllerCoreRefForceMaxPostponeBurst)) {
// Burst triggered by inactivity or max postpone value reached.
nextRefTiming = SC_ZERO_TIME;
nextState[bank] = ST_BURST;
} else {
nextRefTiming = tREFIx;
nextState[bank] = ST_POSTPONE;
}
break;
// switch (currentState[bank]) {
// case ST_REFRESH:
// // Regular Refresh. It's possible to migrate from this to the flexible
// // refresh states
// assert(pulledin[bank] == 0 && postponed[bank] == 0);
// if (canPostpone) {
// nextRefTiming = SC_ZERO_TIME;
// nextState[bank] = ST_POSTPONE;
// } else if (canPullIn) {
// pre = doRefresh(payload, time);
// nrt = tRFCx;
// if (pre)
// nrt += controllerCore.config.memSpec->tRP_old;
// nextRefTiming = nrt;
// nextState[bank] = ST_PULLIN;
// } else {
// doRefresh(payload, time);
// nextRefTiming = tREFIx;
// nextState[bank] = ST_REFRESH;
// }
// break;
// case ST_PULLIN:
// // Pull-in a refresh. Try to pull-in refreshes as long it is possible.
// if (canPullIn) {
// pulledin[bank]++;
// pre = doRefresh(payload, time);
// nrt = tRFCx;
// if (pre)
// nrt += controllerCore.config.memSpec->tRP_old;
// nextRefTiming = nrt;
// nextState[bank] = ST_PULLIN;
// } else {
// nextRefTiming = SC_ZERO_TIME;
// nextState[bank] = ST_ALIGN;
// }
// break;
// case ST_SKIP:
// // Skip the pulled-in refreshes.
// if (pulledin[bank] == 0) {
// nextRefTiming = SC_ZERO_TIME;
// nextState[bank] = ST_REFRESH;
// } else {
// pulledin[bank]--;
// nextRefTiming = tREFIx;
// nextState[bank] = ST_SKIP;
// }
// break;
// case ST_POSTPONE:
// // Postpone Refresh. Delaying refreshes as long as there are pending
// // requests and credits to postpone. Should be followed by a burst
// // refresh.
// postponed[bank]++;
// if ((postponed[bank] > maxpostpone) || (!pendingReq
// && !controllerCore.config.ControllerCoreRefForceMaxPostponeBurst)) {
// // Burst triggered by inactivity or max postpone value reached.
// nextRefTiming = SC_ZERO_TIME;
// nextState[bank] = ST_BURST;
// } else {
// nextRefTiming = tREFIx;
// nextState[bank] = ST_POSTPONE;
// }
// break;
case ST_BURST:
// Burst postponed refreshes.
pre = doRefresh(payload, time);
postponed[bank]--;
if (postponed[bank] == 0) {
// All refreshes issued, next state will align to tREFIx
nextRefTiming = SC_ZERO_TIME;
nextState[bank] = ST_ALIGN;
} else {
nrt = tRFCx;
if (pre)
nrt += controllerCore.config.memSpec->tRP_old;
nextRefTiming = nrt;
nextState[bank] = ST_BURST;
}
break;
case ST_ALIGN:
// Align Refresh. Adjusting the timing so the next REF timing will be
// a in a time multiple of tREFIx
nextRefTiming = tREFIx;
align = true;
if (previousState[bank] == ST_PULLIN) {
nextState[bank] = ST_SKIP;
} else {
nextState[bank] = ST_REFRESH;
}
break;
default:
SC_REPORT_FATAL(this->name(), "Invalid state in bw flex. ref. FSM.");
break;
}
planNextRefresh(bank, nextRefTiming, align);
}
// case ST_BURST:
// // Burst postponed refreshes.
// pre = doRefresh(payload, time);
// postponed[bank]--;
// if (postponed[bank] == 0) {
// // All refreshes issued, next state will align to tREFIx
// nextRefTiming = SC_ZERO_TIME;
// nextState[bank] = ST_ALIGN;
// } else {
// nrt = tRFCx;
// if (pre)
// nrt += controllerCore.config.memSpec->tRP_old;
// nextRefTiming = nrt;
// nextState[bank] = ST_BURST;
// }
// break;
// case ST_ALIGN:
// // Align Refresh. Adjusting the timing so the next REF timing will be
// // a in a time multiple of tREFIx
// nextRefTiming = tREFIx;
// align = true;
// if (previousState[bank] == ST_PULLIN) {
// nextState[bank] = ST_SKIP;
// } else {
// nextState[bank] = ST_REFRESH;
// }
// break;
// default:
// SC_REPORT_FATAL(this->name(), "Invalid state in bw flex. ref. FSM.");
// break;
// }
// planNextRefresh(bank, nextRefTiming, align);
//}
void RefreshManagerBankwise::planNextRefresh(Bank bank, sc_time nextRefTiming,
bool align)
{
if (align) {
nextPlannedRefreshs[bank] = trunc(nextPlannedRefreshs[bank].to_double() /
tREFIx.to_double()) * tREFIx;
}
nextPlannedRefreshs[bank] += nextRefTiming;
controllerCore.controller.send(REFTrigger, nextPlannedRefreshs[bank],
refreshPayloads[bank]);
}
//void RefreshManagerBankwise::planNextRefresh(Bank bank, sc_time nextRefTiming,
// bool align)
//{
// if (align) {
// nextPlannedRefreshs[bank] = trunc(nextPlannedRefreshs[bank].to_double() /
// tREFIx.to_double()) * tREFIx;
// }
// nextPlannedRefreshs[bank] += nextRefTiming;
// controllerCore.controller.send(REFTrigger, nextPlannedRefreshs[bank],
// refreshPayloads[bank]);
//}
void RefreshManagerBankwise::reInitialize(Bank bank, sc_time time)
{
nextPlannedRefreshs[bank] = clkAlign(time, Alignment::DOWN);
planNextRefresh(bank, tREFIx, true);
}
//void RefreshManagerBankwise::reInitialize(Bank bank, sc_time time)
//{
// nextPlannedRefreshs[bank] = clkAlign(time, Alignment::DOWN);
// planNextRefresh(bank, tREFIx, true);
//}
bool RefreshManagerBankwise::isInvalidated(tlm::tlm_generic_payload &payload,
sc_time time)
{
return nextPlannedRefreshs[DramExtension::getExtension(payload).getBank()] >
time;
}
//bool RefreshManagerBankwise::isInvalidated(tlm::tlm_generic_payload &payload,
// sc_time time)
//{
// return nextPlannedRefreshs[DramExtension::getExtension(payload).getBank()] >
// time;
//}
void RefreshManagerBankwise::printDebugMessage(std::string message)
{
DebugManager::getInstance().printDebugMessage(this->name(), message);
}
//void RefreshManagerBankwise::printDebugMessage(std::string message)
//{
// DebugManager::getInstance().printDebugMessage(this->name(), message);
//}

View File

@@ -1,83 +1,83 @@
/*
* Copyright (c) 2015, University of Kaiserslautern
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors:
* Janik Schlemminger
* Matthias Jung
* Éder F. Zulian
*/
///*
// * Copyright (c) 2015, University of Kaiserslautern
// * All rights reserved.
// *
// * Redistribution and use in source and binary forms, with or without
// * modification, are permitted provided that the following conditions are
// * met:
// *
// * 1. Redistributions of source code must retain the above copyright notice,
// * this list of conditions and the following disclaimer.
// *
// * 2. Redistributions in binary form must reproduce the above copyright
// * notice, this list of conditions and the following disclaimer in the
// * documentation and/or other materials provided with the distribution.
// *
// * 3. Neither the name of the copyright holder nor the names of its
// * contributors may be used to endorse or promote products derived from
// * this software without specific prior written permission.
// *
// * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
// * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// *
// * Authors:
// * Janik Schlemminger
// * Matthias Jung
// * Éder F. Zulian
// */
#ifndef REFRESHMANAGERBANKWISE_H
#define REFRESHMANAGERBANKWISE_H
//#ifndef REFRESHMANAGERBANKWISE_H
//#define REFRESHMANAGERBANKWISE_H
//#include "../../../common/dramExtension.h"
#include "IRefreshManager.h"
#include "../configuration/MemSpec.h"
////#include "../../../common/dramExtension.h"
//#include "IRefreshManager.h"
//#include "../configuration/MemSpec.h"
class ControllerCore;
//class ControllerCore;
class RefreshManagerBankwise : public IRefreshManager, public sc_module
{
public:
RefreshManagerBankwise(sc_module_name /*name*/, ControllerCore &controllerCore);
virtual ~RefreshManagerBankwise();
//class RefreshManagerBankwise : public IRefreshManager, public sc_module
//{
//public:
// RefreshManagerBankwise(sc_module_name /*name*/, ControllerCore &controllerCore);
// virtual ~RefreshManagerBankwise();
virtual bool hasCollision(const ScheduledCommand &command) override;
virtual void scheduleRefresh(tlm::tlm_generic_payload &payload,
sc_time time) override;
void reInitialize(Bank bank, sc_time time) override;
bool isInvalidated(tlm::tlm_generic_payload &payload, sc_time time) override;
// virtual bool hasCollision(const ScheduledCommand &command) override;
// virtual void scheduleRefresh(tlm::tlm_generic_payload &payload,
// sc_time time) override;
// void reInitialize(Bank bank, sc_time time) override;
// bool isInvalidated(tlm::tlm_generic_payload &payload, sc_time time) override;
private:
ControllerCore &controllerCore;
RefreshTiming &timing;
std::map<Bank, sc_time> nextPlannedRefreshs;
sc_time tREFIx;
sc_time tRFCx;
std::map<Bank, tlm::tlm_generic_payload> refreshPayloads;
bool postponeEnabled;
bool pullInEnabled;
unsigned int maxpostpone;
unsigned int maxpullin;
std::map<Bank, unsigned int> pulledin;
std::map<Bank, unsigned int> postponed;
std::map<Bank, ref_fsm_state_t> currentState;
std::map<Bank, ref_fsm_state_t> previousState;
std::map<Bank, ref_fsm_state_t> nextState;
//private:
// ControllerCore &controllerCore;
// RefreshTiming &timing;
// std::map<Bank, sc_time> nextPlannedRefreshs;
// sc_time tREFIx;
// sc_time tRFCx;
// std::map<Bank, tlm::tlm_generic_payload> refreshPayloads;
// bool postponeEnabled;
// bool pullInEnabled;
// unsigned int maxpostpone;
// unsigned int maxpullin;
// std::map<Bank, unsigned int> pulledin;
// std::map<Bank, unsigned int> postponed;
// std::map<Bank, ref_fsm_state_t> currentState;
// std::map<Bank, ref_fsm_state_t> previousState;
// std::map<Bank, ref_fsm_state_t> nextState;
bool doRefresh(tlm::tlm_generic_payload &payload, sc_time time);
void planNextRefresh(Bank bank, sc_time time, bool align);
void printDebugMessage(std::string message);
};
// bool doRefresh(tlm::tlm_generic_payload &payload, sc_time time);
// void planNextRefresh(Bank bank, sc_time time, bool align);
// void printDebugMessage(std::string message);
//};
#endif // REFRESHMANAGERBANKWISE_H
//#endif // REFRESHMANAGERBANKWISE_H