Part 11 · Senior Prep · Intermediate
Block-Level Baseline: Active Agents and Full Checking
Establishing the block testbench as the reusable foundation — active agents, complete scoreboard, coverage, and a stable config API for upstream integration.
Block TB as the reusable foundation
The block testbench is the source of truth for agent behavior, coverage, and checking. Subsystem and SoC TBs inherit — they do not reimplement.
[ARCH][SENIOR][UVM] block baseline stack
tb/top.sv
interfaces + config_db vif push
-> block_test
-> block_env
-> bus_agent [ACTIVE]
mon -> coverage + analysis
drv/sqr -> stimulus
-> block_scoreboard
-> reg_model (optional)
-> virtual_sequencerclass block_env extends uvm_env;
`uvm_component_utils(block_env)
bus_agent agt;
block_scoreboard sb;
block_coverage cov;
virtual block_sequencer v_sqr;
function void build_phase(uvm_phase phase);
super.build_phase(phase);
agt = bus_agent::type_id::create("agt", this);
sb = block_scoreboard::type_id::create("sb", this);
cov = block_coverage::type_id::create("cov", this);
v_sqr = block_sequencer::type_id::create("v_sqr", this);
endfunction
function void connect_phase(uvm_phase phase);
super.connect_phase(phase);
agt.mon.ap.connect(sb.act_export);
agt.mon.ap.connect(cov.analysis_export);
v_sqr.bus_sqr = agt.sqr;
endfunction
endclassKey takeaways
Block TB must be complete — do not defer checking to subsystem.
Publish agent analysis port as the integration boundary.
Virtual sequencer at block level enables scenario reuse upstream.
Common pitfalls
Block TB with no scoreboard — integration inherits the gap.
Hardcoded interface names in agent instead of cfg.if_name.
Coverage only at SoC level — block holes hide until too late.
Block config contract
Define a cfg object that captures every knob an integrator will need at higher levels.
Cfg object template
class bus_cfg extends uvm_object;
`uvm_object_utils(bus_cfg)
uvm_active_passive_enum is_active = UVM_ACTIVE;
string if_name = "bus_if0";
bit enable_coverage = 1;
bit enable_scoreboard = 1;
int unsigned max_outstanding = 8;
function new(string name = "bus_cfg");
super.new(name);
endfunction
endclass[ARCH][SENIOR][UVM] block cfg contract
integrator may set:
is_active, if_name, enable_coverage, enable_scoreboard
integrator must NOT:
poke driver internals
override monitor packing
bypass published analysis portBlock release checklist
Agent passes block-level smoke with directed + random sequences.
Scoreboard and coverage enabled by default in cfg.
README documents cfg fields and analysis port type.
Known limitations listed (what the VIP does NOT check).
# block baseline smoke
simv +UVM_TESTNAME=block_smoke_test +UVM_VERBOSITY=UVM_LOW -l block_smoke.log
grep -E "UVM_ERROR|UVM_FATAL" block_smoke.log # expect none[ARCH] block sign-off criteria
smoke + random stress pass
and
coverage report reviewed against block plan
and
cfg API documented for integratorsCommon pitfalls
Block VIP shipped without sequence library.
Scoreboard tied to internal item types not visible to integrator.
Block test that only runs directed — random stress deferred forever.