[RTL] SDF 파일 완벽 해부

지난 글에서 Post-Simulation(GLS)이 실제 칩의 동작을 보장하기 위해 필수적이라는 사실을 배웠습니다. 그리고 그 중심에는 ‘지연 정보’를 담고 있는 SDF (Standard Delay Format) 파일이 있었습니다.

하지만 막상 SDF 파일을 열어보면 수많은 괄호와 알 수 없는 숫자들로 가득 차 있어 당황하기 쉽습니다.

이번 글에서는 RTL engineer라면 읽을 줄 알아야 하는 SDF 파일의 내부 구조를 해부하고, 반도체 검증의 핵심 개념인 Corner Case(SS, FF, TT)와 SDF의 Min:Typ:Max가 어떻게 연결되는지 실전적인 관점에서 분석해 보겠습니다.

RTL 설계에서 SDF 파일이란 무엇인가?

SDF는 IEEE 표준(IEEE 1497)으로 정의된 파일 포맷으로, 타이밍 분석 tool(PrimeTime 등)이나 P&R tool이 계산한 정확한 지연 시간(Timing Data)을 시뮬레이터(VCS, Xcelium 등)나 다른 tool에 전달하기 위해 사용됩니다. 보통 design house에서 전달해줍니다.

쉽게 말해, “이 게이트는 0.5ns 느리고, 저 배선은 0.2ns 느리다”라는 정보를 담고 있는 성적표와 같습니다.

SDF의 기본 구조 (Anatomy)

SDF 파일은 계층적(Hierarchy) 구조로 되어 있습니다. 크게 Header, Cell, Delay/Timing Check로 나뉩니다.

SDF file 예시
(DELAYFILE
  (SDFVERSION "3.0")
  (DESIGN "my_cpu_top")
  (DATE "Dec 05 2024")
  (VENDOR "Synopsys")
  (PROGRAM "PrimeTime")
  (VERSION "K-2015.06")
  (DIVIDER /)  // 계층 구분자
  (VOLTAGE 1.00:1.00:1.00)
  (PROCESS "1.00:1.00:1.00")
  (TEMPERATURE 25.00:25.00:25.00)
  (TIMESCALE 1ns)

  // 여기서부터 각 인스턴스에 대한 정보 시작
  (CELL
    (CELLTYPE "AND2X1")      // Standard Cell 이름
    (INSTANCE u_alu/u_adder/u_and1) // 실제 계층 경로
    
    // 1. 지연 정보 (DELAY)
    (DELAY
      (ABSOLUTE
        // IOPATH: 셀 내부 지연 (입력 A -> 출력 Y)
        (IOPATH A Y (0.050:0.060:0.080) (0.045:0.055:0.075))
        // PORT: 입력 포트 자체의 지연 (주로 배선 지연 포함 시 사용)
        // INTERCONNECT: 다른 셀 출력에서 이 셀 입력까지의 배선 지연
      )
    )

    // 2. 타이밍 체크 (TIMINGCHECK)
    (TIMINGCHECK
      // SETUP: CK의 상승 엣지 기준, D가 최소 0.04ns 전에 와야 함
      (SETUP D (posedge CK) (0.040:0.040:0.040))
      // HOLD: CK의 상승 엣지 이후, D가 최소 0.01ns 동안 유지되어야 함
      (HOLD D (posedge CK) (0.010:0.010:0.010))
    )
  )
)

여기서 가장 눈여겨봐야 할 것은 (IOPATH A Y ...) 뒤에 오는 숫자들입니다.

Min:Typ:Max의 비밀 (The Triplets)

SDF에서 지연 시간은 항상 Min : Typ : Max 형식의 세 가지 값(Triplet)으로 표현됩니다.

(0.050 : 0.060 : 0.080)
  Min     Typ     Max

이 숫자들은 Process Variation(공정 산포)과 Operating Condition(동작 조건)에 따라 달라지는 트랜지스터의 성능을 나타냅니다.

(1) Min (Minimum Delay) – 가장 빠른 조건

  • 상황: 공정이 매우 잘 됨(Fast Process), 전압이 높음(High Voltage), 온도가 낮음(Low Temp -> Inversion layer mobility 증가).
  • Corner: FF (Fast-Fast) Corner
  • 용도: 주로 Hold Violation을 체크할 때 사용됩니다. 신호가 너무 빨리 도착해서 데이터를 덮어쓰는 문제가 발생하는지 확인합니다.

(2) Max (Maximum Delay) – 가장 느린 조건

  • 상황: 공정이 잘 안됨(Slow Process), 전압이 낮음(Low Voltage), 온도가 높음(High Temp).
  • Corner: SS (Slow-Slow) Corner
  • 용도: 주로 Setup Violation을 체크할 때 사용됩니다. 신호가 제시간에 도착하지 못해 데이터를 놓치는 문제가 발생하는지 확인합니다.

(3) Typ (Typical Delay)

  • 상황: 일반적인 공정 조건 (TT Corner).
  • 용도: 대략적인 성능을 보거나, 소비 전력을 예측할 때 주로 사용됩니다. 하지만 검증의 핵심은 최악의 상황(Corner Case)을 막는 것이므로 Min/Max보다 중요도가 떨어질 때가 많습니다.

Corner Case와 시뮬레이션 전략

초보 설계자들은 “SDF 하나만 있으면 모든 타이밍이 다 들어있는 거 아니야?”라고 생각하지만, 실제로는 목적에 따라 다른 SDF 파일을 생성하거나, 시뮬레이터 옵션으로 원하는 지연 값을 선택해야 합니다.

(1) 어떤 SDF를 뽑아야 할까? (STA Tool 관점)

STA tool(PrimeTime 등)에서 SDF를 추출할 때, 특정 Corner(PVT 조건)를 지정합니다.

  • Worst-Case SDF: SS 공정, 0.9V, 125°C 조건에서 추출. (Max 값이 매우 큼)
  • Best-Case SDF: FF 공정, 1.1V, -40°C 조건에서 추출. (Min 값이 매우 작음)

(2) 시뮬레이터는 어떤 값을 읽을까? (Simulator 관점)

SDF 파일 안에 (0.05 : 0.06 : 0.08)이 적혀 있다고 해서 시뮬레이터가 알아서 상황에 맞춰 값을 쓰는 게 아닙니다. 실행 옵션(Runtime Argument)으로 지정해줘야 합니다.

  • +maxdelays: SDF의 세 번째 값(Max)을 사용. -> Setup Check용
  • +mindelays: SDF의 첫 번째 값(Min)을 사용. -> Hold Check용
  • +typdelays: SDF의 가운데 값(Typ)을 사용.

[실전 팁] Setup과 Hold는 동시에 잡을 수 없다?

이론적으로 하나의 시뮬레이션 런(Run)에서 Setup과 Hold를 동시에 완벽하게 검증하기는 어렵습니다.

  • Setup 검증: 신호가 늦게 도착하는 게 문제이므로 Max Delay (SS Corner) 조건에서 돌려야 합니다. 이때는 Hold 위반은 잘 안 일어납니다.
  • Hold 검증: 신호가 너무 빨리 변하는 게 문제이므로 Min Delay (FF Corner) 조건에서 돌려야 합니다.

따라서 테이프 아웃(Tape-out) 전에는 반드시 Max Delay SDF로 Setup 검증을 수행하고, 별도로 Min Delay SDF로 Hold 검증을 수행해야 완벽합니다. (보통 Hold는 P&R 단계에서 tool이 버퍼를 넣어 자동으로 잡지만, GLS로 Double Check 하는 것이 안전합니다.)

SDF Annotation 방법 ($sdf_annotate)

Verilog Testbench에서 SDF 파일을 로드하려면 $sdf_annotate 시스템 태스크를 사용합니다.

module tb_top;
  // ... (Testbench 코드) ...

  initial begin
    // SDF 파일 로드
    // 문법: $sdf_annotate("파일경로", 타겟모듈, 설정파일, 로그파일, "MIN/TYP/MAX", 스케일팩터, "FROM_MTM");
    
    `ifdef SDF_MAX
      $sdf_annotate("output/design_ss.sdf", u_dut, , "sdf.log", "MAXIMUM");
    `elsif SDF_MIN
      $sdf_annotate("output/design_ff.sdf", u_dut, , "sdf.log", "MINIMUM");
    `endif
  end
endmodule
  • 타겟 모듈: SDF가 적용될 최상위 모듈의 인스턴스 이름 (예: u_dut).
  • “MAXIMUM” / “MINIMUM”: 앞서 설명한 SDF Triplet 중 어느 위치의 값을 가져올지 강제할 수 있습니다. 보통은 비워두고 시뮬레이터 옵션(+maxdelays)으로 제어하는 방식을 선호합니다.

참고

SDF 기반 gate-level simulation(GLS)은 실제 delay 정보를 반영하여 RTL simulation에서 발견되지 않는 timing 문제를 찾는 데 유용하지만, 완전한 timing sign-off 수단은 아닙니다.

실제 제품 수준의 timing 검증은 STA(Static Timing Analysis) 가 주로 담당하며, GLS는 reset 동작, X-propagation, clock-gating, scan/DFT 동작, 일부 글리치, 비정상 초기화 등 특정 시나리오를 보조적으로 확인하는 용도로 사용됩니다.

또한 delay 값은 레이아웃 이후의 parasitic extraction 및 라이브러리 특성에 의해 결정되므로, SDF 자체는 단지 포맷일 뿐 delay 정확도는 추출 흐름의 품질에 의존합니다.

GLS는 벡터 기반이므로 모든 corner, 변동(PVT), CDC, 메타안정성, 글리치 조합을 100% 커버할 수 없기 때문에, CDC 분석, formal verification, STA multi-corner 분석 등 다른 sign-off 흐름과 반드시 병행해야 합니다.

이런 제약을 이해하고 활용하면 SDF 기반 GLS는 설계의 실제 동작을 더 깊게 검증하는 강력한 도구가 됩니다.

참고: chipverify

유사한 게시물