UVM Lab Guide自学笔记——快速入门UVM
- 格式:pdf
- 大小:1.35 MB
- 文档页数:12
UVM初级开发指南本文完成于13年10月,是自己在做验证过程中的第一个文档。
文档中以张强的《UVM1.1应用指南及源代码分析》中的第一章的示例作为模型,简单讲述了UVM1.1d在QuestaSim中的应用,并添加了C语言和SV语言的联合仿真,对初学UVM验证的同学提供实际操作方面的帮助。
因为自己的毕业设计需要用到文档中的部分内容,所以直到现在才将其分享出来,希望更多的人能够受益。
写在前面时光荏苒、岁月如梭,转眼已到自己毕业的时间。
回首自己将近三年的研究生学习生活,一路坎坎坷坷,幸而得到身边许多良师益友的关怀和指导、帮助和激励,使自己得以勤奋自勉,顺利完成学业。
以前自己主要是做单片机、MSP430、STM32,写过LDPC的译码Verilog 代码,偶尔做做安卓客户端,玩过新浪的SAE,总体来说做得比较杂,对于验证方面的知识从来没有接触过。
之后自己分到的任务是用SystemVerilog做一个CPU模型,用于测试我们的RTL代码。
于是自己开始学习SV,在学习SV的过程中钟文枫的《SystemVerilog与功能验证》这本书给自己提供了很大的帮助,自己基本上将里面的代码都敲了一遍,就这样摸索了大约两周吧,摸索到了UVM (Universal Verification Methodology)这个陌生的东西,到这里,自己才算是摸到了验证的门沿。
同时期间由于北大的需求(要实现两个软件自动执行然后文件夹比较的功能,也是用于验证),自己学习了批处理语言,给下一步工作打下了基础。
然后找到张强的《UVM1.1应用指南及源代码分析》(去年8月张强出了一本《UVM实战-1》的书,可喜可贺,建议阅读该书)开始看啊看,主要看了其中的前两章,总共能看三遍吧,因为后面基本上都是源码的分析,我又用不到理论的东西(其实有空了还是要看一看的,这样出现问题了好排查),因此没有往后看,算是对UVM有个初步的了解,期间各种百度和google,UVM的中文资料还是比较少,最后在EETOP的IC验证板块中找到一些信息,后面自己有什么问题都在上面问。
UVM实战指南——第3部分第3部分:UVM实战在前两部分中,我们介绍了UVM框架的基本概念和基本用法。
在这一部分,我们将进一步探讨UVM的实际应用,并提供一些实战技巧和建议。
1.重要性分析在开始UVM实战前,首先需要进行重要性分析。
这包括确定哪些功能是需要覆盖的,哪些功能是必要的,以及哪些可能引发错误的功能需要特殊关注。
这些分析可以帮助您确定测试计划的优先级,并在测试开发过程中更好地分配资源。
2.测试计划开发根据重要性分析的结果,您可以开始开发测试计划。
测试计划应该详细描述实施哪些测试以及对每个测试的期望结果。
它还应包括测试开发和验证团队的人员分配和时间表安排。
通过制定清晰的测试计划,您可以确保测试开发工作有条不紊地进行,并及时识别和解决问题。
3.环境开发在开发测试计划后,您可以开始开发UVM环境。
环境是UVM中最关键的部分之一,它包含了用于模拟验证环境的各种组件和接口。
在环境开发过程中,您需要根据测试计划中的需求,选择和实例化适当的UVM组件,并将它们连接在一起以形成完整的验证环境。
4.测试用例开发测试用例是验证过程中的核心功能。
在开发测试用例时,您需要通过实例化适当的测试类,指定测试目标,并配置测试环境。
您还需要定义测试封包,设置或生成输入数据,以及从模拟输出中提取和分析结果。
测试用例的开发应该遵循UVM的最佳实践,并确保测试覆盖范围广泛且有效。
5.仿真运行和调试一旦测试用例开发完成,您可以开始运行仿真并进行调试。
在仿真过程中,您可能会遇到各种问题,如信号不正确、仿真停滞、错误输出等。
为了有效解决这些问题,您可以使用UVM提供的调试功能,如消息和日志记录、波形查看和追踪。
通过运用这些工具,您可以更快地找到问题所在,并采取适当的措施进行修复。
6.结果分析和测试报告当仿真运行完成后,您需要对结果进行分析,并生成测试报告。
在UVM中,您可以通过访问测试类中的结果和统计信息来执行结果分析。
您还可以使用UVM提供的报告和日志功能,将结果以易于阅读和理解的方式呈现给项目团队和其他相关人员。
UVM相关要点范文UVM(Universal Verification Methodology)是一种验证方法学,用于验证集成电路设计的正确性。
UVM的目标是提供一种可重用的、可扩展的、可配置的验证框架,可以适用于不同规模和复杂度的设计。
以下是UVM相关的要点。
1.UVM基本概念:UVM基于SystemVerilog语言,结构化验证环境,采用面向对象的设计方法。
它提供了一套验证组件,包括验证环境(env),顶层测试(test),驱动(driver),监视器(monitor),事务(transaction)等。
通过配置和连接这些组件,可以创建一个完整的验证环境。
2.UVM构建模块:3.UVM构建方法:UVM采用构建块方法构建验证环境。
首先,创建UVC,对外部接口进行建模,并实现相应的驱动和监视器。
然后,创建UVM Testbench,配置和连接UVC,并实现顶层测试。
最后,创建UVM Testcase,定义测试数据和验证规则。
4.UVM验证过程:UVM的验证过程包括四个阶段:创建、配置、运行和收尾。
在创建阶段,实例化UVM Testbench和UVM Testcase,并配置UVC。
在配置阶段,连接组件,设置参数和启动模拟器。
在运行阶段,执行测试,并生成日志和报告。
在收尾阶段,清理资源,关闭模拟器。
5.UVM核心概念:UVM的核心概念包括交易、序列、驱动、监视器和函数。
交易是验证过程中传递的数据包,包含信号、地址、数据和控制信息。
序列是交易的序列化表示,可以定义多个交易之间的顺序关系。
驱动是产生和驱动交易的组件,负责发送交易到被测对象。
监视器是接收和监视交易的组件,负责检查交易的正确性。
函数是UVM中的工具函数,用于处理和操作交易和序列。
6.UVM高级特性:UVM提供了一些高级特性,如配置管理、消息传递、注解和覆盖率。
配置管理是通过配置文件和命令行参数来配置UVM测试,方便测试的重用和管理。
消息传递是UVM中不同组件之间传递和处理消息的机制,可以实现进程间通信和事件驱动。
UVM学习笔记(⼀)UVM(Universal verification methodology)简介 所有的验证⽅法学服务⽬的都在于提供⼀些可以重⽤的类来减轻在项⽬之间⽔平复⽤和垂直复⽤的⼯作量UVM类库地图 ---> P260类库地图的分类:核⼼基类⼯⼚(factory)类事务(transaction)和序列(sequence)结构创建(structure creation)类环境组件(environment component)类通信管道(channel)类信息报告(message report)类寄存器模型类线程同步(thread synchronization)类事务接⼝(transaction interface)类⼯⼚机制概述⼯⼚机制也是软件的⼀种典型设计模式(design pattern)⼯⼚的意义UVM⼯⼚的存在就是为了更⽅便地替换验证环境中的实例或者注册了的类型,同时⼯⼚的注册机制也带来了配置的灵活性实例或者类型替代在UVM中称作覆盖(override),⽽被⽤来替换的对象或者类型,应该满⾜注册(registration)和多态(polymorphism)的要求UVM验证环境构成可以分为两部分,⼀部分构成了环境的层次,这部分代码是通过uvm_component类完成,另外⼀部分构成了环境的属性(配置)和数据传输,这⼀部分通过uvm_object类完成uvm_component类继承于uvm_object类,⽽这两种类也是进出⼯⼚的主要模具和⽣产对象模具:通过注册,可以利⽤⼯⼚完成对象创建对象由⼯⼚⽣产,也是利⽤了⼯⼚⽣产模具可灵活替代的好处,使得在不修改原有验证层次和验证包的同时,实现了对环境内部组件类型或者对象的覆盖uvm_{component,object}的例化创建uvm_component对象时,comp_type::type_id::create(string name, uvm_component parent);创建uvm_object对象时,object_type::type_id::create(string name);⼯⼚提供的便利——创建(create)⼀般来说,运⽤factory的步骤可分为:将类注册到⼯⼚在例化前设置覆盖对象和类型(可选的)对象创建在两种类comp1和obj1的注册中,分别使⽤了UVM宏 `uvm_component_utils和`uvm_object_utils宏做的事情就是将类注册到factory中,在解释注册函数之前,我们需要懂得在整个仿真中,factory是独有的,即有且只有⼀个,这保证了所有类的注册都在⼀个“机构”中class comp1 extends uvm_component;`uvm_component_utils(comp1) //将对象已经注册在⼯⼚中function new(string name="comp1", umv_component parent=null);super.new(name,parent); //继承了⽗类的new$display($sformatf(“%s is created”,name));endfunction: newfunction void build_phase(uvm_phase phase);super.build_phase(phase);endfunction: build_phaseendclassclass obj1 extends uvm_object;`uvm_object_utils(obj1) //将对象已经注册在⼯⼚中function new(string name="obj1");super.new(name,parent); //继承了⽗类的new$display($sformatf(“%s is created”,name));endfunction: newendclasscomp1 c1, c2;obj1 o1, o2;initial beginc1 = new("c1");o1 = new("o1");c2 = comp1::type_id::create("c2", null);o2 = obj1::type_id::create("o2");end。
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(Universal Verification Methodology)是一种基于SystemVerilog语言的验证方法学,广泛应用于硬件验证领域。
在UVM中,通过建立一个可重复使用的测试环境,结合使用事务级建模(TLM)和事务级验收测试(TLM),实现了分层、模块化的测试方法,提高了验证效率和可复用性。
一、UVM基础知识1.UVM组成:UVM主要由以下几个组成部分组成:- testbench:测试平台,包括环境、测试、配置和结果收集。
- environment:包含需要被验证的设计和其他组件,如计时模型(TLM)和监控器。
- agent:代理,用于管理测试和设计之间的数据传输和控制通信。
- sequence:序列,用于控制测试向设计发送输入和观察输出。
- driver:驱动器,控制从测试平台发送数据到设计。
- monitor:监控器,从设计中监听信号和寄存器的值。
- scoreboard:比分板,用于比较设计的输出和期望的输出。
2. UVM中的消息系统:UVM中的消息系统可以用于在验证过程中传递和显示消息信息。
消息分为几个级别,如UVM_DEBUG、UVM_INFO、UVM_WARNING和UVM_ERROR等。
通过设置消息级别,可以控制消息的显示和记录。
在UVM中,可以使用`uvm_info(`,`uvm_warning(`,`uvm_error(`等函数来生成和发送消息。
二、UVM测试环境构建1.UVM测试环境构建:UVM测试环境的构建遵循一个分层、模块化的方法。
首先,可以定义一个基础环境,包含全局配置和全局测试。
然后,可以在基础环境的基础上构建更高级的环境,如顶层环境和模块环境。
在每个环境中,可以定义组件(如代理、序列和监控器)和接口,然后进行连接。
三、UVM测试流程1.UVM测试配置:首先,可以使用UVM配置对象来指定测试的配置选项,如时钟频率和寄存器的初始值。
UVM_知识点测试UVM(Universal Verification Methodology)是由电子设计自动化(EDA)工具供应商提出的一种验证方法学,用于开发和验证硬件描述语言(HDL)模型的正确性。
UVM为测试工程师提供了一种结构化和可重用的验证环境,使他们可以更简单地编写,管理和执行测试。
UVM使用SystemVerilog作为验证环境和测试用例开发的语言。
UVM 提供了一种面向对象的验证方法学,它基于Verilog和VHDL等语言的验证方法学,同时引入了诸如高级配置,事务和重用性等新概念。
UVM的主要特点包括以下几个方面:1. 四个部分组成:UVM由四个主要部分组成,分别是顶层环境(top-level environment),顺序性容器(sequence container),交易级模型(transaction-level model)和测试用例(testcase)。
这四个部分组合在一起,为测试工程师提供了一个用于创建和管理验证环境的框架。
2.面向对象:UVM使用面向对象的方法编写验证环境和测试用例。
验证环境的构建是通过创建各种类和对象来实现的,这些类和对象之间可以进行继承和组合。
测试用例也是通过继承的方式创建的,使得可以重用已有的验证环境和测试用例。
3.事务级建模:UVM引入了交易级模型的概念,通过使用事务建模语法,可以描述信号和数据的传输。
这样可以更简单地描述和操作设计的功能,并且减少验证环境和测试用例的复杂度。
4.高级配置和重用性:UVM提供了一种灵活的配置机制,使测试工程师可以根据需要灵活配置验证环境。
此外,UVM还支持验证组件的重用,通过创建可重用的验证组件,可以提高验证环境的开发效率和测试用例的复用性。
UVM的工作原理如下:1.创建验证环境:首先,测试工程师需要创建一个验证环境,该环境包含了待验证模块的所有必要信号和接口。
验证环境可以通过继承和组合各种验证组件来创建,其中包括信号生成器,响应生成器,监视器等。
UVM序列篇之一:新手上路有了UVM的世界观,知道这座城市的建筑设计理念,也跟着码师们(实在不忍心用码农……)一起修建了各成独立环境的组件群落。
读者们在经过一番实践,经过上一章讲的组件之间的通信方式,开辟了各个建筑之间的道路、桥梁和河道以后,就可以进入紧张繁忙的物流期了。
如果城市里面没有交通,那么显然不会有多热闹。
在本章中,我们将主要围绕下面几个核心词来阐述它们的作用、主要分类以及之间的互动关系:•sequence item•sequence•sequencer•driver如果按照交通道路的车流来打比方,sequence就是道路,sequence item是道路上行驶的货车,sequencer是目的地的关卡,而driver便是最终目的地卸货的地方。
从软件实施的层面来讲,这里的货车是从sequence一端出发的,再经过了sequencer,最终抵达了driver,经过driver的卸货,每一辆的货车也就完成了它的使命。
而driver对每一件到站的货物,经过它的扫面处理,将它分解为更小的信息量,提供给DUT。
在这个过程中,不同的角色中有下面的这些软件互动:1.sequence对象自身会产生目标数量的sequence item对象。
借助于SV的随机化和sequence item对随机化的支持,使得产生的每个sequence item对象中的数据内容都不相同。
2.产生的sequence item会经过sequencer再流向driver。
3.driver得到了每一个sequence item,经过数据解析,再将数据按照与DUT的物理接口协议写入到接口上,对DUT形成有效激励。
4.如果有必要的时候,driver在每解析并且消化完一个sequenceitem,它也会将最后的状态信息同sequence item对象本身再度返回给sequencer,最终抵达sequence对象一侧。
这么做的目的在于,有的时候sequence需要得知driver与DUT互动的状态,这就需要driver仍然有一个回路再将处理了的sequence item对象和状态信息写回到sequence一侧。
UVM学习报告UVM学习报告 (1)UVM结构图 (1)1. transaction (2)2. sequence (2)3. drive (4)4. monitor (5)5. input_agent/output_agent (6)6. reference_model (6)7. scoreboard (7)8. interface (7)9. env (8)1. UVM结构图1.transaction①定义成员变量,以及变量类型;②在constraint中对随机的数据增加限制条件;③使用`uvm_object_utils系列宏实现factory机制,调用uvm_filed_int函数,传入的第一个参数是要操作的对象的指针,第二个参数表明这是一个什么操作,还可以通过某些参数把某个字段的相应功能去除。
2.sequence在sequence中最关键的是body。
在body中有调用了10次`uvm_do宏。
这个宏每执行一次就会向uvm_sequencer发送一个数据,uvm_sequencer收到数据就传给uvm_drive。
在UVM的组件中,drive,monitor,reference_model和scoreboard 的main_phase或run_phase都是无限循环的,要想让整个仿真停止,就要调用$finish函数。
在UVM中调starting_phase.raise_objection(this)告诉UVM要开始发包了,在发送完之前不能调用$finish。
在包发送完毕后,调用starting_phase.drop_objection(this)来告诉UVM可以调用$finish了。
当调用drop_objection时,UVM会检查一下其他的component的objection是否已经被drop了,当所有的objection已经被drop了,才会调用$finish。
3.driveUVM验证平台使用drive来发送数据,在drive中:①new函数定义时一般都要写上(name, parent)这一句,意思是执行父类的new函数。
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实战》⽰例⼀、前⾔ ⼯作⼀直在做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。
(*)题外话: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方法学是一种基于SystemVerilog的硬件验证方法学,被广泛应用于半导体行业中的验证工作。
本文将从UVM方法学的背景、基本原理、主要特点以及应用场景等方面进行介绍,以帮助读者更好地了解和应用UVM方法学。
一、背景随着半导体技术的不断发展,芯片设计的复杂性和验证难度也在不断增加。
传统的验证方法已经无法满足日益增长的验证需求,因此需要一种更加高效、灵活和可重用的验证方法学。
UVM方法学应运而生,它基于SystemVerilog语言,通过提供一套标准的验证组件和方法,帮助验证工程师更好地进行验证工作。
二、基本原理UVM方法学的基本原理是将验证环境和验证测试分离开来,通过验证环境提供的各种功能和工具,来实现对被验证设计的测试和验证。
验证环境由一系列的验证组件组成,包括顶层测试组件、驱动组件、监控组件、代理组件等。
验证测试则由测试用例和测试程序组成,通过对验证组件的配置和控制,来执行测试并收集验证结果。
三、主要特点1. 重用性:UVM方法学提供了一套标准的验证组件和方法,可以在不同的项目和设计中进行重复使用,提高了验证工作的效率和可靠性。
2. 可扩展性:UVM方法学采用了面向对象的设计思想,可以通过继承和扩展的方式,方便地创建新的验证组件和功能,以满足不同设计的验证需求。
3. 可配置性:UVM方法学提供了丰富的配置机制,可以通过配置文件或命令行参数来灵活地配置验证环境和测试,以适应不同的验证场景。
4. 仿真效率:UVM方法学通过使用事务级建模(TLM)和基于事件驱动的机制,可以有效地减少仿真时间和资源消耗,提高仿真效率。
5. 报告和分析:UVM方法学提供了丰富的报告和分析机制,可以方便地生成验证结果报告、覆盖率报告等,帮助验证工程师进行验证结果的分析和优化。
四、应用场景UVM方法学广泛应用于各种半导体芯片的验证工作中,特别适用于复杂和高性能的芯片设计。
以下是一些常见的应用场景:1. 处理器验证:UVM方法学可以用于验证各种类型的处理器,包括单核和多核处理器,通过创建适当的验证环境和测试用例,可以对处理器的功能和性能进行全面的验证。
uvm知识点UVM知识点UVM(Universal Verification Methodology)是一种用于硬件验证的标准方法学。
它提供了一套完整的验证框架和库,可用于设计和验证工程师开发的各种硬件设计。
UVM的主要目标是提高验证效率、加速验证流程,并提供一种可重用性的验证方法。
下面将介绍UVM的几个重要知识点。
1. UVM中的基本概念UVM中有几个基本概念需要理解。
首先是UVM Testbench,它是一个验证环境的集合,包括UVM Agent、UVM Sequence、UVM Driver、UVM Monitor等组件。
UVM Agent是验证环境中的一个重要组成部分,负责模拟设计中的一个或多个接口,并与设计进行通信。
UVM Sequence是一个用于生成测试向量的对象,它通过UVM Driver将测试向量发送给设计。
UVM Monitor是用于监控设计中信号变化的组件。
2. UVM中的消息和日志在UVM中,消息和日志用于记录验证过程中的重要信息。
UVM提供了几种不同级别的消息,包括FATAL、ERROR、WARNING、INFO和DEBUG。
开发人员可以根据需要选择适当的级别来记录不同类型的消息。
UVM还提供了灵活的消息过滤机制,可以根据需求过滤和控制消息的输出。
3. UVM中的事务和序列事务是在UVM中用于描述和传输数据的基本单元。
它包含了一些用于描述数据的字段,例如地址、数据和控制信号等。
事务通常由UVM Sequence生成,并通过UVM Driver发送给设计。
序列是一组事务的集合,用于描述测试向量的生成方式。
UVM提供了丰富的序列控制机制,可以灵活地生成各种测试向量。
4. UVM中的环境配置UVM提供了一种灵活的配置机制,可以在运行时配置验证环境的各个组件。
通过使用UVM的配置对象,可以在运行时修改和控制环境中的各种参数和属性。
这种配置机制可以大大提高验证环境的灵活性和可重用性。
uvm流程UVM(Universal Verification Methodology)是一种基于System Verilog的验证方法学。
UVM提供了一套模块化、可复用和可扩展的验证框架,用于实现高效的硬件验证流程。
下面是UVM流程的一般步骤:1.创建测试用例:首先,需要确定要验证的设计的功能和性能方面的要求,并编写测试用例来验证这些要求。
2.编写测试程序:对于每个测试用例,需要编写一个测试程序,该程序将实例化一个UVM测试环境,并连接被验证的设计。
3.实例化UVM测试环境:测试程序包括实例化UVM测试环境。
UVM测试环境由多个UVM组件组成,包括顶层测试环境、测试环境、代理、检查器和驱动器等。
4.构建测试环境:在UVM测试环境中,需要为被验证的设计创建包括驱动器、监视器和代理的测试环境。
测试环境向被验证的设计提供数据和控制信号,并收集来自设计的响应。
5.运行测试:一旦测试环境已经构建好,就可以执行测试程序。
测试程序将操作测试环境,发送各种数据和控制信号,并收集设计的响应。
6. 分析测试结果:测试程序在测试完成后将分析测试结果,生成测试报告,并对任何失败的测试用例进行调试。
这通常涉及到检查模拟波形或log文件以查找错误。
7.优化UVM测试环境:如果需要,可以对UVM测试环境进行优化,以提高测试效率和准确性。
可能需要改进模型或修改测试策略。
8.重复测试:如果UVM测试环境被改进,可以重新运行测试程序并重复整个过程,直到达到预期的验证目标。
注意事项:UVM流程并不是一成不变的,它可能因为具体测试需求的不同而有所不同。
因此,需要了解一些基本原则,以适应测试的特定需求。
例如,可以采用交叉验证来提高测试覆盖率,或使用重要性采样来减少测试时间。
【UVM源码学习】uvm_comparer uvm_comparer是个基类,提供了对象object⽐较的策略,⽐较结果(⽐较次数、成功与否)保存在comparer object中。
uvm_object::compare及uvm_object::do_compare即调⽤了uvm_comparer对两个uvm_object类型的参数进⾏⽐较。
uvm_comparer 中主要实现了以下⼏个⽅法:序号⽅法描述1compare_feild ⽐较两个uvm_bitstream_t类型的object lhs & rhs,两个object相同返回1,失败返回0并打印两个⽐较对象(打印严重性可设置)。
可指定⽐较size,size⼩于64采⽤compare_feild_int进⾏⽐对,否则直接⽐对,⽐对时可指定⽐较对象的mask,对应⽐特mask为1才进⾏⽐对,默认mask全1。
2compare_feild_int⽐较两个int类型的object 3compare_feild_real⽐较两个real类型的object4compare_object ⽐较两个uvm_object类型的object 。
若policy为UVM_REFERENCE,直接⽐较两个handle,否则调⽤pare(rhs, this)进⾏⽐较。
lhs或rhs任意⼀个为null都会⽐较失败5compare_string⽐较两个string类型的object,直接⽐较6print_msg ⽐较失败时会调⽤该函数打印两个⽐较的对象信息,此外还会记录miscompare的次数并把打印信息添加保存⾄字符串miscompares中。
7print_rollup 当⽐较的对象为uvm_object类型时,print_msg⽆法打印uvm_object的信息,print_rollup打印uvm_object类型的⽐较对象信息。
该⽅法为uvm库内部⽅法,不记录⽐较信息,也不建议⽤户直接调⽤。
uvm实战-学习笔记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_marcos——UVM宏定义I programmed all night.Through the window, on my screen,The rising sun shined.编程⼀整夜,透过窗户,照在屏幕上。
初升的太阳。
计算机科学⾥的宏是⼀种抽象(Abstraction),它根据⼀系列预定义的规则替换⼀定的⽂本模式。
解释器或编译器在遇到宏时会⾃动进⾏这⼀模式替换。
对于编译语⾔,宏展开在编译时发⽣,进⾏宏展开的⼯具常被称为宏展开器。
宏的⽤途在于⾃动化频繁使⽤的序列或者是获得⼀种更强⼤的抽象能⼒。
uvm_marcos包含了UVM中所有的宏定义。
⽂件:$UVM_HOME/src/uvm_macros.svh类:⽆`ifndef UVM_MACROS_SVH`define UVM_MACROS_SVH//// Any vendor specific defines go here.//`ifdef MODEL_TECH`ifndef QUESTA`define QUESTA`endif`endif`ifndef UVM_USE_STRING_QUEUE_STREAMING_PACK`define UVM_STRING_QUEUE_STREAMING_PACK(q) uvm_pkg::m_uvm_string_queue_join(q)`endif`ifndef QUESTA`define uvm_typename(X) $typename(X)`else`define uvm_typename(X) $typename(X,39)`endif`ifdef VCS// `ifndef UVM_DISABLE_RESOURCE_CONVERTER//UVM_USE_RESOURCE_CONVERTER enables UVM-1.1d to print resources output to match uvm-1.1c. VCS2014.03 or later does not need resource_converter object.// As per agreement in Committee at time of UVM-1.1d, from UVM-1.2 onwards the default is to disable resource converter and allow simulators to deal with %p natively. If a user wishes to enable resource converter then they need to compile us // `define UVM_USE_RESOURCE_CONVERTER// `endif`endif`ifdef INCA`define UVM_USE_PROCESS_CONTAINER`endif//// Deprecation Control Macros//`ifdef UVM_NO_DEPRECATED`endif`define uvm_delay(TIME) #(TIME);`include"macros/uvm_version_defines.svh"`include"macros/uvm_global_defines.svh"`include"macros/uvm_message_defines.svh"`include"macros/uvm_phase_defines.svh"`include"macros/uvm_object_defines.svh"`include"macros/uvm_printer_defines.svh"`include"macros/uvm_tlm_defines.svh"`include"macros/uvm_sequence_defines.svh"`include"macros/uvm_callback_defines.svh"`include"macros/uvm_reg_defines.svh"`include"macros/uvm_deprecated_defines.svh"`endif参考⽂献:1 路客验证. 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 修改测试。
include 环境文件在每种方法的开头输入这个语句。
这是为了在调试过程中提供帮助。
将此语句嵌入每个方法中,通过将报告详细程度设置为UVM_HIGH ,可以依次执行所有操作。
在该语句中,%m 用于打印当前的分层路径。
uvm_test 是基类,test_base 是它的扩展类register the class in factory构造函数有两个参数factory.print()显示在factory 中通过uvm_component_utils 宏注册的所有class 类型有用的调试代码任务2创建简单的环境在此任务中,您将构建一个简单的环境,它包括sequence_item(packet),sequence (packet_sequence),sequencer(sequencer),驱动器(driver),agent(input_agent)和环境(router_env)。
生成激励,并查看sequencer和驱动器之间的相互作用。
packet.sv Solution:`ifndef PACKET_SV`define PACKET_SVclass packet extends uvm_sequence_item;rand bit[3:0]sa,da;rand bit[7:0]payload[$];`uvm_object_utils_begin(packet)`uvm_field_int(sa,UVM_ALL_ON|UVM_NOCOMPARE)`uvm_field_int(da,UVM_ALL_ON)`uvm_field_queue_int(payload,UVM_ALL_ON)`uvm_object_utils_endconstraint valid{payload.size inside{[1:10]};}function new(string name="packet");super.new(name);`uvm_info("TRACE",$sformatf("%m"),UVM_HIGH); endfunction:newendclass:packet`endifpacket_sequence.sv Solution: `ifndef PACKET_SEQUENCE_SV`define PACKET_SEQUENCE_SV`include"packet.sv"class packet_sequence extends uvm_sequence#(packet);`uvm_object_utils(packet_sequence)使用嵌入在`uvm_object_utils_begin/ end宏中的uvm_field_*宏为UVM类中的变量创建支持方法(打印,复制,比较等)(将在下一个单元中介绍)。
类声明数据类构造函数和组件类构造函数之间存在主要差异。
在数据类构造函数中,参数中没有父组件句柄。
function new(string name ="packet_sequence");super.new(name);`uvm_info("TRACE",$sformatf("%m"),UVM_HIGH);endfunction:newvirtual task body();`uvm_info("TRACE",$sformatf("%m"),UVM_HIGH);if (starting_phase !=null)starting_phase.raise_objection(this);repeat(10)begin `uvm_do(req);endif (starting_phase !=null)starting_phase.drop_objection(this);endtask:bodyendclass:packet_sequence `endifdriver.svSolution:`ifndef DRIVER_SV `define DRIVER_SVclass driver extends uvm_driver #(packet);`uvm_component_utils(driver)function new(string name,uvm_component parent);super.new(name,parent);`uvm_info("TRACE",$sformatf("%m"),UVM_HIGH);endfunction:newvirtual task run_phase(uvm_phase phase);`uvm_info("TRACE",$sformatf("%m"),UVM_HIGH);forever beginseq_item_port.get_next_item(req);req.print();seq_item_port.item_done();endendtask:run_phase endclass:driver `endifinput_agent.svSolution:`ifndef INPUT_AGENT_SV `define INPUT_AGENT_SV `include "packet_sequence.sv"`include "driver.sv"typedef uvm_sequencer #(packet)packet_sequencer;在run_phase()方法中打印request (req )sequence 项driver 通过seq_item_port 从sequencer 中获取packet(req),并在控制台上显示获取内容。
在将来的实验室中,将添加更多功能。
body ()方法使用typedef 为数据包创建一个packet_sequencerclass input_agent extends uvm_agent;packet_sequencer seqr;driver drv;`uvm_component_utils(input_agent)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);seqr =packet_sequencer::type_id::create("seqr",this);drv =driver::type_id::create("drv",this);endfunction:build_phasevirtual function void connect_phase(uvm_phase phase);super.connect_phase(phase);`uvm_info("TRACE",$sformatf("%m"),UVM_HIGH);drv.seq_item_port.connect(seqr.seq_item_export);endfunction:connect_phase endclass:input_agent `endifrouter_env.svSolution:`ifndef ROUTER_ENV_SV `define ROUTER_ENV_SV `include "input_agent.sv"class router_env extends uvm_env;input_agent i_agent;`uvm_component_utils(router_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);i_agent =input_agent::type_id::create("i_agent",this);uvm_config_db #(uvm_object_wrapper)::set(this,"i_agent.seqr.main_phase","default_sequence",packet_sequence::get_type());endfunction:build_phase声明一个input_agent 类创建packet_sequencer 和驱动程序的实例在build_phase 中创建它们在connect_phase 中连接driver 和sequencer 的TLM 端口endclass:router_env`endifTask3运行测试$make编译和仿真,可以看到打印的测试平台拓扑结构和UVM报告结果。