[UVM源代码研究] 当我们在tb里调用run_test()时uvm环境是如何启动的

UVM验证环境中tb_top与uvm_test的协同工作机制解析 本文深入解析了UVM验证环境中tb_top模块与uvm_test类的协同工作机制。通过舞台与导演的生动比喻,阐述了tb_top作为静态硬件平台负责搭建DUT接口与生成时钟复位,而uvm_test作为动态测试控制器负责构建验证环境与执行测试场景。两者通过run_test()启动,并借助uvm_config_db传递虚拟接口实现无缝协作,是构建高效验证环境的核心。 阅读详情
AI摘要

文章详细解析了UVM中的run_test函数,讨论了其作为环境入口的角色,函数是任务而非函数,定义在uvm_root中并通过uvm_globals封装为全局可见。分析了run_test带参数与不带的区别,以及如何通过命令行参数启动测试。

作为一个验证工程师,每一个顶层tb里一般都少不了下面这段代码(前后可能还会有些timeformatf或者uvm_config_db的设置),并且书上都告诉你这是uvm环境启动的入口。

initial begin
   run_test();
end

那么问题来了,
1、这个run_test()是一个函数还是个任务?
2、它定义在哪里?
3、为什么module里能够直接调用?
4、有时候可以带参数有时候又可以不带,区别在哪里?
5、作为uvm环境的入口,这个run_test()是怎么做到启动uvm环境的?

我们在uvm源代码里搜索run_test()的定义,找到如下定义:在这里插入图片描述

这个run_test()根源调用的还是uvm_root里定义的run_test()我们稍后再去分析,等于说uvm_globals将uvm_root里定义的run_test()通过单例模式获取uvm_root的唯一实例并将其封装成了一个全局可见的任务run_test(),那我们不禁要问:这个uvm_globals文件是如何实现里面的内容全局可见的呢?
我们在搜下uvm_globals关键字发现它在uvm_base.svh里被include了
添加图片注释,不超过 140 字(可选)

而uvm_base.svh这个文件又是在uvm_pkg.svh里被include的
添加图片注释,不超过 140 字(可选)

这样一来,只要我们在任何需要调用run_test()的作用域内执行import uvm_pkg:😗,我们就可以调用uvm_globals里所调用的全局变量/方法了。
通过上面的分析我们就已经回答了前3个疑问了,即
1、这个run_test()是一个函数还是个任务?task
2、它定义在哪里?uvm_root中,并在uvm_globals.svh中被封装成了一个全局可见任务
3、为什么module里能够直接调用?只要import uvm_pkg::*就可以调用uvm中的全局任务

这里再给大家补充一点systemverilog中关于作用域的知识点:
添加图片注释,不超过 140 字(可选)

以上两种import uvm_pkg::的方法,对应实际uvm内的可见范围是不同的。
方式1是一种全局import,编译后会放在$unit编译单元中,这样后面所有编译的文件都能看到uvm import的相关内容;
方式2这样import只会在module tb内可见,跳出这个module后面编译的文件是看不到uvm import的相关内容的,所以只要不是全局import,在每个独立的作用域内都会去import uvm_pkg::
;
所以大家以后import package的时候一定要明白你import的内容的可见域是什么范围,以免出现class not defined这种情况。

下面我们接着一点点分析看看uvm_root里的run_test都做了些什么。首先是变量的声明

UVM实战 卷I学习笔记13——UVM高级应用(1) 目录interfaceinterface实现driver的部分功能可变时钟 interface interface实现driver的部分功能 在之前所有的例子中,interface的定义都非常简单,只是单纯地定义几个logic类型变量而已 interface my_if(input clk, input rst_n); logic [7:0] data; logic valid; endinterface 但实际上interface能做的事情远不止如此。在interface中可以定义任务与函数。除 阅读详情

相关推荐

#UVM# 关于run_test(““) 的几点理解

run_test("") 来自哪里

那么菜的博客 3922

uvm验证环境中tb_top和uvm test

首先,tb_top通常指的是测试平台的顶层模块,在Verilog或VHDL中,这可能是一个顶层的testbench模块。这个模块的作用是实例化DUT(被测设计),以及与DUT相连的接口。此外,tb_top还可能负责生成时钟、复位信号,以及将物理接口连接到UVM环境中的虚拟接口。这部分属于静态结构,通常在仿真开始时就被建立起来。接下来是uvm_test,这是UVM框架中的一个动态创建的组件。UVM测试用例通常继承自uvm_test类,用户会在其中配置环境、设置序列,并启动测试流程。

qq_42779035的博客 1353

UVM讲解系列之一:从0开始认识UVM验证环境

开始两节主要是讲解一些宏观的东西,帮助初学者形成UVM环境的思想脉络,至于技术细节会在这两节之后循序渐进讲解。本文主要内容包括,基于uvm的验证环境如何运转,激励如何进入DUT的入口。

m0_66209496的博客 1081

【学习记录丨UVM】1.11建造测试用例

uvm_do_with 是uvm_do系列宏中的一个,用于在随机化时提供对某些字段的约束。这里的举例代码中出现了report_phase,在report_phase中根据UVM_ERROR的数量来打印不同的信息。在前边例子中,通过设置default_sequence的方式来启动my_sequence,加入现在有另一个my_sequence2,那么如何在不影响my_sequence的前提下启动my_sequence2呢?top_tb中的run_test的参数也要从my_env变成base_test,

qazWSX 1551

UVM初学篇 -(5) UVM验证平台-hello world

在我们环境的顶层tb中调用了run_test(),run_test()是uvm的一个task用于启动uvm环境,run_test传入hello_world_test 就执行了hello_world_test里面的task main_phase()。hello_world_test中的`uvm_component_utils(hello_world)是一个宏,在这里调用这个宏之后才能使用run_test(“hello_world_test”)。这是UVM中的一个文件,里面包含了众多的宏定义,只需要包含一次。

u011164476的博客 716

UVM仿真的启动(一)—— run_test()

我们都知道uvm环境是通过在tb顶层调用run_test方法来启动的,但它具体完成了什么呢?怎么样启动整个环境的呢?本专题则是围绕这两点学习源码,主要是m_run_phase方法,该方法按照设定的phase节点顺序调用了各个组件的phase。本文主要介绍run_test。

Future Chaser的博客 1086

第一次使用uvm相关环境设置以及test_case的启动——UVM

一、TB中需要改动的地方 //1、导入uvm库文件 import uvm_pkg::*; `include "uvm_macros.svh" //2、与sv中不一样的地方是他不会由new()的过程了 initial begin run_test(); end //3、生成fsdb波形文件 initial begin $fsdbDumpfile("sim.fsdb");//生成波形文件 $fsdbDumpvars(0,top_tb,"+all");//确定将top_tb下面的所有信号都进行dump

weixin_42705678的博客 4918

UVM—run_test函数作用

这个引擎会严格按照预定的顺序,控制和执行整个测试平台中所有组件的各个相位。是你“按下开始按钮”的那个动作,而UVM相位引擎确保了在这个按钮被按下之前,一切都已经准备就绪。​,可以消耗仿真时间。后,自动且默默地在后台(仿真时间0时刻之前)完成了所有繁重的准备工作。这种细分的phase机制大大提高了大型复杂验证平台的可维护性和可靠性。这个阶段会消耗真实的时间。相位引擎首先开始执行所有不消耗时间的函数相位。都正常退出后,相位引擎会继续执行后续的清理和报告相位,如。UVM测试平台的执行是分阶段的,这些阶段称为​。

weixin_44700185的博客 1352

IC验证10--run_test() 方法在UVM中的作用与执行流程解析(附源码)

run_test() 是UVM(通用验证方法学)中的核心入口方法,负责启动测试用例并构建验证环境。其主要功能包括:通过参数(如 UVM_TESTNAME)指定测试用例类名,利用工厂机制实例化测试类,并触发UVM的Phase机制(如 build_phase、connect_phase、run_phase)来构建验证环境并执行仿真。run_test() 的参数可通过直接赋值或命令行传递,命令行参数优先级更高。测试类需通过 uvm_component_utils 宏注册到工厂,且 run_test() 只能在顶层

Open 1831

FIFO UVM验证环境实战:从zip包拆解到跑通覆盖率

在数字芯片验证中,UVM验证方法学以组件化、可重用的分层架构成为主流,其核心思想是通过driver、monitor、scoreboard等标准组件构建完整验证环境。FIFO作为最基础的存储模块,其满空标志、边界深度和读写时序的验证直接影响IP质量,同步与异步FIFO在验证策略上也有显著差异。本文基于fifo_UVM.zip这一工程示例,从目录结构、端口识别到参考模型与序列调度进行拆解,演示如何搭建一套最小可跑的UVM环境,并针对编译报错、死锁和覆盖率不收敛等工程痛点给出排查方法。通过覆盖组设计、随机种子策略

weixin_33795806的博客 555

浙大数值分析lab2

最可怕的一道题,题目是这样的 Root of a Polynomial A polynomial of degree nnn has the common form as p(x)=cnxn+cn−1xn−1+⋯+c1x+c0p(x)=c_n x^n + c_{n-1} x^{n-1} + \cdots + c_1 x + c_0p(x)=c​n​​x​n​​+c​n−1​​x​

yao_zou的博客 4793

电池保护板为什么采用NTC热敏电阻而不是PTC热敏电阻?

R25=10K,即环境温度25°时,阻值是10K),温度变化1°C,阻值相应地明显变化,温度响应很灵敏,也就能精准地反向换算出阻值对应的温度。另外,还有功率型NTC热敏电阻,其主要用在开关电源设计中,串联在市电输入上,抑制浪涌电流。电池保护板上的NTC热敏电阻(NTC一端接地,另一端接电池充电控制IC管脚),在电池温度上升时,NTC热敏电阻温度也会随之上升,从而NTC电阻值会下降,因此电池充电控制IC用ADC检测的电压值就降低,当检测到的电压值达到下限阈值时,电池充电控制IC就会停止对电池的充电或放电。

电子绿洲的博客 5624

EM算法求解混合伯努利模型

本文记录了EM算法求解混合伯努利分布的推导,并提供了matlab实验代码。

霁月难逢 彩云易散 6969

Apache Hop集成Spring Boot实战:从配置到执行HPL文件

本文详细介绍了将Apache Hop集成到Spring Boot应用中的完整实战方案。通过配置核心依赖、初始化Hop环境、编写服务层逻辑,实现了在Java应用中程序化执行HPL管道文件,从而将可视化ETL能力无缝嵌入微服务架构,提升数据处理的自动化与可维护性。

blue42的博客 473

Windows 24H2升级后eNSP AR_40报错40?VirtualBox虚拟化修复指南

虚拟化技术通过Hypervisor在操作系统与硬件间建立抽象层,使虚拟机能够共享物理资源。其核心原理依赖CPU的VT-x/AMD-V指令集,而Windows 24H2对内核隔离与驱动签名的强化会直接占用或拦截这些虚拟化资源。在工程实践中,VirtualBox作为Type-2型Hypervisor,常因内存完整性开启或版本过旧导致虚拟网卡创建失败,进而引发设备启动中断。典型场景包括网络仿真实验、多系统测试环境搭建等。当eNSP的AR_40路由器依赖VirtualBox引擎时,24H2的安全策略变更便会触发错误

weixin_34375251的博客 214

lammps教程:实例讲解npt、nvt系综的选择

对于lammps新手来说,系综的选择令人困惑,到底是应该用nvt系综还是npt系综? 我在初学lammps时就被这个问题困扰了很久。如果去问别人,可能会告诉你一个答案:根据模拟需要确定。 其实和没说一样。 到底如何确定系综,确实不是一句两句能够说清楚的,不同的体系、不同的模拟目的要选择不同的系综。 前几天遇到的一个合金的模拟案例,比较有代表性,分享出来供大家参考。 建模方法和之前介绍过的高熵合金建模方法类似,先建立单晶模型,然后使用替换原子的命令获得合金结构。 建模完成后,按照常规,先上nvt系综进行驰豫

lammps_jiayou的博客 9765

024、反激变换器的短路保护设计

本文详细探讨了反激变换器短路保护的设计要点与实践经验。作者通过实际案例分析了短路时反激拓扑的电流特性,指出初级峰值电流限制是最基础的保护手段,但需配合打嗝模式使用。文章重点剖析了打嗝模式设计的三个关键陷阱:频率设定、退出条件和软启动衔接。同时强调次级侧辅助保护、变压器参数优化、环路响应协调的重要性,并比较了自恢复与锁死方案的适用场景。最后提出实测验证的四个关键点和设计经验:不盲信芯片手册、保护电路独立设计、充分留有余量、进行破坏性测试。全文以工程实践为导向,为反激电源的可靠短路保护提供了系统性解决方案。

Jack010169的博客 237

飞书接入OpenClaw:从零到一的保姆级图文教程

本文主要介绍了飞书接入OpenClaw:从零到一的保姆级图文教程,希望能对学习使用OpenClaw 的同学们有所帮助。 文章目录 1. 背景 2. 解决方案 2.1 步骤一:安装插件 2.2 步骤二:创建机器人应用 2.3 步骤三:测试 3. 注意事项

weixin_43178406的博客 13万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: [SystemVerilog语法拾遗] SystemVerilog中的宏使用详解
下一篇: [UVM源代码研究] TLM里的各种port、export、imp使用研究
数字验证Kane陈
博客等级 码龄12年 662粉丝 48原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值