【SystemVerilog基础】数组中随机选取一个元素的方法

文章目录

随机抽取一个元素的方法

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
上一篇:Alkene-PEG2000-Alkene,乙烯基PEG2000乙烯基,烯丙基PEG2000烯丙基


下一篇:虎年兴「书」礼,速来认领国际发布物,对话行业翘楚 #1月期