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だけランダマイズ後に値引いてます。 これは色々応用出来ると思います。