一、句柄的传递
- 句柄可以作为形式参数通过方法来完成对象指针,从外部传入方法内部
- 句柄也可以在方法内部首先完成修改,而后再由外部完成使用
function void create(ref Transaction tr); //ref或者inout
tr = new();
tr.addr = 100;
...
endfunction
Transaction t; //此时t=null
initial begin
create(t);
t.addr = 10;
$display(t.addr);
end
二、句柄的动态修改
在程序执行时,可以在任何时刻为句柄创建新的对象,并将新的指针赋值给句柄
task generate_trans();
Transaction t;
Transaction fifo[$];
t = new();
for(int i = 0; i < 3; i++) begin //通过for循环向队列里存放了3个句柄,而不是存放了3个对象
t.addr = i << 2;
fifo.push_back(t);
end
t = fifo.pop_front(); //从队头取出第一个元素,此时t.addr=8
endtask
这个程序只创建了一个对象t,for循环的三次修改的其实是同一个对象的addr值,队列里面存放的是指向同一个对象t的上三个句柄,而并不是存放了三个不同的对象。所有最后addr的值为8。