Skip to content

Commit be88928

Browse files
committed
axi_mcast_xbar: Add default port mechanism for multicast transactions
1 parent ffcbdb0 commit be88928

File tree

2 files changed

+22
-19
lines changed

2 files changed

+22
-19
lines changed

src/axi_mcast_demux.sv

+15-5
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ module axi_mcast_demux #(
7575
input logic test_i,
7676
input rule_t [NoAddrRules-1:0] addr_map_i,
7777
input logic en_default_mst_port_i,
78-
input decode_idx_t default_mst_port_i,
78+
input rule_t default_mst_port_i,
7979
// Slave Port
8080
input axi_req_t slv_req_i,
8181
input idx_select_t slv_ar_select_i,
@@ -186,6 +186,7 @@ module axi_mcast_demux #(
186186

187187
// AW address decoder
188188
mask_rule_t [NoMulticastRules-1:0] multicast_rules;
189+
mask_rule_t default_rule;
189190
decode_idx_t dec_aw_idx;
190191
logic dec_aw_idx_valid, dec_aw_idx_error;
191192
logic [NoMulticastPorts-1:0] dec_aw_select_partial;
@@ -311,9 +312,9 @@ module axi_mcast_demux #(
311312
.default_idx_i ('0)
312313
);
313314
end else begin : g_no_aw_idx_decode
314-
assign dec_aw_idx_valid = en_default_mst_port_i & dec_aw_select_error;
315-
assign dec_aw_idx_error = !en_default_mst_port_i;
316-
assign dec_aw_idx = default_mst_port_i;
315+
assign dec_aw_idx_valid = 1'b0;
316+
assign dec_aw_idx_error = 1'b1;
317+
assign dec_aw_idx = '0;
317318
end
318319

319320
// Convert multicast rules to mask (NAPOT) form
@@ -326,6 +327,9 @@ module axi_mcast_demux #(
326327
assign multicast_rules[i].mask = addr_map_i[i].end_addr - addr_map_i[i].start_addr - 1;
327328
assign multicast_rules[i].addr = addr_map_i[i].start_addr;
328329
end
330+
assign default_rule.idx = default_mst_port_i.idx;
331+
assign default_rule.mask = default_mst_port_i.end_addr - default_mst_port_i.start_addr - 1;
332+
assign default_rule.addr = default_mst_port_i.start_addr;
329333

330334
// Compare request against {addr, mask} rules
331335
multiaddr_decode #(
@@ -341,7 +345,9 @@ module axi_mcast_demux #(
341345
.addr_o (dec_aw_addr),
342346
.mask_o (dec_aw_mask),
343347
.dec_valid_o(),
344-
.dec_error_o(dec_aw_select_error)
348+
.dec_error_o(dec_aw_select_error),
349+
.en_default_idx_i(en_default_mst_port_i),
350+
.default_idx_i (default_rule)
345351
);
346352

347353
// Combine output from the two address decoders
@@ -1115,6 +1121,8 @@ module axi_mcast_demux_intf #(
11151121
input logic test_i, // Testmode enable
11161122
input rule_t [NO_MST_PORTS-2:0] addr_map_i,
11171123
input idx_select_t slv_ar_select_i, // has to be stable, when ar_valid
1124+
input logic en_default_mst_port_i,
1125+
input rule_t default_mst_port_i,
11181126
AXI_BUS.Slave slv, // slave port
11191127
AXI_BUS.Master mst [NO_MST_PORTS-1:0] // master ports
11201128
);
@@ -1170,6 +1178,8 @@ module axi_mcast_demux_intf #(
11701178
.rst_ni, // Asynchronous reset active low
11711179
.test_i, // Testmode enable
11721180
.addr_map_i ( addr_map_i ),
1181+
.en_default_mst_port_i ( en_default_mst_port_i ),
1182+
.default_mst_port_i ( default_mst_port_i ),
11731183
// slave port
11741184
.slv_req_i ( slv_req ),
11751185
.slv_ar_select_i ( slv_ar_select_i ),

src/axi_mcast_xbar.sv

+7-14
Original file line numberDiff line numberDiff line change
@@ -82,17 +82,10 @@ import cf_math_pkg::idx_width;
8282
input rule_t [Cfg.NoAddrRules-1:0] addr_map_i,
8383
/// Enable default master port.
8484
input logic [Cfg.NoSlvPorts-1:0] en_default_mst_port_i,
85-
`ifdef VCS
86-
/// Enables a default master port for each slave port. When this is enabled unmapped
87-
/// transactions get issued at the master port given by `default_mst_port_i`.
88-
/// When not used, tie to `'0`.
89-
input logic [Cfg.NoSlvPorts-1:0][MstPortsIdxWidth-1:0] default_mst_port_i
90-
`else
9185
/// Enables a default master port for each slave port. When this is enabled unmapped
9286
/// transactions get issued at the master port given by `default_mst_port_i`.
9387
/// When not used, tie to `'0`.
94-
input logic [Cfg.NoSlvPorts-1:0][idx_width(Cfg.NoMstPorts)-1:0] default_mst_port_i
95-
`endif
88+
input rule_t [Cfg.NoSlvPorts-1:0] default_mst_port_i
9689
);
9790

9891
// Address type for individual address signals
@@ -101,9 +94,13 @@ import cf_math_pkg::idx_width;
10194
`ifdef VCS
10295
localparam int unsigned MstPortsIdxWidthOne =
10396
(Cfg.NoMstPorts == 32'd1) ? 32'd1 : unsigned'($clog2(Cfg.NoMstPorts + 1));
97+
localparam int unsigned MstPortsIdxWidth =
98+
(Cfg.NoMstPorts == 32'd1) ? 32'd1 : unsigned'($clog2(Cfg.NoMstPorts));
10499
typedef logic [MstPortsIdxWidthOne-1:0] mst_port_idx_t;
100+
typedef logic [MstPortsIdxWidth-1:0] mst_port_idx_m1_t;
105101
`else
106102
typedef logic [idx_width(Cfg.NoMstPorts + 1)-1:0] mst_port_idx_t;
103+
typedef logic [idx_width(Cfg.NoMstPorts)-1:0] mst_port_idx_m1_t;
107104
`endif
108105

109106
// signals from the axi_demuxes, one index more for decode error
@@ -122,11 +119,7 @@ import cf_math_pkg::idx_width;
122119
slv_resp_t [Cfg.NoMstPorts-1:0][Cfg.NoSlvPorts-1:0] mst_resps;
123120

124121
for (genvar i = 0; i < Cfg.NoSlvPorts; i++) begin : gen_slv_port_demux
125-
`ifdef VCS
126-
logic [MstPortsIdxWidth-1:0] dec_ar_select;
127-
`else
128-
logic [idx_width(Cfg.NoMstPorts)-1:0] dec_ar_select;
129-
`endif
122+
mst_port_idx_m1_t dec_ar_select;
130123
logic dec_ar_valid, dec_ar_error;
131124
mst_port_idx_t slv_ar_select;
132125

@@ -142,7 +135,7 @@ import cf_math_pkg::idx_width;
142135
.dec_valid_o ( dec_ar_valid ),
143136
.dec_error_o ( dec_ar_error ),
144137
.en_default_idx_i ( en_default_mst_port_i[i] ),
145-
.default_idx_i ( default_mst_port_i[i] )
138+
.default_idx_i ( mst_port_idx_m1_t'(default_mst_port_i[i].idx) )
146139
);
147140
assign slv_ar_select = (dec_ar_error) ?
148141
mst_port_idx_t'(Cfg.NoMstPorts) : mst_port_idx_t'(dec_ar_select);

0 commit comments

Comments
 (0)