From 3b94a23709193a91badab72e5ee4607a4c75538a Mon Sep 17 00:00:00 2001 From: Prateek Arora Date: Mon, 27 Oct 2025 09:21:17 -0700 Subject: [PATCH 1/3] router: remove socket.basename() from bind_target tlm::tlm_base_target_socket_b does not contain a member named basename, which may be required for virtual platform development. --- src/components/scc/router.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/scc/router.h b/src/components/scc/router.h index 5707ef98..7172d691 100644 --- a/src/components/scc/router.h +++ b/src/components/scc/router.h @@ -68,7 +68,6 @@ template void bind_target(TYPE& socket, size_t idx, uint64_t base, uint64_t size, bool remap = true) { set_target_range(idx, base, size, remap); - set_target_name(idx, socket.basename()); initiator[idx].bind(socket); } /** @@ -81,7 +80,6 @@ template void bind_target(TYPE& socket, size_t idx, std::string name) { - set_target_name(idx, name); initiator[idx].bind(socket); } /** From 7ff8d0924ed61bacd54ba66b28071f4d1c357b49 Mon Sep 17 00:00:00 2001 From: Prateek Arora Date: Fri, 24 Oct 2025 09:13:02 -0700 Subject: [PATCH 2/3] router: detect overlapping targets - Call addr_decoder.validate() after invoking addr_decoder.addEntry() to check for overlaps. A configuration option has been added to enable this validation. - Implement an end_of_elaboration method and call the addr_decoder.validate() function during elaboration. --- src/components/scc/router.h | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/components/scc/router.h b/src/components/scc/router.h index 7172d691..2f58263f 100644 --- a/src/components/scc/router.h +++ b/src/components/scc/router.h @@ -51,8 +51,9 @@ template mutexes; util::range_lut addr_decoder; std::unordered_map target_name_lut; + bool check_overlap_on_add_target; }; template -router::router(const sc_core::sc_module_name& nm, size_t slave_cnt, size_t master_cnt) +router::router(const sc_core::sc_module_name& nm, size_t slave_cnt, size_t master_cnt, bool check_overlap_on_add_target) : sc_module(nm) , target("target", master_cnt) , initiator("intor", slave_cnt) , ibases(master_cnt) , tranges(slave_cnt) , mutexes(slave_cnt) -, addr_decoder(std::numeric_limits::max()) { +, addr_decoder(std::numeric_limits::max()) +, check_overlap_on_add_target(check_overlap_on_add_target) { for(size_t i = 0; i < target.size(); ++i) { target[i].register_b_transport( [this, i](tlm::tlm_generic_payload& trans, sc_core::sc_time& delay) -> void { this->b_transport(i, trans, delay); }); @@ -214,6 +223,8 @@ void router::set_target_range(size_t idx, uint64_t tranges[idx].size = size; tranges[idx].remap = remap; addr_decoder.addEntry(idx, base, size); + if(check_overlap_on_add_target) + addr_decoder.validate(); } template @@ -235,6 +246,8 @@ void router::add_target_range(std::string name, ui tranges[idx].size = size; tranges[idx].remap = remap; addr_decoder.addEntry(idx, base, size); + if(check_overlap_on_add_target) + addr_decoder.validate(); } template @@ -322,6 +335,10 @@ void router::invalidate_direct_mem_ptr(int id, ::s target[i]->invalidate_direct_mem_ptr(bw_start_range - ibases[i], bw_end_range - ibases[i]); } } +template +void router::end_of_elaboration() { + addr_decoder.validate(); +} } // namespace scc From 052d47a369f7dc351a773f099613a557ac5540ea Mon Sep 17 00:00:00 2001 From: Prateek Arora Date: Fri, 17 Oct 2025 16:12:18 -0700 Subject: [PATCH 3/3] router: Add a warning message when a target address is not found --- src/components/scc/router.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/components/scc/router.h b/src/components/scc/router.h index 2f58263f..6ba3d52a 100644 --- a/src/components/scc/router.h +++ b/src/components/scc/router.h @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -131,6 +132,13 @@ template addr_decoder; std::unordered_map target_name_lut; bool check_overlap_on_add_target; + bool warn_on_address_error{false}; }; template @@ -260,6 +269,9 @@ void router::b_transport(int i, tlm::tlm_generic_p size_t idx = addr_decoder.getEntry(address); if(idx == addr_decoder.null_entry) { if(default_idx == std::numeric_limits::max()) { + if(warn_on_address_error) { + SCCWARN(SCMOD) << "target address=0x" << std::hex << address << " not found for " << (trans.get_command() == tlm::TLM_READ_COMMAND ? "read" : "write") << " transaction."; + } trans.set_response_status(tlm::TLM_ADDRESS_ERROR_RESPONSE); return; } @@ -283,6 +295,9 @@ bool router::get_direct_mem_ptr(int i, tlm::tlm_ge size_t idx = addr_decoder.getEntry(address); if(idx == addr_decoder.null_entry) { if(default_idx == std::numeric_limits::max()) { + if(warn_on_address_error) { + SCCWARN(SCMOD) << "target address=0x" << std::hex << address << " not found for " << (trans.get_command() == tlm::TLM_READ_COMMAND ? "read" : "write") << " transaction."; + } trans.set_response_status(tlm::TLM_ADDRESS_ERROR_RESPONSE); return false; } @@ -311,6 +326,9 @@ unsigned router::transport_dbg(int i, tlm::tlm_gen size_t idx = addr_decoder.getEntry(address); if(idx == addr_decoder.null_entry) { if(default_idx == std::numeric_limits::max()) { + if(warn_on_address_error) { + SCCWARN(SCMOD) << "target address=0x" << std::hex << address << " not found for " << (trans.get_command() == tlm::TLM_READ_COMMAND ? "read" : "write") << " transaction."; + } trans.set_response_status(tlm::TLM_ADDRESS_ERROR_RESPONSE); return 0; }