1.随机化概述
(1)随机测试与定向测试
定向测试能找到你认为可能存在的缺陷,而随机测试可以找到连你都没有想到的缺陷。随机测试的环境要求比定向测试复杂,它需要激励、参考模型和在线比较。上百次的仿真不再需要人为参与,以此来提高验证效率。随机测试相对于定向测试可以减少相当多的代码量,而产生的激励较定向测试也更多样。如果说定向测试是"站着测”,那么随机测试就是"躺着测"、“跪着测"、“跑着测",各种花式测,只有想不到,没有测不到.
(2) 随机的对象
(3)关键字
//
rand/randc:
表明变量的随机属性;randc表示周期随机性,即所有可能的值都赋过值后随机值才可能重复。
注意的是:必须是类的变量才能使用;关键字不能出现在module,也不能出现在类的方法局部变量中。
//
randomize()函数:
随机属性需要配合SV预定义的类随机函数std::randomize()"使用。即只有通过声明rand变量,并且在后期通过对象调用randomize()函数才可以随机化变量。std常是对象的句柄。该函数会返回1或0;1表示随机化成功。
(4)声明随机变量的类
2.约束
(1)简述
(2)约束求解器与初始值
(3)关键字、表达式
constraint:约束
在约束块里不能进行赋值,相反,应该用关系运算符为随机变量赋一个固定的值。
len==42;
(4)例子
inside的用法:见下面内容。
(5)双向约束
3.权重分布
(1)关键字dist
(2)例子
4.inside 与$、条件约束
(1)inside是常见的约束运算符,表示变量应该属于某一个值的集合,除非还存在其他约束,否则随机变量在集合里取值的概率是相等的。集合里也可以使用变量。
rand int c; //随机变量
int 1o, hi; //作为上限和下限的非随机变量
constraint c_range {
c inside {[lo:hi]}; // lo <= c && c <= hi
}
(2)使用"$"指定最大值和最小值
rand bit [6:0] b; //0 <=b <= 127
rand bit [5:0] e; // 0 <=e <= 63
constraint c_range {
b inside {[$:4], [20:9]}; // 0 <=b <= 4 11 20 <=b <= 127
e inside ([$:4], [20:$]}; // 0<= e<= 4 11 20 <= e <= 63
(3)条件约束->
5.约束块控制
(1)打开或关闭约束
(2)contraint_mode()的用法
如果随机化该对象时,不禁止其中的任何一个约束块,那么调用随机函数randomize()后,下列哪一个数值可能是p.length的值?(0,报错(仿真器不同区别))
(3)内嵌约束
SV允许使用randomize() with来增加额外的约束,这和在类里增加约束是等效的,但同时要注意类内部约束和外部约束之间应该是协调的,如果出现互相违背的情况,那么随机数值求解会失败。
(4)soft关键字
soft指明约束为软约束。约束冲突时丢弃。
(5)例题
由于有了soft,另外约束一个报错,整体就是报错的。