Unique Constraint

本文探讨了Verilog中的'unique' constraint如何确保随机数组、关联数组和动态数组中生成的随机值无重复。通过实例演示了如何在distClass和aClass中应用unique constraint,并展示了其在避免重复值生成上的效果。
摘要由CSDN通过智能技术生成

如果不希望组中的任何两个成员在随机化后具有相同的值,需要使用“unique”constraint。“unique”是一个关键词,使用“unique”将生成受约束的 rand 变量的唯一值。它不仅适用于静态数组,在关联数组,动态数组,队列中都可以使用。

Unique Constraint

看一个例子:

class distClass;
  rand bit [1:0] data1, data2, data3, data4;
  rand bit [1:0] addr1, addr2, addr3, addr4;
  constraint distr   {  unique {data1, data2, data3, data4}; }
                      //'unique' random
  constraint distr1  {  {addr1, addr2, addr3, addr4}; }
                      //non-unique random
endclass
module top;
    distClass dc = new ();
    initial begin
      for (int i = 0; i < 5; i++) begin
        dc.randomize();
        $display ("data1=%0d data2=%0d data3=%0d data4=%0d",dc.
data1, dc.data2, dc.data3, dc.data4);
        $display ("addr1=%0d addr2=%0d addr3=%0d addr4=%0d",dc.
addr1, dc.addr2, dc.addr3, dc.addr4);
        $display("\n");
      end
    end
endmodule

模拟结果:

Compiler version S-2021.09; Runtime version S-2021.09; Aug 20 09:33 2022
data1=3 data2=1 data3=0 data4=2
addr1=3 addr2=2 addr3=3 addr4=1


data1=2 data2=1 data3=0 data4=3
addr1=1 addr2=1 addr3=0 addr4=1


data1=0 data2=2 data3=3 data4=1
addr1=2 addr2=2 addr3=0 addr4=1


data1=0 data2=1 data3=2 data4=3
addr1=3 addr2=1 addr3=3 addr4=2


data1=2 data2=1 data3=3 data4=0
addr1=3 addr2=1 addr3=3 addr4=2


V C S S i m u l a t i o n R e p o r t

data1 到 data4 是随机的,但不会在集合中有重复值出现。但是 addr1 到 addr4 似乎常规随机化,可能会有重复值出现。

队列,动态数组,和关联数组的例子:

class aClass;
   rand bit [1:0] addr [ ] = {1,2,3,4}; //dynamic array
   rand bit [7:0] St [string] = '{"Peter":26, "Paul":24};
                                  //associative array
   rand bit [7:0] dq2[$] = { 3, 2, 7, 1 }; //queue
   constraint addrC {unique {addr};}
   constraint strC {unique {St};}
   constraint dq2C {unique {dq2};}
  endclass
  module tb;
    initial begin
      aClass aC = new ( );
      for (int i = 0; i < 4; i++) begin
        aC.randomize();
        $display ("addr=%p St=%p dq2=%p", aC.addr, aC.St, aC.dq2);
      end
    end
  endmodule

仿真结果:

Compiler version S-2021.09; Runtime version S-2021.09; Aug 20 09:38 2022
addr='{'h3, 'h1, 'h0, 'h2} St='{"Paul":'h97, "Peter":'heb} dq2='{'hc3, 'hbc, 'h5a, 'h5f}
addr='{'h2, 'h1, 'h0, 'h3} St='{"Paul":'h37, "Peter":'h7} dq2='{'h80, 'ha5, 'h49, 'hec}
addr='{'h0, 'h2, 'h3, 'h1} St='{"Paul":'h91, "Peter":'h44} dq2='{'h10, 'h14, 'he3, 'hff}
addr='{'h0, 'h1, 'h2, 'h3} St='{"Paul":'h2f, "Peter":'hbb} dq2='{'h41, 'ha6, 'h56, 'h49}
V C S S i m u l a t i o n R e p o r t

F:Unique Constraint 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值