工程變更指令(ECO)
把晶片想像成一棟已經蓋好的公寓大樓。牆立起來了,電線也都佈好了,驗收的人馬上就到——這時你發現有一個插座裝錯了位置。你不會把整棟樓推倒重來,而是只敲開那一面牆,把那一個插座挪過去、補好,再把驗收的人請回來。工程變更指令,也就是 ECO,就是這種在收尾階段做的外科手術式修補。當你的網表已經佈局、時鐘已經分發、每一條線都已佈通、寄生參數也已萃取並通過靜態時序分析(STA)檢查之後,往往還會有幾條路徑差一點沒滿足時序,或者冒出一個微小的設計規則(DRC)違例。如果把整個佈局繞線(place-and-route)從頭重做一遍,已經做好的一切都會被打亂,還要白白耗上好幾天。所以你只動出問題的那一小塊:把一個慢的單元換成更快、更大的單元,插進一兩個 buffer,或者重新繞幾條線,讓其餘上百萬個單元原地不動。
訣竅在於把影響範圍(blast radius)壓到最小。要修一條 setup(太慢)路徑,你得讓它跑快些——把弱的閘升尺寸(upsize),或者加 buffer 讓一條長線被驅動得更有勁;要修一條 hold(太快)路徑,你則要刻意增加延遲,插入 buffer 或延遲單元。隨後工具做一次增量式佈局繞線(incremental place-and-route),只把這些新增或移動的單元合法化(legalize)地塞進空隙裡,並只重新縫合受影響的那幾條線,之後你再跑一次增量 STA,確認修復確實消除了這條違例、又沒有在旁邊引出新的違例。正因為每一輪都小而局部,ECO 就成了團隊在臨近終點時收斂到一份乾淨設計的方式——在 STA 與 DRC/LVS 之間反覆迭代,直到一切全綠、佈局(layout)可以送去流片(tapeout)。
ECO 有兩種類型。前面那種時序 ECO 或 DRC ECO 不改動任何邏輯——它只調整驅動強度、加減 buffer 或重新繞線。而功能 ECO 會改變電路實際做的事情,通常是為了修補一個很晚才發現的邏輯 bug。其中最受推崇的是僅金屬層(metal-only,又稱 'freeze-silicon' 凍結矽片)的 ECO:晶圓廠之所以昂貴,部分原因就在於光罩(mask)套組,而電晶體的底層(base layer)正是其中最貴的那幾層。如果你在佈局階段就把一些沒用上的備用單元(spare cell)撒在整個佈局裡,那麼很多晚到的邏輯修改往往只需重新裁切上面幾層金屬、把這些備用單元接進來就能搞定——不必新做底層光罩,比整片重新流片(respin)便宜得多、也快得多。
size_cell U_slow BUFX1 -> BUFX4 ; insert_buffer net_n42 -lib_cell BUFX2
一個與廠商無關的時序 ECO:把一個慢 buffer 升尺寸,並在一條長線上插入一個新 buffer,把缺失的 setup 餘量(slack)搶回來——只動了兩個單元,而不是整個設計。
小提示:ECO 是手術刀,不是推土機——如果一次 ECO 就想挪動成千上萬個單元,或者你在同一個違例上兜圈子怎麼都修不好,那就是個訊號:該退一步,回到更早的佈局或時鐘樹合成(CTS)階段重新收斂,而不是一味地打補丁。