Skip to content

Commit 907081d

Browse files
committed
Add support to demux for routing by tdest
1 parent ccbca0c commit 907081d

File tree

4 files changed

+50
-9
lines changed

4 files changed

+50
-9
lines changed

rtl/axis_demux.v

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ module axis_demux #
5454
// Propagate tuser signal
5555
parameter USER_ENABLE = 1,
5656
// tuser signal width
57-
parameter USER_WIDTH = 1
57+
parameter USER_WIDTH = 1,
58+
// route via tdest
59+
parameter TDEST_ROUTE = 0
5860
)
5961
(
6062
input wire clk,
@@ -94,6 +96,21 @@ module axis_demux #
9496

9597
parameter CL_M_COUNT = $clog2(M_COUNT);
9698

99+
// check configuration
100+
initial begin
101+
if (TDEST_ROUTE) begin
102+
if (!DEST_ENABLE) begin
103+
$error("Error: TDEST_ROUTE set requires DEST_ENABLE set (instance %m)");
104+
$finish;
105+
end
106+
107+
if (S_DEST_WIDTH < CL_M_COUNT) begin
108+
$error("Error: S_DEST_WIDTH too small for port count (instance %m)");
109+
$finish;
110+
end
111+
end
112+
end
113+
97114
reg [CL_M_COUNT-1:0] select_reg = {CL_M_COUNT{1'b0}}, select_ctl, select_next;
98115
reg drop_reg = 1'b0, drop_ctl, drop_next;
99116
reg frame_reg = 1'b0, frame_ctl, frame_next;
@@ -133,8 +150,18 @@ always @* begin
133150

134151
if (!frame_reg && s_axis_tvalid && s_axis_tready) begin
135152
// start of frame, grab select value
136-
select_ctl = select;
137-
drop_ctl = drop || select >= M_COUNT;
153+
if (TDEST_ROUTE) begin
154+
if (M_COUNT > 1) begin
155+
select_ctl = s_axis_tdest[S_DEST_WIDTH-1:S_DEST_WIDTH-CL_M_COUNT];
156+
drop_ctl = s_axis_tdest[S_DEST_WIDTH-1:S_DEST_WIDTH-CL_M_COUNT] >= M_COUNT;
157+
end else begin
158+
select_ctl = 0;
159+
drop_ctl = 1'b0;
160+
end
161+
end else begin
162+
select_ctl = select;
163+
drop_ctl = drop || select >= M_COUNT;
164+
end
138165
frame_ctl = 1'b1;
139166
if (!(s_axis_tready && s_axis_tvalid && s_axis_tlast)) begin
140167
select_next = select_ctl;

rtl/axis_demux_wrap.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,9 @@ def generate(ports=4, name=None, output=None):
8989
// Propagate tuser signal
9090
parameter USER_ENABLE = 1,
9191
// tuser signal width
92-
parameter USER_WIDTH = 1
92+
parameter USER_WIDTH = 1,
93+
// route via tdest
94+
parameter TDEST_ROUTE = 0
9395
)
9496
(
9597
input wire clk,
@@ -139,7 +141,8 @@ def generate(ports=4, name=None, output=None):
139141
.S_DEST_WIDTH(S_DEST_WIDTH),
140142
.M_DEST_WIDTH(M_DEST_WIDTH),
141143
.USER_ENABLE(USER_ENABLE),
142-
.USER_WIDTH(USER_WIDTH)
144+
.USER_WIDTH(USER_WIDTH),
145+
.TDEST_ROUTE(TDEST_ROUTE)
143146
)
144147
axis_demux_inst (
145148
.clk(clk),

tb/axis_demux/Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ export PARAM_M_DEST_WIDTH ?= 8
4646
export PARAM_S_DEST_WIDTH ?= $(shell python -c "print($(PARAM_M_DEST_WIDTH) + ($(PARAM_PORTS)-1).bit_length())")
4747
export PARAM_USER_ENABLE ?= 1
4848
export PARAM_USER_WIDTH ?= 1
49+
export PARAM_TDEST_ROUTE ?= 1
4950

5051
ifeq ($(SIM), icarus)
5152
PLUSARGS += -fst
@@ -60,6 +61,7 @@ ifeq ($(SIM), icarus)
6061
COMPILE_ARGS += -P $(TOPLEVEL).M_DEST_WIDTH=$(PARAM_M_DEST_WIDTH)
6162
COMPILE_ARGS += -P $(TOPLEVEL).USER_ENABLE=$(PARAM_USER_ENABLE)
6263
COMPILE_ARGS += -P $(TOPLEVEL).USER_WIDTH=$(PARAM_USER_WIDTH)
64+
COMPILE_ARGS += -P $(TOPLEVEL).TDEST_ROUTE=$(PARAM_TDEST_ROUTE)
6365

6466
ifeq ($(WAVES), 1)
6567
VERILOG_SOURCES += iverilog_dump.v
@@ -78,6 +80,7 @@ else ifeq ($(SIM), verilator)
7880
COMPILE_ARGS += -GM_DEST_WIDTH=$(PARAM_M_DEST_WIDTH)
7981
COMPILE_ARGS += -GUSER_ENABLE=$(PARAM_USER_ENABLE)
8082
COMPILE_ARGS += -GUSER_WIDTH=$(PARAM_USER_WIDTH)
83+
COMPILE_ARGS += -GTDEST_ROUTE=$(PARAM_TDEST_ROUTE)
8184

8285
ifeq ($(WAVES), 1)
8386
COMPILE_ARGS += --trace-fst

tb/axis_demux/test_axis_demux.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,13 @@ async def run_test(dut, payload_lengths=None, payload_data=None, idle_inserter=N
8282

8383
tb = TB(dut)
8484

85-
id_count = 2**len(tb.source.bus.tid)
85+
id_width = len(tb.source.bus.tid)
86+
id_count = 2**id_width
87+
id_mask = id_count-1
88+
89+
dest_width = len(tb.sink[0].bus.tid)
90+
dest_count = 2**dest_width
91+
dest_mask = dest_count-1
8692

8793
cur_id = 1
8894

@@ -100,7 +106,7 @@ async def run_test(dut, payload_lengths=None, payload_data=None, idle_inserter=N
100106
for test_data in [payload_data(x) for x in payload_lengths()]:
101107
test_frame = AxiStreamFrame(test_data)
102108
test_frame.tid = cur_id
103-
test_frame.tdest = cur_id
109+
test_frame.tdest = cur_id | (port << dest_width)
104110

105111
test_frames.append(test_frame)
106112
await tb.source.send(test_frame)
@@ -112,7 +118,7 @@ async def run_test(dut, payload_lengths=None, payload_data=None, idle_inserter=N
112118

113119
assert rx_frame.tdata == test_frame.tdata
114120
assert rx_frame.tid == test_frame.tid
115-
assert rx_frame.tdest == test_frame.tdest
121+
assert rx_frame.tdest == (test_frame.tdest & dest_mask)
116122
assert not rx_frame.tuser
117123

118124
assert tb.sink[port].empty()
@@ -154,9 +160,10 @@ def incrementing_payload(length):
154160
rtl_dir = os.path.abspath(os.path.join(tests_dir, '..', '..', 'rtl'))
155161

156162

163+
@pytest.mark.parametrize("tdest_route", [0, 1])
157164
@pytest.mark.parametrize("data_width", [8, 16, 32])
158165
@pytest.mark.parametrize("ports", [4])
159-
def test_axis_demux(request, ports, data_width):
166+
def test_axis_demux(request, ports, data_width, tdest_route):
160167
dut = "axis_demux"
161168
wrapper = f"{dut}_wrap_{ports}"
162169
module = os.path.splitext(os.path.basename(__file__))[0]
@@ -187,6 +194,7 @@ def test_axis_demux(request, ports, data_width):
187194
parameters['S_DEST_WIDTH'] = parameters['M_DEST_WIDTH'] + (ports-1).bit_length()
188195
parameters['USER_ENABLE'] = 1
189196
parameters['USER_WIDTH'] = 1
197+
parameters['TDEST_ROUTE'] = tdest_route
190198

191199
extra_env = {f'PARAM_{k}': str(v) for k, v in parameters.items()}
192200

0 commit comments

Comments
 (0)