System Verilog中rand和randc
1、rand与randc
a、rand
rand修饰符:rand修饰的变量,每次随机时,都在取值范围内随机取一个值,每个值被随机到的概率是一样的,就想掷骰子一样。
rand bit[7:0] y
y的取值范围为0~255,每次随机时,都在此范围取值,每个值被取到的概率为1/256
b、randc
randc修饰符:randc表示周期性随机,即所有可能的值都取到过后,才会重复取值。
randc bit[1:0] y
y的取值范围是0~3,调用randomize()后,会返回一个y取值范围的随机序列,当这个序列的每个值都被y取到后,会在重新生成随机序列,开始下一个周期的随机取值,如下图所示。
c、randc注意
1、randc的随机序列在constrain约束发生变化,或者序列中剩下的值不能满足当前的约束要求时,变量的随机序列会被重新计算;
2、randomize()计算随机变量时,randc修饰的变量会被首先计算,在包含rand和randc的变量的约束计算中,可能会导致错误,需要注意。
2、randc应用:产生具有唯一元素的数组
a、rand产生具有唯一元素的数组,使用foreach
如下代码所示,使用foreach产生具有唯一元素的数组,此方法会产生4000多个独立约束,从而降低仿真速度。
class UniqueArray;
rand bit[7:0] ua[64];
constraint c {
foreach(ua[i])
foreach(ua[j])
ua[i] != ua[j]
}
endclass
b、使用randc产生唯一元素数组
class UniqueArray;
bit[7:0] ua[64];
randc bit[7:0] val;
foreach(ua[i]) begin
randomize();
ua[i] = val;
$display("ua[%d] = %h",i,ua[i]);
end
endclass
仿真结果如下,val的随机序列的范围为0-255,所以取64个值不会重复。