1990s - DFT 可測試性設計:讓晶片自己招供#
案件摘要#
1990 年代,晶片內電晶體數衝上百萬,封裝後看不到、戳不到,測試卻是量產前最後一道生死關。 Design-for-Test(DFT)把「可測性」直接設計進電路:加 scan chain、內建自測(BIST)、邊界掃描(JTAG), 讓原本需要指數時間的循序電路測試,變成自動向量產生(ATPG)幾小時就能結案。 到了 1990 年代末,沒有 test insertion 的 ASIC 已經賣不出去——DFT 從奢侈品變成標準配備。
前因 -- 為什麼會有這個案子#
- 循序電路測試是指數災難:一個含 \(n\) 個正反器的狀態機,要產生測試向量必須考慮時間幀(time-frame)展開,需展開 \(d\) 層就有 \(2^{n \cdot d}\) 個組合態,1970 年代的循序 ATPG 只能處理幾十個正反器的小電路。
- 測試向量是手工苦差:工程師用桌上型機器手刻 test pattern,一顆 10 萬閘 ASIC 要數月;良率再高,測不出來等於全部報廢。
- 凶器早已備好:1973 年 Williams 提出 scan path 概念,1970 年代 Eichelberger 在 IBM 提出 LSSD(Level Sensitive Scan Design)——把所有正反器串成一條移位暫存器,測試時電路瞬間「解凍」成純組合電路。
- 關鍵推理:組合電路的 ATPG 是多項式可實用的問題(D-algorithm、PODEM、FAN),因此:
只要願意犧牲一點面積(scan FF 比一般 FF 貴約 10–20%),就能把不可能變成每天可量產的例行公事。
線索與推理 -- 數學式、程式、理論#
1. Scan chain:把循序變組合的魔術#
測試三步驟: 1. Shift-in(controllability):透過 scan-in 腳, \(n\) 個 clock 把想要的狀態值送進所有正反器。 2. Capture(激發):切回正常模式打一拍,組合邏輯把故障效應傳到某個正反器的 D 端。 3. Shift-out(observability):再 \(n\) 個 clock 把狀態移出比對。
一個 test pattern 只需 \(n+1+n\) 個 clock,測試資料量從指數降成線性——這就是 DFT 的核心交易。
2. Controllability / Observability:SCOAP 度量(Goldstein, 1979)#
一個節點好不好測,可用兩個數字量化: - CC(controllability):把節點設成 0 或 1 需要多少個「難搞」的閘輸入。對 AND 閘輸出要 1: \(\text{CC1}(y) = \sum_i \text{CC1}(x_i) + 1\) (所有輸入都要 1,每個都是負擔);要 0: \(\text{CC0}(y) = \min_i \text{CC0}(x_i) + 1\) (只要一個輸入為 0)。 - CO(observability):把節點的故障效應傳到可觀察輸出的代價。對 AND 閘輸入 \(x_1\) : \(\text{CO}(x_1) = \text{CO}(y) + \sum_{i \neq 1} \text{CC1}(x_i) + 1\) ——要把故障推過 AND,其他輸入必須全程保持 1。
SCOAP 用來預測 ATPG 難度與 fault coverage,在設計階段就標出測試熱點,成為 scan insertion 與 test point insertion 的依據。
3. 故障模型與 ATPG:從 D-algorithm 到 FAN#
- Stuck-at fault(SA0/SA1):訊號線被假設永遠卡在 0 或 1。 \(n\) 條線有 \(2n\) 個 stuck-at 故障,是 1990 年代的標準良率指標。
- Bridging fault:兩條相鄰線短接(wired-AND/wired-OR),隨製程微縮越來越重要。
- Transition fault:訊號升降太慢(slow-to-rise / slow-to-fall),是 at-speed 測試的模型,靠 scan-based launch-on-capture 檢測。
ATPG 的偵探手法——D-algorithm(Roth, 1966): 1. 激發(activate):在故障點造成 \(D/\bar{D}\) 差異( \(D = 1/0\) 表示好電路給 1、壞電路給 0)。 2. 傳播(propagate):沿著一條路徑把 \(D\) 推到輸出,遇到衝突就回溯。 3. 一致性(justify):回頭設定內部節點滿足前面假設。
PODEM(Goel, 1981)改用「從 PI 逐位元決策+隱含」的搜尋框架,配合 SCOAP 指引決策順序;FAN(Fujiwara–Shimono, 1983)再加向前向後傳播與 multiple backtracking,把 ATPG 速度再推一個數量級。Fault coverage 定義:
4. BIST 內建自測:LFSR 與 MISR 的密碼學#
晶片太大了,外接 tester 的向量頻寬不夠?那就把測試電路做進晶片裡: - LFSR(線性回饋移位暫存器):以多項式 \(x^{16}+x^{12}+x^5+1\) 為回饋,產生 pseudo-random patterns,免費當 ATPG。 - MISR(Multiple-Input Signature Register):把輸出回應壓縮成一個 \(m\) 位元的 signature,與好電路的 golden signature 比對。
LFSR 是伽羅瓦體 \(GF(2)\) 上的線性系統,第 \(t\) 拍的狀態為 \(S_t = T^t S_0\) ,其中 \(T\) 是回饋矩陣;因 \(T\) 可逆且週期為 \(2^m - 1\) (本原多項式),能遍歷所有非零狀態。
Aliasing 機率:壞電路的回應錯誤壓縮後恰好等於 golden signature 的機率為
\(m = 16\) 時約 \(1.5 \times 10^{-5}\) ——逃過 signature 比對的故障不到十萬分之一。
5. JTAG / IEEE 1149.1:電路板的邊界掃描(1990)#
晶片焊在板子上,腳位被 BGA 封住、測針戳不到,怎麼測板級連接? IEEE 1149.1(源自 1985–1990 JTAG 聯盟,核心人物為 Colin Maunder 與 Rodham Tulloss)的答案: - 每顆晶片周圍的 I/O 加 boundary scan cell,串成 TDI→TDO 的邊界掃描鏈。 - 所有晶片共享 TAP(Test Access Port)狀態機:16 個狀態,由 TCK/TMS 兩根腳控制,管 Instruction Register 與多條 Data Register。 - EXTEST 測板級互連、INTEST 測晶片內部、BYPASS 串聯時跳過閒置晶片。
TAP 狀態機是 DFT 史上最成功的「標準化偵探協議」——直到今天每顆 SoC 都有 JTAG,只是多被借去做 debug 與 flash 燒錄。
6. Python 實作:LFSR 產生向量 + MISR 簽名#
POLY = (16, 12, 5, 1) # x^16 + x^12 + x^5 + 1,taps:bit16,12,5 回饋到 bit1
M = 16
def lfsr_step(state):
"""Fibonacci LFSR:右移,feedback = XOR of taps"""
fb = 0
for t in POLY[1:]:
fb ^= (state >> (t - 1)) & 1
return ((state >> 1) | (fb << (M - 1))) & ((1 << M) - 1)
def run_bist(dut_func, state, n_patterns):
"""用 LFSR 餵 pseudo-random patterns,回應壓入 MISR 算 signature"""
sig = 0 # MISR 初始值
for _ in range(n_patterns):
state = lfsr_step(state)
resp = dut_func(state) & ((1 << M) - 1)
sig = ((sig >> 1) ^ resp) & ((1 << M) - 1) # MISR:右移 XOR 輸入
return state, sig
# 被測電路:一個 16-bit 組合函數(含一個 planted stuck-at 故障的版本)
good = lambda x: (x ^ (x >> 3) ^ 0x5A5A) & 0xFFFF
faulty = lambda x: (x | (1 << 7)) ^ (x >> 3) ^ 0x5A5A & 0xFFFF # bit7 stuck-at-1
seed, golden = run_bist(good, 0xACE1, 100)
_, sig_bad = run_bist(faulty, 0xACE1, 100)
print(f"golden signature = {golden:#06x}")
print(f"faulty signature = {sig_bad:#06x}")
print("FAULT DETECTED" if sig_bad != golden else "aliasing(故障逃逸)")
# 預期輸出:
# golden signature = 0xfe03(100 個 pattern 後 LFSR 狀態為 0xc73a)
# faulty signature = 0xfec6
# FAULT DETECTED
同一份 BIST 電路測好晶片得到 golden signature,測壞晶片得到不同 signature—— fault 被偵測,aliasing 沒有發生。真實晶片的 MISR 有 \(m=16\) 或 32 位元,aliasing 機率更低。
// Scan chain:每個 FF 可在 normal/scan 模式間切換
module scan_ff (input clk, d, scan_in, scan_en, output reg q, output scan_out);
always @(posedge clk) q <= scan_en ? scan_in : d; // 測試時串成移位暫存器
assign scan_out = q;
endmodule
module top (input clk, in1, in2, scan_in, scan_en, output out);
wire n1;
scan_ff ff0 (.clk(clk), .d(n1), .scan_in(scan_in), .scan_en(scan_en), .q(q0), .scan_out());
scan_ff ff1 (.clk(clk), .d(in1 & in2), .scan_in(q0), .scan_en(scan_en), .q(q1), .scan_out());
assign n1 = q1 | in2; // 組合邏輯回饋
assign out = q1;
// Shift-in 2 拍 → Capture 1 拍 → Shift-out 2 拍,循序電路測試完成
endmodule
結案 -- 後果與影響#
- 量產測試成本大降:scan + ATPG 使 tester 向量深度從手工數月降為自動數小時,1990 年代末所有 ASIC/SoC 都內建 test insertion,test coverage ≥ 98% 成為 tape-out 前提。
- IEEE 1149.1(1990):boundary scan 成為板級測試的百年標準,至今仍存在於每一顆晶片的 JTAG 腳上,並延伸出 1149.4、1149.6、1149.7。
- BIST 走進量產:memory BIST(MBIST,March algorithms)成為嵌入式 SRAM 的標準自測,logic BIST(LBIST)在汽車與高可靠晶片(如 ISO 26262)復活。
- DFT engineer 成為職業:scan insertion、ATPG、MBIST、JTAG 成為獨立工程職缺與 EDA 產品線(Mentor DFT、Synopsys DFTMAX、Cadence Modus),測試與設計自此分家又合作。
- 理論延續至今:transition/at-speed test 支撐先進製程良率,壓縮(EDT)與 low-power scan、AI 輔助 ATPG,源頭都在 1973–1990 這條線上。
關鍵人物與文獻#
- Michael Williams:「Simplifying Design by Improving Testability」(1973):scan path 概念的起源。
- Eichelberger、Lindbloom、Waicukauski、Williams(IBM):LSSD(Level Sensitive Scan Design)與 IBM 內部 scan-based 方法學。
- J. P. Roth:「Diagnosis of Automata Failures: A Calculus and a Method」(IBM J. R&D, 1966):D-algorithm。
- Prathima Agrawal、V. D. Agrawal:循序電路測試與 time-frame 展開理論。
- Paul Goel:「An Implicit Enumeration Algorithm to Generate Tests for Combinational Logic Circuits」(1981):PODEM。
- Hideo Fujiwara、Takeshi Shimono:「On the Acceleration of Test Generation Algorithms」(1983):FAN。
- L. Goldstein、E. Thigpen:「SCOAP: Sandia Controllability/Observability Analysis Program」(1980)。
- Colin Maunder、Rodham Tulloss(JTAG 聯盟):IEEE Std 1149.1-1990, Standard Test Access Port and Boundary-Scan Architecture。