← 전체 글로 돌아가기
CDC

𝗖𝗗𝗖 │ 2비트에 각각 2FF를 달면 안전할까?

CDC-6 multi-bit synchronizer warning: 2FF per bit does not guarantee bus coherence

CDC-6 multi-bit synchronizer warning: 2FF per bit does not guarantee bus coherence 인포그래픽
Daily ASIC original infographic · English labels

report_cdc에서 2비트 bus에 CDC-6 warning이 뜹니다. 각 bit에는 2FF synchronizer도 있고 ASYNC_REG도 붙어 있습니다. “필요한 건 다 했는데 왜 경고지?” 이 경고는 metastability 대책의 유무보다, 두 bit를 목적지에서 한 묶음의 값으로 읽어도 되는지를 묻습니다.

두 bit의 유효한 상태가 01과 10뿐인 회로를 생각해 보겠습니다. source clock에서 01 → 10으로 바뀔 때 두 bit가 동시에 전환됩니다. 하지만 두 CDC 경로의 도착 시간과 FF sampling 결과는 같지 않을 수 있습니다. 먼저 1→0이 반영되면 destination에는 잠깐 00, 먼저 0→1이 반영되면 11이 보일 수 있습니다. 각 bit의 2FF 출력이 결국 10으로 안정되어도, 중간 값은 설계에서 정의하지 않은 상태입니다.

2FF는 각 단일 bit의 metastability 전파 가능성을 낮추는 구조입니다. 여러 bit가 같은 destination cycle에 함께 갱신된다는 계약은 따로 만들어야 합니다. AMD Vivado UG906이 ASYNC_REG가 있는 multi-bit synchronizer도 CDC-6 warning으로 남기는 이유입니다. report_cdc가 회로의 값 전환 규칙까지 증명해 주지는 않습니다.

방법은 데이터의 성격에 따라 달라집니다. 모든 연속 상태 전환에서 한 bit만 바뀌도록 Gray coding이 가능하다면, 해당 경로의 timing 제약까지 확인한 뒤 bitwise synchronizer를 쓸 수 있습니다. 반대로 임의의 2비트 payload라면 source가 값을 register에 잡아 두고 request를 동기화해 destination에서 한 번에 capture하는 handshake/CE-controlled CDC가 어울립니다. ACK가 돌아오고 handshake가 끝날 때까지 source는 그 payload를 덮어쓰지 않아야 합니다. 이때 request만 동기화했다고 끝이 아니라, data path가 capture 시점 전에 도착하도록 crossing delay도 제약·검토해야 합니다.

리뷰에서는 세 가지를 묻습니다. “유효한 값의 전환에서 몇 bit가 바뀌나?”, “destination은 언제 bus를 읽나?”, “source가 다음 값을 쓰기 전 ACK를 확실히 받나?” 연속 전송량이 중요하다면 handshake의 왕복 latency를 감수할지, asynchronous FIFO로 바꿀지도 함께 판단해야 합니다.

근거: AMD Vivado UG906 (2026.1), Multi-Bit Synchronizer / CE-Controlled CDC / CDC Report Rules; AMD UG1704 (2026.1), XPM_CDC_HANDSHAKE.

https://docs.amd.com/r/en-US/ug906-vivado-design-analysis/Multi-Bit-Synchronizer
https://docs.amd.com/r/en-US/ug906-vivado-design-analysis/CE-Controlled-CDC
https://docs.amd.com/r/en-US/ug906-vivado-design-analysis/Understanding-the-Clock-Domain-Crossings-Report-Rules
https://docs.amd.com/r/en-US/ug1704-spartan-ultrascaleplus-libraries/XPM_CDC_HANDSHAKE

ORIGINAL POSTLinkedIn에서 원문 보기 ↗
이전 글𝗦𝗧𝗔 │ set_output_delay -min은 왜 음수일까?다음 글𝗥𝗘𝗦𝗘𝗧 │ reset을 푸는 순간에도 timing check가 있습니다