SystemVerilog中枚舉類型雖然屬于一種“強類型”,但是枚舉類型還是提供了一些“不正經(jīng)”的用法可以實現(xiàn)一些很常見的功能,本文將示例一些在枚舉類型使用過程中的一些“不正經(jīng)”用法,并給出一些使用建議。
1 同一個作用域內定義多個枚舉類型,并且這些枚舉類型的枚舉值列表中存在相同的標簽名
【示例】
【仿真結果】
示例中,定義了兩個枚舉變量fsm_s1和fsm_s2,并且其對應的枚舉值列表中都包含了相同的標簽“GO”,編譯后報錯。其實可以想象下,如果在SystemVerilog的同一個作用域中允許這種同名的標簽存在,那么在具體對于某一個枚舉變量使用標簽進行賦值操作時,那么這個標簽到底是來自于哪個枚舉變量中對應的枚舉列表呢?所以,在SystemVerilog中,同一個作用域內定義多個枚舉類型時,這些枚舉類型的枚舉值列表中不能存在同名的標簽。
2 枚舉值列表中的標簽用于運算
【示例】
【仿真結果】
示例中,將枚舉變量cal_e的枚舉值列表中的標簽被用于運算操作,并且可以獲得對應的計算結果。這是因為枚舉值列表中的每個標簽都有對應的數(shù)值,默認情況下,枚舉值列表中第一個標簽對應的數(shù)值為0,其后標簽對應數(shù)值按照加1遞增。當枚舉值列表中的標簽用于具體運算表達式時,與這些標簽關聯(lián)的數(shù)值會自動“替換”掉表達式中的標簽,從而實際完成運算的是標簽對應的數(shù)值。但是限于枚舉值列表可以表示的數(shù)據(jù)范圍有限,建議不要將枚舉列表中的標簽用于具體運算過程中。
3 將數(shù)值直接賦給枚舉變量
【示例】
【仿真結果】
示例中,第6行和第8行分別將數(shù)值直接賦予了枚舉變量cal,此時編譯會提示此處的賦值為illegal,但是SystemVerilog對于這個賦值操作還是會進行的。第10行采用$cast進行動態(tài)轉換,將數(shù)值轉換成枚舉變量cal,間接實現(xiàn)了對cal的賦值操作,此時因為采用了顯式的類型轉換,并且轉換成功,所以并不會產(chǎn)生任何提示信息。第12行使用了靜態(tài)轉換,將數(shù)值轉換成枚舉變量cal,此時因為采用了顯式的類型轉換,所以也并不會產(chǎn)生任何提示信息。但是在將具體數(shù)值賦值枚舉類型變量時,最好采用顯式的動態(tài)轉換或者靜態(tài)轉換。
4 賦給枚舉變量的數(shù)值位寬與枚舉變量位寬不匹配時的結果
【示例】
【仿真結果】
示例中,第6行將數(shù)值“4”賦給枚舉變量cal,該枚舉變量可以選擇的枚舉值列表中的數(shù)值只可能為:0,1,2,3,顯然數(shù)值“4”不在該范圍之內,所以通過枚舉變量調用name()函數(shù)得到的標簽為“空”。但是“4”的位寬在該枚舉變量所能表示的數(shù)值范圍之內(不在枚舉值列表之內),所以該值會被賦給該枚舉變量,其數(shù)值可以被顯示出來。
第9行將數(shù)值“9”賦給枚舉變量cal,數(shù)值“9”為4位寬,枚舉變量cal位寬為3,數(shù)值“9”不在該枚舉變量所能表示的數(shù)值范圍之內,所以“9”會被截位后賦給枚舉變量,所以此時枚舉變量對應的數(shù)值為“3’b001”而不是“4’b1001”,而與數(shù)值“3’b001”對應的枚舉值列表中標簽是“ONE”,所以通過枚舉變量調用name()函數(shù)得到的標簽為“ONE”,顯示的數(shù)值為“1”。為了在仿真過程中避免類似情況出現(xiàn),在將具體數(shù)值賦給枚舉變量時,建議采用動態(tài)轉換$cast,不要寄希望于仿真器能夠“揣測明白你的心意悄悄的”靜態(tài)的完成類型的轉換賦值,使用動態(tài)轉換$cast當遇到類型不匹配時立刻可以報錯提醒。
審核編輯:湯梓紅
-
Verilog
+關注
關注
28文章
1343瀏覽量
109980 -
System
+關注
關注
0文章
165瀏覽量
36883 -
枚舉
+關注
關注
0文章
16瀏覽量
4576
原文標題:SystemVerilog中枚舉類型的一些“不正經(jīng)”用法
文章出處:【微信號:Rocker-IC,微信公眾號:路科驗證】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論