This capstone verifies a design with the traits that make senior interviews hard: two request ports, reads that come back out of order across IDs, byte-strobed writes, back-pressure on both sides, and a reset that can land in the middle of traffic. The design is small enough to read in one sitting and real enough to hide bugs.
It reuses the patterns from the earlier topics: policy layers and an abstract BFM from Reusable Testbench Architecture, the ID scoreboard and memory model from Checking Out-of-Order Traffic, and the coverage mirror from Coverage Modelling. The last lesson plants six bugs and shows which checker catches each one, and when.
port 0 ──req──►┌──────────────────────────┐
port 1 ──req──►│ ooo_memctl #(BUG) │──rsp──► sink (back-pressure)
│ 16-word memory, strobes │
│ 8-entry read table │ in order per {port, id}
│ round-robin on contention│ any order across them
└──────────────────────────┘
policy items ─► abstract BFMs ─► pins ─► monitor ─► scoreboard + memory model
├──► coverage mirror (CV1-CV9)
└──► assertions: fairness, stability, no orphanLesson | What it covers |
|---|---|
The controller's rules, a risk ranking, plan rows with closure criteria, and a directed bench that checks each rule once. | |
Policy layers and test phases, abstract BFMs that drive through clocking blocks, reset-aware drivers, and a self-test of the plumbing. | |
ID scoreboard keyed by port and ID, memory snapshot at acceptance, drain accounting, assertions, and a unit test for the checkers. | |
The coverage rows, covergroup and cover-property forms, merging ten seeds, and reading the holes. | |
The complete bench, six planted bugs, which checker caught each one and at which cycle, and the sign-off review. |
The design has a BUG parameter. BUG = 0 is correct; 1 to 6 select an ID swap, a dropped strobe, a lost response after reset, starvation, a duplicate response, and wrong ordering within an ID. Every bench that contains the design passes with BUG = 0 and was run against the planted bugs.
Order is only free across ordering domains. Within one {port, id} the spec promises request order, so each domain gets its own queue and every response is compared with the head of its queue. Searching for a match anywhere would accept a within-ID swap, which is one of the planted bugs.