Included various events to avoid multiple triggers of controllerMethod at the same time.

This commit is contained in:
Lukas Steiner (2)
2019-08-09 19:38:49 +02:00
parent 2e40894097
commit 1dea807da3
3 changed files with 21 additions and 24 deletions

View File

@@ -50,7 +50,8 @@ ControllerNew::ControllerNew(sc_module_name name) :
GenericController(name)
{
SC_METHOD(controllerMethod);
sensitive << triggerEvent << triggerEventQueue;
sensitive << beginReqEvent << endRespEvent << bankMachineEvent
<< refreshEvent << dataResponseEventQueue;
dont_initialize();
Configuration config = Configuration::getInstance();
@@ -61,7 +62,7 @@ ControllerNew::ControllerNew(sc_module_name name) :
else
{
refreshManager = new RefreshManager();
triggerEventQueue.notify(refreshManager->getInitialDelay());
refreshEvent.notify(refreshManager->getInitialDelay());
}
if (config.Scheduler == "FifoStrict")
{
@@ -126,6 +127,8 @@ ControllerNew::~ControllerNew()
delete it.second;
delete scheduler;
delete commandMux;
std::cout << "Total method calls: " << methodCalls << ", false triggered: " << falseTriggered << std::endl;
}
tlm_sync_enum ControllerNew::nb_transport_fw(tlm_generic_payload &trans,
@@ -138,18 +141,19 @@ tlm_sync_enum ControllerNew::nb_transport_fw(tlm_generic_payload &trans,
notificationDelay += Configuration::getInstance().memSpec->clk;
payloadToAcquire = &trans;
timeToAcquire = sc_time_stamp() + notificationDelay;
beginReqEvent.notify(notificationDelay);
}
else if (phase = END_RESP)
{
notificationDelay += Configuration::getInstance().memSpec->clk;
timeToRelease = sc_time_stamp() + notificationDelay;
endRespEvent.notify(notificationDelay);
}
else
SC_REPORT_FATAL(0, "nb_transport_fw in controller was triggered with unknown phase");
PRINTDEBUGMESSAGE(name(), "[fw] " + phaseNameToString(phase) + " notification in " +
notificationDelay.to_string());
triggerEventQueueAfterDelay(notificationDelay);
return TLM_ACCEPTED;
}
@@ -159,12 +163,12 @@ tlm_sync_enum ControllerNew::nb_transport_bw(tlm_generic_payload &trans,
{
PRINTDEBUGMESSAGE(name(), "[bw] " + phaseNameToString(phase) + " notification in " +
delay.to_string());
//triggerEventQueueAfterDelay(delay); // TODO: Why do we always trigger the queue?
if (phase == END_RD || phase == END_WR)
{
std::pair<sc_time, tlm_generic_payload *> element((sc_time_stamp() + delay), &trans);
responseQueue.push(element);
triggerEventQueueAfterDelay(delay);
dataResponseEventQueue.notify(delay);
}
return TLM_ACCEPTED;
}
@@ -175,20 +179,9 @@ unsigned int ControllerNew::transport_dbg(tlm_generic_payload &)
return 0;
}
void ControllerNew::triggerEventAfterDelay(sc_time delay)
{
if (delay != SC_ZERO_TIME)
triggerEvent.notify(delay);
}
void ControllerNew::triggerEventQueueAfterDelay(sc_time delay)
{
if (delay != SC_ZERO_TIME)
triggerEventQueue.notify(delay);
}
void ControllerNew::controllerMethod()
{
methodCalls++;
static sc_time lastTimeCalled = SC_ZERO_TIME;
if (lastTimeCalled != sc_time_stamp())
{
@@ -230,7 +223,7 @@ void ControllerNew::controllerMethod()
if (result.second != nullptr)
{
sc_time delay = refreshManager->updateState();
triggerEventQueueAfterDelay(delay);
refreshEvent.notify(delay);
if (result.first == Command::PREA)
{
bool forcedPrecharges = false;
@@ -269,9 +262,12 @@ void ControllerNew::controllerMethod()
for (auto it : bankMachines)
{
sc_time delay = it.second->startBankMachine();
triggerEventAfterDelay(delay);
if (delay != SC_ZERO_TIME) // must be checked to avoid
bankMachineEvent.notify(delay);
}
}
else
falseTriggered++;
}
void ControllerNew::releasePayload()

View File

@@ -90,10 +90,8 @@ private:
void acquirePayload();
void controllerMethod();
sc_event triggerEvent;
void triggerEventAfterDelay(sc_time);
sc_event_queue triggerEventQueue;
void triggerEventQueueAfterDelay(sc_time);
sc_event beginReqEvent, endRespEvent, bankMachineEvent, refreshEvent;
sc_event_queue dataResponseEventQueue;
std::map<Bank, sc_time> commandFinishedTime;
@@ -105,6 +103,9 @@ private:
void endBandwithIdleCollector();
uint64_t numberOfTransactionsServed = 0;
unsigned methodCalls = 0;
unsigned falseTriggered = 0;
};
#endif // CONTROLLERNEW_H

View File

@@ -41,7 +41,7 @@ RefreshManager::RefreshManager()
// TODO: Change time of generation?
refreshPayload.set_extension(new GenerationExtension(SC_ZERO_TIME));
refreshPayload.set_extension(new DramExtension());
memSpec = static_cast<MemSpecDDR3 *>(Configuration::getInstance().memSpec);
memSpec = dynamic_cast<MemSpecDDR3 *>(Configuration::getInstance().memSpec);
if (memSpec == nullptr)
SC_REPORT_FATAL("CheckerDDR3", "Wrong MemSpec chosen");