其他分享
首页 > 其他分享> > 【SystemVerilog基础】数组中随机选取一个元素的方法

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

作者:互联网

文章目录

随机抽取一个元素的方法

SystemVerilog 没有提供专门从数组中选取一个元素的方法。但可以另辟蹊径实现:

如果想从一个关联数组中随机选取一个元素,需要逐个访问它之前的元素,原因是没办法能够直接访问到第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

标签:aa,count,idx,选取,range,数组,urandom,SystemVerilog
来源: https://blog.csdn.net/ReCclay/article/details/122706741