Skip to content

Commit 7ff8d09

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 3b94a23 commit 7ff8d09

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
@@ -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+
170177
protected:
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

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

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

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

Comments
 (0)