繞線(routing)
布局(placement)把每個單元都停放到矽晶片上各自的位置之後,繞線就是真正把它們連起來、畫出金屬導線的那一步——這些物理互連負責把每個訊號從驅動它的接腳送到它要餵給的那些接腳。你可以想像一座城市,所有大樓都已經蓋好了,現在你得把連接它們的每一條路、每一根管子都鋪出來,只不過你不能光在地面這一層鋪:一塊晶片把許多層金屬一層層疊在一起(往往十幾層起跳),為了不讓導線互相撞車,相鄰的兩層走的是交替的優先方向——這一層基本橫著走,上一層基本豎著走,就像一座多層立交橋,每一層只准朝一個方向開。最底下、最薄的那幾層負責又短又密的本地短跳;越往上、越厚的層則承擔橫貫整顆晶片的長途運輸和供電。
繞線之所以分兩趟來做,是因為想一口氣全解出來根本沒指望。第一趟是全域繞線(global routing):它把整塊裸晶切成一張由矩形小格子組成的粗網格,為每條線網大致決定它該穿過哪些格子、以及有多少根導線想要跨過每一道格子邊界——這是一份容量規劃的草圖,在還沒畫出任何一根真導線之前,就先標出哪裡擠了太多導線、搶著用太小的空間(也就是壅塞 congestion)。第二趟是詳細繞線(detailed routing):它落實到精確的幾何形狀,把每條線網吸附到每一層上具體的繞線軌道和合法的線段上,遵守晶圓廠的線寬和間距規則,好讓結果能通過 DRC。每當一根導線需要從一層換到另一層——比如從一個橫向層往上換到一個縱向層——繞線器就會落下一個導孔(via),那是一個穿過絕緣層的小小導電塞子,把上下兩層縫在一起;一個長訊號在它的旅途中可能要爬上好幾層再下來,途中穿過一整疊導孔。
導孔和金屬本身都不是免費的:每一個都會帶來電阻和電容,所以一條被逼到薄薄的下層、或者被塞著穿過許多導孔的路徑就會變慢,這正是為什麼繞線能成就、也能毀掉布局和時鐘樹合成(clock-tree synthesis)早先搭好的時序。繞線完成之後,工具會把這些畫出來的導線的真實電阻和電容(RC)抽取出來,並基於實際幾何形狀重新跑一遍靜態時序分析(STA)——這是你的時序第一次反映的是物理導線、而不再是估算值——隨後再做 DRC 和 LVS 檢查,然後佈局圖才一路走向流片(tapeout)。
全域繞線會拿每條線網的需求去比對這個每格子的軌道預算,從而在畫出任何真導線之前就預測出壅塞。
一條實戰經驗:如果一個設計在全域繞線時乾乾淨淨,到了詳細繞線卻在幾個熱點處留下頑固的短路或間距違例,真正的修法通常在上游——把那裡的布局密度放鬆一點,或者在那裡加上繞線阻擋(routing blockage)——因為硬逼詳細繞線器把導線擠進一個壅塞的區域,幾乎總會讓你賠上時序,要麼留下沒法修的 DRC。