2026-10-22 23:53:41
UVM新手基础知识点总结
UVM(Universal Verification Methodology)是SystemVerilog的验证方法学标准,用于构建模块化、可重用的验证环境。以下是UVM的核心基础知识点总结:

核心功能:UVM通过工厂模式实现对象的动态创建与替换,无需硬编码类名。
使用uvm_component_utils或uvm_object_utils宏注册的类,可通过工厂机制实例化。
调用run_test("class_name")时,UVM会根据类名自动创建实例并调用其main_phase。
关键流程:
测试用例传入:通过+UVM_TESTNAME=test_base命令行参数指定测试用例,UVM根节点(uvm_root)通过run_test()读取该参数,并利用工厂机制创建顶层实例uvm_test_top。
代码触发:run_test()是传入测试用例名的关键代码,同时负责构建UVM树形结构的顶层。
uvm_root::get()作用:作为全局单例,uvm_root管理整个UVM环境的层次结构,从顶层测试实例向下扩展子组件。
仿真控制逻辑:
每个phase执行前,UVM检查是否有objection被提起。若存在,则等待所有objection撤销后才结束当前phase;若无,则立即跳转。
所有phase执行完毕后,调用$finish终止仿真。
使用规则:
raise_objection必须在main_phase中第一个消耗仿真时间的语句之前调用,否则无效。
run_phase的特殊性:
若其他动态phase(如12个并行phase)提起objection,run_phase无需手动提起即可自动执行,其运行时间由其他phase控制。
若需主动控制run_phase运行时间,需在其中直接调用raise_objection。
推荐实践:在sequence中控制objection,符合UVM“激励生成由sequence主导”的设计哲学。例如,sequence提起sequencer的objection,完成后撤销。
核心作用:
替代绝对路径,实现验证平台与DUT的解耦。
类中声明:只能声明virtual interface,不可直接声明物理接口。
连接方法:
通过config_db机制传递接口句柄,分为set和get两步:
set的第二个参数为目标组件在UVM树形结构中的路径。
通常driver、input monitor(i_mon)、output monitor(o_mon)需要接口,且driver与i_mon共享同一接口。
build_phase特性:
自动执行,用于数据传递(如config_db)和成员变量实例化。
是function类型,而main_phase是task类型。
调用uvm_fatal宏会触发$finish终止仿真,其参数冗余度无意义(与uvm_info不同)。
config_db细节:
无论run_test传入何参数,创建的实例名始终为uvm_test_top。
使用双冒号(::)调用set/get,因其为静态函数。
通过transaction实现从信号级到事务级的抽象,提升验证效率。
生命周期差异:
uvm_component_utils注册的组件(如driver)具有静态生命周期。
uvm_object_utils注册的对象(如transaction)具有动态生命周期。
随机化回调:调用transaction.randomize()后,会自动触发post_randomize()函数。
根节点为uvm_test_top,由run_test创建。
构建顺序:build_phase自上而下执行(从根到叶),确保所有组件实例化完成后,再进入后续phase(如connect_phase、main_phase)。
总结:UVM通过工厂模式、objection机制、树形结构等核心特性,实现了验证环境的模块化与自动化控制。新手需重点掌握factory的动态创建、objection的仿真控制、interface的解耦方法,以及transaction的事务级建模,为构建高效验证平台奠定基础。