一、约束块控制
- 一个类可以包含多个约束块。可以把不同约束块用于不同测试。
- 一般情况下,各个约束块之间的约束内容是互相协调不违背的,因此通过随机函数产生随机数时可以找到合适的解
如果子类继承父类,也继承了父类的约束,这个时候如果在子类里约束,不能违背父类里面的约束。 - 对于其他情况,例如根据不同需求,来选择使能那些约束块,禁止那些约束块的要求,可以使用内建的constraint_mode()函数打开或者关闭约束。
1.1 打开或关闭约束块
声明句柄p,创建p=new(); 此时 length=0;
p.c_short.constraint_mode(0); //关闭 c_short 约束
p.constraint_mode(0); //关闭 P里面所有的约束
p.c_short.constraint_mode(1); //打开 c_short 约束
1.2 内嵌约束
- SV允许使用 randomize()with 来增加额外的约束,这和在类里增加约束是等效的,但同时要注意
类内部约束和外部约束之间应该是协调的,如果出现互相违背的情况,那么随机数值求解会失败。
t.randomize() with { addr inside [200:300] ; data inside [10:20] ; }
soft 表示 soft定义的约束和别的约束冲突时,soft 的约束 优先级更低。
二、随机函数
2.1 pre_randomize() 和 post_randomize()
- 有时候在调用randomize() 之前或者之后立即执行一些操作,例如在随机前设置类例的一些非随机变量(上下限,条件值、权值)
- SV提供了两个预定义的void 类型函数pre_randomize()和post_randomize()函数。用户可以在类中定义这两个函数,分别在其中定义随机化前的行为和随机化后的行为。
- 如果在某个类中定义了pre_randomize()或者post_randomize()函数,那么对象在执行了randomize()之前或者之后会分别执行这两个函数。所以,pre_randomize()和post_randomize()可以看做是randomize()函数的回调函数(callback function)。
2.2 $random() $urandom() $urandom_range
- $random() 平均分布,返回32位有符号随机数
- $urandom()平均分布,返回32位无符号随机数
- $urandom_range() 在指定范围内的平均分布
$urandom_range(A,B) 产生一个在A,B里面的数
2.3 随机化个别变量