distの重みづけの動作確認 SystemVerilog

distでrand変数に重みづけする

distでrand変数に重みづけができます。

動作確認してみます。

「:=」の動作確認

0:10%, 1:30%, 2:30%, 4:30%

の出現確率で10,000回実行します。

module top;
    class A;
        rand bit [3:0] a;
        constraint c1{
            a dist {0 := 10, 1 := 30, [2:3] := 30};
            // a dist {0 :/ 10, 1 :/ 30, [2:3] :/ 60};
        }
    endclass

    A a;
    int cnt[4];
    initial begin
        a = new();

        foreach(cnt[i]) begin
            cnt[i] = '0;
        end

        repeat(100000) begin
            a.randomize();
            cnt[a.a] = cnt[a.a] + 1;
        end

        foreach(cnt[i]) begin
            $display("%d: %d", i, cnt[i]);
        end
    end
endmodule
実行結果
0:        9966
1:       30076
2:       30051
3:       29907

「:/」の動作確認

0:10%, 1:30%, 2:30%, 4:30%

の出現確率で10,000回実行します。

module top;
    class A;
        rand bit [3:0] a;
        constraint c1{
            // a dist {0 := 10, 1 := 30, [2:3] := 30};
            a dist {0 :/ 10, 1 :/ 30, [2:3] :/ 60};
        }
    endclass

    A a;
    int cnt[4];
    initial begin
        a = new();

        foreach(cnt[i]) begin
            cnt[i] = '0;
        end

        repeat(100000) begin
            a.randomize();
            cnt[a.a] = cnt[a.a] + 1;
        end

        foreach(cnt[i]) begin
            $display("%d: %d", i, cnt[i]);
        end
    end
endmodule
実行結果
0:       10025
1:       29929
2:       29999
3:       30047

まとめ

それっぽくなりました。

コメント

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