System verilog 输出*E,TRNULLID:NULL指针解引用。系统验证日志
为什么这段代码没有给出输出。当我改变t1=new(p)时。它很好用 但给出几行的错误 ncsim>运行10 20 256 ncsim:*E,TRNULLID:NULL指针解引用 虽然它不打印 $显示(t1.p.i);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时,它使用了输入变量,因为它的作用域更近。由于已将新对象指定给输入控制柄
$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