要想理解清楚SystemVerilog語言中的Upcasting和Downcasting概念,最好的方式從內(nèi)存分配的角度理解。
class “e”擴(kuò)展自class “c”,class “c”又繼承自class “a”。同時(shí),class “b”擴(kuò)展自class “a.”
如果我們執(zhí)行了下面的代碼:
a a1; //base class variable e e1; e1 = new; a1 = e1; //assigning extended object handle 'e1' to base class variable 'a1'
當(dāng)我們實(shí)例化'e1 = new()'時(shí),同時(shí)我們實(shí)例化了class e, class c和class a。
將擴(kuò)展對(duì)象句柄“e1”賦值給基類句柄a1,就是一個(gè)“upcast”。
這意味著,如果你此時(shí)你訪問“a1.i”,實(shí)際上訪問到的就是上面class a所占用的內(nèi)存空間。
換句話說,“a1.i”、“c1.i”和“e1.i”實(shí)際上是不同的內(nèi)容。
SystemVerilog支持Upcasting,即將擴(kuò)展類句柄直接賦值給基類句柄。
a a1; e e1; a1 = new; e1 = a1; //ILLEGAL
在上面的例子中,我們實(shí)例化了對(duì)象a1,此時(shí)會(huì)為對(duì)象a1分配內(nèi)存空間,但是此時(shí)并沒有為對(duì)象c1和對(duì)象e1分配內(nèi)存空間。
所以,如果此時(shí)我們賦值“e1 = a1”是不允許的,因?yàn)閑1并沒有一個(gè)合適的物理空間去指向。
這種就是downcasting的概念,只能通過$cast()進(jìn)行檢查之后(如果a1確實(shí)指向了一個(gè)足夠的內(nèi)存空間e1就可以賦值)才能完成賦值。
$cast(e1,a1); //dynamic casting
首先看一個(gè)將子類句柄賦值給父類的示例:
class p_class; bit [31:0] p_Var; function void display(); $display("p_Var = %0d",p_Var); endfunction endclass class c_class extends p_class; bit [31:0] c_Var; function void display( ); super.display( ); $display("c_Var = %0d",c_Var); endfunction endclass module top; initial begin p_class p; c_class c = new( ); c.p_Var = 10; c.c_Var = 20; //assigning child class handle to parent class variable p = c; c.display( ); end endmodule
在這個(gè)例子中,我們聲明了一個(gè)父類“p_class”和其擴(kuò)展類“c_class.”
然后賦值c_class中的屬性 c.p_Var和c.c_Var,最后進(jìn)行upcasting,打印信息如下:
p_Var = 10 c_Var = 20 V C S S i m u l a t i o n R e p o r t
因?yàn)槲覀冊(cè)趯?shí)例化c_class時(shí),同樣為其父類p_class分配了內(nèi)存空間。
相反,如果我們將父類句柄賦值給子類句柄
c = p
會(huì)得到一個(gè)編譯錯(cuò)誤
Error-[SV-ICA] Illegal class assignment testbench.sv, 32 "c = p;" Expression 'p' on rhs is not a class or a compatible class and hence cannot be assigned to a class handle on lhs. Please make sure that the lhs and rhs expressions are compatible.
我們?cè)倏匆粋€(gè)upcast的示例:
class animals; string color = "white"; function void disp; $display("color = %s", color); endfunction endclass class bufalo extends animals; string color = "black"; function void disp; $display("color = %s", color); endfunction endclass program tb; initial begin animals p; bufalo c; c = new( ); //allocate memory for c //this will allocate memory for both 'c' and 'p' p = c; //upcasting p.disp; c.disp; end endprogram
仿真log:
color = white color = black $fnish at simulation time 0 V C S S i m u l a t i o n R e p o r t
在上面的例子中,雖然我們只是實(shí)例化了擴(kuò)展類bufalo,但是同時(shí)也為父類animals分配的內(nèi)存空間,所以打印了
color = white color = black
審核編輯:劉清
-
Verilog語言
+關(guān)注
關(guān)注
0文章
113瀏覽量
8224
原文標(biāo)題:SystemVerilog中的Upcasting和Downcasting
文章出處:【微信號(hào):芯片驗(yàn)證工程師,微信公眾號(hào):芯片驗(yàn)證工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論