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

如何在Go中給GORM模型添加枚舉類(lèi)型
詳細(xì)講解c語(yǔ)言enum枚舉類(lèi)型
深入理解java枚舉類(lèi)型enum用法
枚舉是C語(yǔ)言中的一種基本數(shù)據(jù)類(lèi)型

go語(yǔ)言枚舉類(lèi)型怎么用
數(shù)字硬件建模SystemVerilog-枚舉數(shù)據(jù)類(lèi)型
淺析SystemVerilog中的枚舉類(lèi)型
SystemVerilog中$cast的應(yīng)用
SystemVerilog中的struct
SystemVerilog中至關(guān)重要的的數(shù)據(jù)類(lèi)型

SystemVerilog中至關(guān)重要的結(jié)構(gòu)體和自定義類(lèi)型

評(píng)論