没有合适的资源?快使用搜索试试~ 我知道了~
SystemVerilog验证方法及其UVM应用详解
试读
16页
需积分: 0 0 下载量 123 浏览量
更新于2024-12-08
收藏 615KB PDF 举报
内容概要:本文详细介绍了SystemVerilog (SV) 语法的基础知识和高级特性,涵盖了数组、结构体、多线程、同步调度、接口和时钟块、类基础、虚方法等。此外,还深入探讨了UVM验证方法学,包括其结构、组件关系、通信方式、phase机制、factory机制、callback机制等内容,以及在验证环境中的具体应用方法和技术。
适合人群:从事数字芯片验证的工程师,具备一定SV基础知识的读者。
使用场景及目标:适用于搭建高效、可重用的验证平台,提升验证效率和覆盖率。主要内容包括SV语法的应用、UVM框架的搭建、各组件的协同工作和配置管理技巧。
其他说明:文章结合了大量的实例和代码片段,有助于读者更好地理解和掌握相关内容。
1. SV 语法考察
1) 定宽数组、动态数组、关联数组、队列各自特点和使用
队列:队列结合了链表和数组的有点,可以在一个队列的任何位置进行增加
或者删除元素。其通过[$]这样的符号进行申明:int q[$];
定宽数组:属于静态数组,编译时便已经确定大小。其可以分为压缩定宽数
组和非压缩定宽数组:压缩数组是定义在类型后面,名字前面;非压缩数组定义
在名字后面。Bit [7:0] [3:0] name; bit[7:0] name [3:0];
动态数组:其内存空间在运行时才能够确定,使用前需要用 new[]进行空间
分配。
关联数组:其主要针对需要超大空间但又不是全部需要所有数据的时候使用,
类似于 hash,通过一个索引值和一个数据组成:bit [63:0] name[bit[63:0]];索引值
必须是惟一的。
2) 结构体的使用
结构体 struct,其相比于其他数据结构,主要的特点就是可以由不同类型的数
据类型变量组成,然后可以对这个结构体进行操作。Struct {bit [2:0] a,int c}name;
联合体 union 缺是对同一个内存变量可以有不同类型,比如一个寄存器有时
候为整数,有时为小数。
3) 多线程 fork join、fork join_any、fork join_none 的用法差异
Fork join:内部 begin end 块并行运行,直到所有线程运行完毕才会进入下一
个阶段。
Fork join_any:内部 begin end 块并行运行,任意一个 begin end 块运行结束
就可以进入下一个阶段。
Fork join_none:内部 begin end 块并行运行,无需等待可以直接进入下一个
阶段。
4) 多线程的同步调度方法
多线程之间同步主要由 mailbox、event、semaphore 三种进行一个通信交互。
mailbox 邮箱:主要用于两个线程之间的数据通信,通过 put 函数和 get 函数还有
peek 函数进行数据的发送和获取。
0514
0516
0516
Event:事件主要用于两个线程之间的一个同步运行,通过事件触发和事件等
待进行两个线程间的运行同步。使用@(event)或者 wait(event.trigger)进行等待,
->进行触发。
Semaphore:旗语主要是用于对资源访问的一个交互,通过 key 的获取和返回
实现一个线程对资源的一个访问。使用 put 和 get 函数获取返回 key。一次可以
多个。
5) @signal 触发和 wait(signal)的区别
@(signal)是对 signal 的边缘进行触发,因此如果此时此刻可,进程还未运行
到@signal 就已经触发,那么会被遗漏。
Wait(signal)是等待 signal 的高电平触发的,因此,出现上述的情况,也不会
遗漏。
6) 简述在 TB 中使用 interface 和 clocking block 的好处
Interface 是一组接口,用于对信号进行一个封装,捆扎起来。如果像 verilog
中对各个信号进行连接,每一层我们都需要对接口信号进行定义,若信号过多,
很容易出现人为错误,而且后期的可重用性不高。因此使用 interface 接口进行连
接,不仅可以简化代码,而且提高可重用性,除此之外,iinterface 内部提供了其
他一些功能,用于测试平台与 DUT 之间的同步和避免竞争。
Clocking block:在 interface 内部我们可以定义 clocking 块,可以使得信号保
持同步,,对于接口的采样和驱动有详细的设置操作,从而避免 TB 与 DUT 的接
口竞争,减少我们由于信号竞争导致的错误。采样提前,驱动落后,保证信号不
会出现竞争。
7) 对 C++基础的理解(类的封装、继承、多态)
类主要有三个特性:封装、继承、多态。
封装:通过将一些数据和使用这些数据的方法封装在一个集合里,成为一个
类。
继承:允许通过现有类去得到一个新的类,且其可以共享现有类的属性和方
法。现有类叫做基类,新类叫做派生类或扩展类 。
多态:得到扩展类后,有时我们会使用基类句柄去调用扩展类对象,这时候
调用的方法如何准确去判断是想要调用的方法呢?通过对类中方法进行 virtual
0516
申明,这样当调用基类句柄指向扩展类时,方法会根据对象去识别,调用扩展类
的方法,而不是基类中的。而基类和扩展类中方法有着同样的名字,但能够准确
调用,叫做多态。
8) SV 中什么需求下必须使用 virtual methods
当我们要通过对象进行识别使用何种方法时,我们需要将方法定义成 virtual,
这样才可以准确的根据句柄指向的对象进行调用,而不是直接调用基类方法。一
般情况下,我们会除了 new 函数以外,其他方法都设置为 virtual,以防出现问题。
9) $cast()强制向下转换和直接转换
类被申明创建对象后,就会在内存空间中有一块物理意义上的存储空间,
new()函数后会返回该对象的句柄。句柄可以指向基类或者扩展类的对象,当将
基类对象句柄赋给扩展类对象句柄时(将扩展类句柄指向基类对象时会出错),
必须使用$cast()进行强制转换;当将扩展类句柄赋值给基类句柄时(将基类句柄
指向扩展类对象时),可以直接赋值转换。
10) 带约束的随机类的语法和使用(权重约束和条件约束、范围约束)
随机化是 SV 中极其重要的一个知识点,通过设定随机化和相关约束,我们
可以自动参数随机的想要的数据。
权重约束 dist:有两种操作符::=n :/n 第一种表示每一个取值权重都是
n,第二种表示每一个取值权重为 num/n。
条件约束 if else 和->(case): if else 就是和正常使用一样;->通过前面条
件满足后可以触发后面事件的发生。
范围约束 inside:inside{[min:max]};范围操作符,也可以直接使用大于小于
符号进行,不可以连续使用,如 min<wxm<max 这是错误的。
11) 以下代码中,x 取值的概率 x dist {0:=1,[1:3]:=1};
X 取 0/1/2/3 的值分别是 1/4。
12) 验证环境中 C 如何 access 和 dut 中寄存器,是如何联系的,以及 DPI 接口
使用方法
Sv 中可以使用 DPI 接口来与 C 进行一个连接调用,通过 DPI 接口,我们可
以实现 C 与 dut 的一个交互。
DPI 使用方法:首先,我们的 C 程序最好是不耗时的。通过调用 DPI 接口,
使用 import “DPI-C”function int factorial(input int i);通过 inport 关键字就可以
申明 function 使用了其他语言实现,C。注意的是 input 指的是数据从 SV 流向 C,
且参数不能定义为 ref 类型。除此之外,保证调用的参数是 SV 和 C 都兼容的。
DPI 只能调用 C 中静态的方法,因此不可以调用对象中的方法,解决办法是创建
和 C 中对象方法进行通信的静态方法。通过创建一个对象并返回其句柄 ,然后
在一个静态方法里面使用对象句柄来调用 C++对象中的方法。
2. UVM 的理解考察
1) 请谈一下你对 UVM 验证方法学的理解
刚开始接触的时候,我认为 UVM 其实就是 SV 的一个封装,将我们在搭建
测试平台过程中的一些重复性和重要的工作进行封装,从而使我们能够快速的搭
建一个需要的测试平台,并且可重用性还高。因此我当时觉得它就是一个库。
不过,随着学习的不断深入,当我深入理解 UVM 中各种机制和模型的构造
和相互之间关系之后,我觉得其实 UVM 方法学对于使用何种语言其实并不重要,
重要的是他的思想,比如:在 UVM 中有 sequence 机制,以往如果我们使用 SV
进行 TB 搭建时,我们一般会采用 driver 一个类进行数据的参数,转换,发送,
或者使用 genetor 和 driver 两个进行,这种方式可重用性很低,而且代码臃肿;
但是在 UVM 中我们通过将 sequence、sequencer、driver、sequence_item 拆开,
相互独立而又有联系,因此我们只需关注每一个类需要做的工作就可以,可重用
性高。我在学习 sequence 时,我经常把 sequence 比作蓄水池,sequence_item 就
是水,sequencer 就是一个调度站,driver 就是总工厂,通过这种方式进行处理,
我们的总工厂不需要管其他,只需处理运送过来的水资源就可以,而 sequencer
只需要调度水资源,sequence 只需要产生不同的水资源。而这种处理方式和现实
世界中的生产模式又是基本吻合的。除此之外,还有好多好多,其实 UVM 方法
学中很多思想就是来源于经验,来源于现实生活,而不在乎是何种语言。
2) 请谈一下 UVM 的验证环境结构,各个组件间的关系
画出 UVM 的验证环境结构,如图所示。
剩余15页未读,继续阅读
资源推荐
资源评论
181 浏览量
2016-05-28 上传
126 浏览量
5星 · 资源好评率100%
2019-07-20 上传
5星 · 资源好评率100%
5星 · 资源好评率100%
177 浏览量
2009-11-13 上传
194 浏览量
102 浏览量
172 浏览量
180 浏览量
2022-09-24 上传
5星 · 资源好评率100%
115 浏览量
147 浏览量
2023-08-07 上传
196 浏览量
154 浏览量
169 浏览量
2022-09-24 上传
134 浏览量
2021-05-17 上传
2019-12-16 上传
115 浏览量
2017-03-09 上传
2019-09-07 上传
5星 · 资源好评率100%
119 浏览量
2012-02-02 上传
资源评论
炎龙铠甲会合体
- 粉丝: 75
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功