December 11, 2006 Update: Check out the response from Cliff and additional info from Kevin in the comments section of this post.
Editor's Note: Today special guest Kevin Johnston from Verilab will be joining us to provide an analysis of FIFO designs published by Cliff Cummings for SNUG 2002. Prior to joining Verilab as a consultant in 2005, Kevin spent 14 years at Motorola/Freescale working on a variety of processor and SoC designs including the PowerPC and 68k. The following article is his first post on Cool Verification. Hope you enjoy it! -- JL.
There are two basic async FIFO design styles:
- "Pointer-less", also known as "fall-through" type:
Fully-asynchronous, self-timed control logic (full-custom or compiled,
embedded in the data memory array design) autonomously clocks write
data from any current memory location to the subsequent memory location
if that subsequent location is empty; the data "falls through" the FIFO
from the memory cells connected to the Write port to the memory cells
connected to the Read port.
- "Pointer based": The data array is a standard dual-port SRAM
block; all control logic is external to the memory. A Write Pointer
supplies the array address on the Write port, and a separate Read
Pointer supplies the array address on the Read port. The data remains
in the same memory location for the duration of its residence in the
FIFO; the Write Pointer and Read Pointer cycle through the memory
address range in identical sequences to retrieve the data in the same
order it was entered.
Cliff Cummings has written an excellent general treatment of asynchronous FIFO design in his paper, "Simulation and Synthesis Techniques for Asynchronous FIFO Design" ("FIFO1").
Cliff also wrote a follow-on paper entitled "Simulation and Synthesis Techniques for Asynchronous FIFO Design with Asynchronous Pointer Comparisons" ("FIFO2") describing two major modifications to FIFO1: A different method to detect Full/Empty status, and reduction of two multi-bit synchronizers (for the entire Read and Write pointers) down to two single-bit synchronizers (for just the Full and Empty bits themselves).
FIFO1 and FIFO2 are both pointer-based designs.
I believe FIFO2 has both an implementation flaw and a fundamental conceptual flaw; that is, the implementation flaw can be fixed, but the conceptual flaw cannot.