KiCad 設計DRC規則

KiCad DRC設計規則

截圖 2025-04-22 下午1.39.08 截圖 2025-04-22 下午1.41.41 截圖 2025-04-22 下午1.41.56

頂層語句 (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 設計的可製造性:

  1. 熱焊盤設計:確保大型焊盤採用適當的熱焊盤連接,以避免焊接問題
  2. 銅平衡:確保各層銅箔分佈均勻,避免板子彎曲
  3. 鑽孔堆疊:避免鑽孔過於密集,可能導致板子強度下降
  4. 過孔覆蓋:確定是否需要覆蓋過孔,以防止焊料流入
  5. 元件間距:確保元件間有足夠間距,便於組裝和維修
  6. 測試點:添加足夠的測試點,便於製造後測試

設計規則檢查 (DRC) 最佳實踐

使用 KiCad 的 DRC 功能時,建議採用以下最佳實踐:

  1. 循序漸進檢查:先修復嚴重錯誤,再處理警告
  2. 定期運行 DRC:設計過程中定期運行 DRC,避免錯誤積累
  3. 建立規則庫:為不同類型的設計建立特定的規則檔案
  4. 分層檢查:分別檢查各個層的問題
  5. 記錄例外:對於有意忽略的設計規則違規,做好文檔記錄
# 設定例外規則,但加上說明,便於追蹤
(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 等

注意事項

  1. 版本語句必須是第一個語句,表示檔案的語法版本。
  2. 規則順序應按具體情況排序,後面的規則優先於前面的規則。
  3. 使用 Cmd+/ 可對選中的行添加或取消註釋。
  4. KiCad 9 中,設計規則檢查(DRC)的性能得到顯著改進,大型設計的檢查速度更快。
  5. 對於複雜條件,可將相關規則分成多個單獨的規則,以提高可維護性。

實際應用場景

高速信號設計

# 差分對規則
(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

留言

這個網誌中的熱門文章

Arduino 課本可能沒教的事(1)

SI4432 搭配Arduino

燒錄 Arduino mini Pro 燒錄