Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 24 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,30 @@ Every module has a self-checking testbench, and the asynchronous FIFO carries a

![Asynchronous FIFO block diagram](docs/async_fifo_block.svg)

## Verification

| Module | Method |
|--------|--------|
| `synchronizer` | Self-checking testbench |
| `sync_fifo` | Self-checking testbench |
| `async_fifo` | Self-checking testbench + SymbiYosys proofs |

The `fifomem`, `wptr_full`, and `rptr_empty` submodules are exercised through the `async_fifo` testbench and covered by its formal proof.

Properties proven in formal:
- Occupancy never exceeds `DEPTH`
- `empty` is asserted when occupancy equals zero
- `full` is asserted when occupancy equals `DEPTH`
- Gray-coded pointers maintain correct ring ordering across all write/read clock patterns
- Write pointer is never passed by read pointer and vice versa
- Proven over unbounded k-induction for all possible inputs and clock patterns

## Results

![Synchronous FIFO waveform](docs/sync_fifo_waveform.svg)

![Asynchronous FIFO waveform](docs/async_fifo_waveform.svg)

## Parameters

| Parameter | Default | Description |
Expand Down Expand Up @@ -51,30 +75,6 @@ Every module has a self-checking testbench, and the asynchronous FIFO carries a
| `rd_data` | out | `WIDTH` | Data read |
| `empty` | out | 1 | FIFO is empty in read domain (cannot read) |

## Verification

| Module | Method |
|--------|--------|
| `synchronizer` | Self-checking testbench |
| `sync_fifo` | Self-checking testbench |
| `async_fifo` | Self-checking testbench + SymbiYosys proofs |

The `fifomem`, `wptr_full`, and `rptr_empty` submodules are exercised through the `async_fifo` testbench and covered by its formal proof.

Properties proven in formal:
- Occupancy never exceeds `DEPTH`
- `empty` is asserted when occupancy equals zero
- `full` is asserted when occupancy equals `DEPTH`
- Gray-coded pointers maintain correct ring ordering across all write/read clock patterns
- Write pointer is never passed by read pointer and vice versa
- Proven over unbounded k-induction for all possible inputs and clock patterns

## Results

![Synchronous FIFO waveform](docs/sync_fifo_waveform.svg)

![Asynchronous FIFO waveform](docs/async_fifo_waveform.svg)

## Building and running

Every module builds from the top-level Makefile.
Expand Down
Loading