측정이 대상을 바꾸고 있었다 — 그리고 양산 보드에서 꺼낸 정답지

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

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

같은 보드를 네 번 재봤다

의심이 든 건 검사 결과가 너무 자주 바뀐다는 점이었다. 그래서 아무것도 안 고치고 같은 보드에 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개 + 허용 집합 안의 짧은 네킹만” 으로 바꿨다. 판정은 부품 이름이 아니라 실제 핀 피치로 한다.

층이 모자랐던 걸지도

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

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

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


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

규칙을 반영해 다시 돌린 재라우팅 — 빨강은 상면, 파랑은 하면 배선

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

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

댓글

로그인 없이 이름만 적고 남기실 수 있어요. 남긴 댓글은 바로 게시됩니다.

댓글을 불러오는 중…