Two kinds of plumbing run under every testbench and are invisible until they fail. Synchronisation decides who waits for whom: a test waiting for an interrupt, three agents meeting after configuration, a watchdog deciding that silence means a hang. Reporting decides what a message means: whether an error counts, whether a known issue is waived, and what single line tells the regression system that a test passed. This topic covers both, on the course DMA bench, with every library behaviour checked against the 1800.2 reference source.
Pick between uvm_event, uvm_barrier, the global pools, TLM and config_db for a given coordination problem, and avoid the same-time-step race that makes a waiter miss a trigger.
Write a report catcher that waives exactly one known issue, with a ticket, a scope and an expiry, and explain why a broad one causes false passes.
Extend the report server so every run ends with one verdict line and a machine-readable summary, even when it stops on a fatal or on the quit count.
Choose between a global timeout, uvm_heartbeat and an activity watchdog, and configure the heartbeat so it actually fires.
Turn on transaction recording for a debug rerun, know what it costs, and keep it out of regressions.
# | Lesson | The question it answers |
|---|---|---|
1 | How do two components that share no handles wait for each other, and why does a waiter sometimes miss a trigger? | |
2 | How do you waive one known error without hiding the next real one? | |
3 | What single line should a regression trust, and how do you guarantee it is printed? | |
4 | How do you end a hung test in microseconds instead of hours? | |
5 | How do you see transactions, not just wires, in the waveform viewer, and when is it worth the cost? |