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的基础知识和使用方法。
uvm 基础知识
uvm 基础知识UVM是一种基于SystemVerilog语言的硬件验证方法学,它为验证工程师提供了一套验证环境和方法,帮助他们设计和开发复杂的硬件验证测试台。
以下为UVM的基础知识:1. UVM环境:UVM环境由各种组件组成,包括顶层测试环境,验证IP,驱动(driver),监控(monitor),事务(transaction),序列(sequence)和配置参数等。
2. UVM顶层测试环境:UVM顶层测试环境是UVM环境的主体,它实例化和连接各种验证组件,管理验证过程和数据路径。
3. 驱动(Driver):驱动是UVM环境的一个组件,负责将测试向硬件发送数据。
它接收事务(transaction)并将其转换为物理信号发送到被测设备。
4. 监控(Monitor):监控是UVM环境的一个组件,用于监听硬件信号并将其转换为事务(transaction)。
它将被测设备的输出信号捕获并生成与之对应的事务。
5. 事务(Transaction):事务是UVM环境中的一种数据结构,它封装了验证过程中的数据和控制信息。
事务用于在驱动和监控之间传递数据。
6. 序列(Sequence):序列是UVM环境中的一个组件,用于生成一系列的事务。
序列定义了事务的数据和控制信息,以及生成和管理事务序列的逻辑。
7. UVM Testbench:UVM Testbench是UVM环境的一部分,它是整个验证环境的顶层组织结构。
UVM Testbench包含了顶层测试环境、监控、驱动、序列等组件。
8. 配置参数:UVM使用一种叫作配置参数(configuration parameter)的机制,用于动态地配置和管理各种验证组件的行为和功能。
9. UVM测试用例:UVM测试用例是UVM环境中的一个组件,它描述了验证目标的特定功能和行为。
测试用例通常由一个或多个序列组成,用来生成一系列的事务。
以上是UVM的基础知识,了解这些概念可以帮助你更好地理解和应用UVM验证方法学。
UVM基础总结——基于《UVM实战》示例
UVM基础总结——基于《UVM实战》⽰例⼀、前⾔ ⼯作⼀直在做SoC验证,更关注模块间的连接性和匹配性,所以相⽐于擅长随机约束激励的UVM来说,定向测试的概念更容易debug。
当然前提是IP已经被充分验证。
因此觉得接触UVM的机会较少。
到现在发现即使在SoC验证中依然有它的⽤武之地。
⽐如验证可独⽴于CPU⼯作的IP、快速对系统性能进⾏评估、重⽤IP级别的验证环境,甚⾄是⼀些通⽤的VIP也有基于UVM编写的。
基于这些考量,也逐渐开始接触。
《UVM实战》是很多验证⼯程师的启蒙,本⽂借⽤书中开头的⽰例简单梳理下UVM的基本知识。
⼆、UVM基础概述 关于UVM的知识⽹络上已经铺天盖地了,下边的内容只是⾃⼰的⼀些认识和随记。
UVM其实就是基于SV语⾔写的⽤于验证的代码库和对应的验证规范。
下图是UVM验证环境的整体结构(图来源见参考⽂献1)。
图中注释介绍了每个组成部分的作⽤。
《UVM实战》书中给我留下最深刻的印象就是⽤⼦弹、弹夹和⼿枪分别类⽐transaction sequence和sequencer,这也是UVM环境灵活的重要原因之⼀。
这是激励的产⽣机制,⾄于响应的采集和响应任务会交给monitor和scoreboard。
后者中的期望数据或者参考数据的来源⽐较灵活,函数、⽂件或是reference model的响应均可。
以上是UVM的空间维度,这⼀概念也被抽象成如下的树状结构。
各个部分必然存在信息交互。
sequence和sequencer之间传递的是transaction,实际上component之间也是transaction级别的通信,叫做TLM (transaction level model)最常见的就是monitor中uvm_analysis_port通过uvm_tlm_analysis_fifo连接到reference model或scoreboard中的uvm_blocking_get_port。
UVM实战指南——第3部分
(*)题外话:TLM可能是UVM中最重要的概念,掌握了TLM,就可以开始尝试编写一些小程序了。
翻译这篇文章,也是为了巩固加强对TLM的理解。
(*)几个名词:transaction翻译为事务或者交易;packet翻译为封包,packet属于transaction;monitor翻译为监视器;driver翻译为驱动器;scoreboard翻译为记分牌;有些词汇直接被运用到UVM源代码上,所以有时候用英文更容易描述清楚。
(*)语言的目的是为了交流,翻译不是为了纯粹的语言转换,而是为了传递思想。
4.6 UVM中事务级建模(TLM)20多年前,设计者从门级转向RTL级。
这次转换来自于标准Verilog/VHDL的RTL编码风格,以及RTL综合实现工具的推出。
使用RTL最大的好处是让设计者更多的专注于时序行为的设计以及功能的正确性,而很少考虑门级相关设计。
TLM(事务级建模)同样在抽象级别上更进了一步,在设计和验证领域都有出现。
通过TLM, 中心放在系统级别的各种事务流的建模,而更少关心时钟级别的行为。
TLM在测试向量中已经使用多年。
通常,在产生激励和覆盖率检查的时候使用事务而不是用时钟级别建模,这种方式就是TLM. 为了验证RTL级别的DUT(需要测试的模块),测试向量使用事务发生器(transactor)(有时也称为总线功能模型(BFM)),将RTL级和事务级进行转换。
在UVM中,此事务发生器也被叫做驱动(driver)或者收集器(collector)。
TLM中,事务通过方法调用和类对象来建模。
使用事务级而不是信号级别来建模有几个显著的好处:∙TLM比RTL更简洁,仿真速度快。
∙TLM模型的抽象级别更高,更加契合验证工程师或设计工程师对内部功能的考虑,从而使得建模更简单,并且更容易被其他工程师理解。
∙TLM模型将不符合复用的部分移到模型之外,因此TLM很适合复用。
并且,TLM使用面向对象的技术,比如继承、实现和接口分离的技术。
uvm知识点总结
uvm知识点总结UVM 架构UVM 的架构包括以下几个重要部分:1. UVM 库 (UVM Library): UVM 库是一个可复用的验证组件集合,包含了多个验证类,如uvm_component、uvm_object、uvm_sequence 等,这些类组成了 UVM 框架。
2. UVM Testbench: UVM Testbench 是一个验证环境框架,它是基于 UVM 库构建起来的,用于创建验证环境、生成测试用例、进行仿真等。
3. UVM Test: UVM Test 是一个测试用例,主要由 UVM sequence 和 UVM 配置对象构成,它是用来验证被测试设计的功能是否正确。
4. UVM Agent: UVM Agent 是一个验证组件,是用于连接被测试设计和验证环境的中间层;它包括了 driver、monitor、sequence、sequencer 等。
基本概念UVM 中的一些基本概念包括以下内容:1. UVM Component: UVM 组件是 UVM 测试环境中的基本单元,用于组织和管理验证环境中的各种功能。
UVM 组件包括了 uvm_component、uvm_object、uvm_sequence 等。
2. UVM Object: UVM 对象是 UVM 中的一个基本概念,它是 uvm_component、uvm_sequence 和 uvm_transaction 的基类,用于实现类似于面向对象编程的功能。
3. UVM Phase: UVM 通过阶段 (Phase) 来管理验证环境的初始化、运行和结束等过程。
UVM 提供了一系列的任务来进行阶段的管理,如 uvm_phase、uvm_sequence、uvm_objection 等。
4. UVM Transaction: UVM 事务是指在验证中进行的交互过程,包括了数据传输、信号传递、命令执行等;UVM 提供了 uvm_transaction 类来实现事务级建模。
6.小白学uvm验证-寄存器模型
6.⼩⽩学uvm验证-寄存器模型 写过 verilog 硬件代码的同学应该都知道 DUT 会包含很多寄存器,它们是模块间交互的接⼝,其⽤途⼤致可以分为两类: a. 通过读出寄存器当前的值获取 DUT 当前的状态,该类寄存器称为状态寄存器; b. 通过对寄存器进⾏配置,可以使得 DUT ⼯作在⼀定模式下,该类寄存器称为配置寄存器。
在验证过程中,寄存器的验证是最新开始的,只有保证寄存器的配置正确,才能使得硬件之间的“交互”正确。
在验证寄存器配置是否正确的过程中,我们需要频繁的对 DUT 内部的寄存器进⾏读写操作,如 reference model 需要获取指定 reg 的参数值,在验证平台中我们获取DUT 内部寄存器的值的⽅式主要有两种: 前门访问(FRONTDOOR):启动 sequence 产⽣待操作寄存器的读写控制和地址,在 driver 中通过总线(Bus)驱动⾄DUT,并在 monitor 中采集 Bus 输出数据,该⽅式需要消耗仿真时间; 后门访问(BACKDOOR):在仿真环境中通过 DUT 实例名进⾏点操作,直接访问 DUT 内部的寄存器,该⽅式的缺点是,点操作需要通过绝对路径操作,如果寄存器数量庞⼤,会导致验证环境臃肿繁杂,容易出错。
因为上述操作的不利因素,才导致寄存器模型 ( RAL Model ) 产⽣。
1. 什么是寄存器模型 RAL Model 对应于 DUT 中的寄存器,RAL Model 中有 DUT 每⼀个寄存器的副本,它是真实硬件寄存器在软件环境中的⾏为模型;硬件寄存器的⼀个或多个 bit 的拼接称为⼀个域 ( field );多⼀个 field 形成⼀个 reg;多个 reg 构成⼀个块 ( block )。
uvm library 已经为我们定义好了上述⼏个概念,我们在使⽤时只需继承即可。
uvm_reg_field:这是寄存器模型中的最⼩单位。
uvm_reg:它⽐ uvm_reg_field ⾼⼀个级别,但是依然是⽐较⼩的单位。
《UVM实战》读书笔记思维导图
第7章 UVM中的寄存器模型
7.1 寄存器模型简介
7.2 简单的寄存器模 型
7.3 后门访问与前门 访问
7.4 复杂的寄存器模 型
7.5 寄存器模型对 DUT的模拟
7.6 寄存器模型中一 些内建的seque...
7.7 寄存器模型的高 级用法
7.8 寄存器模型的其 他常用函数
第8章 UVM中的factory机制
的组成
2.2 只有
2
driver的验证
平台
3 2.3 为验证平
台加入各个组 件
4 2.4 UVM的终
极大作: c...
5 2.5 建造测试
用例
第3章 UVM基础
3.1
1
uvm_compo
n e n t 与 u v. . .
3.2 UVM的树 2
形结构
3 3.3 field
automation. ..
最新版读书笔记,下载可以直接修改
《UVM实战》
PPT书籍导读
读书笔记模板
最
新
版
本
本书关键字分析思维导图
代码
平台
用法 器
版权
信息
寄存
机制
参数
应用 模型
编程设计
第章
验证
迁移
基础
测试用例
使用
小而美
目录
01 第1章 与UVM的第 一次接触
02
第2章 一个简单的 UVM验证平台
03 第3章 UVM基础
04
4 3.4 UVM中打
印信息的控制
5 3.5
config_db机 制
第4章 UVM中的TLM1.0通信
4.2 UVM中各种端 口的互连
uvm验证环境 复用方法
uvm验证环境复用方法摘要:1.UVM验证环境简介2.复用方法的重要性3.UVM中的复用方法4.实例化复用方法5.总结正文:UVM(Universal Verification Methodology)是一种验证环境,广泛应用于电子设计自动化(EDA)领域。
UVM旨在简化验证流程,提高验证效率和可靠性。
在UVM中,复用方法起着至关重要的作用。
本文将介绍UVM验证环境及其复用方法,并举例说明如何在实际项目中进行实例化。
1.UVM验证环境简介UVM验证环境是一个可重用的、基于组件的验证框架,它提供了一系列用于构建验证环境的工具和规范。
UVM的核心理念是将验证逻辑从具体的硬件描述语言(HDL)中分离出来,以便在不同的设计迭代和验证阶段中重复使用。
这有助于减少验证工作量,提高验证质量。
2.复用方法的重要性在验证环境中,复用方法具有以下优点:- 提高验证效率:复用现有的验证组件可以避免重复编写相同的逻辑,减少开发时间。
- 提高验证质量:通过重复使用经过测试的验证组件,可以提高验证的可靠性。
- 易于维护:复用方法有助于简化验证环境的维护,当需求发生变化时,只需修改相应的组件,而无需修改整个验证环境。
3.UVM中的复用方法UVM提供了一系列复用方法,包括:- 模板方法:UVM提供了一些通用的模板,如sequencer、driver、monitor、scoreboard等,用户可以根据需要进行定制。
- 策略模式:UVM支持使用策略模式在不同的验证策略之间进行切换,如基于功能的策略、基于覆盖率的策略等。
- 面向对象编程:UVM使用面向对象编程(OOP)原则,使得验证组件具有更好的可重用性和可扩展性。
4.实例化复用方法以下是一个实例化UVM复用方法的示例:- 在一个项目中,我们需要实现一个基于功能的验证策略,可以使用UVM 提供的sequencer模板。
- 创建一个继承自UVMSequencerBase的sequencer组件,并根据需求定制其行为。
uvm_do_on_with用法
uvm_do_on_with用法题目:探索uvm_do_on_with的用法及步骤解析引言:在现代的硬件设计中,验证是不可或缺的一个环节。
为了确保设计的正确性和功能的完备性,测试团队需要使用专门的验证方法和工具。
其中,UVM(Universal Verification Methodology)是一种广泛使用的验证方法学,能够提高验证效率和可重用性。
本文将深入探讨UVM中的一个重要特性uvm_do_on_with,并详细分析其用法和步骤。
第一部分:uvm_do_on_with概述- 引言uvm_do_on_with的作用和意义,解释其在验证中的重要性。
第二部分:uvm_do_on_with的基本用法- 构造函数:明确定义uvm_do_on_with的基本属性和参数- start函数:开始uvm_do_on_with的执行- wait函数:等待一定条件满足后继续执行- post_do函数:uvm_do中执行完do_on_with后执行的操作- stop函数:停止uvm_do_on_with的执行- 示例和代码展示:通过一个简单的示例,展示uvm_do_on_with的基本用法和执行结果第三部分:uvm_do_on_with的高级用法- 介绍uvm_do_on_with提供的高级功能和扩展- 辅助函数:介绍和使用uvm_do_on_with相关的辅助函数- 参数化:如何使用参数化功能进行动态验证- 示例和代码展示:通过一个复杂的实例,展示uvm_do_on_with的高级用法和效果第四部分:深入分析uvm_do_on_with的实现原理- 了解uvm_do_on_with的内部实现和工作原理- 分析uvm_do_on_with与其他UVM特性的关系- 与其他验证方法学的对比:讨论uvm_do_on_with的优势和劣势第五部分:总结与展望- 总结uvm_do_on_with的核心概念和用法- 现实中的应用案例和成功经验分享- 展望uvm_do_on_with的未来发展和改进的方向结论:通过本文的介绍和分析,读者可以全面了解uvm_do_on_with的作用、用法和原理。
uvm_pool的用法实践
uvm_pool的用法实践(原创版)目录1.uvm_pool 的概述2.uvm_pool 的基本结构3.uvm_pool 的实例化方法4.uvm_pool 的用法实践5.uvm_pool 的优缺点分析正文【1.uvm_pool 的概述】uvm_pool 是 UVM(Universal Verification Methodology)中的一个重要组成部分,主要用于存储和管理 UVM 中的各种数据结构和信息。
它可以在 UVM 环境中创建和管理各种类型的数据,如序列、存储器、UVM 状态等,从而为 UVM 的验证工作提供数据支持。
【2.uvm_pool 的基本结构】uvm_pool 是一个复杂的数据结构,它包含多个子结构,主要有以下几个部分:- uvm_pool:这是 uvm_pool 的数据类型,定义了一个基本的uvm_pool 结构。
- uvm_pool_base:这是 uvm_pool 的基类,定义了一些通用的方法和属性。
- uvm_pool_整治:这是 uvm_pool 的具体子类,继承自uvm_pool_base,实现了具体的功能。
【3.uvm_pool 的实例化方法】要使用 uvm_pool,首先需要实例化一个 uvm_pool 对象。
一般来说,可以通过以下几种方式实例化 uvm_pool:- 使用 uvm_pool_整治类的构造函数直接实例化。
- 使用 uvm_pool_整治类的静态方法实例化。
- 使用 uvm_pool_整治类的工厂方法实例化。
【4.uvm_pool 的用法实践】下面是一个简单的 uvm_pool 用法实践示例:```c++#include <uvm_pool.h>#include <uvm_pool_整治.h>// 实例化一个 uvm_pool 对象uvm_pool *pool = new uvm_pool_整治 ("my_pool", 1024);// 使用 uvm_pool 存储数据uvm_sequence_item *item = new uvm_sequence_item("item", "data");pool->put(item);// 从 uvm_pool 中获取数据uvm_sequence_item *item_out = pool->get(NULL);// 删除 uvm_pool 中的数据pool->delete(item_out);// 释放 uvm_pool 对象delete pool;```【5.uvm_pool 的优缺点分析】uvm_pool 作为 UVM 中的一个重要组成部分,有其独特的优点,也有不可避免的缺点:优点:- 提供统一的数据管理机制,方便对各种数据结构进行管理。
UVM实战指南
1. 这个callback结构并不能够真的改变widget对象的内部成员,以及处理的数据内容,仅仅能够输出一些讯息。
2. 对每一个widget的对象,都需要单独添加相关callback对象,假如程序中又创建了一个新的widget对象,那么这个对象的callback queue初始是空的,也就是没有callback。
必须再次添加才能让这个新的widget 调用相应的callback功能。
3. c allback只有一个地方,可以扩展到多个地方。
另外也可以使用function,而不仅仅是task.工厂模式的简单理解首先,如果一个客户要用到一款手机,一般的做法是客户去创建一款手机,然后拿来用:这时,客户需要知道怎么去创建一款手机,客户和手机就紧密耦合在一起了.为了降低耦合,就出现了工厂类,把创建手机的操作放到了工厂里面去,客户直接使用工厂的创建手机方法,传入想要的手机型号就行了,而不必去知道创建的细节.随着手机种类越来越多,简单工厂模式出现了弊端,每次新加入手机品种,工厂类都要加入新的创建逻辑.这时我们就可以把工厂类定义成了接口,而每增加一种新的手机,就增加该手机对应工厂类的实现,这样工厂的设计就可以扩展了,而不必去修改原来的代码:随着工厂规模的继续扩大,工厂开始生产充电器了.这时候工厂有二个系列的产品:手机和充电器.而手机必须使用对应的充电器才能使用.这时候分别使用一个手机工厂和一个充电器工厂都不能满足我们的需求,我们必须确认手机跟充电器的对应关系.我们把工厂改造一下,把手机工厂跟充电器工厂联系在一起:这一章主要包括:∙使用UVM库∙基本类∙TLM端口∙工厂模式∙消息和汇报∙配置机制4.1 使用UVM库为了使用UVM库,用户需要:∙编译UVM包的顶层文件:uvm_pkg.sv∙在所需要的地方导入uvm_pkg∙包含UVM宏4.1.1 Hello World例子下面的例子功能是在屏幕上显示消息:"Hello World!”1 // Compile the UVM package2 `include ―uvm_pkg.sv‖3 module hello_world_example;4 // Import the UVM library and include the UVM macros5 import uvm_pkg::*;6 `include ―uvm_macros.svh‖7 initial begin8 `uvm _info(“info1”,“Hello World!”, UVM _LOW)9 end10 endmodule: hello_world_example第1-2行:注释用来提醒需要编译UVM库。
svuvm的一些tips
svuvm的⼀些tips1.bind的⽤法bind module_name1 module_name2 inst_name();module_name1:被bind的modulemodule_name2:发起bind的module应⽤场景:module_name2中做assertion,去bind rtl内部module;module_name2是interface2.格式化字符串$psprintf("se%0d",idx);$sformatf("se%0d",idx);$sformat(str_name,"se%0d",idx); //格式化字符串到str_namevoid'($sscanf(str,"xx%3sxx",str_extract)); //例如str是"xxabcxx",则可以提取出字符串"abc"到str_extract UVM_FILE/$fopen/$fdisplay3.uvm常⽤apiget_name() //调⽤改函数的component的实例化时索引名字get_full_name() //调⽤改函数的component在uvm tree中的全路径索引uvm_is_match("*str*", cmp_name);//例如cmp_name是"xxstrxx"则可以匹配uvm_hdl_read("top.dut.reg",value); //后门读取rtl信号uvm_hdl_deposit("top.dut.reg",value); //后门赋值rtl信号uvm_hdl_force("top.dut.reg",value); //后门force rtl信号4.define⽤法`define EXAMPLE(Str, Sig)\Str.clk = Sig``_clk;`EXAMPLE(a,b) <=> a.clk =b_clk;5.$cast⽤法⽗类句柄中是⼦类对象,可将其⽤cast传给⼦类句柄类型转换,例如int转换成enum6.randomize⽤法assert(std::randomize(val1,val2) with {constrain});7.命令⾏传参$value$plusargs("name=%d", na)运⾏时加option "+name=1", na值为18.transaction apitr.set_initiator(this); //可以把所处的class句柄传给transaction,在transaction中⽤get_initiator()获得tr.sprint(); //打印所有fieldtr.convert2string(); //所有field转为strfunction void do_print(uvm_printer printer);9.sv⽤法8'(val) //将val转为8位位宽10.uvm sequenceseq.set_parent(this) //layer sequence中设置parent sequenceseq.start(sqr,this) //在sequence中start另⼀个sequence要加thisuvm_sequence_state_enum seq_state = get_sequence_state(); //查看sequence所处阶段,例如UVM_BODYwait_for_sequence_state(UVM_STOPPED|UVM_FINISHED); //wait sequence到某个阶段11.uvm sequenceuvm sequence中对transaction进⾏约束时变量名最好不要和transaction中变量名⼀样,否则compiler会优先从transaction中寻找这个变量。
- 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 个参数。