《UVM实战(卷1)》学习笔记
- 格式:docx
- 大小:46.53 KB
- 文档页数:11
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 修改测试。
1.Sequence 中的m_sequencer和p_sequencer两者都是sequencer的指针,默认情况下都指向由ovm_sequencer_base继承而来在factory中注册的那个sequencer。
区别是m_sequencer由ovm_sequencer_base保护,不可ovm_user来更改,而p_sequencer可由user通过`uvm_declare_p_sequencer(sequencer_name)来改变指向。
所以用户如果想从一个sequence得到sequencer的信息可指定p_sequencer的指向,之后通过p_sequencer.*的方式取得相应信息。
实例:(uvm实例ovm通用)`uvm_object_utils(seq_name)`uvm_declare_p_sequencer(sequencer_name)if you need to access the sequencer information (or any of it's hierarchy information) from a sequence.I believe m_sequencer should not be used as it is protected./forums/showthread.php?193-m_sequencer-vs-p_sequencer2.一个Sequence 中的执行顺序CREATED:The sequence has been allocated.PRE_BODY:The sequence is started and the pre_body task is being executed.BODY:The sequence is started and the body task is being executed.POST_BODY:The sequence is started and the post_body task is being executed.ENDED:The sequence has ended by the completion of the body task.STOPPED:The sequence has been forcibly ended by issuing a kill() on the sequence. FINISHED:The sequence is completely finished executing.3.OVM使仿真结束方法(1)global_stop_request:基于task的目标结束方式(2)ovm_test_done:object结束方式,当所有object dropped调用global_stop_request (3)kill or do_kill_all:强行结束,不推荐(4)timeout:超时结束,需要用set_global_timeout来设定超时时间详细内容参考OVM_Reference的P384.ovm_test_doneovm_test_done_objection的实例化class(global类),用来结束run phase。
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是一种基于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。
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 类来实现事务级建模。
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继承关系1. 概述UVM(Universal Verification Methodology)是一种通用的验证方法学,广泛应用于硬件设计行业。
在UVM中,继承关系是一种重要的设计模式,用于定义验证环境中的各个组件。
2. UVM继承关系的类型在UVM中,继承关系主要有以下几种类型:配置数据库继承关系配置数据库继承关系用于保存和管理测试环境中的配置信息。
通过继承,可以实现配置信息的重用和扩展。
Testbench继承关系Testbench继承关系用于构建验证环境中的测试平台。
通过继承,可以实现测试平台的模块化和复用。
Agent继承关系Agent继承关系用于构建验证环境中的Agent组件,用于生成和接收设计模块的数据。
通过继承,可以实现Agent的配置和功能的扩展。
Sequence继承关系Sequence继承关系用于生成测试模式,驱动Agent发送特定的数据到设计模块。
通过继承,可以实现测试序列的复用和扩展。
Scoreboard继承关系Scoreboard继承关系用于验证设计模块的输出结果是否符合预期。
通过继承,可以实现Scoreboard的功能扩展和错误检测。
3. UVM继承关系的作用UVM继承关系在验证环境的构建中扮演重要角色,具有以下作用:代码重用通过继承可以实现代码的重用,减少重复编写相似功能的代码,提高开发效率。
功能扩展通过继承可以扩展已有组件的功能,满足特定需求。
例如,在Agent组件中可以扩展数据生成算法。
模块化设计通过继承可以实现模块化的设计,各个组件之间相互独立,易于维护和管理。
多态性通过继承可以实现多态性,使得组件的行为根据实际情况进行动态变化,提高测试的灵活性和可扩展性。
4. 总结UVM继承关系是一种重要的设计模式,在验证环境的构建中具有重要作用。
各种继承关系的应用使得验证环境更加模块化、可复用和灵活,提高了验证的效率和可维护性。
因此,熟练掌握UVM继承关系的使用是每个资深创作者的必备技能之一。
《UVM实战(卷1)》学习笔记看了第1/2/3/4/5/6/8/9.1这几个章节。
第一章是综述,第二章是一个具体的例子,学习笔记从第三章相关内容开始。
我个人觉得UVM重要的部分(特点的部分):1)factory机制(overrideconfig_db)2)TLM传递3)phase机制4)sequence-sequencer以及virtualseq/sqr里的。
需要也是item,当所有的driver要派生自uvm_driver.driver用来把sequence_item中的信息驱动到DUT端口上,从transaction-level向signal-level的转换。
uvm_driver需要参数(REQRSP),比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.svh里没有增加2对于`uvm_component_utils(类名)uvm_component里的成员也可以像uvm_object里成员一样,用field_automation机制。
field_automation机制:对于uvm_object派生类来说,field_automation机制让对象自动有的copycompareprintpackunpack等函数,简化了实现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_intvsuvm_config_db#(bit[47:0])这个时候super.build_phase()是不起作用的。
想要起作用的话,需要用clone=new+copy 源代码中可以看到clone 函数一上来会做一次create ,然后调copy 函数src/base/uvm_object.svh3.2UVM 的树形结构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 ”,实际就是0/11有217bit 中bit0✍✍UVM_ALL_ON 是‘UVM_ALL_ON|UVM_NO_PACK 这样就会忽略掉packbitvlan 或非vlanps crc_error 是3.4UVM打印信息控制get_report_verbosity_level()set_report_verbosity_level(UVM_HIGH)只对当前调用的component起作用set_report_verbosity_level_hier(UVM_HIGH)对当前及下面所有的component起作用simv+UVM_VERBOSITY=UVM_HIGH命令行方式------我觉得用这个就可以了重载打印信息:set_report_severity_override(UVM_WARNING,UVM_ERROR);上述函数都是在connect_phase及后面的phase使用设置UVM_ERROR到达一定数量结束仿真(6.6.1章节)。
使用如下函数调试config_dbcheck_config_usage()print_config(1/0)这两个函数在connect_phase函数中调simv+UVM_CONFIG_DB_TRACE注意:第二个参数设置错误不会报错!!-------config_db机制务必要注意参数的书写。
第4章UVM中的TLM1.0通信TLM是TransactionLevelModeling缩写这章要搞清楚portexportimpfifo以及几种操作function/task和对应component中要实现的function/task下面的箭头方向都是控制流的方向,不是数据流方向。
我觉得作为一个VMM用户会觉得TLM有点难理解,总想用VMM_CHANNEL去套,结果把自己搞晕。
像port等其实是调imp所在component的task/function.我看UVM源代码里有一个uvm_seq_item_pull_port的class,它的基类是uvm_port_base.在uvm_driver的成员seq_item_port就是这个类型的。
与它对应的是uvm_seq_item_pull_imp,uvm_sequencer的成员seq_item_export就是这种类型。
在my_agent.sv中会connect它们。
4.2端口互连port是动作的发起者,export是动作接收者,但是需要以一个imp来结束。
;而完以后,之分component4.2.9)。
transport 连接用connect函数实现,从名字就可以看出来,这个必须在connect_phase中调。
4.3通信方式这节应该是本章重点。
实际使用中用analysis_port✍analysis_imp还是port✍tlm_analysis_fifo✍port可以根据实际情况自己决定。
analysis_port(analysis_export)可以连接多个imp(一对多的通信)✍✍put和get系列端口与相应imp的通信通常是一对一的(可以一对多,但是本书没有给出一对多的例子4.2.1章节有介绍)。
analysis_port(analysis_export)更像是一个广播analysis_port(analysis_export)没有阻塞和非阻塞的概念。
它是一个广播,不等与它相连的其他端口的响应。
analysis_port(analysis_export)必须连的imp是analysis_imp.analysis_imp所在的component必须定义个write的function---------注意:是function代码示例:4.3.1示例代码的analysis_port文件夹componentC和B的代码基本一致。
env的connect_phase函数里做connect:component中有多个imp的时候,如何实现write函数?4.3.2给的例子中,scoreboard有两个imp,分别从output_agent和reference-model的analysis_port获取transaction,然后做compare.这个时候需要用:`uvm_analysis_imp_decl(_标记)这个macro,然后“write”函数变成“write_标记()”函数,analysis_port所在component不用变,还是调write()函数即可。
代码示例如下:使用macro声明来实现中直接new的时候用for循环。
第5章UVM验证平台的运行5.1phase机制所有的phase如下图:中间绿色的是taskphase,两头青色的是functionphasecomponent的实例化是在build_phase中完成,object的实例化可以在任何phase完成。
functionphase中除了build_phase都是“自下而上”的执行----这里的上下是指的树结构中的上下。
-------build_phase是“自上而下”同层次的兄弟关系的component,buildphase执行顺序是根据new时候name的字典序–5.1.3章节对于叔侄关系的component,buildphase执行顺序是深度优先。
例如前面UVM树中,“scb”和“i_agt.drv”,因为i_agt在scb前面,会执行完i_agt,然后drv\mon\sqr,然后o_agt,然后mon,然后才是scb。
所有component的同一个runtimephase是同时开始的。
-----也就是说会等其他component的上一个phase结束才开始当前phase。
super.build_phase(phase)一定要加,其他phase的super….可以不用加.phase之间可以跳转。
例如在正常工作的时候,发生了的reset,那么应该是main_phase跳转到reset_phase.例如:5.1.7章节的示例代码jump这个问题如给4)启动sequence(一般在case的build_phase中)上述变化反映到代码中,如图6.1.2章节的示例代码下图中有两种方法实现my_sequencersequence的启动方式(3种):1)在case的main_phase中:注意要设置cseq的staring_phase。
我觉得书上6-5代码清单里有两个地方写的不合理,一个是start的参数应该是sqr的路径,另外是少了设置starting_phase2)注意在case的build_phase中3)更推荐用下面这种方式:sequence被启动后,会自动执行sequence的bodytask(以及pre_bodymid_bodypost_body)在同一个sequencer上可以启动多个sequence,因为启动了多个,所以不能设置default_sequnce了,需要用上面第一种方法来启动sequence.---------但是sequence的嵌套可以解决这个问题(上层sequence做default_sequence6.4章节)sequence可以用uvm_do_priuvm_do_pri_with等macro来设置优先级priority,当一个sequencer上有多个sequence的时候,这个优先级就有意义了。