covergroup declarationAutomatic & explicit samplingcoverpoint with auto-binsExplicit bins (ranges, values)ignore_bins / illegal_binsTransition bins (=>)Cross coveragebinsof() in cross ignoreoption.at_least / option.goalget_inst_coverage() / $get_coverage()Coverage-driven randomisation loopVerification plan to covergroup mapping
08
SV LAB 08 — Packages & Parameterization
lab_packages_params.tar.gz
▶
Package declaration & compilationimport pkg::* (wildcard)import pkg::name (explicit)Scope resolution (pkg::identifier)Package-level typedef/enum/structparameter with default valueslocalparam (non-overridable)Type parameters (#(type T))Parameterised class ScoreboardBase
09
SV LAB 09 — Generate Blocks (Advanced)
lab_generate_blocks.tar.gz
▶
generate for loopgenvar declarationNamed generate blocksHierarchical access to generate internalsgenerate if (compile-time flags)generate case (multi-configuration)Nested generate blocksGenerate-bound assertion checkers
10
SV LAB 10 — File Handling & Memory Modeling
lab_file_memory.tar.gz
▶
$fopen / $fclose$fdisplay / $fwrite$readmemh / $readmemb$writememh (memory dump)$fgets / $sscanf (line parsing)$fread / $fwrite (binary I/O)Behavioral RAM model classSelf-checking from golden filesCSV log generationECC memory model (Hamming code)
11
SV LAB 11 — DPI-C Integration
lab_dpi.tar.gz
▶
import/export "DPI-C" function/taskSV to C type mappingOutput/inout arguments (pointer passing)Fixed-size arrays across DPIchandle (opaque C pointer in SV)C reference model via chandlepure vs context DPI qualifierssvdpi.h typesShared library compilation (gcc -shared -fPIC)
12
SV LAB 12 — Mini-UVM Testbench Integration
lab_mini_uvm.tar.gz
▶
Base object class (MiniObject)Base component class (MiniComponent)Phase mechanism (build/connect/run/report)Transaction / sequence item designSequencer (mailbox-based arbitration)Driver (forever loop, handshake)Monitor (analysis broadcast via mailbox)Scoreboard (reference model + checker)Coverage collectorAgent (driver + monitor + sequencer)EnvironmentTest hierarchy (base/directed/random/stress)
LEVEL 1
SV Foundations for UVM
3 weeks · Delivered Inline (code + explanation)
1.1
Lab 1.1 — OOP for Verification Engineers
DUT: None (pure SV OOP exercises)
▶
BasePacket abstract class hierarchyEthPacket and AXIPacket concrete classesBaseChecker (ExactChecker, FuzzyChecker)$cast for runtime type checkingDeep copy problem in scoreboardsPolymorphism — single scoreboard for multiple protocolsStatic members for transaction ID counting
1.2
Lab 1.2 — Randomization for Constrained Stimulus
DUT: None (constraint exercises)
▶
AXIRandTxn with full protocol constraint setdist weighted distribution for write/read biasImplication constraints for AXI burst rulessolve...before demonstrationpre_randomize / post_randomize hooksAdaptiveCoverageDriver: coverage-driven while loopInline constraint targeting for uncovered bins
1.3
Lab 1.3 — IPC: Mailbox, Semaphore, Events for TB
DUT: None (IPC pattern exercises)
▶
VerifEnvironment class with typed mailboxesBounded mailbox back-pressureSemaphore bus arbitration (2 masters, 1 bus)Event phase synchronisation (reset_done, gen_done, all_done)Fork-join_none with drain timeouttry_get() for clean shutdown detection
LEVEL 2
Basic UVM Concepts
4 weeks · Complete FILE PACKAGES (.tar.gz with all RTL, TB, scripts)
2.1
Lab 2.1 — First Complete UVM Testbench (Counter DUT)
type_id::create() vs direct new()set_type_override() — ALL instances replacedset_inst_override() — ONE specific path replacedfactory.print() — debug override tableOverride must be registered BEFORE super.build_phase()config_db path patterns (wildcard vs exact)Path specificity precedenceSetting int, bit, virtual interface typesvoid'() for optional get() / Fatal for mandatory get()
2.3
Lab 2.3 — UVM Phasing Deep Dive
STATUS: INLINE (code + explanation)
▶
Full phase sequence: build → connect → start_of_simulation → run → extract → check → report → finalWhy build_phase is a function (zero time, top-down)Why run_phase is a task (consumes time, all parallel)raise_objection / drop_objection mechanismObjection trace debugging (+UVM_OBJECTION_TRACE)phase_demo_component showing all phase methods
uvm_analysis_port: 1-to-N non-blocking broadcastuvm_tlm_analysis_fifo: buffered, decoupled scoreboarduvm_subscriber: simplest subscriber base classuvm_analysis_imp: alternative for multi-port consumersWhy TLM over mailbox (decoupling, zero coupling)Adding 4th subscriber with ZERO changes to monitor/scoreboardMonitor thread vs scoreboard thread independence
Complete handshake sequence diagramsequence → start_item → grant → finish_item → blocked → driver → get_next_item → drive → item_done → unblockWhy start_item grants arbitrationWhy finish_item BLOCKS until item_doneResponse data: driver populates item before item_donePipelined driver: double-buffer patternget_next_item vs get() distinctionDeadlock causes and detection
LEVEL 4
Advanced UVM
4 weeks · Delivered Inline with full code
4.1
Lab 4.1 — Virtual Sequences & Virtual Sequencer
DUT: System with AXI master + APB slave · STATUS: INLINE
▶
system_virtual_seqr (holds handles to AXI and APB sequencers)system_reset_sequence (coordinates both agents with fork/join)$cast from m_sequencer to virtual sequencer typeseq.start(p_seqr.axi_seqr) — targeting specific sequencerFork-join for parallel multi-agent stimulussystem_env connecting virtual sequencer to real sequencersWhen to use virtual sequences vs layered sequences
4.2
Lab 4.2 — UVM Register Abstraction Layer (RAL)
DUT: Memory controller with 4 config registers · STATUS: INLINE
▶
ctrl_reg extends uvm_reguvm_reg_field (enable, mode, burst_len)field.configure() (size, offset, access type, reset value)mem_ctrl_reg_block extends uvm_reg_blockcreate_map() / add_reg() with addresseslock_model()axi_reg_adapter: reg2bus() and bus2reg()Register test: write() / read() / mirror()UVM_CHECK with mirror for post-reset verificationWhy RAL (protocol-agnostic test reuse)
LEVEL 5–6
Protocol Verification & Full Industry-Style Projects
4 weeks each · Inline with full code
5.1
Lab 5.1 — FIFO Verification Environment
DUT: Synchronous FIFO · STATUS: INLINE
▶
Full verification plan (8 features → sequences)fifo_seq_item with push/pop stimulus & response fieldsScoreboard reference model using SV queuecheck_field() per-flag comparisonpush-when-full & pop-when-empty scoreboard handlingOverflow/underflow sequence targeting
5.2
Lab 5.2 — APB Slave Verification VIP
DUT: APB slave · STATUS: INLINE
▶
apb_protocol_checker module with 6 SVA propertiesp_penable_after_psel / p_psel_stable_during_transferp_paddr_stable / p_pwdata_stable / p_no_x_prdatap_pready_timeout (##[0:16])bind statement for checker binding (no DUT modification)Protocol assertion coverage
AXI master VIP (active)DRAM model (behavioral)System scoreboardPerformance monitor (throughput + latency)Protocol checker (per-port AXI assertions)Coverage: M x S routing crossData integrity (write-read-compare)In-order completion verificationError handling (illegal address, ECC, timeout)Performance measurement under load
LEVEL 7–8
Debugging, Optimization & Interview Preparation
2 weeks each · Delivered Inline
7.1
Lab 7.1 — UVM Debugging Toolkit
STATUS: INLINE
▶
UVM debugging decision tree (flowchart)uvm_topology_printer class (print_all)TLM connectivity checker (ap.size() == 0 warning)objection_tracker::dump_objections()Sequencer-driver deadlock watchdog timer+UVM_CONFIG_DB_TRACE / +UVM_VERBOSITY=UVM_HIGH
Common bugs with root cause & fix
Simulation ends at time 0 (missing raise_objection)Component not found in factory (missing utils macro)Analysis port silent failure (ap.size() == 0)Config_db type mismatchSequencer-driver deadlockPhase synchronisation issues
VIP reusability decision framework (active/passive/scoreboard)Top 50 UVM interview questions with detailed answersuvm_component_utils purposebuild_phase function vs run_phase taskComplete sequencer-driver handshakeuvm_do vs uvm_send vs uvm_rand_sendAnalysis port vs blocking portFactory internals (registry + override table)Passive agent use casesVirtual sequencer designType override vs instance overrideConfig_db path hierarchyWhat $cast returns on failureOverriding sequence items via factoryConfig_db::get() returning false