From 0e01cc5ccd1bddb0f8014e8319b87f45ec3fb048 Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Tue, 2 Feb 2021 15:34:21 +0100 Subject: [PATCH] Fix starvation of new arbiters. --- DRAMSys/library/src/simulation/Arbiter.cpp | 26 ++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) 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();