Modelsim仿真問題解疑:初始時(shí)間段內(nèi)邏輯不符
一、問題描述
????在使用modelsim進(jìn)行功能仿真時(shí),會(huì)遇到如下情況,仿真結(jié)果在前面一段時(shí)間內(nèi)的邏輯輸出不符預(yù)期,后面的結(jié)果符合預(yù)期
????以實(shí)現(xiàn)一個(gè)D觸發(fā)器的邏輯為例
????1.1 設(shè)計(jì)代碼
????功能簡(jiǎn)單,為一個(gè)異步清零的D觸發(fā)器
測(cè)試代碼,根據(jù)輸入數(shù)據(jù)d時(shí)間點(diǎn)變化將輸入進(jìn)行了兩輪的變動(dòng),一輪在100ns以前,第二輪在100ns之后
? ? 1.2?綜合結(jié)果
????綜合為FDCE,符合預(yù)期

1.3?仿真結(jié)果
????在紅框1內(nèi),當(dāng)ce=1,clr=0,輸入數(shù)據(jù)d變化時(shí),輸出out一直為0,不符合預(yù)期邏輯,紅框2內(nèi),在輸出結(jié)果正確,clr為1時(shí)清零,輸出為0,ce=1,clr=0時(shí),out跟隨d變化,符合預(yù)期

二、問題原因
????仔細(xì)觀察會(huì)發(fā)現(xiàn),波形中多了一個(gè)全局復(fù)位信號(hào)GSR,在設(shè)計(jì)中是未體現(xiàn)的,該信號(hào)在100ns時(shí)進(jìn)行了從1到0 的切換,切換之后,輸出邏輯符合預(yù)期。

????100ns來自何處?測(cè)試文件中未有設(shè)置,信號(hào)列表中選中該信號(hào),點(diǎn)擊鼠標(biāo)右鍵,進(jìn)入“Object Declaration”查看其來源。

????GSR信號(hào)來源于FF_tb_func_impl.v文件的glbl模塊,如下圖,在125行定義了GSR信號(hào),129行的initial模塊中對(duì)GSR_int進(jìn)行了賦值,初始值為1,等待ROC_WIDTH=100000(100ns)后狀態(tài)變?yōu)?,符合前面的現(xiàn)象。


三、解決方法
????比較容易想到的辦法是直接修改FF_tb_func_impl.v中initial模塊,但該模塊是仿真前生成的,修改重新運(yùn)行會(huì)被覆蓋。此時(shí)可借用modelsim的force功能,將GSR信號(hào)強(qiáng)制置為0再運(yùn)行。
????操作:選中GSR信號(hào),鼠標(biāo)右鍵,執(zhí)行restart將原有結(jié)果刪除。

? ?再選中GSR信號(hào),選擇“Force”,彈出下圖彈框“Force Selected Signal”,在Value中將值改為1'h0,OK進(jìn)行保存。

?????再將默認(rèn)運(yùn)行100ps修改為300ns,即運(yùn)行300ns,最后執(zhí)行run。如下圖,GSR一直為低電平0,所以前100ns的結(jié)果也符合預(yù)期
