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