• 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,更像是建模状态机的

      

  • 相关阅读:
    字符串 高精度计算
    JAVA Socket编程 课堂作业
    图论 Floyd算法
    天梯赛题解 L1-049 天梯赛座位分配
    天梯赛题解 -L1-039 古风排版
    HDU 5558 后缀数组
    HDU 6194 后缀数组
    HDU 5769 后缀数组
    HDU 4691 后缀数组+RMQ
    HDU 4135 容斥原理
  • 原文地址:https://www.cnblogs.com/-9-8/p/8569732.html
Copyright © 2020-2023  润新知