【SystemVerilog】randomize()でクラスのrand変数を確定する

Systemverilog

randomize()

systemverilogではclass内の変数をランダム変数(rand)で宣言することができます。

randで宣言された変数は、classのbuilt-in methodであるrandomize()で確定されます。

module top;
    class Tmp;
        rand bit [3:0] a;
    endclass

    initial begin
        Tmp tmp;
        tmp = new();
        if (tmp.randomize())  // 成功なら1、失敗なら0が返る。
            $display("%d", tmp.a);
        else
            $display("ERROR");
    end
endmodule
// 出力
// 10

pre_randomize()/post_randomize()

built-in methodであるrandomize()を実行すると、前後にpre_randomize()/post_randomize()が実行されます。これらもsystemverilogのclassのbuilt-in methodです。

module top;
    class Tmp;
        rand bit [3:0] a;

        function void pre_randomize();
            $display("Pre");
        endfunction

        function void post_randomize();
            $display("Post");
        endfunction
    endclass

    initial begin
        Tmp tmp;
        tmp = new();
        if (tmp.randomize())  // 成功なら1、失敗なら0が返る。
            $display("%d", tmp.a);
        else
            $display("ERROR");
    end
endmodule
// 出力
// pre
// Post
// 10

constraint(ランダム変数を確定する)

constraintでランダム変数に制約を付けることができます。

多くの記法があるので、詳しくはまた別の機会に説明したいと思います。

module top;
    class Tmp;
        rand bit [3:0] a;

        constraint c {
            a > 1;
            a < 10;
        }
    endclass

    initial begin
        Tmp tmp;
        tmp = new();
        if (tmp.randomize())
            $display("%d", tmp.a);
        else
            $display("ERROR");
    end
endmodule
// 出力
// 7

まとめ

classのbuilt-in methodであるrandomize()とその周辺について解説しました。

コメント

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