systemc: fix extension not found TlmToGem5 bridge response path
The gem5 packet has two ways to associate to the TLM payload. If the request is initiated from gem5, they would be associated by TLM extension. If the request is initiated from systemc, they would be associated by SenderState. So current implementation apparently only took care the request initiated from gem5 only. We need to update the logic to take care both. This change moves the response sync out of beginSendResp and sync it before calling the function. Change-Id: If415fbe33249b75e549086d9ca36eda3c20f7ec2 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/66053 Reviewed-by: Earl Ou <shunhsingou@google.com> Maintainer: Bobby Bruce <bbruce@ucdavis.edu> Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
@@ -207,14 +207,6 @@ void
|
||||
TlmToGem5Bridge<BITWIDTH>::sendBeginResp(tlm::tlm_generic_payload &trans,
|
||||
sc_core::sc_time &delay)
|
||||
{
|
||||
Gem5SystemC::Gem5Extension *extension = nullptr;
|
||||
trans.get_extension(extension);
|
||||
panic_if(extension == nullptr,
|
||||
"Missing gem5 extension when sending BEGIN_RESP");
|
||||
auto pkt = extension->getPacket();
|
||||
|
||||
setPayloadResponse(trans, pkt);
|
||||
|
||||
tlm::tlm_phase phase = tlm::BEGIN_RESP;
|
||||
|
||||
auto status = socket->nb_transport_bw(trans, phase, delay);
|
||||
@@ -252,6 +244,7 @@ TlmToGem5Bridge<BITWIDTH>::handleBeginReq(tlm::tlm_generic_payload &trans)
|
||||
sendEndReq(trans);
|
||||
if (!needsResponse) {
|
||||
auto delay = sc_core::SC_ZERO_TIME;
|
||||
setPayloadResponse(trans, pkt);
|
||||
sendBeginResp(trans, delay);
|
||||
}
|
||||
trans.release();
|
||||
@@ -481,6 +474,8 @@ TlmToGem5Bridge<BITWIDTH>::recvTimingResp(PacketPtr pkt)
|
||||
sc_assert(tlmSenderState != nullptr);
|
||||
|
||||
auto &trans = tlmSenderState->trans;
|
||||
setPayloadResponse(trans, pkt);
|
||||
sendBeginResp(trans, delay);
|
||||
|
||||
Gem5SystemC::Gem5Extension *extension = nullptr;
|
||||
trans.get_extension(extension);
|
||||
@@ -493,7 +488,6 @@ TlmToGem5Bridge<BITWIDTH>::recvTimingResp(PacketPtr pkt)
|
||||
if (extension == nullptr)
|
||||
destroyPacket(pkt);
|
||||
|
||||
sendBeginResp(trans, delay);
|
||||
trans.release();
|
||||
|
||||
return true;
|
||||
@@ -512,12 +506,12 @@ TlmToGem5Bridge<BITWIDTH>::recvReqRetry()
|
||||
bool needsResponse = pendingPacket->needsResponse();
|
||||
if (bmp.sendTimingReq(pendingPacket)) {
|
||||
waitForRetry = false;
|
||||
pendingPacket = nullptr;
|
||||
|
||||
auto &trans = *pendingRequest;
|
||||
sendEndReq(trans);
|
||||
if (!needsResponse) {
|
||||
auto delay = sc_core::SC_ZERO_TIME;
|
||||
setPayloadResponse(trans, pendingPacket);
|
||||
sendBeginResp(trans, delay);
|
||||
}
|
||||
trans.release();
|
||||
|
||||
Reference in New Issue
Block a user