Part 11 · Senior Prep · Intermediate
Subsystem Integration: Composing Block VIPs
Integrating multiple block VIPs into a subsystem environment — integration scoreboards, cross-block scenarios, and config distribution without rewriting agents.
Subsystem composition model
Subsystem TB composes block VIPs and adds integration checking — address routing, DMA paths, interrupt fan-in — without modifying block agent internals.
[ARCH][SENIOR][UVM] subsystem composition
subsystem_env
├─ cpu_block_env (reuse block VIP)
├─ dma_block_env (reuse block VIP)
├─ mem_block_env (reuse block VIP)
├─ integration_sb (cross-block checks)
└─ subsystem_v_sqr (multi-block scenarios)
principle: block agents unchanged, integration layer addedclass subsystem_env extends uvm_env;
cpu_block_env cpu_env;
dma_block_env dma_env;
integration_scoreboard integ_sb;
subsystem_virtual_sequencer sub_v_sqr;
function void build_phase(uvm_phase phase);
super.build_phase(phase);
cpu_env = cpu_block_env::type_id::create("cpu_env", this);
dma_env = dma_block_env::type_id::create("dma_env", this);
integ_sb = integration_scoreboard::type_id::create("integ_sb", this);
sub_v_sqr = subsystem_virtual_sequencer::type_id::create("sub_v_sqr", this);
endfunction
function void connect_phase(uvm_phase phase);
super.connect_phase(phase);
cpu_env.agt.mon.ap.connect(integ_sb.cpu_export);
dma_env.agt.mon.ap.connect(integ_sb.dma_export);
sub_v_sqr.cpu_sqr = cpu_env.v_sqr;
sub_v_sqr.dma_sqr = dma_env.v_sqr;
endfunction
endclassKey takeaways
Subsystem adds integration layer — do not fork block agents.
Integration scoreboard owns cross-block protocol checks.
Virtual sequencer coordinates multi-block scenarios.
Common pitfalls
Modifying block agent source for subsystem-specific hacks.
No integration scoreboard — cross-block bugs found only at SoC.
Subsystem cfg that duplicates block cfg fields inconsistently.
Integration checking patterns
Integration scoreboards observe multiple analysis streams and check cross-block invariants.
Cross-block check examples
[ARCH][SENIOR][UVM] integration check catalog
address map:
CPU txn to addr X routes to MEM block monitor
DMA path:
DMA write on port A appears as MEM write on port B
interrupt:
block A event triggers block B status within N cycles
ordering:
posted writes visible before subsequent readsclass integration_scoreboard extends uvm_scoreboard;
uvm_analysis_export #(cpu_item) cpu_export;
uvm_analysis_export #(dma_item) dma_export;
cpu_item cpu_q[$];
dma_item dma_q[$];
function new(string name, uvm_component parent);
super.new(name, parent);
cpu_export = new("cpu_export", this);
dma_export = new("dma_export", this);
endfunction
function void write_cpu(cpu_item t);
cpu_q.push_back(t);
check_routing(t);
endfunction
function void check_routing(cpu_item t);
if (t.addr inside {[MEM_BASE:MEM_BASE+MEM_SIZE]})
`uvm_info("INTEG", "CPU txn routed to MEM region", UVM_HIGH)
endfunction
endclassSubsystem scenario patterns
Virtual sequences on subsystem_v_sqr fork block-level sub-sequences.
Scenario cfg selects which blocks participate and their ordering.
Integration tests focus on handshakes between blocks, not re-proving block protocol.
Reuse block sequence library inside subsystem virtual sequences.
class dma_to_mem_seq extends uvm_sequence;
task body();
fork
dma_block_seq.start(p_sequencer.dma_sqr);
mem_block_seq.start(p_sequencer.mem_sqr);
join
endtask
endclass[ARCH] subsystem review gate
block VIPs unmodified from block release
and
integration_sb covers cross-block plan items
and
subsystem vseq library maps to verification plan sectionsCommon pitfalls
Subsystem test that re-proves every block protocol corner.
Integration SB comparing unrelated transaction types without conversion.
Virtual sequencer exposing block env internals instead of v_sqr handles.