Skip to content

Commit 644e19d

Browse files
committed
merged changes in axis
2 parents 274831c + 9af987d commit 644e19d

18 files changed

+305
-277
lines changed

lib/axis/rtl/arbiter.v

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,16 +141,16 @@ always @* begin
141141
end
142142

143143
always @(posedge clk) begin
144+
grant_reg <= grant_next;
145+
grant_valid_reg <= grant_valid_next;
146+
grant_encoded_reg <= grant_encoded_next;
147+
mask_reg <= mask_next;
148+
144149
if (rst) begin
145150
grant_reg <= 0;
146151
grant_valid_reg <= 0;
147152
grant_encoded_reg <= 0;
148153
mask_reg <= 0;
149-
end else begin
150-
grant_reg <= grant_next;
151-
grant_valid_reg <= grant_valid_next;
152-
grant_encoded_reg <= grant_encoded_next;
153-
mask_reg <= mask_next;
154154
end
155155
end
156156

lib/axis/rtl/axis_adapter.v

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -484,8 +484,8 @@ assign m_axis_tid = ID_ENABLE ? m_axis_tid_reg : {ID_WIDTH{1'b0}};
484484
assign m_axis_tdest = DEST_ENABLE ? m_axis_tdest_reg : {DEST_WIDTH{1'b0}};
485485
assign m_axis_tuser = USER_ENABLE ? m_axis_tuser_reg : {USER_WIDTH{1'b0}};
486486

487-
// 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)
488-
assign m_axis_tready_int_early = m_axis_tready || (!temp_m_axis_tvalid_reg && (!m_axis_tvalid_reg || !m_axis_tvalid_int));
487+
// enable ready input next cycle if temp register is empty and output register will be available
488+
assign m_axis_tready_int_early = !temp_m_axis_tvalid_reg && (!m_axis_tvalid_reg || m_axis_tready);
489489

490490
always @* begin
491491
// transfer sink ready state to source
@@ -516,15 +516,9 @@ always @* begin
516516
end
517517

518518
always @(posedge clk) begin
519-
if (rst) begin
520-
m_axis_tvalid_reg <= 1'b0;
521-
m_axis_tready_int_reg <= 1'b0;
522-
temp_m_axis_tvalid_reg <= 1'b0;
523-
end else begin
524-
m_axis_tvalid_reg <= m_axis_tvalid_next;
525-
m_axis_tready_int_reg <= m_axis_tready_int_early;
526-
temp_m_axis_tvalid_reg <= temp_m_axis_tvalid_next;
527-
end
519+
m_axis_tvalid_reg <= m_axis_tvalid_next;
520+
m_axis_tready_int_reg <= m_axis_tready_int_early;
521+
temp_m_axis_tvalid_reg <= temp_m_axis_tvalid_next;
528522

529523
// datapath
530524
if (store_axis_int_to_output) begin
@@ -551,6 +545,12 @@ always @(posedge clk) begin
551545
temp_m_axis_tdest_reg <= m_axis_tdest_int;
552546
temp_m_axis_tuser_reg <= m_axis_tuser_int;
553547
end
548+
549+
if (rst) begin
550+
m_axis_tvalid_reg <= 1'b0;
551+
m_axis_tready_int_reg <= 1'b0;
552+
temp_m_axis_tvalid_reg <= 1'b0;
553+
end
554554
end
555555

556556
endmodule

lib/axis/rtl/axis_arb_mux.v

Lines changed: 51 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,15 @@ wire [S_COUNT-1:0] grant;
118118
wire grant_valid;
119119
wire [CL_S_COUNT-1:0] grant_encoded;
120120

121+
// input registers to pipeline arbitration delay
122+
reg [S_COUNT*DATA_WIDTH-1:0] s_axis_tdata_reg = 0;
123+
reg [S_COUNT*KEEP_WIDTH-1:0] s_axis_tkeep_reg = 0;
124+
reg [S_COUNT-1:0] s_axis_tvalid_reg = 0;
125+
reg [S_COUNT-1:0] s_axis_tlast_reg = 0;
126+
reg [S_COUNT*S_ID_WIDTH-1:0] s_axis_tid_reg = 0;
127+
reg [S_COUNT*DEST_WIDTH-1:0] s_axis_tdest_reg = 0;
128+
reg [S_COUNT*USER_WIDTH-1:0] s_axis_tuser_reg = 0;
129+
121130
// internal datapath
122131
reg [DATA_WIDTH-1:0] m_axis_tdata_int;
123132
reg [KEEP_WIDTH-1:0] m_axis_tkeep_int;
@@ -129,17 +138,17 @@ reg [DEST_WIDTH-1:0] m_axis_tdest_int;
129138
reg [USER_WIDTH-1:0] m_axis_tuser_int;
130139
wire m_axis_tready_int_early;
131140

132-
assign s_axis_tready = (m_axis_tready_int_reg && grant_valid) << grant_encoded;
141+
assign s_axis_tready = ~s_axis_tvalid_reg | ({S_COUNT{m_axis_tready_int_reg}} & grant);
133142

134143
// mux for incoming packet
135-
wire [DATA_WIDTH-1:0] current_s_tdata = s_axis_tdata[grant_encoded*DATA_WIDTH +: DATA_WIDTH];
136-
wire [KEEP_WIDTH-1:0] current_s_tkeep = s_axis_tkeep[grant_encoded*KEEP_WIDTH +: KEEP_WIDTH];
137-
wire current_s_tvalid = s_axis_tvalid[grant_encoded];
144+
wire [DATA_WIDTH-1:0] current_s_tdata = s_axis_tdata_reg[grant_encoded*DATA_WIDTH +: DATA_WIDTH];
145+
wire [KEEP_WIDTH-1:0] current_s_tkeep = s_axis_tkeep_reg[grant_encoded*KEEP_WIDTH +: KEEP_WIDTH];
146+
wire current_s_tvalid = s_axis_tvalid_reg[grant_encoded];
138147
wire current_s_tready = s_axis_tready[grant_encoded];
139-
wire current_s_tlast = s_axis_tlast[grant_encoded];
140-
wire [S_ID_WIDTH-1:0] current_s_tid = s_axis_tid[grant_encoded*S_ID_WIDTH +: S_ID_WIDTH_INT];
141-
wire [DEST_WIDTH-1:0] current_s_tdest = s_axis_tdest[grant_encoded*DEST_WIDTH +: DEST_WIDTH];
142-
wire [USER_WIDTH-1:0] current_s_tuser = s_axis_tuser[grant_encoded*USER_WIDTH +: USER_WIDTH];
148+
wire current_s_tlast = s_axis_tlast_reg[grant_encoded];
149+
wire [S_ID_WIDTH-1:0] current_s_tid = s_axis_tid_reg[grant_encoded*S_ID_WIDTH +: S_ID_WIDTH_INT];
150+
wire [DEST_WIDTH-1:0] current_s_tdest = s_axis_tdest_reg[grant_encoded*DEST_WIDTH +: DEST_WIDTH];
151+
wire [USER_WIDTH-1:0] current_s_tuser = s_axis_tuser_reg[grant_encoded*USER_WIDTH +: USER_WIDTH];
143152

144153
// arbiter instance
145154
arbiter #(
@@ -159,8 +168,8 @@ arb_inst (
159168
.grant_encoded(grant_encoded)
160169
);
161170

162-
assign request = s_axis_tvalid & ~grant;
163-
assign acknowledge = grant & s_axis_tvalid & s_axis_tready & (LAST_ENABLE ? s_axis_tlast : {S_COUNT{1'b1}});
171+
assign request = (s_axis_tvalid_reg & ~grant) | (s_axis_tvalid & grant);
172+
assign acknowledge = grant & s_axis_tvalid_reg & {S_COUNT{m_axis_tready_int_reg}} & (LAST_ENABLE ? s_axis_tlast_reg : {S_COUNT{1'b1}});
164173

165174
always @* begin
166175
// pass through selected packet data
@@ -176,6 +185,27 @@ always @* begin
176185
m_axis_tuser_int = current_s_tuser;
177186
end
178187

188+
integer i;
189+
190+
always @(posedge clk) begin
191+
// register inputs
192+
for (i = 0; i < S_COUNT; i = i + 1) begin
193+
if (s_axis_tready[i]) begin
194+
s_axis_tdata_reg[i*DATA_WIDTH +: DATA_WIDTH] <= s_axis_tdata[i*DATA_WIDTH +: DATA_WIDTH];
195+
s_axis_tkeep_reg[i*KEEP_WIDTH +: KEEP_WIDTH] <= s_axis_tkeep[i*KEEP_WIDTH +: KEEP_WIDTH];
196+
s_axis_tvalid_reg[i] <= s_axis_tvalid[i];
197+
s_axis_tlast_reg[i] <= s_axis_tlast[i];
198+
s_axis_tid_reg[i*S_ID_WIDTH +: S_ID_WIDTH_INT] <= s_axis_tid[i*S_ID_WIDTH +: S_ID_WIDTH_INT];
199+
s_axis_tdest_reg[i*DEST_WIDTH +: DEST_WIDTH] <= s_axis_tdest[i*DEST_WIDTH +: DEST_WIDTH];
200+
s_axis_tuser_reg[i*USER_WIDTH +: USER_WIDTH] <= s_axis_tuser[i*USER_WIDTH +: USER_WIDTH];
201+
end
202+
end
203+
204+
if (rst) begin
205+
s_axis_tvalid_reg <= 0;
206+
end
207+
end
208+
179209
// output datapath logic
180210
reg [DATA_WIDTH-1:0] m_axis_tdata_reg = {DATA_WIDTH{1'b0}};
181211
reg [KEEP_WIDTH-1:0] m_axis_tkeep_reg = {KEEP_WIDTH{1'b0}};
@@ -206,8 +236,8 @@ assign m_axis_tid = ID_ENABLE ? m_axis_tid_reg : {M_ID_WIDTH{1'b0}};
206236
assign m_axis_tdest = DEST_ENABLE ? m_axis_tdest_reg : {DEST_WIDTH{1'b0}};
207237
assign m_axis_tuser = USER_ENABLE ? m_axis_tuser_reg : {USER_WIDTH{1'b0}};
208238

209-
// 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)
210-
assign m_axis_tready_int_early = m_axis_tready || (!temp_m_axis_tvalid_reg && (!m_axis_tvalid_reg || !m_axis_tvalid_int));
239+
// enable ready input next cycle if temp register is empty and output register will be available
240+
assign m_axis_tready_int_early = !temp_m_axis_tvalid_reg && (!m_axis_tvalid_reg || m_axis_tready);
211241

212242
always @* begin
213243
// transfer sink ready state to source
@@ -238,15 +268,9 @@ always @* begin
238268
end
239269

240270
always @(posedge clk) begin
241-
if (rst) begin
242-
m_axis_tvalid_reg <= 1'b0;
243-
m_axis_tready_int_reg <= 1'b0;
244-
temp_m_axis_tvalid_reg <= 1'b0;
245-
end else begin
246-
m_axis_tvalid_reg <= m_axis_tvalid_next;
247-
m_axis_tready_int_reg <= m_axis_tready_int_early;
248-
temp_m_axis_tvalid_reg <= temp_m_axis_tvalid_next;
249-
end
271+
m_axis_tvalid_reg <= m_axis_tvalid_next;
272+
m_axis_tready_int_reg <= m_axis_tready_int_early;
273+
temp_m_axis_tvalid_reg <= temp_m_axis_tvalid_next;
250274

251275
// datapath
252276
if (store_axis_int_to_output) begin
@@ -273,6 +297,12 @@ always @(posedge clk) begin
273297
temp_m_axis_tdest_reg <= m_axis_tdest_int;
274298
temp_m_axis_tuser_reg <= m_axis_tuser_int;
275299
end
300+
301+
if (rst) begin
302+
m_axis_tvalid_reg <= 1'b0;
303+
m_axis_tready_int_reg <= 1'b0;
304+
temp_m_axis_tvalid_reg <= 1'b0;
305+
end
276306
end
277307

278308
endmodule

lib/axis/rtl/axis_broadcast.v

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,8 @@ assign m_axis_tid = ID_ENABLE ? {M_COUNT{m_axis_tid_reg}} : {M_COUNT*ID_W
121121
assign m_axis_tdest = DEST_ENABLE ? {M_COUNT{m_axis_tdest_reg}} : {M_COUNT*DEST_WIDTH{1'b0}};
122122
assign m_axis_tuser = USER_ENABLE ? {M_COUNT{m_axis_tuser_reg}} : {M_COUNT*USER_WIDTH{1'b0}};
123123

124-
// 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)
125-
wire s_axis_tready_early = ((m_axis_tready & m_axis_tvalid) == m_axis_tvalid) || (!temp_m_axis_tvalid_reg && (!m_axis_tvalid || !s_axis_tvalid));
124+
// enable ready input next cycle if temp register is empty and output register will be available
125+
wire s_axis_tready_early = !temp_m_axis_tvalid_reg && (!m_axis_tvalid || ((m_axis_tready & m_axis_tvalid) == m_axis_tvalid));
126126

127127
always @* begin
128128
// transfer sink ready state to source
@@ -153,15 +153,9 @@ always @* begin
153153
end
154154

155155
always @(posedge clk) begin
156-
if (rst) begin
157-
s_axis_tready_reg <= 1'b0;
158-
m_axis_tvalid_reg <= {M_COUNT{1'b0}};
159-
temp_m_axis_tvalid_reg <= {M_COUNT{1'b0}};
160-
end else begin
161-
s_axis_tready_reg <= s_axis_tready_early;
162-
m_axis_tvalid_reg <= m_axis_tvalid_next;
163-
temp_m_axis_tvalid_reg <= temp_m_axis_tvalid_next;
164-
end
156+
s_axis_tready_reg <= s_axis_tready_early;
157+
m_axis_tvalid_reg <= m_axis_tvalid_next;
158+
temp_m_axis_tvalid_reg <= temp_m_axis_tvalid_next;
165159

166160
// datapath
167161
if (store_axis_input_to_output) begin
@@ -188,6 +182,12 @@ always @(posedge clk) begin
188182
temp_m_axis_tdest_reg <= s_axis_tdest;
189183
temp_m_axis_tuser_reg <= s_axis_tuser;
190184
end
185+
186+
if (rst) begin
187+
s_axis_tready_reg <= 1'b0;
188+
m_axis_tvalid_reg <= {M_COUNT{1'b0}};
189+
temp_m_axis_tvalid_reg <= {M_COUNT{1'b0}};
190+
end
191191
end
192192

193193
endmodule

lib/axis/rtl/axis_cobs_decode.v

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -230,20 +230,21 @@ always @* begin
230230
end
231231

232232
always @(posedge clk) begin
233+
state_reg <= state_next;
234+
235+
count_reg <= count_next;
236+
suppress_zero_reg <= suppress_zero_next;
237+
238+
temp_tdata_reg <= temp_tdata_next;
239+
temp_tvalid_reg <= temp_tvalid_next;
240+
241+
s_axis_tready_reg <= s_axis_tready_next;
242+
233243
if (rst) begin
234244
state_reg <= STATE_IDLE;
235245
temp_tvalid_reg <= 1'b0;
236246
s_axis_tready_reg <= 1'b0;
237-
end else begin
238-
state_reg <= state_next;
239-
temp_tvalid_reg <= temp_tvalid_next;
240-
s_axis_tready_reg <= s_axis_tready_next;
241247
end
242-
243-
temp_tdata_reg <= temp_tdata_next;
244-
245-
count_reg <= count_next;
246-
suppress_zero_reg <= suppress_zero_next;
247248
end
248249

249250
// output datapath logic
@@ -267,8 +268,8 @@ assign m_axis_tvalid = m_axis_tvalid_reg;
267268
assign m_axis_tlast = m_axis_tlast_reg;
268269
assign m_axis_tuser = m_axis_tuser_reg;
269270

270-
// 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)
271-
assign m_axis_tready_int_early = m_axis_tready || (!temp_m_axis_tvalid_reg && (!m_axis_tvalid_reg || !m_axis_tvalid_int));
271+
// enable ready input next cycle if temp register is empty and output register will be available
272+
assign m_axis_tready_int_early = !temp_m_axis_tvalid_reg && (!m_axis_tvalid_reg || m_axis_tready);
272273

273274
always @* begin
274275
// transfer sink ready state to source
@@ -299,15 +300,9 @@ always @* begin
299300
end
300301

301302
always @(posedge clk) begin
302-
if (rst) begin
303-
m_axis_tvalid_reg <= 1'b0;
304-
m_axis_tready_int_reg <= 1'b0;
305-
temp_m_axis_tvalid_reg <= 1'b0;
306-
end else begin
307-
m_axis_tvalid_reg <= m_axis_tvalid_next;
308-
m_axis_tready_int_reg <= m_axis_tready_int_early;
309-
temp_m_axis_tvalid_reg <= temp_m_axis_tvalid_next;
310-
end
303+
m_axis_tvalid_reg <= m_axis_tvalid_next;
304+
m_axis_tready_int_reg <= m_axis_tready_int_early;
305+
temp_m_axis_tvalid_reg <= temp_m_axis_tvalid_next;
311306

312307
// datapath
313308
if (store_axis_int_to_output) begin
@@ -325,6 +320,12 @@ always @(posedge clk) begin
325320
temp_m_axis_tlast_reg <= m_axis_tlast_int;
326321
temp_m_axis_tuser_reg <= m_axis_tuser_int;
327322
end
323+
324+
if (rst) begin
325+
m_axis_tvalid_reg <= 1'b0;
326+
m_axis_tready_int_reg <= 1'b0;
327+
temp_m_axis_tvalid_reg <= 1'b0;
328+
end
328329
end
329330

330331
endmodule

lib/axis/rtl/axis_cobs_encode.v

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -411,17 +411,17 @@ always @* begin
411411
end
412412

413413
always @(posedge clk) begin
414-
if (rst) begin
415-
input_state_reg <= INPUT_STATE_IDLE;
416-
output_state_reg <= OUTPUT_STATE_IDLE;
417-
end else begin
418-
input_state_reg <= input_state_next;
419-
output_state_reg <= output_state_next;
420-
end
414+
input_state_reg <= input_state_next;
415+
output_state_reg <= output_state_next;
421416

422417
input_count_reg <= input_count_next;
423418
output_count_reg <= output_count_next;
424419
fail_frame_reg <= fail_frame_next;
420+
421+
if (rst) begin
422+
input_state_reg <= INPUT_STATE_IDLE;
423+
output_state_reg <= OUTPUT_STATE_IDLE;
424+
end
425425
end
426426

427427
// output datapath logic
@@ -445,8 +445,8 @@ assign m_axis_tvalid = m_axis_tvalid_reg;
445445
assign m_axis_tlast = m_axis_tlast_reg;
446446
assign m_axis_tuser = m_axis_tuser_reg;
447447

448-
// 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)
449-
assign m_axis_tready_int_early = m_axis_tready || (!temp_m_axis_tvalid_reg && (!m_axis_tvalid_reg || !m_axis_tvalid_int));
448+
// enable ready input next cycle if temp register is empty and output register will be available
449+
assign m_axis_tready_int_early = !temp_m_axis_tvalid_reg && (!m_axis_tvalid_reg || m_axis_tready);
450450

451451
always @* begin
452452
// transfer sink ready state to source
@@ -477,15 +477,9 @@ always @* begin
477477
end
478478

479479
always @(posedge clk) begin
480-
if (rst) begin
481-
m_axis_tvalid_reg <= 1'b0;
482-
m_axis_tready_int_reg <= 1'b0;
483-
temp_m_axis_tvalid_reg <= 1'b0;
484-
end else begin
485-
m_axis_tvalid_reg <= m_axis_tvalid_next;
486-
m_axis_tready_int_reg <= m_axis_tready_int_early;
487-
temp_m_axis_tvalid_reg <= temp_m_axis_tvalid_next;
488-
end
480+
m_axis_tvalid_reg <= m_axis_tvalid_next;
481+
m_axis_tready_int_reg <= m_axis_tready_int_early;
482+
temp_m_axis_tvalid_reg <= temp_m_axis_tvalid_next;
489483

490484
// datapath
491485
if (store_axis_int_to_output) begin
@@ -503,6 +497,12 @@ always @(posedge clk) begin
503497
temp_m_axis_tlast_reg <= m_axis_tlast_int;
504498
temp_m_axis_tuser_reg <= m_axis_tuser_int;
505499
end
500+
501+
if (rst) begin
502+
m_axis_tvalid_reg <= 1'b0;
503+
m_axis_tready_int_reg <= 1'b0;
504+
temp_m_axis_tvalid_reg <= 1'b0;
505+
end
506506
end
507507

508508
endmodule

0 commit comments

Comments
 (0)