字電路競(jìng)爭(zhēng)與冒險(xiǎn):原理、危害與FPGA/ASIC設(shè)計(jì)中的消除方法)
1. 項(xiàng)目概述從“冒險(xiǎn)”到“冒險(xiǎn)”的電路世界最近看到“冒險(xiǎn)”這個(gè)詞挺火的從游戲到動(dòng)漫到處都在“冒險(xiǎn)”。這讓我這個(gè)搞了十幾年硬件設(shè)計(jì)的老工程師不禁會(huì)心一笑。在我們這個(gè)行當(dāng)里“冒險(xiǎn)”可不是什么好事它指的是數(shù)字電路里一種讓人頭疼的現(xiàn)象——冒險(xiǎn)Hazard。而它的孿生兄弟或者說(shuō)它的“前因”就是競(jìng)爭(zhēng)Race。今天我們不聊游戲存檔也不聊奇妙戰(zhàn)斗就來(lái)深入聊聊組合邏輯電路里這個(gè)既基礎(chǔ)又關(guān)鍵的“競(jìng)爭(zhēng)與冒險(xiǎn)”問(wèn)題。如果你正在學(xué)習(xí)數(shù)字電路或者剛開(kāi)始接觸FPGA/ASIC設(shè)計(jì)那么理解并解決這個(gè)問(wèn)題絕對(duì)是讓你從“青銅”邁向“王者”的必經(jīng)之路能幫你避開(kāi)無(wú)數(shù)深夜調(diào)試的坑。簡(jiǎn)單來(lái)說(shuō)組合電路就是輸出只取決于當(dāng)前輸入的邏輯電路沒(méi)有記憶功能。理想情況下輸入一變輸出瞬間就變。但現(xiàn)實(shí)很骨感信號(hào)在芯片內(nèi)部的導(dǎo)線和門電路中傳播需要時(shí)間這個(gè)時(shí)間延遲就會(huì)導(dǎo)致“競(jìng)爭(zhēng)”。當(dāng)兩個(gè)或更多信號(hào)沿著不同路徑到達(dá)同一個(gè)門電路由于路徑延遲不同它們到達(dá)的時(shí)間有先后就像賽跑一樣這就是“競(jìng)爭(zhēng)”。競(jìng)爭(zhēng)本身不一定出問(wèn)題但它可能引發(fā)“冒險(xiǎn)”在輸入變化的瞬間輸出產(chǎn)生一個(gè)非預(yù)期的、短暫的錯(cuò)誤脈沖毛刺。這個(gè)毛刺雖然短但足以讓后續(xù)的時(shí)序電路比如觸發(fā)器誤動(dòng)作導(dǎo)致整個(gè)系統(tǒng)功能紊亂。所以搞懂競(jìng)爭(zhēng)與冒險(xiǎn)不是為了應(yīng)付考試而是為了做出真正穩(wěn)定可靠的硬件。2. 競(jìng)爭(zhēng)與冒險(xiǎn)的本質(zhì)原理拆解2.1 信號(hào)延遲一切問(wèn)題的根源要理解競(jìng)爭(zhēng)與冒險(xiǎn)首先得拋棄“理想電路”的幻想。在現(xiàn)實(shí)中任何一個(gè)邏輯門與門、或門、非門等從輸入變化到輸出穩(wěn)定都需要一定的時(shí)間這就是門延遲Gate Delay。同樣信號(hào)從芯片上一個(gè)點(diǎn)傳到另一個(gè)點(diǎn)走線本身也有傳輸延遲Propagation Delay。這些延遲通常以納秒ns甚至皮秒ps計(jì)在低速電路中可能微不足道但在幾十、幾百兆赫茲甚至更高頻率的系統(tǒng)中它們就成了必須嚴(yán)肅對(duì)待的主角。延遲的存在意味著電路的狀態(tài)變化不是全局同步、瞬間完成的而是一個(gè)有“順序”的傳播過(guò)程。當(dāng)同一個(gè)輸入信號(hào)通過(guò)兩條或以上具有不同延遲的路徑去影響同一個(gè)輸出點(diǎn)時(shí)競(jìng)爭(zhēng)就發(fā)生了。我們用一個(gè)最經(jīng)典的例子來(lái)看一個(gè)兩輸入的與門一個(gè)輸入直接來(lái)自信號(hào)A另一個(gè)輸入來(lái)自信號(hào)A經(jīng)過(guò)一個(gè)非門后的反相信號(hào)A’。理想情況下A和A’永遠(yuǎn)相反那么與門的輸出Y A A’ 應(yīng)該恒為0。但考慮到非門有延遲當(dāng)A從0跳變到1時(shí)A’不會(huì)立刻從1變到0它會(huì)“慢半拍”。在這個(gè)短暫的“半拍”時(shí)間里A和A’會(huì)同時(shí)為1盡管A’的1是即將消失的舊值導(dǎo)致與門輸出Y產(chǎn)生一個(gè)非常窄的、不應(yīng)該出現(xiàn)的正脈沖毛刺——這就是一次典型的“靜態(tài)1冒險(xiǎn)”輸出本應(yīng)保持1卻出現(xiàn)了0毛刺的反向情況則叫靜態(tài)0冒險(xiǎn)。2.2 競(jìng)爭(zhēng)的類型與冒險(xiǎn)的形態(tài)競(jìng)爭(zhēng)可以根據(jù)其是否必然導(dǎo)致錯(cuò)誤輸出分為非臨界競(jìng)爭(zhēng)和臨界競(jìng)爭(zhēng)。非臨界競(jìng)爭(zhēng)雖然信號(hào)到達(dá)時(shí)間有競(jìng)爭(zhēng)但最終的穩(wěn)態(tài)輸出是唯一的不會(huì)產(chǎn)生錯(cuò)誤。這通常發(fā)生在電路結(jié)構(gòu)簡(jiǎn)單或延遲差異不敏感的情況下。臨界競(jìng)爭(zhēng)信號(hào)到達(dá)的先后順序直接決定了電路最終的穩(wěn)態(tài)輸出是兩種可能中的哪一種。這種競(jìng)爭(zhēng)是功能性的錯(cuò)誤會(huì)導(dǎo)致電路行為不可預(yù)測(cè)在異步時(shí)序電路中尤為危險(xiǎn)。而我們更多在組合電路中關(guān)注的“冒險(xiǎn)”特指由于競(jìng)爭(zhēng)導(dǎo)致的瞬時(shí)錯(cuò)誤輸出它主要有兩種形態(tài)靜態(tài)冒險(xiǎn)當(dāng)輸入信號(hào)變化而輸出本應(yīng)保持不變時(shí)卻出現(xiàn)了短暫的錯(cuò)誤跳變。靜態(tài)0冒險(xiǎn)輸出應(yīng)恒為1卻出現(xiàn)了短暫的0毛刺。靜態(tài)1冒險(xiǎn)輸出應(yīng)恒為0卻出現(xiàn)了短暫的1毛刺。動(dòng)態(tài)冒險(xiǎn)當(dāng)輸入信號(hào)變化輸出本應(yīng)從0變1或1變0時(shí)在變化過(guò)程中出現(xiàn)了多次跳變?nèi)?-1-0-1。動(dòng)態(tài)冒險(xiǎn)相對(duì)少見(jiàn)通常是多級(jí)路徑延遲累積和重組的結(jié)果分析起來(lái)更復(fù)雜。注意我們常說(shuō)的“毛刺Glitch”通常就是指靜態(tài)冒險(xiǎn)產(chǎn)生的那個(gè)短暫錯(cuò)誤脈沖。它是硬件工程師在示波器上最不想看到卻又經(jīng)常不得不面對(duì)的“老朋友”。2.3 卡諾圖發(fā)現(xiàn)冒險(xiǎn)的“火眼金睛”在電路設(shè)計(jì)階段我們?nèi)绾晤A(yù)判一個(gè)組合邏輯電路是否存在靜態(tài)冒險(xiǎn)呢一個(gè)非常有效的方法是使用卡諾圖。布爾代數(shù)化簡(jiǎn)可以讓我們得到最簡(jiǎn)的邏輯表達(dá)式但最簡(jiǎn)的未必是“最安全”的。有時(shí)為了消除冒險(xiǎn)我們需要故意增加一些冗余項(xiàng)。判斷規(guī)則是在卡諾圖中如果兩個(gè)相鄰的“1”格對(duì)于輸出為1的函數(shù)沒(méi)有被同一個(gè)乘積項(xiàng)即同一個(gè)卡諾圈所覆蓋那么當(dāng)輸入在這兩個(gè)格之間變化時(shí)就可能發(fā)生靜態(tài)1冒險(xiǎn)。同理對(duì)于輸出為0的函數(shù)看相鄰的“0”格。舉個(gè)例子假設(shè)有一個(gè)三變量函數(shù) F A’C AC’。它的卡諾圖如下AB為行C為列\(zhòng) AB C | 00 | 01 | 11 | 10 ----------------------- 0 | 0 | 1 | 1 | 0 1 | 0 | 0 | 1 | 1這里A’C 對(duì)應(yīng)的是卡諾圖中 C0 列A0 的行即01/0和11/0格圈起來(lái)。AC’ 對(duì)應(yīng)的是 C1 列A1的行即11/1和10/1格圈起來(lái)。你會(huì)發(fā)現(xiàn)當(dāng)輸入從 ABC111對(duì)應(yīng)格11/1F1變化到 ABC110對(duì)應(yīng)格11/0F1時(shí)路徑是從AC’這個(gè)圈跳到了A’C這個(gè)圈。這兩個(gè)圈是相鄰但分離的。在變化瞬間如果A的變化經(jīng)過(guò)非門產(chǎn)生A’和C的變化不同步就可能出現(xiàn)兩個(gè)圈都暫時(shí)不覆蓋的“空白”狀態(tài)導(dǎo)致F出現(xiàn)一個(gè)短暫的0毛刺靜態(tài)1冒險(xiǎn)。為了消除它我們可以把這兩個(gè)圈中間相鄰的“1”格即111和110再用一個(gè)圈圈起來(lái)這個(gè)圈對(duì)應(yīng)的乘積項(xiàng)是AB。于是無(wú)冒險(xiǎn)的表達(dá)式為 F A’C AC’ AB。這個(gè)AB項(xiàng)就是冗余項(xiàng)從邏輯化簡(jiǎn)角度看是多余的但從消除冒險(xiǎn)角度看是必要的。3. 競(jìng)爭(zhēng)與冒險(xiǎn)的實(shí)戰(zhàn)影響與排查3.1 冒險(xiǎn)會(huì)帶來(lái)什么實(shí)際危害你可能會(huì)想一個(gè)只有幾納秒的毛刺人眼根本看不見(jiàn)能有多大影響危害可大了去了尤其是在同步數(shù)字系統(tǒng)中觸發(fā)誤動(dòng)作這是最常見(jiàn)的危害。后續(xù)的時(shí)序邏輯器件如D觸發(fā)器是在時(shí)鐘邊沿采樣數(shù)據(jù)的。如果數(shù)據(jù)輸入端在時(shí)鐘邊沿附近出現(xiàn)毛刺觸發(fā)器就可能采樣到這個(gè)錯(cuò)誤的值導(dǎo)致?tīng)顟B(tài)機(jī)跑飛、計(jì)數(shù)器亂跳、數(shù)據(jù)錯(cuò)誤。這就好比在裁判吹哨決定勝負(fù)的瞬間有個(gè)觀眾扔了個(gè)小石子干擾了運(yùn)動(dòng)員裁判可能就誤判了。增加功耗每一次邏輯跳變無(wú)論是正常的還是毛刺引起的都會(huì)對(duì)負(fù)載電容進(jìn)行充放電從而消耗動(dòng)態(tài)功耗。大量的毛刺會(huì)顯著增加芯片的整體功耗對(duì)于電池供電的移動(dòng)設(shè)備是致命的。產(chǎn)生電磁干擾毛刺是高頻的瞬變信號(hào)它會(huì)導(dǎo)致電源和地線上產(chǎn)生噪聲并通過(guò)空間輻射或傳導(dǎo)發(fā)射出去可能干擾系統(tǒng)內(nèi)其他敏感電路甚至導(dǎo)致產(chǎn)品無(wú)法通過(guò)電磁兼容性測(cè)試。影響異步電路在純異步邏輯或異步復(fù)位/置位電路中毛刺可能被直接當(dāng)作有效的控制信號(hào)導(dǎo)致系統(tǒng)徹底崩潰。我在早期做一個(gè)電機(jī)控制板時(shí)就吃過(guò)血虧。一個(gè)控制信號(hào)上的毛刺導(dǎo)致功率MOSFET在極短時(shí)間內(nèi)被錯(cuò)誤地打開(kāi)又關(guān)閉產(chǎn)生巨大的瞬時(shí)電流不僅燒了MOS管還讓整個(gè)電源軌塌陷系統(tǒng)重啟。后來(lái)用示波器捕獲到那個(gè)“罪魁禍?zhǔn)住钡拿滩呕腥淮笪颉?.2 如何用工具和儀器捕捉“幽靈”毛刺既然危害這么大我們?cè)趺窗l(fā)現(xiàn)它呢不能光靠理論分析必須實(shí)測(cè)。仿真驗(yàn)證這是設(shè)計(jì)階段最重要的手段。使用EDA工具如ModelSim, VCS進(jìn)行時(shí)序仿真。一定要使用帶有時(shí)延信息的門級(jí)網(wǎng)表進(jìn)行后仿真而不是僅僅做功能仿真。在仿真波形中仔細(xì)查看所有輸出信號(hào)在輸入變化時(shí)的細(xì)節(jié)放大時(shí)間軸尋找那些不該出現(xiàn)的窄脈沖。大多數(shù)綜合工具也會(huì)提供靜態(tài)時(shí)序分析報(bào)告其中可能會(huì)提示潛在的冒險(xiǎn)。示波器實(shí)測(cè)對(duì)于物理電路高帶寬示波器是捕捉毛刺的利器。觸發(fā)設(shè)置這是關(guān)鍵。不要只用邊沿觸發(fā)。要使用毛刺觸發(fā)或脈寬觸發(fā)模式。你可以設(shè)置觸發(fā)條件為“捕捉脈寬小于某個(gè)值比如5ns的脈沖”。這樣一旦有毛刺出現(xiàn)示波器就能自動(dòng)捕獲并定格波形。探頭與帶寬使用接地彈簧而不是長(zhǎng)長(zhǎng)的接地夾以減少探頭引入的噪聲。示波器的帶寬要遠(yuǎn)高于你關(guān)心的信號(hào)頻率通常要求帶寬是信號(hào)最高頻率的3-5倍否則毛刺細(xì)節(jié)會(huì)被濾掉。多次捕獲與持久顯示使用示波器的無(wú)限持久顯示模式讓波形疊加顯示一段時(shí)間。毛刺可能不是每次輸入變化都出現(xiàn)和延遲的細(xì)微變化有關(guān)通過(guò)持久顯示可以增加捕捉到偶發(fā)毛刺的概率。邏輯分析儀對(duì)于多路信號(hào)的同時(shí)觀測(cè)和長(zhǎng)時(shí)間記錄邏輯分析儀更合適。它可以設(shè)置復(fù)雜的觸發(fā)條件捕獲毛刺發(fā)生前后大量通道的數(shù)據(jù)便于分析毛刺產(chǎn)生的邏輯上下文。實(shí)操心得抓毛刺時(shí)心態(tài)要穩(wěn)。它可能時(shí)有時(shí)無(wú)。有一次我為了抓一個(gè)偶發(fā)的冒險(xiǎn)把示波器的觸發(fā)條件設(shè)得極其苛刻然后去喝了杯咖啡回來(lái)就看到了它“靚麗”的身影。另外注意區(qū)分真正的毛刺和測(cè)量引入的噪聲。可以通過(guò)對(duì)比探頭直接接觸芯片引腳和通過(guò)PCB走線測(cè)量?jī)煞N方式來(lái)輔助判斷。4. 消除競(jìng)爭(zhēng)與冒險(xiǎn)的經(jīng)典方法與工程實(shí)踐知道了危害也抓住了它接下來(lái)就是如何消滅它。這里有幾套經(jīng)過(guò)實(shí)戰(zhàn)檢驗(yàn)的“組合拳”。4.1 設(shè)計(jì)層面的“治本”之法增加冗余項(xiàng)如前文卡諾圖分析所述這是從布爾代數(shù)層面消除靜態(tài)冒險(xiǎn)的經(jīng)典方法。通過(guò)增加冗余的乘積項(xiàng)確保在任何輸入變化路徑上輸出對(duì)應(yīng)的“覆蓋”不會(huì)出現(xiàn)空白。現(xiàn)代綜合工具通常具備“冒險(xiǎn)消除”的選項(xiàng)但理解其原理對(duì)于手動(dòng)優(yōu)化RTL代碼仍有指導(dǎo)意義。選通法引入一個(gè)“使能”或“選通”信號(hào)。在電路上電初始化或輸入信號(hào)可能不穩(wěn)定的階段讓這個(gè)選通信號(hào)無(wú)效封鎖輸出。等到所有輸入都穩(wěn)定后再讓選通信號(hào)有效輸出正確結(jié)果。這相當(dāng)于給電路裝了個(gè)“安全門”。改變?cè)O(shè)計(jì)架構(gòu)這是最徹底的方法。如果競(jìng)爭(zhēng)冒險(xiǎn)問(wèn)題很復(fù)雜或許意味著當(dāng)前邏輯設(shè)計(jì)本身存在瑕疵。可以考慮同步設(shè)計(jì)盡可能采用同步時(shí)序設(shè)計(jì)將組合邏輯的輸出用寄存器觸發(fā)器打一拍。這是FPGA/ASIC設(shè)計(jì)中最常用、最有效的辦法。寄存器在時(shí)鐘邊沿采樣只要毛刺不出現(xiàn)在時(shí)鐘邊沿的建立-保持時(shí)間窗口內(nèi)就會(huì)被過(guò)濾掉。這就是所謂的“用時(shí)序換穩(wěn)定”。格雷碼編碼在狀態(tài)機(jī)或計(jì)數(shù)器中使用格雷碼代替二進(jìn)制碼。格雷碼的特點(diǎn)是相鄰狀態(tài)之間只有一位變化這從根本上避免了多比特同時(shí)變化可能產(chǎn)生的競(jìng)爭(zhēng)冒險(xiǎn)。例如一個(gè)兩位的二進(jìn)制計(jì)數(shù)器從01變到10兩位都變化容易產(chǎn)生冒險(xiǎn)。而格雷碼的對(duì)應(yīng)變化是01-11只有一位變化。流水線化將大段組合邏輯拆分成多級(jí)小段中間插入寄存器。這既提高了系統(tǒng)時(shí)鐘頻率也減少了單級(jí)組合邏輯的延遲從而降低了毛刺的寬度和影響范圍。4.2 電路層面的“治標(biāo)”之術(shù)當(dāng)設(shè)計(jì)已經(jīng)固化或者需要在板級(jí)進(jìn)行補(bǔ)救時(shí)可以采取以下措施輸出端接濾波電容在輸出端對(duì)地接一個(gè)小電容幾十到幾百皮法可以吸收高頻毛刺。原理是利用電容的電壓不能突變的特性減緩信號(hào)邊沿將窄毛刺“平滑”掉。但這種方法會(huì)惡化信號(hào)的上升/下降時(shí)間增加傳輸延遲只適用于對(duì)信號(hào)速度要求不高的場(chǎng)合。使用施密特觸發(fā)器施密特觸發(fā)器具有滯回特性對(duì)輸入信號(hào)有一定的噪聲容限。毛刺如果幅度不夠大就無(wú)法觸發(fā)施密特觸發(fā)器翻轉(zhuǎn)。可以將易產(chǎn)生毛刺的組合邏輯輸出經(jīng)過(guò)一級(jí)施密特觸發(fā)器整形后再送出。優(yōu)化PCB布局布線對(duì)于高速電路PCB設(shè)計(jì)至關(guān)重要。等長(zhǎng)布線對(duì)于需要同時(shí)到達(dá)的關(guān)鍵信號(hào)組如總線、時(shí)鐘與數(shù)據(jù)盡量采用等長(zhǎng)布線以減少信號(hào)間的偏移從而減少因到達(dá)時(shí)間不同而產(chǎn)生的競(jìng)爭(zhēng)。減少分支和樁線信號(hào)路徑應(yīng)簡(jiǎn)潔避免過(guò)多的分支和過(guò)長(zhǎng)的樁線這些都會(huì)引起反射和信號(hào)完整性問(wèn)題可能加劇毛刺。良好的電源去耦在芯片電源引腳附近放置足夠多、容值搭配合理的去耦電容如0.1uF和10uF組合為芯片提供干凈的局部電源可以減少因電源噪聲引起的毛刺。4.3 在FPGA/ASIC設(shè)計(jì)流程中的具體操作以最常用的“寄存器打拍”為例看看在硬件描述語(yǔ)言中如何實(shí)現(xiàn)// 存在潛在毛刺的組合邏輯 module comb_logic ( input wire a, b, c, output wire y ); assign y (a b) | (b c) | (a c); // 一個(gè)可能產(chǎn)生冒險(xiǎn)的邏輯 endmodule // 采用寄存器輸出消除毛刺影響 module comb_logic_safe ( input wire clk, // 時(shí)鐘 input wire rst_n, // 異步復(fù)位低有效 input wire a, b, c, output reg y_reg // 寄存器輸出 ); wire y_comb; // 組合邏輯輸出 assign y_comb (a b) | (b c) | (a c); always (posedge clk or negedge rst_n) begin if (!rst_n) begin y_reg 1b0; end else begin y_reg y_comb; // 在時(shí)鐘上升沿將組合邏輯結(jié)果鎖存 end end endmodule在上面的safe模塊中y_comb線上可能仍有毛刺但y_reg輸出只在時(shí)鐘上升沿更新只要毛刺不在時(shí)鐘沿附近出現(xiàn)輸出就是穩(wěn)定的。這就是同步設(shè)計(jì)的核心思想。5. 常見(jiàn)問(wèn)題與深度排查指南即使掌握了理論和方法實(shí)際工程中還是會(huì)遇到各種詭異的問(wèn)題。下面是我總結(jié)的一些常見(jiàn)坑點(diǎn)和排查思路。5.1 為什么我的代碼仿真沒(méi)問(wèn)題但燒錄后行為異常這是最典型的問(wèn)題根源在于仿真與現(xiàn)實(shí)的差距。仿真太理想你可能只做了功能仿真前仿使用的是零延遲模型。這種情況下電路表現(xiàn)完美。但真實(shí)的芯片有延遲布線后延遲各不相同。解決方案必須進(jìn)行時(shí)序仿真后仿使用綜合和布局布線后生成的、包含實(shí)際延遲信息的網(wǎng)表進(jìn)行仿真。時(shí)鐘質(zhì)量差如果時(shí)鐘信號(hào)本身就有毛刺或抖動(dòng)那么整個(gè)同步系統(tǒng)的根基就不穩(wěn)。用示波器測(cè)量時(shí)鐘信號(hào)的抖動(dòng)和眼圖。檢查時(shí)鐘源、時(shí)鐘布線、以及時(shí)鐘緩沖器的電源是否干凈。異步信號(hào)處理不當(dāng)如果組合邏輯的輸入來(lái)自異步時(shí)鐘域比如一個(gè)按鍵輸入那么這個(gè)信號(hào)的變化相對(duì)于系統(tǒng)時(shí)鐘是隨機(jī)的極易在同步器第一級(jí)觸發(fā)器的輸入端滿足建立保持時(shí)間導(dǎo)致亞穩(wěn)態(tài)亞穩(wěn)態(tài)的傳播可能看起來(lái)像毛刺。解決方案對(duì)異步輸入信號(hào)采用雙觸發(fā)器同步器進(jìn)行同步。5.2 增加了寄存器后毛刺似乎“轉(zhuǎn)移”了有時(shí)你會(huì)發(fā)現(xiàn)在組合邏輯輸出端加寄存器后原來(lái)位置的毛刺消失了但系統(tǒng)功能還是不對(duì)。這可能是因?yàn)槊坛霈F(xiàn)在了寄存器的時(shí)鐘路徑上這是更危險(xiǎn)的情況。如果時(shí)鐘線上有毛刺可能導(dǎo)致寄存器在非預(yù)期的時(shí)刻觸發(fā)。檢查時(shí)鐘樹(shù)的驅(qū)動(dòng)能力確保時(shí)鐘源和時(shí)鐘分配網(wǎng)絡(luò)足夠強(qiáng)壯遠(yuǎn)離噪聲源。毛刺影響了寄存器的異步控制端如復(fù)位端或置位端。一個(gè)毛刺如果出現(xiàn)在異步復(fù)位線上會(huì)導(dǎo)致整個(gè)模塊被意外復(fù)位。解決方案對(duì)異步復(fù)位信號(hào)進(jìn)行“去毛刺”和同步釋放處理。下一級(jí)邏輯的輸入仍有競(jìng)爭(zhēng)你只是保護(hù)了本級(jí)輸出但產(chǎn)生這個(gè)輸出的組合邏輯內(nèi)部節(jié)點(diǎn)如果有毛刺并且被電路其他部分引用了那么毛刺的影響依然存在。需要整體審視代碼確保所有關(guān)鍵的內(nèi)部節(jié)點(diǎn)也都得到了妥善處理或不被敏感電路使用。5.3 如何區(qū)分冒險(xiǎn)毛刺和信號(hào)完整性引起的振鈴在示波器上一個(gè)快速的脈沖可能是冒險(xiǎn)毛刺也可能是由于阻抗不匹配引起的信號(hào)反射振鈴。區(qū)分方法看成因冒險(xiǎn)毛刺通常與輸入信號(hào)的跳變有嚴(yán)格的邏輯關(guān)系出現(xiàn)在輸入變化后一個(gè)固定的、較短的延遲后即路徑延遲差。振鈴則伴隨信號(hào)的主要跳變沿發(fā)生是過(guò)沖和衰減振蕩。看波形毛刺通常是一個(gè)單極性的窄脈沖。振鈴則是在跳變邊沿上下波動(dòng)逐漸衰減。看對(duì)策消除冒險(xiǎn)需要改邏輯或同步。改善振鈴則需要調(diào)整端接電阻、優(yōu)化布線阻抗等SI手段。5.4 高級(jí)排查工具與技巧使用集成邏輯分析儀像Xilinx的ChipScope、Intel的SignalTap II這類工具可以把FPGA的一部分邏輯資源變成虛擬的邏輯分析儀直接抓取芯片內(nèi)部任何信號(hào)的實(shí)時(shí)波形。這對(duì)于調(diào)試內(nèi)部深層次的競(jìng)爭(zhēng)冒險(xiǎn)問(wèn)題無(wú)比重要因?yàn)槟阌猛獠渴静ㄆ魇强床坏絻?nèi)部節(jié)點(diǎn)信號(hào)的。靜態(tài)時(shí)序分析報(bào)告仔細(xì)閱讀綜合工具給出的時(shí)序報(bào)告。關(guān)注“建立時(shí)間”和“保持時(shí)間”的違例。雖然STA主要檢查時(shí)序路徑但某些設(shè)置下工具也能報(bào)告潛在的冒險(xiǎn)。特別要關(guān)注同一信號(hào)源到多個(gè)目的地的路徑延遲差異。功耗分析報(bào)告如果動(dòng)態(tài)功耗異常高可能暗示電路中有大量的不必要的跳變活動(dòng)其中很可能包含毛刺。這是一個(gè)間接的線索。我個(gè)人最深刻的一次教訓(xùn)是在一個(gè)高速數(shù)據(jù)接口設(shè)計(jì)中仿真和靜態(tài)時(shí)序分析都通過(guò)了但實(shí)測(cè)就是有偶發(fā)錯(cuò)誤。最后用ChipScope抓取數(shù)據(jù)發(fā)現(xiàn)數(shù)據(jù)總線在穩(wěn)定期間有個(gè)別位有極窄的毛刺。原因是編寫RTL時(shí)用一個(gè)復(fù)雜的多級(jí)組合邏輯生成了一個(gè)“數(shù)據(jù)有效”信號(hào)這個(gè)信號(hào)上的毛刺導(dǎo)致數(shù)據(jù)被多采樣了一次。解決方法很簡(jiǎn)單把這個(gè)“數(shù)據(jù)有效”信號(hào)也用寄存器打了一拍與數(shù)據(jù)對(duì)齊問(wèn)題徹底解決。這件事讓我明白在高速設(shè)計(jì)中任何關(guān)鍵的控制信號(hào)其穩(wěn)定性優(yōu)先級(jí)甚至高于數(shù)據(jù)信號(hào)本身。