学习目标:
SV绿皮书第六章:随机化
学习内容:
1.SV的约束是双向的,它会同时计算所有的随机变量的约束
增加或者删除任一变量的约束都会直接或者间接影响所有相关变量的值的选取
2.高效地使用位提取的约束
rand bit [31:0]addr;
constraint near_page_boundry{
addr[11:0] inside {
[0:20],[4075:4095]};
}
3.关系操作和双向约束
class Imp2;
rand bit x; //0或1
rand bit [1:0]y; //0,1,2或3
constraint c_xy{
y>0;
(x==0) -> y==0;
}
endclass
由于关系操作是双向的,如果y为非零值,那么x的值将为1,又y>0,所以x不可能为0
4.使用solve…before约束引导概率分布(尽量不要使用solve before,会降低计算速度,也会使你的约束难看懂)
class SolveBefore
rand bit x;
rand bit [1:0]y;
constraint c_xy{
(x==0) -> y==0;
solve x before y; //求解器计算x的值为0或1,概率相等
}
endclass
改为solve y before x,则为y=0,1,2或3的概率相等,y=1,2,3时,x不为0
5.控制多个约束块
用constraint_mode()函数打开或关闭约束
用handle.constrain.constraint_mod()控制一个约束块
用handle.constraint_mode()控制对象的所有约束
class Packet;
rand int length;
constraint c_short{
length inside {
[1:32]};}
constraint c_long{
length inside {
[1000:1023]};}
endclass
Packet p;
initial begin
p=new();
//用handle.constrain.constraint_mod()控制一个约束块
p.c_short.constraint_mode(0);
assert(p.randomize());
transmit(p);
// 用handle.constraint_mode()控制对象的所有约束
p.constraint_mode(0);
p.c_short.constraint_mode(1);
assert(p.randomize());
transmit(p);<