SV---随机函数

1.pre_randomize()和post_randomize()函数

1)有时需要在调用randomize()之前或之后立即执行一些操作,例如在随机前设置类里的一些非随机变量,(上下限、条件值、权重),或者在随机化之后需要计算随机数据的误差、分析和记录随机数据等。

2)SV提供了两个预定义的void类型函数pre_randomize()和post_randomize()函数。用户可以在类中定义这两个函数,分别在其中定义随机化前的行为和随机化后的行为。

3)如果某个类中定义了pre_randomize()或者post_randomize()函数,那么对象在执行了randomize()之前或者之后会分别执行这两个函数。所以,pre_randomize()和post_randomize()函数可以看做是randomize()函数的回调函数(callback function)。

2.随机数函数

SV提供了一些常用的系统随机函数。这些随机函数可以直接调用来返回随机数值。(不通过class,直接调用)

1)$random()平均分布,返回32位有符号随机数。

2)$urandom()平均分布,返回32位无符号随机数。

3)$urandom_range()在指定范围内的平均分布。

3.随机化个别变量

1)在调用randomize()时可以在括号里定义个别变量。

2)只有在括号里的变量才会被随机化,其他变量会被当做状态变量而不会被随机化。

3)所有的约束仍然保持有效。

4)所有被指定或者没有被指定rand的变量都可以作为randomize()的参数而被随机化。

5)当randomize中的参数不是之前定义的rand变量,那么rand变量就不会再随机了,如下面代码中r.randomize(low)之后,low被随机,med,hi都不随机。

代码演示:

class Rising;
	byte low, //非随机变量,初始值为0
	rand byte med,hi; //随机变量,初始值为0
	constraint up {low < med;med < hi;}
endclass

initial begin
	Rising r;
	r = new();
	r.randomize();//随机化med,hi,但不改变low   此时low=0,假设med=5,hi=9	
	r.randomize(med); //只随机化med              此时low=0,hi=9,这俩不变,med可以是1-8,假设med=6
	r.randomize(low);//只随机化low              此时med=6,hi=9,low可以是0-5,假设low=3
end
  low med hi
r.randomize() 0 5 9
r.randomize(med) 0 6(1~8) 9
r.randomize(low) 3(0~5) 6 9

例题:分析下面代码,low,med和hi的值可能是多少?

class Rising;
	byte low, //非随机变量
	rand byte med,hi; //随机变量
	constraint up {low < med;med < hi;}
endclass

initial begin
	Rising r;
	r = new();
	r.randomize(low);
end

 

SV---随机函数_第1张图片

解析:因为直接对非随机变量进行了个别变量随机(r.randomize(low)),那么之前的随机变量med和hi不会被随机,变成默认值0,当med=hi=0,因为之前的约束条件仍有效,导致约束条件不被满足,所以约束失败,此时low也不会被随机,而是报错。所以是C。

 

你可能感兴趣的:(SV,systemverilog)