目录
1、pre_randomize()和post_randomize()
一、随机约束和分布
1、为什么需要随机?
- 芯片体积增大,复杂度日渐提高,在20年前定向测试已经无法满足验证的需求,而随机测试的比例逐渐提高
- 定向测试能找到你认为可能存在的缺陷,而随机测试可以找到连你都没有想到的缺陷。
- 随机测试的环境要求比定向测试复杂它需要激励、参考模型和在线比较。上百次的仿真不再需要人为参与,以此来提高验证效率
- 激随机测试相对于定向测试可以减少相当多的代码量,而产生的激随励较定向测试也更多样
- 如果说定向测试是"站着测”,那么随机测试就是"躺着测”、“跪着测”、“跑着测”各种花式测,只有想不到,没有测不到
2、为什么需要约束?
- 如果随机没有约束,意味着什么?是绝对的自由吗?肯定不是,它是一匹脱缰的野马,没有拘束,产生有效激励的同时也产生了很多无效和非法的激励。
- 那么我们想要的随机自由是一种合法的随机,需要限定激励的合法范围。同时,伴随测试的进行,约束甚至应该"变形”,变得更趋于为测试的数值范围或者期待的数值范围
- 随机的对象不只是一个数据而是有联系的变量集。通常这些变量会被封装在一个数据类中,同时需要在类中声明数据之间的约束关系。因此约束之后要产生随机数据需要一个“求解器",即在满足数据本身和数据之间约束关系时的随机数值解
- 约束不但可以指定数据的取值范围,还可以指定各个数值的随机权重分布
3、我们要随机什么
:随机测试中,可以随机化设计的结构吗?
不可以,随机、验证的结构(类是动态的)发生在仿真设计的结构发生在编译的时候
4、声明随机变量的类
随机化是为了产生更多可能的驱动,因此在软件世界"class”的运用更多,所以我们倾向于将相关数据有机整理在一个类的同时,也用rand关键词来表明它们的随机属性
randc表示周期随机性,即所有可能的值都赋过值后随机值才可能重复
随机属性需要配合SV预定义的类随机函数std::randomize()使用。即只有通过声明rand变量,并且在后期通过对象调用randomize()函数,才可以随机化变量
约束constraint也同随机变量一起在类中声明
说明: rand和randc都是关键词,必须用来修饰类的成员变量
类里面方法的局部变量不能用这两个关键词修饰
rand和randc的区别:
以抽扑克牌为例子(一副扑克牌有54张):
5、什么是约束
- 约束表达式的求解是由SV的约束求解器(constraint solver)完成的。
- 求解器能够选择满足约束的值,这个值是有SV的PRNG (伪随机数发生器 Pseudoandom number generator )从一个初始值 (seed) 产生。只要改变种子的值