参考博文:https://blog.csdn.net/qq_31935691/article/details/54985461
随机化
通过随机化可以通过利用CPU的时间来换取人工检查的时间,提高效率,提供足够的激励。
采用受约束的随机测试法(CRT)产生测试集:使用随机的数据流为DUT产生输入的测试代码。改变伪随机数发生器(PRNG)的种子(seed)。
一般会在测试设计时考虑设计规范的边界处,甚至测试设计规范之外的行为。
1、 简单的随机变量的简单类
例:
Randc表示周期随机性,即所有的可能的值都赋值后随机值才可能重复
Randomize()函数在遇到约束方面的问题时返回0.
2、 权重分布的约束
Dist操作符允许产生权重分布。
:=操作符表示值范围内的每一个值的权重是相同的。
:/操作符表示权重要均分到值范围内的每一个值。
例:
3、 集合成员和inside运算符
用inside运算符产生一个值的集合,还可以求反!,用$代表最大值和最小值
例:
4、 条件约束
支持->和if-else,其中->操作等价于case产生的效果
例:
5、 高效的约束办法
例:
6、 带关系操作的约束办法
例:
7、 带关系操作和约束的类
例:
当x==0时,y==0,但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约束数组大小的上限和下限
例:
16、约束数组和队列的每一个元素
1)可以用foreach对数组的每一个元素进行约束。
例:
2)产生具有唯一元素值的数组
例:
17、使用randcase和$urandom_range()随机控制
例:
$urandom_range函数返回一个指定范围的随机数,若只用一个参数,则当做(0,最大值)对待。
使用randcase建立决策树
例: