验证基础技巧记录(五)randomization
随着设计的愈发庞大,其所具有的functions和features也越来越多,directed test难以囊括所有的features,且定向测试的编写耗费时间,难以维护,仅能cover我们能想象的功能点;
人类无法想象所有可能的情况。
通过random,可以cover我们能想象的features,还能cover一些corner case(灰色地带);
通过随机可以测试人脑想不到的corner case,从而发掘corner情况下design的bug。
contrainted random testcases,CRT
约束是为了随机结果更有效,过滤不可能发生的情况,提高simulation的效率;
sv的随机:
1.随机变量;
2.约束块;
3.自建的随机系统函数;
handle.randomize();
std::randomize()
可以在类里使用std::randomize(this);
也可以在外部或内部使用std::randomize(variable);
局限性
1.std::randomize(variable) 只考虑其内联约束,否则将考虑其声明的默认范围进行随机化。
2.std::randomize(this) 仅适用于随机化类变量。但这个函数不会考虑在任何函数中声明的局部变量,因此在随机化过程中有更大的可能遗漏某些数据。
3.std::randomize(variable) 仅适用于局部声明的变量。它不能在其他函数或类中访问。
随机对象只能是整数类型,不能是wire或string,会产生语法错误;
代码:
1.handle.randomize()时,会根据约束随机化对象所有的随机成员变量,所有被启用的约束也会生效;
*如果启用的约束块对非随机描述的变量进行了约束,是可能产生语法错误的;
*准确的说,是由于非随机描述的变量初值可能是0或者别的什么,而他们本身无法被随机导致了求解器无法调整他们的数值来求解,这就导致了语法错误;
*上述错误主因是求解器无法求解;
2.使用std::randomize可以无视类内约束进行求解,但也可以手动添加一些额外约束;
3.仅单独传参的时候可以使用约束块对非随机变量进行随机化;
4.同样是求解器问题,多个随机变量在约束块彼此挂钩时,如果只随机化其中一个很可能导致出错,因为他们的初值都是0的情况无法在只对其中一个数求解时让他满足<0这种条件;
5.基于4的情况,一般需要先对整体进行随机化,确保每个变量的数值在可以满足问题的区间之中,再对单个变量进行随机化,这样最不济也能返回原值;
6.rand变量也可以用static修饰,静态随机变量被所有实例共享,他们访问的是同一块空间;
7.randomize失败时,pose_randomize不会被执行;
8.randmoize失败时,constaint并不生效,且随机变量保持原值;这个本质上是求解器求解失败了,对多个变量随机化失败则都保持原值;
9.randomize是内建函数,无法被override;但是pre_randomize和post_randomize是可以被overwrite的;
10.constraint使用{}包裹,与function和task不同;(但是与coverpoint 的bin相同)
11.constraint也是class的成员,可以被继承,同名会被overwrite;
12.非rand类型的变量也能被随机和约束,但是其初值是0,容易导致随机化失败;
(应用手段,basic_test中,规定某个非rand变量数值需要在某个范围,此时和如果后续修改让其不满足约束,随机化就会报错,形成一个提醒的作用);
13.constraint也能对size等函数结果或表达式进行约束;这本质上是一个求解;
14.constraint所支持的单个关系符:< <= == >= >
15.inside的对象可以是数组;
16.dist的对象可以是常量和变量,也可以从外界传入;
randc无法通过dist约束;
17.unique约束(唯一修饰符)
unique{range_list;}
添加唯一修饰符的变量随机出来的数值是唯一的;
constraint u1{ unique {b,a[2:3],excluded}; }
constraint u2{ excluded == 5;}
18.等效操作符<->
其被定义为:A<->B 等效于 ((A->B)&&(B->A))
即,A为真,B的约束成立;B为真,A的约束成立;
这个约束要求求解器找到这两个约束同时成立或同时不成立的解;
例如(A==5)<->(B==3)
当额外约束A = 5时,B一定等于3;
当额外约束A 不为 5的时候,B一定不为3;
19.constraint block也能被修饰为static格式;
和静态变量一样。修饰为static的约束块所有的句柄都可见,并且看到的都是同一个约束块;
因此,使用constraint_mode(0)关掉静态约束块,则所有派生类所访问的静态约束块都会被关掉;
20.constraint的约束表达式允许使用函数的返回值;
但,所调用的函数的参数列表不允许包含output和ref类型;可是const ref是允许的;(不允许在约束块中直接修改传入变量的数值,也就是只读)
函数不可以使用rand_mode()和constraint_mode(),不允许通过约束,实现随机化随机的开关;
21.数组的约束
通过foreach可以实现对数组的每个元素进行约束;
除了约束数组里的元素,也可以约束数组的size;
22.rand_mode()用于控制随机变量的active和inactive;
默认的rand变量都是active的;
handle.variable.rand_mode(0);
关闭某个rand变量的随机开关;
23.constraint_mode()同上;
handle.constraint_name.constraint_mode(0);
24.sv自带的random function无法返回超过32位的数据,如果有需求,得手动开发以满足自己的需要;
25.function


浙公网安备 33010602011771号