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

labview狀態(tài)機(jī)基本類型順序結(jié)構(gòu)
FPGA/CPLD狀態(tài)機(jī)穩(wěn)定性研究
有限狀態(tài)機(jī)有什么類型?
狀態(tài)機(jī)是什么?什么是消息觸發(fā)類型的狀態(tài)機(jī)?
狀態(tài)機(jī)舉例
為什么單片機(jī)的主程序是死循環(huán)
單片機(jī)的死循環(huán)有什么作用

FPGA:狀態(tài)機(jī)簡述

什么是狀態(tài)機(jī)?狀態(tài)機(jī)5要素

Verilog狀態(tài)機(jī)的類型

評(píng)論