当前位置: 首页 > article >正文

uvm中的run_test作用

        在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_phaseconnect_phaserun_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方法:

    1. build_phase:创建子组件并配置参数。

    2. connect_phase:连接TLM端口和分析端口。

    3. end_of_elaboration_phase:验证环境构建完成后的最终检查。

    4. start_of_simulation_phase:仿真开始前的初始化操作。

    5. run_phase:启动激励生成、监测和检查(并行执行)。

    6. run_phase 结束run_phase 是执行实际测试逻辑的主要阶段,当 run_phase 中的所有任务都完成后,该阶段结束。通常,测试用例中的激励生成、数据监测等操作都在这个阶段完成。
    7. 后续清理阶段执行run_phase 结束后,会依次执行后续的清理阶段。例如,extract_phase 用于提取测试结果数据,check_phase 用于检查测试结果是否符合预期,report_phase 用于生成测试报告。
    8. 验证环境结束:当所有阶段都执行完毕后,验证环境结束,仿真也随之停止。

 


http://www.kler.cn/a/567528.html

相关文章:

  • 批量接受或拒绝 Word 修订
  • 鸿蒙开发-绘制点和线条( LineTo 和 MoveTo )
  • getline的使用(L1-059敲笨钟)
  • 如何把word文档整个文档插入到excel表格里?
  • 【设计模式】工厂方法模式
  • 26.1、大数据安全需求分析与安全保护工程
  • CMU15445(2023fall) Project #3 - Query Execution(下)详细分析
  • 【机器学习】逻辑回归(Logistic Regression)
  • WPF高级 | WPF 与数据库交互:连接、查询与数据更新
  • Python办公自动化教程(007):利用python写入excel文件
  • Windows PicPick Professional-v7.3.2-中文版
  • P8649 [蓝桥杯 2017 省 B] k 倍区间--前缀和--同余定理【蓝桥杯简单题-必开long long】
  • 51c自动驾驶~合集22
  • 更新anaconda安装包后重新配置环境
  • javaweb + AI day03
  • Dify v1.0.0 里程碑版本正式亮相
  • LVS+Keepalived高可用高性能负载实战
  • 鸿蒙-状态管理V2其他方法
  • DeepSeek开源周,第六弹再次来袭,DeepSeek-V3/R1推理系统总结
  • 图书数据采集:使用Python爬虫获取书籍详细信息