Part 3 · Factory & Configuration · Intermediate
vif Distribution Checklist: Bring-Up and Regression Verification
Production checklists for vif distribution bring-up, code review gates, smoke tests, and regression hygiene.
Bring-up checklist
HDL layer
Interface defined with all DUT-facing signals.
Modports declared for driver and monitor access patterns.
Interface instantiated in top, connected to DUT ports.
Clock/reset driven before run_test().
[HDL] bring-up gate
□ interface compiles with DUT port connection
□ modports match driver/monitor access style
□ no unresolved virtual interface in module scopeCONFIG layer
config_db.set() called in top initial before run_test().
Set path matches expected uvm_test_top.env.<agent>.* pattern.
Set type matches get type (including modport if used).
Multi-instance: one set per interface instance with distinct path.
[CONFIG] bring-up gate
□ set before run_test in same initial block
□ dump shows vif entry at expected scope
□ field name documented ("vif" or project constant)
□ multi-instance paths verified per agentUVM layer
Agent gets vif in build_phase with fatal on failure.
Agent forwards vif to children before creating them.
Driver/monitor get vif in build_phase — not run_phase.
end_of_elaboration logs confirm vif non-null for all agents.
function void end_of_elaboration_phase(uvm_phase phase);
super.end_of_elaboration_phase(phase);
`uvm_info("VIF_CHECK",
$sformatf("%s vif=%s", get_full_name(), (vif == null) ? "NULL" : "OK"),
UVM_LOW)
endfunctionCode review gates
[HDL][CONFIG][UVM] review checklist
□ no interface instance inside class
□ no new() for interface — only virtual handle
□ set path uses uvm_test_top prefix from top (context=null)
□ get checks return value for required vif
□ agent creates children AFTER vif forward set
□ modport types consistent on set and get
□ config object vif assigned before config_db setReject PRs that get vif in run_phase without build_phase check.
Require smoke test passing for each new interface instance.
Document path convention in env README or package spec.
Smoke test pattern
class vif_smoke_test extends uvm_test;
`uvm_component_utils(vif_smoke_test)
my_env env;
function void build_phase(uvm_phase phase);
super.build_phase(phase);
env = my_env::type_id::create("env", this);
endfunction
function void end_of_elaboration_phase(uvm_phase phase);
super.end_of_elaboration_phase(phase);
check_agent_vif(env.apb0, "apb0");
check_agent_vif(env.apb1, "apb1");
endfunction
function void check_agent_vif(apb_agent agt, string label);
if (agt.drv.vif == null)
`uvm_fatal("VIF_SMOKE", {"null vif on ", label})
`uvm_info("VIF_SMOKE", {label, " vif OK"}, UVM_LOW)
endfunction
endclass[UVM] regression hygiene
nightly: vif_smoke_test in fast smoke suite
per-PR: lint for unchecked vif get()
release: all interface instances covered by smoke
failure signature: VIF_SMOKE fatal → config path bug, not DUT bugKey takeaways
Treat vif distribution as infrastructure — checklist on every new interface.
Smoke test in end_of_elaboration catches path bugs before stimulus.
Code review gates prevent run_phase vif get anti-pattern.
Common pitfalls
Skipping smoke test for 'simple' single-instance bring-up.
Adding interface instance without updating top set paths.
Closing vif bugs without adding smoke coverage — regression repeats.