完美的設計不等於完美的晶片
想像你花了兩年設計一顆處理器。每一行 Verilog 都驗證過,每一條時序路徑都收斂,佈局通過了所有檢查。你把設計送到晶圓代工廠——這個動作叫做定案下線(tapeout)——幾週後晶圓回來了。你會很想相信:既然設計是對的,晶圓上的每一顆晶片也都是對的。這個信念是錯的,而搞懂它為何錯,正是整個學習軌道存在的理由。
現代晶片是把數十層極薄的半導體、金屬與絕緣層,一層層疊在矽晶圓上並蝕刻出圖形而成。最小的結構只有幾奈米寬——比病毒還細得多。要在一個有數百道步驟的製程裡,把這麼小的東西重複做上數十億次,本身就是一種製造奇蹟。但奇蹟並不完美。偶爾某個步驟會出一點點差錯,結果就是矽晶上一個實體的瑕疵,我們稱之為缺陷(defect)。
晶圓上實際會出什麼錯
要真正體會「為什麼測試無法省略」,先想像矽晶最常見的三種壞法。沒有一種是邏輯錯誤,全都是物理現象。
- 一粒微粒。一粒只有零點幾微米大的灰塵,在某道蝕刻步驟時落到晶圓上。它所在之處圖形就毀了——就像照片沖印前掉了一根頭髮上去。一粒微粒就能讓一顆晶粒報廢。
- 斷路(open)。一條本該傳遞訊號的金屬線斷了——可能是金屬線上一道髮絲般的裂縫,或是兩層之間的導孔(via)沒接上。於是晶片的一部分在電氣上就死了,卡住、無法改變狀態。
- 短路(short)。兩條本該分開的導線意外連在一起——一小條殘留的金屬把它們橋接了。於是它們互相打架,一個本該能在 0 與 1 之間自由擺動的節點被卡死了。
- 製程變異(process variation)。就算沒有明顯瑕疵,也沒有兩顆電晶體會一模一樣。膜厚、摻雜、線寬在整片晶圓上都會有些微差異。多數變異無傷大雅,但在極端情況下,一顆電晶體可能剛好慢了一點、或漏電多了一點,使整顆晶片無法達到規格。
良率:晶片背後沉默的經濟引擎
因為缺陷是隨機且無法避免的,每片晶圓上真正能用的晶粒只是其中一部分。這個比例就叫良率(yield)。良率不是枝微末節——它是決定一顆晶片賺不賺錢的數字。不論一片晶圓上有 95% 的晶粒是好的、還是只有 40% 是好的,製造它的成本都一樣,所以每一顆壞晶粒都是純損失,由活下來的那些晶粒一起分攤。
A 300 mm wafer, dies are 10 mm x 10 mm -> roughly 700 dies/wafer Wafer cost (advanced node) ~ $15,000 If yield = 90%: 630 good dies -> $15000 / 630 = ~$24 per good die If yield = 50%: 350 good dies -> $15000 / 350 = ~$43 per good die If yield = 20%: 140 good dies -> $15000 / 140 = ~$107 per good die Same silicon, same design. Yield alone moves the cost ~4x.
接下來這一段,直接說明了測試為何重要。缺陷的代價並非固定不變——它逃得越往下游,代價就越是爆炸性成長。業界有個粗略的法則,有時稱為十倍法則(rule of ten):在晶圓測試階段抓到一顆壞晶粒,可能只花幾分錢;若讓它溜過去封裝了,連封裝也一起報廢;若它被裝上電路板,整塊板子作廢;而若它最終裝進一輛車或一支手機到了客戶手上,召回的代價可以是這顆晶片本身價格的好幾千倍。
為什麼不能只靠戳接腳來測試
所以我們必須測試每一顆晶粒。最直覺的想法是:把晶片接到測試機——一台自動測試設備(ATE)——在接腳上施加一些輸入,觀察輸出,檢查它們是否與一顆好晶片該有的輸出相符。對一顆只有幾個邏輯閘的晶片來說,這招棒極了。但對一顆現代晶片來說,這招會徹底崩潰。
問題出在規模。一顆現代晶片可以容納數十億顆電晶體,但只有幾百到幾千支接腳。接腳是你進入晶片的唯一門戶,而裡面卻有數十億個房間。更糟的是,這些房間是一連串深深串接在一起的:要讓一個埋在二十層邏輯深處的正反器(flip-flop)取得某個特定值,你得找出一組接腳輸入序列,使它在穿過前方所有邏輯之後,剛好把那個正反器設成想要的值——然後還得再找出另一組輸入組合,讓那個正反器的結果一路傳回某支你看得見的接腳上。
pins (a few hundred)
| | |
+----v---v---v------------------------------+
| [logic] -> [FF] -> [logic] -> [FF] -> ... | billions of
| ^ ^ | internal nodes,
| how do I FORCE this node to 1? | buried deep
| and SEE this node's value? |
+--------------------------------------------+
| | |
pins (a few hundred)
Controllability: can I set an internal node to the value I want?
Observability: can I see an internal node's value at a pin?
From the pins alone, for most deep nodes the answer is: barely.把一個內部節點設成你想要的值,稱為可控制性(controllability);從外部看見一個內部節點的值,稱為可觀測性(observability)。光靠接腳,深處的節點兩者幾乎都不具備。你所需的輸入樣式數量,會爆炸得比任何測試機在合理時間內所能施加的還要快。純粹的「戳接腳」根本無法擴展——而這道牆,正是這個學習軌道要去攀爬的核心問題。我們會在下一階正式為它命名:可控制性與可觀測性。
可測試性設計:把晶片造得「方便被測」
如果你無法從外部測試一顆十億電晶體的晶片,答案雖然激進卻很簡單:那就改造晶片本身。加入一些電路,它們唯一的任務就是讓那些埋藏的節點變得可以觸及。這套哲學就叫可測試性設計,幾乎總是簡稱為 DFT。關鍵在於:DFT 是在你設計晶片的當下就決定的,而不是事後補救——你預先付出一小塊矽面積與幾個百分點的效能,換來「這顆晶片根本測得了」這件事。
DFT 的招牌絕招——你會在後面的階段詳細認識它——是悄悄地把晶片裡的記憶元件重新接線,使它們在測試模式下可以全部串接成一條長長的移位暫存器。一瞬間,你就能把任意想要的樣式移入每一個內部正反器(完美的可控制性),再把它們擷取到的值移出到接腳(完美的可觀測性),而這一切只需要多幾支接腳。那些深藏的節點,變得跟接腳本身一樣容易觸及。