From 2143f7cbff109fd4f28b69cd8828a5a9916df9ce Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Tue, 2 Feb 2021 16:40:44 +0100 Subject: [PATCH] Set payload extensions in arbiter at END_REQ. --- DRAMSys/library/src/simulation/Arbiter.cpp | 56 +++++++++++++--------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/DRAMSys/library/src/simulation/Arbiter.cpp b/DRAMSys/library/src/simulation/Arbiter.cpp index 51dffde1..500f098b 100644 --- a/DRAMSys/library/src/simulation/Arbiter.cpp +++ b/DRAMSys/library/src/simulation/Arbiter.cpp @@ -264,13 +264,14 @@ void ArbiterFifo::peqCallback(tlm_generic_payload &cbPayload, const tlm_phase &c if (cbPhase == BEGIN_REQ) // from initiator { - GenerationExtension::setExtension(cbPayload, sc_time_stamp()); - DramExtension::setPayloadIDs(cbPayload, - nextThreadPayloadIDToAppend[threadId]++, nextChannelPayloadIDToAppend[channelId]++); - activeTransactions[threadId]++; - - if (activeTransactions[threadId] <= maxActiveTransactions) + if (activeTransactions[threadId] < maxActiveTransactions) { + activeTransactions[threadId]++; + + GenerationExtension::setExtension(cbPayload, sc_time_stamp()); + DramExtension::setPayloadIDs(cbPayload, + nextThreadPayloadIDToAppend[threadId]++, nextChannelPayloadIDToAppend[channelId]++); + tlm_phase tPhase = END_REQ; sc_time tDelay = SC_ZERO_TIME; @@ -339,18 +340,21 @@ void ArbiterFifo::peqCallback(tlm_generic_payload &cbPayload, const tlm_phase &c { lastEndResp[threadId] = sc_time_stamp(); cbPayload.release(); - activeTransactions[threadId]--; - if (activeTransactions[threadId] == maxActiveTransactions) + if (outstandingEndReq[threadId] != nullptr) { + tlm_generic_payload &tPayload = *outstandingEndReq[threadId]; + outstandingEndReq[threadId] = nullptr; tlm_phase tPhase = END_REQ; sc_time tDelay = SC_ZERO_TIME; - tlm_generic_payload &tPayload = *outstandingEndReq[threadId]; + unsigned int tChannelId = DramExtension::getExtension(tPayload).getChannel().ID(); + + GenerationExtension::setExtension(tPayload, sc_time_stamp()); + DramExtension::setPayloadIDs(tPayload, + nextThreadPayloadIDToAppend[threadId]++, nextChannelPayloadIDToAppend[tChannelId]++); tSocket[static_cast(threadId)]->nb_transport_bw(tPayload, tPhase, tDelay); - unsigned int tChannelId = DramExtension::getExtension(tPayload).getChannel().ID(); - if (!channelIsBusy[tChannelId]) { channelIsBusy[tChannelId] = true; @@ -363,6 +367,8 @@ void ArbiterFifo::peqCallback(tlm_generic_payload &cbPayload, const tlm_phase &c else pendingRequests[tChannelId].push(&tPayload); } + else + activeTransactions[threadId]--; if (!pendingResponses[threadId].empty()) { @@ -389,13 +395,14 @@ void ArbiterReorder::peqCallback(tlm_generic_payload &cbPayload, const tlm_phase if (cbPhase == BEGIN_REQ) // from initiator { - GenerationExtension::setExtension(cbPayload, sc_time_stamp()); - DramExtension::setPayloadIDs(cbPayload, - nextThreadPayloadIDToAppend[threadId]++, nextChannelPayloadIDToAppend[channelId]++); - activeTransactions[threadId]++; - - if (activeTransactions[threadId] <= maxActiveTransactions) + if (activeTransactions[threadId] < maxActiveTransactions) { + activeTransactions[threadId]++; + + GenerationExtension::setExtension(cbPayload, sc_time_stamp()); + DramExtension::setPayloadIDs(cbPayload, + nextThreadPayloadIDToAppend[threadId]++, nextChannelPayloadIDToAppend[channelId]++); + tlm_phase tPhase = END_REQ; sc_time tDelay = SC_ZERO_TIME; @@ -468,18 +475,21 @@ void ArbiterReorder::peqCallback(tlm_generic_payload &cbPayload, const tlm_phase { lastEndResp[threadId] = sc_time_stamp(); cbPayload.release(); - activeTransactions[threadId]--; - if (activeTransactions[threadId] == maxActiveTransactions) + if (outstandingEndReq[threadId] != nullptr) { + tlm_generic_payload &tPayload = *outstandingEndReq[threadId]; + outstandingEndReq[threadId] = nullptr; tlm_phase tPhase = END_REQ; sc_time tDelay = SC_ZERO_TIME; - tlm_generic_payload &tPayload = *outstandingEndReq[threadId]; + unsigned int tChannelId = DramExtension::getExtension(tPayload).getChannel().ID(); + + GenerationExtension::setExtension(tPayload, sc_time_stamp()); + DramExtension::setPayloadIDs(tPayload, + nextThreadPayloadIDToAppend[threadId]++, nextChannelPayloadIDToAppend[tChannelId]++); tSocket[static_cast(threadId)]->nb_transport_bw(tPayload, tPhase, tDelay); - unsigned int tChannelId = DramExtension::getExtension(tPayload).getChannel().ID(); - if (!channelIsBusy[tChannelId]) { channelIsBusy[tChannelId] = true; @@ -492,6 +502,8 @@ void ArbiterReorder::peqCallback(tlm_generic_payload &cbPayload, const tlm_phase else pendingRequests[tChannelId].push(&tPayload); } + else + activeTransactions[threadId]--; tlm_generic_payload &tPayload = **pendingResponses[threadId].begin();