@@ -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,29 @@ 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 : 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+ );
169184
170185 if (ChimneyCfg.CutAx) begin : gen_ax_cuts
171186 spill_register # (
@@ -193,6 +208,9 @@ module floo_axi_chimney #(
193208 .valid_o ( axi_ar_queue_valid_out ),
194209 .ready_i ( axi_ar_queue_ready_in )
195210 );
211+
212+ `FF (decode_error_q[AxiAr], decode_error_d[AxiAr], '0 )
213+ `FF (decode_error_q[AxiAw], decode_error_d[AxiAw], '0 )
196214 end else begin : gen_no_ax_cuts
197215 assign axi_aw_queue = axi_in_req_i.aw;
198216 assign axi_aw_queue_valid_out = axi_in_req_i.aw_valid;
@@ -201,6 +219,9 @@ module floo_axi_chimney #(
201219 assign axi_ar_queue = axi_in_req_i.ar;
202220 assign axi_ar_queue_valid_out = axi_in_req_i.ar_valid;
203221 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];
204225 end
205226 end else begin : gen_err_slv_port
206227 axi_err_slv # (
@@ -398,11 +419,12 @@ module floo_axi_chimney #(
398419 .clk_i,
399420 .rst_ni,
400421 .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] )
406428 );
407429 end else if (RouteCfg.RouteAlgo == floo_pkg :: SourceRouting &&
408430 (Ch == AxiB || Ch == AxiR)) begin : gen_rsp_route_comp
@@ -420,11 +442,12 @@ module floo_axi_chimney #(
420442 .clk_i,
421443 .rst_ni,
422444 .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] )
428451 );
429452 end
430453 end
0 commit comments