diff --git a/src/components/scc/router.h b/src/components/scc/router.h index 5707ef98..6ba3d52a 100644 --- a/src/components/scc/router.h +++ b/src/components/scc/router.h @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -51,8 +52,9 @@ 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 +82,6 @@ template void bind_target(TYPE& socket, size_t idx, std::string name) { - set_target_name(idx, name); initiator[idx].bind(socket); } /** @@ -132,6 +132,13 @@ template mutexes; util::range_lut addr_decoder; std::unordered_map target_name_lut; + bool check_overlap_on_add_target; + bool warn_on_address_error{false}; }; 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); }); @@ -216,6 +232,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 @@ -237,6 +255,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 @@ -249,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; } @@ -272,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; } @@ -300,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; } @@ -324,6 +353,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