劃實戰(zhàn):Innovus下IR Drop分析與修復(fù))
1. 先搞明白PPPR電源規(guī)劃到底在解決什么問題干過芯片后端的人誰沒有被IR Drop折騰過項目跑到簽核階段突然冒出來一堆時序違例排查半天發(fā)現(xiàn)不是路徑算錯而是電源網(wǎng)絡(luò)太弱標(biāo)準(zhǔn)單元拿到的實際電壓早就低于庫里的假設(shè)值了。這個時候再回頭改電源規(guī)劃往往等于把整個布局布線掀掉重來代價高到讓人頭皮發(fā)麻。我入行那幾年這種“IR Drop返工”見得太多所以后來的項目里我養(yǎng)成了一個習(xí)慣在place之后、繞線之前必須用Innovus把PPPR電源規(guī)劃這一整套流程踏踏實實跑一遍。你可能會問PPPR到底是什么不同公司叫法確實不太一樣我理解的核心就是電源規(guī)劃Power Planning、電源布線Power Routing、電源完整性分析Power Integrity Analysis也就是IR Drop和EM分析以及熱點(diǎn)修復(fù)Repair這四個環(huán)節(jié)組成的閉環(huán)。說白了就是從floorplan階段開始把整個芯片的供電網(wǎng)絡(luò)設(shè)計出來、連好線、驗證夠不夠用不夠再修而不是等到最后才發(fā)現(xiàn)問題。這篇內(nèi)容適合誰看如果你正在做數(shù)字后端用的工具是Innovus想搞清楚電源環(huán)和電源條帶參數(shù)怎么給、IR Drop報告怎么看、熱點(diǎn)出現(xiàn)后怎么改那這篇文章就是寫給你的。后面附的腳本也是我實際改過的版本你拿過去改改層號、間距和寬度基本就能用。1.1 被IR Drop支配的恐懼是每個芯片后端都懂的IR Drop翻譯過來就是電壓降。電流流過金屬走線時因為金屬本身有電阻沿路就會產(chǎn)生壓降最后到達(dá)標(biāo)準(zhǔn)單元電源引腳上的電壓一定比電源Pad輸出的電壓低。這個道理和水管送水一模一樣自來水廠出口水壓很高但如果你家住在管網(wǎng)末端、樓層又高水龍頭出來的水就是細(xì)細(xì)一縷。芯片里的供電網(wǎng)絡(luò)就是那個水管IR Drop就是末梢水壓不足。電壓不夠會怎樣單元的延時特性是按標(biāo)準(zhǔn)電壓建模的電壓一旦低于標(biāo)稱值gate delay就會變長。setup slack本身余量就不大IR Drop一疊加路徑直接違例。更麻煩的是動態(tài)IR Drop翻轉(zhuǎn)電流集中在時鐘沿附近局部電壓會在極短時間內(nèi)掉下去這種瞬態(tài)掉壓會導(dǎo)致hold或setup問題交叉出現(xiàn)很難定位。所以我一直跟組里新人強(qiáng)調(diào)IR Drop不是“可選項”它是功能、時序、功耗之外的第四根支柱別等簽核了才想起來。1.2 PPPR不是某個單一工具而是一套閉環(huán)流程PPPR這名字聽起來像某個工具的專有名詞但實際干過項目的人都知道它更像是一套方法論。步驟拆開看就四步第一是規(guī)劃在floorplan階段就決定電源環(huán)的寬度、電源條帶的間距和層疊、macro區(qū)域怎么供電第二是布線利用Innovus的addRing、addStripe、sroute這些命令把規(guī)劃變成實際圖形第三是分析用工具去仿真IR Drop和電流密度輸出報告和熱點(diǎn)圖第四是修復(fù)根據(jù)熱點(diǎn)位置加寬、加密或者調(diào)整供電拓?fù)淙缓笤僦匦路治鲋钡绞諗?。這個閉環(huán)越早跑起來收益越大。我見過很多項目floorplan階段根本不看電流需求隨便拉個電源環(huán)就往下走結(jié)果到了中后期發(fā)現(xiàn)某一塊區(qū)域的stripe間距太大動態(tài)壓降超標(biāo)只能砍掉一部分繞線資源來補(bǔ)電源金屬既耽誤時間又影響密度。反過來如果早期就用低精度模式快速跑一版IR Drop把明顯的問題在place階段就解決掉后面簽核時基本就是微調(diào)。我用Innovus做這件事比較多一方面是因為Innovus的電源規(guī)劃命令本身就很成熟另一方面是它能和Voltus、PrimeTime PX這些分析引擎聯(lián)動直接在同一套數(shù)據(jù)庫上完成電源網(wǎng)絡(luò)設(shè)計、分析和修復(fù)不需要來回倒數(shù)據(jù)。這套流程吃透了換到其他工具鏈也只是命令換個名字而已底層思路是完全通用的。2. 電源網(wǎng)絡(luò)設(shè)計的底層邏輯決定你后面會不會返工很多朋友拿到工藝庫就開始敲addRing參數(shù)全是默認(rèn)值或者干脆照抄老項目的腳本這其實是電源規(guī)劃里最容易踩坑的地方。電源環(huán)寬度、條帶間距、金屬層選擇這些參數(shù)跟工藝、功耗規(guī)模、floorplan形狀關(guān)系太大了。老項目能用不代表你現(xiàn)在能用芯片面積大了一圈、電流密度完全不同照搬往往要出問題。這一章我先把設(shè)計邏輯捋清楚。理解了為什么這么給參數(shù)你再看第三章的腳本會有一種豁然開朗的感覺。我一直覺得做后端的人手里要有“計算器”思維而不是“快捷鍵”思維。2.1 Floorplan階段的幾個決定直接影響電源質(zhì)量電源規(guī)劃從來不是從addRing開始的而是從floorplan擺macro那一刻就開始了。原因是電源網(wǎng)絡(luò)要繞過macro、IP、memory如果這些block擺得亂七八糟stripe走過去要么被cut斷要么繞出大彎供電效果都大打折扣。我在floorplan階段一定會做三件事第一看電源需求大的模塊集中在哪里比如高性能CPU cluster、大容量SRAM陣列這些區(qū)域需要局部加密stripe第二給模擬IP、PLL、高速接口這類對噪聲敏感或?qū)R Drop有特殊要求的模塊提前留出干凈的供電通道別讓數(shù)字stripe壓在它們頭上第三確認(rèn)power domain的劃分不同電壓域要保證供電網(wǎng)絡(luò)物理隔離不能出現(xiàn)兩個電壓域共用一個stripe的事情。這些前期判斷直接決定了后續(xù)電源規(guī)劃是順?biāo)浦圻€是四處救火。另外一個容易被忽略的因素是IO Ring也就是Pad Ring。芯片整體的供電入口通常在IO區(qū)域電源從Pad進(jìn)來后要通過環(huán)形電源網(wǎng)絡(luò)power ring分配到各個stripe。如果IO區(qū)域擁擠或者電源Pad數(shù)量不夠就算core里stripe拉得再密入口處的瓶頸也會讓IR Drop居高不下。所以floorplan階段就得估算電流總量和IO電源Pad數(shù)量是否匹配不要等流片了才來后悔。2.2 Power Ring、Stripe、Rail到底誰管誰新手最容易混淆的就是Ring、Stripe和Rail這三個概念我在這里一次說清楚。Rail是最底層的標(biāo)準(zhǔn)單元電源軌也就是標(biāo)準(zhǔn)單元row邊上那兩根又細(xì)又長的VDD和VSS走線它一般在Metal 1或Metal 2上工藝庫已經(jīng)定義好了后端工程師不需要手動畫但必須保證它們最終被正確接上電源網(wǎng)絡(luò)。Ring是包在core或者macro四周的環(huán)形電源走線起到匯集電流的作用。它通常由兩層金屬組成一層橫向、一層縱向通過via連接起來。Ring的作用相當(dāng)于城市里的環(huán)線把從四面八方來的電先收攏起來再分發(fā)給內(nèi)部道路。Stripe則是橫跨core區(qū)域的一條條長條形電源走線作用是把Ring里的電流送到core內(nèi)部的每一行cell去。Stripe通常用高層厚金屬來做也就是M5、M6、M7這些因為高層金屬電阻更小單位寬度能傳送的電流更大。三者關(guān)系你可以想象成Ring是總水管的環(huán)形主管道Stripe是從主管道伸向城市各區(qū)塊的支干管Rail就是最后接到每家每戶水龍頭的那一小段管子。設(shè)計目標(biāo)是讓每一段都不出現(xiàn)瓶頸Ring不夠?qū)挕tripe太稀疏、Rail連接via不夠多都會成為制約供電的短板。2.3 寬度和間距不是拍腦袋定的要算EMPower Ring和Stripe的寬度、間距大家一般會參考foundry的EM電遷移規(guī)則來定但也可以自己做快速估算。EM規(guī)則的核心是金屬層能承受的電流密度通常用單位截面允許流過的電流來表示比如多少mA每um。如果某一條power stripe需要承載100mA電流而該金屬層允許的電流密度是50mA/um那么這條stripe的最窄寬度至少是2um再考慮到工藝偏差和溫度我一般還會留1.5到2倍的余量。舉個例子一個模塊總電流估計是6A如果分成20條vertical stripe供電那平均每條承擔(dān)300mA。假設(shè)用的是M6層允許電流密度為60mA/um理論寬度就是5um。但這種均勻分配是理想情況實際靠電源Pad近的stripe電流會更大所以我通常會直接拉到7到8um寬也就是多留30%以上余量。別覺得浪費(fèi)面積IR Drop一旦出事改起來消耗的時間精力遠(yuǎn)不是這點(diǎn)面積能比的。間距的確定更多取決于IR Drop預(yù)算。芯片設(shè)計一般會定一個允許的IR Drop百分比比如動態(tài)壓降不超過5%靜態(tài)不超過10%。壓降和電源網(wǎng)絡(luò)的等效電阻成正比stripe間距越大單個區(qū)域從stripe取電的距離越遠(yuǎn)橫向rail上的壓降就越大。工藝庫里通常提供rail的方塊電阻你可以用歐姆定律估算一個最大間距再結(jié)合項目經(jīng)驗收斂。我在0.8V左右的核心電壓下M6/M7的stripe間距一般控制在40到60um之間具體要看電流密度。3. 手把手配電源網(wǎng)絡(luò)完整可直接改的Innovus腳本理論和參數(shù)講完了現(xiàn)在進(jìn)入實際操練環(huán)節(jié)。這一章我會帶你從頭到尾把PPPR電源規(guī)劃腳本搭起來。這個腳本我在多個項目里改過基本邏輯是通用的你只需要把工藝層號、寬度、間距、設(shè)計名這些變量換成你自己項目的值就行。我寫腳本的習(xí)慣是所有可變參數(shù)都用變量放在文件頂部不要散落在命令里。這樣后期調(diào)整只需要改一行定義不用滿文件找參數(shù)也方便用腳本生成多組實驗配置。特別是IC設(shè)計是一版一版迭代的把參數(shù)集中管理能省下大量反復(fù)試錯的時間。3.1 數(shù)據(jù)準(zhǔn)備與電源網(wǎng)絡(luò)聲明在跑任何電源規(guī)劃命令之前先確認(rèn)三件事設(shè)計已經(jīng)導(dǎo)入Innovus并且完成了初步floorplan邏輯庫和物理庫已經(jīng)配置好更重要的是電源網(wǎng)絡(luò)的定義已經(jīng)正確聲明。沒有聲明電源網(wǎng)絡(luò)就急著畫stripe后面很容易出現(xiàn)stripe畫了一半找不到VDD/VSS網(wǎng)絡(luò)或者標(biāo)準(zhǔn)單元的PG pin根本沒有連接到電源網(wǎng)絡(luò)的尷尬狀況。我通常在Innovus初始化腳本后面加這么一段# 設(shè)計相關(guān)變量 set DESIGN_NAME chip_top set TECH_FILE /path/to/tech.lef # 電源網(wǎng)絡(luò)定義 globalNetConnect VDD -type pgpin -pin VDD -inst * -override globalNetConnect VSS -type pgpin -pin VSS -inst * -override globalNetConnect VDD -type tiehi -inst * -override globalNetConnect VSS -type tielo -inst * -override這段代碼的作用是把VDD和VSS這兩個特殊網(wǎng)絡(luò)自動連接到所有標(biāo)準(zhǔn)單元和macro的PG pin上。-type pgpin負(fù)責(zé)物理電源引腳-type tiehi和-type tielo負(fù)責(zé)邏輯上接到高和低電平。很多人只寫了前兩行忽略了后面兩行結(jié)果后面仿真或者檢查連接性時莫名其妙報一堆問題。3.2 電源環(huán)Power Ring怎么加Power Ring是供電網(wǎng)絡(luò)的外圍框架。用了Innovus里專門的addRing命令參數(shù)很多但核心就三個畫在哪些層、多寬多疏、離core邊界多遠(yuǎn)。我這里給一個最常用的寫法set RING_W 6.0 set RING_SPACING 1.0 set RING_OFFSET 2.0 set RING_CORE_OFF 5.0 addRing \ -nets {VDD VSS} \ -around core \ -layer {top M7 bottom M7 left M6 right M6} \ -width $RING_W \ -spacing $RING_SPACING \ -offset $RING_OFFSET \ -core_offset $RING_CORE_OFF這里的關(guān)鍵是把橫向top/bottom和縱向left/right放在不同金屬層上。因為橫向走線如果和縱向走線完全同層它們相交的地方?jīng)]法直接連接必須通過via跳層反而增加電阻和復(fù)雜度。通常做法是一層走水平方向、一層走垂直方向在四角用via對接形成一個完整的閉合環(huán)。-core_offset控制的是ring與core邊緣的距離-offset是ring與blockage之間的距離這兩個值不要設(shè)太大否則浪費(fèi)面積也別設(shè)到0避免后續(xù)placement和routing出現(xiàn)擠迫。如果你有多個macro也可以讓addRing圍繞macro畫微環(huán)也就是-around macro加-ring_target macro這樣每個macro自身有電源環(huán)再與core ring連接可以顯著改善大IP供電。3.3 電源條帶Power Stripe怎么加Ring只是框架真正給core內(nèi)部供電的是Stripe。Stripe設(shè)計有幾個核心參數(shù)方向、層、寬度、間距、set_to_set_distance以及是否允許jogging。我的慣例是橫向stripe和縱向stripe各畫一組分別在不同層形成網(wǎng)格結(jié)構(gòu)。set STRIPE_W 5.0 set STRIPE_SPACE 1.0 set STRIPE_DIST 50.0 set STRIPE_OFFSET 5.0 # 縱向stripe走M(jìn)6 addStripe \ -nets {VDD VSS} \ -layer M6 \ -direction vertical \ -width $STRIPE_W \ -spacing $STRIPE_SPACE \ -set_to_set_distance $STRIPE_DIST \ -max_same_layer_jog_length 20.0 \ -padcore_ring_bottom_offset $STRIPE_OFFSET \ -padcore_ring_top_offset $STRIPE_OFFSET # 橫向stripe走M(jìn)7 addStripe \ -nets {VDD VSS} \ -layer M7 \ -direction horizontal \ -width $STRIPE_W \ -spacing $STRIPE_SPACE \ -set_to_set_distance $STRIPE_DIST \ -padcore_ring_left_offset $STRIPE_OFFSET \ -padcore_ring_right_offset $STRIPE_OFFSET這里面最需要理解的是set_to_set_distance。它指的是同一條電源網(wǎng)絡(luò)上相鄰兩條同方向stripe中心線之間的距離。這個值決定了橫向rail最長要走多遠(yuǎn)才能取到電直接關(guān)系IR Drop。這個距離也不是越小越好stripe太密會大量占用繞線資源影響信號布線所以要在IR Drop和可布線性之間取平衡。我在實際項目里一個有效的做法是先按預(yù)算算出最大允許間距然后在此基礎(chǔ)上加密20%左右作為初值跑一版分析再調(diào)整。另外要注意stripe的VDD和VSS兩條網(wǎng)絡(luò)一定是平行交替布置的兩個網(wǎng)絡(luò)寬度、間距最好一致避免電源地不對稱引起額外的IR Drop。Innovus畫stripe時雖然只寫一個addStripe命令加多個net工具會自動交錯但如果你手工用別的編輯器改def就要小心這個細(xì)節(jié)了。3.4 Sroute與PG連接檢查電源環(huán)和stripe畫完后還需要把標(biāo)準(zhǔn)單元的rail和這些高層電源網(wǎng)絡(luò)連接起來。這個動作叫srouteInnovus會根據(jù)單元pad和PG網(wǎng)絡(luò)位置自動完成rail到stripe的對接。這一條命令會把幾十萬個連接全部搞定看起來簡單但作用非常關(guān)鍵。sroute \ -nets {VDD VSS} \ -allowJogging 1 \ -allowLayerChange 1 \ -blockPinStrategy 1執(zhí)行完sroute后我強(qiáng)烈建議立刻跑一個連接性檢查不要等到繞完線再查。命令是check_pg_connectivity -std_cell_pins_only如果標(biāo)準(zhǔn)單元存在電源斷連這個檢查會直接報出來。還有一種隱蔽問題就是某個macro的PG pin雖然數(shù)量很多但實際有效連接的via太少這種情況下check可能不會報錯但I(xiàn)R分析時那個macro區(qū)域會明顯變紅。所以做完整設(shè)計時對關(guān)鍵macro最好手工檢查一下連接via數(shù)量和位置別完全依賴工具自動判斷。4. 用Innovus跑IR Drop分析快速定位熱點(diǎn)電源網(wǎng)絡(luò)畫完了不代表萬事大吉。我一直覺得畫電源網(wǎng)絡(luò)只是把骨架搭起來真正驗證設(shè)計能不能過簽核還得靠IR Drop分析。Innovus本身就能調(diào)用分析引擎做這件事流程也不復(fù)雜但對很多從前端轉(zhuǎn)過來的人而言邏輯有點(diǎn)繞我在這里盡量給你理順。4.1 IR分析前一定要做的一件事跑IR Drop分析之前有一個步驟經(jīng)常被忽略就是先跑DRC。尤其當(dāng)你改過stripe寬度、層或者間距后電源網(wǎng)絡(luò)非常容易產(chǎn)生金屬short、minimum area違規(guī)或者via間距不夠的問題。如果帶著這些DRC錯誤去做IR仿真后面熱點(diǎn)定位會完全失真浪費(fèi)時間不說還可能誤判根因。我的習(xí)慣是在sroute之后先跑一遍verify_drc或者check_routes把電源網(wǎng)絡(luò)相關(guān)的violation過濾出來逐個消化。電源網(wǎng)絡(luò)DRC錯誤一般集中在stripe交疊處、ring轉(zhuǎn)角處、via堆疊區(qū)域。很多DRC是小錯誤比如某個stripe長了0.01um但如果不清理會在分析階段放大成奇怪的異常點(diǎn)誤導(dǎo)你的判斷。DRC干凈后再輸出一個Def保存為checkpoint接下來可以放心折騰IR分析。4.2 跑靜態(tài)與動態(tài)IR Drop的命令思路Innovus里的IR分析可以通過Voltus接口來完成。沒有裝Voltus的流程也可以用PrimeTime PX配合寄生提取聯(lián)合做。我習(xí)慣直接在Innovus的Tcl窗口里跑大概流程是這樣# 設(shè)置電源分析選項VDD標(biāo)稱電壓0.8V動態(tài)壓降閾值取5% set_power_analysis_options \ -net VDD \ -threshold_voltage 0.76 # 靜態(tài)IR Drop分析 analyze_ir_drop \ -nets {VDD VSS} \ -analysis_type static \ -outDir ir_static_out \ -format text # 動態(tài)IR Drop分析需要翻轉(zhuǎn)率/波形文件 analyze_ir_drop \ -nets {VDD VSS} \ -analysis_type dynamic \ -outDir ir_dynamic_out \ -format text等等這里我需要把threshold_voltage解釋一下。這個參數(shù)是判斷IR Drop是否違例的電壓閾值。比如VDD為0.8V動態(tài)壓降允許5%那閾值就是0.8 * 0.95 0.76V。只要分析出來的實際電壓低于0.76V就認(rèn)為這個區(qū)域IR Drop超標(biāo)會在報告里標(biāo)成violation。靜態(tài)一般可以放寬到10%也就是0.72V但動態(tài)必須嚴(yán)格按5%甚至更緊因為動態(tài)壓降發(fā)生時間短雖然平均影響不大但在時鐘沿附近對setup的影響非常致命。我以前踩過一個坑就是把靜態(tài)和動態(tài)用同一個閾值結(jié)果靜態(tài)分析報了一堆violation花了一周時間去處理后來才發(fā)現(xiàn)很多是誤報。正確的做法是分開設(shè)置閾值靜態(tài)松、動態(tài)緊這樣才能把真正的熱點(diǎn)圈出來。4.3 把IR Map加載到GUI里怎么看熱點(diǎn)分析完成后Innovus的GUI里可以直接加載IR Drop map。你會在版圖上看到一層彩色的分布圖藍(lán)色表示壓降較小、電壓充足黃色到紅色表示壓降逐漸加大、供電不足。我的觀察習(xí)慣是先看整體色調(diào)確認(rèn)大面積區(qū)域是否均勻再看紅色區(qū)域的位置、面積以及附近有無macro或供電入口最后把violation列表導(dǎo)出來按嚴(yán)重程度排序。熱點(diǎn)通常出現(xiàn)在幾個典型位置。一個是core中央遠(yuǎn)離power ring的地方這代表stripe間距過大需要加密stripe。另一個是大macro附近的角落說明macro把電源通道擋住了或者macro本身用電量太大但供電via不足。還有一個是時鐘樹密集區(qū)域動態(tài)IR Drop特別容易出現(xiàn)局部熱點(diǎn)這種熱點(diǎn)往往要靠加decap電容或者調(diào)整時鐘buffer位置來緩解。拿到這些信息接下來就是有針對性的修復(fù)。5. 熱點(diǎn)區(qū)域修復(fù)的優(yōu)先級與實操策略IR Drop分析出來之后手里的報告不是用來給領(lǐng)導(dǎo)匯報的是用來指引你怎么改設(shè)計的。修復(fù)IR Drop是一個非常講究優(yōu)先級的過程亂改不但浪費(fèi)資源還可能把本來好好的時序和密度都搞壞。我自己的修復(fù)次序這里可以給你參考。5.1 改電源網(wǎng)絡(luò)比改Floorplan優(yōu)先IR Drop超標(biāo)后第一反應(yīng)應(yīng)該是改電源網(wǎng)絡(luò)而不是動floorplan。原因很直白改floorplan影響面太大macro一挪所有時序路徑全部變化等于把整個項目推倒重來。而改電源網(wǎng)絡(luò)是局部動作只要不破壞floorplan的整體布局對邏輯的擾動相對小。電源網(wǎng)絡(luò)修復(fù)按照由寬到窄的順序做先查ring如果power ring太窄電流從Pad進(jìn)入ring就飽和了那后面再怎么加密stripe都沒用。然后是stripe層如果某一層的stripe間距過大或者寬度不足優(yōu)先在這一層加密或加寬。再然后是via很多時候不是stripe不夠而是stripe與rail之間的via密度不夠從IR map上看就是stripe下方顏色正常、stripe之間顏色很紅這種一般就是via問題。最后才是加decap或者改placement。5.2 定點(diǎn)補(bǔ)強(qiáng)給熱點(diǎn)區(qū)域加局部Stripe局部熱點(diǎn)不需要全局加大stripe密度那樣太浪費(fèi)繞線資源。Innovus支持給特定區(qū)域單獨(dú)加stripe這個功能在修復(fù)熱點(diǎn)時特別好用。比如熱點(diǎn)出現(xiàn)在右下角某一個矩形區(qū)域內(nèi)我就可以只在這個區(qū)域加兩條短stripe把電流疏過去而不影響整個芯片的布線資源。addStripe \ -nets {VDD VSS} \ -layer M6 \ -direction vertical \ -width 5.0 \ -spacing 1.0 \ -set_to_set_distance 25.0 \ -area { { 100 100 } { 300 400 } }這里-area后面跟的是左下角和右上角的坐標(biāo)在這個小范圍里做加密。跑完重新sroute再重新分析IR通常熱點(diǎn)就會明顯改善。不過局部加密stripe要注意一點(diǎn)后續(xù)繞線階段這些多出來的stripe會形成障礙所以要關(guān)注一下這個區(qū)域的congestion變化避免按下葫蘆浮起瓢。補(bǔ)強(qiáng)完stripe之后一定要重新跑DRC和IR分析確認(rèn)新加的stripe沒有和旁邊的信號線short也沒有引入新的EM違例。這個迭代看起來繁瑣但熟練之后每個循環(huán)不會超過半天。5.3 一個能落地的迭代收斂流程我常用的迭代流程大概是這樣的在place結(jié)束后第一次floorplan階段先快速做一版最粗的電源規(guī)劃和低精度靜態(tài)IR分析目標(biāo)是把大的熱點(diǎn)清掉等CTS完成、時鐘樹初步建立后再跑動態(tài)IR分析這時候主要看時鐘相關(guān)區(qū)域的瞬態(tài)壓降最后signoff階段用完整寄生參數(shù)和真實翻轉(zhuǎn)率跑最終分析。這個流程不會讓IR Drop問題一次性消失但可以在每個階段用最小成本逐步收斂問題。很多人非等到signoff階段才做分析一旦出問題修改空間已經(jīng)很小了那才是最痛苦的。6. 常見問題排查與避坑實錄最后這一章我把這幾年在實際項目中遇到的高頻問題和解決辦法整理一下。這些問題在文檔里不一定寫得清楚但基本每個后端工程師都會撞上。6.1 先看一張問題速查表現(xiàn)象可能原因快速排查與解決IR報告里core中心大片紅stripe間距過大或?qū)挾炔蛔慵用躶tripe、加寬stripe優(yōu)先在熱點(diǎn)層macro周邊紅macro電源via不足或者macro屏蔽了stripe增加macro連接via必要時加macro ringstripe下方正常、stripe之間紅rail到stripe連接via不夠檢查sroute結(jié)果手工補(bǔ)via或調(diào)整sroute參數(shù)電源地shortstripe交疊處設(shè)計不當(dāng)查看DRC報告調(diào)整不同層stripe間距sroute后標(biāo)準(zhǔn)單元斷連PG pin類型定義錯或globalNetConnect缺失檢查globalNetConnect四行是否齊全重跑動態(tài)IR比靜態(tài)嚴(yán)重很多缺少足夠的decap電容在熱點(diǎn)區(qū)域插入decap cellIR整體正常但個別SPEF路徑壓降高power net寄生提取不完整檢查Lef里電源金屬RL定義是否完整6.2 腳本調(diào)試和PLog分析的小技巧很多新人寫Tcl腳本一上來就是一大段連續(xù)命令出錯了也不知道在哪里。我寫長腳本的習(xí)慣是“小步快跑”一段段執(zhí)行每一段之間加一個puts輸出關(guān)鍵的完成狀態(tài)。比如畫完ring之后執(zhí)行puts Ring DONE畫完stripe后執(zhí)行puts Stripe DONE這樣日志里能清楚看到卡在哪一步。另外Innovus的PLog文件一定要會看。工具每次運(yùn)行都會生成一條條記錄里面會記錄每次命令的耗時和是否有warning。我發(fā)現(xiàn)很多人出問題后只盯著終端屏幕忽略PLog里的warning其實很多隱患在warning階段就在那里了只是屏幕滾太快沒人注意。自己寫腳本時也可以把關(guān)鍵變量用report_vars輸出到日志里再和預(yù)期值對一遍避免變量被后續(xù)命令意外修改。6.3 多電壓域與Macro供電的幾個細(xì)節(jié)如果你做的是多電壓域設(shè)計電源規(guī)劃會比單電壓域麻煩一個數(shù)量級。每個電壓域的stripe要各自獨(dú)立不同域之間的間距要滿足isolation rule同時level shifter和isolation cell的位置會直接影響電源網(wǎng)絡(luò)規(guī)劃。我在做多域項目時會為每個domain單獨(dú)建一組stripe參數(shù)并且給每個domain做獨(dú)立的IR分析不要混在一起看。整體分析只能看趨勢真正滿足每個domain的壓強(qiáng)預(yù)算還得分開看。大宏模塊比如SRAM供電方式往往不是靠標(biāo)準(zhǔn)單元那種rail直接供電而是在macro內(nèi)部有專用的PG ring或PG pin分布。畫stripe之前先看macro的Lef里PG pin分布在哪些層、哪些坐標(biāo)位置然后讓stripe盡量垂直于這些pin的排列方向這樣連接長度最短、via數(shù)最少。如果pin在M4stripe在M6sroute時會用via和短跳線連下來要確保中間層沒有障礙物否則連接質(zhì)量會很差。最后說一個我自己的體會電源規(guī)劃這門手藝經(jīng)驗占一半方法占另一半。方法就是今天講的PPPR閉環(huán)先規(guī)劃、再布線、后分析、再修復(fù)每一步都別偷懶。經(jīng)驗則是靠一個個項目熬出來的踩過的坑越多后面判斷越快。你現(xiàn)在拿著這套腳本和流程至少可以避開我當(dāng)年走過的彎路先把小模塊跑通再逐步擴(kuò)大到全芯片這是我認(rèn)為最穩(wěn)妥的學(xué)習(xí)路徑。