모든 이야기

같은 클록 경로의 지연을 두 번 다르게 고르면 생기는 위반

같은 클록 버퍼를 지나온 두 레지스터 사이에서 setup 위반이 나왔다고 하자. 데이터를 내보내는 쪽의 클록은 느리게, 받는 쪽의 클록은 빠르게 계산하면 가장 불리한 조건을 만들 수 있다. 그런데 두 클록이 갈라지기 전까지 같은 버퍼와 배선을 사용했다면, 그 공통 구간까지 서로 반대의 지연으로 계산하는 것이 맞을까? CPPR는 바로 이 지점에서 타이밍 보고서의 보수성을 다시 따져 보는 방법이다.

공유한 지연은 두 번 독립적으로 고를 수 없다

공정 변동 등을 보수적으로 반영하는 분석에서는 한 경로에 early 지연, 다른 경로에 late 지연을 사용한다. Setup은 데이터 도착을 늦게, 캡처 클록 도착을 일찍 잡을수록 불리해진다. 문제는 launch 클록 경로와 capture 클록 경로에 같은 물리 구간이 포함되어 있을 때다. 공유 구간의 동일한 변동 성분을 한쪽에서는 최대, 다른 쪽에서는 최소로 독립 선택하면 실제보다 큰 클록 도착 차이가 생긴다.

OpenSTA는 이 보정을 CRPR라고 부른다. 공식 변수 설명은 같은 게이트에 최소와 최대 지연을 동시에 적용하는 데서 발생하는 비관성을 제거한다고 설명한다. CPPR와 CRPR라는 이름만 보고 서로 전혀 다른 회로 기법이라고 생각할 필요는 없다. 여기서는 공통 클록 경로에서 중복된 보수성을 제거한다는 의미로 CPPR를 사용한다. OpenSTA의 CRPR 설명

중요한 것은 클록의 출발점이 같다는 사실보다 실제 공유 구간이다. 중간부터 서로 다른 버퍼와 배선을 지나간다면 그 이후의 지연 차이는 남겨야 한다. 이름이 같은 클록이라도 공유했다고 인정할 구간이 없으면 보정량이 생기지 않을 수 있다.

0.2ns의 보정이 어디서 나오는가

계산을 위해 만든 가상 회로를 보자. 단위는 모두 ns이며, 클록 주기는 1이다. 공유 구간의 early 지연은 0.2, late 지연은 0.4라고 하자. 갈라진 뒤 launch 분기의 지연은 0.1, capture 분기는 0.15로 고정한다. 데이터 경로의 최대 지연은 clock-to-Q를 포함하여 0.8, 목적지 setup 시간은 0.1이다. 추가 불확실성은 생략했다.

공유 구간을 독립 선택하면 launch 클록은 0.4 + 0.1 = 0.5에 도착하고, 다음 capture 클록은 1 + 0.2 + 0.15 = 1.35에 도착한다. 데이터 도착은 0.5 + 0.8 = 1.3이다. 요구 시간은 1.35 − 0.1 = 1.25이므로 slack은 −0.05다.

하지만 공유 구간의 지연을 양쪽에 동일한 값 c로 넣으면 식이 달라진다.

setup slack = (1 + c + 0.15 − 0.1) − (c + 0.1 + 0.8)
            = +0.15 ns

c가 소거된다. 독립 선택으로 잃었던 0.4 − 0.2 = 0.2를 복원하면 −0.05가 +0.15로 바뀐다. 이 가상 예제는 공유 지연의 동일한 성분이 양쪽에 작용한다고 가정한 단순 모델이다. 실제 보정은 분석 모드와 공유 지점, 클록 전이에 따라 결정된다. OpenSTA 구현도 경로를 거슬러 공유 지점을 찾고, 비통계적 계산에서는 양쪽의 early/late 차이 중 작은 값을 보정량으로 선택한다. OpenSTA Crpr.cc의 findCrpr와 findCrpr1

Hold에서도 사라지는 것은 모순된 선택이다

같은 회로에서 데이터 최소 지연을 0.2, hold 시간을 0.05로 놓자. Hold에는 launch 클록을 일찍, capture 클록을 늦게 잡는다. 독립 계산의 데이터 도착은 0.2 + 0.1 + 0.2 = 0.5, 요구 시간은 0.4 + 0.15 + 0.05 = 0.6이다. Hold slack은 도착에서 요구를 빼므로 −0.1이다.

공유 지연 c를 동일하게 적용하면 slack은 (c + 0.1 + 0.2) − (c + 0.15 + 0.05) = +0.1이다. 여기서도 0.2의 과도한 불리함이 제거된다. 그렇다고 모든 클록 오차를 없애도 된다는 뜻은 아니다. 분기 이후의 변동, 서로 다른 주기의 지터, 별도로 넣은 여유까지 이 계산의 c처럼 상쇄된다고 가정해서는 안 된다.

보고서의 개선과 실리콘의 개선을 구분하는 것도 필요하다. CPPR를 켠 뒤 slack이 양수가 되어도 버퍼가 빨라지거나 배선이 짧아진 것은 아니다. 이미 존재하던 회로의 분석이 더 일관된 가정을 사용한 것이다. 반대로 공통 구간이 긴 경로의 비관성이 줄면, 보정이 작은 다른 경로가 새로운 최악 경로로 드러날 수 있다.

타이밍을 읽을 때는 보정 전후 숫자와 함께 어느 핀까지 공통 경로로 인정했는지, rise/fall 전이를 어떻게 다루었는지 확인하면 좋다. OpenSTA도 같은 핀을 기준으로 하는 모드와 같은 전이까지 요구하는 모드를 구분한다. 동일한 보고서를 비교하려면 이 설정과 분석 조건을 맞춰야 한다. CRPR 모드 정의

CPPR가 답하는 질문은 “클록 트리를 얼마나 빠르게 만들었는가”가 아니라 “공유한 지연을 서로 모순되게 계산하지 않았는가”이다. 공통 구간에서 제거할 보수성과 분기 이후에 유지할 위험을 구분하면, 작은 음수 slack에 회로 수정을 시작하기 전에 그 숫자의 의미부터 정확히 판단할 수 있다.