System verilog 输出*E,TRNULLID:NULL指针解引用。系统验证日志

System verilog 输出*E,TRNULLID:NULL指针解引用。系统验证日志,system-verilog,System Verilog,为什么这段代码没有给出输出。当我改变t1=new(p)时。它很好用 但给出几行的错误 ncsim>运行10 20 256 ncsim:*E,TRNULLID:NULL指针解引用 虽然它不打印 $显示(t1.p.i); $display(t2.p.i) 尝试访问不存在的对象时发生空指针错误 对于t1=new()。沿着缺少输入p的线的东西。将t1=new()。这是因为输入变量的名称和成员变量的名称相同。当您new编辑tx内部的p时,它使用了输入变量,因为它的作用域更近。由于已将新对象指定给输入控制柄

为什么这段代码没有给出输出。当我改变t1=new(p)时。它很好用 但给出几行的错误

ncsim>运行10 20 256 ncsim:*E,TRNULLID:NULL指针解引用

虽然它不打印 $显示(t1.p.i);
$display(t2.p.i)

尝试访问不存在的对象时发生空指针错误

对于
t1=new()。沿着缺少输入p的线的东西。将
t1=new()。这是因为输入变量的名称和成员变量的名称相同。当您
new
编辑
tx
内部的
p
时,它使用了输入变量,因为它的作用域更近。由于已将新对象指定给输入控制柄,因此原始控制柄不会指向同一对象。如果将方向性定义为
inout
ref
作为推断输入,则指向同一对象。成员
p
仍然为空

解决方案:

  • 更改
    tx
    功能新建(pkt p)
    函数new()。输入
    p
    似乎没有任何作用,因此没有理由使用它
    p=new()
    将分配给
    tx
    的成员变量,因为没有名称冲突
  • tx
    new
    方法中的
    p=new()
    更改为
    this.p=new()
    。这就明确了新变量将应用于成员变量,而不是局部变量
  • 执行解决方案1和2
  • 如果您同时需要
    p
    s而不想执行上述操作,请重命名其中一个并相应地使用

  • 有人在系统verilog上工作过吗。。?这个论坛问得对吗?哪一行给了你错误,你希望它做什么?什么是pkt?t1=new();was错误行。当我将t1=new(p)放入时,代码不知怎么起作用。我不知道这段代码会给出什么输出。但Cadence很少给出像10、20、256这样的输出。然后给出ncsim:*E,TRNULLID:NULL指针解引用。作为错误。我预计产出$display(t1.p.I);我预计$display的输出(t1.p.I)
    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