randomize 制約 unique

unique

uniqueはランダム実行時に同じ値を割り振らないオペレータです。

記述例

3bitデータを10回ランダム生成しています。

class c_unique ;
  rand bit [2:0] a00 ;
  rand bit [2:0] b00 ;
  rand bit [2:0] c00 ;

  constraint C01 { unique {a00,b00,c00} ; }
endclass

module test () ;
  c_unique class00 ;

 
  initial begin
    class00 = new() ;
    for(int iii=0;iii<10;iii++) begin
      class00.randomize() ;
      $display("a00=%3d b00=%3d c00=%3d",class00.a00,class00.b00,class00.c00) ;
    end

  $display("constraint C01 disable");
    for(int iii=0;iii<10;iii++) begin
      class00.C01.constraint_mode(0) ;
      class00.randomize() ;
      $display("a00=%3d b00=%3d c00=%3d",class00.a00,class00.b00,class00.c00) ;
    end
  end
endmodule

実行結果

1回目の表示はa00 b00 c00それぞれの値がユニークになるように制約C01を当てたランダム結果です。

2回目の表示は”class00.C01.constrain_mode(0)”で制約C01をOFFにした場合のランダム結果です。

制約を外すとa00とb00やa00とc00で値が重複していることがわかります。

a00=  4  b00=  5  c00=  3
a00=  3  b00=  6  c00=  5
a00=  1  b00=  0  c00=  7
a00=  2  b00=  0  c00=  5
a00=  4  b00=  5  c00=  7
a00=  4  b00=  5  c00=  2
a00=  6  b00=  1  c00=  3
a00=  6  b00=  4  c00=  1
a00=  6  b00=  0  c00=  3
a00=  6  b00=  3  c00=  1
constraint C01 disable
a00=  4  b00=  1  c00=  7
a00=  6  b00=  5  c00=  0
a00=  7  b00=  7  c00=  0
a00=  7  b00=  4  c00=  0
a00=  0  b00=  0  c00=  5
a00=  6  b00=  6  c00=  0
a00=  6  b00=  2  c00=  6
a00=  4  b00=  0  c00=  3
a00=  5  b00=  2  c00=  5
a00=  2  b00=  2  c00=  4

配列のunique

配列内の各ビット内に対してもuniqueが使用できます。

実行例

d00の1ビット目と0ビット目をuniqueに、e00の2番目と3番目をuniqueに設定します。

d00[1]とd00[0]に対してuniqueを、e00[2]とe00[3]に対してuniqueを実行します。

class c_unique ;
  rand bit [2:0] d00 ;
  rand bit [2:0] e00[4] :
  constraint C01 { unique {d00[1],d00[0]} ; }
  constraint C02 { unique {e00[2],e00[3]} ; }

endclass

module test () ;
 
  c_unique classs00 ;

  initial begin
    class00 = new() ;
    for(int iii=0;iii<10;iii++) begin
      class00.randomize() ;
 
      $display("d00=%b e00[2]=%3d e00[3]=%3d",class00.d00,class00.e00[2],class00.e00[3]) ;
    end
  end
endmodule

実行結果

d00は下位2ビットが常に排他となっていることが確認できました。

e00の[2]と[3]についてもユニークな値となっていることが確認できました。

d00=010 e00[2]= 4 e00[3]= 6
d00=010 e00[2]= 7 e00[3]= 5
d00=101 e00[2]= 5 e00[3]= 7
d00=001 e00[2]= 5 e00[3]= 4
d00=010 e00[2]= 1 e00[3]= 3
d00=010 e00[2]= 6 e00[3]= 4
d00=010 e00[2]= 0 e00[3]= 7
d00=010 e00[2]= 1 e00[3]= 3
d00=010 e00[2]= 0 e00[3]= 2
d00=101 e00[2]= 1 e00[3]= 2

コメント

Copied title and URL