4부 마지막에 남긴 문제. 고쳐놓은 게 되살아납니다.

선 굵기를 넷 규칙에 맞춰 통일해 놓습니다. 다음 라운드에 재보면 다시 어긋나 있습니다. 직각을 10곳까지 줄여놓습니다. 다시 재면 늘어나 있습니다. 몇 번을 반복해도 같았습니다.

같은 보드에 DRC 를 네 번 돌려봤다

DRC 검사 결과너무 자주 바뀐다는 점이 의심스러웠습니다. 그래서 아무것도 안 고치고 같은 보드에 DRC 만 연속으로 걸어봤습니다.

회차위반(error)
10
216
33
450

보드를 손대지 않았는데 결과가 이렇게 나옵니다. 파일 해시를 찍어보니 답이 나왔습니다.

kicad-cli pcb drc --refill-zones board.kicad_pcb

이 명령이 보드 파일을 덮어씁니다. 존(구리 포어)을 다시 채운 결과를 그 파일에 저장합니다. 즉 검사할 때마다 검사 대상이 바뀝니다.

기준선이 흔들리자 자동 보정 루프가 무너졌다

자동 보정 루프는 단순히 “숫자가 흔들린다” 정도로 끝나지 않았습니다. 제가 만든 보정 도구는 전부 이런 구조였습니다.

1. 현재 상태를 DRC 로 잰다          ← 기준선
2. 고친다
3. 다시 DRC 로 잰다
4. 나빠졌으면 되돌린다

기준선 자체가 매 호출마다 움직이면 이 판단은 전부 무의미합니다. 좋아진 결과를 나빠졌다고 판정해서 되돌리고, 나빠진 걸 좋아졌다고 채택합니다. “고쳐놓은 게 되살아난다”의 정체가 이거였습니다.

지금까지 “DRC 클린”이라고 기록해둔 숫자들도 실제 상태와 무관할 수 있다는 뜻입니다.

고치는 법 — 원본이 아니라 사본을 잰다

측정용 사본을 씁니다. 보드와 프로젝트 파일을 임시 폴더에 복사해서 그 사본을 재고, 원본은 손대지 않습니다.

방식1회2회3회
원본에 직접0163
사본에 (프로젝트 포함)000

세 번 모두 같습니다. 원본 해시도 그대로입니다.

여기서 함정이 하나 더 있습니다. 보드 파일만 복사하면 안 됩니다. 옆에 있는 프로젝트 파일(.kicad_pro)에 넷클래스와 커스텀 룰이 들어 있어서, 그게 없으면 같은 보드가 0건 → 40건 → 118건으로 뻥튀기됩니다. “사본으로 쟀으니 안전하다”가 아니라 “규칙까지 같이 복사했는가” 를 확인해야 합니다.

측정이 대상을 바꾸면, 그건 데이터가 아닙니다.

새 검증 루프를 만들 때 제일 먼저 확인할 것 — 이 명령이 입력 파일을 쓰는가. 해시 비교 한 줄이면 됩니다.

두 번째 범인 — 보정 스크립트가 선폭을 깎고 있었다

선 굵기는 측정을 고치고 나서 다시 봤습니다. 보드에 0.225mm 와 0.375mm 가 남아 있었습니다. 규칙은 신호 0.3 / 전원 0.5 인데, 정확히 그 0.75배입니다.

범인은 제가 만든 보정 스크립트들이었습니다.

파일실제로 있던 코드
간섭 수정기SetWidth(GetWidth() - 0.05mm)
마감 수정기SetWidth(w - 0.08mm)
갭 연결기for w in (0.5, 0.4, 0.3)들어가는 폭으로 깔았다
마감 도구0.2 하드코딩, 넷 이름 하드코딩

간섭(클리어런스 위반)이 나면 선을 깎아서 통과시키고 있었습니다. DRC 는 초록불이 되지만 설계 규칙은 이미 깨져 있습니다. 가장 나쁜 실패 형태입니다 — 검사기가 통과라고 말하는데 물건이 틀린 상태.

고친 방향은 두 가지입니다.

  1. 폭 규칙의 출처를 하나로. 프로젝트 파일의 넷클래스만 읽는 함수 하나를 만들고, 폭이 필요한 모든 스크립트가 그걸 import 합니다. 스크립트가 스스로 폭을 정하는 코드는 전부 제거.
  2. 간섭은 경로를 바꿔서 없앱니다. 폭이나 간격을 깎아서 숨기지 않습니다. 규칙 폭으로 강제한 뒤 위반이 나면, 그건 폭 문제가 아니라 경로가 그 폭을 감당 못 한다는 신호입니다.

규칙대로 폭을 강제하니 간섭이 16건 나왔습니다. 전부 0.176~0.19mm 로, 필요한 0.2mm 에 0.02mm 모자란 것들이었습니다. 0.225mm 기준으로 벌어져 있던 이웃 선이 0.3mm 로 넓어지면서 붙은 것입니다. 되돌리지 않았습니다. 고칠 대상은 그 구간의 경로입니다.

정답지는 사내 양산 보드 실측에 있었다

양산 보드 실측값이 정답지였습니다. 여기까지 오면서 저는 “0.3mm 가 적당하겠지”, “비아는 0.8/0.4 정도면 되겠지” 하고 값을 정해왔습니다. 그러다 이미 만들어 팔고 있는 보드들의 설계 파일과 제조 데이터를 다시 꺼내봤습니다. 추측할 필요가 없었습니다.

항목실측
기본 신호 선폭0.25mm — 전체 배선 길이의 79~92%
쓰이는 폭의 집합0.15 / 0.20 / 0.25 / 0.30 / 0.50 / 1.00
배선 각도0° / 45° / 90° 가 100.0% (임의 각도 0mm)
층별 방향상면 가로 60% / 하면 세로 59%
비아드릴 0.305mm / 패드 0.610mm
서멀 스포크4개, 폭 0.51(THT) / 0.25(SMD)

세 가지가 인상적이었습니다.

첫째, 45° 규칙이 실측으로 증명됐습니다. 임의 각도가 정확히 0mm 입니다. 사람이 그린 보드가 100.0% 로 0/45/90 만 씁니다.

둘째, 층별 방향이 실제로 지켜지고 있습니다. 4부에서 “계단의 원인은 층 방향 부재”라고 썼는데, 우리 양산 보드가 그대로 하고 있었습니다.

셋째, 넷 안에서 폭이 섞이는 경우가 15% 있습니다. 다만 패턴이 있습니다 — 주 폭이 하나 있고 패드 진입부만 짧게 좁힙니다. 핀 간격이 좁은 부품(RP2040 같은)은 0.25mm 로는 핀에서 선을 뺄 수 없어서 0.2mm 로 좁혀 빠져나온 뒤 다시 넓힙니다. 그래서 규칙을 “넷당 폭 1개”가 아니라 “넷당 주 폭 1개 + 허용 집합 안의 짧은 네킹만” 으로 바꿨습니다. 판정은 부품 이름이 아니라 실제 핀 피치로 합니다.

구리층이 모자랐던 걸지도 — 양산품은 4층이었다

구리층 수가 마지막으로 하나 더 나왔습니다. 지금 만들고 있는 16채널 IO 보드의 대응 양산품(4채널 IO 보드)의 거버를 열어보니 구리층이 네 장이었습니다. 그리고 내층 두 장이 접지 평면이 아니라 진짜 배선층이었습니다 — 0.25mm 선이 344mm, 262mm 깔려 있습니다.

저는 채널이 4배인 보드를 2층으로 깔고 있었습니다.

계단·우회·간섭이 반복되는 게 알고리즘 문제가 아니라 층이 모자란 것일 수 있습니다. 배선 품질에 며칠을 쓰기 전에 “같은 계열 양산품은 몇 층인가”를 먼저 쟀어야 했습니다.

측정이 대상을 바꾸면 그건 데이터가 아니고, 추측으로 정하던 값은 사내 양산 보드를 재면 그대로 나옵니다.


규칙을 전부 반영해서 다시 돌렸습니다. 비아를 0.6/0.3 으로 줄이고 전체 재라우팅을 걸었습니다. 그 배선이 순서대로 놓이는 과정을 영상으로 남겼습니다.

▶️ 6부 — 2층으로는 안 되는 거였다: 규칙은 다 지켰는데 배선이 나빴던 이유 — 4층으로 갈아엎기

🔧 이전 편: 1부 · 2부 · 3부 · 4부 — 배선이 말을 안 듣는다

문의