SystemVerilog:pre/post_randomize()
SystemVerilogのランダム生成には、以下の functionが存在します。
- IEEE1800-2012引用:
18.6.2 Pre_randomize() and post_randomize()
Every class contains pre_randomize() and post_randomize() methods, which are automatically called by randomize() before and after computing new random values.
ということで、実験してみました。
- サンプルコード
class hoge; rand int a,b; function void pre_randomize(); $display("[PRE] Randomize Data a=%0d, b=%0d", a, b); endfunction function void post_randomize(); $display("[POST] Randomize Data a=%0d, b=%0d", a, b); a -= 'hFFFFFFF; endfunction endclass module testbench (); initial begin hoge data = new; repeat(4) begin assert(data.randomize()); $display("[RAND] Randomize Data a=%0d, b=%0d", data.a, data.b); $display(""); end end endmodule: testbench
- 実行結果
# # [PRE] Randomize Data a=0, b=0 # [POST] Randomize Data a=-374178239, b=93512683 # [RAND] Randomize Data a=-642613694, b=93512683 # # [PRE] Randomize Data a=-642613694, b=93512683 # [POST] Randomize Data a=-1608943979, b=-991314362 # [RAND] Randomize Data a=-1877379434, b=-991314362 # # [PRE] Randomize Data a=-1877379434, b=-991314362 # [POST] Randomize Data a=1698915539, b=-2118036294 # [RAND] Randomize Data a=1430480084, b=-2118036294 # # [PRE] Randomize Data a=1430480084, b=-2118036294 # [POST] Randomize Data a=1011260526, b=1609748398 # [RAND] Randomize Data a=742825071, b=1609748398
実行結果を見て頂ければわかると思いますが、 変数 aだけランダマイズ後に値引いてます。 これは色々応用出来ると思います。