您好,登錄后才能下訂單哦!
這篇文章給大家介紹SystemVerilog中$cast方法的作用是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
$cast是systemverilog中的內建方法。
$cast可以對不同的內建類型進行轉換,用的更多的是不同層次之間類的轉換。在這種父類與子類之間的轉換里, 父類站的高,子類在底下,從父類向子類的轉換,稱為向下類型轉換,而子類向父類的轉換稱為向上類型轉換。向上類型轉換是安全的,而反之則是不安全的。原因在于子類既然繼承了父類,就擁有父類的一切屬性,除此之外,龍生九子,各有不同,子類還有自己獨特的個性,這些是父類沒有的。當進行向上類型轉換時,相當于父類的句柄指向子類對象,這樣的話句柄仍然能對子類對象與父類相同的屬性進行訪問。但是反過來,如果向下類型轉換也那么自由,當試圖把子類的句柄指向父類的對象會發生什么呢?父類本來劃好了一小塊地盤,但是因為子類含有比父類更豐富的屬性,它很有可能會訪問父類并不包含的資源,這時就找不到該資源,越界了,因此會有error。父類就好像上海,子類相當于長三角地區,包含但不僅僅是上海,因此父類能到的地方子類都可以到,反之不行,因此把子類的句柄給父類沒關系,但反之不行,所以向下類型是需要有嚴格的類型檢查的,阻止非法轉換。
ex1:
class father;
string m_name;
function new (string name);
m_name = name;
endfunction : new
function void print ();
$display("Hello %s", m_name);
endfunction : print
endclass : father
class child1 extends father;
string area1 = "jiangzhehu";
function new (string area1);
super.new(area1);
endfunction : new
endclass : child1
class child2 extends father;
string area2 = "shanghai";
function new (string area2);
super.new(area2);
endfunction : new
endclass : child2
program top;
father f;
child1 c10,c11,c12;
child2 c20,c21,c22;
initial begin
f = new ("shanghai");
f.print();
c10 = new("jiangzhehu");
f = c10;
f.print();
c20 = new("changsanjiao");
f = c20;
f.print();
c20.area2 = "zhejiang";
$cast(c21, f);
c21.print();
$display("has %s", c21.area2);
c22 = c20;
c22.print();
$display("has %s", c22.area2);
c20.area2 = "hangzhou";
c21.print();
$display("has %s", c21.area2);
c22.print();
$display("has %s", c22.area2);
end
endprogram : top
仿真結果如下:
# Hello shanghai# Hello jiangzhehu# Hello changsanjiao# Hello changsanjiao# has zhejiang# Hello changsanjiao# has zhejiang# Hello changsanjiao# has hangzhou# Hello changsanjiao# has hangzhou
請注意,不能直接把$cast(c21, f);前提是先把子類賦給父類才行。
使用cast也不能把c20給c10;
關于SystemVerilog中$cast方法的作用是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。