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

  1. Interface defined with all DUT-facing signals.

  2. Modports declared for driver and monitor access patterns.

  3. Interface instantiated in top, connected to DUT ports.

  4. Clock/reset driven before run_test().

diagram
[HDL] bring-up gate

  □ interface compiles with DUT port connection
  □ modports match driver/monitor access style
  □ no unresolved virtual interface in module scope

CONFIG layer

  1. config_db.set() called in top initial before run_test().

  2. Set path matches expected uvm_test_top.env.<agent>.* pattern.

  3. Set type matches get type (including modport if used).

  4. Multi-instance: one set per interface instance with distinct path.

diagram
[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 agent

UVM layer

  1. Agent gets vif in build_phase with fatal on failure.

  2. Agent forwards vif to children before creating them.

  3. Driver/monitor get vif in build_phase — not run_phase.

  4. end_of_elaboration logs confirm vif non-null for all agents.

systemverilog
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)
endfunction

Code review gates

diagram
[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 set
  • Reject 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

systemverilog
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
diagram
[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 bug

Key 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.