随机关键词rand只能在class或结构体里被声明,同样的randomize也只适用于对象。(或std::randomize)
2.关于solve…before…的说明
SystemVerilog中随机变量在常见的约束(符号约束、inside约束、条件约束、内嵌约束)条件下,其随机值出现的概率是均等的。但是 使用solve…before约束后,将会改变随机数值的出现几率,使得某些特定的取值情况更易出现。
2.1 没有solve…before…
class transaction;
rand bit a;
rand bit[1:0] data;
constraint c1{ a -> data==3'h3;} //条件约束
endclass
module gen_data;
initial begin
transaction tr=new() ;
for(int i=0; i<10; i++ ) begin
tr.randomize() ;
$display("a= %0d, data= %0d",tr.a, tr.data) ;
end
end
endmodule
上边这个仅仅添加了一个条件约束,结果如下:
打印结果如下:
a= 0, data= 2;
a= 0, data= 2;
a= 0, data= 3;
a= 0, data= 1;
a= 0, data= 0;
a= 0, data= 2;
a= 1, data= 3;
a= 0, data= 3;
a= 0, data= 1;
a= 0, data= 1;
由于条件约束的存在,当a=1,data只能为3;而a=0,data可取0,1,2,3四种组合,所以共有5种组合,每种组合出现的概率相同,即1/5,如下表:
2.2 加上solve…before…
class transaction;
rand bit a;
rand bit[1:0] data;
constraint c1{ a -> data==3'h3; //条件约束
solve a before data;} //在给出data随机值之前先给出a的随机值
endclass
module gen_data;
initial begin
transaction tr=new() ;
for(int i=0; i<10; i++ ) begin
tr.randomize() ;
$display("a= %0d, data= %0d",tr.a, tr.data) ;
end
end
endmodule
除了有一个条件约束外,还增加了solve…before…,随机的结果的概率会发生改变。
打印结果如下:
a= 1, data= 3;
a= 0, data= 2;
a= 0, data= 3;
a= 0, data= 1;
a= 1, data= 3;
a= 0, data= 2;
a= 1, data= 3;
a= 0, data= 3;
a= 0, data= 1;
a= 0, data= 1;
由于 solve a before data约束的存在,随机变量a会先被赋予随机值,a为1或0的概率为1/2,接下来再为data随机变量赋随机值,其概率取决于a的值,如下表:
注意:randc类型变量不被允许使用solve…before约束;