The agents you have built so far all have the same shape: a sequence decides, a driver obeys, a monitor reports. Real interfaces break that shape in four ways. Some interfaces are answered rather than commanded. Resets arrive while a transfer is half done. Interrupts are not a bus at all. And fast buses keep many transactions in flight at once. Each of those breaks a beginner's driver loop, and each is a favourite senior interview question.
Every pattern in this topic is built on the DMA bench, and all four were run: three on the bench itself and the pipelined driver on a small AXI-style read model.
Build a reactive slave agent that answers the DUT with random backpressure, and swap it in with an instance override that touches one agent only.
Make drivers, monitors and the scoreboard survive a reset in the middle of a job, and explain why the scoreboard flushes when reset ends, not when it starts.
Turn an interrupt wire into a passive agent that publishes transactions and triggers events, so tests and sequences never need its virtual interface.
Write a pipelined, out-of-order driver with separate request and response threads, an outstanding table per ID, and correct response routing.
Lesson | What it covers |
|---|---|
axis_sink_agent and axis_ready_seq: the driver waits for TVALID and asks a forever sequence how long to stall; dma_backpressure_test. | |
Reset-aware drivers with an isolated fork, item_done for a held item, killing stimulus, and a scoreboard that flushes when reset ends; dma_reset_test. | |
A passive irq agent with analysis items and a global uvm_event; level versus edge, W1C clearing, storms and cause coverage; dma_irq_agent_test. | |
Address and data threads, get versus get_next_item, put_response with set_id_info, and an outstanding table keyed by ID. |