systemverilog语法(六)

十六、随机化
通过随机化可以通过利用CPU的时间来换取人工检查的时间,提高效率,提供足够的激励。
采用受约束的随机测试法(CRT)产生测试集:使用随机的数据流为DUT产生输入的测试代码。改变伪随机数发生器(PRNG)的种子(seed)。
一般会在测试设计时考虑设计规范的边界处,甚至测试设计规范之外的行为。
1、 简单的随机变量的简单类
例: systemverilog语法(六)_第1张图片
Randc表示周期随机性,即所有的可能的值都赋值后随机值才可能重复
Randomize()函数在遇到约束方面的问题时返回0.
2、 权重分布的约束
Dist操作符允许产生权重分布。
:=操作符表示值范围内的每一个值的权重是相同的。
:/操作符表示权重要均分到值范围内的每一个值。
例: systemverilog语法(六)_第2张图片
3、 集合成员和inside运算符
用inside运算符产生一个值的集合,还可以求反!,用$代表最大值和最小值
例: systemverilog语法(六)_第3张图片
4、 条件约束
支持->和if-else,其中->操作等价于case产生的效果
例: systemverilog语法(六)_第4张图片
5、 高效的约束办法
例: 这里写图片描述
6、 带关系操作的约束办法
例: systemverilog语法(六)_第5张图片
7、 带关系操作和约束的类
例: systemverilog语法(六)_第6张图片
当x==0时,y==0,但y==0时,对x没有约束。
8、 使用slove••••before约束引导概率分布
slove••••before约束不会改变解的个数,只会改变各个值的概率分布。
例: 这里写图片描述
9、 控制多个约束块
可以使用内建constraint_mode()函数打开或者关闭约束。
可以用handle.constrain.constraint_mode()控制一个约束块。
用handle.constraint_mode()控制对象的所有约束。
例: systemverilog语法(六)_第7张图片
10、内嵌约束(randomize() with)
通过randomize() with来增加额外的约束
例: systemverilog语法(六)_第8张图片
11、pre_randomize和post_randomize函数
构建浴缸分布的例子:
systemverilog语法(六)_第9张图片

12、常用的随机函数
systemverilog语法(六)_第10张图片
13、约束技巧和技术
1)使用变量设定上限的约束
systemverilog语法(六)_第11张图片
2)带权重变量的dist约束
systemverilog语法(六)_第12张图片
14、随机化中常见的错误
1)小心使用有符号变量(除非必要,不要在随机约束里使用有符号类型):错误的例子如下
例: systemverilog语法(六)_第13张图片
2)使用无符号32位变量随机化也将产生错误。
如:randm bit[31:0] pkt1_len.•••••••••••••••错误
15、约束数组或者队列的大小
Size()函数可以约束动态数组或队列的元素个数。Inside约束数组大小的上限和下限
例: 这里写图片描述
15、约束数组和队列的每一个元素
1)可以用foreach对数组的每一个元素进行约束。
例: systemverilog语法(六)_第14张图片
2)产生具有唯一元素值的数组
例: systemverilog语法(六)_第15张图片
16、使用randcase和$urandom_range()随机控制
例: systemverilog语法(六)_第16张图片
$urandom_range函数返回一个指定范围的随机数,若只用一个参数,则当做(0,最大值)对待。
使用randcase建立决策树
例:systemverilog语法(六)_第17张图片

你可能感兴趣的:(systemverilog语法,systemveri,验证)