[SV]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}}

 

 

 

 

 

  • 10
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元直数字电路验证

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值