UVM实战卷I 学习笔记
文章平均质量分 89
UVM实战卷I 学习笔记
菜鸡想要飞
平平无奇小硅农
展开
-
UVM实战 卷I学习笔记1——简单的UVM验证平台:只有driver
目录验证平台的组成最简单的验证平台——只有driverUVM如何搭建driver:加入factory机制加入objection机制加入virtual interface个人《UVM实战卷I》学习随手笔记,此书作者:张强验证平台的组成一个验证平台要实现的基本功能:模拟DUT的各种真实使用情况——给DUT施加各种激励→driver实现激励功能;根据DUT的输出判断DUT行为是否与预期符合→scoreboard(也称为checker)——需注意判断的东西和判断的标准是什么;收集DUT的输出并传递原创 2021-09-23 21:42:09 · 2789 阅读 · 0 评论 -
UVM实战 卷I学习笔记2——为验证平台加入各个组件(1)
开始引入reference model、monitor、scoreboard等验证平台的组件,在这些组件之间信息的传递是基于transaction的。1、加入transactiontransaction是抽象的概念。物理协议中的数据交换都是以帧或包为单位的,在一帧或一个包中要定义好各项参数,每个包的大小不一样。很少会有协议是以bit或byte为单位进行数据交换。以以太网为例,每个包的大小至少是64byte。这个包中要包括源地址、目的地址、包的类型、整个包的CRC校验数据等。transaction就原创 2021-09-24 15:58:38 · 939 阅读 · 0 评论 -
UVM实战 卷I学习笔记2——为验证平台加入各个组件(2)
话接上文UVM实战 卷I学习笔记2——为验证平台加入各个组件(1)5、加入reference modelreference model用于完成和DUT相同的功能,其输出被scoreboard接收,用于和DUT的输出相比较。DUT如果很复杂,那么reference model也会相当复杂。本章的DUT很简单, 所以reference model也简单:class my_model extends uvm_component; uvm_blocking_get_port #(my_transaction原创 2021-09-26 12:57:00 · 1262 阅读 · 1 评论 -
UVM实战 卷I学习笔记3——UVM的终极大作:sequence
掌握UVM的sequence的所有内容,也就掌握了UVM最重要的内容之一,也是验证攻城狮的必备秘籍之一。1、加入sequencersequence机制用于产生激励,前面例子中的激励都是在driver中产生,但在规范化的UVM验证平台中,driver应只负责驱动transaction而不负责产生transaction(单一职责原则)equence机制有两大组成部分:sequence和sequencer。一个sequencer的定义如下:sequencer的定义非常简单,派生自uvm_sequencer原创 2021-09-26 22:41:12 · 1198 阅读 · 0 评论 -
UVM实战 卷I学习笔记4——创建测试用例
创建测试用例1、加入base_testUVM使用的是一种树形结构,书中最初这棵树的树根是my_driver,后来由于要放置其他component,树根变成了my_env。但在实际应用的UVM验证平台中my_env并不是树根,通常树根是一个基于uvm_test派生的类。先讲述base_test,真正的测试用例都是基于base_test派生的一个类:...原创 2021-09-27 21:03:58 · 2673 阅读 · 0 评论 -
UVM实战 卷I学习笔记5——UVM基础(1)uvm_component与uvm_object
uvm_component与uvm_objectuvm_component派生自uvm_objectuvm_object是UVM中最基本的类,几乎所有类都继承自uvm_object,包括uvm_component。说明它拥有uvm_object的特性,同时又有自己的一些特质。但是uvm_component的一些特性,uvm_object则不一定具有。这是面向对象编程中常用到的一条规律。uvm_component有两大特性是uvm_object所没有的:一是通过在new时指定parent参数来形成一种原创 2021-10-08 21:54:28 · 3589 阅读 · 0 评论 -
UVM实战 卷I学习笔记5——UVM基础(2)UVM的树形结构
UVM采用树形结构管理验证平台的各个部分。sequencer、driver、monitor、agent、model、scoreboard、env等都是树的一个结点。用树的形式来组织是因为作为一个验证平台,它必须能够掌握自己治下的所有“人口”,只有这样做才利于管理大家统一步伐做事情而不会漏掉谁。树形结构是实现这种管理的一种比较简单的方式。uvm_component中的parent参数UVM通过uvm_component实现树形结构。所有UVM树的结点本质上都是一个uvm_component。每个uvm_c原创 2021-10-09 16:32:24 · 2234 阅读 · 0 评论 -
UVM实战 卷I学习笔记5——UVM基础(3)field automation机制
field automation机制相关的宏最简单的uvm_field系列宏有如下几种:`define uvm_field_int(ARG,FLAG)`define uvm_field_real(ARG,FLAG)`define uvm_field_enum(T,ARG,FLAG)`define uvm_field_object(ARG,FLAG)`define uvm_field_event(ARG,FLAG)`define uvm_field_string(ARG,FLAG)上述几个宏原创 2021-10-09 19:34:51 · 3504 阅读 · 1 评论 -
UVM实战 卷I学习笔记5——UVM基础(4)UVM中打印信息的控制
设置打印信息的冗余度阈值UVM通过冗余度级别的设置提高了仿真日志的可读性。 在打印信息之前, UVM会比较要显示信息的冗余度级别与默认的冗余度阈值, 如果小于等于阈值, 就会显示, 否则不会显示。 默认的冗余度阈值是UVM_MEDIUM, 所有低于等于UVM_MEDIUM( 如UVM_LOW) 的信息都会被打印出来。可以通过get_report_verbosity_level函数得到某个component的冗余度阈值:...原创 2021-10-10 23:32:18 · 6219 阅读 · 2 评论 -
UVM实战 卷I学习笔记6——config_db机制
目录一、pandas是什么?二、使用步骤1.引入库2.读入数据总结一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码如下(示例):import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport warningswarnings.filterwarnings('ignor原创 2021-10-11 13:19:43 · 1956 阅读 · 0 评论 -
UVM实战 卷I学习笔记7——UVM中的TLM通信(1)
目录验证平台内部的通信TLM的定义UVM中的PORT与EXPORTUVM中各种端口的互连PORT与EXPORT的连接*UVM中的IMP验证平台内部的通信如果要在两个uvm_component之间通信,如一个monitor向一个scoreboard传递一个数据(如图所示):最简单的方法就是使用全局变量,在monitor里对此全局变量进行赋值,在scoreboard里监测此全局变量值的改变。这种方法简单、直接,不过要避免使用全局变量,滥用全局变量只会造成灾难性的后果。稍微复杂的方法:在scoreb原创 2021-10-12 14:48:37 · 1934 阅读 · 0 评论 -
UVM实战 卷I学习笔记7——UVM中的TLM通信(2)
目录*blocking_get端口的使用*blocking_transport端口的使用nonblocking端口的使用UVM中的通信方式UVM中的analysis端口*blocking_get端口的使用get系列端口与put系列端口在某些方面完全相反。若要实现从A到B的通信,使用blocking_get系列端口的框图如下图所示:在这种连接关系中数据流依然是从A到B,但A由动作发起者变成了动作接收者,而B由动作接收者变成了动作发起者。B_port的类型为uvm_blocking_get_port原创 2021-10-15 13:37:55 · 1666 阅读 · 1 评论 -
UVM实战 卷I学习笔记7——UVM中的TLM通信(3)
目录UVM中的通信方式*使用FIFO通信FIFO上的端口及调试用FIFO还是用IMPUVM中的通信方式*使用FIFO通信上节实现monitor和scoreboard之间的通信时先声明了两个后缀,然后再写相应的函数,这种方法看起来有些麻烦且有些难理解,那有没有简单的方法呢?另外两者的通信是monitor占据主动地位,而scoreboard只能被动地接收,那有没有方法也让scoreboard实现主动的接收呢?答案是肯定的,那就是利用FIFO来实现monitor和scoreboard的通信。如图b,在原创 2021-10-15 13:38:11 · 1951 阅读 · 0 评论 -
UVM实战 卷I学习笔记8——UVM验证平台的运行(1)
目录phase机制task phase与function phase动态运行phasephase的执行顺序phase机制task phase与function phaseUVM中的phase按照其是否消耗仿真时间($time打印出的时间)的特性,可以分成一类是function phase(如build_phase、connect_phase等),这些phase都不耗费仿真时间,通过函数来实现; 另一类是task phase(如run_phase等),它们耗费仿真时间,通过任务来实现。 给DUT施加原创 2021-10-18 11:32:34 · 1192 阅读 · 0 评论 -
UVM实战 卷I学习笔记8——UVM验证平台的运行(2)
*build阶段出现UVM_ERROR停止仿真之前的代码中,如果使用config_db::get无法得到virtual interface,就会直接调用uvm_fatal结束仿真。由于virtual interface对于一个driver来说是必须的,所以这种uvm_fatal直接退出的使用方式是非常常见的。但如果这里使用uvm_error,也会退出:virtual function void build_phase(uvm_phase phase); super.build_phase(phase原创 2021-10-18 13:11:48 · 3569 阅读 · 0 评论 -
UVM实战 卷I学习笔记8——UVM验证平台的运行(3)
objection机制*objection与task phaseobjection字面的意思就是反对、异议。在验证平台中,可通过drop_objection来通知系统可以关闭验证平台。当然,在撤销之前首先要raise_objection:task main_phase(uvm_phase phase); phase.raise_objection(this); … phase.drop_objection(this);endtask在进入到某一phase时,UVM会收集此phase提出的所原创 2021-10-19 19:50:45 · 2250 阅读 · 4 评论 -
UVM实战 卷I学习笔记9——UVM中的sequence(1)
目录原创 2021-10-21 17:00:58 · 1443 阅读 · 0 评论 -
UVM实战 卷I学习笔记9——UVM中的sequence(2)
目录*sequencer的lock操作*sequencer的grab操作sequence的有效性*sequencer的lock操作当多个sequence在一个sequencer上同时启动时,每个sequence产生的transaction都需要参与sequencer的仲裁。考虑这样一种情况,某个sequence一旦要执行,那么它所有transaction必须连续地交给driver,如果中间夹杂着其他sequence的transaction就会发生错误。要解决这个问题,可以像上节一样对此sequenc原创 2021-10-25 13:18:23 · 648 阅读 · 0 评论 -
UVM实战 卷I学习笔记9——UVM中的sequence(3)
目录sequence相关宏及其实现uvm_do系列宏*uvm_create与uvm_send*uvm_rand_send系列宏*start_item与finish_item*pre_do、 mid_do与post_dosequence相关宏及其实现uvm_do系列宏uvm_do系列宏主要有以下8个:`uvm_do(SEQ_OR_ITEM)`uvm_do_pri(SEQ_OR_ITEM, PRIORITY)`uvm_do_with(SEQ_OR_ITEM, CONSTRAINTS)`uvm_原创 2021-10-25 23:22:45 · 3540 阅读 · 0 评论 -
UVM实战 卷I学习笔记9——UVM中的sequence(4)
目录sequence进阶应用嵌套的sequencesequence进阶应用嵌套的sequence假设一个产生CRC错误包的sequence如下:class crc_seq extends uvm_sequence#(my_transaction); … virtual task body(); my_transaction tr; `uvm_do_with(tr, {tr.crc_err == 1; tr.dmac == 48'h980F;}) endtaskendcl原创 2021-11-03 23:11:18 · 972 阅读 · 0 评论 -
UVM实战 卷I学习笔记9——UVM中的sequence(5)
目录virtual sequence的使用*带双路输入输出端口的DUT*sequence之间的简单同步*sequence之间的复杂同步virtual sequence的使用*带双路输入输出端口的DUT下面新的DUT相当于在前面DUT的基础上增加了一组数据口,这组新的数据口与原先的数据口功能完全一样。新的数据端口增加后,由于这组新的数据端口与原先的一模一样,所以可以在test中再额外实例化一个my_env:class base_test extends uvm_test; my_env env0原创 2021-11-03 23:35:58 · 853 阅读 · 0 评论 -
UVM实战 卷I学习笔记9——UVM中的sequence(6)
目录仅在virtual sequence中控制objection仅在virtual sequence中控制objection原创 2021-11-16 10:54:10 · 2367 阅读 · 0 评论 -
UVM实战 卷I学习笔记9——UVM中的sequence(7)
目录sequence library随机选择sequence控制选择算法控制执行次数使用sequence_library_cfgsequence library随机选择sequence所谓sequence library,就是一系列sequence的集合。sequence_library类的原型为:class uvm_sequence_library #(type REQ=uvm_sequence_item,RSP=REQ) extends uvm_sequence #(REQ,RSP);原创 2021-11-16 15:16:31 · 677 阅读 · 0 评论 -
UVM实战 卷I学习笔记10——UVM中的寄存器模型(1)
目录寄存器模型简介*带寄存器配置总线的DUT需要寄存器模型才能做的事情寄存器模型简介*带寄存器配置总线的DUT在以前所有例子中,使用的DUT几乎都是基于2.2.1节中所示的最简单的DUT,只有一组数据输入输出口,而没有行为控制口,这样的DUT几乎是没有任何价值的。通常来说DUT中会有一组控制端口,通过控制端口,可以配置DUT中的寄存器,DUT可以根据寄存器的值来改变其行为。这组控制端口就是寄存器配置总线。这样的DUT的一个示例如附录B的代码清单B-2所示。在这个DUT中,只有一个1bit的寄存器原创 2021-11-17 09:42:22 · 1303 阅读 · 1 评论 -
UVM实战 卷I学习笔记10——UVM中的寄存器模型(2)
目录简单的寄存器模型只有一个寄存器的寄存器模型简单的寄存器模型只有一个寄存器的寄存器模型本节为7.1.1节所示的DUT建立寄存器模型。 这个DUT非常简单, 它只有一个寄存器invert。 要为其建造寄存器模型, 首先要从uvm_reg派生一个invert类:class reg_invert extends uvm_reg; rand uvm_reg_field reg_data; virtual function void build(); reg_data = uvm_reg_fie原创 2021-11-18 11:18:34 · 1434 阅读 · 2 评论 -
UVM实战 卷I学习笔记10——UVM中的寄存器模型(3)
目录原创 2021-11-22 17:01:18 · 2465 阅读 · 0 评论 -
UVM实战 卷I学习笔记10——UVM中的寄存器模型(4)
目录复杂的寄存器模型*层次化的寄存器模型*reg_file的作用*多个域的寄存器*多个地址的寄存器*加入存储器复杂的寄存器模型*层次化的寄存器模型前面寄存器模型是一个最小、最简单的寄存器模型。在整个实现过程中,只是将一个寄存器加入了uvm_reg_block中,并在最后的base_test中实例化此reg_block。这个例子之所以这么做是因为只有一个寄存器。在现实应用中一般会将uvm_reg_block再加入一个uvm_reg_block中,然后在base_test中实例化后者。从逻辑关系上看,原创 2021-11-25 16:30:12 · 1693 阅读 · 0 评论 -
UVM实战 卷I学习笔记10——UVM中的寄存器模型(5)
目录寄存器模型对DUT的模拟期望值与镜像值常用操作及其对期望值和镜像值的影响寄存器模型中一些内建的sequence*检查后门访问中hdl路径的sequence*检查默认值的sequence*检查读写功能的sequence寄存器模型对DUT的模拟期望值与镜像值由于DUT中寄存器的值可能是实时变更的,寄存器模型并不能实时地知道这种变更,因此,寄存器模型中的寄存器的值有时与DUT中相关寄存器的值并不一致。对于任意一个寄存器,寄存器模型中都会有一个专门的变量用于最大可能地与DUT保持同步,这个变量在寄存器原创 2021-11-25 17:20:41 · 2048 阅读 · 0 评论 -
UVM实战 卷I学习笔记10——UVM中的寄存器模型(6)
目录寄存器模型的高级用法*使用reg_predictor*使用UVM_PREDICT_DIRECT功能与mirror操作*寄存器模型的随机化与update扩展位宽寄存器模型的高级用法*使用reg_predictor在7.2.2节讲述读操作的返回值时介绍了图7-9中的左图的方式,这种方式要依赖于driver。当driver将读取值返回后,寄存器模型会更新寄存器的镜像值和期望值。这个功能被称为寄存器模型的auto predict功能。在建立寄存器模型时使用如下语句打开此功能:rm.default_ma原创 2021-11-29 11:19:20 · 1709 阅读 · 0 评论 -
UVM实战 卷I学习笔记11——UVM中的factory机制(1)
目录SystemVerilog对重载的支持*任务与函数的重载*约束的重载使用factory机制进行重载*factory机制式的重载*重载的方式及种类SystemVerilog对重载的支持*任务与函数的重载SV是一种面向对象的语言。面向对象语言都有一大特征:重载(我更习惯称之为“覆盖”,这里依作者命名为主)。在父类中定义一个函数/任务时,如果将其设置为virtual类型,那么就可以在子类中重载这个函数/任务:class bird extends uvm_object; virtual funct原创 2022-01-10 13:39:24 · 1402 阅读 · 0 评论 -
UVM实战 卷I学习笔记11——UVM中的factory机制(2)
目录*复杂的重载*factory机制的调试常用的重载*重载transaction*重载sequence*重载component重载driver以实现所有的测试用例*复杂的重载前面的例子讲述了简单的重载功能,即只使用一种类型重载另外一种类型。事实上UVM支持连续的重载。依然以bird与parrot的例子讲述,现在从parrot又派生出了一个新的类big_parrot:class big_parrot extends parrot; virtual function void hungry();原创 2022-01-10 22:59:01 · 839 阅读 · 0 评论 -
UVM实战 卷I学习笔记11——UVM中的factory机制(3)
目录factory机制的实现创建一个类的实例的方法*根据字符串来创建一个类用factory机制创建实例的接口factory机制的本质factory机制的实现创建一个类的实例的方法前面UVM根据run_test的参数my_driver创建一个my_driver的实例,这是factory机制的一大功能。一般的面向对象的编程语言要创建一个类的实例有两种方法,一种是在类的可见的作用范围之内直接创建:class A … endclassclass B; A a; function new();原创 2022-01-11 12:37:35 · 1052 阅读 · 2 评论 -
UVM实战 卷I学习笔记12——UVM中代码的可重用性(1)
目录callback机制广义的callback函数callback机制的必要性UVM中callback机制的原理*callback机制的使用*子类继承父类的callback机制使用callback函数/任务来实现所有的测试用例callback机制、 sequence机制和factory机制callback机制在UVM验证平台中,callback机制的最大用处就是提高验证平台的可重用性。很多情况下验证人员期望在一个项目中开发的验证平台能够用于另外一个项目。但通常来说完全的重用是比较难实现的,两个项目之原创 2022-01-11 14:19:18 · 1438 阅读 · 0 评论 -
UVM实战 卷I学习笔记12——UVM中代码的可重用性(2)
目录功能的模块化: 小而美Linux的设计哲学: 小而美小而美与factory机制的重载放弃建造强大sequence的想法参数化的类参数化类的必要性UVM对参数化类的支持模块级到芯片级的代码重用基于env的重用寄存器模型的重用virtual sequence与virtual sequencer功能的模块化: 小而美Linux的设计哲学: 小而美广大IC开发者中,使用Linux的用户占据了绝大部分,尤其对于验证人员来说更是如此。Linux+如此受欢迎的部分原因之一是它提供了众多的小工具,如ls命令、原创 2022-01-11 19:11:19 · 844 阅读 · 1 评论 -
UVM实战 卷I学习笔记12——UVM中代码的可重用性(3)
目录模块级到芯片级的代码重用基于env的重用寄存器模型的重用virtual sequence与virtual sequencer模块级到芯片级的代码重用基于env的重用现代芯片的验证通常分为两个层次:模块级别(block level,也称IP级别、unit级别)验证和芯片级别(也称SOC级别)验证。一个大的芯片在开发时是分成多个小模块来开发的。每个模块开发一套独立的验证环境,通常每个模块有专门的验证人员负责。当在模块级别验证完成后需要做整个系统的验证。为简单起见,假设某芯片分成了三个模块,如图所原创 2022-01-11 20:42:44 · 1142 阅读 · 1 评论 -
UVM实战 卷I学习笔记13——UVM高级应用(1)
目录interfaceinterface实现driver的部分功能可变时钟interfaceinterface实现driver的部分功能在之前所有的例子中,interface的定义都非常简单,只是单纯地定义几个logic类型变量而已interface my_if(input clk, input rst_n); logic [7:0] data; logic valid;endinterface但实际上interface能做的事情远不止如此。在interface中可以定义任务与函数。除原创 2022-01-11 22:22:19 · 1342 阅读 · 0 评论 -
UVM实战 卷I学习笔记13——UVM高级应用(2)
目录layer sequence*复杂sequence的简单化layer sequence的示例layer sequence与try_next_item*错峰技术的使用layer sequence*复杂sequence的简单化在网络传输中,以太网包是最底层的包,其上还有IP包、UDP包、TCP包等。现在只考虑IP包与mac包。my_transaction(mac包)在前文中已经定义过了,下面给出IP包的定义:class ip_transaction extends uvm_sequence_it原创 2022-01-12 14:59:02 · 2933 阅读 · 0 评论 -
UVM实战 卷I学习笔记13——UVM高级应用(3)
目录sequence的其他问题*心跳功能的实现只将virtual_sequence设置为default_sequencedisable fork语句对原子操作的影响DUT参数的随机化使用寄存器模型随机化参数*使用单独的参数类sequence的其他问题*心跳功能的实现某些协议需要driver每隔一段时间向DUT发送一些类似心跳的信号。这些心跳信号的包与其他普通的包并没有本质区别,其使用的transaction也都是普通的transaction。发送这种心跳包有两种选择,一种是在driver中实现,原创 2022-01-12 16:30:43 · 963 阅读 · 0 评论 -
UVM实战 卷I学习笔记13——UVM高级应用(4)
目录聚合参数聚合参数的定义聚合参数的优势与问题config_db换一个phase使用config_db*config_db的替代者*set函数的第二个参数的检查聚合参数聚合参数的定义验证平台用到的参数有两大类,一类是验证环境与DUT中都要用到的参数,这些参数通常都对应DUT中的寄存器,前面已经将这些参数组织成一个参数类;另一类是验证环境独有的,比如driver中要发送的preamble数量的上限和下限。本节讲述如何组织这类参数。大项目要配置的参数可能有千百个。如果全部使用config_db写法,原创 2022-01-13 16:40:35 · 1004 阅读 · 0 评论 -
UVM实战 卷I学习笔记14——OVM到UVM的迁移
目录对等的迁移一些过时的用法*sequence与sequencer的factory机制实现sequence的启动与uvm_test_done*手动调用build_phase纯净的UVM环境对等的迁移UVM从OVM衍生而来,因此UVM几乎完全继承OVM所有特性。从OVM到UVM的迁移,很大程度上只是ovm前缀到uvm前缀的变更。所有ovm_xxx宏都可以变更到uvm_xxx宏。ovm_component变更为uvm_component,ovm_object变更为uvm_object。关于前缀的变更,U原创 2022-01-13 17:13:45 · 1332 阅读 · 0 评论