@@ -220,3 +220,90 @@ module axi_xbar #(
220
220
`endif
221
221
// pragma translate_on
222
222
endmodule
223
+
224
+ `include " axi/assign.svh"
225
+ `include " axi/typedef.svh"
226
+
227
+ module axi_xbar_intf # (
228
+ parameter int unsigned AXI_USER_WIDTH = 0 ,
229
+ parameter axi_pkg :: xbar_cfg_t Cfg = '0 ,
230
+ parameter type rule_t = axi_pkg :: xbar_rule_64_t
231
+ ) (
232
+ input logic clk_i,
233
+ input logic rst_ni,
234
+ input logic test_i,
235
+ AXI_BUS .Slave slv_ports [Cfg.NoSlvPorts- 1 : 0 ],
236
+ AXI_BUS .Master mst_ports [Cfg.NoMstPorts- 1 : 0 ],
237
+ input rule_t [Cfg.NoAddrRules- 1 : 0 ] addr_map_i,
238
+ input logic [Cfg.NoSlvPorts- 1 : 0 ] en_default_mst_port_i,
239
+ input logic [Cfg.NoSlvPorts- 1 : 0 ][$clog2(Cfg.NoMstPorts)- 1 : 0 ] default_mst_port_i
240
+ );
241
+
242
+ localparam int unsigned AxiIdWidthMstPorts = Cfg.AxiIdWidthSlvPorts + $clog2 (Cfg.NoSlvPorts);
243
+
244
+ typedef logic [AxiIdWidthMstPorts - 1 : 0 ] id_mst_t ;
245
+ typedef logic [Cfg.AxiIdWidthSlvPorts - 1 : 0 ] id_slv_t ;
246
+ typedef logic [Cfg.AxiAddrWidth - 1 : 0 ] addr_t ;
247
+ typedef logic [Cfg.AxiDataWidth - 1 : 0 ] data_t ;
248
+ typedef logic [Cfg.AxiDataWidth/ 8 - 1 : 0 ] strb_t ;
249
+ typedef logic [AXI_USER_WIDTH - 1 : 0 ] user_t ;
250
+
251
+ `AXI_TYPEDEF_AW_CHAN_T ( mst_aw_chan_t, addr_t, id_mst_t, user_t)
252
+ `AXI_TYPEDEF_AW_CHAN_T ( slv_aw_chan_t, addr_t, id_slv_t, user_t)
253
+ `AXI_TYPEDEF_W_CHAN_T ( w_chan_t, data_t, strb_t, user_t)
254
+ `AXI_TYPEDEF_B_CHAN_T ( mst_b_chan_t, id_mst_t, user_t)
255
+ `AXI_TYPEDEF_B_CHAN_T ( slv_b_chan_t, id_slv_t, user_t)
256
+ `AXI_TYPEDEF_AR_CHAN_T ( mst_ar_chan_t, addr_t, id_mst_t, user_t)
257
+ `AXI_TYPEDEF_AR_CHAN_T ( slv_ar_chan_t, addr_t, id_slv_t, user_t)
258
+ `AXI_TYPEDEF_R_CHAN_T ( mst_r_chan_t, data_t, id_mst_t, user_t)
259
+ `AXI_TYPEDEF_R_CHAN_T ( slv_r_chan_t, data_t, id_slv_t, user_t)
260
+ `AXI_TYPEDEF_REQ_T ( mst_req_t, mst_aw_chan_t, w_chan_t, mst_ar_chan_t)
261
+ `AXI_TYPEDEF_REQ_T ( slv_req_t, slv_aw_chan_t, w_chan_t, slv_ar_chan_t)
262
+ `AXI_TYPEDEF_RESP_T ( mst_resp_t, mst_b_chan_t, mst_r_chan_t)
263
+ `AXI_TYPEDEF_RESP_T ( slv_resp_t, slv_b_chan_t, slv_r_chan_t)
264
+
265
+ mst_req_t [Cfg.NoMstPorts- 1 : 0 ] mst_reqs;
266
+ mst_resp_t [Cfg.NoMstPorts- 1 : 0 ] mst_resps;
267
+ slv_req_t [Cfg.NoSlvPorts- 1 : 0 ] slv_reqs;
268
+ slv_resp_t [Cfg.NoSlvPorts- 1 : 0 ] slv_resps;
269
+
270
+ for (genvar i = 0 ; i < Cfg.NoMstPorts; i++ ) begin : gen_assign_mst
271
+ `AXI_ASSIGN_FROM_REQ (mst_ports[i], mst_reqs[i] );
272
+ `AXI_ASSIGN_TO_RESP (mst_resps[i], mst_ports[i]);
273
+ end
274
+
275
+ for (genvar i = 0 ; i < Cfg.NoSlvPorts; i++ ) begin : gen_assign_slv
276
+ `AXI_ASSIGN_TO_REQ (slv_reqs[i], slv_ports[i]);
277
+ `AXI_ASSIGN_FROM_RESP (slv_ports[i], slv_resps[i]);
278
+ end
279
+
280
+ axi_xbar # (
281
+ .Cfg (Cfg),
282
+ .slv_aw_chan_t ( slv_aw_chan_t ),
283
+ .mst_aw_chan_t ( mst_aw_chan_t ),
284
+ .w_chan_t ( w_chan_t ),
285
+ .slv_b_chan_t ( slv_b_chan_t ),
286
+ .mst_b_chan_t ( mst_b_chan_t ),
287
+ .slv_ar_chan_t ( slv_ar_chan_t ),
288
+ .mst_ar_chan_t ( mst_ar_chan_t ),
289
+ .slv_r_chan_t ( slv_r_chan_t ),
290
+ .mst_r_chan_t ( mst_r_chan_t ),
291
+ .slv_req_t ( slv_req_t ),
292
+ .slv_resp_t ( slv_resp_t ),
293
+ .mst_req_t ( mst_req_t ),
294
+ .mst_resp_t ( mst_resp_t ),
295
+ .rule_t ( rule_t )
296
+ ) i_xbar (
297
+ .clk_i,
298
+ .rst_ni,
299
+ .test_i,
300
+ .slv_ports_req_i (slv_reqs ),
301
+ .slv_ports_resp_o (slv_resps),
302
+ .mst_ports_req_o (mst_reqs ),
303
+ .mst_ports_resp_i (mst_resps),
304
+ .addr_map_i,
305
+ .en_default_mst_port_i,
306
+ .default_mst_port_i
307
+ );
308
+
309
+ endmodule
0 commit comments