Systemverilog(綠皮書)第八章——OOP進階(一)類型轉換

class Transaction;        //父類
    rand bit [31:0] src;
    function void display(input string prefix = "");      //成員函數display
        $display("%sTransaction: src = %0d", prefix, src);
    endfunction
 endclass
class BadTr extends Transaction;    //子類
    bit bad_crc;
    function void display(input string prefix="");        //同名函數display
        $display("%sBadTr: bad_crc = %b", prefix, bad_crc);
        super.display(prefix);                            //子類調用了父類
    endfunction
endclass

Transaction tr;    //聲明父類句柄
BadTr bad;         //聲明子類句柄
bad = new();       //構建BadTr擴展對象
tr = bad;          //基類句柄指向擴展對象
$display(tr.src);  //通過父類句柄查找src
tr.display();      //調用父類的display;

若將父類直接賦值給子類,則會報錯。即便做了$cast(tgt,src)轉換,編譯結果爲0。

只有源對象和 目標句柄是同一類型,或者目的句柄的擴展類,$cast()函數執行 成功,返回1,否則返回0.

class Transaction;        //父類
    rand bit [31:0] src;
    function void display(input string prefix = "");      //成員函數display
        $display("%sTransaction: src = %0d", prefix, src);
    endfunction
 endclass
class BadTr extends Transaction;    //子類
    bit bad_crc;
    bit bad2;
    function void display(input string prefix="");        //同名函數display
        $display("%sBadTr: bad_crc = %b", prefix, bad_crc);
        super.display(prefix);                            //子類調用了父類
    endfunction
endclass

Transaction tr;    //聲明父類句柄
BadTr bad;         //聲明子類句柄
bad = new();       //構建BadTr擴展對象
tr = bad;          //基類句柄指向擴展對象
$cast(bad2,tr);    //進行類型轉換
bad2.display();

最後bad2.display 調用子類中的display。

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