Wishbone · Module 30
RTL Checklist
A review item that cannot be failed is not a review item. Eighteen RTL items with inspection points, pass criteria and executed negative controls.
A checklist that reads "[ ] ACK works" has not reviewed anything. It has recorded that somebody thought about ACK.
A CHECKBOX WITHOUT EVIDENCE IS NOT A REVIEW.
This module converts the whole curriculum into a review system built on one shape:
REQUIREMENT -> INVARIANT -> EVIDENCE -> DECISION1. What A Review Item Owes You
Every substantial item in these six chapters answers eight questions. Here is the schema, and one item filled in:
| field | example |
|---|---|
| ID | RTL-07 |
| Review question | Does each accepted write commit exactly once? |
| Failure mode | A side effect repeats for every clock the request stands. |
| Classification | SYSTEM INVARIANT |
| Inspection point | The qualifier on the commit expression. |
| Evidence | A commit census against a non-idempotent location, at zero and non-zero wait states. |
| PASS | commits == accepted writes, at every latency. |
| FAIL | commits > accepted writes at any latency. |
The classification field is not decoration. Six values are in use across this module, and mixing them up is how a reviewer loses an argument they were right about:
SPEC REQUIRED · SYSTEM INVARIANT · IMPLEMENTATION CHOICE · LOCAL POLICY · VERIFICATION QUALITY · REVIEW HYGIENE
2. Three Levels, And Stopping At One Is The Common Failure
| level | asks | example |
|---|---|---|
| 1 — structural | is the architecture coherent? | address regions do not overlap |
| 2 — behavioural | does the implementation hold the invariant? | exactly one intended target responds |
| 3 — evidence | is there proof? | boundary sweep + decode census + alias probes |
Most reviews that go wrong went wrong at Level 3. The architecture was fine, the implementation was plausible, and nobody asked what would have been different if it were broken.
3. Dispositions
Use seven, and never collapse the fourth into the first:
PASS · FAIL · NOT APPLICABLE · NOT VERIFIED · OPEN RISK · LOCAL POLICY — ACCEPTED · LOCAL POLICY — REQUIRES DECISION
NOT VERIFIED is not PASS. It is the honest record that nobody looked. Writing PASS instead converts an open question into a closed one without doing any work, and the cost lands on whoever integrates the block.
4. The Clean Baseline
Nothing below means anything without a reference. Three operations against a three-wait slave, reviewed:
=== SIM A - CLEAN RTL REVIEW ===
three operations against a three-wait slave
ops retired 3
phases opened at the pins 3
terminations at the pins 3
acknowledgements 3
wait clocks 9
commits 2
write-to-increment register 1
unknown pins 0
phase still open at the end 0
review conditions failing 0
unknown review conditions 0
counter saturated 0Eight review conditions, evaluated by a counter that can represent the number it claims to count — Chapter 30.2 explains why that sentence needed writing. Two commits for two writes. One increment for one write to the increment register. Nine wait clocks, which proves the waits actually happened rather than being configured and ignored.
5. RTL-03 — Request Stability
Review question. Do the qualified signals hold still for the whole open phase, at the boundary where it matters?
Classification. SPEC REQUIRED.
RULE 3.60 — MASTER MUST qualify with
STB_O:ADR_O,DAT_O(),SEL_O(),WE_O,TAGN_O.
The trap. That rule binds the master. It says nothing about what an interconnect does to the request on the way down. A checker at the master port can report a clean run while the slave is receiving a different request every clock.
=== SIM B - REQUEST-STABILITY FAILURE ===
waits P0 context moves P2 context moves scoreboard first bad boundary
0 0 0 0 none
3 0 3 0 P1->P2Two findings, and the second is the more uncomfortable.
At zero wait states the defect does not exist. Not hidden — a phase one clock long has no interior for anything to move inside. A review that ran only the fast configuration has proved nothing about this item, and its correct disposition is NOT VERIFIED.
And the scoreboard reports zero at both latencies:
AND NOTE THE SCOREBOARD COLUMN: 0.
The address moved on three transfers and the data still
came back correct, because each disturbed address landed
on an equivalent read-write register. The functional
checker is blind here and the protocol checker at P2 is
not. A review that owns only one of them owns neither.PASS criterion: zero context moves at every boundary the request crosses, at non-zero latency. FAIL: any context move at any boundary, regardless of what the scoreboard says.
6. RTL-07 — Exactly-Once Side Effects
Review question. Does an accepted write commit once, and only once?
Classification. SYSTEM INVARIANT. B3 has nothing to say about a slave's internal commit policy; it defines the termination, not what the slave does about it.
Inspection point. One expression:
// THE COMMIT QUALIFIER. This one line is the difference between a
// correct slave and Lab B's broken one.
logic commit;
assign commit = WRITE_ON_STB ? (present && we_i) : (ack_o && we_i);EXECUTED RTL — the WRITE_ON_STB branch is an intentional defect, exercised in SIM C.
ack_o && we_i commits on the accepted clock. present && we_i commits on every presented clock. At zero wait states those are the same clock, which is why the wrong one survives review after review.
=== SIM C - DUPLICATE SIDE EFFECT ===
rig presented terminated commits increment reg
correct, 3 waits 12 3 2 1
WRITE_ON_STB, 0 waits 3 3 2 1
WRITE_ON_STB, 3 waits 12 3 8 4Read the terminated column: 3 in every row. A termination census cannot see this defect at all. Read the middle row: the broken design at zero waits is byte-identical to the correct one.
And note what makes it visible. The evidence register is write-to-increment, because writing the same value four times to ordinary storage leaves the same value. The review item is not "count the commits" — it is "count the commits against a location where repetition changes the answer."
Evidence required: a commit census, at non-zero latency, against a non-idempotent target. PASS: commits == accepted writes. FAIL: anything else.
7. RTL-12 — Termination Provenance
Review question. Does each termination correspond to exactly one live presented request, delivered to its owner?
Classification. SPEC REQUIRED for the shape, SYSTEM INVARIANT for the destination.
RULE 3.35 —
ACK_O,ERR_O,RTY_Omust be generated in response to the logical AND ofCYC_IandSTB_I.
RULE 3.35 governs whether a termination answers a request. Nothing in B3 governs whether it answers yours — because B3's model is point to point and has exactly one master per interface. Destination is your invariant, and Chapter 30.4 is where it gets reviewed.
8. The Review Escape
This is the chapter's thesis, made executable. One routing defect, run past every layer a shallow review trusts:
=== SIM L - REVIEW ESCAPE ===
the same four register operations, one routing defect
review layer control defective catches it?
elaboration clean clean no
protocol checks P0 / P2 0/0 0/0 no
immediate assertions SPEC 0 0 no
monitor transactions 4 4 no
scoreboard mismatches 0 1 partly
register-slave phases seen 7 0 YESFour transfers acknowledged. Zero protocol violations at either boundary. Zero specification assertion failures. The same transaction count as the control. And the register bank was never strobed once.
Only the last row catches it, and that row is a decode census — a number no protocol layer computes, because no Wishbone rule encodes your address map.
The scoreboard says partly, and the qualifier matters: it caught one of four wrong transfers, the write to a read-only offset that the memory happily acknowledged. The other three wrote and read the same wrong location, and self-consistency is indistinguishable from correctness.
9. False Confidence
Every chapter in this module exposes one. Here are the two that belong to RTL:
"It compiles."
Proves: the syntax is legal and the module elaborates.
Does not prove: anything about behaviour. Both defects in SIM B and SIM C elaborate cleanly, with -Wall, with no warnings.
Missing evidence: a simulation at non-zero latency with a census attached.
"The basic test passed." Proves: one stimulus produced one expected result. Does not prove: that the stimulus could have produced a different result if the design were wrong. SIM C's zero-wait row is a passing basic test on a design that commits four times per write. Missing evidence: the same test at a second latency, and a negative control.
10. The RTL Checklist
Eighteen items. Classification in brackets; NV marks the ones a fast review most often leaves NOT VERIFIED.
| id | review question | classification |
|---|---|---|
| RTL-01 | Do widths, directions and optional-signal presence match the datasheet? | SPEC REQUIRED |
| RTL-02 | Is CYC_O asserted no later than the edge qualifying STB_O? | SPEC REQUIRED |
| RTL-03 | Do qualified signals hold still at every boundary, at non-zero latency? NV | SPEC REQUIRED |
| RTL-04 | Does the slave ignore slave signals while CYC_I is negated? | SPEC REQUIRED |
| RTL-05 | Is a termination generated only in response to CYC_I AND STB_I? | SPEC REQUIRED |
| RTL-06 | If ERR_O or RTY_O exist, is at most one termination asserted? | SPEC REQUIRED |
| RTL-07 | Does each accepted write commit exactly once, proved non-idempotently? NV | SYSTEM INVARIANT |
| RTL-08 | Are read side effects qualified by acceptance, not presentation? NV | SYSTEM INVARIANT |
| RTL-09 | Is DAT_O() qualified by the termination? | SPEC REQUIRED |
| RTL-10 | Does the byte-lane merge honour SEL_I on partial writes? | SYSTEM INVARIANT |
| RTL-11 | Is the read path free of stale data across back-to-back transfers? | SYSTEM INVARIANT |
| RTL-12 | Does each termination map to one live request and reach its owner? NV | SYSTEM INVARIANT |
| RTL-13 | Does reset leave no spurious request and no spurious termination? | SPEC REQUIRED |
| RTL-14 | Is pending state discarded or completed coherently across reset? | LOCAL POLICY |
| RTL-15 | Do parameter extremes hold — one entry, full width, zero waits? | IMPLEMENTATION CHOICE |
| RTL-16 | Are array indices and counters wide enough for every legal parameter? | IMPLEMENTATION CHOICE |
| RTL-17 | Are CYC/STB collapsed only where the master never throttles? | SPEC REQUIRED |
| RTL-18 | Has every item above been exercised at more than one latency? NV | REVIEW HYGIENE |
RTL-18 is the one that makes the other seventeen mean anything.
11. What To Carry Forward
- An item without a PASS criterion is a topic, not a review item.
- NOT VERIFIED is a disposition. Use it; it is the only honest record of what was not looked at.
- Run every functional item at two latencies. Two of this chapter's three defects cannot exist at zero.
- Count side effects against non-idempotent targets, or the count proves nothing.
- A termination census cannot see a commit defect, and a protocol checker cannot see a routing defect.
- "It compiles" and "the basic test passed" are both true of designs in this chapter that are badly broken.
Chapter 30.2 asks the harder question: could the verification environment have detected any of this?
Continue learning
Related tutorials
- Related topic
RTL Checklist — When Two Legal Events Collide
Endpoint RTL rarely fails on steady-state equations. It fails when an allocation and a retirement land in the same cycle, when a tag is freed while its Completion is still coming, and when clean lint certifies a counter that loses every simultaneous update.
- Related topic
CPU to Peripheral Communication
A CPU reaches hardware outside itself by reading and writing addressed locations, and a peripheral is hardware it cannot execute. Everything a driver does has to be expressed as a read or a write of a location the peripheral answers for — and once more than a couple of peripherals exist, wiring each one to the core separately stops scaling. That is the problem an on-chip bus is the answer to.
- Related topic
Need for Standardized Interconnects
An address map answers where a register lives. It says nothing about which wires carry the request, when they are valid, how the target reports completion, or what happens on an error. Three peripherals with three private interfaces produce three adapters, three verification efforts and three ways to be wrong — which is the argument for standardising the interface rather than the map.
- Related topic
FPGA Design Challenges
Six peripherals and two masters on one FPGA is where on-chip integration stops being theory. The decode that must be exhaustive and one-hot, the read multiplexer that grows with every target and carries the critical path, the latency and reset conventions that refuse to agree, and the point at which the fabric rather than the peripherals starts failing timing.
Standards & specifications
- Governing standard
- Wishbone SoC Interconnection Architecture (OpenCores)(opens OpenCores in a new tab)
Defines the Wishbone signal set, the bus cycles built from it and the interface rules a portable IP core must follow. It deliberately leaves interconnect topology, address map and arbitration policy to the integrator, so those are system decisions rather than requirements of the specification.
This page also covers RTL structure, verification approach and debugging technique. Those are engineering practice built on the standard, not requirements the standard itself imposes.
Where this fits
Part of the Wishbone curriculum.
