diff --git a/dram/resources/simulations/sim-batch.xml b/dram/resources/simulations/sim-batch.xml index 8cf18562..3ce68d4f 100644 --- a/dram/resources/simulations/sim-batch.xml +++ b/dram/resources/simulations/sim-batch.xml @@ -3,21 +3,21 @@ - + - + - + - + - eiersalat.stl + medium.stl diff --git a/dram/src/controller/Controller.h b/dram/src/controller/Controller.h index 88be6298..a3d35335 100644 --- a/dram/src/controller/Controller.h +++ b/dram/src/controller/Controller.h @@ -77,7 +77,10 @@ private: void payloadEntersSystem(tlm_generic_payload& payload); void payloadLeavesSystem(tlm_generic_payload& payload); unsigned int getTotalNumberOfPayloadsInSystem(); - void scheduleNextPayload(); + void scheduleNextFromScheduler(); + //FIFO HACK + void scheduleDirectly(gp* payload); + // --- FRONTEND ------ tlm_sync_enum nb_transport_fw(tlm_generic_payload& payload, tlm_phase& phase, sc_time& fwDelay); @@ -99,6 +102,7 @@ private: ControllerCore* controllerCore; Scheduler* scheduler; std::map numberOfPayloadsInSystem; + std::vector refreshCollisionRequets; tlm::tlm_generic_payload* backpressure = NULL; tlm_utils::peq_with_cb_and_phase frontendPEQ; @@ -283,7 +287,7 @@ void Controller::controllerCorePEQCallback(tlm_generic_payload &payloa sendToDram(payload, phase, SC_ZERO_TIME); if (phase == BEGIN_RD || phase == BEGIN_WR) - scheduleNextPayload(); + scheduleNextFromScheduler(); else if (phase == BEGIN_REFB) printDebugMessage("Entering REFB on bank " + to_string(bank.ID())); else if (phase == BEGIN_REFA) @@ -337,11 +341,19 @@ void Controller::frontendPEQCallback(tlm_generic_payload &payload, con } payload.set_response_status(tlm::TLM_OK_RESPONSE); sendToFrontend(payload, END_REQ, SC_ZERO_TIME); - //FIFOOOOOOOOOOO - //scheduler->schedule(&payload); - controllerCore->scheduleRequest(payload); - scheduleNextPayload(); - } + + //FIFO HACK + if(Configuration::getInstance().Scheduler == "FIFO") + { + scheduleDirectly(&payload); + } + //Original + else + { + scheduler->schedule(&payload); + scheduleNextFromScheduler(); + } + } else if (phase == END_RESP) { if (backpressure != NULL) @@ -349,8 +361,15 @@ void Controller::frontendPEQCallback(tlm_generic_payload &payload, con printDebugMessage("##Backpressure released"); backpressure->set_response_status(tlm::TLM_OK_RESPONSE); sendToFrontend(*backpressure, END_REQ, SC_ZERO_TIME); - scheduler->schedule(backpressure); - scheduleNextPayload(); + if(Configuration::getInstance().Scheduler == "FIFO") + { + scheduleDirectly(backpressure); + } + else + { + scheduler->schedule(backpressure); + scheduleNextFromScheduler(); + } backpressure = NULL; } @@ -395,8 +414,19 @@ unsigned int Controller::getTotalNumberOfPayloadsInSystem() return sum; } + +//FIFO HACK! template -void Controller::scheduleNextPayload() +void Controller::scheduleDirectly(gp* payload) +{ + if(!controllerCore->scheduleRequest(*payload)) + { + refreshCollisionRequets.push_back(payload); + } +} + +template +void Controller::scheduleNextFromScheduler() { if(scheduler->hasPayloads()) { @@ -438,7 +468,7 @@ void Controller::dramPEQCallback(tlm_generic_payload &payload, const t if (phase == BEGIN_RD || phase == BEGIN_WR) { - scheduleNextPayload(); + scheduleNextFromScheduler(); sendToDram(payload, phase, SC_ZERO_TIME); } else if (phase == END_RD || phase == END_WR) @@ -448,14 +478,28 @@ void Controller::dramPEQCallback(tlm_generic_payload &payload, const t else if (phase == END_RDA || phase == END_WRA) { sendToFrontend(payload, BEGIN_RESP, SC_ZERO_TIME); - scheduleNextPayload(); + scheduleNextFromScheduler(); } - else if (phase == END_REFA || phase == END_REFB)//TODO send all to sleep for REFA cause we only send for bank 0 now??? + else if (phase == END_REFA || phase == END_REFB) { printDebugMessage("Finished auto refresh on bank " + to_string(bank.ID())); + if(numberOfPayloadsInSystem[bank] == 0) controllerCore->powerDownManager->sleep(bank,sc_time_stamp()); - scheduleNextPayload(); + //FIFO HACK + if(Configuration::getInstance().Scheduler == "FIFO") + { + std::vector collidedReq = this->refreshCollisionRequets; + refreshCollisionRequets.clear(); + for(gp* payload : collidedReq) + { + scheduleDirectly(payload); + } + } + else + { + scheduleNextFromScheduler(); + } } else if (containsPhase(phase, { END_PRE, END_PRE_ALL, END_ACT })) {