X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fsystemc%2Ftlm_bridge%2Ftlm_to_gem5.cc;h=3891f58afa9a0882010b37d13dacd9d1ae155c9e;hb=392c1ce;hp=e6cb48332046b6608d936cb60bd42a644220f2ab;hpb=0592272cffd6e8ea99b07f6c89c290264d20b3fb;p=gem5.git diff --git a/src/systemc/tlm_bridge/tlm_to_gem5.cc b/src/systemc/tlm_bridge/tlm_to_gem5.cc index e6cb48332..3891f58af 100644 --- a/src/systemc/tlm_bridge/tlm_to_gem5.cc +++ b/src/systemc/tlm_bridge/tlm_to_gem5.cc @@ -67,7 +67,7 @@ namespace sc_gem5 { PacketPtr -payload2packet(MasterID masterId, tlm::tlm_generic_payload &trans) +payload2packet(RequestorID _id, tlm::tlm_generic_payload &trans) { MemCmd cmd; @@ -87,7 +87,7 @@ payload2packet(MasterID masterId, tlm::tlm_generic_payload &trans) Request::Flags flags; auto req = std::make_shared( - trans.get_address(), trans.get_data_length(), flags, masterId); + trans.get_address(), trans.get_data_length(), flags, _id); /* * Allocate a new Packet. The packet will be deleted when it returns from @@ -156,14 +156,21 @@ TlmToGem5Bridge::handleBeginReq(tlm::tlm_generic_payload &trans) extension->setPipeThrough(); pkt = extension->getPacket(); } else { - pkt = payload2packet(masterId, trans); + pkt = payload2packet(_id, trans); } auto tlmSenderState = new TlmSenderState(trans); pkt->pushSenderState(tlmSenderState); + // If the packet doesn't need a response, we should send BEGIN_RESP by + // ourselves. + bool needsResponse = pkt->needsResponse(); if (bmp.sendTimingReq(pkt)) { // port is free -> send END_REQ immediately sendEndReq(trans); + if (!needsResponse) { + auto delay = sc_core::SC_ZERO_TIME; + sendBeginResp(trans, delay); + } trans.release(); } else { // port is blocked -> wait for retry before sending END_REQ waitForRetry = true; @@ -274,7 +281,7 @@ TlmToGem5Bridge::b_transport(tlm::tlm_generic_payload &trans, extension->setPipeThrough(); pkt = extension->getPacket(); } else { - pkt = payload2packet(masterId, trans); + pkt = payload2packet(_id, trans); } MemBackdoorPtr backdoor = nullptr; @@ -311,7 +318,7 @@ TlmToGem5Bridge::transport_dbg(tlm::tlm_generic_payload &trans) extension->setPipeThrough(); bmp.sendFunctional(extension->getPacket()); } else { - auto pkt = payload2packet(masterId, trans); + auto pkt = payload2packet(_id, trans); if (pkt) { bmp.sendFunctional(pkt); destroyPacket(pkt); @@ -337,7 +344,7 @@ TlmToGem5Bridge::get_direct_mem_ptr(tlm::tlm_generic_payload &trans, extension->setPipeThrough(); pkt = extension->getPacket(); } else { - pkt = payload2packet(masterId, trans); + pkt = payload2packet(_id, trans); pkt->req->setFlags(Request::NO_ACCESS); } @@ -429,12 +436,19 @@ TlmToGem5Bridge::recvReqRetry() sc_assert(pendingRequest != nullptr); sc_assert(pendingPacket != nullptr); + // If the packet doesn't need a response, we should send BEGIN_RESP by + // ourselves. + 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; + sendBeginResp(trans, delay); + } trans.release(); pendingRequest = nullptr; @@ -470,7 +484,7 @@ TlmToGem5Bridge::TlmToGem5Bridge( bmp(std::string(name()) + "master", *this), socket("tlm_socket"), wrapper(socket, std::string(name()) + ".tlm", InvalidPortID), system(params->system), - masterId(params->system->getGlobalMasterId( + _id(params->system->getGlobalRequestorId( std::string("[systemc].") + name())) { }