验证基础技巧记录(五)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

 

 

  

 

posted @ 2025-07-09 18:35  NoNounknow  阅读(30)  评论(0)    收藏  举报