IC验证零基础学习-System Verilog-(六)随机化
1、介绍
采用受约束的随机测试法(CRT)自动产生测试集。CRT包括:使用随机的数据流为DUT产生输入的测试代码;伪随机数发生器(PRNG)的种子(seed)。只要改变种子的值,就可以改变CRT的行为。
2、什么需要随机化
具有挑战性的bug大都在控制路径里。
需要考虑的设计输入:器件配置;环境配置;原始输入数据;封装后的输入数据;协议异常;延时;事务状态;错误(error)和违规(violation)。
1)器件配置–在RTL级设计的测试过程中,找不到bug的最常见原因是什么?没有测试足够多的配置。
3、SV中的随机化
1)约束是一组用来确定变量的值的范围的关系表达式,表达式的值永远为真。
2)当代码里约束有矛盾时,随机化会失败,可以使用断言检查随机化结果。
3)可以随机化整数和位矢量,不能随机字符串或约束中指向句柄。
4、约束
1)约束块里只能包含表达式,不能进行赋值,相反,应该用关系运算符为随机变量赋一个固定的值,例如a == 12。也可以使用更复杂的关系表达式。
2)dist操作符,带有一个值的列表以及相应的权重,:= 操作符表示值范围内的每一个值的权重是相同的。:/ 操作符表示权重要均分到值范围的每一个值。
3)inside 运算符产生一个值的集合。各个值的选取机会是相等的。可以使用$来代表取值范围的最小值和最大值。
如何想选择一个集合之外的值,可以用取反!操作符,对约束取反。
4)-> 操作符可以产生和case操作符效果类似的语句,可用于枚举类型的表达式。
5)约束块是声明性代码,是并行的,所有的约束表达式同时有效。
5、解的概率
6、控制多个约束块–一个类可以包含多个约束快
可以使用constraint_mode()函数打开或者关闭约束块。
7、内嵌约束
SV允许使用randomize()with来增加额外的约束,这和在类里增加约束是等效的。
8、随机数函数
$random()–平均分布,返回32位有符号数。
$urandom()–平均分布,返回32位无符号数。
$urandom_range()–在指定范围内的平均分布。
$dist_exponential()–指数衰落。
$dist_normal()–钟型分布。
$dist_uniform()–平均分布。
9、约束的技巧和技术
使用变量约束;使用非随机值;随机化个别变量;打开或关闭约束;在测试过程中使用内嵌约束了;在测试过程中使用外部约束,
10、随机化的常见错误
小心使用有符号变量–除非必要,不要在随机约束里使用有符号类型。
11、数组约束
最好使用foreach对数组的每一个元素进行约束。
产生具有唯一元素值的数组
如果要产生多个随机对象,那么可能需要建立随机句柄数组。
12、随机控制-可以用randcase建立决策树
13、随机数发生器
参考书籍《SystemVerilog验证测试平台编写指南》