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()とその周辺について解説しました。
コメント