@@ -671,12 +671,11 @@ module synth_axi_xbar #(
671
671
parameter int unsigned AxiAddrWidth = 32 , // Axi Address Width
672
672
parameter int unsigned AxiDataWidth = 32 , // Axi Data Width
673
673
parameter int unsigned AxiStrbWidth = AxiDataWidth / 8 ,
674
- parameter int unsigned AxiUserWidth = 5 ,
674
+ parameter int unsigned AxiUserWidth = 32 ,
675
675
// axi types
676
676
parameter type id_mst_t = logic [AxiIdWidthSlaves- 1 : 0 ],
677
677
parameter type id_slv_t = logic [AxiIdWidthMasters- 1 : 0 ],
678
678
parameter type addr_t = logic [AxiAddrWidth- 1 : 0 ],
679
- parameter type rule_t = axi_pkg :: xbar_rule_32_t, // Has to be the same width as axi addr
680
679
parameter type data_t = logic [AxiDataWidth- 1 : 0 ],
681
680
parameter type strb_t = logic [AxiStrbWidth- 1 : 0 ],
682
681
parameter type user_t = logic [AxiUserWidth- 1 : 0 ]
@@ -831,8 +830,15 @@ module synth_axi_xbar #(
831
830
NoAddrRules : NoSlvMst
832
831
} ;
833
832
834
- `AXI_TYPEDEF_AW_CHAN_T (mst_aw_chan_t, addr_t, id_mst_t, user_t)
835
- `AXI_TYPEDEF_AW_CHAN_T (slv_aw_chan_t, addr_t, id_slv_t, user_t)
833
+ typedef struct packed {
834
+ logic [AxiUserWidth- 1 : 0 ] mcast;
835
+ } aw_user_t ;
836
+
837
+ typedef axi_pkg :: xbar_mask_rule_32_t mcast_rule_t ; // Has to be the same width as axi addr
838
+ typedef axi_pkg :: xbar_rule_32_t rule_t ; // Has to be the same width as axi addr
839
+
840
+ `AXI_TYPEDEF_AW_CHAN_T (mst_aw_chan_t, addr_t, id_mst_t, aw_user_t)
841
+ `AXI_TYPEDEF_AW_CHAN_T (slv_aw_chan_t, addr_t, id_slv_t, aw_user_t)
836
842
`AXI_TYPEDEF_W_CHAN_T (w_chan_t, data_t, strb_t, user_t)
837
843
`AXI_TYPEDEF_B_CHAN_T (mst_b_chan_t, id_mst_t, user_t)
838
844
`AXI_TYPEDEF_B_CHAN_T (slv_b_chan_t, id_slv_t, user_t)
@@ -848,6 +854,24 @@ module synth_axi_xbar #(
848
854
`AXI_TYPEDEF_RESP_T (slv_resp_t, slv_b_chan_t, slv_r_chan_t)
849
855
850
856
// TODO colluca: Can the next code block become a one-liner?
857
+ localparam mcast_rule_t [15 : 0 ] mcast_full_addr_map = '{
858
+ '{ addr : 32'h0001_E000 , mask : 32'h0000_1FFF } ,
859
+ '{ addr : 32'h0001_C000 , mask : 32'h0000_1FFF } ,
860
+ '{ addr : 32'h0001_A000 , mask : 32'h0000_1FFF } ,
861
+ '{ addr : 32'h0001_8000 , mask : 32'h0000_1FFF } ,
862
+ '{ addr : 32'h0001_6000 , mask : 32'h0000_1FFF } ,
863
+ '{ addr : 32'h0001_4000 , mask : 32'h0000_1FFF } ,
864
+ '{ addr : 32'h0001_2000 , mask : 32'h0000_1FFF } ,
865
+ '{ addr : 32'h0001_0000 , mask : 32'h0000_1FFF } ,
866
+ '{ addr : 32'h0000_E000 , mask : 32'h0000_1FFF } ,
867
+ '{ addr : 32'h0000_C000 , mask : 32'h0000_1FFF } ,
868
+ '{ addr : 32'h0000_A000 , mask : 32'h0000_1FFF } ,
869
+ '{ addr : 32'h0000_8000 , mask : 32'h0000_1FFF } ,
870
+ '{ addr : 32'h0000_6000 , mask : 32'h0000_1FFF } ,
871
+ '{ addr : 32'h0000_4000 , mask : 32'h0000_1FFF } ,
872
+ '{ addr : 32'h0000_2000 , mask : 32'h0000_1FFF } ,
873
+ '{ addr : 32'h0000_0000 , mask : 32'h0000_1FFF }
874
+ } ;
851
875
localparam rule_t [15 : 0 ] full_addr_map = {
852
876
rule_t'{ idx: 32'd15 , start_addr: 32'h0001_E000 , end_addr: 32'h0002_0000 } ,
853
877
rule_t'{ idx: 32'd14 , start_addr: 32'h0001_C000 , end_addr: 32'h0001_E000 } ,
@@ -866,6 +890,7 @@ module synth_axi_xbar #(
866
890
rule_t'{ idx: 32'd1 , start_addr: 32'h0000_2000 , end_addr: 32'h0000_4000 } ,
867
891
rule_t'{ idx: 32'd0 , start_addr: 32'h0000_0000 , end_addr: 32'h0000_2000 }
868
892
} ;
893
+ localparam mcast_rule_t [xbar_cfg.NoAddrRules- 1 : 0 ] mcast_addr_map = mcast_full_addr_map[xbar_cfg.NoAddrRules- 1 : 0 ];
869
894
localparam rule_t [xbar_cfg.NoAddrRules- 1 : 0 ] addr_map = full_addr_map[xbar_cfg.NoAddrRules- 1 : 0 ];
870
895
871
896
slv_req_t [NoSlvMst- 1 : 0 ] slv_reqs;
@@ -992,7 +1017,7 @@ module synth_axi_xbar #(
992
1017
.slv_resp_t (slv_resp_t),
993
1018
.mst_req_t (mst_req_t),
994
1019
.mst_resp_t (mst_resp_t),
995
- .rule_t (rule_t )
1020
+ .rule_t (mcast_rule_t )
996
1021
) i_xbar_dut (
997
1022
.clk_i (clk_i),
998
1023
.rst_ni (rst_ni),
@@ -1001,7 +1026,7 @@ module synth_axi_xbar #(
1001
1026
.slv_ports_resp_o (slv_resps),
1002
1027
.mst_ports_req_o (mst_reqs),
1003
1028
.mst_ports_resp_i (mst_resps),
1004
- .addr_map_i (addr_map )
1029
+ .addr_map_i (mcast_addr_map )
1005
1030
);
1006
1031
end else begin : g_no_multicast
1007
1032
axi_xbar # (
0 commit comments