gem5_to_tlm.hh revision 13821:f9252f27ded7
12650Ssaidi@eecs.umich.edu/* 22650Ssaidi@eecs.umich.edu * Copyright 2019 Google, Inc. 32650Ssaidi@eecs.umich.edu * 42650Ssaidi@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 52650Ssaidi@eecs.umich.edu * modification, are permitted provided that the following conditions are 62650Ssaidi@eecs.umich.edu * met: redistributions of source code must retain the above copyright 72650Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 82650Ssaidi@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 92650Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 102650Ssaidi@eecs.umich.edu * documentation and/or other materials provided with the distribution; 112650Ssaidi@eecs.umich.edu * neither the name of the copyright holders nor the names of its 122650Ssaidi@eecs.umich.edu * contributors may be used to endorse or promote products derived from 132650Ssaidi@eecs.umich.edu * this software without specific prior written permission. 142650Ssaidi@eecs.umich.edu * 152650Ssaidi@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 162650Ssaidi@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 172650Ssaidi@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 182650Ssaidi@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 192650Ssaidi@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 202650Ssaidi@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 212650Ssaidi@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 222650Ssaidi@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 232650Ssaidi@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 242650Ssaidi@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 252650Ssaidi@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 262650Ssaidi@eecs.umich.edu * 272650Ssaidi@eecs.umich.edu * Copyright (c) 2015, University of Kaiserslautern 282650Ssaidi@eecs.umich.edu * Copyright (c) 2016, Dresden University of Technology (TU Dresden) 292650Ssaidi@eecs.umich.edu * All rights reserved. 302650Ssaidi@eecs.umich.edu * 312650Ssaidi@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 322650Ssaidi@eecs.umich.edu * modification, are permitted provided that the following conditions are 332650Ssaidi@eecs.umich.edu * met: 342650Ssaidi@eecs.umich.edu * 352650Ssaidi@eecs.umich.edu * 1. Redistributions of source code must retain the above copyright notice, 362650Ssaidi@eecs.umich.edu * this list of conditions and the following disclaimer. 372650Ssaidi@eecs.umich.edu * 382650Ssaidi@eecs.umich.edu * 2. Redistributions in binary form must reproduce the above copyright 392650Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 402650Ssaidi@eecs.umich.edu * documentation and/or other materials provided with the distribution. 412650Ssaidi@eecs.umich.edu * 422650Ssaidi@eecs.umich.edu * 3. Neither the name of the copyright holder nor the names of its 432650Ssaidi@eecs.umich.edu * contributors may be used to endorse or promote products derived from 442650Ssaidi@eecs.umich.edu * this software without specific prior written permission. 452650Ssaidi@eecs.umich.edu * 462650Ssaidi@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 472650Ssaidi@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 482650Ssaidi@eecs.umich.edu * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 492650Ssaidi@eecs.umich.edu * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 502650Ssaidi@eecs.umich.edu * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 512650Ssaidi@eecs.umich.edu * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 522650Ssaidi@eecs.umich.edu * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 532650Ssaidi@eecs.umich.edu * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 542650Ssaidi@eecs.umich.edu * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 552650Ssaidi@eecs.umich.edu * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 562650Ssaidi@eecs.umich.edu * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 572650Ssaidi@eecs.umich.edu * 582650Ssaidi@eecs.umich.edu * Authors: Gabe Black 592651Ssaidi@eecs.umich.edu * Matthias Jung 602651Ssaidi@eecs.umich.edu * Christian Menard 612650Ssaidi@eecs.umich.edu */ 622650Ssaidi@eecs.umich.edu 632650Ssaidi@eecs.umich.edu#ifndef __SYSTEMC_TLM_BRIDGE_GEM5_TO_TLM_HH__ 642650Ssaidi@eecs.umich.edu#define __SYSTEMC_TLM_BRIDGE_GEM5_TO_TLM_HH__ 652650Ssaidi@eecs.umich.edu 662650Ssaidi@eecs.umich.edu#include <string> 672650Ssaidi@eecs.umich.edu 682650Ssaidi@eecs.umich.edu#include "mem/port.hh" 692650Ssaidi@eecs.umich.edu#include "params/Gem5ToTlmBridge.hh" 702650Ssaidi@eecs.umich.edu#include "sim/system.hh" 712650Ssaidi@eecs.umich.edu#include "systemc/ext/core/sc_module.hh" 722650Ssaidi@eecs.umich.edu#include "systemc/ext/core/sc_module_name.hh" 732650Ssaidi@eecs.umich.edu#include "systemc/ext/tlm_core/2/generic_payload/gp.hh" 742650Ssaidi@eecs.umich.edu#include "systemc/ext/tlm_utils/simple_initiator_socket.h" 752650Ssaidi@eecs.umich.edu#include "systemc/tlm_bridge/sc_peq.hh" 762650Ssaidi@eecs.umich.edu#include "systemc/tlm_port_wrapper.hh" 772650Ssaidi@eecs.umich.edu 782650Ssaidi@eecs.umich.edunamespace sc_gem5 792650Ssaidi@eecs.umich.edu{ 802650Ssaidi@eecs.umich.edu 812650Ssaidi@eecs.umich.educlass Gem5ToTlmBridge : public sc_core::sc_module 822650Ssaidi@eecs.umich.edu{ 832651Ssaidi@eecs.umich.edu private: 842651Ssaidi@eecs.umich.edu class BridgeSlavePort : public SlavePort 852650Ssaidi@eecs.umich.edu { 862650Ssaidi@eecs.umich.edu protected: 872650Ssaidi@eecs.umich.edu Gem5ToTlmBridge &bridge; 882650Ssaidi@eecs.umich.edu 892650Ssaidi@eecs.umich.edu AddrRangeList 902650Ssaidi@eecs.umich.edu getAddrRanges() const override 912650Ssaidi@eecs.umich.edu { 922650Ssaidi@eecs.umich.edu return bridge.getAddrRanges(); 932650Ssaidi@eecs.umich.edu } 942650Ssaidi@eecs.umich.edu Tick 952650Ssaidi@eecs.umich.edu recvAtomic(PacketPtr pkt) override 962650Ssaidi@eecs.umich.edu { 972650Ssaidi@eecs.umich.edu return bridge.recvAtomic(pkt); 982650Ssaidi@eecs.umich.edu } 992650Ssaidi@eecs.umich.edu void 1002650Ssaidi@eecs.umich.edu recvFunctional(PacketPtr pkt) override 1012650Ssaidi@eecs.umich.edu { 1022650Ssaidi@eecs.umich.edu return bridge.recvFunctional(pkt); 1032650Ssaidi@eecs.umich.edu } 1042650Ssaidi@eecs.umich.edu bool 1052650Ssaidi@eecs.umich.edu recvTimingReq(PacketPtr pkt) override 1062650Ssaidi@eecs.umich.edu { 1072650Ssaidi@eecs.umich.edu return bridge.recvTimingReq(pkt); 1082650Ssaidi@eecs.umich.edu } 1092650Ssaidi@eecs.umich.edu bool 1102650Ssaidi@eecs.umich.edu tryTiming(PacketPtr pkt) override 1112650Ssaidi@eecs.umich.edu { 1122650Ssaidi@eecs.umich.edu return bridge.tryTiming(pkt); 1132650Ssaidi@eecs.umich.edu } 1142650Ssaidi@eecs.umich.edu bool 1152650Ssaidi@eecs.umich.edu recvTimingSnoopResp(PacketPtr pkt) override 1162650Ssaidi@eecs.umich.edu { 1172650Ssaidi@eecs.umich.edu return bridge.recvTimingSnoopResp(pkt); 1182650Ssaidi@eecs.umich.edu } 1192650Ssaidi@eecs.umich.edu void recvRespRetry() override { bridge.recvRespRetry(); } 1202650Ssaidi@eecs.umich.edu 1212650Ssaidi@eecs.umich.edu public: 1222650Ssaidi@eecs.umich.edu BridgeSlavePort(const std::string &name_, Gem5ToTlmBridge &bridge_) : 1232650Ssaidi@eecs.umich.edu SlavePort(name_, nullptr), bridge(bridge_) 1242650Ssaidi@eecs.umich.edu {} 1252650Ssaidi@eecs.umich.edu }; 1262650Ssaidi@eecs.umich.edu 1272651Ssaidi@eecs.umich.edu BridgeSlavePort bsp; 1282651Ssaidi@eecs.umich.edu tlm_utils::simple_initiator_socket<Gem5ToTlmBridge, 64> socket; 1292650Ssaidi@eecs.umich.edu sc_gem5::TlmInitiatorWrapper<64> wrapper; 1302650Ssaidi@eecs.umich.edu 1312650Ssaidi@eecs.umich.edu System *system; 1322650Ssaidi@eecs.umich.edu 1332650Ssaidi@eecs.umich.edu /** 1342650Ssaidi@eecs.umich.edu * A transaction after BEGIN_REQ has been sent but before END_REQ, which 1352650Ssaidi@eecs.umich.edu * is blocking the request channel (Exlusion Rule, see IEEE1666) 1362650Ssaidi@eecs.umich.edu */ 1372650Ssaidi@eecs.umich.edu tlm::tlm_generic_payload *blockingRequest; 1382650Ssaidi@eecs.umich.edu 1392650Ssaidi@eecs.umich.edu /** 1402650Ssaidi@eecs.umich.edu * Did another gem5 request arrive while currently blocked? 1412650Ssaidi@eecs.umich.edu * This variable is needed when a retry should happen 1422650Ssaidi@eecs.umich.edu */ 1432650Ssaidi@eecs.umich.edu bool needToSendRequestRetry; 1442650Ssaidi@eecs.umich.edu 1452650Ssaidi@eecs.umich.edu /** 1462650Ssaidi@eecs.umich.edu * A response which has been asked to retry by gem5 and so is blocking 1472650Ssaidi@eecs.umich.edu * the response channel 1482650Ssaidi@eecs.umich.edu */ 1492650Ssaidi@eecs.umich.edu tlm::tlm_generic_payload *blockingResponse; 1502650Ssaidi@eecs.umich.edu 1512650Ssaidi@eecs.umich.edu AddrRangeList addrRanges; 1522650Ssaidi@eecs.umich.edu 1532650Ssaidi@eecs.umich.edu protected: 1542650Ssaidi@eecs.umich.edu void pec(Gem5SystemC::PayloadEvent<Gem5ToTlmBridge> *pe, 1552650Ssaidi@eecs.umich.edu tlm::tlm_generic_payload &trans, const tlm::tlm_phase &phase); 1562650Ssaidi@eecs.umich.edu 1572650Ssaidi@eecs.umich.edu // The gem5 port interface. 1582650Ssaidi@eecs.umich.edu Tick recvAtomic(PacketPtr packet); 1592650Ssaidi@eecs.umich.edu void recvFunctional(PacketPtr packet); 1602650Ssaidi@eecs.umich.edu bool recvTimingReq(PacketPtr packet); 1612650Ssaidi@eecs.umich.edu bool tryTiming(PacketPtr packet); 1622650Ssaidi@eecs.umich.edu bool recvTimingSnoopResp(PacketPtr packet); 1632650Ssaidi@eecs.umich.edu void recvRespRetry(); 1642650Ssaidi@eecs.umich.edu void recvFunctionalSnoop(PacketPtr packet); 1652650Ssaidi@eecs.umich.edu AddrRangeList getAddrRanges() const { return addrRanges; } 1662650Ssaidi@eecs.umich.edu 1672650Ssaidi@eecs.umich.edu // The TLM initiator interface. 1682650Ssaidi@eecs.umich.edu tlm::tlm_sync_enum nb_transport_bw(tlm::tlm_generic_payload &trans, 1692650Ssaidi@eecs.umich.edu tlm::tlm_phase &phase, 1702650Ssaidi@eecs.umich.edu sc_core::sc_time &t); 1712650Ssaidi@eecs.umich.edu 1722650Ssaidi@eecs.umich.edu public: 1732650Ssaidi@eecs.umich.edu ::Port &gem5_getPort(const std::string &if_name, int idx=-1) override; 1742650Ssaidi@eecs.umich.edu 1752650Ssaidi@eecs.umich.edu typedef Gem5ToTlmBridgeParams Params; 1762650Ssaidi@eecs.umich.edu Gem5ToTlmBridge(Params *p, const sc_core::sc_module_name &mn); 1772650Ssaidi@eecs.umich.edu 1782650Ssaidi@eecs.umich.edu tlm_utils::simple_initiator_socket<Gem5ToTlmBridge, 64> & 1792650Ssaidi@eecs.umich.edu getSocket() 1802650Ssaidi@eecs.umich.edu { 1812650Ssaidi@eecs.umich.edu return socket; 1822650Ssaidi@eecs.umich.edu } 1832650Ssaidi@eecs.umich.edu 1842650Ssaidi@eecs.umich.edu void before_end_of_elaboration() override; 1852650Ssaidi@eecs.umich.edu}; 1862650Ssaidi@eecs.umich.edu 1872650Ssaidi@eecs.umich.edu} // namespace sc_gem5 1882650Ssaidi@eecs.umich.edu 1892650Ssaidi@eecs.umich.edu#endif // __SYSTEMC_TLM_BRIDGE_GEM5_TO_TLM_HH__ 1902650Ssaidi@eecs.umich.edu