制約をON/OFFする constraint_mode SystemVerilog

はじめに

同じランダム変数で複数パターンのconstraintを定義したいことがあります。

しかし、constraintが競合しているとrandomize()がFailします。そこで、constraint_modeを使用することで、使用しないconstraintをOFFできます。

使い方

<クラス変数>.<constraint>.constraint_mode(0 or 1);
// 0で<constraint>がOFF
// 1で<constraint>がON

constraint_mode()の戻り値は、現在のconstraintブロックのON/OFF状態です。

サンプル

constraintをON/OFFする

module top();
    class sample;
        rand int val;
        constraint c1{
            val == 1;
        };
        constraint c2{
            val == 2;
        };
    endclass

    sample a;
    initial begin
        a = new();
        a.c1.constraint_mode(0);
        a.c2.constraint_mode(1);
        a.randomize();
        $display("%d", a.val);  // c2がONなので、valは2。
    end
endmodule

constraintブロックの状態を確認する

module top();
    class sample;
        rand int val;
        constraint c1{
            val == 1;
        };
        constraint c2{
            val == 2;
        };
    endclass

    sample a;
    initial begin
        a = new();
        a.c1.constraint_mode(1);
        a.c2.constraint_mode(0);
        a.randomize();
        $display("%d", a.val);  // c1がONなので、valは1。
        $display("%d", a.c1.constraint_mode());  // c1はONなので1。
        $display("%d", a.c2.constraint_mode());  // c2はOFFなので0。
    end
endmodule

まとめ

constraint_modeについてまとめました。

コメント

タイトルとURLをコピーしました