1. X 態(tài)是什么?
Verilog 和 SV 定義了四種邏輯狀態(tài):0,1,Z 及 X:
0 為低電平;
1 為高電平;
Z 為高阻態(tài),可以理解為電路上的引腳懸空;
X 為不定態(tài)、亞穩(wěn)態(tài),可能為 0 可能為 1 也可能為 Z,常見(jiàn)于未復(fù)位的寄存器、鎖存器或 Memory。
其中,X 只有在仿真時(shí)存在,真實(shí)電路中不存在。若仿真過(guò)程中出現(xiàn)了 X 態(tài),表明該處存在潛在的設(shè)計(jì)風(fēng)險(xiǎn),其有可能會(huì)掩蓋 RTL Bug。
2. X 態(tài)是由什么引起的?
RTL 仿真、門(mén)仿真及低功耗仿真中均有可能出現(xiàn) X 態(tài)。X 態(tài)出現(xiàn)的原因大致總結(jié)如下:
未初始化。未初始化的四態(tài)變量,比如 logic、wire、reg、integer、time 變量;未初始化的寄存器、鎖存器,在被復(fù)位或有確定的值被鎖定之前,保持 X 態(tài)。
輸入信號(hào)未連接。外部輸入信號(hào)未設(shè)置初值(尤其 DFT 信號(hào))時(shí)為 Z,Z 在模塊內(nèi)部經(jīng)過(guò)數(shù)字邏輯后變 X 態(tài)。
信號(hào)多驅(qū)或總線爭(zhēng)用。SV 中允許將多個(gè)輸入驅(qū)動(dòng)到同一 net 類(lèi)型上,多多個(gè)驅(qū)動(dòng)存在沖突時(shí),net 即表現(xiàn)為 X 態(tài)。
操作結(jié)果不定導(dǎo)致的 X 態(tài)。
位選擇或數(shù)組索引超范圍返回 X 態(tài)。
邏輯門(mén)輸出的 X 態(tài)。SV 自帶原語(yǔ)或用戶(hù)自定義原語(yǔ) (UDP) 支持四態(tài)操作,當(dāng)這些邏輯門(mén)輸入為 X 或 Z 時(shí),輸出 X。
后仿 setup 或 hold time 不滿(mǎn)足,存在 timing violation,使用 notifier 將輸出變?yōu)?X 態(tài)。若只看 timing violation 不輸出 X,則添加 vcs 編譯選項(xiàng) +no_notifier。
主動(dòng)引入的 X 態(tài)。設(shè)計(jì)人為引入的 X 態(tài),比如在 case 分支中,對(duì)于 don’t care 的默認(rèn)狀態(tài)中賦值為 X 態(tài);驗(yàn)證平臺(tái)引入的 X 態(tài),比如存在四態(tài)變量 wire a, assign a = ‘bx。
寄存器或鎖存器掉電后上電。在低功耗仿真中,若無(wú)特別設(shè)置,即便在 0 時(shí)刻對(duì)寄存器或鎖存器進(jìn)行了初始化,當(dāng)其所在的 Power Domain 掉電后重新上電,其仍然為 X 態(tài)未初始化狀態(tài),需要在 upf 中設(shè)置 reinit。
若 RTL 仿真沒(méi)問(wèn)題,但門(mén)仿出現(xiàn) X 態(tài),可能為以下原因:
信號(hào)的輸入輸出方向聲明錯(cuò)誤
控制信號(hào)出現(xiàn) X 態(tài)
3. X 態(tài)有什么危害?
所謂 X 態(tài)傳播,是指 X 態(tài)作為觸發(fā)/控制條件或邏輯輸入時(shí),引起其他邏輯輸出為 X 態(tài)。不同情況下 X 態(tài)危害情況不同:
若 X 態(tài)僅僅是存在,完全不傳播,其沒(méi)什么危害;
若 X 態(tài)出現(xiàn)傳播,且電路中針對(duì)該 X 態(tài)傳播做了保護(hù),這種有限的 X 態(tài)傳播也沒(méi)有危害;
若 X 態(tài)出現(xiàn)傳播但電路中針沒(méi)有針對(duì)該 X 態(tài)傳播進(jìn)行保護(hù),那么該 X 態(tài)傳播可能會(huì)影響到芯片的正常工作。
4. 如何避免 X 態(tài)的產(chǎn)生?
確保引起 X 態(tài)的條件不成立即可避免 X 態(tài)產(chǎn)生,簡(jiǎn)單列幾條:
使用二態(tài)變量。
設(shè)計(jì)上進(jìn)行復(fù)位操作,控制通路寄存器必選帶復(fù)位,數(shù)據(jù)通路寄存器可以不帶復(fù)位。
驗(yàn)證 TB 中接口輸入信號(hào)賦初值。
仿真時(shí)利用 initreg 及 initmem 選項(xiàng)對(duì) reg 和 Memory 進(jìn)行初始化。
RTL model 中添加針對(duì) X 的 assertion,以及時(shí)發(fā)現(xiàn) X 態(tài)并消除。
if-else 及 case 中使用確定寫(xiě)法,或使用 assign+表達(dá)式代替if-else及 case。
4.1 if-else/case Vs. assign
RTL 仿真中,if-else/case 及 assign 對(duì) X 態(tài)有不同的行為,如下:
if(x) 會(huì)默認(rèn) x=0,走 else 分支,不傳播 X 態(tài)。
case(x),若存在 default 分支,則走 default 分支,否則不會(huì)匹配到任何分支。
assign c = sel ? a : b; sel=x,輸出 X,從而將 X 態(tài)傳播出去。
也就是說(shuō),if-else 和 case 不能傳遞 X 態(tài),無(wú)法暴露 X 態(tài)傳播問(wèn)題,這就導(dǎo)致無(wú)法在仿真時(shí)去發(fā)現(xiàn) X 態(tài)相關(guān)的 Bug。相比之下,assign + 條件表達(dá)式的方式能夠傳遞 X 態(tài)。此外,if-else/case 為帶有優(yōu)先級(jí)的選擇電路,不利于時(shí)序和面積,建議使用 assign 代替 if-else 和 case。
有人有疑問(wèn):if-else/case 不傳播 X 態(tài),assign 傳播 X 態(tài),為什么還要用 assign?——我們不希望出現(xiàn) X 態(tài),但我們更不希望由于 RTL 寫(xiě)法原因而掩蓋 X 態(tài)。使用 assign,能夠及時(shí)暴露 X 態(tài)問(wèn)題,從而避免 X 態(tài)被掩蓋所導(dǎo)致的問(wèn)題。
5. 兩種 X 態(tài)模型:X-optimism 和 X-pessimism
在對(duì)待 X 態(tài)問(wèn)題上有兩種模型:
X-optimism,樂(lè)觀派,其認(rèn)為 X 態(tài)不會(huì)被傳播。若檢測(cè)到邏輯輸出為 X 態(tài),將 X 轉(zhuǎn)換為 0 或 1。
X-pessimism,悲觀派,其認(rèn)為 X 態(tài)會(huì)一直被傳播下去。若檢測(cè)到邏輯輸入存在 X,即便輸出結(jié)果是確定的,也要輸出 X,從而將 X 態(tài)傳播出去。
在仿真階段,RTL 仿真對(duì) X 態(tài)過(guò)于樂(lè)觀,RTL 仿真時(shí)往往忽略 X 態(tài)并賦一個(gè)確定的值,從而無(wú)法檢測(cè)到 X 態(tài)傳播所引發(fā)的問(wèn)題;門(mén)仿更接近硬件行為,會(huì)暴露出 X 傳播問(wèn)題。
6. 如何檢測(cè) X 態(tài)傳播?
從設(shè)計(jì)角度,我們希望電路的邏輯輸出都是確定的,以避免非預(yù)期的功能缺陷。從驗(yàn)證角度,我們不喜歡 X 態(tài),但我們希望能夠發(fā)現(xiàn)并評(píng)估電路中所有可能存在的 X 態(tài),尤其是能夠傳播的 X 態(tài)。
前文提到,RTL 仿真往往對(duì) X 態(tài)過(guò)于樂(lè)觀,在門(mén)仿階段才會(huì)暴露出 X 態(tài)傳播問(wèn)題。相較于 RTL 仿真,門(mén)仿的 netlist 易讀性差、仿真速度慢且難以 Debug。鑒于此,vcs 提供了一種 Shift-Left 方案,通過(guò)在編譯仿真選項(xiàng)中添加 -xprop 相關(guān)選項(xiàng)即可在 RTL 仿真階段對(duì) X 傳播進(jìn)行檢查。
6.1 Merge Mode 介紹
vcs xprop 檢查有 3 種模式,按照從樂(lè)觀到悲觀的順序,分別為:vmerge -> tmerge -> xmerge。其中:
vmerge mode,對(duì)待 X 態(tài)最為樂(lè)觀,遵守 Verilog 或 VHDL 規(guī)定的 X 態(tài)處理規(guī)則,不存在 X 態(tài)傳播問(wèn)題。
tmerge mode,處于樂(lè)觀與悲觀之間,接近實(shí)際硬件行為或門(mén)仿,X 態(tài)傳播一段路徑后終結(jié)。
xmerge mode,對(duì)待 X 態(tài)最為悲觀,比門(mén)仿還悲觀,X 態(tài)會(huì)一直傳播下去。
不同 Merge Mode 時(shí)的 X 態(tài)傳播情況如下表所示:
說(shuō)到底,-xprop=tmerge/vmerge 是為了擴(kuò)散 X 態(tài)傳播,把不傳播不定態(tài)的情形,強(qiáng)制傳播出去,從而盡早暴露 bug。
6.2 xprop 命令使用
一般來(lái)講,可以在編譯或仿真任一階段指定 -xprop 選項(xiàng)即可開(kāi)啟 xprop 檢測(cè)。
-xprop 示例用法如下:
vcs?xprop[=tmerge|xmerge|xprop_config_file]
其中,xprop_config_file 用以針對(duì)特定 instance 進(jìn)行特定模式的 xprop 監(jiān)測(cè)或開(kāi)關(guān)特定 instance 的 xprop 檢測(cè),其示例用法如下:
tree{top} instance{top.A}{xpropOn}; instance{top.B}{xpropOff}; module{C}{xpropOff}; merge=tmerge;
使能 xprop 后發(fā)現(xiàn)的 X 態(tài)不一定都是 Bug,或者設(shè)計(jì)已經(jīng)針對(duì) xprop 做了保護(hù)。這種情況下,可以采用 -xprop=xprop_config_file 對(duì)不同模塊施以不同的 xprop mode。
注意事項(xiàng)
-xprop 一般不能跟 +vcs+initreg+0/1/random 同時(shí)使用,因?yàn)?+vcs+initreg+0/1/random 會(huì)把 Verilog 的變量、寄存器及 Memory 初始值設(shè)置為 0 或 1 等非 X 狀態(tài),這樣就測(cè)不到初始 X 態(tài)了。
若未指定 -xprop,默認(rèn)為 vmerge,即默認(rèn)不存在 X 態(tài)傳播問(wèn)題,也不進(jìn)行檢查。
若定義了 -xprop 但未指定具體模式,默認(rèn)為 tmerge,即采用接近真實(shí)電路的 X 態(tài)傳播模式并進(jìn)行檢查。
6.3 xprop 報(bào)告查看
vcs 在編譯、仿真兩個(gè)階段均提供了相關(guān)手段來(lái)檢查相關(guān) instance 的 xprop 開(kāi)關(guān)情況:
若在編譯階段使能了 xprop,編譯完成之后會(huì)生成一個(gè) xprop.log 來(lái)報(bào)告 if/case 狀態(tài)、always 邊沿觸發(fā)等條件的 xprop 檢查開(kāi)關(guān)情況。
simv 仿真階段添加仿真選項(xiàng) -report=xprop[+exit] 能生成 xprop_config.report,便于在仿真后對(duì) xprop 檢查情況進(jìn)行確認(rèn)。若采用 -report=xprop+exit,在檢測(cè)完 xprop 狀態(tài)情況后后立即終止仿真。
7. 什么階段進(jìn)行 xprop 檢測(cè)?
X 態(tài)傳播不能不做,但也不宜早做。一方面,在驗(yàn)證初期調(diào) datapath 或 sanity 期間,我們并不想看到太多 X 態(tài)傳播,我們希望對(duì)待 X 態(tài)傳播更樂(lè)觀一點(diǎn);另一方面,帶有 xprop 的仿真為 4 態(tài)仿真,毫無(wú)疑問(wèn),4 態(tài)仿真比不帶 xprop 的 2 態(tài)仿真更慢。
那么應(yīng)該在什么階段開(kāi)啟 xprop 檢測(cè)呢?以下是推薦的方案:
RTL 仿真前期不開(kāi)啟 xprop,以盡快調(diào)通 sanity/smoke case 及主要 datapath。
RTL 仿真后期建議開(kāi)啟 xprop,提前排除部分 X 態(tài)。
網(wǎng)表中沒(méi)有 always 塊,xprop 對(duì)門(mén)仿不起作用。門(mén)仿的一大作用就是排除 X 態(tài)傳播導(dǎo)致的芯片功能問(wèn)題,尤其是控制通路上的 X 態(tài)傳播。
8. 如何用 Verdi Trace X?Trace 到什么地方停止?
我們說(shuō)的 Trace X 是指追蹤 X 態(tài)產(chǎn)生的源頭。利用 Verdi 能夠自動(dòng)追蹤組合邏輯、鎖存器、觸發(fā)器等的 X 態(tài)傳播的源頭。Verdi Trace X 有兩種途徑:一種是在 Verdi GUI 內(nèi) Trace,一種是直接利用 Verdi 的 traceX 工具直接 Trace。
8.1 Verdi GUI 內(nèi) Trace
若 X 態(tài)出現(xiàn)傳播,通常能在波形里找到很多 X 態(tài)信號(hào)。多個(gè) X 態(tài)的源頭,此時(shí)我們可以選擇其中一個(gè)信號(hào)進(jìn)行跟蹤。
假設(shè)在波形中已經(jīng)發(fā)現(xiàn)了 X 態(tài),該如何 Trace X 呢??jī)煞N常用方式:
8.1.1 手動(dòng) Trace X
把出現(xiàn) X 態(tài)的信號(hào) A 拖到 nWave 窗口
nWave 窗口 Cursor 點(diǎn)在 X 態(tài)信號(hào) 0/1 -> X 跳變沿的地方
在源代碼窗口左鍵雙擊該信號(hào) A,追蹤其 Driver
檢查 A 的 Driver (控制信號(hào)、觸發(fā)條件、邏輯輸入等) 是否存在 X 態(tài)
重復(fù)以上步驟,直到找到 X 態(tài)產(chǎn)生的源頭
8.1.2 自動(dòng) Trace X
把出現(xiàn) X 態(tài)信號(hào) A 拖到 nWave 窗口
nWave 窗口Cursor 點(diǎn)在 X 態(tài)信號(hào) 0/1 -> X 跳變沿的地方
nWave 窗口右鍵單擊該信號(hào)的波形,或源代碼窗口右鍵單擊該信號(hào)
選擇 Trace X,彈出 Trace X Settings 窗口
窗口勾選所需的 Trace X 相關(guān)設(shè)置。默認(rèn) View Options 為 Flow View,此處我們也可以改為 nWave View
左鍵單擊 Trace,開(kāi)始 Trace X,Trace 結(jié)果一方面顯示在 Flow/nWave 窗口內(nèi),一方面顯示在 tTraceXRst 窗口內(nèi)(Note 提示 X 的大致出現(xiàn)原因)
8.2 Verdi 的 traceX 工具
除了在 GUI 內(nèi)進(jìn)行 X 態(tài)追蹤,Verdi 還提供了 traceX 工具來(lái)追蹤 X 態(tài)。traceX 用法如下:
設(shè)置變量打開(kāi) traceX 工具,setenv VERDI_TRACEX_ENABLE
采用以下命令追蹤 X 態(tài)
未提供 X 態(tài)信號(hào)列表:traceX -lca -ssf xxx.fsdb
提供了 X 態(tài)信號(hào)列表:traceX -lca -ssf xxx.fsdb -signal_file signal.list若需要手段加載 database,還需要添加選項(xiàng) -dbdir simv.daidir
查看 trx_report.txt 查看 Trace 結(jié)果
9. X 態(tài)怎么處理?
如果 X 態(tài)沒(méi)有傳播,無(wú)需處理。
如果 X 態(tài)發(fā)生傳播,但后續(xù)有 X 態(tài)保護(hù)電路,無(wú)需處理。
如果 X 態(tài)發(fā)生傳播,且后續(xù)沒(méi)有 X 態(tài)保護(hù)電路,需要從根源上消除 X 態(tài)。
10. 其他注意事項(xiàng)
assertion 中應(yīng)規(guī)避 X -> 0/1 形成的跳變沿
審核編輯:劉清
-
仿真器
+關(guān)注
關(guān)注
14文章
1018瀏覽量
83744 -
vhdl
+關(guān)注
關(guān)注
30文章
817瀏覽量
128137 -
鎖存器
+關(guān)注
關(guān)注
8文章
906瀏覽量
41508 -
RTL
+關(guān)注
關(guān)注
1文章
385瀏覽量
59785 -
DFT
+關(guān)注
關(guān)注
2文章
231瀏覽量
22728
原文標(biāo)題:X態(tài)及基于VCS的X-Propagation檢測(cè)
文章出處:【微信號(hào):數(shù)字ICer,微信公眾號(hào):數(shù)字ICer】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論