---
title: "버퍼를 하나 더 넣었는데 경로가 빨라지는 조건"
author: "브레이브브라우저쓰자"
published_at: "2026-10-25T00:46:00.944Z"
updated_at: "2026-10-06T02:15:45.694Z"
tags: ["buffer insertion"]
canonical_url: "https://ariser.io/@writer_a9817d5a8de0/%EB%B2%84%ED%8D%BC%EB%A5%BC-%ED%95%98%EB%82%98-%EB%8D%94-%EB%84%A3%EC%97%88%EB%8A%94%EB%8D%B0-%EA%B2%BD%EB%A1%9C%EA%B0%80-%EB%B9%A8%EB%9D%BC%EC%A7%80%EB%8A%94-%EC%A1%B0%EA%B1%B4"
ai_assisted: true
---

# 버퍼를 하나 더 넣었는데 경로가 빨라지는 조건

이 글은 AI가 활용됐습니다.

[원문](https://ariser.io/@writer_a9817d5a8de0/%EB%B2%84%ED%8D%BC%EB%A5%BC-%ED%95%98%EB%82%98-%EB%8D%94-%EB%84%A3%EC%97%88%EB%8A%94%EB%8D%B0-%EA%B2%BD%EB%A1%9C%EA%B0%80-%EB%B9%A8%EB%9D%BC%EC%A7%80%EB%8A%94-%EC%A1%B0%EA%B1%B4)

많은 부하를 구동하는 신호에 버퍼를 추가하면 왜 빨라질까? 셀이 하나 더 들어가는데도 지연이 줄 수 있는 이유는 원래 드라이버가 감당하던 부하를 나누기 때문이다. Buffer insertion의 효과를 평가하려면 추가한 셀의 지연과 줄어든 부하 비용을 함께 계산해야 한다. 개선한 경로 바깥에서 바뀐 최소 지연도 확인할 필요가 있다.

## 드라이버가 직접 보는 부하를 바꾼다

원래 드라이버가 큰 부하 C를 직접 구동했다면, 버퍼를 넣은 뒤에는 주로 버퍼 입력과 앞쪽 배선의 부하를 구동한다. 버퍼는 뒤쪽 부하를 담당한다. 추가 버퍼가 충분히 강하고 적절한 위치에 있으면 원래 드라이버의 부하 감소가 셀 추가 비용보다 클 수 있다.

MIT의 배선 강의는 드라이버 저항과 부하 정전용량의 곱으로 지연을 근사하고, 배선의 분포 저항·정전용량을 함께 고려하는 모델도 설명한다. 이 RC 계산은 지연의 경향을 이해하기 위한 근사이며 정확한 파형의 특정 전압 도달 시간을 언제나 그대로 반환하는 식은 아니다. [MIT 6.884 Wires, 11–13쪽](https://ocw.mit.edu/courses/6-884-complex-digital-systems-spring-2005/fd75994e0ea84378705dd12ee8c16326_l04_wires.pdf)

단순한 가상 부하에서 원래 드라이버의 등가 저항을 1kΩ, 부하를 100fF로 놓자. 배선의 별도 저항은 생략하고 `지연 대용값 = RC`로 정의하면 100ps다. 버퍼 입력은 5fF, 버퍼의 고유 지연은 20ps, 출력 저항은 100Ω이라고 가정한다. 버퍼를 넣은 대용값은 다음과 같다.

```text
원래 드라이버 → 버퍼 입력: 1kΩ × 5fF = 5ps
버퍼 고유 지연: 20ps
버퍼 → 뒤쪽 부하: 100Ω × 100fF = 10ps
합계: 35ps
```

셀 하나가 늘었어도 100에서 35로 줄었다. 반대로 뒤쪽 부하가 5fF뿐이었다면 원래 값은 5ps이고 버퍼를 넣은 값은 5 + 20 + 0.5 = 25.5ps다. 작은 부하에서는 셀 추가 비용이 더 크다. 이 예제는 실제 라이브러리나 배치 결과가 아니라 정한 근사 모델의 비교다.

## Fanout 개수만으로 부하를 알 수 없다

같은 수의 입력 핀을 연결해도 각 핀의 정전용량과 배선 길이가 다르면 부하는 다르다. 여러 부하를 한 버퍼가 맡을지, 분기마다 버퍼를 둘지에 따라서도 앞 드라이버가 보는 부하와 각 목적지의 경로가 바뀐다. 긴 배선을 분할하려면 위치와 배선의 RC도 중요하다.

OpenROAD의 `repair_design`은 최대 slew·정전용량·fanout 위반과 긴 배선의 RC 지연을 다루기 위해 버퍼를 넣고 셀 크기를 조정한다고 설명한다. 목적을 fanout 숫자 줄이기 하나로 한정해서 읽으면 어떤 net에 버퍼가 들어갔는지 이해하기 어렵다. [OpenROAD Repair Design](https://openroad.readthedocs.io/en/latest/main/src/rsz/README.html#repair-design)

또한 버퍼의 입력 slew와 뒤쪽 부하에 따라 고유 지연과 출력 파형도 달라진다. 위 예제처럼 20ps를 모든 경우에 고정하는 계산은 실제 라이브러리 평가를 대신하지 못한다. 삽입 위치가 이동하거나 배선이 우회하면 예상한 부하 분할도 달라질 수 있다.

## 빠르게 만든 분기가 hold에는 불리할 수 있다

Setup의 개선과 최소 지연의 변화를 보기 위해 별도의 가상 분기 경로를 놓자. 한 드라이버에서 먼 목적지와 가까운 목적지로 나뉘고, 먼 분기에 버퍼를 넣어 공통 드라이버의 부하도 줄어든다고 가정한다. 실제 셀 모델에서 계산한 결과라는 주장은 하지 않고, 경로 변화의 타이밍 의미를 확인할 숫자를 다음처럼 정한다.

먼 목적지의 최대 도착은 90ps에서 70ps로, 가까운 목적지의 최소 도착은 30ps에서 15ps로 바뀐다. 두 값에는 각 경로의 출발 지연이 포함되고, 요구 시간의 클록 관계는 변경되지 않았다고 하자. 먼 목적지의 setup 요구가 80ps라면 slack은 −10에서 +10ps로 개선된다. 가까운 목적지의 hold 요구가 20ps라면 slack은 도착에서 요구를 빼므로 +10에서 −5ps로 나빠진다.

버퍼가 있는 먼 경로를 개선한 동안, 버퍼를 지나지 않는 가까운 분기의 데이터도 공통 부하 감소로 더 빨리 올 수 있다는 조건이다. 실제 개선량은 회로와 분석 코너에서 확인해야 한다. 이 가상 숫자는 앞의 단일 부하 RC 예제에서 유도한 값이 아니다.

OpenROAD도 타이밍 개선에서 setup을 먼저 다루고 hold를 다음에 다루는 순서를 설명한다. 어느 한쪽을 고친 뒤 다른 검사가 그대로일 것이라고 가정하지 않는 접근이다. [Repair Timing의 순서](https://openroad.readthedocs.io/en/latest/main/src/rsz/README.html#repair-timing)

## 삽입 전후에는 같은 조건으로 전체 분기를 읽는다

버퍼 수나 가장 나쁜 setup 경로 하나만 비교하기보다 변경된 net의 분기들이 어떤 부하를 보게 되었는지 확인하면 좋다. 각 목적지의 최대·최소 도착, slew와 부하를 같은 코너 및 클록 조건에서 비교한다. 추가 셀의 면적과 전력, 합법 배치 공간도 비용이다. 배치 기반 기생 성분은 최종 배선 기생 성분과 다를 수 있으므로 최종 결과에서 확인해야 한다.

Buffer insertion은 추가한 셀보다 더 큰 부하 비용을 줄일 때 효과가 있다. 효과적인 삽입 위치와 구동력은 그 균형으로 정하고, 바뀐 모든 분기의 시간 조건으로 검증한다. 셀이 늘었다는 사실도, 한 경로가 빨라졌다는 사실도 혼자서는 삽입의 성공을 결정하지 않는다.

