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

コメント