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