1.句柄的传递
1)句柄可以作为形式参数通过方法来完成对象句柄的传递,从外部传入方法内部。
2)句柄也可以在方法内部首先完成修改,而后再由外部完成使用
例题:下述代码最后显示的t.addr的数值是多少?
function void create (Transaction tr);
tr = new();
tr.addr = 100;
...
endfunction
Transaction t;
initial begin
create(t);
t.addr = 10;
$display (t.addr);
end
解析:tr默认是输入方向,导致句柄t悬空,从而t的值是null,所以执行creat(t)之后t不会发生变化还是null,因为这里t没有返回值,所以执行到t.addr = 10这步会报错。
总结:句柄悬空,无法查找变量。
解决方法:在第一行代码中Transaction前面添加inout/ref。
3)在程序执行时,可以在任何时刻为句柄创建新的对象,并将新的指针赋值给句柄。
例题:t.addr的数值是多少?
task generate trans();
Transaction t;
Transaction fifo [$];
t = new();
for(int i = 0;i<3;i++) begin
t.addr = i << 2;
fifo.push_back(t);
end
t = fifo.pop_front();
endtask
解析:问题的关键是只t = new();只出现一次,即只创建了一个对象,i = 0时,t.addr = 0 ,把第一个句柄放入fifo。i = 1时,t.addr = 2 ,把第二个句柄放入fifo。i = 2时,t.addr = 8 ,把第三个句柄放入fifo。当三个句柄都放好之后,因为只声明一个对象,所以三个句柄都会指向最后的t.addr = 8,即便时从后放,从前面拿,拿到的是第一个句柄指向的对象,仍然是t.addr = 8。
如果把t = new()放入for循环里面,就会声明三个对象,那么第一个句柄指向的就是t.addr = 0。