【芯片验证学习纪实】System Verilog语法(6)

【芯片验证学习纪实】System Verilog语法(2)

继学习了FPGA设计之后,学习IC验证也有一段时间了,学习过程中参考了很多互联网上的优秀资源,在此感谢各位前辈们的无私分享!现在,利用闲暇之余将对自己整个学习过程做个简单的回顾和总结。

首先,在system verilog学习中用到的参考书是绿皮书《system verilog验证——测试平台编写指南》(第二版)。另在回顾时翻阅了相关总结:

https://blog.****.net/qq_31935691/article/details/54982105

那么,开始吧。

十六、随机化
通过随机化可以通过利用CPU的时间来换取人工检查的时间,提高效率,提供足够的激励。
采用受约束的随机测试法(CRT)产生测试集:使用随机的数据流为DUT产生输入的测试代码。改变伪随机数发生器(PRNG)的种子(seed)。
一般会在测试设计时考虑设计规范的边界处,甚至测试设计规范之外的行为。
1、 简单的随机变量的简单类
例: 【芯片验证学习纪实】System Verilog语法(6)

Randc表示周期随机性,即所有的可能的值都赋值后随机值才可能重复
Randomize()函数在遇到约束方面的问题时返回0.
2、 权重分布的约束
Dist操作符允许产生权重分布。
:=操作符表示值范围内的每一个值的权重是相同的。
:/操作符表示权重要均分到值范围内的每一个值。
例: 【芯片验证学习纪实】System Verilog语法(6)

3、 集合成员和inside运算符
用inside运算符产生一个值的集合,还可以求反!,用$代表最大值和最小值
例: 【芯片验证学习纪实】System Verilog语法(6)

4、 条件约束
支持->和if-else,其中->操作等价于case产生的效果
例: 【芯片验证学习纪实】System Verilog语法(6)

5、 高效的约束办法
例: 【芯片验证学习纪实】System Verilog语法(6)

6、 带关系操作的约束办法
例: 【芯片验证学习纪实】System Verilog语法(6)

7、 带关系操作和约束的类
例: 【芯片验证学习纪实】System Verilog语法(6)

当x0时,y0,但y==0时,对x没有约束。
8、 使用slove••••before约束引导概率分布
slove••••before约束不会改变解的个数,只会改变各个值的概率分布。
例: 【芯片验证学习纪实】System Verilog语法(6)

9、 控制多个约束块
可以使用内建constraint_mode()函数打开或者关闭约束。
可以用handle.constrain.constraint_mode()控制一个约束块。
用handle.constraint_mode()控制对象的所有约束。
例: 【芯片验证学习纪实】System Verilog语法(6)

10、内嵌约束(randomize() with)
通过randomize() with来增加额外的约束
例: 【芯片验证学习纪实】System Verilog语法(6)

11、pre_randomize和post_randomize函数
构建浴缸分布的例子:
【芯片验证学习纪实】System Verilog语法(6)

12、常用的随机函数
【芯片验证学习纪实】System Verilog语法(6)

13、约束技巧和技术
1)使用变量设定上限的约束
【芯片验证学习纪实】System Verilog语法(6)

2)带权重变量的dist约束
【芯片验证学习纪实】System Verilog语法(6)

14、随机化中常见的错误
1)小心使用有符号变量(除非必要,不要在随机约束里使用有符号类型):错误的例子如下
例: 【芯片验证学习纪实】System Verilog语法(6)

2)使用无符号32位变量随机化也将产生错误。
如:randm bit[31:0] pkt1_len.•••••••••••••••错误
15、约束数组或者队列的大小
Size()函数可以约束动态数组或队列的元素个数。Inside约束数组大小的上限和下限
例: 【芯片验证学习纪实】System Verilog语法(6)

15、约束数组和队列的每一个元素
1)可以用foreach对数组的每一个元素进行约束。
例: 【芯片验证学习纪实】System Verilog语法(6)

2)产生具有唯一元素值的数组
例: 【芯片验证学习纪实】System Verilog语法(6)

16、使用randcase和$urandom_range()随机控制
例: 【芯片验证学习纪实】System Verilog语法(6)

$urandom_range函数返回一个指定范围的随机数,若只用一个参数,则当做(0,最大值)对待。
使用randcase建立决策树
例:【芯片验证学习纪实】System Verilog语法(6)