文章目录
随机抽取一个元素的方法
SystemVerilog 没有提供专门从数组中选取一个元素的方法。但可以另辟蹊径实现:
- 对于定宽数组、队列、动态数组和关联数组可以使用
$urandom_range($size(array)-1)
- 而对于队列和动态数组还可以使用
$urandom_range(array.size()-1)
如果想从一个关联数组中随机选取一个元素,需要逐个访问它之前的元素,原因是没办法能够直接访问到第N个元素。下面程序示范了如何从一个以整数值作为索引**的关联数组中随机选取一个元素。
注:如果数组是以字符串作为索引,只需要将idx的类型改为
string
即可。
initial begin
//declare
int aa[int], idx=1, rand_idx, element, count;
//initial
repeat(10) begin
//$display("**** idx = %d ***", idx);
aa[idx] = idx;
idx = idx << 1;
//$display("**** idx = %d ***", idx);
end//when repeat is finish, idx value is 0.
foreach(aa[i])
$display("***aa[%0d] = %0d",i, aa[i]);
//下面这一段有点意思,可以好好品一品
element = $urandom_range(aa.size()-1);
$display("****element=%0d", element);
foreach(aa[i])
if(count++ == element) begin
rand_idx = i;
break;
end
$display("****%0d element aa[%0d]=%0d", element, rand_idx, aa[rand_idx]);
end
输出:
***aa[1] = 1
***aa[2] = 2
***aa[4] = 4
***aa[8] = 8
***aa[16] = 16
***aa[32] = 32
***aa[64] = 64
***aa[128] = 128
***aa[256] = 256
***aa[512] = 512
****element=8
****8 element aa[256]=256
其中,代码:
foreach(aa[i])
if(count++ == element) begin
rand_idx = i;
break;
end
相当于代码:
foreach(aa[i]) begin
if(count == element) begin
rand_idx = i;
break;
end
count = count + 1;
end
常用的随机数函数
函数 | 功能 |
---|---|
$random() |
平均分布,返回32位有符号随机数 |
$urandom() |
平均分布,返回32位无符号随机数 |
$urandom_range() |
在指定范围内的平均分布 |
$dist_exponential |
指数衰落 |
$dist_normal |
正态分布 |
$dist_poisson |
泊松分布 |
$dist_uniform |
平均分布 |
$urandom_range()
函数有两个参数,一个是上限参数和一个可选的下限参数。
a = $urandom_range(3, 10); //值的范围是3~10
a = $urandom_range(10, 3); //值的范围是3~10;上下限可倒置
a = $urandom_range(5); //值的范围是0~5