Systemverilog(綠皮書)第五章——類與對象(四)句柄的使用

由於句柄可以作爲函數的參數進行傳遞,此時就涉及 一個問題, 函數參數方向的問題。若不給函數形式參數指明方向可能會出現報錯。

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, 我們將三次 對象的句柄分別放存儲而此時,只有一個對象,對象的句柄也就是一個相同的值

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章