36 / 52 · 개념
클록 도메인 경계와 metastability
2단 동기화기의 적용 범위를 이해하고, 단일 비트·짧은 펄스·다중 비트 전송을 구분합니다.
내용은 무료로 볼 수 있습니다. 수강 신청하면 학습 기록을 저장할 수 있어요.
다른 클록의 입력에는 에지 간격 보장이 없습니다
setup·hold 조건은 데이터가 수신 클록의 에지 주변에서 충분히 안정되어 있어야 한다는 요구입니다. 버튼이나 독립된 다른 클록 도메인의 출력은 수신 에지와 임의의 관계를 가지므로 이 조건을 항상 보장하기 어렵습니다.
그 결과 플립플롭의 내부 상태가 일정 시간 동안 0 또는 1로 빠르게 결정되지 않는 metastability가 발생할 수 있습니다. 일반적인 0/1 RTL 시뮬레이션에는 이런 아날로그 현상이 그대로 표현되지 않습니다. 테스트 파형이 깨끗하다고 CDC가 안전하다는 뜻은 아닙니다.
2단 동기화기는 충분히 오래 유지되는 단일 비트에 사용합니다
module level_synchronizer (
input logic clk_dst,
input logic rst_dst,
input logic async_level,
output logic synced_level
);
logic first_stage;
always_ff @(posedge clk_dst) begin
if (rst_dst) begin
first_stage <= 1'b0;
synced_level <= 1'b0;
end else begin
first_stage <= async_level;
synced_level <= first_stage;
end
end
endmodule첫 번째 플립플롭이 불안정해져도 다음 플립플롭이 값을 읽기 전까지 안정될 시간을 주는 구조입니다. 기능 회로에는 첫 단계의 출력을 직접 분기하지 않고 마지막 단계의 출력을 사용합니다. 위 reset은 목적지 클록에 동기식이라고 가정합니다.
실제 구현에서는 동기화기 속성 지정, 단계 사이의 짧은 배선, STA·CDC 검사 등 도구와 소자에 맞는 처리가 필요합니다. 레지스터 두 개를 썼다는 사실만으로 배치와 경로 조건까지 보장되지는 않습니다.
실패 확률을 낮추지만 0으로 만들지는 않습니다
한 가지 단순화한 모델에서는 평균 실패 간격 MTBF가 다음 경향을 가집니다.
는 안정될 수 있는 시간, 는 소자의 특성, 는 수신 클록 주파수, 는 비동기 입력의 전환 빈도입니다. 실제 계산에는 소자별 상수가 필요합니다. 이 식만으로 임의의 회로에 ‘몇 년 동안 안전하다’는 숫자를 붙일 수는 없습니다.
서로 다른 문제에 같은 회로를 쓰지 않습니다
| 전달할 정보 | 2단 단일 비트 동기화만으로 충분한가? | 검토할 구조 |
|---|---|---|
| 충분히 오래 유지되는 level | 확률·지연 요구를 만족하면 사용 가능 | 목적지 동기화기 |
| 목적지 주기보다 짧은 pulse | pulse 자체를 놓칠 수 있음 | pulse 확장, toggle, handshake |
| 동시에 의미가 있는 여러 비트 | 비트마다 다른 시점의 값이 보일 수 있음 | 안정된 bus와 handshake, async FIFO |
| 기계식 버튼 | 접점의 반복 튐은 별개 문제 | 동기화 후 debounce |
예를 들어 4비트 값이 0111에서 1000으로 바뀔 때 각 비트를 독립적으로 동기화하면 잠시 존재하지 않았던 조합을 관찰할 수 있습니다. 버스의 일관성을 보존하려면 전체 데이터와 전달 완료의 관계를 설계해야 합니다.
추가 읽기: Computation Structures — Synchronization and Arbitration
직접 생각해 보기
수신 클록이 50MHz이고 입력 pulse 폭은 5ns입니다. 2단 동기화기를 붙였으므로 모든 pulse가 검출된다고 주장할 수 있습니까? 버튼의 튐도 함께 제거됩니까?
해설 보기
50MHz의 주기는 20ns입니다. 5ns pulse는 수신 에지 사이에 생겼다가 사라질 수 있어 첫 단계부터 놓칠 수 있습니다. 동기화기의 단계 수를 늘리는 것만으로 pulse 보존을 해결하지 못합니다. pulse 확장이나 handshake 등의 계약이 필요하며, 버튼의 bounce에는 별도 debounce가 필요합니다.