文章目录
-
- 一、为什么使用随机化策略?
- 二、随机内容?
- 三、随机变量`rand、randc`、随机化方法`randomize、srandom`、随机化系统函数`$random、$urandom、$urandom_range`
- 四、randomize()、pre_randomize()和post_randomize()函数
- 四、约束constraint(并行执行):`关系操作符约束`、`inside`、`dist`、`if...else,->`、`双向约束`、inline约束:`randomize()with{}`、`solve...before`、`foreach`约束、静态约束、`soft`约束、`unique`
-
- 4、1、关系操作符约束(`>、<、==、>=、<=`):注意!!!约束必须分段写,不能写在一起!!!
- 4、2、约束范围:`变量名 inside{}`(`! 变量名 inside{}`表示不在范围内),注意是`{}`!!!
- 4、3、约束权重分布:`dist`(注意!`randc`类型的随机变量不能设置权重)`[1:3] := 60; 1、2、3各出现60次`;`[1:3] :/ 60; 1、2、3总共出现60次`
- 4、4、条件约束:`if...else,->`
- 4、5、约束的双向性:约束内,语句并行执行,因此会取各个约束之间的交集
- 4、6、内嵌(inline)约束:`assert(randomize() with {约束语句});`(在类外增加额外的约束,和在类里面增加约束是等效的)
- 4、7、`solve…before`约束:改变数值出现的机率,强制约束中先进行哪个变量的约束(使用`solve before`不能是`randc`型,且变量需要是整数值)
- 4、8、`foreach`约束:对数组内的变量进行约束
- 4、9、静态`static`约束:静态约束的使能和关闭对所有实例都生效
- 4、10、`soft `约束:解决inline方式的弊端,使内嵌约束可以生成约束的补集
- 4、11、`unique`:使变量在约束范围内各不相同
- 五、`rand_mode( )`:关闭`0`或打开`1`随机变量;`constraint_mode( )`:关闭`0`或打开`1`约束
- 六、示例代码
下面几种类型可以随机化:
- 单个变量或整型数
- 数组
- 数组长度
- 对象句柄
一、为什么使用随机化策略?
- 1、随着设计复杂度的提高,验证空间越来越大,使用编写定向测试集的方法来完整验证设计的功能会越来越困难;
- 2、有些边界条件人为无法考虑到,而随机化激励可以覆盖到人为无法确定的bug,以保证验证的完备性。
- 3、随机化但是也不能完全随机,需要加入一些约束
constraint
- 必须在
class
里定义constraint
!!!
- 必须在
二、随机内容?
-
RTL 设计的配置信息
- 不同的设计配置(随机化)
- 例如验证一个路由器,可以对输入和输出端口配置不同的数量