uvm实战-学习笔记
uvm 基础知识

UVM(Universal Verification Methodology)是一种用于硬件验证的标准方法学。
它是由Accellera组织开发的,旨在提供一种统一的验证方法学,以加快硬件设计验证的速度和效率。
以下是UVM的一些基础知识:
1. UVM构建在SystemVerilog语言的基础上,利用了SystemVerilog的各种特性,如类、继承、多态等。
2. UVM采用了基于类的面向对象编程方法,通过创建各种类来描述和模拟硬件设计中的各个组件和行为。
3. UVM提供了一套丰富的验证组件,包括顶层环境(uvm_env)、测试用例(uvm_test)、代理(uvm_agent)、驱动器(uvm_driver)、监视器(uvm_monitor)等,这些组件可以根据设计的需求进行组合和扩展。
4. UVM采用了基于事务的验证方法,通过定义和交换事务来模拟和验证设计中的数据传输和交互。
5. UVM提供了一套丰富的验证功能,如随机性、覆盖率、
错误注入、消息传递等,可以帮助验证工程师更好地设计和执行验证计划。
6. UVM还提供了一套强大的报告和调试机制,可以帮助验证工程师快速定位和解决验证中的问题。
总之,UVM是一种用于硬件验证的标准方法学,通过利用SystemVerilog的特性和提供丰富的验证组件和功能,可以帮助验证工程师更高效地进行硬件设计验证。
UVM实战指南-第四章

4.1.2 UVM 库使用指南
为了避免命名冲突,避免在全局环境中导入 uvm_pkg. 其他的 package 也同样适用此原则(避免 全局环境中导入)
顶层文件一般如下格式
`ifndef <FILE _NAME>_SVH `define <FILE _NAME>_SVH ... 文件内容 `endif 这种方式允许 UVM 库被多个地方引用而避免重复声明,一起编译的时候仅编译一次。建议用户在自己的 UVM 文件中也使用此方式。
上面简单的例子包含了一个几乎所有交易(transaction)都有的 print()方法。 大部分数据项都需要打印,复 制,比较,打包,解包以及其他功能。如果让开发者去自已去定义这些功能将不便于复用。环境整合者将
3Байду номын сангаас
Design IC
/
electron64@
这一章讲解库的结构以及基本功能,重点放在大多数验证环境所需要的基本特征上。 注意:为了简化,例子并没有完全遵循 UVM 建议的架构和方法学。 这一章主要包括:
使用 UVM 库 基本类 TLM 端口 工厂模式 消息和汇报 配置机制
4.1 使用 UVM 库
为了使用 UVM 库,用户需要:
实例 4–1: 非 UVM 类定义 1 typedef enum bit { APB _READ, APB_WRITE} apb _direction _enum; 2 class apb_transfer; 3 rand bit [ 31:0] addr; 4 rand bit [ 31:0] data; 5 rand apb _direction _enum direction; 6 function void print(); 7 $display("%s transfer: addr=%h data=%h", (), addr, data); 8 endfunction : print 9 endclass : apb_transfer
UVM实战指南——第3部分

UVM实战指南——第3部分第3部分:UVM实战在前两部分中,我们介绍了UVM框架的基本概念和基本用法。
在这一部分,我们将进一步探讨UVM的实际应用,并提供一些实战技巧和建议。
1.重要性分析在开始UVM实战前,首先需要进行重要性分析。
这包括确定哪些功能是需要覆盖的,哪些功能是必要的,以及哪些可能引发错误的功能需要特殊关注。
这些分析可以帮助您确定测试计划的优先级,并在测试开发过程中更好地分配资源。
2.测试计划开发根据重要性分析的结果,您可以开始开发测试计划。
测试计划应该详细描述实施哪些测试以及对每个测试的期望结果。
它还应包括测试开发和验证团队的人员分配和时间表安排。
通过制定清晰的测试计划,您可以确保测试开发工作有条不紊地进行,并及时识别和解决问题。
3.环境开发在开发测试计划后,您可以开始开发UVM环境。
环境是UVM中最关键的部分之一,它包含了用于模拟验证环境的各种组件和接口。
在环境开发过程中,您需要根据测试计划中的需求,选择和实例化适当的UVM组件,并将它们连接在一起以形成完整的验证环境。
4.测试用例开发测试用例是验证过程中的核心功能。
在开发测试用例时,您需要通过实例化适当的测试类,指定测试目标,并配置测试环境。
您还需要定义测试封包,设置或生成输入数据,以及从模拟输出中提取和分析结果。
测试用例的开发应该遵循UVM的最佳实践,并确保测试覆盖范围广泛且有效。
5.仿真运行和调试一旦测试用例开发完成,您可以开始运行仿真并进行调试。
在仿真过程中,您可能会遇到各种问题,如信号不正确、仿真停滞、错误输出等。
为了有效解决这些问题,您可以使用UVM提供的调试功能,如消息和日志记录、波形查看和追踪。
通过运用这些工具,您可以更快地找到问题所在,并采取适当的措施进行修复。
6.结果分析和测试报告当仿真运行完成后,您需要对结果进行分析,并生成测试报告。
在UVM中,您可以通过访问测试类中的结果和统计信息来执行结果分析。
您还可以使用UVM提供的报告和日志功能,将结果以易于阅读和理解的方式呈现给项目团队和其他相关人员。
UVM Lab Guide自学笔记——快速入门UVM

UVM Lab Guide自学笔记——快速入门UVMfrom Monchy(蒙奇)在2020年秋招前根据Synopsys的SystemVerilog Verification UVM1.1Lab Guide自学UVM验证,在此分享前两章详细的学习笔记,几乎是指南的中文翻译,大量的过程截图对初学者很友好。
(UVM Lab Guide是Synopsys给出的UVM官方入门指南,里面包涵源码和实验指导,可以在网上自行下载。
建议参考《UVM实战》(张强))1UVM Environment1学习目标创建一个简单的UVM测试环境嵌入报告消息编译测试环境运行仿真并观察结果将数据、sequencer和驱动程序类添加到环境编译并仿真环境以观察行为2实验准备UVM由一组编码准则以及一组基类和宏组成。
这组基类和宏可帮助你开发外观和感觉上一致的测试平台。
这套编码准则使您能够开发鲁棒且高度可重复使用的测试平台组件,从而减少了修改、维护验证基础架构的时间,并花费更多时间验证您的设计。
第一个实验将按照UVM编码准则,使用UVM基类和宏开始构建UVM验证环境的过程:UVM lab文件夹有3个目录:labs(实验文件夹,里面的程序待补充)、solutions(lab的参考代码)和rtl(被测试的rtl代码)。
3搭建UVM测试平台任务1.创建简单的UVM 测试文件test_collection.svSolution:`ifndef TEST_COLLECTION_SV `define TEST_COLLECTION_SV `include "router_env.sv"class test_base extends uvm_test;`uvm_component_utils(test_base)router_env env;function new(string name,uvm_component parent);super.new(name,parent);`uvm_info("TRACE",$sformatf("%m"),UVM_HIGH);endfunction:newvirtual function void build_phase(uvm_phase phase);super.build_phase(phase);`uvm_info("TRACE",$sformatf("%m"),UVM_HIGH);env =router_env::type_id::create("env",this);endfunction:build_phasevirtual function void start_of_simulation_phase(uvm_phase phase);super.start_of_simulation_phase(phase);`uvm_info("TRACE",$sformatf("%m"),UVM_HIGH);//Note:If you want to see the topology as a tree format try://uvm_top.print_topology(uvm_default_tree_printer);uvm_top.print_topology();factory.print();endfunction:start_of_simulation_phase endclass:test_base`endiftest.sv Solution:program automatic test;import uvm_pkg::*;`include "test_collection.sv"initial begin$timeformat(-9,1,"ns",10);run_test();end endprogram编译并仿真简单的UVM 测试平台:$vcs -sverilog -ntb_opts uvm-1.1test.sv 编译开关-ntb_opts 用于使能UVM$simv +UVM_TESTNAME=test_base 可以通过factory configuration 修改测试。
uvm system verilog总结

uvm system verilog总结### UVM System Verilog 总结#### 导语UVM(Universal Verification Methodology)与System Verilog的结合,为芯片设计验证领域带来了革新。
这种方法论不仅提高了验证效率,还增强了验证的可重用性和覆盖率。
本文将全面总结UVM与System Verilog的相关概念、特点以及应用。
---#### 一、UVM与System Verilog概述**1.1 UVM简介**UVM是建立在System Verilog基础上的一个标准化验证方法论,旨在提供一种通用的、模块化的验证平台。
它通过将验证环境分层,实现了环境的可重用性和易于维护性。
**1.2 System Verilog简介**System Verilog是一种硬件描述和验证语言,结合了Verilog和VHDL的优点,并增加了面向对象编程的特性。
它在芯片设计和验证中广泛应用。
---#### 二、UVM的核心特点**2.1 面向对象**UVM采用面向对象的设计思想,将验证环境分为不同的类和层次,便于管理和重用。
**2.2 模块化**UVM的模块化设计使得验证环境可以根据不同的测试需求灵活组合和配置。
**2.3 自动化**UVM支持自动化测试,包括自动生成测试序列、自动检查和报告错误等。
---#### 三、System Verilog在UVM中的应用**3.1 非阻塞赋值**System Verilog的非阻塞赋值在UVM中用于描述硬件行为。
**3.2 面向对象编程**System Verilog的面向对象编程特性使得UVM可以定义基类和派生类,实现代码的复用。
**3.3 功能覆盖**利用System Verilog的功能覆盖(Functional Coverage)特性,UVM 可以全面检查设计功能的覆盖率。
---#### 四、UVM与System Verilog的结合优势**4.1 提高验证效率**UVM与System Verilog的结合使得验证人员可以快速搭建验证环境,提高验证效率。
uvm验证方法学的理解

uvm验证方法学的理解摘要:1.UVM简介2.UVM信息级别3.UVM冗余度控制4.如何应用UVM进行验证5.总结正文:UVM(Universal Verification Methodology)是一种验证方法学,广泛应用于电子设计自动化(EDA)领域。
UVM旨在提供一种统一、可重用的验证环境,以提高验证效率和可靠性。
本文将详细介绍UVM的基本概念、信息级别、冗余度控制以及如何应用UVM进行验证。
1.UVM简介UVM起源于1995年,由Mentor Graphics公司的David Flannery首次提出。
它是一种面向对象的验证方法学,基于组件架构,可以轻松地集成到现有的验证环境中。
UVM提供了一套丰富的库,包括常用的验证组件、传输层协议和消息机制等,使得验证工程师可以快速构建复杂的验证环境。
2.UVM信息级别UVM信息级别分为以下几种:- uvmNone:最低级别,不输出任何信息。
- uvmLow:输出较少的信息,主要用于错误诊断。
- uvmMedium:默认级别,输出较为详细的信息。
- uvmHigh:输出详细的信息,用于调试和问题定位。
- uvmDebug:最高级别,输出极为详细的信息,适用于深入分析。
通过设置不同的信息级别,UVM可以控制输出的日志信息,帮助我们专注于关心的内容。
3.UVM冗余度控制UVM通过冗余度级别的设置,提高了仿真日志的可读性。
在打印信息之前,UVM会比较要显示信息的冗余度级别与默认的冗余度阈值。
如果小于等于阈值,就会显示,否则不会显示。
默认的冗余度阈值为uvmMedium,所有低于等于uvmMedium的信息都会被打印出来。
4.如何应用UVM进行验证应用UVM进行验证的基本步骤如下:- 创建UVM环境:定义UVM域、组件和消息类型。
- 编写测试序列:针对待验证的IP(Intellectual Property)编写测试用例,生成激励。
- 应用激励:将测试序列应用到待验证的IP上,进行仿真。
《UVM实战》代码示例

《UVM实战》代码⽰例⾸先是top_tb:`timescale 1ns/1ps`include "uvm_macros.svh"import uvm_pkg::*;`include "my_if.sv"`include "my_transaction.sv"`include "my_sequencer.sv"`include "my_driver.sv"`include "my_monitor.sv"`include "my_agent.sv"`include "my_model.sv"`include "my_scoreboard.sv"`include "my_env.sv"`include "base_test.sv"`include "my_case0.sv"`include "my_case1.sv"module top_tb;reg clk;reg rst_n;reg[7:0] rxd;reg rx_dv;wire[7:0] txd;wire tx_en;my_if input_if(clk, rst_n);my_if output_if(clk, rst_n);dut my_dut(.clk(clk),.rst_n(rst_n),.rxd(input_if.data),.rx_dv(input_if.valid),.txd(output_if.data),.tx_en(output_if.valid));initial beginclk = 0;forever begin#100 clk = ~clk;endendinitial beginrst_n = 1'b0;#1000;rst_n = 1'b1;endinitial beginrun_test();endinitial beginuvm_config_db#(virtual my_if)::set(null, "uvm_test_top.env.i_agt.drv", "vif", input_if);uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.env.i_agt.mon", "vif", input_if);uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.env.o_agt.mon", "vif", output_if);endendmodule定义了时钟频率,传递了接⼝以链接TB,和⼀个run_test()。
UVM基础总结——基于《UVM实战》示例

UVM基础总结——基于《UVM实战》示例UVM(Universal Verification Methodology)是一种用于验证集成电路设计和系统级设计的方法学。
它提供了一种强大的框架,可以加速和规范验证过程,提高设计的质量和效率。
在《UVM实战》这本书中,通过讲解一系列示例,向读者介绍了UVM的基础知识和使用方法。
本书首先介绍了UVM的基本概念和工作原理。
UVM使用一种基于对象和类的面向对象方法来描述和组织验证环境。
它将验证环境划分为几个层次,包括顶层、环境、代理、驱动器、监视器等。
每个层次都包含不同的类和方法,用于实现不同的功能。
通过继承和实例化这些类,可以快速构建一个完整的验证环境。
接下来,本书介绍了UVM中的一些重要概念和方法。
例如,本书详细讲解了UVM的组件和接口。
组件是UVM中最基本的单元,用于实现特定的功能。
接口定义了组件之间的通信和数据交换方式。
UVM使用一种称为TLM(Transaction Level Modeling)的方法来进行通信,通过事务的方式传递数据。
本书还介绍了UVM中的一些重要机制,例如配置和工厂。
配置机制用于配置和管理验证环境中的各个组件和接口的参数。
它可以实现灵活的参数化配置,以适应不同的测试需求。
工厂机制用于管理对象的创建和销毁。
通过注册和继承,可以快速生成对象,并实现对象的多态。
本书还详细介绍了UVM中的测试用例和事务。
测试用例是验证环境中的最高层次,用于描述和控制验证过程。
测试用例可以包括多个事务,每个事务描述一个特定的操作或数据传输过程。
通过编写测试用例和事务,可以实现不同的功能和覆盖率要求。
最后,本书还介绍了一些高级的UVM特性和技术。
例如,本书介绍了UVM中的随机性和约束,用于实现随机的测试用例和事务。
本书还介绍了UVM中的一些重用机制,例如组件和测试用例的复用,以提高测试效率和质量。
通过《UVM实战》这本书的学习,我深入了解了UVM的基础知识和使用方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
uvm实战-学习笔记《UVM 实战(卷1)》学习笔记看了第1/2/3/4/5/6/8/9.1 这几个章节。
第一章是综述,第二章是一个具体的例子,学习笔记从第三章相关内容开始。
我个人觉得UVM 重要的部分(特点的部分):1)factory 机制(override config_db )2)TLM 传递3)phase 机制4)sequence-sequencer 以及virtual seq/sqr内容中的截图基本来自于UVM 源代码、书自带的例子和《uvm1.1 应用指南及源代码分析》这个PDF里的。
需要结合书(《UVM 实战(卷1)》第1 版)来看这个笔记。
第3 章UVM 基础3.1 uvm_component 和uvm_object常用的类名字:这个图是从作者张强的《uvm1.1 应用指南及源代码分析》里截得,不如书上 3.1.1 里的图好。
uvm_sequencer 也是代码里必须有的,所以我加了uvm_sequenceruvm_void 是一个空的虚类。
在src/base/uvm_misc.svh 中定义:红框的是我们搭testbench 的时候用的比较多的基类。
常用的uvm_object 派生类:sequencer 给driver 的transaction 要派生自uvm_sequence_item ,不要派生自uvm_transaction所有的sequence 要派生自uvm_sequence 或者uvm_sequence 的派生类,可以理解为sequence 是sequence_item 的组合(集合)。
driver 向sequencer 索要item ,sequencer 检查是否有sequence 要发送item ,当发现有item 待发送时,就把这个item 发给driver.常用的uvm_component 派生类:所有的driver 要派生自uvm_driver. driver 用来把sequence_item 中的信息驱动到DUT 端口上,从transaction-level 向signal-level 的转换。
uvm_driver 需要参数(REQ RSP),比uvm_component 增加了几个成员。
重要的是seq_item_port 和req/rsp. (src/comps/uvm_driver.svh )monitor/scoreboard 派生自uvm_monitor 和uvm_scoreboard ,但是uvm_monitor 和uvm_scoreboard 并没有在uvm_component 基础上做扩展。
src/comps/uvm_monitor.svhsequencer 要派生自uvm_sequencer. sequencer 做了很多扩展,但是如果我们自己写的sequencer 里没有增加成员的话,可以直接写如下代码:typedef uvm_sequencer #( 传递的sequence_item 类名) sequencer 类名;因为sequencer 在agent 中例化,所以一般写在agent 类文件里。
reference_model 派生自uvm_component.agent 要派生自uvm_agent. uvm_agent 里多了一个is_active 的成员。
一般根据这个active 来决定是否实例化driver 和sequencer. is_active 变量的数值需要在env 的build_phase 里设置完成(可以直接设置,也可以用uvm_config_db#(int)::set )。
env 要派生自uvm_env. uvm_env 没有对uvm_component 扩展。
src/comps/uvm_env.svh所有的test 都要派生自uvm_test 或者它的派生类。
uvm_test 也没扩展src/comps/uvm_test.svhuvm_object 和uvm_component 的macromacro 非常重要,事关把这些类的对象注册到factory 机制中去。
uvm_object macro1)对于uvm_sequence_item 就统一用(假设不用parameter) :`uvm_object_utils_begin(item类名). field_automation ?`uvm_object_utils_end2)对于uvm_sequence,要加上`uvm_object_utils(sequence类名)名)的声明需要`uvm_declare_p_sequencer(sequencer类可能还uvm_component macro对于driver monitor reference_model scoreboard sequencer case agent env 这些uvm_component 派生类都要加上:`uvm_component_utils( 类名)uvm_component 里的成员也可以像uvm_object 里成员一样,用field_automation 机制。
field_automation 机制:对于uvm_object 派生类来说,field_automation 机制让对象自动有的copy compare print pack unpack 等函数,简化了实现uvm_component 派生类里一些function/task 的工作量对于uvm_component 派生类来说,field_automation 机制最重要的是可以在build_phase 中自动获取uvm_config_db#()::set() 的数值(必须加super.build_phase(phase))---- 也就是不用写uvm_config_db#()::get()注意:field_automation的macro的类型要和uvm_config_db 的参数类型一致:如下示例代码,field_int vs uvm_config_db#(bit[47:0]) 这个时候super.build_phase() 是不起作用的。
想要起作用的话,需要用clone = new + copy 源代码中可以看到clone 函数一上来会做一次create,然后调copy 函数src/base/uvm_object.svh3.2 UVM 的树形结构uvm_component 的new/create 要注意第一个参数是名字,第二个参数是parent 指针。
UVM 真正的树根是“uvm_top ”. 根据上面这个树结构,可以看出一个个component 的parent 是什么。
uvm_top 的parent 是null。
当一个component 在实例化的时候,如果parent 参数设成null,那么parent 参数会被仿真器自动设置成uvm_root 的实例uvm_top.在6.6.1 章节里也提到了,sequence 在uvm_config_db# ()::get()的时候,第一个参数设成“null”,实际就是uvm_root::get() 3.5.1 章节也提到了这个层次结构函数:get_parent() get_child(string name) 这两个分别获取parent 指针和指定名字的child 指针。
get_children(ref uvm_component children[$]) 获取所有的child 指针get_num_children() 获取child 个数get_first_child(ref string name) get_next_child(ref string name) 获取child 的名字(反映到string name 上),返回值是0/1 两种情况应用参考代码如下(改动的 2.5.2 例子中的my_agent.sv):注意:上述代码是在connet_phase 中实现的。
上述代码的打印结果如下:my_agent's name is uvm_test_top.env.i_agt, parent's full path is uvm_test_top.env, children numis 3uvm_test_top.env.i_agt 0 child: drv --> full path:uvm_test_top.env.i_agt.drvuvm_test_top.env.i_agt 1 child: mon --> full path:uvm_test_top.env.i_agt.monuvm_test_top.env.i_agt 2 child: sqr --> fullpath:uvm_test_top.env.i_agt.sqrThis should be i_agt. my_agent's name is uvm_test_top.env.i_agtuvm_test_top.env.i_agt first child name is drvuvm_test_top.env.i_agt next child name is monuvm_test_top.env.i_agt next child name is sqrmy_agent's name is uvm_test_top.env.o_agt, parent's full path is uvm_test_top.env, childrennum is 1uvm_test_top.env.o_agt 0 child: mon --> full path:uvm_test_top.env.o_agt.monUVM_WARNING /tools/synopsys/vcs/G-2012.09/etc/uvm/src/base/uvm_component.svh(1846) @ 0: uvm_test_top.env.o_agt [NOCHILD] Component with name 'drv' is not a child of component'uvm_test_top.env.o_agt'This should be o_agt. my_agent's name is uvm_test_top.env.o_agtuvm_test_top.env.o_agt first child name is mon3.3 field automation 机制注意数组类型的field macro 比一般的要少real 和event 的macro. 一般的对于enum 类型有3 个参数,而数组的只有 2 个参数。