36class addrtr :
public sc_core::sc_module
41 sc_dt::uint64 addr_fw(sc_dt::uint64
addr)
43 auto offset =
addr - m_base_addr;
44 return p_mapped_base_addr.get_value() + offset;
47 sc_dt::uint64 addr_bw(sc_dt::uint64
addr)
49 auto offset =
addr - p_mapped_base_addr.get_value();
50 return m_base_addr + offset;
58 if ((
addr >= m_base_addr) && ((
addr +
len - 1) < (m_base_addr + m_mapping_size))) {
62 SCP_FATAL(()) <<
"The txn [addr: 0x" << std::hex <<
addr <<
"] len: 0x" << std::hex <<
len
63 <<
", doesn't belong to the target_socket base address: 0x" << std::hex << m_base_addr
64 <<
" size: 0x" << std::hex << m_mapping_size;
71 if (
start_addr < p_mapped_base_addr.get_value()) {
73 }
else if ((
start_addr >= p_mapped_base_addr.get_value()) &&
74 (
start_addr < (p_mapped_base_addr.get_value() + m_mapping_size))) {
78 <<
" is bigger than the mapped area 0x" << std::hex << p_mapped_base_addr.get_value()
79 <<
" size: 0x" << std::hex << m_mapping_size;
81 if (
end_addr >= (p_mapped_base_addr.get_value() + m_mapping_size)) {
82 end_addr = m_base_addr + m_mapping_size;
87 <<
" is smaller than the mapped area 0x" << std::hex << p_mapped_base_addr.get_value()
88 <<
" size: 0x" << std::hex << m_mapping_size;
92 void b_transport(tlm::tlm_generic_payload&
trans, sc_core::sc_time& delay)
96 SCP_DEBUG(()) <<
"b_transport to addr: 0x" << std::hex <<
orig_addr <<
" will be mapped to addr: 0x" << std::hex
98 initiator_socket->b_transport(
trans, delay);
102 unsigned int transport_dbg(tlm::tlm_generic_payload&
trans)
106 SCP_DEBUG(()) <<
"transport_dbg to addr: 0x" << std::hex <<
orig_addr <<
" will be mapped to addr: 0x"
108 unsigned int ret = initiator_socket->transport_dbg(
trans);
113 bool get_direct_mem_ptr(tlm::tlm_generic_payload&
trans, tlm::tlm_dmi& dmi_data)
117 bool ret = initiator_socket->get_direct_mem_ptr(
trans, dmi_data);
130 void invalidate_direct_mem_ptr(sc_dt::uint64 start, sc_dt::uint64 end)
135 SCP_DEBUG(()) <<
"invalidate_direct_mem_ptr request to range 0x" << std::hex <<
start_addr <<
" - 0x"
141 cci::cci_broker_handle m_broker;
146 tlm_utils::simple_target_socket<addrtr, DEFAULT_TLM_BUSWIDTH> target_socket;
147 tlm_utils::simple_initiator_socket<addrtr, DEFAULT_TLM_BUSWIDTH> initiator_socket;
148 cci::cci_param<uint64_t> p_mapped_base_addr;
151 explicit addrtr(
const sc_core::sc_module_name&
nm)
152 : sc_core::sc_module(
nm)
153 , m_broker(cci::cci_get_broker())
154 , initiator_socket(
"initiator_socket")
155 , target_socket(
"target_socket")
156 , p_mapped_base_addr(
"mapped_base_addr", 0,
"base adress for mapping")
159 target_socket.register_b_transport(
this, &addrtr::b_transport);
160 target_socket.register_transport_dbg(
this, &addrtr::transport_dbg);
161 target_socket.register_get_direct_mem_ptr(
this, &addrtr::get_direct_mem_ptr);
162 initiator_socket.register_invalidate_direct_mem_ptr(
this, &addrtr::invalidate_direct_mem_ptr);
163 m_base_addr = gs::cci_get<uint64_t>(m_broker,
164 std::string(sc_core::sc_module::name()) +
".target_socket.address");
165 m_mapping_size = gs::cci_get<uint64_t>(m_broker,
166 std::string(sc_core::sc_module::name()) +
".target_socket.size");