繞線壅塞(congestion)
把晶片上的連線想像成汽車,把金屬層想像成一疊單向街道,每條街道又被劃成固定數量的平行車道,這些車道就叫繞線軌道(routing track)。繞線壅塞就是一場交通堵塞:在佈局圖(floorplan)的某個區域裡,想穿過去的網線比能容納它們的車道還要多。繞線器沒辦法把路加寬,於是擠不下的連線要麼繞一大圈避開堵點,要麼在實在找不到通路時乾脆連不上。一個看起來很正常的擺置之所以實際繞不通,這是最常見的單一原因。
要量化它,繞線器會在晶片上鋪一層粗粒度的小方格網格(即全域繞線單元,global-routing cell),並在每條方格邊界上比較兩個量:供給(supply),也就是扣掉阻擋層和預先繞線之後穿過這條邊的軌道數;以及需求(demand),也就是想穿過這條邊的網線數。凡是需求超過供給的地方就產生溢位(overflow),工具便把這些方格標成壅塞熱點。繞行隨後會讓你付出實實在在的矽片代價:連線更長意味著更大的電阻和電容、更多導通孔、更多延遲,於是即便沒有任何地方真正短路,壅塞也會悄悄演變成時序與訊號完整性問題。
根源幾乎總是在上游的擺置(placement)階段。把單元塞得太密、把接腳密集或高扇出的邏輯擠在一起,或者讓巨集單元(macro)夾出狹窄的通道,都會把連線需求集中到同一個點上。正因如此,壅塞要在擺置階段就透過一次快速的試探性(全域)繞線提前估算,而最終只能在全域繞線和詳細繞線階段徹底解決。常用的對症手段都作用在擺置上、而不是連線上:降低局部單元密度,在熱點附近加單元間距(cell padding)或擺置阻擋,跑壅塞驅動的擺置,或者重構那些惹麻煩的網線,然後重新繞線、重新檢查。
繞線器按每條方格邊界給壅塞打分;溢位為正,就說明連線必須繞行,或者只能保持未繞通狀態。
整體使用率(utilization)低並不能保證設計可繞通:一顆晶片可能整體只用到 60% 的面積、整體上也並不壅塞,卻在某個接腳密集的角落發生溢位,所以一定要看局部的壅塞圖,而不只是看全域的使用率數字。