@@ -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,30 @@ 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 :
171
+ axi_rsp_out;
172
+
173
+ axi_err_slv # (
174
+ .AxiIdWidth ( AxiCfg.InIdWidth ),
175
+ .ATOPs ( AtopSupport ),
176
+ .axi_req_t ( axi_in_req_t ),
177
+ .axi_resp_t ( axi_in_rsp_t )
178
+ ) i_axi_err_slv (
179
+ .clk_i ( clk_i ),
180
+ .rst_ni ( rst_ni ),
181
+ .test_i ( test_enable_i ),
182
+ .slv_req_i ( axi_in_req_i ),
183
+ .slv_resp_o ( axi_in_rsp_err )
184
+ );
169
185
170
186
if (ChimneyCfg.CutAx) begin : gen_ax_cuts
171
187
spill_register # (
@@ -193,6 +209,9 @@ module floo_axi_chimney #(
193
209
.valid_o ( axi_ar_queue_valid_out ),
194
210
.ready_i ( axi_ar_queue_ready_in )
195
211
);
212
+
213
+ `FF (decode_error_q[AxiAr], decode_error_d[AxiAr], '0 )
214
+ `FF (decode_error_q[AxiAw], decode_error_d[AxiAw], '0 )
196
215
end else begin : gen_no_ax_cuts
197
216
assign axi_aw_queue = axi_in_req_i.aw;
198
217
assign axi_aw_queue_valid_out = axi_in_req_i.aw_valid;
@@ -201,6 +220,9 @@ module floo_axi_chimney #(
201
220
assign axi_ar_queue = axi_in_req_i.ar;
202
221
assign axi_ar_queue_valid_out = axi_in_req_i.ar_valid;
203
222
assign axi_rsp_out.ar_ready = axi_ar_queue_ready_in;
223
+
224
+ assign decode_error_q[AxiAr] = decode_error_d[AxiAr];
225
+ assign decode_error_q[AxiAw] = decode_error_d[AxiAw];
204
226
end
205
227
end else begin : gen_err_slv_port
206
228
axi_err_slv # (
@@ -398,11 +420,12 @@ module floo_axi_chimney #(
398
420
.clk_i,
399
421
.rst_ni,
400
422
.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] )
423
+ .addr_map_i ( Sam ),
424
+ .id_i ( id_t ' ('0 ) ),
425
+ .addr_i ( axi_req_addr[ch] ),
426
+ .route_o ( route_out[ch] ),
427
+ .id_o ( id_out[ch] ),
428
+ .decode_error_o ( decode_error_d[ch] )
406
429
);
407
430
end else if (RouteCfg.RouteAlgo == floo_pkg :: SourceRouting &&
408
431
(Ch == AxiB || Ch == AxiR)) begin : gen_rsp_route_comp
@@ -420,11 +443,12 @@ module floo_axi_chimney #(
420
443
.clk_i,
421
444
.rst_ni,
422
445
.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] )
446
+ .addr_i ( '0 ),
447
+ .addr_map_i ( Sam ),
448
+ .id_i ( axi_rsp_src_id[ch] ),
449
+ .route_o ( route_out[ch] ),
450
+ .id_o ( id_out[ch] ),
451
+ .decode_error_o ( decode_error_d[ch] )
428
452
);
429
453
end
430
454
end
0 commit comments