SystemVerilog softでconstraintを上書きする

はじめに

rand変数で定義した変数はrandomizeで値が確定します。

withを付けることで、インラインで制約を付けることができますが、class内に宣言した制約とconflictするとrandomizeが失敗します。

softを使用することで、上書き可能な制約を付けることができます。

soft

sample1.sv

softを使わないでconstraintを宣言します。

module top();
    class sample;
        rand bit [2:0] val;
        constraint c{
            val == 0;
        }
    endclass
    sample a;
    initial begin
        a = new();
        a.randomize() with {val == 2;};  // Conflictしているのでrandomizeが失敗する。
        $display("%d", a.val);
    end
endmodule

valはclass sampleの中で0に制約づけられていいますが、randomizeでval == 2の制約がかかっています。この場合、conflictしているのでrandomizeが失敗します。

そこでsoftを付けます。

sample2.sv
module top();
    class sample;
        rand bit [2:0] val;
        constraint c{
            soft val == 0;
        }
    endclass
    sample a;
    initial begin
        a = new();
        a.randomize() with {val == 2;};  // randomizeは成功してval == 2となる。
        $display("%d", a.val);
    end
endmodule

val==2が優先されて、randomizeは成功します。

まとめ

constraint でsoftを使用しました。

コメント

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