文章目录
- 1、randomize()函数
-
- TIPS:
- 2、pre_randomize()和post_randomize()
-
- TIPS:
1、randomize()函数
randomize()函数是system verilong内置的随机虚函数,定义如下:
virtual function int randomize();
randomize()函数对代码中的rand和randc属性的变量做随机初始化,randomize()函数执行成功,返回值为1,执行失败,返回值为0。
class Simplesum;
rand bit[7:0] x,y,z;
constrain c {z==x+y;};
endclass
module Test;
Simplesum p;
int status;
p = new();
if(p.randomize() == 0);
$display("Randomize fail!!!!");
endmodule
TIPS:
1、randomize()函数执行失败,意味着代码中的约束constrain不可用,代码中的随机变量将保持之前的值;
2、randomize()执行失败后,不会执行后面的post_randomize()函数;
3、randomize()函数不能被重写(override);
4、randomize()函数的随机种子可以被srandom()函数修改;
5、randomize()是system verilong的内置函数,不是VMM和UVM的函数,可以随时调用,其只会修改代码中rand和randc修饰的变量的值
2、pre_randomize()和post_randomize()
pre_randomize()和post_randmize()函数也是system verilog的内置函数,在调用randomize()函数时,会t同时调用这两个函数,这三个函数执行顺序如下:
pre_randomize()->randmoize()->psot_randomize()
pre_randomize()和post_randmize()函数的定义如下:
function void pre_randomize();
function void post_randomize();
pre_randomize()和post_randmize()函数可以被用户重写,用户使用pre_randomize()函数,在随机前修改代码中非随机变量的值,如上下限、权重等,post_randmize()函数可以在随机后修改随机值或做一些其它的计算。
class Simplesum;
rand bit[7:0] x,y,z;
int a=0;
constrain c {
if(a==0)
z==x+y;
esle
z==x;
};
function void pre_randomize();
a=1;
endfunction
function void post_randomize();
z=y;
endfunction
endclass
module Test;
Simplesum p;
int status;
p = new();
if(p.randomize() == 0);
$display("Randomize fail!!!!");
$display("a=%0d, z=%0h",p.a,p.z);
endmodule
TIPS:
1、pre_randomize()和post_randmize()是function类型,里面不能消耗时间,不能阻塞;