@@ -51,8 +51,9 @@ template <unsigned BUSWIDTH = LT, typename TARGET_SOCKET_TYPE = tlm::tlm_target_
5151 * @param nm the component name
5252 * @param slave_cnt number of slaves to be connected
5353 * @param master_cnt number of masters to be connected
54+ * @param check_overlap_on_add_target if true this enables validation of overlaps when adding or setting the target range.
5455 */
55- router (const sc_core::sc_module_name& nm, size_t slave_cnt = 1 , size_t master_cnt = 1 );
56+ router (const sc_core::sc_module_name& nm, size_t slave_cnt = 1 , size_t master_cnt = 1 , bool check_overlap_on_add_target = false );
5657
5758 ~router () = default ;
5859 /* *
@@ -167,6 +168,12 @@ template <unsigned BUSWIDTH = LT, typename TARGET_SOCKET_TYPE = tlm::tlm_target_
167168 */
168169 void invalidate_direct_mem_ptr (int id, ::sc_dt::uint64 start_range, ::sc_dt::uint64 end_range);
169170
171+ /* *
172+ * @fn void end_of_elaboration()
173+ * @brief tagged end of elaboration callback.
174+ */
175+ void end_of_elaboration () override ;
176+
170177protected:
171178 struct range_entry {
172179 uint64_t base, size;
@@ -178,17 +185,19 @@ template <unsigned BUSWIDTH = LT, typename TARGET_SOCKET_TYPE = tlm::tlm_target_
178185 std::vector<sc_core::sc_mutex> mutexes;
179186 util::range_lut<unsigned > addr_decoder;
180187 std::unordered_map<std::string, size_t > target_name_lut;
188+ bool check_overlap_on_add_target;
181189};
182190
183191template <unsigned BUSWIDTH, typename TARGET_SOCKET_TYPE>
184- router<BUSWIDTH, TARGET_SOCKET_TYPE>::router(const sc_core::sc_module_name& nm, size_t slave_cnt, size_t master_cnt)
192+ router<BUSWIDTH, TARGET_SOCKET_TYPE>::router(const sc_core::sc_module_name& nm, size_t slave_cnt, size_t master_cnt, bool check_overlap_on_add_target )
185193: sc_module(nm)
186194, target(" target" , master_cnt)
187195, initiator(" intor" , slave_cnt)
188196, ibases(master_cnt)
189197, tranges(slave_cnt)
190198, mutexes(slave_cnt)
191- , addr_decoder(std::numeric_limits<unsigned >::max()) {
199+ , addr_decoder(std::numeric_limits<unsigned >::max())
200+ , check_overlap_on_add_target(check_overlap_on_add_target) {
192201 for (size_t i = 0 ; i < target.size (); ++i) {
193202 target[i].register_b_transport (
194203 [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<BUSWIDTH, TARGET_SOCKET_TYPE>::set_target_range(size_t idx, uint64_t
214223 tranges[idx].size = size;
215224 tranges[idx].remap = remap;
216225 addr_decoder.addEntry (idx, base, size);
226+ if (check_overlap_on_add_target)
227+ addr_decoder.validate ();
217228}
218229
219230template <unsigned BUSWIDTH, typename TARGET_SOCKET_TYPE>
@@ -235,6 +246,8 @@ void router<BUSWIDTH, TARGET_SOCKET_TYPE>::add_target_range(std::string name, ui
235246 tranges[idx].size = size;
236247 tranges[idx].remap = remap;
237248 addr_decoder.addEntry (idx, base, size);
249+ if (check_overlap_on_add_target)
250+ addr_decoder.validate ();
238251}
239252
240253template <unsigned BUSWIDTH, typename TARGET_SOCKET_TYPE>
@@ -322,6 +335,10 @@ void router<BUSWIDTH, TARGET_SOCKET_TYPE>::invalidate_direct_mem_ptr(int id, ::s
322335 target[i]->invalidate_direct_mem_ptr (bw_start_range - ibases[i], bw_end_range - ibases[i]);
323336 }
324337}
338+ template <unsigned BUSWIDTH, typename TARGET_SOCKET_TYPE>
339+ void router<BUSWIDTH, TARGET_SOCKET_TYPE>::end_of_elaboration() {
340+ addr_decoder.validate ();
341+ }
325342
326343} // namespace scc
327344
0 commit comments