SystemVerilog casting意味著將一種數據類型轉換為另一種數據類型。在將一個變量賦值給另一個變量時,SystemVerilog要求這兩個變量具有相同的數據類型。
SystemVerilog可以使用(')符號進行強制(靜態)類型轉換。另外,在SystemVerilog中還存在動態cast的概念。
SystemVerilog提供了$cast系統任務/函數,能夠在兩個不同的數據類型變量之間賦值,因為如果直接賦值的話會報編譯錯誤。
在SystemVerilog中最常用的動態cast應用場景就是類的繼承特性中對類句柄的賦值。基類句柄可以用來獲取派生類的對象,反之則不行。
在實際仿真執行的過程中,動態cast會執行相應的檢查,是否能夠真正地進行賦值。
需要特別注意的是,cast既可以作為fucntion調用,也可以作為task調用。區別就是cast作為函數調用時,如果沒有成功會返回0,然后可以決定是否采取相應的操作,而$cast作為任務調用失敗后,會直接停止仿真。
下面SystemVerilog $cast系統函數/任務的源碼聲明
function int $cast (target_var, source_exp); task $cast (target_var, source_exp);
下面的例子展示了SystemVerilog中$cast的應用:
module tb; typedef enum { soccer=2, cricket=4, football=10 } sports; sports mS; int i; initial begin i = 10; mS = i; //Synopsys-VCS - WARNING - incompatible types //Mentor Questa/Aldec-Riviera - run time ERROR $cast(mS, i); //$cast as a task - match types $display ("Sports=%s", mS.name( )); i = mS; //No Warning or Error $display("i=%0d",i); i=50; //$cast (mS, i); //ERROR - 50 is not a valid value for enum if ($cast (mS, i)) //$cast as a function $display ("Cast passed"); else $display ("Cast failed"); end endmodule
仿真log:
Sports=football i=10 Cast failed V C S S i m u l a t i o n R e p o r t
在“tb” module中,我們定義了“int i”,并定義了一個enum“sports”并聲明了一個sports類型的變量“mS”。
將一個int賦值給enum類型(sports)的變量
mS = i;
由于" i "不是enum類型,存在類型不兼容,所以會得到Synopsys - VCS的warnning(不是ERROR哦):
Warning-[ENUMASSIGN] Illegal assignment to enum variable testbench.sv, 11 tb, "mS = i;" Only expressions of the enum type can be assigned to an enum variable. The type int is incompatible with the enum 'sports'
對于相同的代碼,Mentor’s Questa可能會報ERROR:
** Error (suppressible): testbench.sv(9): (vlog-8386) An enum variable 'mS' of type 'sports' may only be assigned the same enum typed variable or one of its values. Variable i requires an explicit cast.
大家可能有點奇怪,這個不兼容類型的賦值到底是warning還是Error,結論就是這個這個enum 值有實際的分配,其實對代碼功能沒有影響,當作warning也是沒有問題的。
為了糾正這種類型不兼容的賦值錯誤/警告,我們使用$cast將“i”強制轉換為enum“mS”:
$cast(mS, i);
在這個上下文下,$cast就是作為task調用的。這種動態cast將使int類型" i "和枚舉類型" mS "兼容,仿真會PASS。因為i = 10, mS得到的值是10,也就是enum中的“football”。所以,仿真log顯示
“sports = football。”
注意下面的枚舉賦值給int類型完全是可以的,反之則不行:
i = mS;
在動態cast中分配不正確的枚舉值(50)。
i=50; $cast(mS, i);
因為50不包含在枚舉“sports”的范圍內,所以會得到一個ERROR:
Error-[STASKE_DCF] Dynamic cast failed testbench.sv, 22 Dynamic cast using '$cast' failed. The source expression is not yielding a valid value for the destination variable.
最后,我們使用$cast作為函數調用,它將返回“0”(因為cast失敗),將得到fail打印(“Cast failed”)。
審核編輯:湯梓紅。
-
Verilog
+關注
關注
28文章
1351瀏覽量
110101 -
System
+關注
關注
0文章
165瀏覽量
36947 -
CAST
+關注
關注
0文章
8瀏覽量
9380 -
數據類型
+關注
關注
0文章
236瀏覽量
13624
原文標題:?SystemVerilog中的動態 Cast
文章出處:【微信號:芯片驗證工程師,微信公眾號:芯片驗證工程師】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論