From 78e4967b6a98e0819e83f000d3a4de8766802bae Mon Sep 17 00:00:00 2001 From: Christian Menard Date: Thu, 9 Feb 2017 19:15:48 -0500 Subject: misc: Clean up and complete the gem5<->SystemC-TLM bridge [9/10] The current TLM bridge only provides a Slave Port that allows the gem5 world to send request to the SystemC world. This patch series refractors and cleans up the existing code, and adds a Master Port that allows the SystemC world to send requests to the gem5 world. This patch: * Pay for the header delay that the gem5 XBar annotates to packets. Reviewed at http://reviews.gem5.org/r/3798/ Signed-off-by: Jason Lowe-Power --- util/tlm/sc_master_port.cc | 12 +++++++++--- util/tlm/sc_slave_port.cc | 27 ++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 4 deletions(-) (limited to 'util/tlm') diff --git a/util/tlm/sc_master_port.cc b/util/tlm/sc_master_port.cc index 5f3950260..630243359 100644 --- a/util/tlm/sc_master_port.cc +++ b/util/tlm/sc_master_port.cc @@ -329,9 +329,15 @@ SCMasterPort::recvTimingResp(PacketPtr pkt) sc_assert(pkt->isResponse()); - // pay for annotaded transport delays - auto delay = - sc_core::sc_time::from_value(pkt->payloadDelay + pkt->headerDelay); + /* + * Pay for annotated transport delays. + * + * See recvTimingReq in sc_slave_port.cc for a detailed description. + */ + auto delay = sc_core::sc_time::from_value(pkt->payloadDelay); + // reset the delays + pkt->payloadDelay = 0; + pkt->headerDelay = 0; auto tlmSenderState = dynamic_cast(pkt->popSenderState()); sc_assert(tlmSenderState != nullptr); diff --git a/util/tlm/sc_slave_port.cc b/util/tlm/sc_slave_port.cc index 8c6b051e9..dcf7c5d95 100644 --- a/util/tlm/sc_slave_port.cc +++ b/util/tlm/sc_slave_port.cc @@ -214,9 +214,34 @@ SCSlavePort::recvTimingReq(PacketPtr packet) Gem5Extension* extension = new Gem5Extension(packet); trans->set_auto_extension(extension); + /* + * Pay for annotated transport delays. + * + * The header delay marks the point in time, when the packet first is seen + * by the transactor. This is the point int time, when the transactor needs + * to send the BEGIN_REQ to the SystemC world. + * + * NOTE: We drop the payload delay here. Normally, the receiver would be + * responsible for handling the payload delay. In this case, however, + * the receiver is a SystemC module and has no notion of the gem5 + * transport protocol and we cannot simply forward the + * payload delay to the receiving module. Instead, we expect the + * receiving SystemC module to model the payload delay by deferring + * the END_REQ. This could lead to incorrect delays, if the XBar + * payload delay is longer than the time the receiver needs to accept + * the request (time between BEGIN_REQ and END_REQ). + * + * TODO: We could detect the case described above by remembering the + * payload delay and comparing it to the time between BEGIN_REQ and + * END_REQ. Then, a warning should be printed. + */ + auto delay = sc_core::sc_time::from_value(packet->payloadDelay); + // reset the delays + packet->payloadDelay = 0; + packet->headerDelay = 0; + /* Starting TLM non-blocking sequence (AT) Refer to IEEE1666-2011 SystemC * Standard Page 507 for a visualisation of the procedure */ - sc_core::sc_time delay = sc_core::SC_ZERO_TIME; tlm::tlm_phase phase = tlm::BEGIN_REQ; tlm::tlm_sync_enum status; status = transactor->socket->nb_transport_fw(*trans, phase, delay); -- cgit v1.2.3