天天看點

System verilog的randomize()、pre_randomize()和post_randomize()函數1、randomize()函數2、pre_randomize()和post_randomize()

文章目錄

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

繼續閱讀