@@ -132,32 +132,32 @@ module axis_async_fifo_adapter #
132
132
);
133
133
134
134
// force keep width to 1 when disabled
135
- parameter S_KEEP_WIDTH_INT = S_KEEP_ENABLE ? S_KEEP_WIDTH : 1 ;
136
- parameter M_KEEP_WIDTH_INT = M_KEEP_ENABLE ? M_KEEP_WIDTH : 1 ;
135
+ localparam S_BYTE_LANES = S_KEEP_ENABLE ? S_KEEP_WIDTH : 1 ;
136
+ localparam M_BYTE_LANES = M_KEEP_ENABLE ? M_KEEP_WIDTH : 1 ;
137
137
138
- // bus word sizes (must be identical)
139
- parameter S_DATA_WORD_SIZE = S_DATA_WIDTH / S_KEEP_WIDTH_INT ;
140
- parameter M_DATA_WORD_SIZE = M_DATA_WIDTH / M_KEEP_WIDTH_INT ;
138
+ // bus byte sizes (must be identical)
139
+ localparam S_BYTE_SIZE = S_DATA_WIDTH / S_BYTE_LANES ;
140
+ localparam M_BYTE_SIZE = M_DATA_WIDTH / M_BYTE_LANES ;
141
141
// output bus is wider
142
- parameter EXPAND_BUS = M_KEEP_WIDTH_INT > S_KEEP_WIDTH_INT ;
142
+ localparam EXPAND_BUS = M_BYTE_LANES > S_BYTE_LANES ;
143
143
// total data and keep widths
144
- parameter DATA_WIDTH = EXPAND_BUS ? M_DATA_WIDTH : S_DATA_WIDTH;
145
- parameter KEEP_WIDTH = EXPAND_BUS ? M_KEEP_WIDTH_INT : S_KEEP_WIDTH_INT ;
144
+ localparam DATA_WIDTH = EXPAND_BUS ? M_DATA_WIDTH : S_DATA_WIDTH;
145
+ localparam KEEP_WIDTH = EXPAND_BUS ? M_BYTE_LANES : S_BYTE_LANES ;
146
146
147
147
// bus width assertions
148
148
initial begin
149
- if (S_DATA_WORD_SIZE * S_KEEP_WIDTH_INT != S_DATA_WIDTH) begin
150
- $error("Error: input data width not evenly divisble (instance %m)" );
149
+ if (S_BYTE_SIZE * S_BYTE_LANES != S_DATA_WIDTH) begin
150
+ $error("Error: input data width not evenly divisible (instance %m)" );
151
151
$finish ;
152
152
end
153
153
154
- if (M_DATA_WORD_SIZE * M_KEEP_WIDTH_INT != M_DATA_WIDTH) begin
155
- $error("Error: output data width not evenly divisble (instance %m)" );
154
+ if (M_BYTE_SIZE * M_BYTE_LANES != M_DATA_WIDTH) begin
155
+ $error("Error: output data width not evenly divisible (instance %m)" );
156
156
$finish ;
157
157
end
158
158
159
- if (S_DATA_WORD_SIZE != M_DATA_WORD_SIZE ) begin
160
- $error("Error: word size mismatch (instance %m)" );
159
+ if (S_BYTE_SIZE != M_BYTE_SIZE ) begin
160
+ $error("Error: byte size mismatch (instance %m)" );
161
161
$finish ;
162
162
end
163
163
end
@@ -182,30 +182,7 @@ wire [USER_WIDTH-1:0] post_fifo_axis_tuser;
182
182
183
183
generate
184
184
185
- if (M_KEEP_WIDTH == S_KEEP_WIDTH) begin
186
-
187
- // same width, no adapter needed
188
-
189
- assign pre_fifo_axis_tdata = s_axis_tdata;
190
- assign pre_fifo_axis_tkeep = s_axis_tkeep;
191
- assign pre_fifo_axis_tvalid = s_axis_tvalid;
192
- assign s_axis_tready = pre_fifo_axis_tready;
193
- assign pre_fifo_axis_tlast = s_axis_tlast;
194
- assign pre_fifo_axis_tid = s_axis_tid;
195
- assign pre_fifo_axis_tdest = s_axis_tdest;
196
- assign pre_fifo_axis_tuser = s_axis_tuser;
197
-
198
- assign m_axis_tdata = post_fifo_axis_tdata;
199
- assign m_axis_tkeep = post_fifo_axis_tkeep;
200
- assign m_axis_tvalid = post_fifo_axis_tvalid;
201
- assign post_fifo_axis_tready = m_axis_tready;
202
- assign m_axis_tlast = post_fifo_axis_tlast;
203
- assign m_axis_tid = post_fifo_axis_tid;
204
- assign m_axis_tdest = post_fifo_axis_tdest;
205
- assign m_axis_tuser = post_fifo_axis_tuser;
206
-
207
-
208
- end else if (EXPAND_BUS) begin
185
+ if (M_BYTE_LANES > S_BYTE_LANES) begin : upsize_pre
209
186
210
187
// output wider, adapt width before FIFO
211
188
@@ -246,19 +223,8 @@ end else if (EXPAND_BUS) begin
246
223
.m_axis_tuser(pre_fifo_axis_tuser)
247
224
);
248
225
249
- assign m_axis_tdata = post_fifo_axis_tdata;
250
- assign m_axis_tkeep = post_fifo_axis_tkeep;
251
- assign m_axis_tvalid = post_fifo_axis_tvalid;
252
- assign post_fifo_axis_tready = m_axis_tready;
253
- assign m_axis_tlast = post_fifo_axis_tlast;
254
- assign m_axis_tid = post_fifo_axis_tid;
255
- assign m_axis_tdest = post_fifo_axis_tdest;
256
- assign m_axis_tuser = post_fifo_axis_tuser;
257
-
258
- end else begin
226
+ end else begin : bypass_pre
259
227
260
- // input wider, adapt width after FIFO
261
-
262
228
assign pre_fifo_axis_tdata = s_axis_tdata;
263
229
assign pre_fifo_axis_tkeep = s_axis_tkeep;
264
230
assign pre_fifo_axis_tvalid = s_axis_tvalid;
@@ -268,47 +234,8 @@ end else begin
268
234
assign pre_fifo_axis_tdest = s_axis_tdest;
269
235
assign pre_fifo_axis_tuser = s_axis_tuser;
270
236
271
- axis_adapter #(
272
- .S_DATA_WIDTH(S_DATA_WIDTH),
273
- .S_KEEP_ENABLE(S_KEEP_ENABLE),
274
- .S_KEEP_WIDTH(S_KEEP_WIDTH),
275
- .M_DATA_WIDTH(M_DATA_WIDTH),
276
- .M_KEEP_ENABLE(M_KEEP_ENABLE),
277
- .M_KEEP_WIDTH(M_KEEP_WIDTH),
278
- .ID_ENABLE(ID_ENABLE),
279
- .ID_WIDTH(ID_WIDTH),
280
- .DEST_ENABLE(DEST_ENABLE),
281
- .DEST_WIDTH(DEST_WIDTH),
282
- .USER_ENABLE(USER_ENABLE),
283
- .USER_WIDTH(USER_WIDTH)
284
- )
285
- adapter_inst (
286
- .clk(m_clk),
287
- .rst(m_rst),
288
- // AXI input
289
- .s_axis_tdata(post_fifo_axis_tdata),
290
- .s_axis_tkeep(post_fifo_axis_tkeep),
291
- .s_axis_tvalid(post_fifo_axis_tvalid),
292
- .s_axis_tready(post_fifo_axis_tready),
293
- .s_axis_tlast(post_fifo_axis_tlast),
294
- .s_axis_tid(post_fifo_axis_tid),
295
- .s_axis_tdest(post_fifo_axis_tdest),
296
- .s_axis_tuser(post_fifo_axis_tuser),
297
- // AXI output
298
- .m_axis_tdata(m_axis_tdata),
299
- .m_axis_tkeep(m_axis_tkeep),
300
- .m_axis_tvalid(m_axis_tvalid),
301
- .m_axis_tready(m_axis_tready),
302
- .m_axis_tlast(m_axis_tlast),
303
- .m_axis_tid(m_axis_tid),
304
- .m_axis_tdest(m_axis_tdest),
305
- .m_axis_tuser(m_axis_tuser)
306
- );
307
-
308
237
end
309
238
310
- endgenerate
311
-
312
239
axis_async_fifo #(
313
240
.DEPTH(DEPTH),
314
241
.DATA_WIDTH(DATA_WIDTH),
@@ -366,6 +293,62 @@ fifo_inst (
366
293
.m_status_good_frame(m_status_good_frame)
367
294
);
368
295
296
+ if (M_BYTE_LANES < S_BYTE_LANES) begin : downsize_post
297
+
298
+ // input wider, adapt width after FIFO
299
+
300
+ axis_adapter #(
301
+ .S_DATA_WIDTH(S_DATA_WIDTH),
302
+ .S_KEEP_ENABLE(S_KEEP_ENABLE),
303
+ .S_KEEP_WIDTH(S_KEEP_WIDTH),
304
+ .M_DATA_WIDTH(M_DATA_WIDTH),
305
+ .M_KEEP_ENABLE(M_KEEP_ENABLE),
306
+ .M_KEEP_WIDTH(M_KEEP_WIDTH),
307
+ .ID_ENABLE(ID_ENABLE),
308
+ .ID_WIDTH(ID_WIDTH),
309
+ .DEST_ENABLE(DEST_ENABLE),
310
+ .DEST_WIDTH(DEST_WIDTH),
311
+ .USER_ENABLE(USER_ENABLE),
312
+ .USER_WIDTH(USER_WIDTH)
313
+ )
314
+ adapter_inst (
315
+ .clk(m_clk),
316
+ .rst(m_rst),
317
+ // AXI input
318
+ .s_axis_tdata(post_fifo_axis_tdata),
319
+ .s_axis_tkeep(post_fifo_axis_tkeep),
320
+ .s_axis_tvalid(post_fifo_axis_tvalid),
321
+ .s_axis_tready(post_fifo_axis_tready),
322
+ .s_axis_tlast(post_fifo_axis_tlast),
323
+ .s_axis_tid(post_fifo_axis_tid),
324
+ .s_axis_tdest(post_fifo_axis_tdest),
325
+ .s_axis_tuser(post_fifo_axis_tuser),
326
+ // AXI output
327
+ .m_axis_tdata(m_axis_tdata),
328
+ .m_axis_tkeep(m_axis_tkeep),
329
+ .m_axis_tvalid(m_axis_tvalid),
330
+ .m_axis_tready(m_axis_tready),
331
+ .m_axis_tlast(m_axis_tlast),
332
+ .m_axis_tid(m_axis_tid),
333
+ .m_axis_tdest(m_axis_tdest),
334
+ .m_axis_tuser(m_axis_tuser)
335
+ );
336
+
337
+ end else begin : bypass_post
338
+
339
+ assign m_axis_tdata = post_fifo_axis_tdata;
340
+ assign m_axis_tkeep = post_fifo_axis_tkeep;
341
+ assign m_axis_tvalid = post_fifo_axis_tvalid;
342
+ assign post_fifo_axis_tready = m_axis_tready;
343
+ assign m_axis_tlast = post_fifo_axis_tlast;
344
+ assign m_axis_tid = post_fifo_axis_tid;
345
+ assign m_axis_tdest = post_fifo_axis_tdest;
346
+ assign m_axis_tuser = post_fifo_axis_tuser;
347
+
348
+ end
349
+
350
+ endgenerate
351
+
369
352
endmodule
370
353
371
354
`resetall
0 commit comments