佈局(placement)
佈局就是讓每一個標準單元最終都安家落戶的步驟。在佈局規劃(floorplan)劃出核心區、鋪好一列列單元列(橫向的窄帶,高度恰好等於一個單元的高度,兩側邊緣走著電源和地的供電軌)之後,佈局負責決定每個單元具體落在哪個 (x,y) 位置上。你可以把它想像成給幾百萬名觀眾在體育場裡安排座位:不能隨手亂放。那些一直在「說話」的單元(比如一個正反器直接驅動旁邊的閘)希望坐在相鄰的座位上,這樣連接它們的導線才夠短、夠快;要是把它們撒到晶片兩頭,光是這段線延遲就足以把時序搞垮。所以工具不只是在碼箱子,它是在求解一個巨大的最佳化問題,要在線長、時序以及繞線器到場後每個區域會有多擁擠之間反覆權衡。
佈局分幾個階段進行。全域佈局(global placement)是粗略的第一遍:一個解析式引擎(你可以把單元之間的連接想像成一根根彈簧,讓整盤棋自然鬆弛到一種低能量的鋪開狀態)為每個單元找到一個大致理想的位置,同時避開時序緊張的路徑和擁塞的熱點。在這個階段,單元是允許互相重疊、也允許稍微偏離合法網格的——這只是草圖,還不是最終的座位表。接下來詳細佈局(detailed placement)在局部把這張草圖打磨乾淨:交換相鄰單元、微調滑動位置、必要時換大尺寸單元或插緩衝器,把最後那幾皮秒的時序也摳回來。最後由合法化(legalization)把每個單元都對齊落到合法的佈局位點(site)上——也就是列所允許的那些離散網格位置——使任意兩個單元都不再重疊,每個單元都整齊地落在列間距上,為接下來的時脈樹合成(CTS)和繞線做好準備。
密度在這裡很關鍵:佈局器會盯著使用率(utilization),也就是你的單元實際佔掉了核心區面積的多少。壓得太高,就沒地方留給繞線器還得穿進來的那些導線了,擁塞會瞬間爆發;留得太低,又白白浪費了花錢買來的矽片面積。一個好的佈局會悄悄把下游的一切都鋪墊到位——而一個潦草的佈局,則會把一攤爛帳甩給繞線和時序收斂,讓它們可能再也理不清。
佈局所追求的使用率,要既能放下所有單元,又能留出足夠的空白區域,讓繞線器把導線穿進來而不至於擁塞。
佈局只負責擺放邏輯單元,時脈線和訊號線都留到後面再處理;尤其是時脈網路,是之後由時脈樹合成(CTS)搭建的,而不是在佈局階段建成的。