Included various events to avoid multiple triggers of controllerMethod at the same time.
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user