乱数を生成するrandomize()の制約(constraint)の一つ、uniqueについて使用例をまとめます。

乱数の制約uniqueは対応しているツールに制限が大きいような気がしています。少なくとも無料で使うことのできるVivado(vsim)やiverilogなどで使用していた特定のバージョンでは使うことができませんでした。

有償ツールであれば、たいていのベンダーのもので対応しているんでしょうか?




unique制約で乱数の重複を無くす


乱数で生成する値の組をそれぞれの値がユニーク(かぶりが無いよう)に、制限することができます。それぞれが独立した値を取る組み合わせの信号などに対して便利につかうことができます。

組み合わせにおける重複防止:SystemVerilog

class Transaction;
    rand bit                x;
    rand bit  [(2-1):0]     y;
    rand bit  [(2-1):0]     z;
    rand bit                m; 
    // random constraint
    constraint c1 {
        unique {x, y, z, m};
    }
endclass
//- Instance
Transaction tr = new();
initial begin
    repeat(10) begin
        if(!tr.randomize()) $finish;
        $display("x : %d,  y : %d,  z : %d,  m : %d", tr.x, tr.y, tr.z, tr.m);
    end
    $finish();
end

組み合わせにおける重複防止:実行結果

unique {x, y, z, m};
----------------------------
x : 1,  y : 3,  z : 2,  m : 0
x : 0,  y : 2,  z : 3,  m : 1
x : 1,  y : 3,  z : 2,  m : 0
x : 1,  y : 2,  z : 3,  m : 0
x : 1,  y : 3,  z : 2,  m : 0
x : 1,  y : 3,  z : 2,  m : 0
x : 0,  y : 2,  z : 3,  m : 1
x : 0,  y : 2,  z : 3,  m : 1
x : 1,  y : 3,  z : 2,  m : 0
x : 1,  y : 3,  z : 2,  m : 0
実行結果を見ると、x, y, z, mの値の組に各反復において重複した値を取っていないことが分かると思います。

zとmは1bitの信号なので、必ずどちらかが1、どちらかが0になっています。また、yとzについても、0~3の値を取ることができますが、xとmが0と1を必ず取るため、yかzが3か2をどちらかが必ず取る組み合わせとなっていることが分かります。



uniqueと他の制約との組み合わせ


下記は、uniqueとinsideのように、ほかの制約と組み合わせることも可能ということを示す例です。

unique+inside:SystemVerilog

class Transaction;
    rand bit                x;
    rand bit  [(8-1):0]     y;
    rand bit  [(2-1):0]     z;
    rand bit                m; 
    // random constraint
    constraint c1 {
        unique {x, y, z, m};
        y   inside  {1, 100, 255};
    }
endclass
//- Instance
Transaction tr = new();
initial begin
    repeat(10) begin
        if(!tr.randomize()) $finish;
        $display("x : %d,  y : %d,  z : %d,  m : %d", tr.x, tr.y, tr.z, tr.m);
    end
    $finish();
end

unique+inside:実行結果

unique {x, y, z, m};
y  inside {1, 100, 255};
----------------------------
x : 1,  y : 255,  z : 3,  m : 0
x : 0,  y : 100,  z : 2,  m : 1
x : 1,  y : 255,  z : 2,  m : 0
x : 1,  y : 100,  z : 3,  m : 0
x : 1,  y : 255,  z : 3,  m : 0
x : 1,  y : 255,  z : 2,  m : 0
x : 0,  y : 100,  z : 3,  m : 1
x : 0,  y : 100,  z : 3,  m : 1
x : 1,  y : 255,  z : 3,  m : 0
x : 1,  y : 255,  z : 2,  m : 0
ここでは、yに1、100、255のパターンを取ることが出来ますが、uniqueを用いてxかmに必ず1が取られるため、yに1が取られることはありません。



randomize()制約一覧






実行環境
・https://www.edaplayground.com/
(Aldec Riviera Pro 2022.04)

このエントリーをはてなブックマークに追加
コメントを閉じる

コメント

コメントフォーム
記事の評価
  • リセット
  • リセット