標準單元(standard cell)
想像一下用樂高積木搭東西。每一塊積木都被壓成同樣的高度,卡在同一套網格上,所以你從來不用操心兩塊積木能不能對齊——你只管把它們一排排地拼起來,結構就立住了。標準單元就是晶片設計裡的那塊積木:一小塊預先設計好、預先驗證過的邏輯——一個反相器、一個二輸入反及閘、一個正反器——由函式庫團隊(晶圓廠或 IP 供應商)畫上一次,然後在一整顆晶片上被複用上百萬次。一個函式庫裡的每個單元都共享同樣固定的高度,電源軌和接地軌沿著它的上下邊緣延伸,於是工具可以把它們一個挨一個地拼成整齊的列,而不用對每一個單獨手工繞線。
所謂「標準」,其實是單元和自動化工具之間的一份契約。因為每個單元都有已知的功能、已知的佔位尺寸和已知的電性特性,邏輯合成就能挑選單元去實現你的 RTL,而擺放與繞線能把它們塞進列裡、連成線網——整個過程不用任何人畫哪怕一個電晶體。這套特性是透過電路模擬特徵化出來的:對每個單元,函式庫團隊會算出它的延遲(作為輸入轉態和輸出負載的函數)、它的輸入電容,以及它在一系列製程、電壓、溫度角下的功耗,並把這些數字打包進一個函式庫檔案裡。靜態時序分析隨後讀取這些數字,判斷你的設計是否滿足它的時序約束。
一個函式庫裡通常裝著數百個單元:同一個邏輯功能會有好幾種驅動強度(一個省電但弱小的反相器,和一個孔武有力、能迅速把又長又重負載的線網充上電的反相器),外加為低漏電與高速度分別調校過的變體(不同的閾值電壓口味)。合成的藝術,就在於為每個位置挑對單元——在有餘裕可揮霍的地方用小而慢的,在關鍵路徑上用大而快的。單元本身是用 CMOS 電晶體搭起來的,但作為設計者,你大多時候只需把每一個都當成一塊封好的、值得信賴的積木。
NAND2_X1 u_nand (.A(sel), .B(data), .ZN(n1)); DFF_X1 u_reg (.D(n1), .CK(clk), .Q(out));
合成之後,你的 RTL 不再是行為級程式碼,而是一張由標準單元實例組成的網表——比如一個反及閘和一個正反器連在一起。單元名(NAND2_X1、DFF_X1)和接腳名都來自函式庫;同一個設計若針對另一個函式庫重新合成,就會改用那個函式庫的單元名和接腳名。
標準單元處在一道光譜的「可自動化」中間地帶。一個極端是純手工的全客製化佈局(效能最大化、工作量巨大,留給高速 I/O 或類比模塊這類東西);另一個極端是大型預製硬核模塊,包括由記憶體編譯器自動生成的 SRAM 和暫存器堆。正是標準單元讓現代數位設計變得可行——你描述行為,工具就拼裝匹配的預製積木。