鐘檢查策略:五種門電路差異與XOR處理)
做低功耗設(shè)計(jì)和時(shí)鐘樹收斂的兄弟基本都被門控時(shí)鐘“教育”過。同樣一條時(shí)鐘路徑加上一個(gè)門控單元換成AND、OR、NAND、NOR甚至XORPrimeTime跑出來的檢查結(jié)果可能千差萬別。很多人只記住了AND門控的寫法一碰到XOR門控就懵工具要么報(bào)unconstrained要么檢查方向完全反了。這篇文章用實(shí)際項(xiàng)目和命令把5種門控電路在PrimeTime里的檢查策略差異說明白順便把XOR這類“非標(biāo)準(zhǔn)門控”的處理方案拆開講透。1. 先從門控電路說起為什么同樣一條路徑工具會“區(qū)別對待”1.1 門控時(shí)鐘的本質(zhì)讓時(shí)鐘“按需跳動(dòng)”門控時(shí)鐘在數(shù)字IC里太常見了尤其在低功耗設(shè)計(jì)里模塊空閑時(shí)直接把時(shí)鐘掐掉動(dòng)態(tài)功耗能降一截。實(shí)現(xiàn)上無非兩種路子一種是直接用組合邏輯搭門控常見的就是AND門、OR門、NAND門、NOR門甚至有人會用XOR門做動(dòng)態(tài)極性控制另一種是用專用的集成電路門控單元ICG內(nèi)部一般是“鎖存器與門”結(jié)構(gòu)用庫單元實(shí)現(xiàn)時(shí)序上更安全。組合邏輯門控最大的問題是毛刺glitch。使能信號如果剛好在時(shí)鐘有效沿附近跳變輸出時(shí)鐘可能出現(xiàn)極窄的脈沖后級觸發(fā)器采出什么誰也不敢保證。所以工具在時(shí)序分析時(shí)會專門給門控單元插入一類檢查叫做時(shí)鐘門控檢查clock gating check目的就是約束使能信號相對于時(shí)鐘邊沿的建立時(shí)間和保持時(shí)間。這就是標(biāo)題里說的“檢查策略”的核心。1.2 PrimeTime里的“檢查”到底查什么PrimeTime做時(shí)鐘門控檢查本質(zhì)上是沿著門控單元的兩個(gè)輸入端口分別追蹤一個(gè)端口接時(shí)鐘另一個(gè)端口接使能信號。工具需要知道門控輸出在什么時(shí)候允許時(shí)鐘通過什么時(shí)候屏蔽時(shí)鐘才能判斷該在哪個(gè)沿檢查使能信號相對時(shí)鐘的穩(wěn)定關(guān)系。這里有個(gè)關(guān)鍵概念門控單元的“有效時(shí)鐘極性”。對AND門來說輸出YCLK EN時(shí)鐘高電平有效使能高電平有效邏輯很清楚工具自動(dòng)推斷出來的結(jié)論是“在時(shí)鐘上升沿附近檢查EN”。但對OR門、NAND門、XOR門情況就變了。OR門的輸出YCLK | EN低電平使能有效XOR門輸出YCLK ^ EN使能信號不同值時(shí)輸出時(shí)鐘的極性直接翻轉(zhuǎn)。這種非單調(diào)邏輯PrimeTime的默認(rèn)推斷機(jī)制經(jīng)常會“抓瞎”所以就需要人工指定策略。2. 五種門控電路的檢查策略差異2.1 AND門控教科書式的默認(rèn)檢查AND門控是最標(biāo)準(zhǔn)的組合門控結(jié)構(gòu)。時(shí)鐘接CLK輸入使能接EN輸入輸出YCLK ENEN為高時(shí)時(shí)鐘通過EN為低時(shí)時(shí)鐘屏蔽。PrimeTime對這種結(jié)構(gòu)的自動(dòng)識別成功率很高因?yàn)锳ND門的布爾函數(shù)是單調(diào)的工具能直接得出有效沿和檢查沿。實(shí)際項(xiàng)目中如果用的是庫里的ICG單元檢查約束通常會在庫里定義好不需要手動(dòng)設(shè)置。但如果是自己搭的AND門控就要顯式調(diào)用命令set_clock_gating_check -setup 0.2 -hold 0.1 [get_pins u_gate_inst/Y]這條命令的意思是在門控輸出Y對應(yīng)的檢查沿上要求使能信號相對于該沿至少有0.2ns的建立時(shí)間和0.1ns的保持時(shí)間。這里要注意setup和hold的單位是ns具體數(shù)值要根據(jù)工藝庫和時(shí)鐘頻率來定不要照抄。AND門控最常見的問題反而是前端RTL寫法導(dǎo)致的毛刺。如果使能信號由組合邏輯產(chǎn)生并且沒有經(jīng)過鎖存器直接去門控時(shí)鐘那無論在PrimeTime里怎么設(shè)檢查物理上都很危險(xiǎn)。所以做后端的人拿到這類設(shè)計(jì)第一反應(yīng)是看門控使能是否足夠干凈。2.2 OR門控使能極性與檢查邊沿的轉(zhuǎn)換OR門控的邏輯是輸出YCLK | ENEN為低時(shí)時(shí)鐘通過EN為高時(shí)強(qiáng)制拉高屏蔽時(shí)鐘。這種門控通常用在需要低電平使能的場景但相比AND門控少得多因?yàn)榇蠖鄶?shù)時(shí)鐘門控標(biāo)準(zhǔn)單元都是高有效使能。在PrimeTime里OR門控的自動(dòng)識別依賴庫單元屬性的正確描述。如果單元庫沒有給OR門標(biāo)注clock gating template工具可能直接把它當(dāng)成普通組合邏輯根本不會插入時(shí)鐘門控檢查這是最隱蔽的一種坑因?yàn)闀r(shí)序報(bào)告不會報(bào)錯(cuò)但設(shè)計(jì)其實(shí)缺了一道重要約束。我自己遇到過一次一個(gè)分頻模塊里用OR門做時(shí)鐘使能仿真沒問題但跑到STA發(fā)現(xiàn)時(shí)鐘門口沒有任何檢查。查了半天最后定位到庫文件里那個(gè)OR單元缺少clock_gating_integrated_cell相關(guān)屬性。解決辦法是用LIB文件編輯器補(bǔ)全屬性或者在約束里手動(dòng)標(biāo)記。如果確認(rèn)OR門控結(jié)構(gòu)沒問題可以用report_clock_gating_check看看工具是否識別成功沒有的話建議先給這個(gè)單元添加時(shí)鐘門控屬性優(yōu)先級最高的做法還是后端實(shí)現(xiàn)階段直接換成標(biāo)準(zhǔn)ICG省心且安全。2.3 NAND與NOR極性翻轉(zhuǎn)帶來的“坑”NAND門和NOR門自帶反相器輸出時(shí)鐘相位和輸入時(shí)鐘相反。NAND門Y~(CLK EN)等價(jià)于AND門后加反相器NOR門Y~(CLK | EN)等價(jià)于OR門后加反相器。輸出反相帶來的直接影響是后續(xù)所有觸發(fā)器的采樣時(shí)鐘沿從上升沿變成下降沿如果原來用的是上升沿。PrimeTime在推斷NAND/NOR門控的時(shí)鐘門控檢查時(shí)需要額外考慮極性翻轉(zhuǎn)。比如NAND門輸出時(shí)鐘的低電平對應(yīng)原始時(shí)鐘的高電平工具會沿著邏輯反向推導(dǎo)把檢查沿從上升沿翻到下降沿。這個(gè)推導(dǎo)過程依賴工具對“時(shí)鐘極性傳播”的理解如果中間還有其他組合邏輯阻擋推導(dǎo)可能失敗。在這種情況下最需要的命令是set_clock_sense用來顯式告訴工具某個(gè)pin上時(shí)鐘的極性關(guān)系set_clock_sense -negative -pins [get_pins u_nand_out/Y]這里-negative表示該pin的輸出時(shí)鐘與輸入時(shí)鐘反相。當(dāng)PrimeTime知道輸出時(shí)鐘反相后后續(xù)的時(shí)鐘門控檢查就會用正確的下降沿去約束。NAND/NOR門控還有個(gè)容易踩的坑是建立時(shí)間和保持時(shí)間的檢查位置。由于輸出反相原始時(shí)鐘的上升沿對應(yīng)NAND輸出時(shí)鐘的下降沿如果后級寄存器是上升沿采樣那NAND輸出時(shí)鐘到達(dá)寄存器時(shí)數(shù)據(jù)建立關(guān)系會重新調(diào)整很多人會在這里繞暈。最佳實(shí)踐是不要自己推直接用PrimeTime的時(shí)序報(bào)告把-delay_type max和-delay_type min分別拉出來看建立和保持看工具到底把檢查沿標(biāo)在了哪里。2.4 XOR門控讓工具“抓狂”的特殊分子XOR門控要單獨(dú)拿出來講因?yàn)樗跈z查策略上是完全不同的玩法。邏輯表達(dá)式Y(jié)A^B假設(shè)時(shí)鐘接A使能接B。當(dāng)B0時(shí)YA時(shí)鐘正常通過當(dāng)B1時(shí)Y~A輸出時(shí)鐘極性直接翻轉(zhuǎn)。這意味著同一個(gè)XOR門可以同時(shí)具備正門控和反相門控兩種行為PrimeTime默認(rèn)根本沒法確定唯一的檢查沿。實(shí)際項(xiàng)目里XOR門控常用于可配置時(shí)鐘極性、動(dòng)態(tài)時(shí)鐘相位調(diào)整這些場景。比如一個(gè)接口模塊需要在發(fā)送和接收兩個(gè)模式之間切換時(shí)鐘極性有人圖省事直接拿XOR門來實(shí)現(xiàn)后端就開始頭疼了。處理XOR門控推薦以下三種方案。方案一用set_case_analysis固定控制端。如果XOR的選擇信號在某一配置下是固定的直接告訴工具這個(gè)值工具就能把XOR等效成一個(gè)Buffer或反相器set_case_analysis 0 [get_pins u_xor_inst/sel] set_clock_sense -positive -pins [get_pins u_xor_inst/Y]set_case_analysis 0讓工具知道sel固定為0此時(shí)YA時(shí)鐘極性不變再用set_clock_sense顯式聲明Y輸出與輸入同相消除歧義。這種做法的局限是只能覆蓋單種配置如果設(shè)計(jì)需要在兩種模式下都做收斂就要分別跑兩次約束。方案二把XOR建模成時(shí)鐘MUX。當(dāng)sel是動(dòng)態(tài)信號運(yùn)行時(shí)會在0和1之間切換更穩(wěn)妥的做法是把XOR的時(shí)序行為改寫成二選一MUX模型sel作為選擇端兩條數(shù)據(jù)通道分別是原時(shí)鐘和反相時(shí)鐘。這樣PrimeTime能正確分析兩種路徑但需要額外處理sel與時(shí)鐘的異步關(guān)系復(fù)雜度會上升不少。方案三直接放棄XOR做門控在后端把邏輯替換成標(biāo)準(zhǔn)ICG前面用普通邏輯控制ICG的TE端。這是最穩(wěn)妥的路子我實(shí)際項(xiàng)目里遇到XOR門控且時(shí)序緊張時(shí)都是直接讓前端修改設(shè)計(jì)換成ICG不僅PrimeTime檢查簡單物理實(shí)現(xiàn)上的毛刺風(fēng)險(xiǎn)也小得多。2.5 五種門控的檢查策略對比表門類型輸出邏輯使能有效電平時(shí)鐘通過條件工具默認(rèn)檢查邊沿自動(dòng)識別難度常見風(fēng)險(xiǎn)ANDCLK EN高EN1時(shí)鐘上升沿低毛刺、使能信號不干凈ORCLK | EN低EN0時(shí)鐘下降沿或按需推斷中庫屬性缺失導(dǎo)致不識別NAND~(CLK EN)高/反相輸出EN1且輸出反相檢查沿隨極性翻轉(zhuǎn)中后續(xù)采樣沿變化NOR~(CLK | EN)低/反相輸出EN0且輸出反相檢查沿隨極性翻轉(zhuǎn)中與NAND類似約束易錯(cuò)XORCLK ^ EN動(dòng)態(tài)sel決定同相/反相無法默認(rèn)確定高檢查缺失、檢查沿錯(cuò)誤這張表建議保存后端review時(shí)序約束時(shí)經(jīng)常用得上。前四種門控只要邏輯庫屬性完整工具自動(dòng)推斷基本能搞定XOR幾乎一定需要人工介入。3. 實(shí)操在PrimeTime中把這些策略配置起來3.1 從網(wǎng)表到約束如何讓工具正確識別門控拿到一個(gè)帶門控時(shí)鐘的網(wǎng)表先別急著寫約束第一步應(yīng)該是用PrimeTime的命令確認(rèn)工具到底識別了哪些門控單元。最直接的是看報(bào)告report_clock_gating_check -verbose -delay_type max這個(gè)命令會輸出所有被識別為時(shí)鐘門控的單元以及各自的setup/hold檢查結(jié)果。如果某個(gè)你認(rèn)為是門控的地方?jīng)]出現(xiàn)在報(bào)告里說明工具沒有把它當(dāng)作時(shí)鐘門控后續(xù)檢查自然無從談起。另一種快速定位方法是用check_timing它會列出所有沒有被約束到位的時(shí)序檢查包括缺失的時(shí)鐘門控檢查。我記得有一次在一個(gè)多時(shí)鐘域模塊里check_timing報(bào)出幾十條時(shí)鐘門控檢查缺失最后定位下來全是OR門控單元缺屬性導(dǎo)致的。3.2 set_clock_gating_check的完整參數(shù)解讀set_clock_gating_check是配置門控檢查的核心命令參數(shù)不多但每個(gè)都挺關(guān)鍵set_clock_gating_check -setup 0.2 -hold 0.05 -rise -fall [get_pins u_cell/Y]-setup和-hold指定檢查的時(shí)間裕量單位是ns。-rise表示檢查門控輸出上升沿對應(yīng)的時(shí)刻-fall對應(yīng)下降沿。當(dāng)下需要特別注意如果門控單元的輸出時(shí)鐘極性不確定-rise和-fall兩個(gè)選項(xiàng)同時(shí)使用時(shí)意味著對上升沿和下降沿都執(zhí)行檢查這在某些場景下會過于悲觀甚至產(chǎn)生偽violation。還有一個(gè)隱藏參數(shù)是-clock_gating_cell它不是標(biāo)準(zhǔn)命令參數(shù)但在某些流程里可以通過它來指定某類單元強(qiáng)制作為時(shí)鐘門控處理。多數(shù)時(shí)候不用管它但如果你用的庫單元命名草率工具又死活不認(rèn)可以去查一下EDA腳本里有沒有類似的適配方式。關(guān)于數(shù)值選取門控檢查的setup/hold應(yīng)該參考標(biāo)準(zhǔn)單元庫中時(shí)鐘門控單元的時(shí)序弧。如果庫里沒有定義可以先跑一版默認(rèn)檢查看violation集中在哪些路徑上再反向調(diào)整。3.3 用report_clock_gating_check排查潛在問題報(bào)告輸出通常分三列門控單元pin、檢查類型setup或hold、檢查裕量??吹揭粋€(gè)violation時(shí)不要急著去改約束先確認(rèn)檢查沿選對了沒有。以XOR門控為例我實(shí)測過這樣一個(gè)場景sel信號沒有加case分析PrimeTime默認(rèn)把XOR當(dāng)成普通邏輯并沒有生成時(shí)鐘門控檢查但report_clock_gating_check也不會報(bào)錯(cuò)只是不列出這個(gè)單元。這個(gè)“靜默缺失”是最難排查的。后來我把XOR的輸出pin單獨(dú)抓出來看report_timing -from [get_pins u_xor_inst/A] -to [get_pins u_xor_inst/Y] -delay_type max發(fā)現(xiàn)工具把XOR的A到Y(jié)路徑當(dāng)成普通數(shù)據(jù)路徑分析壓根沒插入門控檢查。這說明前端的XOR門控寫法在STA里完全沒有被保護(hù)如果sel在時(shí)鐘沿附近跳變時(shí)序上可能完全失控。3.4 XOR門控完整配置示例在一個(gè)無線通信模塊里見過這樣的結(jié)構(gòu)系統(tǒng)需要?jiǎng)討B(tài)調(diào)整輸出時(shí)鐘極性前級用了一個(gè)XOR門控sel信號來自配置寄存器。初始配置sel0但運(yùn)行半年后可能切到sel1。這種場景按下面的流程處理最穩(wěn)。第一步先加case analysis讓當(dāng)前跑的這一版工具知道sel值set_case_analysis 0 [get_pins u_xor_inst/sel]第二步顯式指定XOR輸出時(shí)鐘極性set_clock_sense -positive -pins [get_pins u_xor_inst/Y]這里-positive表示Y的輸出時(shí)鐘與輸入時(shí)鐘同相。做完這兩步PrimeTime就會把XOR當(dāng)作一個(gè)等效Buffer時(shí)鐘門控檢查會在正確沿上生成。但如果要驗(yàn)證sel1的配置需要把case analysis改成1同時(shí)把set_clock_sense改成-negative重新跑一遍STA。兩輪結(jié)果都要確認(rèn)無violation才算把這個(gè)XOR門控徹底搞定。這種“雙模式驗(yàn)證”的思路同樣適用于其他非標(biāo)準(zhǔn)門控。凡是門控單元行為會隨某個(gè)控制信號改變的都要按極值配置分別跑檢查不能只跑一個(gè)case就收工。4. 常見問題與排查技巧實(shí)錄4.1 問題現(xiàn)象速查表現(xiàn)象可能原因排查手段report_clock_gating_check完全沒輸出沒有識別到門控結(jié)構(gòu)檢查庫單元屬性、檢查網(wǎng)表中門控連接門控檢查缺失但不報(bào)錯(cuò)OR/NOR門庫屬性缺失或XOR非單調(diào)用check_timing掃描缺失檢查檢查沿方向不對時(shí)鐘極性推斷錯(cuò)誤用set_clock_sense顯式指定正/負(fù)極性setup/hold同時(shí)violation檢查沿選錯(cuò)導(dǎo)致錯(cuò)誤約束分別看max/min報(bào)告確認(rèn)沿位置XOR門控檢查時(shí)好時(shí)壞sel未固定工具推斷不穩(wěn)定加set_case_analysis分別跑兩種配置門控檢查比例極低大量自定義組合門控考慮替換為ICG單元或?qū)懩_本批量檢查4.2 XOR門控誤報(bào)與漏報(bào)的處理心得XOR門控的麻煩在于它可能同時(shí)導(dǎo)致誤報(bào)和漏報(bào)。漏報(bào)很好理解工具認(rèn)不出它是門控根本不檢查。誤報(bào)則是另外一回事某些情況下工具把XOR的某一輸入當(dāng)時(shí)鐘把另一輸入當(dāng)使能但由于XOR的非單調(diào)性工具選錯(cuò)了檢查沿結(jié)果在錯(cuò)誤的邊沿上檢查使能信號導(dǎo)致一堆假violation。判斷是誤報(bào)還是真問題最直接的辦法是回到仿真。拿一條典型的violation路徑把XOR控制信號和時(shí)鐘信號的波形拉出來看如果控制信號在實(shí)際工作頻率下根本不會在時(shí)鐘沿附近變化往往是約束問題而不是電路問題。但要注意STA是靜態(tài)分析任何可能的切換都會被分析即使實(shí)際不會發(fā)生也需要約束到位否則物理實(shí)現(xiàn)時(shí)工具會過度悲觀。我目前的經(jīng)驗(yàn)是XOR門控不應(yīng)該交給工具自動(dòng)推斷一定要手動(dòng)顯式約束。手動(dòng)約束雖然麻煩但至少結(jié)果可預(yù)期兩條配置分別跑完心里有底。4.3 系統(tǒng)性驗(yàn)證門控檢查完備性的技巧門控檢查很容易漏特別是block規(guī)模大、門控單元成百上千時(shí)一個(gè)個(gè)看根本看不完。我自己寫了一個(gè)Tcl腳本每次做STA前自動(dòng)掃描所有門控單元并檢查是否存在對應(yīng)的clock gating check。腳本邏輯很簡單先把所有可能接時(shí)鐘的門控單元pin抓出來再利用get_timing_arcs查看是否存在setup/hold時(shí)序弧如果沒有就打印warning。這樣一輪下來所有缺失檢查的門控單元都能暴露出來。如果你還沒建這套腳本建議盡快補(bǔ)上排查效率能提升一個(gè)量級。另一個(gè)技巧是充分利用lib文件里的clock_gating_setup_time和clock_gating_hold_time屬性。只要庫單元標(biāo)注了這些屬性PrimeTime會自動(dòng)繼承對應(yīng)的檢查值不需要在SDC里重復(fù)設(shè)置。我見過很多項(xiàng)目約束腳本里set_clock_gating_check設(shè)了一大堆其實(shí)庫單元早就寫好了雙向約束疊加反而把時(shí)序卡得太緊。5. 寫在最后的幾句經(jīng)驗(yàn)我現(xiàn)在接到任何一個(gè)帶門控時(shí)鐘的block第一件事就是跑一遍report_clock_gating_check把unconstrained和缺失列出來。這個(gè)動(dòng)作可以直接看出設(shè)計(jì)里埋了哪些雷比看幾千行SDC高效得多。前四種門控只要庫沒問題基本都能自動(dòng)化通過XOR門控則是永恒的“人工介入點(diǎn)”。如果你還在用XOR做時(shí)鐘門控我個(gè)人建議盡快改成ICG或MUX結(jié)構(gòu)哪怕前端多改幾行RTL后端省下來的時(shí)間和風(fēng)險(xiǎn)是完全值得的。