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

tech2023-01-06  117

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

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

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

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

那么,开始吧。

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

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

3、 集合成员和inside运算符 用inside运算符产生一个值的集合,还可以求反!,用$代表最大值和最小值 例:

4、 条件约束 支持->和if-else,其中->操作等价于case产生的效果 例:

5、 高效的约束办法 例:

6、 带关系操作的约束办法 例:

7、 带关系操作和约束的类 例:

当x0时,y0,但y==0时,对x没有约束。 8、 使用slove••••before约束引导概率分布 slove••••before约束不会改变解的个数,只会改变各个值的概率分布。 例:

9、 控制多个约束块 可以使用内建constraint_mode()函数打开或者关闭约束。 可以用handle.constrain.constraint_mode()控制一个约束块。 用handle.constraint_mode()控制对象的所有约束。 例:

10、内嵌约束(randomize() with) 通过randomize() with来增加额外的约束 例:

11、pre_randomize和post_randomize函数 构建浴缸分布的例子:

12、常用的随机函数

13、约束技巧和技术 1)使用变量设定上限的约束

2)带权重变量的dist约束

14、随机化中常见的错误 1)小心使用有符号变量(除非必要,不要在随机约束里使用有符号类型):错误的例子如下 例:

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

15、约束数组和队列的每一个元素 1)可以用foreach对数组的每一个元素进行约束。 例:

2)产生具有唯一元素值的数组 例:

16、使用randcase和$urandom_range()随机控制 例:

$urandom_range函数返回一个指定范围的随机数,若只用一个参数,则当做(0,最大值)对待。 使用randcase建立决策树 例:

最新回复(0)