2017-05-05 128 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 =新(p)。它工作正常 但給幾行錯誤輸出* E,TRNULLID:空指針取消引用。系統verilog

ncsim> run 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老兄最新的代碼問題以及美學...?直接投票....如果你不能解決問題。離開它爲什麼投票下來.. – Aviator

回答

0

嘗試訪問不存在的對象時發生空指針錯誤。

對於t1 = new()的情況,編譯/製作日誌中應該有警告。一些沿着缺少輸入的線p。將t1 = new()更改爲t1 = new(p)可能會更改,以解決該行上的錯誤,但t1.p仍然爲空。這是因爲輸入變量與成員變量具有相同的名稱。當你new編輯ptxnew裏面時,它使用了輸入變量,因爲它的範圍更接近。由於您將新對象分配給輸入句柄,因此原始句柄不指向同一對象。如果您將方向性定義爲inoutref,而不是作爲推斷的輸入,它將指向相同的對象。成員p仍爲空。

解決方案:

  1. 變化txfunction new (pkt p);function new();。輸入p似乎沒有做任何事情,所以沒有理由擁有它。 p = new()將被分配到tx的成員變量,因爲沒有名稱衝突。
  2. 更改p = new()this.p = new()txnew的方法。這明確表示新的將應用於成員變量,而不是本地。
  3. 同時執行解決方案1和2.
  4. 如果您同時需要p並且您不想執行上述操作,請重命名並相應地使用。