1

私の質問は、SV で $cast を使用することに関するものです。以下のコードでキャストという単語を検索すると、意図的に「!」が追加されています。失敗したキャストをチェックします。キャストが失敗した場合、bobsquare.bob(); を呼び出すとどうなるかを確認したかったのです。call_bob がポリゴン 'p' へのハンドルで呼び出される time=1ms で、square クラスの関数 'bob' が呼び出されて表示ステートメントを実行することに驚きました。どうすればそれが可能になりますか?Cadence の irun で実行し、SV クラス ブラウザーでデバッグしたところ、時間 = 1 ミリ秒でbobsquareにメモリ領域が割り当てられておらず、ポインタとして NULL が設定されていることがわかりました。ありがとう!

class figure;

endclass

class polygon extends figure;

  virtual function void draw();
    $display("polygon::draw");
  endfunction

endclass

class square extends polygon;

  virtual function void draw();
    $display("square::draw");
  endfunction

  function void compute_area();
    $display("square::compute_area");
  endfunction

  function void bob();
     $display("square::I am bob");
     $display("%t", $realtime);     
  endfunction

endclass

program top;
  polygon p;
  square s;

  initial begin
    s = new();
    p = new();

     #1ms;
     call_bob(p);
     #1ms;
     call_bob(s);     
  end // initial begin
   task call_bob(figure generic_ref_figure);
      square bobsquare;      
      if (!($cast(bobsquare, generic_ref_figure)))
         bobsquare.bob();
   endtask // call_bob

endprogram
4

1 に答える 1

0

IEEE Std 1800-2012 § 8.4 (および IEEE Std 1800-2005 § 7.4) は次のように述べています。

null オブジェクト ハンドルを介して非静的メンバー (8.9 を参照) または仮想メソッド (8.20 を参照) にアクセスすることは違法です。null オブジェクトを介した不正なアクセスの結果は不確定であり、実装によってエラーが発生する場合があります。

デフォルトのメソッド タイプで何が起こるべきかについての参照を見つけることができませんでした。LRM に基づくと、メソッドが非静的メンバーを呼び出していない限り、null オブジェクト ハンドルを介して非仮想メソッドを呼び出すことは合法であると思われます。

メソッド bobvirtualを作成して、null オブジェクト ハンドル エラーを取得します。

于 2013-07-24T16:59:53.457 に答える