@@ -52,8 +52,9 @@ template <unsigned BUSWIDTH = LT, typename TARGET_SOCKET_TYPE = tlm::tlm_target_
5252 * @param nm the component name
5353 * @param slave_cnt number of slaves to be connected
5454 * @param master_cnt number of masters to be connected
55+ * @param check_overlap_on_add_target if true this enables validation of overlaps when adding or setting the target range.
5556 */
56- router (const sc_core::sc_module_name& nm, size_t slave_cnt = 1 , size_t master_cnt = 1 );
57+ 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 );
5758
5859 ~router () = default ;
5960 /* *
@@ -169,6 +170,12 @@ template <unsigned BUSWIDTH = LT, typename TARGET_SOCKET_TYPE = tlm::tlm_target_
169170 */
170171 void invalidate_direct_mem_ptr (int id, ::sc_dt::uint64 start_range, ::sc_dt::uint64 end_range);
171172
173+ /* *
174+ * @fn void end_of_elaboration()
175+ * @brief tagged end of elaboration callback.
176+ */
177+ void end_of_elaboration () override ;
178+
172179protected:
173180 struct range_entry {
174181 uint64_t base, size;
@@ -180,17 +187,19 @@ template <unsigned BUSWIDTH = LT, typename TARGET_SOCKET_TYPE = tlm::tlm_target_
180187 std::vector<sc_core::sc_mutex> mutexes;
181188 util::range_lut<unsigned > addr_decoder;
182189 std::unordered_map<std::string, size_t > target_name_lut;
190+ bool check_overlap_on_add_target;
183191};
184192
185193template <unsigned BUSWIDTH, typename TARGET_SOCKET_TYPE>
186- router<BUSWIDTH, TARGET_SOCKET_TYPE>::router(const sc_core::sc_module_name& nm, size_t slave_cnt, size_t master_cnt)
194+ 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 )
187195: sc_module(nm)
188196, target(" target" , master_cnt)
189197, initiator(" intor" , slave_cnt)
190198, ibases(master_cnt)
191199, tranges(slave_cnt)
192200, mutexes(slave_cnt)
193- , addr_decoder(std::numeric_limits<unsigned >::max()) {
201+ , addr_decoder(std::numeric_limits<unsigned >::max())
202+ , check_overlap_on_add_target(check_overlap_on_add_target) {
194203 for (size_t i = 0 ; i < target.size (); ++i) {
195204 target[i].register_b_transport (
196205 [this , i](tlm::tlm_generic_payload& trans, sc_core::sc_time& delay) -> void { this ->b_transport (i, trans, delay); });
@@ -216,6 +225,8 @@ void router<BUSWIDTH, TARGET_SOCKET_TYPE>::set_target_range(size_t idx, uint64_t
216225 tranges[idx].size = size;
217226 tranges[idx].remap = remap;
218227 addr_decoder.addEntry (idx, base, size);
228+ if (check_overlap_on_add_target)
229+ addr_decoder.validate ();
219230}
220231
221232template <unsigned BUSWIDTH, typename TARGET_SOCKET_TYPE>
@@ -237,6 +248,8 @@ void router<BUSWIDTH, TARGET_SOCKET_TYPE>::add_target_range(std::string name, ui
237248 tranges[idx].size = size;
238249 tranges[idx].remap = remap;
239250 addr_decoder.addEntry (idx, base, size);
251+ if (check_overlap_on_add_target)
252+ addr_decoder.validate ();
240253}
241254
242255template <unsigned BUSWIDTH, typename TARGET_SOCKET_TYPE>
@@ -327,6 +340,10 @@ void router<BUSWIDTH, TARGET_SOCKET_TYPE>::invalidate_direct_mem_ptr(int id, ::s
327340 target[i]->invalidate_direct_mem_ptr (bw_start_range - ibases[i], bw_end_range - ibases[i]);
328341 }
329342}
343+ template <unsigned BUSWIDTH, typename TARGET_SOCKET_TYPE>
344+ void router<BUSWIDTH, TARGET_SOCKET_TYPE>::end_of_elaboration() {
345+ addr_decoder.validate ();
346+ }
330347
331348} // namespace scc
332349
0 commit comments