⏱️ SDC 클럭 제약조건(create_clock, create_generated_clock) - 기초편
⏱️ SDC 클럭 제약조건 완벽 가이드
create_clock과 create_generated_clock 마스터하기
디지털 설계에서 정확한 타이밍은 성공의 핵심입니다. SDC(Synopsys Design Constraints)는 합성 및 STA 툴에 타이밍 정보를 전달하는 표준 언어입니다. 이 가이드에서는 클럭 정의의 핵심인 create_clock과 create_generated_clock을 상세히 다룹니다.
📚 1. SDC 개요
SDC (Synopsys Design Constraints)는 타이밍 제약조건을 기술하는 업계 표준 포맷입니다. Tcl 문법을 기반으로 합니다.
• 클럭 정의: 클럭 주파수, 파형, 지터 등 명시
• 입출력 타이밍: I/O delay, transition time 설정
• 경로 예외: False path, multicycle path 지정
• 환경 설정: 동작 조건, 부하 모델링
SDC 파일 기본 구조
⏰ 2. create_clock
create_clock은 설계의 기본 클럭(Master Clock)을 정의하는 명령어입니다.
주요 파라미터
-period 10 → 100MHz
-period 5 → 200MHz
기본값: {0 period/2} (50% duty)
-waveform {0 3}
Virtual clock 정의 시 필수
-name sys_clk
MUX 출력 등에서 사용
여러 클럭 공존 시 필요
예제
📊 3. Waveform 이해
-waveform 옵션은 클럭의 정확한 엣지 타이밍을 정의합니다.
Duty Cycle 계산:
duty = (fall - rise) / period × 100%
예시: -period 10 -waveform {2 7}
→ 상승: 2ns, 하강: 7ns
→ High 구간: 5ns, duty = 50%
→ 위상 시프트: 2ns 지연된 클럭
🌐 4. Virtual Clock
Virtual Clock은 설계 내부에 물리적으로 존재하지 않지만, 외부 인터페이스 타이밍을 위해 정의하는 가상 클럭입니다.
• 외부 소스 동기 클럭: 칩 외부에서 생성되는 클럭 기준
• 시스템 레벨 타이밍: 보드 레벨 인터페이스 제약
• I/O 분리: 내부 클럭과 다른 타이밍 요구사항
🔄 5. create_generated_clock
create_generated_clock은 Master Clock에서 파생된 클럭을 정의합니다. PLL, 분주기, MUX 출력 등에 사용됩니다.
주요 파라미터
| 파라미터 | 설명 | 예시 |
|---|---|---|
| -source | 마스터 클럭이 인가되는 핀 | [get_pins pll/CLK_IN] |
| -master_clock | 소스에 여러 클럭 시 마스터 지정 | -master_clock CLK_A |
| -divide_by | 분주 비율 (주파수 ÷ N) | -divide_by 2 → 절반 속도 |
| -multiply_by | 체배 비율 (주파수 × N) | -multiply_by 3 → 3배 속도 |
| -duty_cycle | Duty cycle 백분율 | -duty_cycle 25 → 25% |
| -edges | 마스터 엣지 매핑 | -edges {1 3 5} |
🔢 6. 분주/체배 클럭
분주 클럭 (-divide_by)
체배 클럭 (-multiply_by)
🔲 7. -edges 옵션
-edges는 마스터 클럭의 특정 엣지를 생성 클럭의 엣지에 직접 매핑합니다.
마스터 클럭의 엣지는 순차적으로 번호가 매겨집니다:
1 = 첫 번째 상승엣지 (0ns)
2 = 첫 번째 하강엣지 (period/2)
3 = 두 번째 상승엣지 (period)
4 = 두 번째 하강엣지 ...
-edges {a b c}
a = 생성 클럭 상승, b = 생성 클럭 하강, c = 다음 상승
-edges는 -divide_by, -multiply_by와 동시 사용 불가합니다.
엣지 번호는 반드시 오름차순이어야 합니다.
🔧 8. 관련 명령어
클럭 정의 후 추가적인 타이밍 속성을 설정하는 명령어들입니다.
| 명령어 | 용도 |
|---|---|
| set_clock_uncertainty | 지터, PVT 변동, 스큐 마진 설정 |
| set_clock_latency | 클럭 네트워크 지연 설정 |
| set_clock_transition | 클럭 엣지 슬루율 설정 |
| set_clock_groups | 클럭 간 관계 정의 (동기/비동기) |
🔀 9. Clock Domain Crossing (CDC)
서로 다른 클럭 도메인 간의 데이터 전송에는 특별한 처리가 필요합니다.
동기 클럭: 동일 소스에서 파생, 위상 관계 예측 가능
비동기 클럭: 독립 소스, 위상 관계 불확정
비동기 CDC 경로는 STA에서 false path로 설정해야 합니다.
✅ 동기 클럭
• 같은 PLL/소스에서 파생
• 위상 관계 고정
• STA 분석 가능
• set_clock_groups -logically_exclusive
⚠️ 비동기 클럭
• 독립 클럭 소스
• 위상 관계 불확정
• Synchronizer 필요
• set_clock_groups -asynchronous
💡 10. 실전 팁
1. 모든 클럭에 명시적 -name 부여
2. Generated clock은 항상 올바른 -source 지정
3. PLL 출력은 각각 별도의 generated clock 정의
4. 비동기 클럭은 명시적으로 set_clock_groups 설정
5. report_clocks로 정의된 클럭 확인
1. -source에 마스터 클럭 핀 대신 출력 핀 지정
2. MUX 출력에 -add 누락
3. -edges와 -divide_by 동시 사용
4. 비동기 CDC 경로에 false path 미설정
5. Virtual clock으로 internal path 분석
디버깅 명령어
툴별 차이점
| 툴 | 특이사항 |
|---|---|
| Synopsys DC | SDC 표준 원조, 완벽 지원 |
| Cadence Genus/Innovus | SDC 호환, 일부 확장 명령 존재 |
| Xilinx Vivado | XDC 포맷 (SDC 기반), -of_objects 확장 |
| Intel Quartus | SDC 호환, TimeQuest Analyzer |
📌 핵심 요약
| 명령어 | 용도 | 핵심 옵션 |
|---|---|---|
| create_clock | Master Clock 정의 | -period, -waveform |
| create_generated_clock | 파생 Clock 정의 | -source, -divide_by, -edges |
| set_clock_uncertainty | 지터/스큐 마진 | -setup, -hold |
| set_clock_groups | 클럭 관계 설정 | -asynchronous |
기억하세요:
✓ create_clock은 물리적/가상 기본 클럭 정의
✓ create_generated_clock은 PLL/분주기 출력 정의
✓ 비동기 CDC는 반드시 set_clock_groups 또는 set_false_path 설정
• IEEE 1801: SDC 표준 문서
• Synopsys: Design Compiler User Guide
• AMD/Xilinx: Vivado Design Suite User Guide (UG903)
• Intel: Quartus Prime Timing Analyzer
댓글
댓글 쓰기