동기 리셋과 비동기 리셋, 설계 원칙과 흔한 함정

동기 리셋과 비동기 리셋, 설계 원칙과 흔한 함정

회의 중에 누군가 “잠깐, 중단합시다”라고 외치면 모두 하던 말을 멈춰야 합니다. 다시 시작할 때는 진행자가 박자를 맞춰 “하나, 둘, 시작” 하고 알려 줘야, 누구는 벌써 말을 꺼내고 누구는 자료를 뒤적이는 어수선함이 생기지 않죠.

칩의 리셋도 같은 구조입니다. 멈추라는 외침은 즉시 효과가 있어야 하고 재개 신호는 모두가 같은 박자로 받아야 하는데, 이 두 요구가 동기 리셋과 비동기 리셋이라는 선택지로 갈라져 나타납니다. 이 글에서는 두 방식의 차이, recovery와 removal 검사, 가장 널리 쓰이는 조합 구조를 차례로 살펴보겠습니다.

회의와 다른 점도 있습니다. 칩에서는 재개 신호가 모든 자리에 동시에 닿지 않고 배선을 따라 퍼지는 시간이 자리마다 달라서, 박자에서 어긋난 해제가 오히려 새로운 문제의 출발점이 됩니다.

리셋이 필요한 이유, 전원 직후의 알 수 없는 상태

칩에 전원이 막 들어온 순간 일반적인 ASIC의 플립플롭은 0인지 1인지 정해져 있지 않습니다. 상태 기계가 임의의 값에서 출발하면 존재하지 않는 상태로 빠져 영영 돌아오지 못할 수 있으므로, 시작 시점에 제어 상태를 약속된 값으로 맞춰야 합니다.

그렇다고 모든 플립플롭에 리셋이 필요한 것은 아닙니다. 상태 기계, 제어 레지스터, 유효 표시처럼 초기값에 의미가 있는 것만 리셋하고, 어차피 새 데이터가 덮어쓰는 파이프라인 데이터 레지스터는 리셋을 빼서 면적과 리셋 배선 부담을 줄이는 경우가 많습니다. FPGA는 설정 정보에 초기값을 담을 수 있어 사정이 다르다는 점도 알아 두면 좋습니다.

동기 리셋과 비동기 리셋의 차이

동기 리셋(Synchronous reset)은 리셋 신호를 데이터처럼 취급해 클록 에지에서 샘플링한 뒤 반영합니다. 비동기 리셋(Asynchronous reset)은 플립플롭의 별도 리셋 핀에 연결되어, 클록과 상관없이 신호가 활성화되는 즉시 출력을 초기값으로 만듭니다.

두 방식의 동작을 말로 풀면

  • 동기 리셋: 클록 에지가 왔을 때 리셋이 활성이면 초기값을 담고, 아니면 평소처럼 다음 값을 담습니다.
  • 비동기 리셋: 리셋이 활성인 동안은 클록과 무관하게 초기값이 유지되고, 풀린 뒤에는 클록 에지마다 평소처럼 동작합니다.

차이를 이해하려면 리셋을 거는 순간(assert)과 푸는 순간(deassert)을 나누어 보는 것이 좋습니다. 비동기 리셋은 거는 순간이 클록과 무관하게 즉시 반영된다는 것이 장점이고, 푸는 순간이 클록 에지 근처에 걸리면 문제가 생긴다는 것이 약점입니다.

동기 리셋의 장점과 한계

동기 리셋은 리셋이 클록 에지에서만 반영되므로 에지 사이에 잠깐 생긴 글리치는 샘플링되지 않으면 무시됩니다. 리셋 신호가 일반 데이터와 똑같이 취급되어 정적 타이밍 분석의 셋업과 홀드 검사를 그대로 받으므로 해제 타이밍을 위한 별도의 검사 개념이 필요 없습니다.

한계는 리셋 반영에 클록이 꼭 필요하다는 점입니다. 전원이 들어온 직후처럼 클록이 아직 안정되지 않았거나 클록이 꺼진 영역은 리셋이 들어와도 반영되지 않고, 리셋 펄스가 클록 주기보다 짧으면 샘플링 자체를 놓칩니다.

구현 면에서는 데이터 입력 앞에 리셋용 논리가 추가되어 데이터 경로가 조금 길어집니다. 외부에서 들어오는 리셋 버튼 같은 신호는 클록과 무관하게 변하므로, 동기 리셋이라 해도 내부에서 쓰기 전에 동기화가 필요합니다.

비동기 리셋의 장점과 한계

비동기 리셋은 클록 없이도 초기화되므로 전원 직후 클록이 안정되기 전에도, 클록 게이팅으로 꺼진 영역에도 리셋을 적용할 수 있습니다. 데이터 경로에 리셋 논리가 끼지 않아 타이밍에도 유리합니다.

리셋 핀이 있는 셀은 일반 플립플롭보다 크지만 데이터 경로의 게이트가 필요 없으므로, 어느 쪽이 더 작은지는 라이브러리와 팬아웃에 따라 달라집니다. 면적만으로 방식을 고르기는 어렵다는 뜻입니다.

대신 두 가지 위험이 따릅니다. 하나는 리셋이 곧 즉시 효과이기 때문에 짧은 글리치도 상태를 지워 버린다는 점이고, 다른 하나는 리셋이 풀리는 순간이 클록 에지 근처에 걸릴 수 있다는 점입니다.

리셋 해제가 에지에 아슬아슬하게 걸리면 준안정성이 생기거나, 같은 상태 기계의 플립플롭 중 일부만 해제된 것으로 인식됩니다. 또 스캔 테스트처럼 칩 내부를 제어해야 하는 모드에서는 비동기 리셋이 테스트 도중 값을 지우지 않도록 외부에서 제어할 수 있게 설계해야 합니다.

recovery와 removal, 해제 시점의 타이밍 검사

비동기 리셋을 푸는 순간에도 플립플롭은 클록 에지를 기준으로 한 요구 조건을 가집니다. recovery 시간은 리셋 해제가 다음 클록 유효 에지보다 최소 이만큼 먼저 끝나 있어야 하는 시간으로, 셋업과 닮았습니다.

removal 시간은 반대로 리셋 해제가 클록 유효 에지보다 최소 이만큼 뒤에 일어나야 하는 시간으로, 홀드와 닮았습니다. 두 조건을 합치면 리셋 해제는 클록 에지를 중심으로 한 좁은 구간 안에서 일어나서는 안 됩니다.

이 구간을 어기면 플립플롭이 에지에서 리셋이 풀렸는지 아닌지를 확정하지 못합니다. 한 플립플롭은 해제를 인식했는데 이웃은 아직 리셋 중으로 인식하면, 상태 기계가 원-핫 인코딩일 때 1인 비트가 하나도 없거나 둘 이상이 되는 불법 상태가 만들어질 수 있습니다.

가상 계산 예시, 리셋 해제 경로의 여유클록 주기 5 ns, 리셋을 내보내는 플립플롭의 클록-출력 지연 0.4 ns, 리셋 트리의 최대 지연 3.0 ns와 최소 지연 1.0 ns, 수신 플립플롭의 recovery 0.3 ns와 removal 0.2 ns로 가정합니다.

recovery 여유는 5.0 − (0.4 + 3.0 + 0.3) = 1.3 ns이고, removal 여유는 (0.4 + 1.0) − 0.2 = 1.2 ns입니다. 클록 스큐와 불확실성은 계산을 단순하게 하려고 생략했으며, 실제 분석에서는 이를 함께 빼서 계산합니다.

이 예에서 보듯 리셋 트리의 최대 지연과 최소 지연의 차이(편차)가 클수록 모든 플립플롭이 같은 클록 에지에서 해제를 인식하기 어려워집니다. 그래서 큰 팬아웃의 리셋 신호는 클록 트리처럼 버퍼로 나누어 편차를 관리합니다.

비동기로 걸고 동기로 푸는 구조

동기 리셋과 비동기 리셋의 장점을 합친 구조가 비동기로 걸고 동기로 푸는 리셋 동기화기(Reset synchronizer)입니다. 외부 리셋 입력이 이 동기화기를 통과한 뒤 내부 리셋이 되어 도메인 안의 플립플롭들을 구동합니다.

리셋 동기화기의 구조플립플롭 두 개를 직렬로 잇고 두 플립플롭의 비동기 리셋 핀에 외부 리셋(활성 저준위)을 연결합니다. 첫 번째 플립플롭의 데이터 입력은 항상 1이고, 클록은 도메인의 클록이며, 두 번째 플립플롭의 출력이 내부 리셋이 됩니다.

  1. 외부 리셋이 활성화되면 두 플립플롭이 클록과 상관없이 즉시 0이 되어 내부 리셋도 즉시 활성화됩니다 (비동기 assert).
  2. 외부 리셋이 풀려도 두 플립플롭의 출력은 바로 변하지 않습니다.
  3. 다음 클록 에지에서 첫 번째 플립플롭이 1을 잡고, 그다음 에지에서 두 번째 플립플롭이 1이 되어 내부 리셋이 풀립니다 (동기 deassert).

외부 리셋 해제가 클록 에지에 가깝게 걸려 첫 번째 플립플롭이 준안정 상태가 되어도, 한 주기를 더 기다려 두 번째 플립플롭이 안정한 값을 잡습니다. 내부 리셋의 해제는 언제나 클록 에지에서 나오기 때문에, 도메인 안의 플립플롭들이 보는 해제 경로를 일반 경로처럼 검사하고 recovery와 removal 조건을 맞출 수 있습니다.

대가는 해제가 늦어진다는 점입니다. 100 MHz(주기 10 ns) 클록이라면 외부 리셋이 풀린 뒤 내부 리셋이 풀리기까지 클록 에지 정렬에 따라 대략 10~20 ns가 걸리므로, 시작 시퀀스는 이 지연을 고려해야 합니다. 클록 도메인이 여러 개이면 도메인마다 자기 클록으로 동작하는 리셋 동기화기를 따로 둡니다.

리셋 도메인 크로싱과 설계 원칙

리셋은 여러 종류가 섞여 있을 수 있습니다. 전원 인가 리셋, 감시 타이머가 일으키는 리셋, 소프트웨어가 특정 블록만 초기화하는 리셋이 각각 다른 영역을 대상으로 한다면, 서로 다른 리셋으로 초기화되는 영역 사이를 건너는 신호가 생깁니다.

이것이 리셋 도메인 크로싱(RDC, Reset Domain Crossing)입니다. 블록 A만 비동기로 리셋되면 블록 B가 보고 있던 A의 출력이 B의 클록과 무관한 시점에 갑자기 바뀌어, 클록 도메인 크로싱에서처럼 준안정성이 생길 수 있습니다.

대책은 리셋되는 블록의 출력을 상대가 쓸 때 안전한 값으로 고정하거나 동기화하고, 서로 연관된 블록은 리셋 순서를 정해 함께 다루는 것입니다. 이런 점검은 정적 검사의 대상이 되기도 합니다.

리셋 설계에서 자주 쓰는 원칙

  • 초기값이 의미 있는 상태 요소에만 리셋을 겁니다.
  • 비동기 리셋은 글리치 없는 신호로 구동하고, 조합 논리의 출력을 곧바로 리셋 핀에 연결하지 않습니다.
  • 리셋 해제는 항상 도메인 클록에 동기화하고, 도메인마다 리셋 동기화기를 둡니다.
  • 큰 팬아웃의 리셋은 버퍼 트리로 나누어 해제 편차가 recovery와 removal 여유 안에 들어오게 합니다.
  • 테스트 모드에서 비동기 리셋을 외부에서 제어할 수 있게 하고, 클록이 꺼진 상태에서 리셋이 풀려도 안전한지 확인합니다.

동기 리셋과 비동기 리셋 비교 표

구분동기 리셋비동기 리셋비동기 assert, 동기 deassert
리셋을 거는 시점클록 에지에서 반영클록과 무관하게 즉시클록과 무관하게 즉시
리셋을 푸는 시점클록 에지에 맞춰 반영클록과 무관하게 풀려 에지 근처에 걸릴 수 있음클록 에지에 맞춰 풀림
클록 필요 여부필요걸 때는 불필요걸 때는 불필요, 풀 때는 필요
글리치에 대한 민감도에지에서 샘플링될 때만 영향짧은 펄스도 즉시 영향외부 입력은 여전히 글리치에 민감
타이밍 검사일반 셋업과 홀드recovery와 removal 추가recovery와 removal을 일반 경로처럼 관리 가능
비용데이터 경로에 리셋 논리리셋 핀 달린 셀, 리셋 트리 관리동기화기 플립플롭, 해제 2사이클 지연

핵심 정리

동기 리셋과 비동기 리셋의 차이는 리셋을 거는 순간과 푸는 순간이 클록과 어떤 관계를 갖느냐에서 나옵니다. 동기 리셋은 모든 것을 클록에 맞춰 안전하지만 클록이 있어야 하고, 비동기 리셋은 즉시 걸리지만 푸는 순간에 recovery와 removal 조건을 어기기 쉽습니다.

회의의 “중단”과 “시작” 비유로 돌아가면, 중단은 누구든 즉시 외칠 수 있어야 하고 시작은 진행자의 박자에 맞춰야 한다는 뜻입니다. 그래서 대부분의 설계는 비동기로 걸고 동기로 푸는 구조를 도메인마다 두고, 비유와 달리 칩에서는 박자를 알리는 신호가 자리마다 다르게 도착한다는 점까지 리셋 트리 설계로 챙깁니다.

면접 대비 질문

면접 대비 질문비동기 리셋을 쓸 때 해제를 클록에 동기화해야 하는 이유를 recovery와 removal 개념으로 설명하고, 그 구조를 말해 보세요.

[답변 포인트] 비동기 리셋은 거는 순간 클록과 무관하게 즉시 반영되지만, 푸는 순간이 클록 에지 근처에 걸리면 recovery 또는 removal 조건을 어겨 준안정성이 생기거나 일부 플립플롭만 해제를 인식한다는 점을 먼저 말합니다. 플립플롭 두 개를 직렬로 잇고 외부 리셋을 두 플립플롭의 비동기 리셋 핀에, 데이터 입력은 1로 둔 리셋 동기화기가 걸 때는 즉시, 풀 때는 클록 에지 두 번 뒤에 내부 리셋을 푼다고 설명합니다. 비용으로 해제 지연 2사이클, 도메인마다 동기화기가 필요하다는 점, 큰 팬아웃 리셋 트리의 편차 관리, 리셋 도메인 크로싱까지 덧붙이면 좋습니다.