diff --git a/DRAMSys/library/src/simulation/Arbiter.cpp b/DRAMSys/library/src/simulation/Arbiter.cpp index 0fdb6e5f..51dffde1 100644 --- a/DRAMSys/library/src/simulation/Arbiter.cpp +++ b/DRAMSys/library/src/simulation/Arbiter.cpp @@ -350,7 +350,18 @@ void ArbiterFifo::peqCallback(tlm_generic_payload &cbPayload, const tlm_phase &c tSocket[static_cast(threadId)]->nb_transport_bw(tPayload, tPhase, tDelay); unsigned int tChannelId = DramExtension::getExtension(tPayload).getChannel().ID(); - pendingRequests[tChannelId].push(&tPayload); + + if (!channelIsBusy[tChannelId]) + { + channelIsBusy[tChannelId] = true; + + tPhase = BEGIN_REQ; + tDelay = lastEndReq[tChannelId] == sc_time_stamp() ? tCK : SC_ZERO_TIME; + + iSocket[static_cast(tChannelId)]->nb_transport_fw(tPayload, tPhase, tDelay); + } + else + pendingRequests[tChannelId].push(&tPayload); } if (!pendingResponses[threadId].empty()) @@ -468,7 +479,18 @@ void ArbiterReorder::peqCallback(tlm_generic_payload &cbPayload, const tlm_phase tSocket[static_cast(threadId)]->nb_transport_bw(tPayload, tPhase, tDelay); unsigned int tChannelId = DramExtension::getExtension(tPayload).getChannel().ID(); - pendingRequests[tChannelId].push(&tPayload); + + if (!channelIsBusy[tChannelId]) + { + channelIsBusy[tChannelId] = true; + + tPhase = BEGIN_REQ; + tDelay = lastEndReq[tChannelId] == sc_time_stamp() ? tCK : SC_ZERO_TIME; + + iSocket[static_cast(tChannelId)]->nb_transport_fw(tPayload, tPhase, tDelay); + } + else + pendingRequests[tChannelId].push(&tPayload); } tlm_generic_payload &tPayload = **pendingResponses[threadId].begin();