21template <
unsigned int INPUT_BUSWIDTH = DEFAULT_TLM_BUSWIDTH,
unsigned int OUTPUT_BUSWIDTH = DEFAULT_TLM_BUSWIDTH>
27 using tlm_initiator_socket_t = tlm_utils::simple_initiator_socket_b<
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>;
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")
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);
53 void b_transport(
int id, tlm::tlm_generic_payload&
trans, sc_core::sc_time& delay)
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);
60 unsigned int transport_dbg(
int id, tlm::tlm_generic_payload&
trans)
62 SCP_DEBUG(()) <<
"calling dbg_transport: " << scp::scp_txn_tostring(
trans);
63 return initiator_sockets[id]->transport_dbg(
trans);
66 bool get_direct_mem_ptr(
int id, tlm::tlm_generic_payload&
trans, tlm::tlm_dmi& dmi_data)
68 SCP_DEBUG(()) <<
"DMI to " <<
trans.get_address() <<
" range " << std::hex << dmi_data.get_start_address()
69 <<
" - " << std::hex << dmi_data.get_end_address();
71 return initiator_sockets[id]->get_direct_mem_ptr(
trans, dmi_data);
74 void invalidate_direct_mem_ptr(sc_dt::uint64 start, sc_dt::uint64 end)
76 SCP_DEBUG(()) <<
" invalidate_direct_mem_ptr "
77 <<
" start address 0x" << std::hex << start <<
" end address 0x" << std::hex << end;
79 for (
long unsigned int i = 0;
i < target_sockets.size();
i++) {
80 target_sockets[
i]->invalidate_direct_mem_ptr(start, end);
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;