由於句柄可以作爲函數的參數進行傳遞,此時就涉及 一個問題, 函數參數方向的問題。若不給函數形式參數指明方向可能會出現報錯。
function void create Transaction (tr);
tr = new();
tr addr = 100;
......
endfunction
Transaction t;
initial begin
create(t);
t.addr = 10;
$display(t.addr);
end
此時,t.addr值報錯。
定義的create函數中的形參值默認情況下,默認爲input。函數執行完之後,不會做任何返回。
而主函數中,聲明瞭句柄t,此時句柄處於懸空的狀態爲null值。對null值 賦值,會造成內存泄漏。
改進的話,在 函數的 形參中,給tr值定義爲ref或者inout。
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
此時,從隊列中取出數據爲多少呢?這裏拿出來的是第一個addr值。
由於整個 環境中,我們只創建了一個對象,new了一次。 三次push_back, 我們將三次 對象的句柄分別放存儲。而此時,只有一個對象,對象的句柄也就是一個相同的值。