tlm_to_gem5.hh revision 13846
1/* 2 * Copyright 2019 Google, Inc. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: redistributions of source code must retain the above copyright 7 * notice, this list of conditions and the following disclaimer; 8 * redistributions in binary form must reproduce the above copyright 9 * notice, this list of conditions and the following disclaimer in the 10 * documentation and/or other materials provided with the distribution; 11 * neither the name of the copyright holders nor the names of its 12 * contributors may be used to endorse or promote products derived from 13 * this software without specific prior written permission. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 19 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 * 27 * Copyright (c) 2016, Dresden University of Technology (TU Dresden) 28 * All rights reserved. 29 * 30 * Redistribution and use in source and binary forms, with or without 31 * modification, are permitted provided that the following conditions are 32 * met: 33 * 34 * 1. Redistributions of source code must retain the above copyright notice, 35 * this list of conditions and the following disclaimer. 36 * 37 * 2. Redistributions in binary form must reproduce the above copyright 38 * notice, this list of conditions and the following disclaimer in the 39 * documentation and/or other materials provided with the distribution. 40 * 41 * 3. Neither the name of the copyright holder nor the names of its 42 * contributors may be used to endorse or promote products derived from 43 * this software without specific prior written permission. 44 * 45 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 46 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 47 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 48 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 49 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 50 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 51 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 52 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 53 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 54 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 55 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 56 * 57 * Authors: Gabe Black 58 * Christian Menard 59 */ 60 61#ifndef __SYSTEMC_TLM_BRIDGE_TLM_TO_GEM5_HH__ 62#define __SYSTEMC_TLM_BRIDGE_TLM_TO_GEM5_HH__ 63 64#include "mem/port.hh" 65#include "params/TlmToGem5BridgeBase.hh" 66#include "systemc/ext/core/sc_module.hh" 67#include "systemc/ext/core/sc_module_name.hh" 68#include "systemc/ext/tlm_core/2/generic_payload/gp.hh" 69#include "systemc/ext/tlm_utils/peq_with_cb_and_phase.h" 70#include "systemc/ext/tlm_utils/simple_target_socket.h" 71#include "systemc/tlm_bridge/sc_ext.hh" 72#include "systemc/tlm_port_wrapper.hh" 73 74namespace sc_gem5 75{ 76 77class TlmToGem5BridgeBase : public sc_core::sc_module 78{ 79 protected: 80 using sc_core::sc_module::sc_module; 81}; 82 83template <unsigned int BITWIDTH> 84class TlmToGem5Bridge : public TlmToGem5BridgeBase 85{ 86 private: 87 struct TlmSenderState : public Packet::SenderState 88 { 89 tlm::tlm_generic_payload &trans; 90 TlmSenderState(tlm::tlm_generic_payload &trans) : trans(trans) {} 91 }; 92 93 class BridgeMasterPort : public MasterPort 94 { 95 protected: 96 TlmToGem5Bridge<BITWIDTH> &bridge; 97 98 bool 99 recvTimingResp(PacketPtr pkt) override 100 { 101 return bridge.recvTimingResp(pkt); 102 } 103 void recvReqRetry() override { bridge.recvReqRetry(); } 104 void recvRangeChange() override { bridge.recvRangeChange(); } 105 106 public: 107 BridgeMasterPort(const std::string &name_, 108 TlmToGem5Bridge<BITWIDTH> &bridge_) : 109 MasterPort(name_, nullptr), bridge(bridge_) 110 {} 111 }; 112 113 tlm_utils::peq_with_cb_and_phase<TlmToGem5Bridge<BITWIDTH>> peq; 114 115 bool waitForRetry; 116 tlm::tlm_generic_payload *pendingRequest; 117 PacketPtr pendingPacket; 118 119 bool needToSendRetry; 120 121 bool responseInProgress; 122 123 BridgeMasterPort bmp; 124 tlm_utils::simple_target_socket< 125 TlmToGem5Bridge<BITWIDTH>, BITWIDTH> socket; 126 sc_gem5::TlmTargetWrapper<BITWIDTH> wrapper; 127 128 System *system; 129 130 void sendEndReq(tlm::tlm_generic_payload &trans); 131 void sendBeginResp(tlm::tlm_generic_payload &trans, 132 sc_core::sc_time &delay); 133 134 void handleBeginReq(tlm::tlm_generic_payload &trans); 135 void handleEndResp(tlm::tlm_generic_payload &trans); 136 137 PacketPtr generatePacket(tlm::tlm_generic_payload &trans); 138 void destroyPacket(PacketPtr pkt); 139 140 void checkTransaction(tlm::tlm_generic_payload &trans); 141 142 void invalidateDmi(const ::MemBackdoor &backdoor); 143 144 protected: 145 // payload event call back 146 void peq_cb(tlm::tlm_generic_payload &trans, const tlm::tlm_phase &phase); 147 148 // The TLM target interface 149 tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload &trans, 150 tlm::tlm_phase &phase, 151 sc_core::sc_time &t); 152 void b_transport(tlm::tlm_generic_payload &trans, sc_core::sc_time &t); 153 unsigned int transport_dbg(tlm::tlm_generic_payload &trans); 154 bool get_direct_mem_ptr(tlm::tlm_generic_payload &trans, 155 tlm::tlm_dmi &dmi_data); 156 157 // Gem5 port interface. 158 bool recvTimingResp(PacketPtr pkt); 159 void recvReqRetry(); 160 void recvRangeChange(); 161 162 public: 163 ::Port &gem5_getPort(const std::string &if_name, int idx=-1) override; 164 165 typedef TlmToGem5BridgeBaseParams Params; 166 TlmToGem5Bridge(Params *p, const sc_core::sc_module_name &mn); 167 168 tlm_utils::simple_target_socket<TlmToGem5Bridge<BITWIDTH>, BITWIDTH> & 169 getSocket() 170 { 171 return socket; 172 } 173 174 void before_end_of_elaboration() override; 175 176 const MasterID masterId; 177}; 178 179} // namespace sc_gem5 180 181#endif // __SYSTEMC_TLM_BRIDGE_TLM_TO_GEM5_HH__ 182