Set payload extensions in arbiter at END_REQ.

This commit is contained in:
Lukas Steiner
2021-02-02 16:40:44 +01:00
parent 0e01cc5ccd
commit 2143f7cbff

View File

@@ -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<int>(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<int>(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();