Part 2 · OOP for Verification · Intermediate
Virtual Interfaces: the Class-to-Pins Bridge
Hub — why virtual interfaces exist, declaring and binding, clocking-block access, configuration patterns, and multi-instance vifs.
Overview
Classes live in the dynamic world: created at runtime, no fixed position in the design hierarchy, no pins. The DUT lives in the static world: modules and interfaces elaborated before time zero, with real signals. A virtual interface is the one language feature that bridges them — a class property that holds a reference to an interface instance , letting a driver or monitor object read and drive actual DUT pins through vif.signal.
Every class-based testbench — hand-built or UVM — depends on this bridge. Understanding what a vif actually stores, how it gets bound from the top module, and how to drive through it race-free (clocking blocks) explains half of the runtime crashes beginners hit, starting with the infamous null-vif fatal at time zero. It is also among the most reliably asked interview topics for verification roles.
Sub-topics
Why Virtual Interfaces Exist — static vs dynamic worlds and the binding problem.
Declaring & Binding a vif — class declaration, top-level assignment, null-vif guards.
Driving & Sampling via Clocking Blocks — vif.cb semantics and race-free driver/monitor code.
vif Configuration Patterns — constructors vs config objects, central config class, what config_db does.
Multi-Instance & Parameterized vifs — vif arrays for multi-port DUTs and width strategies.
VIRTUAL INTERFACE TOPIC MAP
STATIC WORLD (elaborated) DYNAMIC WORLD (runtime objects)
───────────────────────── ───────────────────────────────
module tb_top; class driver;
bus_if bif (clk); ◄────────┐ virtual bus_if vif; ◄── holds a
dut u_dut (...); │ task run(); REFERENCE,
initial begin │ vif.cb.addr <= ...; not a copy
env = new(bif); ───────────┘ endtask
end binding: endclass
endmodule real instance → class handle
topics: why it exists → bind it → drive through cb
→ distribute it (config) → scale it (arrays/params)Key takeaways
A virtual interface is a class property referencing a real, elaborated interface instance.
Binding flows from the static top module down into dynamic class objects — never the reverse.
Clocking blocks via vif.cb are how class code drives and samples pins race-free.