我是靠谱客的博主 背后煎饼,最近开发中收集的这篇文章主要介绍[SV]SystemVerilog中队列和数组的约束和随机化              Randomize Queue and Array in SystemVerilog,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

              Randomize Queue and Array in SystemVerilog

 

       前言:在大多数队列用例中,队列被用作缓冲区或临时存储。所以不需要太多的随机队列。

 

一、randomize queue size

在下面的例子中,队列大小将根据大小约束进行随机化,队列元素将获得随机值:

  • 使用rand声明队列
  • 对随机化的队列将得到随机值
class queue_rand;
  rand bit [7:0] qu[$];
  
  constraint size_c  { qu.size() inside {[4:10]}; }
  
  function void display();
    $display("qu size is = %0d",qu.size());
    $display("qu = %p",qu);
  endfunction
endclass

program queue_randomization;
  queue_rand pkt;

  initial begin
    pkt = new();
    pkt.randomize();
    pkt.display();   
  end
endprogram 
  • Simulator Output
qu size is = 7
qu = '{'h88, 'h9b, 'h9a, 'h10, 'h5f, 'hde, 'h84}

 

二、SystemVerilog Randomize Array

       大多数数组使用应用程序需要数组的随机化。数组大小和数组元素都可以随机化。

 

 2.1、Fixed Size Array Randomization

       在一个固定大小的数组中,只能对数组元素进行随机化。由于大小是固定的,所以不可能更改。

 

 2.2、为数组元素生成随机值

       在下面的示例中,将为数组元素生成随机值。

  • 将数组声明为rand
  • 在随机化中,数组将得到随机值
class fs_array;
  rand bit [3:0] array1[4];
  rand bit [7:0] array2[6];
  
  function void display();
    $display("array1 = %p",array1);
    $display("array2 = %p",array2);
  endfunction
endclass

program fixedsize_array_randomization;
  fs_array pkt;

  initial begin
    pkt = new();
    pkt.randomize();
    pkt.display();   
  end
  
endprogram 
  •  Simulator Output
array1 = '{'he, 'h4, 'h4, 'h8} 
array2 = '{'h9b, 'h9a, 'h10, 'h5f, 'hde, 'h84}

 

 2.3、在数组中生成唯一的元素

       在上面的例子中,我们已经看到了随机值的随机化。下面的例子展示了使用shuffle数组方法的唯一值的随机化。

  • 约束数组的元素值与索引值相同
  • 在后随机化中对数组进行洗牌,使数组不具有递增值。
class fs_array;
  rand bit [7:0] array1[6];
  
  constraint array_c { foreach(array1[i]) array1[i] == i;}
  
  function void post_randomize();
    array1.shuffle();  
  endfunction
  
  function void display();
    $display("array1 = %p",array1);
  endfunction
  
endclass

program fixedsize_array_randomization;
  fs_array pkt;

  initial begin
    pkt = new();
    pkt.randomize();
    pkt.display();   
  end
endprogram 
  • Simulator Output
array1 = '{'h2, 'h1, 'h4, 'h0, 'h5, 'h3}

 

 2.4、数组和约束

        在下面的例子中,数组被随机化,所有元素的和等于30。

  • 使用rand声明数组。
  • 使用数组方法sum()约束数组的和。
class fs_array;
  rand bit [7:0] array1[6];
  
  constraint array_c { array1.sum() == 30;}
  
  function void display();
    $display("array1 = %p",array1);
  endfunction
  
endclass

program fixedsize_array_randomization;
  fs_array pkt;

  initial begin
    pkt = new();
    pkt.randomize();
    pkt.display();   
  end
endprogram 
  • Simulator Output
array1 = '{'h7, 'h0, 'h17, 'h0, 'h0, 'h0}

 

 2.5、数组元素的数组和约束

       在前面的示例中,只考虑数组元素的和,数组元素可以取任何值。但是在下面的例子中,数组的和和每个元素的值都是受限的。

  • 使用rand声明数组
  • 使用数组方法sum()约束数组的和。
  • 约束数组元素的值。
class fs_array;
  rand bit [7:0] array1[6];
  
  constraint array_c { array1.sum() == 30;}
  constraint array_c_e { foreach(array1[i]) array1[i] > 2;}
  
  function void display();
    $display("array1 = %p",array1);
  endfunction
  
endclass

program fixedsize_array_randomization;
  fs_array pkt;

  initial begin
    pkt = new();
    pkt.randomize();
    pkt.display();   
  end
endprogram 
  • Simulator Output
array1 = '{'h7, 'h3, 'hb, 'h3, 'h3, 'h3}

 

 2.6、多维数组的约束

       下面的示例显示了带有约束的多维数组的声明和随机化。

cclass fs_array;
  rand bit [7:0] array1[3][4];
  
  constraint array_c { foreach(array1[i,j]) array1[i][j] == i*j;}
  
  function void display();
    $display("array1 = %p",array1);
  endfunction
  
endclass

program fixedsize_array_randomization;
  fs_array pkt;

  initial begin
    pkt = new();
    pkt.randomize();
    pkt.display();   
  end 
endprogram 
  • Simulator Output
array1 = '{'{'h0, 'h0, 'h0, 'h0}, '{'h0, 'h1, 'h2, 'h3}, '{'h0, 'h2, 'h4, 'h6}}

 

 2.7、一个多维数组的求和方法

       在下面的例子中数组的和中,元素是受约束的。

class fs_array;
  rand bit [7:0] array1[3][4];
  
  constraint array_c { array1.sum() == 30;}
  
  function void display();
    $display("array1 = %p",array1);
  endfunction
  
endclass

program fixedsize_array_randomization;
  fs_array pkt;

  initial begin
    pkt = new();
    pkt.randomize();
    pkt.display();   
  end 
endprogram 
  • Simulator Output
array1 = '{'{'h0, 'h0, 'h16, 'h0}, '{'h0, 'h0, 'h0, 'h0}, '{'h0, 'h0, 'h8, 'h0}}

 

 

 

 

 

最后

以上就是背后煎饼为你收集整理的[SV]SystemVerilog中队列和数组的约束和随机化              Randomize Queue and Array in SystemVerilog的全部内容,希望文章能够帮你解决[SV]SystemVerilog中队列和数组的约束和随机化              Randomize Queue and Array in SystemVerilog所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部