第十课 Randomization
Randomization
- 关键词:rand
rand[7:0] y;
y会在0~255之间随机生成。
- 关键词:randc
randc[1:0] y;
y会在0~3之间随机生成,并且必定以四个为循环生成互不相同的数字,只能对bit 或enum类型使用这个关键词。
- 关键字:constraint
对于声明过rand/randc的变量可以使用constraint限定 - randomize()函数
randomize属于内嵌的系统函数 ,函数会给所有object里的随机变量赋予新值。
randomize函数本身在成功时返回1,失败时返回0。 - constraint solver
输入同样的seed可以得到同样的随机结果,用于复现
Constraint 约束
随机变量的约束都包含在constraint函数模块当中:
如上图所示,constraint为关键字,range1是约束集的名字,大括号内是约束模块。
每一句约束只能含有一个操作符,多个约束必须要写多句程序。
- 关键词:inside
可以设置区间约束,用 ! 取补集
练习:
从例题中可以看出inside可以当做小于等于号 - dist操作符
可以给随机变量赋权重,使用:=或者:/符号,:=表示赋的就是当前权值,:/表示平分权值。
***约束都是并行的,同时判定。 - 条件约束->
在约束模块中用->代替if/else语句:
mode == small -> len<10;
mode == large -> len>100;
但是判定的瞬间是同时进行的,不会受语句先后的影响。
-
solve…before
会先约束solve和before之间的变量,并且会对随机结果产生不同的影响。
例子:
注意两种情况的概率差别 -
Iterative constraint迭代约束
给数组添加约束时,可以用foreach语句迭代约束 -
function constraint函数约束
用函数关系表示约束
class B;
rand int x,y;
constraint C{x<=F(y);}
constraint D{y inside {2,4,8};}
此时y会被强制在x之前判定。
- 变量保护
Disabling Random Variables
- rand_mode()
属于不能改写的内嵌系统方法,能用来打开和关闭随机变量
- constraint_mode()