@@ -47,47 +47,49 @@ module axis_demux #
4747 parameter ID_WIDTH = 8 ,
4848 // Propagate tdest signal
4949 parameter DEST_ENABLE = 0 ,
50- // tdest signal width
51- parameter DEST_WIDTH = 8 ,
50+ // output tdest signal width
51+ parameter M_DEST_WIDTH = 8 ,
52+ // input tdest signal width
53+ parameter S_DEST_WIDTH = M_DEST_WIDTH+ $clog2(M_COUNT),
5254 // Propagate tuser signal
5355 parameter USER_ENABLE = 1 ,
5456 // tuser signal width
5557 parameter USER_WIDTH = 1
5658)
5759(
58- input wire clk,
59- input wire rst,
60+ input wire clk,
61+ input wire rst,
6062
6163 /*
6264 * AXI input
6365 */
64- input wire [DATA_WIDTH- 1 :0 ] s_axis_tdata,
65- input wire [KEEP_WIDTH- 1 :0 ] s_axis_tkeep,
66- input wire s_axis_tvalid,
67- output wire s_axis_tready,
68- input wire s_axis_tlast,
69- input wire [ID_WIDTH- 1 :0 ] s_axis_tid,
70- input wire [DEST_WIDTH - 1 :0 ] s_axis_tdest,
71- input wire [USER_WIDTH- 1 :0 ] s_axis_tuser,
66+ input wire [DATA_WIDTH- 1 :0 ] s_axis_tdata,
67+ input wire [KEEP_WIDTH- 1 :0 ] s_axis_tkeep,
68+ input wire s_axis_tvalid,
69+ output wire s_axis_tready,
70+ input wire s_axis_tlast,
71+ input wire [ID_WIDTH- 1 :0 ] s_axis_tid,
72+ input wire [S_DEST_WIDTH - 1 :0 ] s_axis_tdest,
73+ input wire [USER_WIDTH- 1 :0 ] s_axis_tuser,
7274
7375 /*
7476 * AXI outputs
7577 */
76- output wire [M_COUNT* DATA_WIDTH- 1 :0 ] m_axis_tdata,
77- output wire [M_COUNT* KEEP_WIDTH- 1 :0 ] m_axis_tkeep,
78- output wire [M_COUNT- 1 :0 ] m_axis_tvalid,
79- input wire [M_COUNT- 1 :0 ] m_axis_tready,
80- output wire [M_COUNT- 1 :0 ] m_axis_tlast,
81- output wire [M_COUNT* ID_WIDTH- 1 :0 ] m_axis_tid,
82- output wire [M_COUNT* DEST_WIDTH - 1 :0 ] m_axis_tdest,
83- output wire [M_COUNT* USER_WIDTH- 1 :0 ] m_axis_tuser,
78+ output wire [M_COUNT* DATA_WIDTH- 1 :0 ] m_axis_tdata,
79+ output wire [M_COUNT* KEEP_WIDTH- 1 :0 ] m_axis_tkeep,
80+ output wire [M_COUNT- 1 :0 ] m_axis_tvalid,
81+ input wire [M_COUNT- 1 :0 ] m_axis_tready,
82+ output wire [M_COUNT- 1 :0 ] m_axis_tlast,
83+ output wire [M_COUNT* ID_WIDTH- 1 :0 ] m_axis_tid,
84+ output wire [M_COUNT* M_DEST_WIDTH - 1 :0 ] m_axis_tdest,
85+ output wire [M_COUNT* USER_WIDTH- 1 :0 ] m_axis_tuser,
8486
8587 /*
8688 * Control
8789 */
88- input wire enable,
89- input wire drop,
90- input wire [$clog2(M_COUNT)- 1 :0 ] select
90+ input wire enable,
91+ input wire drop,
92+ input wire [$clog2(M_COUNT)- 1 :0 ] select
9193);
9294
9395parameter CL_M_COUNT = $clog2(M_COUNT);
@@ -99,15 +101,15 @@ reg frame_reg = 1'b0, frame_ctl, frame_next;
99101reg s_axis_tready_reg = 1'b0 , s_axis_tready_next;
100102
101103// internal datapath
102- reg [DATA_WIDTH- 1 :0 ] m_axis_tdata_int;
103- reg [KEEP_WIDTH- 1 :0 ] m_axis_tkeep_int;
104- reg [M_COUNT- 1 :0 ] m_axis_tvalid_int;
105- reg m_axis_tready_int_reg = 1'b0 ;
106- reg m_axis_tlast_int;
107- reg [ID_WIDTH- 1 :0 ] m_axis_tid_int;
108- reg [DEST_WIDTH - 1 :0 ] m_axis_tdest_int;
109- reg [USER_WIDTH- 1 :0 ] m_axis_tuser_int;
110- wire m_axis_tready_int_early;
104+ reg [DATA_WIDTH- 1 :0 ] m_axis_tdata_int;
105+ reg [KEEP_WIDTH- 1 :0 ] m_axis_tkeep_int;
106+ reg [M_COUNT- 1 :0 ] m_axis_tvalid_int;
107+ reg m_axis_tready_int_reg = 1'b0 ;
108+ reg m_axis_tlast_int;
109+ reg [ID_WIDTH- 1 :0 ] m_axis_tid_int;
110+ reg [M_DEST_WIDTH - 1 :0 ] m_axis_tdest_int;
111+ reg [USER_WIDTH- 1 :0 ] m_axis_tuser_int;
112+ wire m_axis_tready_int_early;
111113
112114assign s_axis_tready = s_axis_tready_reg && enable;
113115
@@ -167,21 +169,21 @@ always @(posedge clk) begin
167169end
168170
169171// output datapath logic
170- reg [DATA_WIDTH- 1 :0 ] m_axis_tdata_reg = {DATA_WIDTH{1'b0 }};
171- reg [KEEP_WIDTH- 1 :0 ] m_axis_tkeep_reg = {KEEP_WIDTH{1'b0 }};
172- reg [M_COUNT- 1 :0 ] m_axis_tvalid_reg = {M_COUNT{1'b0 }}, m_axis_tvalid_next;
173- reg m_axis_tlast_reg = 1'b0 ;
174- reg [ID_WIDTH- 1 :0 ] m_axis_tid_reg = {ID_WIDTH{1'b0 }};
175- reg [DEST_WIDTH - 1 :0 ] m_axis_tdest_reg = {DEST_WIDTH {1'b0 }};
176- reg [USER_WIDTH- 1 :0 ] m_axis_tuser_reg = {USER_WIDTH{1'b0 }};
177-
178- reg [DATA_WIDTH- 1 :0 ] temp_m_axis_tdata_reg = {DATA_WIDTH{1'b0 }};
179- reg [KEEP_WIDTH- 1 :0 ] temp_m_axis_tkeep_reg = {KEEP_WIDTH{1'b0 }};
180- reg [M_COUNT- 1 :0 ] temp_m_axis_tvalid_reg = {M_COUNT{1'b0 }}, temp_m_axis_tvalid_next;
181- reg temp_m_axis_tlast_reg = 1'b0 ;
182- reg [ID_WIDTH- 1 :0 ] temp_m_axis_tid_reg = {ID_WIDTH{1'b0 }};
183- reg [DEST_WIDTH - 1 :0 ] temp_m_axis_tdest_reg = {DEST_WIDTH {1'b0 }};
184- reg [USER_WIDTH- 1 :0 ] temp_m_axis_tuser_reg = {USER_WIDTH{1'b0 }};
172+ reg [DATA_WIDTH- 1 :0 ] m_axis_tdata_reg = {DATA_WIDTH{1'b0 }};
173+ reg [KEEP_WIDTH- 1 :0 ] m_axis_tkeep_reg = {KEEP_WIDTH{1'b0 }};
174+ reg [M_COUNT- 1 :0 ] m_axis_tvalid_reg = {M_COUNT{1'b0 }}, m_axis_tvalid_next;
175+ reg m_axis_tlast_reg = 1'b0 ;
176+ reg [ID_WIDTH- 1 :0 ] m_axis_tid_reg = {ID_WIDTH{1'b0 }};
177+ reg [M_DEST_WIDTH - 1 :0 ] m_axis_tdest_reg = {M_DEST_WIDTH {1'b0 }};
178+ reg [USER_WIDTH- 1 :0 ] m_axis_tuser_reg = {USER_WIDTH{1'b0 }};
179+
180+ reg [DATA_WIDTH- 1 :0 ] temp_m_axis_tdata_reg = {DATA_WIDTH{1'b0 }};
181+ reg [KEEP_WIDTH- 1 :0 ] temp_m_axis_tkeep_reg = {KEEP_WIDTH{1'b0 }};
182+ reg [M_COUNT- 1 :0 ] temp_m_axis_tvalid_reg = {M_COUNT{1'b0 }}, temp_m_axis_tvalid_next;
183+ reg temp_m_axis_tlast_reg = 1'b0 ;
184+ reg [ID_WIDTH- 1 :0 ] temp_m_axis_tid_reg = {ID_WIDTH{1'b0 }};
185+ reg [M_DEST_WIDTH - 1 :0 ] temp_m_axis_tdest_reg = {M_DEST_WIDTH {1'b0 }};
186+ reg [USER_WIDTH- 1 :0 ] temp_m_axis_tuser_reg = {USER_WIDTH{1'b0 }};
185187
186188// datapath control
187189reg store_axis_int_to_output;
@@ -193,7 +195,7 @@ assign m_axis_tkeep = KEEP_ENABLE ? {M_COUNT{m_axis_tkeep_reg}} : {M_COUNT*KEEP
193195assign m_axis_tvalid = m_axis_tvalid_reg;
194196assign m_axis_tlast = {M_COUNT{m_axis_tlast_reg}};
195197assign m_axis_tid = ID_ENABLE ? {M_COUNT{m_axis_tid_reg}} : {M_COUNT* ID_WIDTH{1'b0 }};
196- assign m_axis_tdest = DEST_ENABLE ? {M_COUNT{m_axis_tdest_reg}} : {M_COUNT* DEST_WIDTH {1'b0 }};
198+ assign m_axis_tdest = DEST_ENABLE ? {M_COUNT{m_axis_tdest_reg}} : {M_COUNT* M_DEST_WIDTH {1'b0 }};
197199assign m_axis_tuser = USER_ENABLE ? {M_COUNT{m_axis_tuser_reg}} : {M_COUNT* USER_WIDTH{1'b0 }};
198200
199201// enable ready input next cycle if output is ready or the temp reg will not be filled on the next cycle (output reg empty or no input)
0 commit comments