要想理解清楚SystemVerilog語言中的Upcasting和Downcasting概念,最好的方式從內(nèi)存分配的角度理解。
class “e”擴(kuò)展自class “c”,class “c”又繼承自class “a”。同時,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)我們實例化'e1 = new()'時,同時我們實例化了class e, class c和class a。
將擴(kuò)展對象句柄“e1”賦值給基類句柄a1,就是一個“upcast”。
這意味著,如果你此時你訪問“a1.i”,實際上訪問到的就是上面class a所占用的內(nèi)存空間。
換句話說,“a1.i”、“c1.i”和“e1.i”實際上是不同的內(nèi)容。
SystemVerilog支持Upcasting,即將擴(kuò)展類句柄直接賦值給基類句柄。
a a1; e e1; a1 = new; e1 = a1; //ILLEGAL
在上面的例子中,我們實例化了對象a1,此時會為對象a1分配內(nèi)存空間,但是此時并沒有為對象c1和對象e1分配內(nèi)存空間。
所以,如果此時我們賦值“e1 = a1”是不允許的,因為e1并沒有一個合適的物理空間去指向。
這種就是downcasting的概念,只能通過$cast()進(jìn)行檢查之后(如果a1確實指向了一個足夠的內(nèi)存空間e1就可以賦值)才能完成賦值。
$cast(e1,a1); //dynamic casting
首先看一個將子類句柄賦值給父類的示例:
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
在這個例子中,我們聲明了一個父類“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
因為我們在實例化c_class時,同樣為其父類p_class分配了內(nèi)存空間。
相反,如果我們將父類句柄賦值給子類句柄
c = p
會得到一個編譯錯誤
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.
我們再看一個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
在上面的例子中,雖然我們只是實例化了擴(kuò)展類bufalo,但是同時也為父類animals分配的內(nèi)存空間,所以打印了
color = white color = black
審核編輯:劉清
-
Verilog語言
+關(guān)注
關(guān)注
0文章
113瀏覽量
8249
原文標(biāo)題:SystemVerilog中的Upcasting和Downcasting
文章出處:【微信號:芯片驗證工程師,微信公眾號:芯片驗證工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論