⏱️ Multi-Cycle Path 완벽 가이드

Multi-Cycle Path 완벽 가이드: SoC 설계자를 위한 MCP 마스터하기

⏱️ Multi-Cycle Path 완벽 가이드

SoC 설계자를 위한 MCP 개념부터 실전 적용까지 — 타이밍의 예술을 마스터하자

Synthesis나 STA(Static Timing Analysis)를 하다 보면 SDC 파일에서 set_multicycle_path라는 명령어를 자주 마주치게 됩니다. MCP 값이 2, 3, 4로 다르게 설정되는 이유는 무엇일까요? 이 글에서는 Multi-Cycle Path의 개념부터 실전 적용, 그리고 베테랑 엔지니어들의 노하우까지 모두 다룹니다.

🎓 1. 기본 개념: STA와 Single-Cycle Path

Multi-Cycle Path를 이해하려면 먼저 동기식(Synchronous) 설계의 기본 전제를 알아야 합니다.

동기식 설계의 기본 원칙

디지털 회로에서 모든 데이터는 클럭의 Rising Edge에 출발(Launch)하여, 다음 클럭의 Rising Edge에 도착(Capture)해야 합니다. 이것이 Single-Cycle Path입니다.

📊 Single-Cycle Path 타이밍 다이어그램 CLK ──┐ ┌──┐ ┌──┐ ┌──┐ ┌── │ │ │ │ │ │ │ │ └──┘ └──┘ └──┘ └──┘ T=0 T=1 T=2 T=3 DATA ──────XXXXXX──────────────── Launch Capture → 데이터는 T=0에서 출발, T=1에서 캡처 (1 사이클)

Setup Time과 Hold Time

용어 정의 의미
Setup Time 클럭 에지 전에 데이터가 안정되어야 하는 시간 데이터가 너무 늦게 도착하면 안 됨
Hold Time 클럭 에지 후에 데이터가 유지되어야 하는 시간 데이터가 너무 빨리 바뀌면 안 됨
Clock Period 클럭 한 주기의 시간 1GHz = 1ns 주기
💡 STA의 기본 가정

합성 툴(Design Compiler 등)은 별도 지정이 없으면 모든 경로가 1 사이클 내에 완료된다고 가정합니다. 즉, T_launch + T_logic < T_period를 만족시키려고 최적화를 수행합니다.

🔄 2. Multi-Cycle Path란?

Multi-Cycle Path(MCP)는 데이터가 출발(Launch)한 후 도착(Capture)하기까지 한 사이클 이상의 시간을 허용하는 경로입니다.

📌 핵심 정의

설계자가 툴에게 "이 경로는 급하지 않으니, N 사이클 뒤에 데이터를 캡처해도 괜찮아"라고 알려주는 타이밍 예외(Exception) 설정입니다.

📊 Multi-Cycle Path (MCP=2) 타이밍 다이어그램 CLK ──┐ ┌──┐ ┌──┐ ┌──┐ ┌── │ │ │ │ │ │ │ │ └──┘ └──┘ └──┘ └──┘ T=0 T=1 T=2 T=3 DATA ──────XXXXXXXXXXXXXXX─────── Launch Capture (T=0) (T=2) → 데이터는 T=0에서 출발, T=2에서 캡처 (2 사이클 허용)

MCP 값이 다른 이유 (Cortex-A55 예시)

Arm Cortex-A55 같은 복잡한 IP에서 MCP 값이 2, 3, 4로 다르게 설정되는 이유:

MCP 값 적용 대상 이유
MCP 2 복잡한 연산 로직 (FPU 등) 물리적으로 1사이클 내 계산이 어려운 산술 연산
MCP 3 Configuration 레지스터 성능에 직접 영향 없는 설정 신호, 여유 있게 전달
MCP 4 Debug 관련 신호 먼 거리 이동, 성능 비관련 경로에 넉넉한 시간 부여

🎯 3. MCP를 사용하는 이유

왜 이런 귀찮은 설정을 해야 할까요? MCP를 적절히 사용하면 얻을 수 있는 이점이 큽니다.

❌ MCP 미사용 시

• Over-constraint 발생
• 불필요한 최적화로 면적 증가
• 큰 셀(Low Vt) 사용 → 전력 증가
• 버퍼 과다 삽입
• 해결 불가능한 타이밍 위반

✅ MCP 적용 시

• 정확한 타이밍 제약
• 작은 셀(High Vt) 사용 가능
• 면적 절약 (최대 30%)
• 전력 감소 (Dynamic + Leakage)
• 빠른 Timing Closure

💰 실제 효과

항목 효과 설명
Area (면적) 🔻 감소 느린 셀 사용 가능, 버퍼 수 감소
Dynamic Power 🔻 감소 스위칭하는 게이트 수 감소
Leakage Power 🔻 감소 High Vt 셀(누설전류 적음) 사용 가능
Timing Closure ⚡ 개선 False Violation 제거, 진짜 문제에 집중
💡 모바일 SoC에서의 중요성

Cortex-A55 같은 모바일 CPU에서 전력 효율은 생명과 같습니다. MCP를 적절히 활용하면 배터리 수명을 크게 연장할 수 있습니다.

📝 4. SDC 문법과 사용법

SDC(Synopsys Design Constraints)에서 set_multicycle_path 명령어로 MCP를 설정합니다.

기본 문법

📄 SDC 기본 문법
set_multicycle_path <cycles> [-setup] [-hold] \ -from <start_point> \ -to <end_point>
옵션 설명
<cycles> 허용되는 클럭 사이클 수
-setup Setup time 검사에 적용
-hold Hold time 검사에 적용
-from 경로 시작점 (레지스터 출력, 핀 등)
-to 경로 끝점 (레지스터 입력, 핀 등)
-start Launch 클럭 기준으로 사이클 계산
-end Capture 클럭 기준으로 사이클 계산 (기본값)

기본 사용 예제

📄 SDC 예제: 2-Cycle Path
# reg_a에서 reg_b로 가는 경로에 2사이클 허용 set_multicycle_path 2 -setup \ -from [get_pins reg_a/Q] \ -to [get_pins reg_b/D]
📄 SDC 예제: 특정 클럭 도메인 전체
# slow_clk 도메인 내 모든 경로에 3사이클 허용 set_multicycle_path 3 -setup \ -from [get_clocks slow_clk] \ -to [get_clocks slow_clk]
📄 SDC 예제: 특정 모듈 내부
# FPU 모듈 내부 경로에 4사이클 허용 set_multicycle_path 4 -setup \ -from [get_cells u_fpu/*] \ -to [get_cells u_fpu/*]

⚖️ 5. Setup과 Hold의 관계

이 부분이 MCP에서 가장 중요하고 실수가 많은 영역입니다.

🚨 핵심 경고: Setup만 설정하면 안 됩니다!

Setup을 2로 설정하면, Hold Check Edge도 같이 뒤로 밀립니다. 이로 인해 심각한 Hold Violation이 발생할 수 있습니다.

문제 상황 이해

📊 Setup만 설정했을 때의 문제 # Default (MCP 없음) Setup Check: T=1 (Capture Edge) Hold Check: T=0 (Launch Edge) # MCP 2 -setup만 설정 Setup Check: T=2 (Capture Edge가 뒤로 이동) ✅ Hold Check: T=1 (자동으로 같이 밀림!) ❌ 문제! → Hold Check가 0ns에서 1ns로 이동 → 데이터가 1ns 동안 유지되어야 함 → 불필요한 딜레이 버퍼 삽입 필요

올바른 설정 방법

📄 SDC: Setup과 Hold 세트로 설정
# ✅ 올바른 설정: Setup과 Hold를 세트로! # Step 1: Setup에 2사이클 허용 # Capture Edge: T=1 → T=2로 이동 set_multicycle_path 2 -setup \ -from [get_pins reg_a/Q] \ -to [get_pins reg_b/D] # Step 2: Hold Check를 원래 위치로 복원 # Hold Edge: Setup보다 1사이클 앞으로 (T=2 → T=1) # 결과적으로 Hold Check는 T=0 기준으로 유지됨 set_multicycle_path 1 -hold \ -from [get_pins reg_a/Q] \ -to [get_pins reg_b/D]

MCP 값에 따른 Hold 설정 공식

📐 공식: Hold = Setup - 1

Setup 2 → Hold 1
Setup 3 → Hold 2
Setup 4 → Hold 3

이 공식을 적용하면 Hold Check Edge가 원래 위치(Launch Edge)에 유지됩니다.

📊 올바른 MCP 2 설정 후 타이밍 CLK ──┐ ┌──┐ ┌──┐ ┌──┐ ┌── │ │ │ │ │ │ │ │ └──┘ └──┘ └──┘ └──┘ T=0 T=1 T=2 DATA ──────XXXXXXXXXXXXXXX────── Launch Capture & Hold (Setup) Check Setup Check: T=2 (2사이클 허용) Hold Check: T=0 (원래 위치 유지) ✅

🔧 6. 실전 예제: 메모리 2분주

가장 흔한 MCP 사용 사례인 "메모리 클럭 2분주" 상황을 살펴보겠습니다.

상황 설명

📋 시스템 구성

System Clock: 1GHz (1ns 주기)
Memory Controller: 1GHz로 동작
Target Memory: Enable 신호로 2번에 1번만 동작 (유효 500MHz)

동작 원리

메모리가 매 클럭마다 데이터를 캡처하는 것이 아니라, Enable 신호가 활성화된 클럭에서만 데이터를 가져갑니다.

❌ MCP 없이 합성

• 툴은 2분주를 모름
• 1ns 내 도달하려고 과도한 최적화
• 큰 버퍼, 빠른 셀 사용
• 면적/전력 낭비

✅ MCP 2 적용

• 2ns 여유 시간 확보
• 작은 셀, 적은 버퍼 사용
• 면적/전력 최적화
• 정확한 타이밍 분석

SDC 설정 코드

📄 SDC: 메모리 인터페이스 MCP 설정
# 메모리 인터페이스 MCP 설정 # Memory Write Path: Controller → Memory # Setup: 2사이클 허용 (2ns 시간 확보) set_multicycle_path 2 -setup \ -from [get_cells u_mem_ctrl/wdata_reg*] \ -to [get_cells u_memory/din_reg*] # Hold: 원래 위치로 복원 set_multicycle_path 1 -hold \ -from [get_cells u_mem_ctrl/wdata_reg*] \ -to [get_cells u_memory/din_reg*] # Memory Read Path: Memory → Controller set_multicycle_path 2 -setup \ -from [get_cells u_memory/dout_reg*] \ -to [get_cells u_mem_ctrl/rdata_reg*] set_multicycle_path 1 -hold \ -from [get_cells u_memory/dout_reg*] \ -to [get_cells u_mem_ctrl/rdata_reg*]

📚 7. 일반적인 MCP 시나리오

실무에서 자주 만나는 MCP 적용 시나리오들입니다.

시나리오 MCP 값 설명
분주 클럭 인터페이스 2, 4, 8 클럭 분주 비율에 맞춤
복잡한 연산 (FPU) 2~4 파이프라인 없이 다중 사이클 연산
Configuration 레지스터 3~4 부팅/설정 시에만 사용, 성능 무관
Debug/JTAG 신호 4~8 저속 디버그 인터페이스
Cross-hierarchy 긴 경로 2~3 물리적으로 먼 거리
Low-power 모드 신호 4+ 전력 관리, 느린 전환 허용

Cortex-A55 실제 SDC 예시

📄 SDC: Cortex-A55 스타일 MCP 설정
# ============================================== # Cortex-A55 Multi-Cycle Path Examples # ============================================== # 1. FPU Complex Operations (MCP 2) set_multicycle_path 2 -setup \ -from [get_cells *u_fpu/u_fmac/*] \ -to [get_cells *u_fpu/u_fmac/*] set_multicycle_path 1 -hold \ -from [get_cells *u_fpu/u_fmac/*] \ -to [get_cells *u_fpu/u_fmac/*] # 2. Configuration Registers (MCP 3) set_multicycle_path 3 -setup \ -from [get_cells *u_config/*] \ -to [get_cells *u_core/*] set_multicycle_path 2 -hold \ -from [get_cells *u_config/*] \ -to [get_cells *u_core/*] # 3. Debug Interface (MCP 4) set_multicycle_path 4 -setup \ -from [get_cells *u_debug/*] \ -to [get_cells *u_debug/*] set_multicycle_path 3 -hold \ -from [get_cells *u_debug/*] \ -to [get_cells *u_debug/*]

🔀 8. False Path와의 차이

MCP와 자주 혼동되는 set_false_path와의 차이를 명확히 알아야 합니다.

구분 Multi-Cycle Path False Path
정의 N 사이클 후에 데이터 도착 타이밍 검사 자체를 하지 않음
데이터 전달 ✅ 실제로 전달됨 ❌ 전달되지 않거나 무관
타이밍 검사 N 사이클 기준으로 검사 완전히 제외
사용 예 분주 클럭, 복잡한 연산 비동기 리셋, CDC, 테스트 모드
📄 SDC: False Path 예제
# False Path: 타이밍 검사 완전 제외 # 1. 비동기 리셋 (Async Reset) set_false_path -from [get_ports rst_n] # 2. 클럭 도메인 크로싱 (CDC) - 별도 동기화 로직 존재 set_false_path \ -from [get_clocks clk_a] \ -to [get_clocks clk_b] # 3. 테스트 모드 신호 set_false_path -from [get_ports scan_enable] # 4. 정적 설정 (부팅 후 변경 없음) set_false_path -from [get_cells *strap_reg*]
⚠️ 주의: False Path 남용 금지

False Path를 잘못 설정하면 실제 타이밍 문제를 놓칠 수 있습니다. 정말로 타이밍 검사가 필요 없는 경로에만 사용하세요. 의심스러우면 MCP를 사용하는 것이 안전합니다.

❌ 9. 자주 하는 실수와 해결

실수 1: Hold 설정 누락

❌ 잘못된 설정
# Setup만 설정 - Hold Violation 발생! set_multicycle_path 2 -setup \ -from [get_pins A] -to [get_pins B]
✅ 올바른 설정
# Setup과 Hold 모두 설정 set_multicycle_path 2 -setup \ -from [get_pins A] -to [get_pins B] set_multicycle_path 1 -hold \ -from [get_pins A] -to [get_pins B]

실수 2: 경로 지정 오류

❌ 잘못된 설정
# 존재하지 않는 핀 이름 set_multicycle_path 2 -setup \ -from [get_pins reg_a/q] # 소문자 q - 오류!
✅ 올바른 설정
# 정확한 핀 이름 사용 (대소문자 주의) set_multicycle_path 2 -setup \ -from [get_pins reg_a/Q] # 대문자 Q # 또는 와일드카드로 안전하게 set_multicycle_path 2 -setup \ -from [get_cells reg_a]

실수 3: 양방향 경로 누락

❌ 잘못된 설정
# A→B만 설정, B→A는 누락 set_multicycle_path 2 -setup \ -from [get_cells module_a/*] \ -to [get_cells module_b/*]
✅ 올바른 설정
# 양방향 모두 설정 # A → B set_multicycle_path 2 -setup \ -from [get_cells module_a/*] \ -to [get_cells module_b/*] set_multicycle_path 1 -hold \ -from [get_cells module_a/*] \ -to [get_cells module_b/*] # B → A set_multicycle_path 2 -setup \ -from [get_cells module_b/*] \ -to [get_cells module_a/*] set_multicycle_path 1 -hold \ -from [get_cells module_b/*] \ -to [get_cells module_a/*]

디버깅 방법

📄 TCL: MCP 적용 확인 명령어
# PrimeTime에서 MCP 적용 확인 # 1. 특정 경로의 MCP 설정 확인 report_timing -from reg_a/Q -to reg_b/D # 2. 모든 MCP 설정 리스트 report_timing_requirements -multicycle # 3. 특정 경로의 상세 타이밍 report_timing -path_type full \ -from [get_pins reg_a/Q] \ -to [get_pins reg_b/D] # 4. Hold Violation 확인 report_timing -delay_type min -max_paths 10

💡 10. 베테랑의 실전 팁

✅ 베테랑 엔지니어의 조언

1. Setup N이면 Hold N-1은 세트 메뉴
이 공식을 절대 잊지 마세요. 99%의 Hold Violation은 이것을 빠뜨려서 발생합니다.

2. RTL 설계 의도를 이해하라
MCP는 RTL 설계자가 의도한 타이밍을 반영하는 것입니다. SDC를 작성하기 전에 설계 스펙을 반드시 확인하세요.

3. Arm IP는 Integration Manual을 참조
Cortex-A55 같은 Arm IP는 Integration Manual에 SDC 가이드가 명시되어 있습니다. 이를 따르세요.

4. 과도한 MCP는 금물
필요 이상으로 큰 MCP 값은 실제 타이밍 마진을 왜곡합니다. 정확한 값을 사용하세요.

5. 검증은 시뮬레이션으로
MCP 설정 후에는 반드시 Gate-Level Simulation으로 기능을 검증하세요.

📚 참고 자료

자료 내용
Synopsys PrimeTime User Guide set_multicycle_path 상세 문법과 파형
Arm Cortex Integration Manual IP별 SDC 설정 가이드
J. Bhasker, "STA for Nanometer Designs" STA 이론서 (필독)
IEEE 1801 (UPF) 저전력 설계와 MCP 연계

📌 핵심 요약

1️⃣ MCP란? 데이터가 N 사이클에 걸쳐 도착해도 되는 타이밍 예외 설정

2️⃣ 사용 이유: 면적/전력 절감, 정확한 타이밍 분석, Timing Closure 개선

3️⃣ 핵심 공식: Setup N → Hold N-1 (반드시 쌍으로!)

4️⃣ vs False Path: MCP는 느린 전달, False Path는 전달 없음/무관

5️⃣ 실전 팁: RTL 의도 이해, Integration Manual 참조, 시뮬레이션 검증

🚀 다음 단계

MCP를 마스터했다면, 다음으로 Clock Domain Crossing (CDC)Clock Gating을 학습하세요. 이들과 MCP의 조합이 실제 SoC 설계의 핵심입니다.

댓글

이 블로그의 인기 게시물

📚 SDC 마스터 클래스 시리즈 | Chapter 1

📚 SDC 마스터 클래스 시리즈 | Chapter 2

📚 SDC 마스터 클래스 시리즈 | Chapter 3