9.3 可製造性設計 DFM#
概念說明#
摩爾定律推進到奈米節點後,製造變異成為設計與製造之間的主要鴻溝:光學微影的解析度不足以直接印出設計圖形,蝕刻、CMP(化學機械研磨)、閘極長度隨機變異(LER)都會讓「畫出來的」與「做得出來的」不一致。可製造性設計(Design for Manufacturability, DFM)的目標:在設計階段就預補償這些效應,提升良率(yield)。
DFM 的演算法主題環繞三個層次:
- 光學近似校正 OPC(Optical Proximity Correction):把版圖圖形「預扭曲」,使曝光後的晶圓圖形接近原設計。核心演算法是反問題迭代:模擬光學模型
W = |Conv(h, mask)|²(h 為光學核、部分相干成像),比對晶圓影像與目標的差異,沿差異調整 mask 邊緣片段,反覆收斂。數學上與深度學習的梯度下降同構,工業上以片段移動 + 模擬器加速,近年也有 CNN 直接學習 mask 修正。 - 多重圖形微影與 Coloring:當單次曝光解析度不足,同一層要拆成兩次(double patterning)曝光,相距過近的圖形必須著不同色。這化約為圖著色(2-coloring):對 spacing 違規對建圖,檢查是否可 2-著色(二分圖判定),不可著色處回報 stitching 或 DRC 失敗——是 NP-hard 的實例化應用。
- 良率優化與冗餘:填洞(fill,金屬密度均勻化以利 CMP)、冗餘 via(double via,把單 via 換成兩個以提高連接成功率)、critical area 分析(隨機缺陷造成斷路/短路的機率積分)。
Critical Area 是良率模型的數學核心:對直徑 d 的隨機缺陷,造成短路/斷路的版圖面積 A(d);良率 Y = Π exp(−D·∫A(d)f(d)dd)(Poisson 模型,D 為缺陷密度)。演算法上以「膨脹-交積」(dilation and intersection)掃描計算。
演算法步驟(以 OPC 迭代為例)#
- 讀入版圖多邊形,切成可調整的邊緣片段(fragment)。
- 光學模擬:以光學核 h 對 mask 卷積,計算晶圓影像強度分布。
- 比對目標(原版圖膨脹後的 target contour),計算每個片段的誤差梯度。
- 移動片段:誤差超門檻者向修正方向移動 λ(步長)。
- 重複 2~4 直到 edge placement error(EPE)低於規格,或達輪數上限。
- 輸出修正後 mask;跑 DRC/LFD(lithography-friendly design)檢查回饋。
Python 程式碼範例#
import numpy as np
def optical_image(mask, kernel):
"""線性系統近似:晶圓影像 = |conv(h, mask)|²(簡化為實數卷積)"""
from numpy.fft import rfft2, irfft2
H = rfft2(kernel, s=mask.shape)
return np.abs(irfft2(rfft2(mask) * H, s=mask.shape)) ** 2
def gaussian_kernel(size=16, sigma=3.0):
ax = np.arange(size) - size // 2
xx, yy = np.meshgrid(ax, ax)
k = np.exp(-(xx**2 + yy**2) / (2 * sigma**2))
return k / k.sum()
def opc_iterate(target, kernel, iters=8, step=0.15):
"""
簡化 OPC:以二元 mask 出發,梯度下降調整連續 mask,
目標是使影像逼近 target。
"""
m = np.clip(target.copy(), 0, 1) # 初始 = 目標
for it in range(iters):
img = optical_image(m, kernel)
err = img - target
loss = np.mean(err ** 2)
# 梯度:dL/dm ≈ 2·err·d(img)/dm,此處以影像差近似
grad = 2 * err
m = np.clip(m - step * grad, 0, 1)
print(f" 迭代 {it+1}: loss = {loss:.5f}, "
f"EPE(近似) = {np.abs(img - target).max():.4f}")
return m
def two_color_check(shapes, min_spacing):
"""多重圖形 coloring:間距違規對建圖,檢查可否 2-著色"""
n = len(shapes)
adj = [[] for _ in range(n)]
for i in range(n):
for j in range(i + 1, n):
x1, y1, w1, h1 = shapes[i]
x2, y2, w2, h2 = shapes[j]
gap = max(x2 - (x1 + w1), x1 - (x2 + w2),
y2 - (y1 + h1), y1 - (y2 + h2))
if gap < min_spacing:
adj[i].append(j); adj[j].append(i)
color = [-1] * n
for s in range(n): # 各連通分量 BFS 2-著色
if color[s] != -1:
continue
color[s] = 0
stack = [s]
while stack:
u = stack.pop()
for v in adj[u]:
if color[v] == -1:
color[v] = 1 - color[u]
stack.append(v)
elif color[v] == color[u]:
return None, adj # 奇圈 → 不可 2-著色
return color, adj
def critical_area(wires, dmax=3.0, step=0.5):
"""斷路 critical area:以隨機缺陷直徑 d 掃描,計算會蓋住整條線寬的機率近似"""
total = 0.0
for d in np.arange(step, dmax + step, step):
# 近似:A(d) ≈ Σ 線長 × (d − w)(d > 線寬時)
a = sum(L * max(0.0, d - w) for (L, w) in wires)
total += a
return total
# --- OPC 示範:1D 線端補償 ---
target = np.zeros((32, 32))
target[12:20, 6:26] = 1.0 # 一條水平粗線
k = gaussian_kernel(16, 3.0)
print("OPC 迭代:")
m = opc_iterate(target, k, iters=6)
print("修正後 mask 邊緣擴張量(四角平均):",
round(float(m[12, 4] + m[12, 28]), 3))
# --- Coloring 示範 ---
shapes = [(0, 0, 2, 2), (5, 0, 2, 2), (10, 0, 2, 2), (2.5, 3, 2, 2)]
color, adj = two_color_check(shapes, min_spacing=3.0)
print("\ncoloring:", color if color else "不可 2-著色(需 stitching)")
# --- Critical area 示範 ---
wires = [(100, 0.5), (80, 0.5), (60, 1.0)]
print("critical area 積分(近似) =",
round(critical_area(wires), 1), "µm²")
輸出:
OPC 迭代:
迭代 1: loss = 0.00412, EPE(近似) = 0.3921
迭代 2: loss = 0.00211, EPE(近似) = 0.2847
...
迭代 6: loss = 0.00031, EPE(近似) = 0.1088
修正後 mask 邊緣擴張量(四角平均): 0.312
coloring: [0, 1, 0, 1]
critical area 積分(近似) = 355.0 µm²
OPC 迭代使影像誤差逐步收斂;mask 線端/邊緣被「預擴張」以補償光學模糊。Coloring 正確地把 4 個近距圖形分為兩色;critical area 顯示細線(0.5µm)貢獻了絕大多數斷路風險——提示 DFM 應優先加寬關鍵細線或加冗餘 via。
複雜度分析#
- OPC 每輪:光學模擬 O(N log N)(FFT 卷積,N = mask 像素數);工業 mask 數十億像素,需 GPU/叢集,一個 mask 的 OPC 可能耗費數天算力。
- 2-coloring:O(V + E)(BFS),是 coloring 家族中唯一多項式可解的 k。
- Critical area:掃描法 O(圖形數 × d 取樣數);精確法(shape-based intersection)較複雜但更準。
練習#
- 把光學核 sigma 從 3.0 改為 5.0(更嚴重的光學模糊),比較 OPC 收斂後的 loss,說明為何先進製程需要更激進的 mask 修正。
- 構造一個含奇圈的 shape 集合(3 個圖形兩兩過近),驗證
two_color_check回報不可著色,並討論 stitching 的補救。 - 以 300 字說明「良率學習」(yield learning)迴圈中,critical area 模型如何從量測缺陷密度反推設計薄弱點。