2026/4/18 13:57:04
网站建设
项目流程
有没有什么设计排版类网站,深圳网站维护优化,大一学生期末网页设计作业,网站建设 百度贴吧现在#xff0c;你已经准备好学习UVM的“总指挥”了—— uvm_test。它是整个验证工厂的最高指挥官#xff0c;负责设定任务、调配资源并下令开工。
简单来说#xff0c;uvm_test 不是一个具体的测试动作#xff0c;而是一个可配置、可重用的“测试方案”或“作战计划”。它…现在你已经准备好学习UVM的“总指挥”了——uvm_test。它是整个验证工厂的最高指挥官负责设定任务、调配资源并下令开工。简单来说uvm_test不是一个具体的测试动作而是一个可配置、可重用的“测试方案”或“作战计划”。它不直接驱动信号而是通过配置环境、启动不同的“作战指令”序列来验证DUT的不同功能。 Test的本质一个可执行的“验证方案”你可以把验证计划Verification Plan里的一条条功能点Feature想象成需要攻克的“战略目标”。一个uvm_test就是一个针对其中一个战略目标的完整作战计划。它包含作战环境需要哪些“部队”Agent参与。部队配置各部队用什么“装备”、以什么“模式”主动/被动作战。作战指令具体的进攻顺序和策略Sequence。战果评估如何判断目标是否达成通过Scoreboard等检查。️ 编写一个UVM Test的四步核心流程下图展示了创建一个“作战计划”Test从搭建指挥部到下达作战指令的完整流程第一步建立指挥部你的 Test 类需要从uvm_test继承并进行工厂注册。注意它虽然不叫uvm_component但本质上是一个顶级组件。class my_base_test extends uvm_test;uvm_component_utils(my_base_test)// 使用组件宏注册functionnew(string name“my_base_test”,uvm_component parentnull);super.new(name,parent);endfunction// ... 后续步骤写在这里endclass第二步组建与配置部队 (核心)在build_phase中你需要创建环境(env)和配置对象(cfg)。为配置对象赋值如设置工作模式、获取虚拟接口等。通过uvm_config_db将配置对象“下发”到环境中的具体Agent。virtual functionvoidbuild_phase(uvm_phase phase);super.build_phase(phase);// 1. 创建m_envmy_env::type_id::create(“m_env”,this);m_cfgmy_cfg::type_id::create(“m_cfg”);// 2. 配置if(!uvm_config_db #(virtual dut_if)::get(this,“”,“dut_vif”,m_cfg.vif))uvm_error(“CFG”,“Interface not found!”)m_cfg.is_activeUVM_ACTIVE;// 3. 下发uvm_config_db #(my_cfg)::set(this,“m_env.m_agent”,“cfg”,m_cfg);endfunction第三步战前检阅调试在end_of_elaboration_phase中所有组件已创建并连接好。此时打印拓扑结构可以清晰地看到你搭建的整个“部队编制”是否正确。virtual functionvoidend_of_elaboration_phase(uvm_phase phase);uvm_top.print_topology();// 打印出完整的UVM组件树endfunction第四步下达作战指令核心在run_phase这是一个task会消耗仿真时间中你需要申请作战时间通过raise_objection(this)防止仿真立刻结束。创建并启动主序列这是测试的灵魂决定了要发送什么数据。结束作战序列执行完毕后drop_objection(this)。virtual taskrun_phase(uvm_phase phase);my_main_sequence main_seq;super.run_phase(phase);// 好习惯phase.raise_objection(this);main_seqmy_main_sequence::type_id::create(“main_seq”);main_seq.start(m_env.v_sqr);// 通常启动在虚拟序列器上phase.drop_objection(this);endtask 如何“启动”一个Test两种方式Test 的启动不是在你代码里调用一个函数而是在顶层模块tb_top的initial块中通过run_test()这个全局任务来“召唤”。方式一代码内指定不灵活initial beginrun_test(“my_base_test”);// 固定运行 my_base_testend方式二推荐命令行指定initial beginrun_test();// 参数为空从命令行获取end然后在仿真时通过命令行指定# 使用不同的 UVM_TESTNAME 来运行不同的测试无需重新编译simulator_commandUVM_TESTNAMEmy_base_testsimulator_commandUVM_TESTNAMEtest_feature_asimulator_commandUVM_TESTNAMEtest_stress这是UVM框架灵活性的重要体现一定要掌握。 衍生测试实现极致的重用这是UVM测试策略最强大的地方。你不需要为每个功能点从头写一个Test而是通过继承来复用和调整。假设你有一个验证寄存器读写功能的测试reg_test// 1. 基础测试搭建通用环境启动基础序列class reg_test extends uvm_test;uvm_component_utils(reg_test)reg_env m_env;reg_cfg m_cfg;virtual functionvoidbuild_phase(uvm_phase phase);super.build_phase(phase);m_envreg_env::type_id::create(“m_env”,this);m_cfgreg_cfg::type_id::create(“m_cfg”);m_cfg.reg_model“RAL”;// 使用寄存器模型uvm_config_db #(reg_cfg)::set(this,“*”,“cfg”,m_cfg);endfunction virtual taskrun_phase(uvm_phase phase);base_reg_seq seqbase_reg_seq::type_id::create(“seq”);phase.raise_objection(this);seq.start(m_env.v_sqr);phase.drop_objection(this);endtask endclass// 2. 衍生测试A复用环境但更换更复杂的“作战指令”class test_reg_stress extends reg_test;// 关键继承uvm_component_utils(test_reg_stress)virtual taskrun_phase(uvm_phase phase);stress_reg_seq seqstress_reg_seq::type_id::create(“seq”);// 更换序列phase.raise_objection(this);seq.start(m_env.v_sqr);// 环境 m_env 是从父类继承来的phase.drop_objection(this);endtask endclass// 3. 衍生测试B复用环境和序列但调整“部队配置”class test_reg_passive extends reg_test;uvm_component_utils(test_reg_passive)virtual functionvoidbuild_phase(uvm_phase phase);super.build_phase(phase);// 先调用父类完成通用搭建m_cfg.is_activeUVM_PASSIVE;// 然后覆盖配置将Agent设为被动模式endfunction endclass⚠️ 核心要点与总结概念说明关键点uvm_test角色验证环境的总指挥和配置中心。不直接干活只负责“排兵布阵”。配置下发通过uvm_config_db::set在build_phase将配置对象cfg下发。实现环境行为的动态控制。启动序列在run_phase中create并start序列。必须使用raise/drop_objection包裹。运行方式通过run_test()UVM_TESTNAME命令行参数。实现不修改代码、不重新编译即可切换测试。测试重用通过类继承创建衍生测试。可重写build_phase以修改配置或重写run_phase以更换主序列。给你的最终建议现在请将你之前搭建的env、agent、sequence组合起来。创建一个my_base_test在build_phase中创建你的env。在run_phase中启动你的序列并确保有raise/drop_objection。在tb_top中使用run_test(“my_base_test”)启动仿真。成功后尝试用run_test() 命令行参数UVM_TESTNAMEmy_base_test的方式再次运行。最后创建一个衍生测试仅仅更换另一个不同的序列并通过命令行运行它。当你成功运行起第一个由Test指挥的完整UVM环境时你就真正打通了UVM从底层到顶层的任督二脉。