@@ -98,7 +98,7 @@ module floo_axi_chimney #(
98
98
// Duplicate AXI port signals to degenerate ports
99
99
// in case they are not used
100
100
axi_req_t axi_req_in;
101
- axi_rsp_t axi_rsp_out;
101
+ axi_rsp_t axi_rsp_out, axi_in_rsp_err ;
102
102
103
103
// AX queue
104
104
axi_aw_chan_t axi_aw_queue;
@@ -158,14 +158,29 @@ module floo_axi_chimney #(
158
158
meta_buf_t aw_out_hdr_in, aw_out_hdr_out;
159
159
meta_buf_t ar_out_hdr_in, ar_out_hdr_out;
160
160
161
+ // Error signals from AR/AW address decoders
162
+ logic [NumAxiChannels- 1 : 0 ] decode_error_d, decode_error_q;
161
163
// /////////////////////
162
164
// Spill registers //
163
165
// /////////////////////
164
166
165
167
if (ChimneyCfg.EnMgrPort) begin : gen_sbr_port
166
168
167
169
assign axi_req_in = axi_in_req_i;
168
- assign axi_in_rsp_o = axi_rsp_out;
170
+ assign axi_in_rsp_o = (decode_error_q[AxiAr] || decode_error_q[AxiAw]) ? axi_in_rsp_err : axi_rsp_out;
171
+
172
+ axi_err_slv # (
173
+ .AxiIdWidth ( AxiCfg.InIdWidth ),
174
+ .ATOPs ( AtopSupport ),
175
+ .axi_req_t ( axi_in_req_t ),
176
+ .axi_resp_t ( axi_in_rsp_t )
177
+ ) i_axi_err_slv (
178
+ .clk_i ( clk_i ),
179
+ .rst_ni ( rst_ni ),
180
+ .test_i ( test_enable_i ),
181
+ .slv_req_i ( axi_in_req_i ),
182
+ .slv_resp_o ( axi_in_rsp_err )
183
+ );
169
184
170
185
if (ChimneyCfg.CutAx) begin : gen_ax_cuts
171
186
spill_register # (
@@ -193,6 +208,9 @@ module floo_axi_chimney #(
193
208
.valid_o ( axi_ar_queue_valid_out ),
194
209
.ready_i ( axi_ar_queue_ready_in )
195
210
);
211
+
212
+ `FF (decode_error_q[AxiAr], decode_error_d[AxiAr], '0 )
213
+ `FF (decode_error_q[AxiAw], decode_error_d[AxiAw], '0 )
196
214
end else begin : gen_no_ax_cuts
197
215
assign axi_aw_queue = axi_in_req_i.aw;
198
216
assign axi_aw_queue_valid_out = axi_in_req_i.aw_valid;
@@ -201,6 +219,9 @@ module floo_axi_chimney #(
201
219
assign axi_ar_queue = axi_in_req_i.ar;
202
220
assign axi_ar_queue_valid_out = axi_in_req_i.ar_valid;
203
221
assign axi_rsp_out.ar_ready = axi_ar_queue_ready_in;
222
+
223
+ assign decode_error_q[AxiAr] = decode_error_d[AxiAr];
224
+ assign decode_error_q[AxiAw] = decode_error_d[AxiAw];
204
225
end
205
226
end else begin : gen_err_slv_port
206
227
axi_err_slv # (
@@ -398,11 +419,12 @@ module floo_axi_chimney #(
398
419
.clk_i,
399
420
.rst_ni,
400
421
.route_table_i,
401
- .addr_map_i ( Sam ),
402
- .id_i ( id_t ' ('0 ) ),
403
- .addr_i ( axi_req_addr[ch] ),
404
- .route_o ( route_out[ch] ),
405
- .id_o ( id_out[ch] )
422
+ .addr_map_i ( Sam ),
423
+ .id_i ( id_t ' ('0 ) ),
424
+ .addr_i ( axi_req_addr[ch] ),
425
+ .route_o ( route_out[ch] ),
426
+ .id_o ( id_out[ch] ),
427
+ .decode_error_o ( decode_error_d[ch] )
406
428
);
407
429
end else if (RouteCfg.RouteAlgo == floo_pkg :: SourceRouting &&
408
430
(Ch == AxiB || Ch == AxiR)) begin : gen_rsp_route_comp
@@ -420,11 +442,12 @@ module floo_axi_chimney #(
420
442
.clk_i,
421
443
.rst_ni,
422
444
.route_table_i,
423
- .addr_i ( '0 ),
424
- .addr_map_i ( '0 ),
425
- .id_i ( axi_rsp_src_id[ch] ),
426
- .route_o ( route_out[ch] ),
427
- .id_o ( id_out[ch] )
445
+ .addr_i ( '0 ),
446
+ .addr_map_i ( Sam ),
447
+ .id_i ( axi_rsp_src_id[ch] ),
448
+ .route_o ( route_out[ch] ),
449
+ .id_o ( id_out[ch] ),
450
+ .decode_error_o ( decode_error_d[ch] )
428
451
);
429
452
end
430
453
end
0 commit comments