Question 01MediumUVM Components
How to Drive a Ready/Valid Interface Correctly
Implement the core of a UVM driver for a single-beat ready/valid interface. Present one sequence item, hold its payload stable while stalled, and finish the item only after a real handshake.
Concise answerThe driver should fetch one item, drive its payload and valid once, and wait at clocking-block sample points until ready is exactly 1. It must keep every driven field unchanged during backpressure, lower valid after acceptance, and call item_done only after the handshake edge.
Question 02MediumRTL Design
How to Build a Synchronous FIFO in SystemVerilog
Design a parameterized synchronous FIFO, then write a small bus-functional model that can reset it, push one item, and pop one item without testbench races.
Concise answerModel occupancy from accepted reads and writes, not raw requests. Permit a write at full only when a read also succeeds, register the popped word, update count from the push/pop combination, and wrap pointers explicitly at DEPTH - 1. In the BFM, use a clocking block and sample registered read data on the following edge.
Question 03MediumClock Domain Crossing
Clock-Domain Crossing Strategies for ASIC Interviews
Given a single-bit level, a narrow pulse, a slowly changing multi-bit setting, and a sustained data stream, choose an appropriate clock-domain crossing (CDC) architecture and implement representative single-bit level and pulse synchronizers.
Concise answerUse a two-flop synchronizer for a stable one-bit level; convert a short pulse into a source toggle and acknowledge it before accepting another event. Hold multi-bit control data stable under a bundled-data handshake, and carry continuous traffic through an asynchronous FIFO. Each destination domain also needs its own reset-release synchronization.
Question 04EasyReset Design
Async Assert, Sync Deassert Reset
Design an active-low reset conditioner that asserts immediately but releases only after two clean destination-clock edges. Explain when synchronous and asynchronous reset styles are appropriate.
Concise answerClear both stages of a two-flop chain asynchronously when arst_n falls. After arst_n rises, shift a 1 through the chain on destination-clock edges and derive srst_n from the second stage. Instantiate this conditioner separately for every unrelated clock, and reset only state that the design contract requires.
Question 05HardRTL Design
How a Ready/Valid Skid Buffer Handles Backpressure
Design a two-entry ready/valid skid buffer that can accept one extra item after downstream stalls, keeps output data stable while stalled, and removes the combinational ready path from downstream to upstream.
Concise answerImplement the buffer as a two-entry FIFO with registered occupancy. Set upstream ready whenever occupancy is below two, output the head entry whenever occupancy is nonzero, and update storage from the four push/pop combinations. A stalled output keeps its head value unchanged; a full buffer may insert one bubble because ready cannot anticipate a same-edge pop.
Question 06MediumVerification Utilities
Why UVM Uses SystemVerilog Virtual Interfaces
Why is a virtual interface commonly placed into a class-based driver's configuration?
Concise answerA virtual interface gives the class-based driver a typed reference to an already-elaborated interface instance. Supplying that reference through configuration avoids fixed hierarchical names and lets the same driver connect to different interfaces; the `.master` modport preserves its intended access directions.
Question 07EasyUVM Components
How to Pass a Virtual Interface with uvm_config_db
A top-level module must make one virtual bus_if available to both an agent's driver and monitor. Which pattern is most idiomatic?
Concise answerPublish the concrete interface handle through `uvm_config_db#(virtual bus_if)` using a scope that covers the agent’s driver and monitor, then retrieve it during each component’s build phase. The UVM factory cannot create an HDL interface instance.
Question 08EasyUVM Components
uvm_object vs. uvm_component
A reusable packet configuration has no hierarchy, ports, or phase behavior. Why is extending uvm_object usually preferable to extending uvm_component?
Concise answerUse `uvm_object` because the configuration is data rather than a structural testbench element. It needs neither a hierarchical parent nor phase callbacks, ports, or persistent component lifetime. Choosing an object keeps construction and reuse simpler without preventing factory registration or randomization.
Question 09EasyUVM Components
UVM build_phase vs. connect_phase
Which allocation of work follows normal UVM phase intent?
Concise answerCreate child components during `build_phase`, then bind their TLM connections during `connect_phase`. Construction must finish before connections are made, so every required port, export, and child instance exists when the testbench wiring is established.
Question 10EasyUVM Components
How UVM Phase Objections Work
What is the primary effect of a component raising an objection on run_phase?
Concise answerA raised run-phase objection keeps that task phase from completing until the objection is dropped. Simulation time and concurrent component tasks continue normally; the objection changes the phase-ending decision, not the scheduler, clock, or execution order.
Question 11EasyUVM Components
How UVM Factory Type Overrides Work
A type override from base_pkt to crc_pkt is installed before any packets are created. Which creation is eligible to return a crc_pkt?
Concise answer`base_pkt::type_id::create("p")` is eligible to produce a `crc_pkt`. The type override participates only when a new request goes through the UVM factory; direct `new` calls and objects allocated before the override remain unaffected.
Question 12EasyUVM Components
How to Connect a UVM Sequencer and Driver
Which connection enables a uvm_driver to pull sequence items from its sequencer?
Concise answerConnect `driver.seq_item_port` to `sequencer.seq_item_export`. The driver initiates the pull operations through its port, while the sequencer exposes the implementation that arbitrates and supplies items. This connection normally belongs in the active agent’s `connect_phase`.
Question 13MediumUVM Components
UVM get_next_item and item_done Handshake
What is wrong with this driver loop?
Concise answerThe loop requests a second item before completing the first. After each successful `get_next_item(req)`, the driver must finish driving that request and call `item_done()` exactly once before another `get_next_item`. Otherwise the sequencer-driver handshake can stall or report a protocol violation.
Question 14EasyUVM Components
How a UVM Analysis Port Works
Which statement best describes uvm_analysis_port::write?
Concise answer`uvm_analysis_port::write` distributes one transaction handle to every connected subscriber without a return handshake. It is a function-based observation broadcast, permits zero subscribers, performs no arbitration, and does not automatically clone the transaction for each recipient.
Question 15HardReference Models
How to Build an Out-of-Order UVM Scoreboard
A DUT can return responses out of order and may reuse transaction IDs after reset. Which scoreboard design is most robust?
Concise answerUse identity-based matching keyed by transaction ID plus a reset generation, and define what reset does to outstanding expectations. This supports out-of-order completion while preventing a post-reset response from matching stale pre-reset state that happened to use the same ID.