randcase 重み付きランダムセレクタ SystemVerilog

はじめに

randcaseは重み付きのランダムセレクタを作成できます。

使い方

randcase
  w1 : x = 1;
  w2 : x = 2;
endcase

上記は、x がw1/(w1 + w2) の確立で1, w2/(w1 + w2) の確立で2 になるセレクタです。

サンプル

サンプル1

下記は、a が1/4で1, 3/4で2 になるセレクタです。

module top();
    int a;
    initial begin
        randcase
            1: a = 1;
            3: a = 2;
        endcase
        $display("%d", a);
    end
endmodule
// 出力
// 1 or 2

重みを変数にする

重みは変数にすることもできます。

module top();
    int a;
    int b;
    initial begin
        randcase
            1: b = 1;
            3: b = 2;
        endcase
        $display("%d", b);

        randcase
            b: a = 1; // bは変数。1/2 or 1/4でa = 1となる。
            1: a = 2;
        endcase
        $display("%d", a);
    end
endmodule

確率を確認する

下記は、a が1/4で1, 3/4で2 になるセレクタです。10,000回ルールさせて、それぞれ1, 2が何回出現するか計測します。

module top();
    int a;
    int cnt1;
    int cnt2;
    initial begin
        cnt1 = 0;
        cnt2 = 0;
        repeat(10000) begin
            randcase
                1: a = 1;
                3: a = 2;
            endcase
            if (a == 1)
                cnt1 += 1;
            else if (a == 2)
                cnt2 += 1;
        end
        $display("%d", cnt1);  // 約2500
        $display("%d", cnt2);  // 約7500
    end
endmodule

まとめ

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

コメント

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