UVM实战指南——第3部分
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_mentorpaper_使用手册
UVM:下一代验证方法学Mark Glasser,方法学建构师2011年2月4日UVM是验证业界为自身研发的一种新验证方法学。
UVM代表着验证技术的最新进展,使用它可创建坚实、可重用、具互操作性的验证IP和测试流程(testbench)组件。
UVM最新奇、最令人兴奋的方面之一却是它是如何被开发的。
UVM不是由一家EDA供应商开发的,也并非作为营销活动的一部分而推出,它是由众多业内专家联合开发的,他们来自微处理器公司、网络公司、验证顾问机构以及EDA供应商。
UVM的全部开发工作是在Accellera(一个标准化组织,致力于开发电子设计自动化领域里的标准和开放接口)架构下完成的。
在一个标准组织的旗帜下,各家公司(其中一些是市场上的对手)才能够在协作的环境中携起手来,以迎战建构一个先进验证方法学所面临的技术挑战。
每位代表为这一协同努力都贡献了他们所在行业的专业知识和视角。
其结果是为建构验证环境贡献出一个强大、多维的软件层和方法学。
当然,UVM已经在主要EDA供应商的所有模拟器上都进行了测试。
UVM的确是种真正的行业创举,Mentor以亲历其中而自豪。
UVM并非从天而降。
它集许多独立验证方法学的成果之大成。
其承继的资产包括AVM、URM,VMM和OVM。
图1. UVM的继承UVM承继的这些方法学提供了UVM得以建立其上的丰富的方法学库。
最值得注意的是,OVM-2.1.1是UVM的“起点”,是UVM得以孕育成功的种子代码库。
因此,UVM与OVM最相近,且大体上向后兼容OVM。
作为VMM一部分的RAL 包被转化为UVM的寄存器功能。
虽然上面提到的一系列方法学是UVM得以成就的种子,但UVM并非其前辈代码的简单叠加。
UVM为测试流程(testbench)建构提供了新功能和新的使用模式,从而将验证方法学提升到一个新高度。
寄存器在现代SoC设计中,寄存器集合是作为设计的接口。
通过寄存器——器件得以复位和配置;数据得以接收和发送。
uvm实战学习笔记
《UVM 实战(卷 1 )》学习笔记看了第1/2/3/4/5/6/8/ 这几个章节。
第一章是综述,第二章是一个具体的例子,学习笔记从第三章相关内容开始。
我个人觉得UVM重要的部分(特点的部分):1)factory 机制(override config_db )2)TLM传递3)phase 机制4)sequence-sequencer 以及virtual seq/sqr内容中的截图基本来自于UVM源代码、书自带的例子和《应用指南及源代码分析》这个PDF里的。
需要结合书(《UVM实战(卷1)》第1版)来看这个笔记。
第3章UVM基础uvm_component 和口uvm_object常用的类名字:这个图是从作者张强的《应用指南及源代码分析》里截得,不如书上里的图好。
uvm_sequencer也是代码里必须有的,所以我加了uvm_seque nceruvm_void是一个空的虚类。
在src/base/中定义:红框的是我们搭testbench的时候用的比较多的基类。
常用的uvm_object派生类:sequencer 给driver 的transaction 要派生自uvm_sequence_item,不要派生自uvm_transaction所有的sequenee 要派生自uvm_sequenee 或者uvm_sequenee 的派生类,可以理解为sequenee 是sequence_item 的组合(集合)。
driver 向sequencer 索要item,sequencer 检查是否有sequenee 要发送item,当发现有item待发送时,就把这个item发给driver.常用的uvm_component 派生类:所有的driver要派生自uvm_driver. driver用来把sequence_item中的信息驱动到DUT端口上,从transaction-level 向signal-level 的转换。
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_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实战指南范文
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配置对象来指定测试的配置选项,如时钟频率和寄存器的初始值。
UVM1.1应用指南及源代码分析_20111211版
而后半部分(第 10 到第 19 章)则介绍 UVM 背后的工作原理,用户群相对稀少。 通常来说,一般的用户只要看懂前半部分就可以了。但是我想,世上总有像我一样 有好奇心的人,不满足知其然再不知其所以然,会有人像我一样,会因为一个技术 问题而彻夜难眠,如果你是这样的人,那么恭喜,这本书的后半部分就是为你准备 的。
UVM1.1 应用指南及 源代码分析
UVM1.1 Application Guide and Source Code Analysis
张强 著
在这里,读懂 UVM
序
写这本书的难度超出了我的预料。从 8 月初开始写,一直到现在,4 个多月的 时间,从刚开始的满含激情,到现在的精疲力尽。现在写出来的东西,距离我心目 中的作品差距十万八千里,有太多的地方没有讲述清楚,有太多的地方需要仔细斟 酌,有太多的语句需要换一种表述方式。
8. register model的使用 ..............................................................................................125
8.1. register model简介...................................................................................125
写这本书,只是想把自己会的一点东西完全的落于纸上。在努力学习 UVM 的 过程中,自己花费了很多时间和精力。我只想把学习的心得记录下来,希望能够给 后来的人以启发。如果这本书能够给一个人带来一点点的帮助,那么我的努力就不 算是白费。
这本书的前半部分(第 1 到第 9 章)介绍了 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警告reading unwritten address -回复
uvm警告reading unwritten address -回复[UVM警告读取未被写入的地址]引言:在使用UVM(Universal Verification Methodology)进行硬件验证时,我们经常会遇到各种警告和错误。
其中,一个常见的警告是“UVM警告:读取未被写入的地址”。
这个警告意味着我们正在尝试读取一个在写入之前未被初始化的地址。
本文将一步一步回答关于这个警告的问题,并提供解决方案,以确保我们的硬件验证流程的正确性和性能。
第一步:了解UVM警告首先,我们需要了解为什么会出现这个警告。
当我们尝试读取一个未被写入的地址时,UVM会通过生成一个警告来提醒我们潜在的问题。
这是因为未初始化的数据可能会导致验证流程中的错误或不确定行为。
第二步:识别警告来源在遇到这个警告时,我们需要找出是哪个部分的代码导致了这个问题。
最常见的情况是在测试程序中,我们可能会在发送数据之前尝试读取数据。
因此,我们需要检查测试中的代码,并确认是否存在这样的错误。
第三步:检查初始化过程一旦我们找到了潜在的警告来源,我们需要确保在读取之前已经正确初始化了相应的地址。
这可以通过仔细检查初始化过程来完成。
在初始化过程中,我们应该确认所有的地址都被正确地写入了初始值。
第四步:验证环境中的数据我们还需要检查验证环境中的数据是否正确传输到了待验证的组件。
如果数据未能正确地传输到目标组件,则可能导致读取未被写入的地址。
因此,我们需要检查数据传输的路径,并确保数据在正确的时间和位置上被正确传输。
第五步:添加错误检查和处理机制为了避免读取未被写入的地址,我们可以在代码中添加错误检查和处理机制。
一种方法是在读取之前检查地址是否已经被初始化。
如果地址未被写入,我们可以选择向用户发出警告、报告错误或采取其他适当的行动。
第六步:进行综合和仿真验证一旦我们对代码进行了修改,并添加了错误处理机制,我们需要进行综合和仿真验证。
通过这些验证步骤,我们可以确保我们的修改不会导致其他错误,并且解决了读取未被写入地址的问题。
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初级开发指南本文完成于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知识点
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在VCS中的详细教程,但是对于初学者就是一道屏障,我探索了几天,下文将一步一步的举例子说明UVM+VCS+Verdi的liunx平台搭建过程(假设你已经安装好VCS和verdi)、和Questa-sim+UVM的window平台搭建。
UVM+VCS+Verdi基本平台:准备:UVM库,网上很多,我们只需要一个版本的库即可,这里我上传了。
这里以1-1a为例子说明。
第一步:把uvm-1.1a.tar.gz放在linux系统中,放入后在进行解压。
得到uvm-1.1a文件夹,该路径是库所在路径。
放在什么地方无所谓,你一定要知道在哪里。
同时在.bashrc文件里面配置环境变量。
如下图在.bashrc文件中填加这句话。
第二步:如下图,进入example目录,发现Makefile.vcs文件,该文件对于所有验证平台公用,里面主要是对UVM库进行编译,可以打开认真看看。
第三步:进入ubus/examples文件,该文件在《Systemverilog+UVM搭建SOC及ASIC的RTL验证环境.pdf》文档中有对该例子的讲解。
可以看到该文件夹下面有Makefile.vcs文件,该文件是针对本设计的makefile文件,会调用前一个Makefile.vcs。
第三步:输入命令:make –f Makefile.vcs。
如果出现如下图的结果,则平台正确。
Makefile.vcs讲解通过前面的例子证明我们的UVM平台已经可以使用,在example里面有很多例子,这两个文件夹里面的例子都进入文件夹内部执行make –f Makefile.vcs既可以运行,可以帮助我们学习。
其实我们在自己的实战过程中可以把上文中提到两个Makefile.vcs文件的内容复制到一个makfile文件中,该文件夹是张强UVM源码指南里面的例子,我把他在VCS 中实现,用Verdi打开波形,下面的两个文件是新的makefle文件。
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 引用路径-回复什么是UVM?UVM,全称为Universal Verification Methodology,是一种基于SystemVerilog语言的硬件验证方法学。
它提供了一整套的验证架构和工具,可以帮助设计工程师和验证工程师在设计验证过程中更加高效地工作。
UVM是像VMM和OVM这样的验证方法学的进化版本,它汲取了这些方法学的优点,并引入了一些新的概念和功能,以进一步提高验证的可重用性和灵活性。
UVM的引用路径在UVM中,引用路径是一种有效管理和组织源代码的方法。
它可以在验证环境的不同部分之间建立关联,以便能够正确地访问和使用这些代码。
引用路径是UVM的一个关键概念,它通过一些固定的目录结构和命名规则来定义,并且能够帮助团队成员更好地协同工作。
下面将一步一步回答什么是UVM的引用路径,以及它是如何工作的。
第一步:定义顶层目录结构在使用UVM的引用路径之前,需要定义顶层目录结构。
这个目录结构会作为整个验证环境的基础,所有的代码、配置文件和其他资源都会按照这个结构进行组织。
一个常见的UVM目录结构包括如下几个主要文件夹:- tb(testbench):存放与测试验证环境相关的代码,包括测试生成器、测试代理和一些可重用的验证组件。
- model:存放与设计模型相关的代码,一般由设计团队提供。
- sv(systemverilog):存放一些通用的SystemVerilog代码,比如一些全局变量、数据结构和一些通用的功能模块。
- reg(register):存放与寄存器模型相关的代码,用于配置和控制设计的寄存器。
这只是一个基本的目录结构示例,实际上可以根据具体项目的需求进行调整和扩展。
第二步:命名规则在UVM的引用路径中,命名规则至关重要。
它能够帮助团队成员更快地找到和理解代码,同时也确保整个验证环境的一致性和可维护性。
一个常见的命名规则包括以下几个方面:- 文件名:通常使用小写字母和下划线组合,以清晰地表示文件的用途。
《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中各种端 口的互连
UVM1.1应用指南及源代码分析_20111211版
6.2. 强大的config .............................................................................................94
6.3. 聚合config变量 .........................................................................................98
写这本书,只是想把自己会的一点东西完全的落于纸上。在努力学习 UVM 的 过程中,自己花费了很多时间和精力。我只想把学习的心得记录下来,希望能够给 后来的人以启发。如果这本书能够给一个人带来一点点的帮助,那么我的努力就不 算是白费。
这本书的前半部分(第 1 到第 9 章)介绍了 UVM 的使用,其用户群较为广泛;
8.2. 搭建一个简单的register model...............................................................129
8.3. 复杂的register model...............................................................................137
函数索引609xvi图目录图11uvm在数字电路设计中的位置3图12uvm对systemverilog的封装4图13简单验证平台5图14uvm验证平台的树形结构6图15实际验证平台7图16packbytes和unpackbytes14图17uvm验证平台中的agent181图21完整的uvm树35图22uvm中常用类的继承关系37图31uvm中的常用phase47图32uvm中所有的phase50图33两个driver位于同一domain57图34两个driver位于不同的domain58图41穿梭的transaction60图51defaultsequence的设置与启动77图52sequencer与driver之间的通信80图53virtualsequence的使用85图61半全局变量93图71monitor与scoreboard的通信104图72使用public成员变量实现通信105图73put操作106图74get操作106xvii图75transport操作107图76component在端口通信中的作用109图77connect关系的建立110图78port与imp的连接111图79portexport与imp的连接115图710使用fifo连接component122图81uvmregfield和uvmreg126图82使用registermodel读取寄存器的流程128图83uvmregfield
uvm mirror用法
uvm mirror用法UVM (Universal Verification Methodology)是一种用于验证集成电路设计的标准方法学,它提供了一组规范和约定,以帮助验证工程师开发和执行高效的验证环境。
UVM mirror是UVM标准的一部分,它提供了一种有效的方法,用于管理和维护设计和验证环境之间的数据和状态一致性。
本文将详细介绍UVM mirror的用法和工作原理,以及它在集成电路验证中的应用。
第一部分:UVM mirror简介和工作原理(500字)UVM mirror可以被看作是设计和验证环境之间的一个“镜像”,它允许验证工程师在设计和验证环境之间传递和维护数据的一致性。
其工作原理可以分为以下几个步骤:1. 数据传递:UVM mirror通过提供一组API,允许验证工程师在设计和验证环境之间传递数据。
验证工程师可以使用这些API来发送和接收数据,以确保设计和验证环境之间的数据一致性。
2. 状态同步:UVM mirror还提供了一种机制,用于同步设计和验证环境之间的状态。
通过将设计和验证环境的状态同步到UVM mirror,验证工程师可以在验证环境中准确地获取设计环境的状态,从而实现全局状态的一致性。
3. 事件通知:UVM mirror还支持事件通知机制,当设计环境的状态发生变化时,它可以向验证工程师发送通知。
这样,验证工程师可以实时监测设计环境的状态变化,并及时做出相应的调整。
第二部分:UVM mirror用法(800字)UVM mirror提供了一些关键的用法,使验证工程师能够在设计和验证环境之间进行有效的数据和状态同步。
下面将详细介绍几种常见的UVM mirror用法:1. 数据传递用法:验证工程师可以使用UVM mirror传递设计环境中的数据到验证环境中进行分析和验证。
通过使用UVM mirror提供的API,验证工程师可以轻松地将设计环境中的数据发送到验证环境中,从而实现设计和验证环境之间的数据传递。
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库。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(*)题外话: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使用面向对象的技术,比如继承、实现和接口分离的技术。
TLM的采纳依赖于标准的TLM建模技术的出现,就像RTL综合流程的采纳归功于标准RTL 编码风格的实现。
幸运的是,近些年来,几个重要的标准TLM应用程序接口(API)得到定义。
在EDA和ESL领域,两个最重要的标准是开放SystemC计划(OSCI)的TLM1.0以及TLM2.0标准。
OSCI TLM 1.0标准是一个简单通用的TLM API, 用来建模消息传递。
在消息传递时,对象(事务)在组件之间传递的方式和封包在网络之间传递的方式类似。
在发送封包的消息传递中,发送端和接收端之间没有共享的状态,他们之间的通讯讯息仅仅包含在消息中。
The OSCI TLM 2.0标准能够用来开发SystemC中的高速虚拟平台模型。
TLM2.0标准特别被用作片上存储映射的总线系统,包含许多能够进行片上总线互联的整合复用模块. OSCI TLM 1.0和TLM 2.0是互相独立的标准,满足不同的需要。
有人可能通过其命名方式认为TLM2.0优于TLM1.0,但是实际上并不是这样。
UVM提供的TLM 类和API是基于TLM1.0标准的。
这是因为TLM通用消息传递语法很好的满足了多种验证组件的事务级建模。
TLM1.0也适合多种语言之间的通信建模,比如SystemVerilog, SystemC以及e语言之间的建模。
UVM中TLM1.0接口甚至可以用来和SystemC中的TLM2.0模型进行通讯。
这一章节阐述了UVM中TLM的几个重要概念,让读者理解如何使用TLM来构造可复用的验证组件。
关于TLM各种类的更详细说明请参阅UVM参考手册。
4.6.1 UVM中TLM的关键概念4.6.1.1 对事务建模在UVM中, 从uvm_sequence_item继承而来的任何类都是事务。
用户根据需要定义事务类的字段和方法,用来在验证环境中不同组件之间进行信息交换。
例如,一个简单的包如下所示:1.class simple_packet extends uvm_sequence_item;2.rand int src_addr;3.rand int dst_addr;4.rand byte unsigned data[];5.constraint addr_constraint { src_addr != dst_addr; }6....7.endclass事务通常包含足够多的数据字段让驱动器(driver)或者事务产生器能够产生事务的真实信号级别的动作表示。
事务也可以包含更多的数据字段,来控制数据的随机产生,或者是验证环境中的其他目的。
可以通过继承方式来增加更多的数据成员,方法以及约束。
后续章节将会说明,如何通过继承事务,从而花费最小的代价来完成特定的验证任务。
4.6.1.2 TLM调用端口(Ports)和实现端口(Exports)UVM中的TLM使用一系列特殊的方法调用来进行模型之间的事务通讯。
在UVM中,一个port对象定义了一系列可以被调用的方法,而export对象提供了对这些方法的实现。
在构建验证环境的时候,port和export通过connect()函数进行连接,之后,调用port端的TLM方法将会执行export中对此TLM方法的实现。
实例4.7: 使用put方法将事务从生产者传递给消费者在UVM的TLM中,put接口能够被用来将transaction从生产者发送给消费者。
一个简单的生产者示例如下:class producer extends uvm_component;uvm_blocking_put_port #(simple_packet) put_port;function new(string name, uvm_component parent);put_port = new("put_port", this);endfunctionvirtual task run();simple_packet p = new();..put_port.put(p);endtaskendclass之前有提到,put port通过调用connect()函数连接到put export. 对上面的put方法的实现将由消费者组件来完成,如下:class consumer extends uvm_component;uvm_blocking_put_imp #(simple_packet, consumer) put_export;task put(simple_packet p);// consume the packetendtaskendclass将port连接到export之后,调用生产者的put方法将会触发消费者的put方法实现得到执行,从而使得simple_packet对象从生产者传递到了消费者。
TLM也引入了标准的图形化示意来描述不同类型的通讯。
put通讯流程的模块图如下:图4-2:简单的生产者/消费者的put通讯TLM接口定义了一些生产者和消费者都必须遵循的简单规则,在这个示例中,对于put接口,规则如下:∙put方法的实现在执行时有可能阻塞,因此对put方法调用的对象必须负责确保在put方法阻塞的时候能够正常工作。
∙生产者负责创建封包,而消费者不能修改封包(如果需要修改,必须先拷贝一份新的)满足了上述规则,能够很容易的将生产者或者消费者替换成其他的模型,只要这些模型满足相同的TLM接口即可。
TLM API提供了一个简单的能够互相操作的接口协议,类似硬件世界中的USB,以太网标准一样。
由于能够容易的替换模型,UVM的TLM在满足模型复用和验证目标上发挥了关键性的作用,我们可以在后续章节进一步了解。
上述示例,在生产者中存在单独一个进程,当调用put方法时,控制流转到消费者中的put 方法中。
put方法将事务沿着方法调用控制流相同的方向进行传送。
在某些情况,由于消费者中包含一个需要事务数据的进程,希望将事务沿着TLM方法调用控制流相反的方向传送。
在这种情形下,生产者/消费者将使用get接口来实现,示例如下:1.class producer_2 extends uvm_component;2.uvm_blocking_get_imp #(simple_packet, producer_2)get_export;3.task get(output simple_packet p);4.simple_packet p_temp = new();5. ...6.p = p_temp;7.endtask8.endclass9.class consumer_2 extends uvm_component;10.uvm_blocking_get_port #(simple_packet) get_port;11.function new(string name, uvm_component parent);12.get_port = new("get_port", this);13.endfunction14.virtual task run();15.simple_packet p;16. ...17.get_port.get(p);18.endtask19.e ndclass在上面的put接口示例中,UVM对使用put接口的生产者和消费者设定了如下规则:∙get方法实现可能被阻塞。
因此调用方必须确保当此方法阻塞的时候也能够正确工作。
∙get方法的实现必须创建并返回一个事务对象给get的调用方。
get接口通讯的图形化示意如下:图4-3:消费者调用生产者中的get方法4.6.1.3 连接port和export上面例子中,port对export的连接是通过调用connect方法完成的。
用户需要在消费者/生产者的父组件中的connect回调函数[仿真阶段函数connect())中调用此connect方法:class parent_comp extends uvm_component;producer producer_inst;consumer consumer_inst;...virtual function void connect();producer_inst.put_port.connect(consumer_inst.put_export);endfunctionendclass连接port和export的通用准则是:子组件中port的connect方法以子组件export作为参数进行调用.4.6.1.4 port和port的连接以及export和export的连接Verilog RTL中,模块的端口(port)代表信号级别的界面。