SystemVerilog用戶自定義和枚舉數(shù)據(jù)類型
用戶自定義和枚舉數(shù)據(jù)類型
1. 用戶自定義類型
用戶自定義類型關(guān)鍵字為typedef
,例如
看一個(gè)例子
在這個(gè)例子中,我們只在模塊type1_tb
自定義了一個(gè)bit_t
的類型,在模塊type2_tb
中直接使用bit_t
聲明變量,看看結(jié)果會(huì)是怎樣的

結(jié)果顯示變量類型是未知的,如果我們把模塊type2_tb
注釋掉,會(huì)不會(huì)還有這個(gè)結(jié)果

結(jié)果成功打印
這說明,自定義的數(shù)據(jù)類型bit_t
確實(shí)是成功被定義,但他只作用于模塊type1_tb
,因?yàn)槲覀儾]有在模塊type2_tb
再次定義
那如果想要模塊type2_tb
也能成功打印,可以在模塊type2_tb
重新進(jìn)行一個(gè)自定義,像這樣

也可以用之前的編譯單元域$unit

可以看到,用戶自定義類型可以局部定義,也可以進(jìn)行共享定義
為了增加源碼的可讀性,一般用戶自定義的名稱后加_t
,用以區(qū)分
2. 枚舉數(shù)據(jù)類型
2.1 基本內(nèi)容
枚舉數(shù)據(jù)類型的格式為:
枚舉可以理解為給標(biāo)簽名賦值,或給這個(gè)給數(shù)值一個(gè)標(biāo)簽
如果沒有明確給定數(shù)據(jù)類型,枚舉中的數(shù)值是int類型,且數(shù)值依次是0, 1, 2...
這個(gè)情況是不是很像有限狀態(tài)機(jī)對(duì)狀態(tài)的定義,就像這樣:
改成枚舉方式表示,會(huì)簡(jiǎn)單很多
枚舉數(shù)據(jù)類型中的標(biāo)簽名也可以用向量的方式表示,可以進(jìn)一步簡(jiǎn)化
這三個(gè)狀態(tài)定義是等價(jià)的
不僅如此,枚舉類型中的數(shù)值、數(shù)值類型、數(shù)值寬度也是可以自己定義的
比如FSM狀態(tài)定義時(shí),可以用獨(dú)熱碼(ont-hot),可以直接定義數(shù)值
這里要注意一點(diǎn),如果我們給定的位寬為3,那么給數(shù)值時(shí)不能超出位寬范圍
2.2 枚舉類型的賦值
枚舉類型只可以進(jìn)行下列賦值:
枚舉類型列表中的一個(gè)標(biāo)簽
同類枚舉類型的其他變量(用同樣枚舉類型聲明的變量)
通過cast轉(zhuǎn)換成枚舉類型變量的數(shù)值
用一個(gè)枚舉類型來解釋這點(diǎn)
這里有一點(diǎn)需要說明,枚舉列表中的標(biāo)簽其實(shí)是代表一個(gè)數(shù)值(這點(diǎn)在下文會(huì)提到),在這個(gè)例子中,數(shù)值為int
型,和info的數(shù)據(jù)類型相同,所以存在info = state + 1;
的寫法,但是,state = info + 1
是不可行的,因?yàn)槊杜e賦值并沒有給出這種形式
此外,state =state + 1; state ++
等都是不允許的
2.3 枚舉類型專用任務(wù)和方法
<枚舉變量名>.first:返回指定變量列表中的第一個(gè)成員的值
<枚舉變量名>.last:返回指定變量列表中的最后一個(gè)成員的值
<枚舉變量名>.next():返回指定變量列表中后面第N個(gè)成員的值,如果到了列表末尾會(huì)返回列表開頭
<枚舉變量名>.prev():返回指定變量列表中前面第N個(gè)成員的值,如果到了列表開頭會(huì)返回列表末尾
<枚舉變量名>.num:返回變量的枚舉列表中元素個(gè)數(shù)
<枚舉變量名>.name:返回枚舉變量中代表這個(gè)值的字符串
下面依次對(duì)這幾個(gè)情況進(jìn)行仿真
源代碼如下:
運(yùn)行結(jié)果如下

可以看到,自始至終state_t均為s5,這幾個(gè)操作都不會(huì)改變state_t本身
此外,由<變量名>.prev(7)
和<變量名>.next(7)
可以看出,這種方式是循環(huán)的
本文主要參考《SystemVerilog硬件設(shè)計(jì)及建模》