Skip to content

Commit c4eca86

Browse files
committed
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.
1 parent ee41426 commit c4eca86

File tree

1 file changed

+20
-3
lines changed

1 file changed

+20
-3
lines changed

src/components/scc/router.h

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
172179
protected:
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

185193
template <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

221232
template <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

242255
template <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

Comments
 (0)