---
title: "분주 클록의 주기가 같아도 위상을 틀리면 타이밍이 달라진다"
author: "브레이브브라우저쓰자"
published_at: "2026-10-22T13:26:02.977Z"
updated_at: "2026-10-06T01:44:19.402Z"
tags: ["generated clock"]
canonical_url: "https://ariser.io/@writer_a9817d5a8de0/%EB%B6%84%EC%A3%BC-%ED%81%B4%EB%A1%9D%EC%9D%98-%EC%A3%BC%EA%B8%B0%EA%B0%80-%EA%B0%99%EC%95%84%EB%8F%84-%EC%9C%84%EC%83%81%EC%9D%84-%ED%8B%80%EB%A6%AC%EB%A9%B4-%ED%83%80%EC%9D%B4%EB%B0%8D%EC%9D%B4-%EB%8B%AC%EB%9D%BC%EC%A7%84%EB%8B%A4"
ai_assisted: true
---

# 분주 클록의 주기가 같아도 위상을 틀리면 타이밍이 달라진다

이 글은 AI가 활용됐습니다.

[원문](https://ariser.io/@writer_a9817d5a8de0/%EB%B6%84%EC%A3%BC-%ED%81%B4%EB%A1%9D%EC%9D%98-%EC%A3%BC%EA%B8%B0%EA%B0%80-%EA%B0%99%EC%95%84%EB%8F%84-%EC%9C%84%EC%83%81%EC%9D%84-%ED%8B%80%EB%A6%AC%EB%A9%B4-%ED%83%80%EC%9D%B4%EB%B0%8D%EC%9D%B4-%EB%8B%AC%EB%9D%BC%EC%A7%84%EB%8B%A4)

분주된 클록의 주기가 20ns라는 사실만 알면 충분할까? 출발 클록이 10ns라면 두 클록 사이의 경로에 언제나 20ns가 주어지는 것은 아니다. generated clock에는 새 주기뿐 아니라 원래 클록의 어느 에지에서 만들어졌는지도 담긴다. **같은 주기를 잘못된 위상으로 선언하면 경로에 존재하지 않는 시간을 줄 수 있다.**

## 주기보다 먼저 에지의 출처를 적기

원 클록의 상승 에지는 0·10·20·30ns, 하강 에지는 5·15·25·35ns라고 하자. 그 하강 에지에서 동작하는 가상 분주 회로가 있고, 정상 운용에서 출력 클록의 상승은 5·25·45ns, 하강은 15·35·55ns라고 정해져 있다고 가정한다. 출력 주기는 20ns지만 첫 상승 에지는 원 클록의 첫 하강 에지인 5ns에 대응한다.

OpenSTA는 `create_generated_clock`에 원 클록의 소스 핀과 분주·배주 또는 에지 목록을 지정한다. 에지 목록은 원 파형의 상승과 하강을 모두 세며, 첫 에지가 1번이다. 이 예의 2·4·6번 에지는 5·15·25ns이므로 새 클록의 상승·하강·다음 상승을 나타낸다. [파생 클록의 에지 정의](https://opensta.readthedocs.io/en/latest/Commands/#create_generated_clock)

시간 단위가 ns인 환경의 가상 이름을 사용하면 다음처럼 표현할 수 있다.

```tcl
create_clock -name base -period 10 -waveform {0 5} [get_ports clk]
create_generated_clock -name slow -source [get_ports clk] \
    -edges {2 4 6} [get_pins u_div/Q]
```

source는 원 클록이 존재하는 포트이고, 마지막 객체는 실제 생성된 파형이 나타나는 분주 출력 핀이다. 단순히 느린 클록을 받는 임의의 레지스터 핀을 지정하는 대신, 회로의 생성 위치와 맞춰야 한다. 원 소스에 여러 클록이 있다면 어떤 원 클록을 기준으로 하는지도 지정해야 한다.

주파수가 절반으로 줄어든 일반적인 관계에는 `-divide_by 2`가 편리하다. 그러나 이 예처럼 하강 에지에서 시작하는 위상까지 표현하려면 실제 파형에 맞는 정의가 필요하다. 클록 이름에 slow가 들어간다고 그 관계가 자동으로 전달되지는 않는다.

## 주기 20ns를 다시 선언하면 생기는 착시

같은 출력 핀에 파생 관계 대신 주기 20ns의 새 기본 클록을 만들고, 기본 파형인 상승 0ns·하강 10ns를 사용했다고 하자. 모델 속 상승 에지는 0·20·40ns다. 실제 가정한 5·25·45ns와 다르다.

원 클록에서 출발하고 분주 클록에서 받는 경로를 보자. 정확한 파형에서는 목적 상승 5ns 직전에 원 클록의 상승 0ns가 있다. 다음 목적 상승 25ns 직전에는 원 클록의 상승 20ns가 있다. 가장 가까운 setup 관계의 에지 간격은 5ns다. 목적 setup이 0.5ns라면 데이터가 쓸 수 있는 시간은 4.5ns다.

잘못 선언한 목적 상승 20ns 앞에는 원 클록의 상승 10ns가 있어 에지 간격은 10ns다. 같은 setup을 빼면 9.5ns를 허용하는 모델이 된다. clk-to-Q를 포함한 최대 데이터 지연이 7ns인 가상 경로는 정확한 모델에서 −2.5ns, 잘못된 모델에서 +2.5ns의 slack을 갖는다. 이것은 이상적 에지의 직접 계산이며 실제 STA 실행 결과가 아니다.

같은 시각의 상승 에지 쌍은 별도의 hold 관계도 만든다. 따라서 setup의 에지 간격만 맞춘 뒤 끝낼 수는 없다. 목적에서 원 클록 방향으로 되돌아가는 데이터도 있다면 그 방향의 에지 쌍 역시 확인해야 한다. 느린 목적 주기 하나로 모든 교차 경로의 시간을 대표할 수 없는 이유다.

## 초기 위상과 실제 클록 지연은 별개의 조건

위 계산은 분주기의 초기 위상이 정상 운용에서 정해져 있다는 전제에 따른다. 리셋 상태, 리셋 해제 시점이나 분주 시작 절차에 따라 첫 상승이 달라질 수 있다면 한 에지 목록으로 모든 운용을 설명했다고 주장할 수 없다. 가능한 위상을 제한하는 절차나 각 위상에 대한 분석이 필요하다.

generated clock의 논리적 에지 관계를 적었다고 분주 셀과 클록 배선의 지연이 0이 되는 것도 아니다. OpenSTA의 전파 클록 모델은 계산되거나 주석으로 제공된 게이트·배선 지연을 사용한다. 이상적 파형의 관계와 실제 클록이 각 레지스터에 도착하는 시간을 함께 고려해야 한다. [전파 클록의 분석 의미](https://github.com/The-OpenROAD-Project/OpenSTA/blob/master/sdc/Sdc.tcl)

파형만 정확하게 다시 선언한 독립 클록이 간단한 경로에서 같은 수치 관계를 줄 수도 있다. 그러나 원 클록과의 생성 관계를 직접 보존하는 정의가 소스 변경, 여러 클록 선택과 지연 추적의 의도를 더 명확히 표현한다. 파생 관계가 있는 클록을 비동기로 묶어 검사를 제외하면 이 정보도 사용할 수 없다.

분주 클록의 제약을 검토할 때는 period 옆에 상승·하강 에지의 출처를 적어 보자. 20ns 주기 안에 5ns만 쓸 수 있는 경로가 있다는 사실이 곧 드러난다. **generated clock의 핵심은 느린 파형의 이름을 만드는 데서 끝나지 않고, 원 클록과의 실제 시간 관계를 전달하는 데 있다.**

