天天看点

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类型,里面不能消耗时间,不能阻塞;

继续阅读