UVM学习笔记(1) 初识UVM框架

本文分享了一名验证工程师的心路历程,从初识验证时的迷茫到逐渐理解其重要性。介绍了验证的基本概念,包括验证的目的和方法,并重点介绍了UVM(通用验证方法学),包括其核心流程和关键组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

     验证基础

         我接触验证的时间和我上班的时间一样,到目前为止,马上到三年了,验证给我最初的印象就是帮别人测试东西的,非常没有技术含量,简直可以说是擦屁股的,做好了,和我没关系,我漏了bug,都是我的锅,哪有这么坑的工作让我做。我入门第一天,我师父问我,你想做设计还是想做验证呢,我说设计啊,多有创意,我师父说,啊,设计的名额已经满了,我是做验证的,所以你也来做验证吧,我屮艸芔茻,心中一万只草泥马奔过,你都定了还问个毛线啊,咋办,那就验呗。咋验?不会,是不是要被开除了,可能吧

 

                         

           

         一个简单的验证平台。大概就是这样的。一个人发号施令,翻译成中国话和英文,分别送给不同的人,自己消化了再拿出来比对一下到底是不是一样的

        

         好吧,我还是简单的陈述一下什么是验证,什么是我所认为的验证:以高级语言为参考模型,对verilog构建的时序模块进行检查、比对、校验的一种质量保证活动。高级语言,说白了就是C++一类,可以面向对象又或者比较容易实现数据结构的语言类型,听说有人拿Perl、makefile写验证环境,真是个变态。验证的基本框架就是上图所示,至于各个芯片的情况不同,验证环境的结构多少是有些变化的,比如我现在的B模块,是个数据环,比对完了还不行,还要拿出来继续用,还要送回到RM,构成了一个数据环,因此,验证环境并不是一成不变的,而是可以进行多种多样的优化,我们不以写得漂亮为目的,也不是以找了多少bug为目的,以保证芯片代码最后没有问题为目的,发现了1000个bug又能怎么样呢,最后漏一个,就是实打实的一个,管你发现了多少,该废还是要废,你可以按部就班的梳理测试点,也可以鸟枪法,总之bug到处都是,然而能做的完美的却又没有多少个。

         验证的基础其实需要在实践中慢慢体会,是一种比较死板又可灵活的套路,不会一成不变,接下来,我们就该请出主角,UVM,来初步认识一下什么是个UVM。

  UVM基础

UVM的全程为,Universal Verification Methodology,意为通用验证方法学,前身是OVM,貌似是mentor弄的一套东西,本质上,验证方法学只是对systemverilog进行一些常用类的封装,按照一套统一的流程,进行验证活动,经过多次对比之后,发现方法学只是各个验证公司间博弈的产物,eetop上有人说过真正牛逼的验证应该是自己有一套合适的验证方法,鉴于他的名字已经叫“通用”了,所以应该对各个验证结构来说是比较通用的。

UVM_PHASE

UVM的流程核心是phase,phase的中文意思是相,跟VMM1.1的九步法比起来,是要繁琐很多,但是用起来才发现这些隔离的phase是非常方便对于仿真的精确控制的,粗略来说,分为头4、尾4共8个function类型的phase,只干事,不消耗时间,中间有一个run_phase还有个4x3个小phase,run_phase和这12个phase是并行的,只是run_phase自己独成一派,而其他的12个就要乖乖的顺序执行了,用一些伪代码来表示这个过程更加明确一些
fork
    begin
        run_phase();
    end
    begin
        phase1();
        phase2();
        ……
        phase12();
    end
join_none

核心流程对于理解各个组件之间的仿真顺序至关重要,现在我们知道了phase这个玩意儿,就要说说UVM中包含的验证组件了,其实还有更重要的一个机制对于phase的控制非常精细,这个就是uvm_objection,不过这个在这里讲的话可能没什么概念,后面我们再说

 

UVM_OBJECT

在我一开始搭建demo的过程中,遇到了如下组件,是非常常见
agent、driver、monitor、sequencer、sequence、rm、checker、scoreboard
其实这些组件与VMM所构建的验证环境大同小异,而这些组件的老家全都是uvm_object,作为一个对象存在,何为object?我个人理解为一个事实存在的实体,一个对象,这个object可能会随着时间的推进,消失或者重建,更类似于指针使用过程中的instance,刚刚接触UVM的人可能都把这个和uvm_component分不清楚,至少我是这样的,uvm的书中大多有基类继承关系的介绍,而component是object的娃,于是在各个组件的使用过程中,可以有如下体会:component伴随仿真的生命周期存在,而object是根据使用需要来决定是否存在,暂且这么理解,在我搭建环境的时候,在一个叫config聚合类的东西里继承于Object,就是一个集中从cmdline中获取config value的cfg类,这个继承于uvm_object,说来也比较合理,cfg的配置变量在使用的时候才会被实例化,这里顺带要提到一个要注意的地方,就是uvm_config_db#set(……)的使用,uvm_object在环境中是没有一席之地的,也就是说,我不能通过env.xxx.xxx.xx来索引到一个object组件,他不能成为环境中的一份子,所以,我们如果想对某个object中的某个变量进行set的话,就要对这个object整体进行set,uvm_object可玩性不高,因为他是一个非常基本的类,所以他的子孙非常多,但是自己的可玩性比较低
 

 

 
<think>嗯,用户现在问的是UVM验证框架,我需要先回想一下之前用户提供的案例,可能用户是硬件设计或者芯片验证相关的工程师。之前的案例中提到了芯片设计的功耗验证,所以用户可能对验证方法学有实际需求。 首先,我需要解释UVM是什么,全称是Universal Verification Methodology,也就是通用验证方法学。要说明它是基于SystemVerilog的,主要用于数字电路设计的验证。用户可能已经了解SystemVerilog,但需要知道UVM的结构和优势。 接下来,应该分点介绍UVM的核心组件,比如UVM Testbench的结构,包括Test、Env、Agent、Driver、Monitor、Scoreboard等。这里需要结合之前的案例,比如在芯片功耗验证中,如何用UVM搭建测试平台,可能提到激励生成和结果检查,类似于案例中的测试场景定义和对比仿真数据。 然后要说明UVM的关键特性,比如可重用性,通过层次化结构实现组件复用,这点对于大型项目很重要,可能用户所在的公司有多个项目需要共享验证组件。还有受控随机测试,可以覆盖更多场景,比如案例1中的不同唤醒频率,可能需要随机化测试参数。另外,工厂模式和回调机制也是重点,需要简单解释其作用,比如动态创建对象和扩展功能,可能用户需要灵活调整测试用例。 应用场景部分,可以分ASIC、FPGA、IP核验证,结合之前的案例,比如案例1中的FPGA原型验证,说明UVM如何应用于不同阶段。这里需要强调UVM在复杂设计中的优势,比如多模块协作和异常测试。 优势部分,标准化流程和高效验证是重点,用户可能关心如何提高验证效率,减少重复工作,同时确保覆盖率。比如案例4中的电池热管理验证,可能需要大量测试用例,UVM的自动化可以节省时间。 最后,给出一个简单示例,用代码说明UVM测试平台的结构,这样用户可以直观看到各个组件如何协作。同时总结UVM的重要性,帮助用户理解为什么选择UVM,比如降低风险,提升质量,呼应之前的案例启示中的风险前移。 需要注意的是,用户可能希望了解UVM如何解决实际问题,所以在介绍时要结合之前的案例中的痛点,比如功耗验证中的漏电流问题,UVM如何帮助发现这类缺陷。同时,语言要尽量清晰,避免过于技术化,但又要准确,确保用户能理解关键概念。</think>### UVM验证框架深度解析 #### 一、基本概念 UVM(Universal Verification Methodology)是基于SystemVerilog的验证方法学,主要用于数字集成电路的功能验证。其核心目标是建立**标准化、可重用**的验证环境,典型应用场景包括: - ASIC/FPGA验证 - IP核验证 - 复杂系统级验证(如案例1中的物联网芯片验证) #### 二、核心组件架构 ```plaintext UVM Testbench ┌───────────────────────────┴───────────────────────────┐ │ UVM Test │ │ (控制测试流程) │ └───────────────┬───────────────────────────────┬───────┘ ┌──────┴──────┐ ┌──────┴──────┐ │ UVM Env │ │ UVM Score │ │(验证环境容器)│ │(结果比对器) │ └──────┬──────┘ └─────────────┘ ┌──────┴──────┐ │ UVM Agent │ │(驱动/监测器)│ └──────┬──────┘ ┌───────────┴───────────┐ ┌───┴───┐ ┌─────┴─────┐ │Driver │ │ Monitor │ │(激励) │ │(监测DUT) │ └───┬───┘ └─────┬─────┘ │ │ └───────────┬───────────┘ ▼ DUT(被测设计) ``` #### 三、关键特性 1. **可重用性** - 通过`uvm_component`基类实现层次化结构 - 支持参数化接口(如案例2机械臂验证中的运动参数传递) 2. **受控随机测试** ```systemverilog class packet extends uvm_sequence_item; rand bit [7:0] addr; // 随机地址 constraint addr_range { addr inside {[0:127]}; } // 约束条件 endclass ``` 可生成数百万测试场景(类似案例3中A/B测试的扩展) 3. **工厂模式** - 通过`uvm_factory`实现对象动态创建 - 支持覆盖驱动验证(类似案例4中的热仿真参数替换) 4. **回调机制** ```systemverilog virtual task driver::run_phase(uvm_phase phase); pre_transmit_hook(); // 用户自定义回调 send_packet(); post_transmit_hook(); endtask ``` #### 四、典型应用场景 1. **寄存器验证** ```systemverilog uvm_reg_hw_reset_seq::start(reg_model); // 自动验证寄存器复位值 ``` 类似案例1中功耗寄存器的配置验证 2. **协议一致性测试** - 通过`uvm_sequence`实现协议时序验证 - 如案例2中机械臂控制指令的时序验证 3. **覆盖率驱动验证** ```systemverilog covergroup cg @(posedge clk); address_cp: coverpoint addr { bins low = {[0:15]}; bins mid = {[16:240]}; } endgroup ``` 实现案例4中温度分布的全状态覆盖 #### 五、开发流程示例 1. **环境搭建** ```systemverilog class my_env extends uvm_env; my_agent agent; // 实例化Agent virtual function void build_phase(); agent = my_agent::type_id::create("agent", this); endfunction endclass ``` 2. **测试用例开发** ```systemverilog class burst_test extends uvm_test; task run_phase(); burst_sequence seq = burst_sequence::type_id::create("seq"); seq.start(env.agent.sequencer); // 启动测试序列 endtask endclass ``` 3. **结果分析** ```text UVM_INFO @ 10500ns: [Report] Coverage Summary: - Functional Coverage: 98.7% - Code Coverage: 95.2% - Assertion Coverage: 100% ``` #### 六、优势对比 | 特性 | UVM | 传统定向测试 | |---------------|---------------|----------------| | 重用性 | 跨项目复用组件 | 每次从头开发 | | 验证效率 | 自动生成场景 | 手动编写用例 | | 覆盖率 | 系统性收集 | 依赖人工检查 | | 调试能力 | 内置消息机制 | 基础打印调试 | | 学习曲线 | 较高(需培训) | 较低 | #### 七、行业应用数据 - 采用UVM可减少30%-50%验证周期(案例1中提前发现漏电流问题) - 覆盖率提升达40%(如案例3中用户流程覆盖率提升) - 代码复用率最高可达80%(支持案例4中不同电池模组的快速验证) 通过标准化的验证架构,UVM已成为芯片验证的工业级标准(被IEEE 1800.2标准化),其数据驱动特性与案例中展示的量化验证理念高度契合,是实现复杂系统可靠验证的核心工具。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值