File size: 2,827 Bytes
a8baeed | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | # bit_accelerator_v2 - Verified Status
Everything below was measured by running `make test` (Verilator 5.020, Icarus Verilog 12.0,
Why3 1.6.0 with Z3 4.8.12).
## Result
- Simulation: `checks=182 fails=0` under both Verilator and Icarus.
- Lint: `verilator --lint-only -Wall` clean.
- Formal: 33/33 Why3 goals valid with Z3.
## Observed cycle timing (1-cycle-latency memory, no stalls)
a = cycle in which `op_valid && op_ready` is sampled.
| Op | Timeline |
|----|----------|
| BIT_GET | READ_REQUEST a+1, READ_RESPONSE a+2, RESULT_VALID a+3 (one cycle) |
| SET/CLEAR/TOGGLE | READ_REQUEST a+1, READ_RESPONSE a+2, MODIFY a+3, WRITE accepted a+4, RESULT_VALID a+6 |
| Write stalled (`mem_ready=0` a+4..a+6) | request and wdata held, accepted a+7, RESULT_VALID a+9 |
| Read stalled (`mem_ready=0` a+1..a+2) | accepted a+3, response a+4, RESULT_VALID a+5 |
## Covered by the testbench
- Result value for GET (set/clear bits, cross-word offsets, non-zero base).
- Memory contents after SET/CLEAR/TOGGLE, including word 1 targets.
- Exactly one `result_valid` pulse per op; `op_ready` low while busy.
- Write and read backpressure: signals held stable, no early result, write committed once.
- Reset asserted in each of READ_REQUEST, READ_WAIT, MODIFY, WRITE_REQUEST, WRITE_WAIT:
no `result_valid`, no write after reset, DUT idle, and a fresh op completes normally.
## Defects found by simulation and fixed
1. `result_valid` was registered, so it appeared one cycle later than specified (a+4 instead of a+3).
It is now combinational from `ST_RESULT`.
2. A reset in the same cycle as a write handshake let the memory commit the write.
`mem_valid/mem_write/mem_wstrb/mem_wdata` are now forced low while `reset` is asserted.
3. `error` was set on any `mem_fault`; it is now cleared on accept and set only in `ST_READ_WAIT`.
4. Read-fault tests were added (GET/SET/TOGGLE): `error` is high in the result cycle, no write
is issued, and the next operation clears it. The testbench now exits non-zero on failure.
5. Lint fixes: explicit zero-extension of `mem_addr`, bit extraction reads `read_word[bit_index]` directly.
6. The previous testbench did not compile, sampled after the clock edge (racy), and modeled
2-cycle read latency. It was rewritten to log pre-edge values per cycle.
## Not verified / known limits
- Only read faults exist; there is no write-fault input path.
- `BIT_TEST` (3'b001) behaves like GET; no flag output exists.
- `base_address << 3` truncates the top 3 bits of `base_address`, and `mem_addr` is 61 significant bits.
- The Why3 proofs cover the specification; RTL-to-specification agreement is checked by simulation only.
- Undefined opcodes (101-111) execute as a read with no write and no error.
- No synthesis was run; area/power/frequency numbers elsewhere in this repo are estimates.
|