@@ -31,6 +31,8 @@ module FIFO36K #(
31
31
output reg UNDERFLOW = 1'b0 // FIFO underflow error flag
32
32
);
33
33
34
+
35
+
34
36
if ( FIFO_TYPE == "SYNCHRONOUS" ) begin : SYNCRONOUS
35
37
36
38
@@ -231,8 +233,8 @@ assign ram_clk_b = RD_CLK;
231
233
parameter W_PTR_WIDTH = $clog2(fifo_depth_write);
232
234
parameter R_PTR_WIDTH = $clog2(fifo_depth_read);
233
235
234
- wire [W_PTR_WIDTH:0 ] b_wptr_sync, b_wptr_w;
235
- wire [R_PTR_WIDTH:0 ] b_rptr_sync, b_rptr_w;
236
+ wire [W_PTR_WIDTH:0 ] b_wptr_sync, b_wptr_w, b_wptr_sync_for_a ;
237
+ wire [R_PTR_WIDTH:0 ] b_rptr_sync, b_rptr_w, b_rptr_w1, b_rptr_sync_for_a ;
236
238
237
239
238
240
TDP_RAM36K #(
@@ -243,18 +245,18 @@ wire [R_PTR_WIDTH:0] b_rptr_sync, b_rptr_w;
243
245
.WRITE_WIDTH_B(DATA_WIDTH_WRITE), // Write data width on port B (1-36)
244
246
.READ_WIDTH_B(DATA_WIDTH_READ) // Read data width on port B (1-36)
245
247
) FIFO_RAM_inst (
246
- .WEN_A(WR_EN & !OVERFLOW & !FULL ), // Write-enable port A
248
+ .WEN_A(WR_EN ), // Write-enable port A
247
249
.WEN_B(1'b0 ), // Write-enable port B
248
250
.REN_A(1'b0 ), // Read-enable port A
249
- .REN_B(RD_EN & !UNDERFLOW & !EMPTY ), // Read-enable port B
251
+ .REN_B(RD_EN ), // Read-enable port B
250
252
.CLK_A(WR_CLK), // Clock port A
251
253
.CLK_B(ram_clk_b), // Clock port B
252
254
.BE_A(4'hf ), // Byte-write enable port A
253
255
.BE_B(4'h0 ), // Byte-write enable port B
254
256
// .ADDR_A({fifo_wr_addr, {15-fifo_addr_width{1'b0}}}), // Address port A, align MSBs and connect unused MSBs to logic 0
255
257
.ADDR_A({b_wptr_w,{15 -fifo_addr_width_w{1'b0 }}}), // Address port A, align MSBs and connect unused MSBs to logic 0
256
258
// .ADDR_B({fifo_rd_addr, {15-fifo_addr_width{1'b0}}}), // Address port B, align MSBs and connect unused MSBs to logic 0
257
- .ADDR_B({b_rptr_w ,{15 -fifo_addr_width_r{1'b0 }}}), // Address port B, align MSBs and connect unused MSBs to logic 0
259
+ .ADDR_B({b_rptr_w1 ,{15 -fifo_addr_width_r{1'b0 }}}), // Address port B, align MSBs and connect unused MSBs to logic 0
258
260
.WDATA_A(ram_wr_data), // Write data port A
259
261
.WPARITY_A(ram_wr_parity), // Write parity data port A
260
262
.WDATA_B(32'h00000000 ), // Write data port B
@@ -274,11 +276,11 @@ wire [R_PTR_WIDTH:0] b_rptr_sync, b_rptr_w;
274
276
end
275
277
276
278
if (DATA_WIDTH_READ== 18 ) begin
277
- assign RD_DATA = fwft ? fwft_data : {ram_rd_parity[1 : 0 ], ram_rd_data[15 :0 ]};
279
+ assign RD_DATA = fwft ? fwft_data : {ram_rd_parity[1 ], ram_rd_data[ 15 : 8 ], ram_rd_parity[ 0 ], ram_rd_data[7 :0 ]};
278
280
end
279
281
280
282
if (DATA_WIDTH_READ== 36 ) begin
281
- assign RD_DATA = fwft ? fwft_data : {ram_rd_parity[3 : 0 ], ram_rd_data[31 :0 ]};
283
+ assign RD_DATA = fwft ? fwft_data : {ram_rd_parity[3 ], ram_rd_data[ 31 : 24 ], ram_rd_parity[ 2 ], ram_rd_data[ 23 : 16 ], ram_rd_parity[ 1 ], ram_rd_data[ 15 : 8 ], ram_rd_parity[ 0 ], ram_rd_data[7 :0 ]};
282
284
end
283
285
284
286
if (DATA_WIDTH_WRITE== 9 ) begin
@@ -287,13 +289,13 @@ wire [R_PTR_WIDTH:0] b_rptr_sync, b_rptr_w;
287
289
end
288
290
289
291
if (DATA_WIDTH_WRITE== 18 ) begin
290
- assign ram_wr_data = {{32 - DATA_WIDTH_WRITE{1'b0 }}, WR_DATA[DATA_WIDTH_WRITE - 3 :0 ]};
291
- assign ram_wr_parity = {2'b00 , WR_DATA[DATA_WIDTH_WRITE - 1 :DATA_WIDTH_WRITE - 2 ]};
292
+ assign ram_wr_data = {{32 - DATA_WIDTH_WRITE{1'b0 }}, WR_DATA[16 : 9 ],WR_DATA[ 7 :0 ]};
293
+ assign ram_wr_parity = {2'b00 , WR_DATA[17 ], WR_DATA[ 8 ]};
292
294
end
293
295
294
296
if (DATA_WIDTH_WRITE== 36 ) begin
295
- assign ram_wr_data = {{ 36 - DATA_WIDTH_WRITE{ 1'b0 }} , WR_DATA[DATA_WIDTH_WRITE - 5 :0 ]};
296
- assign ram_wr_parity = {2'b00 , WR_DATA[DATA_WIDTH_WRITE - 1 :DATA_WIDTH_WRITE - 4 ]};
297
+ assign ram_wr_data = {WR_DATA[ 34 : 27 ] , WR_DATA[25 : 18 ],WR_DATA[ 16 : 9 ],WR_DATA[ 7 :0 ]};
298
+ assign ram_wr_parity = {WR_DATA[ 35 ] , WR_DATA[26 ], WR_DATA[ 17 ], WR_DATA[ 8 ]};
297
299
end
298
300
299
301
@@ -302,37 +304,44 @@ wire [R_PTR_WIDTH:0] b_rptr_sync, b_rptr_w;
302
304
/*---------Write pointer synchronizer ( 2 FLOPS) logic--------------*/
303
305
304
306
305
- reg [W_PTR_WIDTH:0 ] q1,d_out1;
307
+ reg [W_PTR_WIDTH:0 ] q1,q1_a, d_out1;
306
308
307
309
assign b_wptr_sync = d_out1;
310
+ assign b_wptr_sync_for_a = q1_a;
308
311
309
312
always @(posedge RD_CLK) begin
310
313
if (RESET) begin
311
314
q1 <= 0 ;
312
315
d_out1 <= 0 ;
316
+ q1_a <= 0 ;
313
317
end
314
318
else begin
315
319
q1 <= b_wptr_w;
316
320
d_out1 <= q1;
321
+ q1_a <= d_out1;
317
322
end
318
323
end
319
324
320
325
/*-------------------------------------------------------------------*/
321
326
322
327
/*--------- Read pointer synchronizer (2 FLOPS ) logic --------------*/
323
328
324
- reg [R_PTR_WIDTH:0 ] q2, d_out2;
329
+ reg [R_PTR_WIDTH:0 ] q2, q2_a, d_out2;
325
330
326
331
assign b_rptr_sync = d_out2;
332
+ assign b_rptr_sync_for_a = q2_a;
327
333
328
334
always @(posedge WR_CLK) begin
329
335
if (RESET) begin
330
336
q2 <= 0 ;
331
337
d_out2 <= 0 ;
338
+ q2_a <= 0 ;
332
339
end
333
340
else begin
341
+
334
342
q2 <= b_rptr_w;
335
343
d_out2 <= q2;
344
+ q2_a <= d_out2;
336
345
end
337
346
end
338
347
@@ -349,7 +358,7 @@ assign b_rptr_sync = d_out2;
349
358
350
359
wire wfull, al_full, p_full;
351
360
352
- wire [W_PTR_WIDTH:0 ] diff_ptr0, diff_ptr2;
361
+ wire [W_PTR_WIDTH:0 ] diff_ptr0, diff_ptr2, diff_ptr0_for_a ;
353
362
354
363
assign b_wptr_next = b_wptr+ (WR_EN & ! FULL);
355
364
@@ -358,18 +367,30 @@ assign b_rptr_sync = d_out2;
358
367
359
368
assign diff_ptr0 = (DATA_WIDTH_WRITE> DATA_WIDTH_READ)? /* W>R */ ((((b_wptr_next/ SCALING_FACTOR_WPTR >= (b_rptr_sync/ SCALING_FACTOR_RPTR))? (b_wptr_next/ SCALING_FACTOR_WPTR- (b_rptr_sync/ SCALING_FACTOR_RPTR)): (b_wptr_next/ SCALING_FACTOR_WPTR+ (1 << (W_PTR_WIDTH+ 1 ))- (b_rptr_sync/ SCALING_FACTOR_RPTR)))))
360
369
361
- : ( (DATA_WIDTH_READ> DATA_WIDTH_WRITE)? ( /* R>W */ ((((b_wptr_next/ SCALING_FACTOR_WPTR >= (b_rptr_sync/ SCALING_FACTOR_RPTR ))? (b_wptr_next/ SCALING_FACTOR_WPTR - (b_rptr_sync/ SCALING_FACTOR_RPTR )): (b_wptr_next/ SCALING_FACTOR_WPTR + (1 << (R_PTR_WIDTH + 1 ))- (b_rptr_sync/ SCALING_FACTOR_RPTR ))))) )
370
+ : ( (DATA_WIDTH_READ> DATA_WIDTH_WRITE)? ( /* R>W */ ((((b_wptr_next* SCALING_FACTOR_RPTR >= (b_rptr_sync* SCALING_FACTOR_WPTR ))? (b_wptr_next* SCALING_FACTOR_RPTR - (b_rptr_sync* SCALING_FACTOR_WPTR )): (b_wptr_next* SCALING_FACTOR_RPTR + (1 << (W_PTR_WIDTH + 1 ))- (b_rptr_sync* SCALING_FACTOR_WPTR ))))) )
362
371
363
372
: /* R==W */ ((((b_wptr_next >= (b_rptr_sync ))? (b_wptr_next - (b_rptr_sync)): (b_wptr_next + (1 << (W_PTR_WIDTH+ 1 ))- (b_rptr_sync ))))) );
364
373
374
+
375
+ assign diff_ptr0_for_a = (DATA_WIDTH_WRITE> DATA_WIDTH_READ)? /* W>R */ ((((b_wptr_next/ SCALING_FACTOR_WPTR >= (b_rptr_sync_for_a/ SCALING_FACTOR_RPTR))? (b_wptr_next/ SCALING_FACTOR_WPTR- (b_rptr_sync_for_a/ SCALING_FACTOR_RPTR)): (b_wptr_next/ SCALING_FACTOR_WPTR+ (1 << (W_PTR_WIDTH+ 1 ))- (b_rptr_sync_for_a/ SCALING_FACTOR_RPTR)))))
376
+
377
+ : ( (DATA_WIDTH_READ> DATA_WIDTH_WRITE)? ( /* R>W */ ((((b_wptr_next* SCALING_FACTOR_RPTR >= (b_rptr_sync_for_a* SCALING_FACTOR_WPTR))? (b_wptr_next* SCALING_FACTOR_RPTR- (b_rptr_sync_for_a* SCALING_FACTOR_WPTR)): (b_wptr_next* SCALING_FACTOR_RPTR+ (1 << (W_PTR_WIDTH+ 1 ))- (b_rptr_sync_for_a* SCALING_FACTOR_WPTR))))) )
378
+
379
+ : /* R==W */ ((((b_wptr_next >= (b_rptr_sync_for_a ))? (b_wptr_next - (b_rptr_sync_for_a)): (b_wptr_next + (1 << (W_PTR_WIDTH+ 1 ))- (b_rptr_sync_for_a ))))) );
380
+
381
+
365
382
// assign wfull = (DATA_WIDTH_WRITE>DATA_WIDTH_READ)? (diff_ptr0 == (1<<W_PTR_WIDTH)) : (diff_ptr0 == (1<<R_PTR_WIDTH) );
366
-
367
- assign wfull = (DATA_WIDTH_WRITE> DATA_WIDTH_READ)? (diff_ptr0 == (1 << W_PTR_WIDTH)) : (diff_ptr0 == (1 << R_PTR_WIDTH) );
368
383
384
+ assign wfull = (DATA_WIDTH_WRITE> DATA_WIDTH_READ)? (diff_ptr0 == (1 << W_PTR_WIDTH)) : (diff_ptr0 == (1 << W_PTR_WIDTH) );
369
385
370
- assign al_full = (DATA_WIDTH_WRITE> DATA_WIDTH_READ)? (diff_ptr0 == (1 << W_PTR_WIDTH)- 1 ): (diff_ptr0 == ((1 << R_PTR_WIDTH)- 1 ) );
371
386
372
- assign p_full = (DATA_WIDTH_WRITE> DATA_WIDTH_READ)? (diff_ptr0 >= ((1 << W_PTR_WIDTH)- PROG_FULL_THRESH) ) : ( (diff_ptr0 >= ((1 << R_PTR_WIDTH)- PROG_FULL_THRESH) ) );
387
+ assign al_full = (DATA_WIDTH_WRITE> DATA_WIDTH_READ)? (diff_ptr0 == (1 << W_PTR_WIDTH)- 1 ): (diff_ptr0 == ((1 << W_PTR_WIDTH)- 1 ) );
388
+
389
+ assign p_full = (DATA_WIDTH_WRITE> DATA_WIDTH_READ)? (diff_ptr0_for_a >= ((1 << W_PTR_WIDTH)- PROG_FULL_THRESH+ 1 ) ) : ( (diff_ptr0_for_a >= ((1 << W_PTR_WIDTH)- PROG_FULL_THRESH+ 1 ) ) );
390
+
391
+
392
+ // assign diff_ptr2 = ((((b_wptr_next*SCALING_FACTOR_WPTR-(b_rptr_sync/SCALING_FACTOR_RPTR)): (b_wptr_next/SCALING_FACTOR_WPTR+(1<<(W_PTR_WIDTH+1))-(b_rptr_sync/SCALING_FACTOR_RPTR)))))
393
+
373
394
374
395
375
396
always @(posedge WR_CLK or posedge RESET) begin
@@ -382,16 +403,19 @@ assign b_rptr_sync = d_out2;
382
403
end
383
404
384
405
always @(posedge WR_CLK or posedge RESET) begin
406
+
385
407
if (RESET) begin
386
408
FULL <= 0 ;
387
409
ALMOST_FULL <= 'b0;
388
410
PROG_FULL <= 0 ;
389
411
end
412
+
390
413
else begin
391
414
392
- FULL <= wfull ;
393
- ALMOST_FULL <= al_full ;
394
- PROG_FULL <= p_full ;
415
+ FULL <= wfull;
416
+ ALMOST_FULL <= al_full;
417
+ PROG_FULL <= p_full;
418
+
395
419
end
396
420
end
397
421
@@ -401,14 +425,15 @@ assign b_rptr_sync = d_out2;
401
425
402
426
localparam SCALING_FACTOR_RPTR= (DATA_WIDTH_READ< DATA_WIDTH_WRITE)? (DATA_WIDTH_WRITE/ DATA_WIDTH_READ):1 ;
403
427
404
- wire [R_PTR_WIDTH:0 ] diff_ptr1;
428
+ wire [R_PTR_WIDTH:0 ] diff_ptr1, diff_ptr1_for_a ;
405
429
reg [R_PTR_WIDTH:0 ] b_rptr_next, b_rptr;
406
430
407
431
408
432
always @(* ) begin
409
433
410
434
if (RESET) begin
411
435
b_rptr_next = 0 ;
436
+ b_rptr <= 0 ;
412
437
end
413
438
if ((RD_EN & ! EMPTY)) begin
414
439
if (b_rptr_next== (1 << R_PTR_WIDTH+ 1 )) begin
@@ -420,20 +445,28 @@ always @(*) begin
420
445
end
421
446
end
422
447
423
- assign b_rptr_w = b_rptr_next;
448
+ assign b_rptr_w = b_rptr;
449
+
450
+ assign b_rptr_w1= b_rptr_next;
424
451
425
- assign diff_ptr1 = (DATA_WIDTH_WRITE > DATA_WIDTH_READ)? ( ((b_wptr_sync/ SCALING_FACTOR_WPTR ) >= (b_rptr_next/ SCALING_FACTOR_RPTR ))? (b_wptr_sync/ SCALING_FACTOR_WPTR - (b_rptr_next/ SCALING_FACTOR_RPTR )): (b_wptr_sync/ SCALING_FACTOR_WPTR + (1 << (W_PTR_WIDTH + 1 ))- (b_rptr_next/ SCALING_FACTOR_RPTR)))
452
+ assign diff_ptr1 = (DATA_WIDTH_WRITE > DATA_WIDTH_READ)? ( ((b_wptr_sync* SCALING_FACTOR_RPTR ) >= (b_rptr_next* SCALING_FACTOR_WPTR ))? (b_wptr_sync* SCALING_FACTOR_RPTR - (b_rptr_next* SCALING_FACTOR_WPTR )): (( b_wptr_sync* SCALING_FACTOR_RPTR) + (1 << (R_PTR_WIDTH + 1 ))- (b_rptr_next* SCALING_FACTOR_RPTR)/ SCALING_FACTOR_RPTR ))
426
453
427
454
: ( (DATA_WIDTH_READ > DATA_WIDTH_WRITE)? (((b_wptr_sync/ SCALING_FACTOR_WPTR) >= (b_rptr_next/ SCALING_FACTOR_RPTR))? (b_wptr_sync/ SCALING_FACTOR_WPTR- (b_rptr_next/ SCALING_FACTOR_RPTR)): (b_wptr_sync/ SCALING_FACTOR_WPTR+ (1 << (R_PTR_WIDTH+ 1 ))- (b_rptr_next/ SCALING_FACTOR_RPTR)))
428
455
429
456
: (((b_wptr_sync) >= (b_rptr_next))? (b_wptr_sync- (b_rptr_next)): (b_wptr_sync+ (1 << (W_PTR_WIDTH+ 1 ))- (b_rptr_next))) ) ;
430
457
458
+ assign diff_ptr1_for_a = (DATA_WIDTH_WRITE > DATA_WIDTH_READ)? ( ((b_wptr_sync_for_a* SCALING_FACTOR_RPTR) >= (b_rptr_next* SCALING_FACTOR_WPTR))? (b_wptr_sync_for_a* SCALING_FACTOR_RPTR- (b_rptr_next* SCALING_FACTOR_WPTR)): ((b_wptr_sync_for_a* SCALING_FACTOR_RPTR)+ (1 << (R_PTR_WIDTH+ 1 ))- (b_rptr_next* SCALING_FACTOR_RPTR)/ SCALING_FACTOR_RPTR))
459
+
460
+ : ( (DATA_WIDTH_READ > DATA_WIDTH_WRITE)? (((b_wptr_sync_for_a/ SCALING_FACTOR_WPTR) >= (b_rptr_next/ SCALING_FACTOR_RPTR))? (b_wptr_sync_for_a/ SCALING_FACTOR_WPTR- (b_rptr_next/ SCALING_FACTOR_RPTR)): (b_wptr_sync_for_a/ SCALING_FACTOR_WPTR+ (1 << (R_PTR_WIDTH+ 1 ))- (b_rptr_next/ SCALING_FACTOR_RPTR)))
461
+
462
+ : (((b_wptr_sync_for_a) >= (b_rptr_next))? (b_wptr_sync_for_a- (b_rptr_next)): (b_wptr_sync_for_a+ (1 << (W_PTR_WIDTH+ 1 ))- (b_rptr_next))) ) ;
463
+
431
464
432
465
assign rempty= (diff_ptr1== 0 )?1 :0 ;
433
466
434
467
assign al_empty = (diff_ptr1 == 1 )? 1 :0 ;
435
468
436
- assign p_empty = (diff_ptr1 == PROG_EMPTY_THRESH || diff_ptr1 <= PROG_EMPTY_THRESH )? 1 :0 ;
469
+ assign p_empty = (diff_ptr1_for_a == PROG_EMPTY_THRESH- 1 || diff_ptr1_for_a <= PROG_EMPTY_THRESH- 1 )? 1 :0 ;
437
470
438
471
439
472
always @(posedge RD_CLK or posedge RESET) begin
@@ -458,7 +491,19 @@ assign p_empty = (diff_ptr1 ==PROG_EMPTY_THRESH || diff_ptr1 <=PROG_EMPTY_THRESH
458
491
459
492
460
493
EMPTY <= rempty;
461
- ALMOST_EMPTY <= al_empty;
494
+
495
+ if (DATA_WIDTH_READ== 9 ) begin
496
+ if (b_rptr== 4095 & WR_EN== 0 ) begin
497
+ ALMOST_EMPTY <= 0 ;
498
+ end
499
+ else begin
500
+ ALMOST_EMPTY <= al_empty;
501
+ end
502
+ end
503
+ else begin
504
+ ALMOST_EMPTY <= al_empty;
505
+ end
506
+
462
507
PROG_EMPTY <= p_empty;
463
508
464
509
end
@@ -478,13 +523,13 @@ assign p_empty = (diff_ptr1 ==PROG_EMPTY_THRESH || diff_ptr1 <=PROG_EMPTY_THRESH
478
523
fwft_data <= WR_DATA;
479
524
end
480
525
else if (DATA_WIDTH_WRITE== 36 && DATA_WIDTH_READ== 9 ) begin
481
- fwft_data <= {{WR_DATA[32 ]},{WR_DATA[7 :0 ]}} ; // DEVELOP LOGIC FOR OTHER WIDTH AS WELL
526
+ fwft_data <= {{WR_DATA[8 ]},{WR_DATA[7 :0 ]}} ; // DEVELOP LOGIC FOR OTHER WIDTH AS WELL
482
527
end
483
528
else if (DATA_WIDTH_WRITE== 36 && DATA_WIDTH_READ== 18 ) begin
484
- fwft_data <= {{WR_DATA[33 : 32 ]},{WR_DATA[15 :0 ]}} ; // DEVELOP LOGIC FOR OTHER WIDTH AS WELL
529
+ fwft_data <= {{WR_DATA[17 ]},{WR_DATA[ 16 : 9 ]}, {WR_DATA[8 ]}, {WR_DATA[ 7 :0 ]}} ; // DEVELOP LOGIC FOR OTHER WIDTH AS WELL
485
530
end
486
531
else if (DATA_WIDTH_WRITE== 18 && DATA_WIDTH_READ== 9 ) begin
487
- fwft_data <= {{WR_DATA[16 ]},{WR_DATA[7 :0 ]}} ; // DEVELOP LOGIC FOR OTHER WIDTH AS WELL
532
+ fwft_data <= {{WR_DATA[8 ]},{WR_DATA[7 :0 ]}} ; // DEVELOP LOGIC FOR OTHER WIDTH AS WELL
488
533
end
489
534
490
535
end
@@ -503,10 +548,10 @@ assign p_empty = (diff_ptr1 ==PROG_EMPTY_THRESH || diff_ptr1 <=PROG_EMPTY_THRESH
503
548
504
549
if (b_wptr_next== 1 || b_wptr_next== 4097 ) begin
505
550
fwft_data [7 :0 ] <= WR_DATA[7 :0 ] ;
506
- fwft_data [16 ] <= WR_DATA[8 ] ;
551
+ fwft_data [8 ] <= WR_DATA[8 ] ;
507
552
end
508
553
if (b_wptr_next== 2 || b_wptr_next== 4098 ) begin
509
- fwft_data [15 : 8 ] <= WR_DATA[7 :0 ];
554
+ fwft_data [16 : 9 ] <= WR_DATA[7 :0 ];
510
555
fwft_data [17 ] <= WR_DATA[8 ];
511
556
end
512
557
end
@@ -524,18 +569,18 @@ assign p_empty = (diff_ptr1 ==PROG_EMPTY_THRESH || diff_ptr1 <=PROG_EMPTY_THRESH
524
569
525
570
if (b_wptr_next== 1 || b_wptr_next== 4097 ) begin
526
571
fwft_data [7 :0 ] <= WR_DATA[7 :0 ];
527
- fwft_data [32 ] <= WR_DATA[8 ];
572
+ fwft_data [8 ] <= WR_DATA[8 ];
528
573
end
529
574
if (b_wptr_next== 2 || b_wptr_next== 4098 ) begin
530
- fwft_data [15 : 8 ] <= WR_DATA[7 :0 ];
531
- fwft_data [33 ] <= WR_DATA[8 ];
575
+ fwft_data [16 : 9 ] <= WR_DATA[7 :0 ];
576
+ fwft_data [17 ] <= WR_DATA[8 ];
532
577
end
533
578
if (b_wptr_next== 3 || b_wptr_next== 4099 ) begin
534
- fwft_data [23 : 16 ] <= WR_DATA[7 :0 ] ;
535
- fwft_data [34 ] <= WR_DATA[8 ];
579
+ fwft_data [25 : 18 ] <= WR_DATA[7 :0 ] ;
580
+ fwft_data [26 ] <= WR_DATA[8 ];
536
581
end
537
582
if (b_wptr_next== 4 || b_wptr_next== 4100 ) begin
538
- fwft_data [31 : 24 ] <= WR_DATA[7 :0 ] ;
583
+ fwft_data [34 : 27 ] <= WR_DATA[7 :0 ] ;
539
584
fwft_data [35 ] <= WR_DATA[8 ];
540
585
end
541
586
@@ -553,15 +598,19 @@ assign p_empty = (diff_ptr1 ==PROG_EMPTY_THRESH || diff_ptr1 <=PROG_EMPTY_THRESH
553
598
fwft <= (EMPTY && WR_EN && ! fwft)? 1 : fwft;
554
599
555
600
if (b_wptr_next== 1 || b_wptr_next== 4097 ) begin
556
- fwft_data [15 :0 ] <= WR_DATA[15 :0 ];
557
- fwft_data [32 ] <= WR_DATA[16 ];
558
- fwft_data [33 ] <= WR_DATA[17 ];
601
+ // fwft_data [7:0] <= WR_DATA[7:0];
602
+ // fwft_data [16:9] <= WR_DATA[16:9];
603
+ // fwft_data [8] <= WR_DATA[8];
604
+ // fwft_data [17] <= WR_DATA[17];
605
+ fwft_data[17 :0 ] <= WR_DATA;
559
606
560
607
end
561
608
if (b_wptr_next== 2 || b_wptr_next== 4098 ) begin
562
- fwft_data [31 :16 ] <= WR_DATA[15 :0 ];
563
- fwft_data [34 ] <= WR_DATA[16 ];
564
- fwft_data [35 ] <= WR_DATA[17 ];
609
+ // fwft_data [25:18] <= WR_DATA[7:0];
610
+ // fwft_data [34:27] <= WR_DATA[16:9];
611
+ // fwft_data [26] <= WR_DATA[8];
612
+ // fwft_data [35] <= WR_DATA[17];
613
+ fwft_data[35 :18 ] <= WR_DATA;
565
614
end
566
615
end
567
616
@@ -616,7 +665,24 @@ assign p_empty = (diff_ptr1 ==PROG_EMPTY_THRESH || diff_ptr1 <=PROG_EMPTY_THRESH
616
665
end
617
666
end
618
667
619
- end : ASYNCRONOUS
668
+
669
+ always @(* ) begin
670
+ if (OVERFLOW) begin
671
+ @(posedge WR_CLK) begin
672
+ $fatal(1 ,"\n Error: OVERFLOW Happend, RESET THE FIFO FIRST \n " , OVERFLOW );
673
+ end
674
+ end
675
+ end
676
+
677
+ always @(* ) begin
678
+ if (UNDERFLOW) begin
679
+ @(posedge RD_CLK) begin
680
+ $fatal(1 ,"\n Error: UNDERFLOW Happend, RESET THE FIFO FIRST \n " , UNDERFLOW );
681
+ end
682
+ end
683
+ end
684
+
685
+ end : ASYNCRONOUS
620
686
initial begin
621
687
case (DATA_WRITE_WIDTH)
622
688
9 ,
0 commit comments