文章目錄
- 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類型,裡面不能消耗時間,不能阻塞;