Skip to main content

Example Walkthrough: Verifying the FIFO

Every mechanism, methodology, and process across this curriculum's 20 pages now exists. This capstone doesn't introduce anything new — it applies all of it to the same synchronous FIFO Testbench and UVM already built full environments for, showing what a real verification effort around that testbench actually looks like end to end.

The verification plan, excerpted​

Per The Verification Plan's format, a real plan for this FIFO would include rows like:

FeatureRequirementCoverage goalChecking mechanismStatus
Full boundaryWriting while full is asserted must not corrupt existing dataCross: wr_en asserted, full assertedScoreboard compares queue contents before/afterClosed
Empty boundaryReading while empty is asserted must not return stale data as validCross: rd_en asserted, empty assertedScoreboard checks no read transaction recordedClosed
Data integrityBytes read out must match bytes written, in orderFunctional coverage: full data range on wr_dataScoreboard reference-model comparison, every readClosed
Full/empty mutual exclusionfull and empty never asserted simultaneouslyN/A — protocol invariant, not a data scenarioConcurrent assertion (SVA), checked every cycleClosed

The last row is worth noting specifically: not every requirement in a real plan maps to a functional coverage bin — the full/empty mutual-exclusion property is exactly the kind of thing Assertion-Based Checking already built for this FIFO, and a verification plan should name which mechanism closes each row, not assume every row needs the same kind of check.

These four rows are deliberately an excerpt, not the complete plan — a genuinely complete one for this FIFO would add rows for scenarios the excerpt doesn't show: back-to-back writes that hit full on consecutive cycles (not just a single write-while-full attempt), a simultaneous read and write occurring in the exact same cycle the FIFO is full (does the read draining one entry correctly allow that cycle's write through, or does the boundary logic get this ordering wrong), and reset asserted while full is already asserted (does the FIFO correctly return to empty, or does stale full-state logic survive the reset). Each is a real, distinct corner beyond what the four excerpted rows already cover — exactly the kind of additional row a thorough plan keeps adding as more of the design's actual edge cases get identified.

Applying the CDV loop​

The CDV Loop applied concretely: the generator built in Testbench randomizes write/read transactions across multiple seeds; the scoreboard measures both functional coverage (per the plan above) and code coverage on the FIFO's own RTL; analysis of an early coverage report might reveal the full+write-attempt cross bin rarely fills, since random stimulus alone rarely produces a write attempt at exactly the moment the FIFO is full — the refine step tightens the generator's constraints to bias toward that boundary specifically, rather than writing one brittle directed test for it.

The signoff checklist​

Every domain from Section D gets an explicit entry — including the ones that turn out not to meaningfully apply, marked so deliberately rather than silently skipped:

CheckApplicable to this FIFO?Status
Functional coverageYes98%, remaining bins under formal review
Code coverageYes100% statement/branch, toggle clean
Formal (assertion)Yes — full/empty mutual exclusionProven, non-vacuous
CDCOnly if instantiated across a clock boundaryN/A for a single-clock-domain instance
RDCYes — reset synchronization on rst_nClean
LintYesClean, zero violations
GLS / X-propagationYesClean against synthesized netlist
Power-awareOnly if instantiated inside a switchable power domainN/A for this standalone example
Timing (SDC review)YesConstraints reviewed, no front-end-visible issues

Two rows are explicitly N/A, not silently omitted — CDC only applies once this FIFO is instantiated somewhere that actually crosses a clock boundary, and power-aware verification only applies once it sits inside a domain that's actually switched. A real checklist names every category and marks non-applicability deliberately, exactly so a reviewer can tell "considered and doesn't apply" apart from "forgotten."

The signoff decision​

Per Verification Signoff & Metrics: 98% functional coverage with the remaining 2% under formal review (not just left open), 100% code coverage, a non-vacuous proven assertion, every applicable specialized check clean, and — the signal a percentage alone can't provide — a bug-discovery curve that flattened three regression cycles ago. That combination, not any single number in it, is what a real signoff decision is actually made of.

What's next​

This closes the Verification curriculum — 20 pages across 6 sections, from why verification is worth its cost, through coverage-driven and formal verification, six specialized front-end domains researched specifically for this site, and the process that turns all of it into an actual signoff decision. UPF remains the one topic still a stub on this site; every other verification-adjacent topic — SystemVerilog, Testbench, UVM, and now Verification itself — is complete.