Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit cb7a57b

Browse files
committedAug 14, 2022
axi_mcast_xbar: Add basic multicast logic
Basic version of the multicast logic. Demux does not accept any multicast transaction if there is any outstanding transaction and no transaction is accepted as long as there is an outstanding multicast transaction.
1 parent bc2ad40 commit cb7a57b

File tree

6 files changed

+299
-159
lines changed

6 files changed

+299
-159
lines changed
 

‎scripts/run_vsim.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,8 @@ exec_test() {
181181
for Atop in 0; do
182182
# for Exclusive in 0 1; do
183183
for Exclusive in 0; do
184-
for UniqueIds in 0 1; do
184+
# for UniqueIds in 0 1; do
185+
for UniqueIds in 0; do
185186
call_vsim tb_axi_mcast_xbar -gTbNumMst=$NumMst -gTbNumSlv=$NumSlv \
186187
-gTbEnAtop=$Atop -gTbEnExcl=$Exclusive \
187188
-gTbUniqueIds=$UniqueIds

‎src/axi_mcast_demux.sv

Lines changed: 256 additions & 149 deletions
Large diffs are not rendered by default.

‎src/axi_pkg.sv

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,4 +420,10 @@ package axi_pkg;
420420
logic [31:0] start_addr;
421421
logic [31:0] end_addr;
422422
} xbar_rule_32_t;
423+
424+
/// Commonly used rule types for `axi_xbar` (32-bit addresses).
425+
typedef struct packed {
426+
logic [31:0] addr;
427+
logic [31:0] mask;
428+
} xbar_mask_rule_32_t;
423429
endpackage

‎test/axi_synth_bench.sv

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -671,12 +671,11 @@ module synth_axi_xbar #(
671671
parameter int unsigned AxiAddrWidth = 32, // Axi Address Width
672672
parameter int unsigned AxiDataWidth = 32, // Axi Data Width
673673
parameter int unsigned AxiStrbWidth = AxiDataWidth / 8,
674-
parameter int unsigned AxiUserWidth = 5,
674+
parameter int unsigned AxiUserWidth = 32,
675675
// axi types
676676
parameter type id_mst_t = logic [AxiIdWidthSlaves-1:0],
677677
parameter type id_slv_t = logic [AxiIdWidthMasters-1:0],
678678
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
680679
parameter type data_t = logic [AxiDataWidth-1:0],
681680
parameter type strb_t = logic [AxiStrbWidth-1:0],
682681
parameter type user_t = logic [AxiUserWidth-1:0]
@@ -831,8 +830,15 @@ module synth_axi_xbar #(
831830
NoAddrRules: NoSlvMst
832831
};
833832

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)
836842
`AXI_TYPEDEF_W_CHAN_T(w_chan_t, data_t, strb_t, user_t)
837843
`AXI_TYPEDEF_B_CHAN_T(mst_b_chan_t, id_mst_t, user_t)
838844
`AXI_TYPEDEF_B_CHAN_T(slv_b_chan_t, id_slv_t, user_t)
@@ -848,6 +854,24 @@ module synth_axi_xbar #(
848854
`AXI_TYPEDEF_RESP_T(slv_resp_t, slv_b_chan_t, slv_r_chan_t)
849855

850856
// 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+
};
851875
localparam rule_t [15:0] full_addr_map = {
852876
rule_t'{idx: 32'd15, start_addr: 32'h0001_E000, end_addr: 32'h0002_0000},
853877
rule_t'{idx: 32'd14, start_addr: 32'h0001_C000, end_addr: 32'h0001_E000},
@@ -866,6 +890,7 @@ module synth_axi_xbar #(
866890
rule_t'{idx: 32'd1, start_addr: 32'h0000_2000, end_addr: 32'h0000_4000},
867891
rule_t'{idx: 32'd0, start_addr: 32'h0000_0000, end_addr: 32'h0000_2000}
868892
};
893+
localparam mcast_rule_t [xbar_cfg.NoAddrRules-1:0] mcast_addr_map = mcast_full_addr_map[xbar_cfg.NoAddrRules-1:0];
869894
localparam rule_t [xbar_cfg.NoAddrRules-1:0] addr_map = full_addr_map[xbar_cfg.NoAddrRules-1:0];
870895

871896
slv_req_t [NoSlvMst-1:0] slv_reqs;
@@ -992,7 +1017,7 @@ module synth_axi_xbar #(
9921017
.slv_resp_t (slv_resp_t),
9931018
.mst_req_t (mst_req_t),
9941019
.mst_resp_t (mst_resp_t),
995-
.rule_t (rule_t)
1020+
.rule_t (mcast_rule_t)
9961021
) i_xbar_dut (
9971022
.clk_i (clk_i),
9981023
.rst_ni (rst_ni),
@@ -1001,7 +1026,7 @@ module synth_axi_xbar #(
10011026
.slv_ports_resp_o (slv_resps),
10021027
.mst_ports_req_o (mst_reqs),
10031028
.mst_ports_resp_i (mst_resps),
1004-
.addr_map_i (addr_map )
1029+
.addr_map_i (mcast_addr_map)
10051030
);
10061031
end else begin : g_no_multicast
10071032
axi_xbar #(

‎test/tb_axi_mcast_xbar.sv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ module tb_axi_mcast_xbar #(
215215
axi_rand_master[i].add_memory_region(0,
216216
xbar_cfg.NoAddrRules * 32'h0000_2000,
217217
axi_pkg::DEVICE_NONBUFFERABLE);
218-
axi_rand_master[i].set_multicast_probability(0);
218+
axi_rand_master[i].set_multicast_probability(1);
219219
axi_rand_master[i].reset();
220220
@(posedge rst_n);
221221
axi_rand_master[i].run(NoReads, NoWrites);

‎test/tb_axi_mcast_xbar_pkg.sv

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,9 @@ package tb_axi_mcast_xbar_pkg;
196196
decerr = num_slaves_matched == 0;
197197
if (num_slaves_matched > 1 || decerr) begin
198198
$display("MULTICAST occur: %b, %b", aw_addr, aw_mcast);
199+
$display("Matched %0d slaves", num_slaves_matched);
199200
for (int j = 0; j < NoSlaves; j++) begin
200-
$display("Slave %0d AddrMap: %b, %b", j, AddrMap[j].addr, AddrMap[j].mask);
201+
$display(" Slave %0d AddrMap: %b, %b", j, AddrMap[j].addr, AddrMap[j].mask);
201202
end
202203
end
203204

@@ -208,7 +209,7 @@ package tb_axi_mcast_xbar_pkg;
208209
$time, i, masters_axi[i].aw_id);
209210
end else begin
210211
exp_aw_id = {idx_mst_t'(i), masters_axi[i].aw_id};
211-
for (int j = 0; j < to_slave_idx.size(); j++) begin
212+
for (int j = 0; j < num_slaves_matched; j++) begin
212213
automatic idx_slv_t slave_idx = to_slave_idx.pop_front();
213214
// $display("Test exp aw_id: %b",exp_aw_id);
214215
exp_aw = '{slv_axi_id: exp_aw_id,

0 commit comments

Comments
 (0)
Please sign in to comment.