randomize()の制約の一つ、implication(->)を使うことで、制約間の関係を指定することができます。

implicationという名前ですが、コード記述内では「->」のような記述方法を使います。以下でこのimplicationの使用方法についてまとめます。




制約implicateの使用例1


変数Xが制約Aのとき、変数Yは制約Bのように、複数の制約間の関係を決定図けることができます。複数制約の重ね掛けが可能だと解釈すると分かりやすいかもしれません。

制約関係指定:SystemVerilog

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

制約関係指定:実行結果

(x == 1) -> (y < 10);
----------------------------
x : 0,  y :  98
x : 1,  y :   5
x : 0,  y : 251
x : 0,  y : 124
x : 1,  y :   2
x : 1,  y :   6
x : 1,  y :   4
x : 1,  y :   5
x : 0,  y :  68
x : 1,  y :   8
実装例8行目では「xが1のとき、yは10以下」という制約を記述しています。

実行結果を見ると、xが1のとき10以下の数になっていることが分かります。



制約implicationの使用例2


以下のような形で、randomize()で頻繁に用いられる制約の複数を重ね掛けることもできます。

制約の組み合わせ:SystemVerilog

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

制約の組み合わせ:実行結果

(z inside {[0:1]}) -> (y inside {[0:99]});
(z inside {[2:3]}) -> (y inside {[100:200]});
----------------------------
y : 187,  z : 3
y :  81,  z : 1
y : 131,  z : 3
y : 111,  z : 3
y :  36,  z : 1
y : 163,  z : 2
y :  90,  z : 1
y :  22,  z : 1
y :   2,  z : 0
y :  75,  z : 1
  • zが0または1のとき、yは99以下
  • zが2または3のとき、yは100以上200以下
のようにしています。実行結果からも、このような関係を読み取ることができます。



randomize()制約一覧



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

コメント

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