quic/qbox
Loading...
Searching...
No Matches
tlm_bus_width_bridges.h
1/*
2 * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All Rights Reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef _GREENSOCS_TLM_SOCKETS_BUSWIDTH_
8#define _GREENSOCS_TLM_SOCKETS_BUSWIDTH_
9
10#include <cci_configuration>
11#include <systemc>
12#include <scp/report.h>
13#include <scp/helpers.h>
14#include <tlm_utils/simple_initiator_socket.h>
15#include <tlm_utils/simple_target_socket.h>
16#include <module_factory_registery.h>
17#include <tlm_sockets_buswidth.h>
18
19namespace gs {
20
21template <unsigned int INPUT_BUSWIDTH = DEFAULT_TLM_BUSWIDTH, unsigned int OUTPUT_BUSWIDTH = DEFAULT_TLM_BUSWIDTH>
22class tlm_bus_width_bridges : public sc_core::sc_module
23{
24 SCP_LOGGER();
25
27 using tlm_initiator_socket_t = tlm_utils::simple_initiator_socket_b<
28 MOD, OUTPUT_BUSWIDTH, tlm::tlm_base_protocol_types, sc_core::SC_ZERO_OR_MORE_BOUND>;
29 using tlm_target_socket_t = tlm_utils::simple_target_socket_tagged_b<
30 MOD, INPUT_BUSWIDTH, tlm::tlm_base_protocol_types, sc_core::SC_ZERO_OR_MORE_BOUND>;
31
32public:
33 tlm_bus_width_bridges(const sc_core::sc_module_name& nm)
34 : sc_core::sc_module(nm)
35 , initiator_sockets("initiator_socket")
36 , target_sockets("target_socket")
37 , p_tlm_ports_num("tlm_ports_num", 1, "number of tlm ports")
38 {
39 SCP_DEBUG(()) << "tlm_bus_width_bridges constructor";
40 initiator_sockets.init(p_tlm_ports_num.get_value(),
41 [this](const char* n, int i) { return new tlm_initiator_socket_t(n); });
42 target_sockets.init(p_tlm_ports_num.get_value(),
43 [this](const char* n, int i) { return new tlm_target_socket_t(n); });
44 for (uint32_t i = 0; i < p_tlm_ports_num.get_value(); i++) {
45 target_sockets[i].register_b_transport(this, &MOD::b_transport, i);
46 target_sockets[i].register_transport_dbg(this, &MOD::transport_dbg, i);
47 target_sockets[i].register_get_direct_mem_ptr(this, &MOD::get_direct_mem_ptr, i);
48 initiator_sockets[i].register_invalidate_direct_mem_ptr(this, &MOD::invalidate_direct_mem_ptr);
49 }
50 }
51
52private:
53 void b_transport(int id, tlm::tlm_generic_payload& trans, sc_core::sc_time& delay)
54 {
55 SCP_DEBUG(()) << "calling b_transport: " << scp::scp_txn_tostring(trans);
56 initiator_sockets[id]->b_transport(trans, delay);
57 SCP_DEBUG(()) << "returning from b_transport: " << scp::scp_txn_tostring(trans);
58 }
59
60 unsigned int transport_dbg(int id, tlm::tlm_generic_payload& trans)
61 {
62 SCP_DEBUG(()) << "calling dbg_transport: " << scp::scp_txn_tostring(trans);
63 return initiator_sockets[id]->transport_dbg(trans);
64 }
65
66 bool get_direct_mem_ptr(int id, tlm::tlm_generic_payload& trans, tlm::tlm_dmi& dmi_data)
67 {
68 SCP_DEBUG(()) << "DMI to " << trans.get_address() << " range " << std::hex << dmi_data.get_start_address()
69 << " - " << std::hex << dmi_data.get_end_address();
70
71 return initiator_sockets[id]->get_direct_mem_ptr(trans, dmi_data);
72 }
73
74 void invalidate_direct_mem_ptr(sc_dt::uint64 start, sc_dt::uint64 end)
75 {
76 SCP_DEBUG(()) << " invalidate_direct_mem_ptr "
77 << " start address 0x" << std::hex << start << " end address 0x" << std::hex << end;
78
79 for (long unsigned int i = 0; i < target_sockets.size(); i++) {
80 target_sockets[i]->invalidate_direct_mem_ptr(start, end);
81 }
82 }
83
84public:
86
87public:
88 // These sockets are kept public for binding.
89 sc_core::sc_vector<tlm_initiator_socket_t> initiator_sockets;
90 sc_core::sc_vector<tlm_target_socket_t> target_sockets;
91 cci::cci_param<uint32_t> p_tlm_ports_num;
92};
93} // namespace gs
94
95extern "C" void module_register();
96
97#endif
Definition target.h:160
Definition tlm_bus_width_bridges.h:23
Tool which reads a Lua configuration file and sets parameters.
Definition biflow.cc:10