Supreeth's picture
Upload folder using huggingface_hub
2b4ae64 verified
# Task 7: Parameterized Ring Buffer (Medium)
## Objective
Implement a power-of-2-depth ring buffer (circular FIFO) with push/pop interface,
full/empty flags, and an item count output. Ring buffers are the standard data
structure for KV-cache management and activation streaming in inference accelerators.
## Interface
```verilog
module ring_buffer #(
parameter DEPTH = 8, // must be power of 2
parameter DATA_W = 8
) (
input wire clk,
input wire rst, // synchronous reset, active high
input wire push,
input wire [DATA_W-1:0] push_data,
input wire pop,
output wire [DATA_W-1:0] pop_data, // valid only when !empty
output wire full,
output wire empty,
output wire [$clog2(DEPTH):0] count // 0 … DEPTH (extra bit for full detection)
);
```
## Specification
- On `push` when **not full**: store `push_data` at tail, advance tail, increment count.
- On `pop` when **not empty**: advance head, decrement count.
- On **simultaneous push + pop** when **neither full nor empty**: both happen, count unchanged.
- On `push` when **full**: push is silently ignored (no data loss).
- On `pop` when **empty**: pop is silently ignored.
- `rst` (synchronous): clears head, tail, and count to 0.
- `pop_data` always reflects `mem[head]` combinatorially (valid only when `!empty`).
- `full` is true when `count == DEPTH`.
- `empty` is true when `count == 0`.
## Scoring
- Correct compilation: 10%
- Passing simulation tests: 70%
- Area efficiency vs reference: 20%
## Notes
- Wrap head and tail with modulo arithmetic or by masking to `$clog2(DEPTH)-1` bits.
- The count register needs one extra bit: `[$clog2(DEPTH):0]` to distinguish 0 from DEPTH.
- Simultaneous push + pop is the tricky case — handle it explicitly with `do_push`/`do_pop` wires.