KiCad 設計DRC規則
KiCad DRC設計規則

頂層語句 (Top-level Clauses)
在 KiCad 中,設計規則檔案的語法由頂層語句開始,以下是常見的頂層語句:
(version <版本號>)
(rule <規則名稱> <規則語句> ...)
version:指定語法版本,應設為1。rule:定義一個規則,包含規則名稱與規則語句。
範例:
(version 1)
(rule "HV"
(constraint clearance (min 1.5mm))
(condition "A.hasNetclass('HV')"))
規則語句 (Rule Clauses)
規則語句用於描述設計規則的細節,以下是常見的語句:
constraint:定義約束條件。condition:指定規則的條件。layer:指定規則適用的層。severity:設定違規的嚴重程度。
範例:
(rule "HV"
(layer "outer")
(constraint clearance (min 1.5mm))
(condition "A.hasNetclass('HV')"))
常見約束類型 (Constraints)
以下列出一些常見的約束類型及其用途:
| 約束類型 | 變數類型 | 描述 |
|---|---|---|
clearance |
min |
定義不同網路銅箔對象的電氣間隙。 |
track_width |
min/opt/max |
檢查走線的寬度。 |
hole_size |
min/max |
檢查焊盤或貫孔的鑽孔大小。 |
edge_clearance |
min/opt/max |
檢查對象與板邊的間隙。 |
thermal_relief_gap |
min |
指定熱焊盤與敷銅區域的最小間隙。 |
annular_width |
min/opt/max |
檢查貫孔的孔環寬度。 |
assertion |
"<expression>" |
檢查給定的表達式。 |
courtyard_clearance |
min |
檢查封裝 Courtyard 之間的間隙。 |
diff_pair_gap |
min/opt/max |
檢查差分對中耦合走線之間的間隙。 |
diff_pair_uncoupled |
max |
檢查差分對正負走線非耦合部分的間隙。 |
disallow |
項目類型列表 | 指定一個或多個對象類型不被允許。 |
hole_clearance |
min |
檢查焊盤或貫孔中的鑽孔與不同網路的銅箔對象之間的間隙。 |
hole_to_hole |
min |
檢查焊盤和貫孔中機械鑽孔之間的間隙。 |
physical_clearance |
min |
檢查給定層上兩個對象之間的間隙,包括非銅層。 |
length |
min/max |
檢查符合規則條件的網路的總走線長度。 |
silk_clearance |
min/opt/max |
檢查絲印層上的對象與其他對象之間的間隙。 |
skew |
max |
檢查符合規則條件的網路的偏斜值。 |
via_count |
max |
計算每個與規則條件匹配的網路的貫孔數量。 |
zone_connection |
solid/thermal_reliefs/none |
指定焊盤與敷銅區域之間的連接方式。 |
範例:
(rule "Pad to Track Clearance"
(constraint clearance (min 0.2mm))
(condition "A.Type <mark> 'Pad' && B.Type </mark> 'Track'"))
表達式函數 (Expression Functions)
表達式函數用於檢查對象的屬性或關係,以下是一些常見的函數:
A.hasNetclass('<netclass_name>'):檢查 A 是否屬於指定的網路類別。A.intersectsArea('<zone_name>'):檢查 A 是否與指定區域相交。A.isPlated():檢查 A 是否有鍍敷孔。A.memberOfFootprint('<footprint_reference>'):檢查 A 是否屬於指定的封裝。A.enclosedByArea('<zone_name>'):檢查 A 是否完全位於指定區域內。A.existsOnLayer('<layer_name>'):檢查 A 是否存在於指定層。A.fromTo('x', 'y'):檢查對象是否存在於兩個指定焊盤之間的銅路徑上。A.getField('<field_name>'):獲取指定欄位的值(僅適用於封裝)。A.hasComponentClass('<component_class_name>'):檢查 A 是否屬於指定的元件類別。A.isMicroVia():檢查 A 是否為微型貫孔。A.isBlindBuriedVia():檢查 A 是否為盲埋貫孔。AB.isCoupledDiffPair():檢查 A 和 B 是否為同一差分對的成員。
範例:
(rule "copper keepout"
(constraint disallow track via zone)
(condition "A.intersectsArea('zone3')"))
違規等級 (Severity Names)
違規等級用於設定規則違反時的嚴重程度:
warning:警告。error:錯誤。exclusion:排除在外。ignore:忽略。
範例:
(rule "silk_board_edge_clearance"
(constraint silk_clearance)
(severity ignore)
(condition "A.memberOfFootprint('J*') && B.Layer=='Edge.Cuts'"))
更多範例
定義差分對間隙
(rule "dp clock gap"
(constraint diff_pair_gap (opt "0.8mm"))
(condition "A.inDiffPair('/CLK')"))
防止焊料從 SMD 焊盤吸走
(rule "holes_in_pads"
(constraint physical_hole_clearance (min 0.2mm))
(condition "B.Pad_Type == 'SMD'"))
確保元件與電路板邊緣的機械間隙
(rule "front_mechanical_board_edge_clearance"
(layer "F.Courtyard")
(constraint physical_clearance (min 3mm))
(condition "B.Layer == 'Edge.Cuts'"))
禁止貫孔蓋油處有絲印
(rule "silk_over_via"
(constraint silk_clearance (min 0.2mm))
(condition "A.Type <mark> '*Text' && B.Type </mark> 'Via'"))
不同網路的貫孔間距
(rule "Distance between Vias of Different Nets"
(constraint hole_to_hole (min 0.254mm))
(condition "A.Type <mark> 'Via' && B.Type </mark> 'Via' && A.Net != B.Net"))
不同網路焊盤之間的間隙
(rule "Clearance between Pads of Different Nets"
(constraint clearance (min 3.0mm))
(condition "A.Type <mark> 'Pad' && B.Type </mark> 'Pad' && A.Net != B.Net"))
貫孔孔洞到走線的間隙
(rule "Via Hole to Track Clearance"
(constraint hole_clearance (min 0.254mm))
(condition "A.Type <mark> 'Via' && B.Type </mark> 'Track'"))
對差分對指定較大的間隙
(rule "dp clearance"
(constraint clearance (min "1.5mm"))
(condition "A.inDiffPair('*') && !AB.isCoupledDiffPair()"))
散熱焊盤使用實心連接(不使用熱焊盤)
(rule "heat_sink_pad"
(constraint zone_connection solid)
(condition "A.Fabrication_Property == 'Heatsink pad'"))
要求熱焊盤連接完整四個輻條
(rule "fully_spoked_pads"
(constraint min_resolved_spokes 4))
設定所有區域的熱焊盤間隙和輻條寬度
(rule "defined_relief"
(constraint thermal_relief_gap (min 10mil))
(constraint thermal_spoke_width (min 12mil)))
電容器下方禁止銅填充
(rule "no_copper_under_caps"
(constraint physical_clearance (min 0mm))
(condition "A.Type <mark> 'Zone' && B.Reference </mark> 'C*'"))
禁止焊盤使用自定義阻焊開窗
(rule "disallow solder mask margin overrides"
(constraint assertion "A.Soldermask_Margin_Override == null")
(condition "A.Type == 'Pad'"))
允許連接器的絲印與板邊相交
(rule "silk_board_edge_clearance"
(constraint silk_clearance)
(severity ignore)
(condition "A.memberOfFootprint('J*') && B.Layer=='Edge.Cuts'"))
高電流網路的走線寬度檢查
(rule "high-current"
(constraint track_width (min 1.0mm))
(constraint connection_width (min 0.8mm))
(condition "A.hasNetclass('Power')"))
分別設定鑽孔和槽孔的尺寸限制
(rule "Plated through-hole size"
(constraint hole_size (min 0.2mm) (max 6.35mm))
(condition "A.isPlated() && A.Hole_Size_X == A.Hole_Size_Y"))
(rule "Plated slot size"
(constraint hole_size (min 0.5mm))
(condition "A.isPlated() && A.Hole_Size_X != A.Hole_Size_Y"))
忽略特定貫孔之間的間隙違規
(rule "hole_to_hole_uvia_exclusion"
(condition "A.Via_Type <mark> 'Blind/buried' && B.Via_Type </mark> 'Micro'")
(constraint hole_to_hole)
(severity ignore))
基於製造標準的 PCB 設計規則
在實際的 PCB 設計過程中,遵循業界標準的設計規則非常重要,這可以確保您的設計能夠被可靠地製造出來。以下介紹一些基於 IPC 標準和常見製造能力的設計規則。
IPC 標準規則
IPC (Institute for Printed Circuits) 是電子行業協會,提供了廣泛採用的 PCB 設計和製造標準。以下是一些基於 IPC-2221 和 IPC-7351 標準的設計規則。
導線寬度與電流關係
根據 IPC-2221 標準,銅箔走線所能承載的電流與其寬度和厚度有關:
| 電流 (A) | 外層走線寬度 (1oz 銅箔) | 內層走線寬度 (1oz 銅箔) |
|---|---|---|
| 0.5 | 0.15mm (6mil) | 0.25mm (10mil) |
| 1.0 | 0.25mm (10mil) | 0.36mm (14mil) |
| 2.0 | 0.5mm (20mil) | 0.7mm (28mil) |
| 3.0 | 0.75mm (30mil) | 1.0mm (40mil) |
| 4.0 | 1.0mm (40mil) | 1.3mm (52mil) |
| 5.0 | 1.25mm (50mil) | 1.6mm (64mil) |
在 KiCad 中實現此規則的例子:
(rule "High Current 2A"
(constraint track_width (min 0.5mm))
(condition "A.hasNetclass('Power2A')"))
(rule "High Current 5A"
(constraint track_width (min 1.25mm))
(condition "A.hasNetclass('Power5A')"))
爬電距離和電氣間隙
爬電距離 (Creepage) 是沿表面測量的兩個導體之間的最短路徑,而電氣間隙 (Clearance) 是兩個導體間的最短直線距離。這些值根據工作電壓、污染程度和絕緣材料來確定:
| 工作電壓 | 基本間隙 (無污染) | 中度污染間隙 | 爬電距離 (標準 FR4) |
|---|---|---|---|
| 0-50V | 0.1mm (4mil) | 0.2mm (8mil) | 0.25mm (10mil) |
| 51-150V | 0.5mm (20mil) | 0.8mm (32mil) | 1.3mm (50mil) |
| 151-300V | 1.5mm (60mil) | 2.0mm (80mil) | 2.5mm (100mil) |
| 301-500V | 2.5mm (100mil) | 3.0mm (120mil) | 5.0mm (200mil) |
KiCad 9 新增加了爬電距離設計規則檢查功能,可以這樣設定:
(rule "Creepage 150V"
(constraint creepage (min 1.3mm))
(condition "A.hasNetclass('HV') && B.hasNetclass('GND')"))
常見製造能力限制
不同的 PCB 製造商有不同的製造能力限制,以下是一些通用的限制:
標準製造能力
| 參數 | 標準能力 | 高級能力 | 超高能力 |
|---|---|---|---|
| 最小走線寬度 | 0.15mm (6mil) | 0.1mm (4mil) | 0.075mm (3mil) |
| 最小間距 | 0.15mm (6mil) | 0.1mm (4mil) | 0.075mm (3mil) |
| 最小鑽孔直徑 | 0.3mm (12mil) | 0.2mm (8mil) | 0.15mm (6mil) |
| 最小環寬(環徑) | 0.2mm (8mil) | 0.125mm (5mil) | 0.1mm (4mil) |
| 最小絲印寬度 | 0.15mm (6mil) | 0.1mm (4mil) | 0.08mm (3mil) |
| 最小阻焊開窗 | 0.25mm (10mil) | 0.2mm (8mil) | 0.15mm (6mil) |
在 KiCad 中實現這些規則:
# 標準製造能力規則
(rule "Min Track Width"
(constraint track_width (min 0.15mm)))
(rule "Min Clearance"
(constraint clearance (min 0.15mm)))
(rule "Min Hole Size"
(constraint hole_size (min 0.3mm)))
(rule "Min Annular Ring"
(constraint annular_width (min 0.2mm)))
多層板設計規則
多層板設計時,需要考慮更多的設計規則:
層間對位
層間對位錯誤可能導致貫孔無法正確連接各層。通常的設計規則是:
(rule "Via Annular Ring"
(constraint annular_width (min 0.125mm))
(condition "A.Type == 'Via'"))
阻抗控制走線
高速信號需要阻抗控制,需要根據板層堆疊和材料特性計算走線寬度。常用的阻抗值有:
- 單端信號:50Ω
- 差分信號:90Ω-100Ω 差分阻抗 (每條走線約 45Ω-50Ω)
對於 FR4 材料,1.6mm 厚的板子,外層 1oz 銅箔,典型的走線寬度為:
- 50Ω 單端走線:約 0.3mm (12mil)
- 100Ω 差分走線:約 0.2mm (8mil) 寬,間距 0.2mm (8mil)
(rule "50ohm Impedance"
(constraint track_width (opt 0.3mm))
(condition "A.hasNetclass('50ohm')"))
(rule "100ohm Differential"
(constraint track_width (opt 0.2mm))
(constraint diff_pair_gap (opt 0.2mm))
(condition "A.inDiffPair('*')"))
特殊應用設計規則
高頻設計
高頻設計需要特別注意信號完整性和電磁干擾:
# 高頻走線彎曲
(rule "RF Traces"
(constraint track_width (min 0.2mm) (opt 0.3mm))
(condition "A.hasNetclass('RF')"))
# 隔離高頻區域
(rule "RF Isolation"
(constraint clearance (min 0.5mm))
(condition "A.hasNetclass('RF') && !B.hasNetclass('RF')"))
高壓設計
高壓設計需要更大的間隙,通常基於 IPC-2221 標準:
(rule "High Voltage Isolation"
(constraint clearance (min 3mm))
(constraint physical_clearance (min 4mm))
(condition "A.hasNetclass('HV') && !B.hasNetclass('HV')"))
低電流感測
對於電流感測電路,走線間的對稱性和阻抗匹配很重要:
(rule "Current Sense"
(constraint track_width (opt 0.5mm))
(constraint length (max 10mm))
(condition "A.hasNetclass('I_SENSE')"))
常見設計檢查點
除了設計規則外,還應當檢查以下幾點,以確保 PCB 設計的可製造性:
- 熱焊盤設計:確保大型焊盤採用適當的熱焊盤連接,以避免焊接問題
- 銅平衡:確保各層銅箔分佈均勻,避免板子彎曲
- 鑽孔堆疊:避免鑽孔過於密集,可能導致板子強度下降
- 過孔覆蓋:確定是否需要覆蓋過孔,以防止焊料流入
- 元件間距:確保元件間有足夠間距,便於組裝和維修
- 測試點:添加足夠的測試點,便於製造後測試
設計規則檢查 (DRC) 最佳實踐
使用 KiCad 的 DRC 功能時,建議採用以下最佳實踐:
- 循序漸進檢查:先修復嚴重錯誤,再處理警告
- 定期運行 DRC:設計過程中定期運行 DRC,避免錯誤積累
- 建立規則庫:為不同類型的設計建立特定的規則檔案
- 分層檢查:分別檢查各個層的問題
- 記錄例外:對於有意忽略的設計規則違規,做好文檔記錄
# 設定例外規則,但加上說明,便於追蹤
(rule "Specific Via Exception"
(constraint clearance (min 0.1mm))
(severity warning)
(condition "A.Type <mark> 'Via' && A.Net </mark> 'GND' && B.Net == 'GND'"))
進階表達式用法
在條件表達式中,您可以使用以下項目來表示測試對象:
A: 第一個(或唯一)測試項目B: 第二個測試項目(對於需要兩個項目的規則)L: 當前測試的層
您可以使用邏輯運算符組合多個條件:
&&: 邏輯與||: 邏輯或!: 邏輯非
範例:
(condition "A.hasNetclass('HV') && !A.enclosedByArea('Shield*')")
您還可以使用條件表達式中的算術運算:
(constraint clearance (min "1.5mm + 2.0mm"))
規則優先順序
規則應按照具體到一般的順序排列。後面的規則優先於前面的規則;一旦找到匹配的規則,就不再檢查前面的規則。
範例:
# 一般規則
(rule "General Clearance"
(constraint clearance (min 0.2mm)))
# 特定規則(優先於一般規則)
(rule "HV Clearance"
(constraint clearance (min 0.5mm))
(condition "A.hasNetclass('HV')"))
使用萬用字元
在表達式函數的參數中,支持簡單的萬用字元:
*: 匹配任意數量的字符?: 匹配任意單個字符
範例:
(condition "A.memberOfFootprint('R*')") # 匹配所有以 R 開頭的封裝
(condition "A.memberOfFootprint('U?')") # 匹配 U1, U2, U3 等
注意事項
- 版本語句必須是第一個語句,表示檔案的語法版本。
- 規則順序應按具體情況排序,後面的規則優先於前面的規則。
- 使用
Cmd+/可對選中的行添加或取消註釋。 - KiCad 9 中,設計規則檢查(DRC)的性能得到顯著改進,大型設計的檢查速度更快。
- 對於複雜條件,可將相關規則分成多個單獨的規則,以提高可維護性。
實際應用場景
高速信號設計
# 差分對規則
(rule "diff_pair_general"
(constraint diff_pair_gap (min 0.1mm) (opt 0.2mm))
(condition "A.inDiffPair('*')"))
# USB差分對特定規則
(rule "diff_pair_usb"
(constraint diff_pair_gap (min 0.15mm) (opt 0.25mm))
(constraint clearance (min 0.3mm))
(condition "A.inDiffPair('/USB*')"))
# 控制差分對走線長度
(rule "diff_pair_length"
(constraint length (max 50mm))
(condition "A.inDiffPair('/USB*')"))
電源設計
# 主電源走線規則
(rule "main_power"
(constraint track_width (min 1.0mm))
(constraint clearance (min 0.3mm))
(condition "A.hasNetclass('Power')"))
# 敏感模擬電源規則
(rule "analog_power"
(constraint track_width (min 0.5mm))
(constraint clearance (min 0.25mm))
(condition "A.hasNetclass('Analog') && A.Name == '*VCC'"))
射頻設計
# RF相關區域的走線控制
(rule "rf_area"
(constraint track_width (min 0.25mm) (opt 0.3mm))
(constraint via_count (max 3))
(condition "A.intersectsArea('RF_Zone')"))
# 阻抗控制
(rule "50ohm_traces"
(constraint track_width (opt 0.35mm))
(condition "A.hasNetclass('RF')"))
文件
更完整的文件請參考 KiCad 官方文件。
KiCad 9 版本中的設計規則檢查功能已有顯著改進,包括增強的爬電距離設計規則檢查和更完整的設計規則表達式支援。使用 KiCad 9 版本的用戶可以利用這些新功能創建更強大和靈活的設計規則。
本文最初發布於 HackMD @BASHCAT。
留言
張貼留言