---
title: "클록에 맞춰 읽었는데 왜 틀릴까: setup·hold와 준안정성"
author: "브레이브브라우저쓰자"
published_at: "2026-10-08T03:00:04.521Z"
updated_at: "2026-09-30T06:00:12.254Z"
tags: ["반도체","반도체 이론","공학","기술 해설","칩 공장"]
canonical_url: "https://ariser.io/@writer_a9817d5a8de0/%ED%81%B4%EB%A1%9D%EC%97%90-%EB%A7%9E%EC%B6%B0-%EC%9D%BD%EC%97%88%EB%8A%94%EB%8D%B0-%EC%99%9C-%ED%8B%80%EB%A6%B4%EA%B9%8C-setup-hold%EC%99%80-%EC%A4%80%EC%95%88%EC%A0%95%EC%84%B1"
ai_assisted: false
---

# 클록에 맞춰 읽었는데 왜 틀릴까: setup·hold와 준안정성

[원문](https://ariser.io/@writer_a9817d5a8de0/%ED%81%B4%EB%A1%9D%EC%97%90-%EB%A7%9E%EC%B6%B0-%EC%9D%BD%EC%97%88%EB%8A%94%EB%8D%B0-%EC%99%9C-%ED%8B%80%EB%A6%B4%EA%B9%8C-setup-hold%EC%99%80-%EC%A4%80%EC%95%88%EC%A0%95%EC%84%B1)

## 움직이는 글자를 찍는 데는 시간이 필요하다

전광판의 숫자가 바뀌는 바로 그 순간 사진을 찍으면, 어느 숫자를 찍었는지 모호해질 수 있다. 디지털 회로의 플립플롭도 클록 순간의 입력을 받아 저장하지만, 그 ‘순간’은 물리적으로 폭이 없는 점이 아니다. 내부 회로가 값을 받아들이고 기존 상태를 새 상태로 바꾸는 데 시간이 필요하다.

그래서 입력은 클록의 유효 에지 전에 일정 시간 안정돼 있어야 하고, 그 뒤에도 잠시 유지돼야 한다. 앞쪽 조건이 setup time, 뒤쪽이 hold time이다. 이 요구를 지키면 정해진 조건에서 정상 동작을 보장받지만, 어기면 출력이 언제 어떤 값으로 정해질지 그 보장이 사라진다. 모든 위반이 반드시 관측 가능한 고장으로 이어지는 것은 아니다. [MIT의 레지스터 시간 조건](https://ocw.mit.edu/courses/6-004-computation-structures-spring-2017/pages/c5/c5s1/)

## 0과 1 사이에서 오래 머무는 회로

플립플롭 내부에는 서로의 상태를 강화하는 피드백이 있다. 정상적으로는 한쪽이 높고 다른 쪽이 낮은 두 안정 상태 중 하나로 빠르게 정해진다. 그런데 입력 전환과 샘플링이 아주 가깝게 겹치면, 내부가 어느 쪽으로 갈지 작은 차이에 민감한 상태에 놓일 수 있다. 이것이 준안정성, metastability다.

언젠가 0이나 1로 정해질 가능성은 높지만, 필요한 시간 안에 끝난다는 결정론적 보장은 어렵다. 외부 출력이 반드시 전원 전압의 절반에서 눈에 띄게 떨리는 것도 아니다. 정상적인 0이나 1처럼 보이다 예상보다 늦게 바뀌는 형태로 나타날 수 있다. 그 늦은 변화가 다음 회로의 샘플링과 겹치는 것이 문제다.

특히 서로 관계없는 클록 영역에서 넘어온 신호는 수신 클록의 어느 순간에 바뀔지 보장하기 어렵다. [Ran Ginosar, 준안정성과 동기화 회로, §1](https://ran.net.technion.ac.il/files/2016/06/MetastabilitySynchronizersTutorialIEEEDT2011.pdf#page=2)

## 실패를 없애는 대신, 정해질 시간을 확보한다

대표적인 단일 비트 동기화 회로는 수신 클록으로 동작하는 플립플롭을 연속해서 둔다. 첫 단계가 입력을 받고, 다음 단계가 나중에 그 결과를 읽는다. 이 사이에 첫 단계가 안정될 시간을 주어 불확실성이 뒤쪽 논리로 전달될 확률을 낮춘다.

단순한 통계 모형에서는 평균 고장 간격 MTBF를 다음처럼 나타낸다.

`MTBF ≈ exp(T_res / τ) / (T_w × f_clk × f_data)`

T_res는 안정될 수 있도록 확보한 시간, τ는 해당 회로가 준안정 상태에서 벗어나는 속도를 나타내는 시간상수, T_w는 유효한 민감 시간폭이다. f_clk는 수신 클록 주파수, f_data는 입력의 실제 전환 빈도다. exp는 자연상수를 밑으로 하는 지수함수다. T_w를 데이터시트의 setup과 hold를 단순히 더한 값으로 대입해서는 안 된다.

이 모형에서는 여유 시간이 길수록 MTBF가 지수적으로 커지고, 샘플링과 데이터 전환이 잦을수록 실패 기회가 늘어난다. 입력의 상대 시점을 통계적으로 다루고 회로 특성이 정해져 있다는 가정이 필요하다. τ와 T_w는 공정·전압·온도 및 셀 구조에 맞춰 평가해야 한다. [Ginosar의 MTBF 유도와 조건, §1.3](https://ran.net.technion.ac.il/files/2016/06/MetastabilitySynchronizersTutorialIEEEDT2011.pdf#page=6)

## 플립플롭 두 개는 만능 통행증이 아니다

확보한 시간은 클록 한 주기 전체보다 짧다. 앞 단계의 출력 지연과 배선 지연, 다음 단계의 setup 여유가 그 시간을 사용한다. 단계를 늘리면 안정될 시간을 더 줄 수 있지만 전달 지연과 회로 자원도 늘어난다. AMD의 분석 도구 역시 동기화 단계를 통과하는 동안의 여유 시간으로 MTBF를 평가한다. [AMD의 동기화 MTBF 설명](https://docs.amd.com/r/en-US/ug835-vivado-tcl-commands/report_synchronizer_mtbf)

여러 비트가 하나의 숫자를 나타낸다면 비트마다 별도로 동기화하는 것만으로 충분하지 않다. 어떤 비트는 이전 값을, 다른 비트는 새 값을 받아 존재하지 않았던 조합을 만들 수 있다. 짧은 펄스를 놓치는 문제도 별개다. 데이터의 성격에 맞춰 핸드셰이크나 비동기 FIFO 같은 전달 방식을 골라야 한다. [AMD의 비동기 클록 영역 전달 설명](https://docs.amd.com/r/en-US/ug574-ultrascale-clb/Asynchronous-Clock-Domain-Crossing)

클록을 느리게 하면 setup 여유는 늘릴 수 있지만, 같은 에지 직후 데이터가 너무 빨리 바뀌는 hold 문제까지 자동으로 해결되지는 않는다. 또 MTBF는 평균적인 통계 지표이지, 그 시간 동안 한 번도 실패하지 않는다는 보증서가 아니다. 디지털의 확실한 0과 1은 값을 정할 시간까지 설계했을 때 얻어진다.

