在定義狀態(tài)機(jī)中的狀態(tài)時(shí),除了可以使用宏(define)或者參數(shù)(parameter)聲明定義外,還可以使用枚舉類(lèi)型,但是如果對(duì)于枚舉類(lèi)型使用不正確的話(huà),極易出現(xiàn)編譯仿真均沒(méi)有報(bào)錯(cuò),但是仿真時(shí)狀態(tài)機(jī)跳轉(zhuǎn)異常的情況.
本文將針對(duì)這種情況進(jìn)行示例說(shuō)明并給出解決方法.
1 數(shù)據(jù)類(lèi)型
在Verilog中所有的變量和線(xiàn)網(wǎng)都是4值數(shù)據(jù)類(lèi)型,但在SystemVerilog中,對(duì)信號(hào)類(lèi)型和數(shù)據(jù)類(lèi)型進(jìn)行了詳細(xì)的區(qū)分,其中信號(hào)類(lèi)型保持與Verilog一樣,主要分為變量和線(xiàn)網(wǎng)類(lèi)型,但是數(shù)據(jù)類(lèi)型分為了2值類(lèi)型(0和1)和4值類(lèi)型(0,1,x和z),對(duì)信號(hào)的數(shù)據(jù)類(lèi)型進(jìn)行了擴(kuò)展,但是保持了線(xiàn)網(wǎng)類(lèi)型原有的數(shù)據(jù)類(lèi)型,在默認(rèn)狀態(tài)下,4值數(shù)據(jù)類(lèi)型的默認(rèn)值為x,2值類(lèi)型的默認(rèn)值為0.同時(shí)SystemVerilog結(jié)合C語(yǔ)言的特性,引入了其他一些類(lèi)型,例如枚舉類(lèi)型等,通過(guò)多種類(lèi)型的引入,極大地豐富了SystemVerilog進(jìn)行程序設(shè)計(jì)的靈活性.
2 枚舉類(lèi)型
用戶(hù)可以通過(guò)枚舉類(lèi)型定義特定的常量值的集合.
格式:
使用方式如下:
枚舉常量代表該枚舉類(lèi)型的變量的可能取值的列表,編譯系統(tǒng)為每個(gè)枚舉常量指定一個(gè)數(shù)值,缺省狀態(tài)下這個(gè)數(shù)值從0開(kāi)始,且數(shù)據(jù)類(lèi)型為int,即2值型的整型.
3 問(wèn)題描述
對(duì)下述代碼進(jìn)行仿真時(shí),狀態(tài)跳轉(zhuǎn)執(zhí)行異常,核心代碼如下:
當(dāng)上述狀態(tài)機(jī)運(yùn)行時(shí),狀態(tài)機(jī)將一直處于WAIT狀態(tài),狀態(tài)執(zhí)行異常.
4 問(wèn)題分析
這里需要注意到,枚舉常量列表中的枚舉常量在缺省狀態(tài)下,枚舉常量的數(shù)值是從0開(kāi)始遞增.且2值數(shù)據(jù)類(lèi)型變量的初始值為0.所以在此例中,state_e和nstate_e的初始狀態(tài)都為0,即WAIT.當(dāng)復(fù)位撤銷(xiāo)后,state_e和nstate_e都為WAIT,那么組合邏輯部分always@(state_e)的敏感信號(hào)列表中的state_e將一直保持在WAIT狀態(tài),所以該部分組合邏輯將不會(huì)被執(zhí)行,從而導(dǎo)致nstate_e狀態(tài)不會(huì)被更新,因此,狀態(tài)既不能推進(jìn),將一直保持在初始的WAIT狀態(tài).
5 解決方法
出現(xiàn)上述問(wèn)題主要是因?yàn)榇a中組合邏輯部分的敏感信號(hào)列表中的變量沒(méi)有發(fā)生變化,從而沒(méi)有出發(fā)進(jìn)程的執(zhí)行導(dǎo)致的,因此,解決方法主要是實(shí)現(xiàn)組合邏輯部分的有效執(zhí)行,實(shí)現(xiàn)nstate_e的變化.
5.1 使用always_comb結(jié)構(gòu)
always_comb在仿真開(kāi)始的0時(shí)刻會(huì)自動(dòng)調(diào)用一次,從而可以實(shí)現(xiàn)nstate_e狀態(tài)的更新,將組合結(jié)構(gòu)中的always@(state_e)替換為always_comb即可.
5.2 將枚舉變量的數(shù)據(jù)類(lèi)型指定為4值類(lèi)型,如下所示:
在仿真開(kāi)始時(shí),因?yàn)槊杜e類(lèi)型的數(shù)據(jù)類(lèi)型為logic型,所以變量state_e和nstate_e的默認(rèn)狀態(tài)都為x態(tài),那么在復(fù)位階段state_e被初始化為WAIT時(shí),組合邏輯部分的always@(state_e
中的敏感信號(hào)state_e狀態(tài)從x態(tài)變化到了WAIT,即狀態(tài)發(fā)生變化,觸發(fā)組合邏輯部分進(jìn)程的執(zhí)行,nstate_e會(huì)被更新為L(zhǎng)OAD,從而可以實(shí)現(xiàn)狀態(tài)機(jī)的推進(jìn).
5.3 指定枚舉常量的初始值
枚舉列表中的枚舉常量列表中的第一個(gè)常量,默認(rèn)初始值為0-,其后常量數(shù)值依次遞增,但是這個(gè)起始值也可以在枚舉類(lèi)型聲明定義時(shí)指定為其他值,從而可以使2值型枚舉變量的初始狀態(tài)-與枚舉變量列表中的常量起始值不一樣,在復(fù)位階段state_e被更新為非零值時(shí),更新后的值與類(lèi)型的默認(rèn)值0不一樣,從而也可以實(shí)現(xiàn)組合邏輯部分敏感信號(hào)列表中信號(hào)的變化,從而使組合邏輯中的nstate_e狀態(tài)可以被更新,推進(jìn)狀態(tài)機(jī)的運(yùn)行,示例如下:
-
仿真器
+關(guān)注
關(guān)注
14文章
1019瀏覽量
83806 -
Verilog
+關(guān)注
關(guān)注
28文章
1351瀏覽量
110157 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7608瀏覽量
137119 -
狀態(tài)機(jī)
+關(guān)注
關(guān)注
2文章
492瀏覽量
27575
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論