`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: BITSILICA PVT LTD // Design Name: // Module Name: FIFO // Project Name: ////////////////////////////////////////////////////////////////////////////////// /* Description =========== I/Os ---- rst low active, either sync. or async. master reset (see below how to select) clr synchronous clear (just like reset but always synchronous), high active re read enable, synchronous, high active we read enable, synchronous, high active din Data Input dout Data Output full Indicates the FIFO is full (combinatorial output) full_r same as above, but registered output (see note below) empty Indicates the FIFO is empty empty_r same as above, but registered output (see note below) full_n Indicates if the FIFO has space for N entries (combinatorial output) full_n_r same as above, but registered output (see note below) empty_n Indicates the FIFO has at least N entries (combinatorial output) empty_n_r same as above, but registered output (see note below) level indicates the FIFO level: 2'b00 0-25% full 2'b01 25-50% full 2'b10 50-75% full 2'b11 %75-100% full combinatorial vs. registered status outputs ------------------------------------------- Both the combinatorial and registered status outputs have exactly the same synchronous timing. Meaning they are being asserted immediately at the clock edge after the last read or write. The combinatorial outputs however, pass through several levels of logic before they are output. The registered status outputs are direct outputs of a flip-flop. The reason both are provided, is that the registered outputs require quite a bit of additional logic inside the FIFO. If you can meet timing of your device with the combinatorial outputs, use them ! The FIFO will be smaller. If the status signals are in the critical pass, use the registered outputs, they have a much smaller output delay (actually only Tcq). Parameters ---------- The FIFO takes 3 parameters: dw Data bus width aw Address bus width (Determines the FIFO size by evaluating 2^aw) n N is a second status threshold constant for full_n and empty_n */ // Selecting Sync. or Async Reset // ------------------------------ // Uncomment one of the two lines below. The first line for // synchronous reset, the second for asynchronous reset `define SC_FIFO_ASYNC_RESET //Uncomment for Syncr. reset //`define SC_FIFO_ASYNC_RESET or negedge rst // Uncomment for Async. reset module fifo#(parameter dw=32,aw=5,n=32)(clk, rst, din, we, dout, re, full, empty, full_r, empty_r, full_n, empty_n, full_n_r, empty_n_r, level,count); parameter max_size = 1<= (n-1) ) & !re) empty_n_r <= #1 1'b0; else if(re & (cnt <= n ) & !we) empty_n_r <= #1 1'b1; always @(posedge clk `SC_FIFO_ASYNC_RESET) if(!rst) full_n_r <= #1 1'b0; else if(we & (cnt >= (max_size-n) ) & !re) full_n_r <= #1 1'b1; else if(re & (cnt <= (max_size-n+1)) & !we) full_n_r <= #1 1'b0; //////////////////////////////////////////////////////////////////// // Sanity Check always @(posedge clk) if(we & full) $display("%m WARNING: Writing while fifo is FULL (%t)",$time); always @(posedge clk) if(re & empty) $display("%m WARNING: Reading while fifo is EMPTY (%t)",$time); endmodule