systemc: remove pipe through flag in TLM extension
authorEarl Ou <shunhsingou@google.com>
Wed, 11 Nov 2020 06:22:02 +0000 (14:22 +0800)
committerEarl Ou <shunhsingou@google.com>
Mon, 25 Jan 2021 07:41:19 +0000 (07:41 +0000)
Pipe through flag should be equal to whether we have the extension
in TLM payload or not. However, in the current implementation the
two are different and cause issues when we have gem5 - SystemC
connection.

Change-Id: I2c318777d91dca446c1a700d9f7cff356d29ae6d
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/37375
Reviewed-by: Earl Ou <shunhsingou@google.com>
Maintainer: Earl Ou <shunhsingou@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/systemc/tlm_bridge/gem5_to_tlm.cc
src/systemc/tlm_bridge/sc_ext.cc
src/systemc/tlm_bridge/sc_ext.hh
src/systemc/tlm_bridge/tlm_to_gem5.cc
util/tlm/src/sc_ext.cc
util/tlm/src/sc_ext.hh
util/tlm/src/sc_master_port.cc
util/tlm/src/sc_slave_port.cc

index f03548ced9f0553cb10b92c17f06048917dd0d97..9d108761b2f008baaf6069b2cf27ebcb7c41dec2 100644 (file)
@@ -167,18 +167,14 @@ Gem5ToTlmBridge<BITWIDTH>::pec(
 
         bool need_retry = false;
 
-        /*
-         * If the packet was piped through and needs a response, we don't need
-         * to touch the packet and can forward it directly as a response.
-         * Otherwise, we need to make a response and send the transformed
-         * packet.
-         */
-        if (extension.isPipeThrough()) {
-            if (packet->isResponse()) {
-                need_retry = !bridgeResponsePort.sendTimingResp(packet);
-            }
-        } else if (packet->needsResponse()) {
+        // If there is another gem5 model under the receiver side, and already
+        // make a response packet back, we can simply send it back. Otherwise,
+        // we make a response packet before sending it back to the initiator
+        // side gem5 module.
+        if (packet->needsResponse()) {
             packet->makeResponse();
+        }
+        if (packet->isResponse()) {
             need_retry = !bridgeResponsePort.sendTimingResp(packet);
         }
 
index ea188c472853b52a71ba10b26c6ed99041d57602..194ecbc055f56850cf3e463b5eb5c9a34692214b 100644 (file)
@@ -41,7 +41,6 @@ namespace Gem5SystemC
 Gem5Extension::Gem5Extension(PacketPtr _packet)
 {
     packet = _packet;
-    pipeThrough = false;
 }
 
 Gem5Extension &
index 0d9fc910132b08c88bc4c29d5bcfe65fb500254c..56a19a77283c558c246d7ce6a27368a4aac13e60 100644 (file)
@@ -54,12 +54,8 @@ class Gem5Extension: public tlm::tlm_extension<Gem5Extension>
             const tlm::tlm_generic_payload &payload);
     PacketPtr getPacket();
 
-    bool isPipeThrough() const { return pipeThrough; }
-    void setPipeThrough() { pipeThrough = true; }
-
   private:
     PacketPtr packet;
-    bool pipeThrough;
 };
 
 } // namespace Gem5SystemC
index a1a8382cd48818fbb3a4b9058e9681e77c183966..143eeacae11396f69c4fc491e45302c65d072fc1 100644 (file)
@@ -181,7 +181,6 @@ TlmToGem5Bridge<BITWIDTH>::handleBeginReq(tlm::tlm_generic_payload &trans)
     // world and we can pipe through the original packet. Otherwise, we
     // generate a new packet based on the transaction.
     if (extension != nullptr) {
-        extension->setPipeThrough();
         pkt = extension->getPacket();
     } else {
         pkt = payload2packet(_id, trans);
@@ -306,7 +305,6 @@ TlmToGem5Bridge<BITWIDTH>::b_transport(tlm::tlm_generic_payload &trans,
     // If there is an extension, this transaction was initiated by the gem5
     // world and we can pipe through the original packet.
     if (extension != nullptr) {
-        extension->setPipeThrough();
         pkt = extension->getPacket();
     } else {
         pkt = payload2packet(_id, trans);
@@ -343,7 +341,6 @@ TlmToGem5Bridge<BITWIDTH>::transport_dbg(tlm::tlm_generic_payload &trans)
     // If there is an extension, this transaction was initiated by the gem5
     // world and we can pipe through the original packet.
     if (extension != nullptr) {
-        extension->setPipeThrough();
         bmp.sendFunctional(extension->getPacket());
     } else {
         auto pkt = payload2packet(_id, trans);
@@ -369,7 +366,6 @@ TlmToGem5Bridge<BITWIDTH>::get_direct_mem_ptr(tlm::tlm_generic_payload &trans,
     // If there is an extension, this transaction was initiated by the gem5
     // world and we can pipe through the original packet.
     if (extension != nullptr) {
-        extension->setPipeThrough();
         pkt = extension->getPacket();
     } else {
         pkt = payload2packet(_id, trans);
@@ -447,8 +443,6 @@ TlmToGem5Bridge<BITWIDTH>::recvTimingResp(PacketPtr pkt)
     // delete it. The packet travels back with the transaction.
     if (extension == nullptr)
         destroyPacket(pkt);
-    else
-        sc_assert(extension->isPipeThrough());
 
     sendBeginResp(trans, delay);
     trans.release();
index 5e45ed9f652dce4ea1628e742db8dea86a3a234e..fb9613fa024bf6c09bb319383d7c154e962ef934 100644 (file)
@@ -41,7 +41,6 @@ namespace Gem5SystemC
 Gem5Extension::Gem5Extension(PacketPtr packet)
 {
     Packet = packet;
-    pipeThrough = false;
 }
 
 Gem5Extension& Gem5Extension::getExtension(const tlm_generic_payload *payload)
index 18221de26ae9d976a687b94fc104dfd5f9c2779f..b3702089913c68c0e845896283869ae43d344f2b 100644 (file)
@@ -58,12 +58,8 @@ class Gem5Extension: public tlm::tlm_extension<Gem5Extension>
         getExtension(const tlm::tlm_generic_payload &payload);
     PacketPtr getPacket();
 
-    bool isPipeThrough() const { return pipeThrough; }
-    void setPipeThrough() { pipeThrough = true; }
-
   private:
     PacketPtr Packet;
-    bool pipeThrough;
 };
 
 }
index 0008e9bedd273d370c265a8b29239cf164f5ce41..7b04921debd9e72b72fdad475efddef8a9a91c6c 100644 (file)
@@ -206,7 +206,6 @@ SCMasterPort::handleBeginReq(tlm::tlm_generic_payload& trans)
     // world and we can pipe through the original packet. Otherwise, we
     // generate a new packet based on the transaction.
     if (extension != nullptr) {
-        extension->setPipeThrough();
         pkt = extension->getPacket();
     } else {
         pkt = generatePacket(trans);
@@ -263,7 +262,6 @@ SCMasterPort::b_transport(tlm::tlm_generic_payload& trans,
     // If there is an extension, this transaction was initiated by the gem5
     // world and we can pipe through the original packet.
     if (extension != nullptr) {
-        extension->setPipeThrough();
         pkt = extension->getPacket();
     } else {
         pkt = generatePacket(trans);
@@ -297,7 +295,6 @@ SCMasterPort::transport_dbg(tlm::tlm_generic_payload& trans)
     // If there is an extension, this transaction was initiated by the gem5
     // world and we can pipe through the original packet.
     if (extension != nullptr) {
-        extension->setPipeThrough();
         sendFunctional(extension->getPacket());
     } else {
         auto pkt = generatePacket(trans);
@@ -353,8 +350,6 @@ SCMasterPort::recvTimingResp(PacketPtr pkt)
     // delete it. The packet travels back with the transaction.
     if (extension == nullptr)
         destroyPacket(pkt);
-    else
-        sc_assert(extension->isPipeThrough());
 
     sendBeginResp(trans, delay);
     trans.release();
index a3b878349398033f9c68932b6e27d97bc437aa1b..58b01345b39db2b4a337ea4a26dafef0051b338c 100644 (file)
@@ -293,19 +293,15 @@ SCSlavePort::pec(
 
         bool need_retry = false;
 
-        /*
-         * If the packet was piped through and needs a response, we don't need
-         * to touch the packet and can forward it directly as a response.
-         * Otherwise, we need to make a response and send the transformed
-         * packet.
-         */
-        if (extension.isPipeThrough()) {
-            if (packet->isResponse()) {
-                need_retry = !sendTimingResp(packet);
-            }
-        } else if (packet->needsResponse()) {
+        // If there is another gem5 model under the receiver side, and already
+        // make a response packet back, we can simply send it back. Otherwise,
+        // we make a response packet before sending it back to the initiator
+        // side gem5 module.
+        if (packet->needsResponse()) {
             packet->makeResponse();
-            need_retry = !sendTimingResp(packet);
+        }
+        if (packet->isResponse()) {
+            need_retry = !bridgeResponsePort.sendTimingResp(packet);
         }
 
         if (need_retry) {