随机抽取SV数组中的一个元素方法实现

电子说

1.3w人已加入

描述

SV中没有提供专门从数组中抽取一个元素的方法。但可以通过下面的方法实现:

字符串

module rand_select_array_element();
initial begin
  //declare
  int array[int]; 
  int idx=1;// 
  int rand_idx;//initial value is 0
  int element;//initial value is 0 
  int count=0;
  repeat(10) begin
    $display("**** idx = %d ***", idx);
    array[idx] = idx;
    idx = idx << 1;
  end


  foreach(array[i])
    $display("***array[%0d] = %0d",i, array[i]);


  //下面这一段有意思,好好品一品
  element = $urandom_range(array.size()-1);
  $display("****element=%0d", element);
  foreach(array[i])
    if(count++ == element) begin
      rand_idx = i;
      break;
    end
  $display("****%0d element array[%0d]=%0d", element, rand_idx, array[rand_idx]);


end
endmodule
  其中,代码:
  foreach(array[i])
    if(count++ == element) begin
      rand_idx = i;
      break;
    end
  相当于代码:
  foreach(array[i]) begin
    if(count == element) begin
      rand_idx = i;
      break;
    end
    count = count + 1;
  end

其中$urandom_range() 函数有两个参数,一个是上限参数和一个可选的下限参数

element = $urandom_range(3, 10); //element值的范围是3~10
element = $urandom_range(10, 3); //element值的范围是3~10;上下限可倒置
element = $urandom_range(5);     //element值的范围是0~5
上述代码的仿真结果,如下图所示,element=4,相当于抽取数组array的第5个元素,即 array[16]=16

 

 

字符串

小结:

对于定宽数组、队列、动态数组和关联数组可以使用$urandom_range($size(array)-1)

而对于队列和动态数组还可以使用$urandom_range(array.size()-1)

如果想从一个关联数组中随机选取一个元素,需要逐个访问它之前的元素,原因是没办法能够直接访问到第N个元素。上面的程序示范了如何从一个以整数值作为索引**的关联数组中随机选取一个元素。

注:如果数组是以字符串作为索引,只需要将idx的类型改为string即可。

审核编辑:黄飞

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分