This is an implementation of an asynchronous FIFO in verilog.
- The full flag is computed by comparing the write pointer (in gray code) with the synchronized read pointer (in gray code) in the write domain.
- The empty flag is computed by comparing the read pointer (in gray code) with the synchronized write pointer (in gray code) in the read domain.