비동기 클록 그룹으로 숨긴 경로에도 전달 조건은 남는다
두 클록 도메인 사이에서 해석하기 어려운 setup 위반이 대량으로 나왔다. 주파수와 위상이 독립인 두 클록을 같은 방식으로 비교한 결과라면, asynchronous clock group을 지정하는 것이 타당할 수 있다. 그런데 제약을 넣자 보고서가 깨끗해졌다는 사실만으로 경계의 데이터 전달도 안전해졌다고 말할 수 있을까? 이 제약이 바꾸는 것은 클록 사이의 타이밍 검사 관계다.
그룹 밖의 경로를 검사하지 않는 선언
예를 들어 다음 코드는 a 도메인과 b 도메인을 서로 비동기 그룹으로 나눈다. 실제 설계에서는 클록 객체가 정확히 선택되었는지 먼저 확인해야 한다.
set_clock_groups -asynchronous \
-group [get_clocks clk_a] \
-group [get_clocks clk_b]
OpenSTA 공식 설명은 서로 다른 그룹의 클록 사이 경로가 보고되지 않는다고 명시한다. 이는 두 그룹의 에지 사이에 정상적인 동기 setup·hold 관계를 강요하지 않겠다는 선언이다. 그룹 안에서의 경로까지 모두 지우는 명령은 아니다. 예를 들어 b 클록을 사용하는 동기화 플롭의 첫 단계에서 두 번째 단계로 가는 경로는 b 도메인 내부의 타이밍 검토 대상이다. set_clock_groups 설명과 옵션
이 선언 자체는 레지스터를 추가하지 않고, 메타안정성을 제거하지 않으며, 여러 데이터 비트를 같은 순간에 정착시키지도 않는다. 따라서 그룹을 나누기 전에 그 경계를 통과하는 신호가 무엇인지 알아야 한다. 단일 제어 신호의 동기화와 여러 비트를 묶어 전달하는 프로토콜은 검사가 사라진 뒤에도 서로 다른 의무를 가진다.
데이터가 늦고 알림이 빠른 가상 반례
한 번에 한 워드만 보내는 가상 인터페이스를 생각해 보자. 송신자는 데이터 레지스터를 갱신하며 request를 토글하고, 수신 완료 응답이 돌아올 때까지 데이터를 유지한다. 수신자는 request를 두 플롭으로 동기화한 뒤 토글 변화를 검출하여 데이터 버스를 한 번 캡처한다. 두 플롭으로 request를 받았으니 데이터도 안전할 것처럼 보인다.
하지만 데이터 버스와 request는 다른 물리 경로를 지난다. 예제를 위해 송신 갱신을 0ns, 수신 클록 에지를 1·5·9ns로 놓자. Request의 첫 동기화 플롭은 1ns에 새 값을 받아들이고, 두 번째는 5ns에 받는다고 가정한다. 토글 변화 검출과 데이터 캡처는 레지스터 동작의 이전 값을 읽는 관계를 반영하여 9ns 에지에서 이루어진다고 정한다. 메타안정성으로 더 늦어지는 경우는 이 계산에서 제외했다.
데이터 경로가 12ns라면 수신자는 9ns에 아직 정착하지 않은 새 워드를 캡처한다. 송신자가 응답까지 데이터를 유지해도 이 앞선 캡처를 되돌리지 못한다. Request 동기화 구조가 있다는 사실과 데이터가 캡처 전에 정착했다는 사실은 따로 확인해야 한다.
이 특정 에지 배열에서 수신 setup 여유를 0.2ns로 잡으면 데이터 정착 마감은 8.8ns다. 데이터 경로가 8ns라면 계산상의 여유는 0.8ns지만, 12ns라면 −3.2ns다. 이는 원리를 드러내기 위한 가상 계산이지, 비동기 경계의 보편적인 허용 지연이 아니다. 실제 최대 지연은 가능한 상대 위상 중 가장 이른 캡처, request 전달 지연, 각 단계의 동작, 데이터 유지 조건을 사용해 결정해야 한다. 메타안정성이 캡처를 늦출 수 있다는 가능성을 데이터 정착 보장의 근거로 쓰면 안 된다.
추가한 지연 제약이 실제로 살아 있는가
여기서 데이터 경로에 최대 지연을 넣으면 끝이라고 생각하기 쉽다. 그러나 도구의 예외 우선순위에 따라 넓은 clock group 선언이 그 검사를 가릴 수 있다. AMD의 Vivado 문서는 set_clock_groups가 set_max_delay보다 우선하며, 양방향 경로에 동기화가 있고 set_max_delay -datapath_only가 필요한 경로가 없을 때 비동기 그룹을 권장한다고 설명한다. Vivado의 비동기 그룹 권장 조건
따라서 Vivado에서 일부 경로의 데이터 지연을 제한해야 한다면, 같은 두 클록 사이를 통째로 잘라 놓고 최대 지연을 덧붙이는 식으로 해결하지 않는다. 필요한 경로의 최대 지연 검사를 유지하고 나머지 경로의 예외를 개별적으로 지정하는 접근을 검토한다. 이는 해당 도구의 우선순위를 설명한 것이며, 다른 도구에도 똑같은 옵션과 순서를 적용할 수 있다는 뜻은 아니다. AMD의 예외 우선순위 예제
기존 시스템에 그룹을 추가할 때는 새로 사라지는 경로 목록을 확인하는 것이 좋은 출발점이다. 이미 검증된 동기화 구조만 경계를 통과하는지, 넓은 그룹 안에 새로운 버스나 우회 경로가 섞이지 않았는지 살펴볼 수 있다. 리셋의 해제 순서와 처음 request·ack 상태도 별도 프로토콜 조건이다. 타이밍 보고서에 경로가 없다는 것은 이러한 조건을 검증했다는 기록이 아니다.
Asynchronous clock group은 비동기 클록 사이에 의미 없는 동기 에지 비교를 강요하지 않기 위한 제약이다. 제대로 사용했다는 근거는 위반 개수가 줄었다는 숫자보다, 제외한 각 경로가 어떤 전달 구조로 안전해지고 어떤 물리 지연 조건을 여전히 만족해야 하는지 설명할 수 있다는 데 있다.