[SystemVerilog] newでの生成エラー実装を検討する。

先日の SystemVerilog読書会でふと疑問に思ったことがあった。

クラス生成時(new)にて、引数値が想定外だと検出する機構も持たせたとして、 newされていない(null)にしたい場合はどうすればいんだろうか?

これって、どうすればいいんだろうか?


序章

class hoge;
  int int_tmp = 4;
  function new(int a);
    int_tmp = a;
  endfunction
endclass

module testbench;

  hoge cl_hoge;

  initial begin
    if(cl_hoge == null) begin
      $display("Error hoge is NULL.");
      $finish;
    end
    $display("--- cl_hoge.int_tmp  = %3d",cl_hoge.int_tmp );
    $finish;
  end

endmodule
  • 実行結果
  • $> make
    # Error hoge is NULL.
    

こちらは、newしていないため当然かと思います。

  hoge cl_hoge = new(10);

とすると、

$> make
# --- cl_hoge.int_tmp  =  10

となります。


本題

では、new 引数の値が作成したクラスの想定外な値の場合にはどうするか?
例えば、10以上の値を禁止しているとします。

class hoge;
  int int_tmp = 4;
  function new(int a);
    if(> 9) new     = null;
    else      int_tmp = a;
  endfunction
endclass

こんな記述は出来ないか?。。。
出来ません

** Error: test.sv|4| near "new": syntax error, unexpected new

では、どのように作るのが一般的なんだろうか???
人それぞれだと思いますが、私ならこう書くと思います。

class hoge;
  local bit m_valid;
  int int_tmp = 4;
  function new(int a);
    int_tmp = a;
    if(> 9) m_valid = 0;
    else      m_valid = 1;
  endfunction

  function bit valid();
    valid = m_valid;
  endfunction
endclass

module testbench;

  hoge cl_hoge = new(10);

  initial begin
    if(cl_hoge.valid() == 0) begin
      $display("Error hoge is NULL.");
      $finish;
    end
    $display("--- cl_hoge.int_tmp  = %3d",cl_hoge.int_tmp );
    $finish;
  end
endmodule
  • 判定の関数を用意する。
  • 判定の内部信号は localにする。

といった感じでしょうか。
俺だったらこう書くといったのがあれば教えてください。


あっ!引数の値とかに constraint 書けないかなー


さて、このような疑問も生まれてくる SystemVerilog読書会を
毎週土曜日に開催しています。
次回は、以下の通りです。是非、気軽にご参加ください♪

  • 日時:2013/5/4(土) 22:30~
  • 内容:8. Classes(part II) - 8.16 Casting
関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

Author:Kocha
なんでもチャレンジ!(^o^)/
E-mail
github:Kocha
イベントカレンダー

カレンダー
05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数