2017-05-05 14 views
-1
class tx; 
    pkt p; 
    int j; 
    function new (pkt p); 
    p = new(); 
    j =10; 
    endfunction 
    task copy(pkt p); 
    this.p = new p; 
    endtask 
endclass :tx 

initial 
    begin 
    tx t1,t2; 
    pkt p; 

    t1 =new(); 
    p = new(); 

    p.i=256; 

    t2= new t1; 
    t2.j=20; 
    t2.copy(p); 

    $display(t1.j); 
    $display(t2.j); 
    $display(p.i); 
    $display(t1.p.i); 
    $display(t2.p.i); 

    t1.p.i=221; 
    $display(t1.p.i); 
    $display(t2.p.i); 
end 
endprogram 

なぜこのコードで出力が得られないのですか?私がt1 = new(p)を変えたとき。それは 正常に動作しますが、数行のエラーを与える出力* E、TRNULLID:NULLポインタ逆参照。システムのVerilog

NCSIM> 10 20 256 NCSIM実行:* E、TRNULLID:NULLポインタ参照を。

の場合は表示されません。$ display(t1.p.i); $ display(t2.p.i);

+0

システムのVerilogで作業している人はいますか?質問する正しいフォーラムですか? – Aviator

+0

http://stackoverflow.com/help/mcve – toolic

+0

@toolic dudeはコードだけでなく美学も問題にしています... ??あなたが問題を解決できない場合は、直接投票してください。なぜ投票して下さるのですか? – Aviator

答えて

0

存在しないオブジェクトにアクセスしようとすると、ヌルポインタエラーが発生します。

t1 = new()の場合は、コンパイル/エラボレーションログに警告が表示されます。行方不明の行に沿った何かp。 t1 = new()t1 = new(p)を変更すると、その行のエラーが解決されることがありますが、t1.pはまだnullです。これは、入力変数がメンバー変数と同じ名前を持つためです。 newpの中にtxnewの入力変数を使用すると、範囲が狭かったためです。入力ハンドルに新しいオブジェクトを割り当てたため、元のハンドルは同じオブジェクトを指していません。方向性を推測入力として代わりにinoutまたはrefと定義した場合は、同じオブジェクトを指しています。それでもメンバーpはnullになります。

ソリューション:function new();

  1. 変更txさんfunction new (pkt p);。入力pは何もしていないように見えるので、それを持っている理由はありません。 p = new()は、名前の競合がないため、txのメンバー変数に割り当てられます。
  2. p = new()~this.p = new()txnewの方法で変更します。これにより、新しいものがローカル変数ではなくメンバ変数に適用されることが明示されます。
  3. 解決策1と2の両方を実行してください。が必要な場合は、名前を変更してそれに応じて使用してください。
関連する問題