在SystemVerilog和UVM验证环境中,run_test()
是启动UVM仿真流程的核心函数。它负责初始化UVM框架、创建测试用例实例,并触发UVM的Phase机制来执行验证环境的构建和运行
1. run_test()
的作用
run_test()
是UVM提供的内置函数,定义在UVM库中(uvm_root.svh
),主要功能如下:
-
初始化UVM根对象(
uvm_root
),启动全局Phase流程。 -
根据参数动态创建测试用例实例(通过UVM工厂机制)。
-
根据指定的测试用例名称(通过参数或命令行),使用 UVM 的工厂机制创建相应的测试用例对象。
-
-
触发UVM各阶段的执行(如
build_phase
、connect_phase
、run_phase
等)。-
测试用例对象会调用
build_phase
方法,在这个阶段会创建并配置验证环境中的各个组件,如激励发生器(Sequencer)、驱动器(Driver)、监测器(Monitor)、计分板(Scoreboard)等。
-
-
结束仿真:当所有阶段执行完毕后,仿真结束。
2. run_test()
的调用位置
通常在顶层模块(top
)的 initial
块中调用,位于DUT实例化和时钟/复位生成之后:
module top;
// 时钟和复位生成
initial begin
clk = 0;
forever #5 clk = ~clk;
rst = 1;
#10 rst = 0;
end
// DUT实例化
dut u_dut(.clk(clk), ...);
// UVM启动
initial begin
// 配置接口到uvm_config_db(可选)
uvm_config_db#(virtual dut_if)::set(null, "*", "dut_vif", dut_if_inst);
// 启动测试用例
run_test("my_test_case");
end
endmodule
3. run_test()
的执行流程
(1) 初始化UVM根对象
-
创建
uvm_root
单例:
UVM通过uvm_root::get()
获取全局根对象,负责管理所有UVM组件和Phase调度。
(2) 动态创建测试用例
-
工厂模式(Factory):
run_test("my_test_case")
中的字符串参数对应一个已注册的测试用例类。
UVM工厂根据该名称创建测试用例实例(my_test_case
必须通过uvm_component_utils
宏注册)。class my_test_case extends uvm_test; `uvm_component_utils(my_test_case) // 注册到工厂 ... endclass
(3) 启动Phase机制
-
自顶向下执行Phase:
run_test()
触发UVM的Phase流程,从根对象(uvm_root
)开始,递归调用所有组件的Phase方法:-
build_phase
:创建子组件并配置参数。 -
connect_phase
:连接TLM端口和分析端口。 -
end_of_elaboration_phase
:验证环境构建完成后的最终检查。 -
start_of_simulation_phase
:仿真开始前的初始化操作。 -
run_phase
:启动激励生成、监测和检查(并行执行)。 run_phase
结束:run_phase
是执行实际测试逻辑的主要阶段,当run_phase
中的所有任务都完成后,该阶段结束。通常,测试用例中的激励生成、数据监测等操作都在这个阶段完成。- 后续清理阶段执行:
run_phase
结束后,会依次执行后续的清理阶段。例如,extract_phase
用于提取测试结果数据,check_phase
用于检查测试结果是否符合预期,report_phase
用于生成测试报告。 - 验证环境结束:当所有阶段都执行完毕后,验证环境结束,仿真也随之停止。
-