@@ -98,7 +98,7 @@ module floo_axi_chimney #(
9898 // Duplicate AXI port signals to degenerate ports
9999 // in case they are not used
100100 axi_req_t axi_req_in;
101- axi_rsp_t axi_rsp_out;
101+ axi_rsp_t axi_rsp_out, axi_in_rsp_err ;
102102
103103 // AX queue
104104 axi_aw_chan_t axi_aw_queue;
@@ -158,14 +158,30 @@ module floo_axi_chimney #(
158158 meta_buf_t aw_out_hdr_in, aw_out_hdr_out;
159159 meta_buf_t ar_out_hdr_in, ar_out_hdr_out;
160160
161+ // Error signals from AR/AW address decoders
162+ logic [NumAxiChannels- 1 : 0 ] decode_error_d, decode_error_q;
161163 // /////////////////////
162164 // Spill registers //
163165 // /////////////////////
164166
165167 if (ChimneyCfg.EnMgrPort) begin : gen_sbr_port
166168
167169 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+ );
169185
170186 if (ChimneyCfg.CutAx) begin : gen_ax_cuts
171187 spill_register # (
@@ -193,6 +209,9 @@ module floo_axi_chimney #(
193209 .valid_o ( axi_ar_queue_valid_out ),
194210 .ready_i ( axi_ar_queue_ready_in )
195211 );
212+
213+ `FF (decode_error_q[AxiAr], decode_error_d[AxiAr], '0 )
214+ `FF (decode_error_q[AxiAw], decode_error_d[AxiAw], '0 )
196215 end else begin : gen_no_ax_cuts
197216 assign axi_aw_queue = axi_in_req_i.aw;
198217 assign axi_aw_queue_valid_out = axi_in_req_i.aw_valid;
@@ -201,6 +220,9 @@ module floo_axi_chimney #(
201220 assign axi_ar_queue = axi_in_req_i.ar;
202221 assign axi_ar_queue_valid_out = axi_in_req_i.ar_valid;
203222 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];
204226 end
205227 end else begin : gen_err_slv_port
206228 axi_err_slv # (
@@ -398,11 +420,12 @@ module floo_axi_chimney #(
398420 .clk_i,
399421 .rst_ni,
400422 .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] )
406429 );
407430 end else if (RouteCfg.RouteAlgo == floo_pkg :: SourceRouting &&
408431 (Ch == AxiB || Ch == AxiR)) begin : gen_rsp_route_comp
@@ -420,11 +443,12 @@ module floo_axi_chimney #(
420443 .clk_i,
421444 .rst_ni,
422445 .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] )
428452 );
429453 end
430454 end
0 commit comments