SV randomize

SV randomize,第1张

SV randomize

randomize中的变量只支持2-state的values,不支持4-states。


randc类型的变量不能被约束在solve------before的语句中。


constraint可以被定义在class外

      class  C;

        rand int x;

        constraint protol;    //隐式的

        extern constraint protol2;    //显式的

       endclass

       constraint C::protol { x inside {-4, 5, 7}; }

       constraint C::protol2  { x >= 0; }

constraint的继承性

  由于内置的randomize()函数是 virtual function,所以constraint也是只和对象的类型有关,extend会覆盖baseclass

  在virtual class中可以定义pure cosntraint,只作为一个constraint 原型,但是class中是不允许出现pure constraint的。


unique关键字,表示之后的几个变量的值不重复;需要加{},表明区间范围。


  constraint u { unique {b, a[2:3], exclude}; }

  constraint exclusion { excluded == 5; }

constraint中的迭代,只能使用foreach,对于array的计算,可以使用with (item)的方式


  constraint c1 {A.size == 5;}

  constraint c2 { A.sum() with (int'(item)) < 1000; }

global constraint,当一个object进行随机的时候,包含的所有的object也会一起随机,被调用randomize()方法。


  global constaint是SV内置的一个属性,programmer不需要设置。


static constraint,主要作用是constraint_mode()约束的时候,是所有的instant一起被关闭或者打开


  programmer可以显式的进行设置。


constraint中调用function,需要满足几个条件:

  1) 函数的参数不能是output或者ref类型,可以是input和const ref类型。


  2) 函数中不能调用rand_mode()和constraint_mode()的方法。


constraint中的guard expression:约束中的某些逻辑可能是错的,但是通过&&和||逻辑,某些项可以是不关注的。


       

  a.x==5时,并不关注b是不是null的。


soft constraint,相较于hard constraint,solver并不需要一定解决这些constraint,并不会造成solver failure


    p的with randomize优先级高,class内定义的constraint不需要被考虑

  priority,class内部的soft constraint,按定义的顺序排列优先级,越晚的优先级越高。


      高优先级,可以覆盖掉低优先级的约束


(与override不一样的是不需要cosntraint名字相同,只是作用在变量的约束上


)

  discard soft var,将之前所有的关于变量var的软约束都取消掉。


randomize function,是每个class中内建的一个virtual的function


成功返回1,失败返回0。


  还有两个hook function,pre_randomize()和post_randomize()不是virtual function,但是每次randomize()调用的时候,都会自动调用。


  如果randomize() function失败,所有的var保持原来的值,post_randomize()不会被调用。


  但是必须super调用 被override的function


  randomize() with {};in-line的randomize,也必须满足之前定义的约束,只是一个子集


    其中的变量的范围约束,this,super,可以绑定某个handle

               local::,绑定调用randomize() with的当前scope,如function,task


  

  randomize(var)加参数时,只对某个参数进行随机化,但是pre_randomize和post_randomize仍然会被调用


    如果var是null,SV并不进行随机,只是check当前的约束条件是否都能被满足,只检查solver能否正常工作,所有var的值不变。


std::randomize(),是SV中单独定义的一个static的方法,可以对class之外的变量进行随机

  可以加with来约束变量。


与class中的pre_randomize和post_randomize完全无关。


$urandom(seed)和$urandom_range(max, min),对变量随机,但是不能加约束,而且都是32bit的随机,只赋值低位。


  srandom(seed),是一个function,可以用来初始化一个RNG object。


通过class handle调用


randcase,建模不同的选择分支,randsequence,更像是建模状态机的


  

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/587115.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存