Skip to content

Commit c1c3dc0

Browse files
committed
Fix tkeep handling in axis_adapter
Signed-off-by: Alex Forencich <[email protected]>
1 parent 10b6d2f commit c1c3dc0

File tree

2 files changed

+14
-8
lines changed

2 files changed

+14
-8
lines changed

rtl/axis_adapter.v

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ initial begin
115115
end
116116
end
117117

118+
wire [S_KEEP_WIDTH-1:0] s_axis_tkeep_int = S_KEEP_ENABLE ? s_axis_tkeep : {S_KEEP_WIDTH{1'b1}};
119+
118120
generate
119121

120122
if (M_BYTE_LANES == S_BYTE_LANES) begin : bypass
@@ -123,7 +125,7 @@ if (M_BYTE_LANES == S_BYTE_LANES) begin : bypass
123125
assign s_axis_tready = m_axis_tready;
124126

125127
assign m_axis_tdata = s_axis_tdata;
126-
assign m_axis_tkeep = M_KEEP_ENABLE ? s_axis_tkeep : {M_KEEP_WIDTH{1'b1}};
128+
assign m_axis_tkeep = (M_KEEP_ENABLE && S_KEEP_ENABLE) ? s_axis_tkeep : {M_KEEP_WIDTH{1'b1}};
127129
assign m_axis_tvalid = s_axis_tvalid;
128130
assign m_axis_tlast = s_axis_tlast;
129131
assign m_axis_tid = ID_ENABLE ? s_axis_tid : {ID_WIDTH{1'b0}};
@@ -175,10 +177,10 @@ end else if (M_BYTE_LANES > S_BYTE_LANES) begin : upsize
175177

176178
if (seg_reg == 0) begin
177179
m_axis_tdata_reg[seg_reg*SEG_DATA_WIDTH +: SEG_DATA_WIDTH] <= s_axis_tvalid_reg ? s_axis_tdata_reg : s_axis_tdata;
178-
m_axis_tkeep_reg <= s_axis_tvalid_reg ? s_axis_tkeep_reg : s_axis_tkeep;
180+
m_axis_tkeep_reg <= s_axis_tvalid_reg ? s_axis_tkeep_reg : s_axis_tkeep_int;
179181
end else begin
180182
m_axis_tdata_reg[seg_reg*SEG_DATA_WIDTH +: SEG_DATA_WIDTH] <= s_axis_tdata;
181-
m_axis_tkeep_reg[seg_reg*SEG_KEEP_WIDTH +: SEG_KEEP_WIDTH] <= s_axis_tkeep;
183+
m_axis_tkeep_reg[seg_reg*SEG_KEEP_WIDTH +: SEG_KEEP_WIDTH] <= s_axis_tkeep_int;
182184
end
183185
m_axis_tlast_reg <= s_axis_tvalid_reg ? s_axis_tlast_reg : s_axis_tlast;
184186
m_axis_tid_reg <= s_axis_tvalid_reg ? s_axis_tid_reg : s_axis_tid;
@@ -207,7 +209,7 @@ end else if (M_BYTE_LANES > S_BYTE_LANES) begin : upsize
207209
end else if (s_axis_tvalid && s_axis_tready) begin
208210
// store input data in skid buffer
209211
s_axis_tdata_reg <= s_axis_tdata;
210-
s_axis_tkeep_reg <= s_axis_tkeep;
212+
s_axis_tkeep_reg <= s_axis_tkeep_int;
211213
s_axis_tvalid_reg <= 1'b1;
212214
s_axis_tlast_reg <= s_axis_tlast;
213215
s_axis_tid_reg <= s_axis_tid;
@@ -264,7 +266,7 @@ end else begin : downsize
264266
// output register empty
265267

266268
m_axis_tdata_reg <= s_axis_tvalid_reg ? s_axis_tdata_reg : s_axis_tdata;
267-
m_axis_tkeep_reg <= s_axis_tvalid_reg ? s_axis_tkeep_reg : s_axis_tkeep;
269+
m_axis_tkeep_reg <= s_axis_tvalid_reg ? s_axis_tkeep_reg : s_axis_tkeep_int;
268270
m_axis_tlast_reg <= 1'b0;
269271
m_axis_tid_reg <= s_axis_tvalid_reg ? s_axis_tid_reg : s_axis_tid;
270272
m_axis_tdest_reg <= s_axis_tvalid_reg ? s_axis_tdest_reg : s_axis_tdest;
@@ -284,15 +286,15 @@ end else begin : downsize
284286
end else if (s_axis_tvalid && s_axis_tready) begin
285287
// buffer is empty; store from input
286288
s_axis_tdata_reg <= s_axis_tdata >> SEG_DATA_WIDTH;
287-
s_axis_tkeep_reg <= s_axis_tkeep >> SEG_KEEP_WIDTH;
289+
s_axis_tkeep_reg <= s_axis_tkeep_int >> SEG_KEEP_WIDTH;
288290
s_axis_tlast_reg <= s_axis_tlast;
289291
s_axis_tid_reg <= s_axis_tid;
290292
s_axis_tdest_reg <= s_axis_tdest;
291293
s_axis_tuser_reg <= s_axis_tuser;
292294

293295
m_axis_tvalid_reg <= 1'b1;
294296

295-
if ((s_axis_tkeep >> SEG_KEEP_WIDTH) == 0) begin
297+
if (S_KEEP_ENABLE && (s_axis_tkeep_int >> SEG_KEEP_WIDTH) == 0) begin
296298
s_axis_tvalid_reg <= 1'b0;
297299
m_axis_tlast_reg <= s_axis_tlast;
298300
end else begin
@@ -302,7 +304,7 @@ end else begin : downsize
302304
end else if (s_axis_tvalid && s_axis_tready) begin
303305
// store input data
304306
s_axis_tdata_reg <= s_axis_tdata;
305-
s_axis_tkeep_reg <= s_axis_tkeep;
307+
s_axis_tkeep_reg <= s_axis_tkeep_int;
306308
s_axis_tvalid_reg <= 1'b1;
307309
s_axis_tlast_reg <= s_axis_tlast;
308310
s_axis_tid_reg <= s_axis_tid;

tb/axis_adapter/test_axis_adapter.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ async def run_test(dut, payload_lengths=None, payload_data=None, idle_inserter=N
9191
test_frame.tid = cur_id
9292
test_frame.tdest = cur_id
9393

94+
# set tkeep to all zeros when disabled to verify correct handling
95+
if not dut.S_KEEP_ENABLE.value:
96+
test_frame.tkeep = [0]*len(test_data)
97+
9498
test_frames.append(test_frame)
9599
await tb.source.send(test_frame)
96100

0 commit comments

Comments
 (0)