[RTL] RTL 시뮬레이션은 완벽하지 않다: Post-Sim(GLS)을 하는 이유

지난 글에서 반도체 공정의 불확실성(Process Variation)이 어떻게 트랜지스터의 속도를 바꾸고, RTL 설계에서 Setup/Hold Time 위반을 일으키는지 알아봤습니다.

그런데 여기서 한 가지 의문이 생깁니다. “분명 내가 짠 Verilog 코드는 시뮬레이션(Pre-Sim)에서 완벽하게 동작했는데, 왜 실제 칩이나 합성 후에는 문제가 생길까?”

그 이유는 우리가 평소에 돌리는 시뮬레이션이 이상적 환경이기 때문입니다. 이 글에서는 RTL engineer가 반드시 마주해야 할 현실, Post-Simulation (Gate-Level Simulation)에 대해 이야기해 보겠습니다.

이상적인 세계: RTL Simulation (Pre-Sim)

우리가 설계를 시작하고 가장 먼저 수행하는 Functional Simulation(기능 검증)은 Pre-Sim이라고 부릅니다.

  • Zero Delay: wire a와 wire b가 연결되어 있으면, a 신호가 바뀔 때 b 신호도 즉시(0ns) 바뀝니다. (물론 #1 같은 지연을 줄 수 있지만, 그건 검증을 위한 가짜 지연입니다.)
  • Ideal Clock: clock은 완벽한 사각형(Square Wave)이며, 모든 Flip-Flop에 동시에 도착합니다. (Skew = 0)
  • Wire: 배선 저항이나 커패시턴스는 존재하지 않습니다. 신호는 순간 이동합니다.

즉, Pre-Sim은 “논리(Logic)가 맞는지”를 검사하는 단계이지, “실제 회로가 동작할지”를 보장해주지는 않습니다.

현실의 세계: Netlist와 SDF

RTL 코드가 합성(Synthesis) 과정을 거치면, 추상적인 코드가 아닌 실제 파운드리에서 제공하는 표준 셀(Standard Cell)들이 연결된 Netlist가 됩니다. 그리고 P&R(Place & Route) 과정을 거치면 실제 배선 정보가 생깁니다.

이때부터는 ‘물리적 시간’이 개입합니다.

  1. Cell Delay: AND 게이트 하나를 통과하는 데 0.05ns가 걸림. (예시)
  2. Net Delay: 배선 길이가 길어서 신호가 도달하는 데 0.2ns가 걸림. (예시)

이 모든 지연 정보를 담고 있는 파일이 바로 SDF (Standard Delay Format)입니다.

Post-Sim (GLS)이란 무엇인가?

Post-Simulation, 혹은 GLS (Gate-Level Simulation)는 위에서 만든 NetlistSDF 파일을 덮어씌워서(Back-annotation) 돌리는 시뮬레이션입니다.

이제 시뮬레이터는 RTL 코드가 아니라, 실제 게이트와 배선의 지연 시간을 반영하여 동작합니다. 그러면 Pre-Sim에서는 보이지 않던 무시무시한 일들이 벌어집니다.

  • Unknown signal: 타이밍이 안 맞아서 데이터가 깨지면 X (Unknown) 상태가 되고, 이 X가 전체 회로로 전파됩니다.
  • Glich (글리치): 찰나의 순간에 원치 않는 pulse가 튀어 나옵니다.
  • Race Condition: 데이터가 clock보다 빨리 도착하거나 늦게 도착하는 현상이 waveform에 그대로 찍힙니다.
Post-sim. waveform

Post-Sim을 하는 이유

STA(Static Timing Analysis) 툴이 타이밍을 체크해주는데, 굳이 시간도 오래 걸리는 Post-Sim을 왜 해야 할까요? STA는 constraint가 정확하다는 가정 하에 진행되기 때문에, contraint의 오류나 CDC 문제는 STA가 발견할 수 없기 때문입니다.

(1) X-Propagation (초기화 문제)

RTL에서는 reg a = 0; 처럼 초기값을 줄 수 있지만, 실제 칩(Netlist)은 전원이 켜졌을 때 Flip-Flop이 0일지 1일지 모릅니다. Reset 로직이 잘못되어 초기화가 안 된 레지스터가 있다면, Post-Sim에서는 그 부분이 계속 X(Unknown)로 남아 동작 불능 상태가 됩니다.

(2) 비동기 회로 (CDC) 및 Multi-Cycle Path 검증

서로 다른 clock domain 간에 신호가 넘어갈 때(CDC), STA는 제약 조건(Constraints)을 통해 검사합니다. 만약 엔지니어가 set_false_path를 잘못 설정했다면 STA는 통과하지만 칩은 죽습니다. 실제 지연 시간을 반영한 GLS를 돌리면, 2-FF Synchronizer가 Metastability 상태를 어떻게 해소하는지, 혹은 해소하지 못하고 x(unknown)를 뱉어내는지 눈으로 확인할 수 있습니다.

(3) 전력 소모 예측 (Power Estimation)

정확한 전력 분석을 위해서는 Switching Activity(신호가 얼마나 자주 바뀌는지) 정보가 필요합니다. Zero-delay인 RTL 시뮬레이션 결과보다, 실제 글리치와 지연이 반영된 GLS 결과(VCD/FSDB 파일)를 이용해 Power Analysis를 돌려야 실제 칩의 발열과 전력 소모를 정확히 예측할 수 있습니다.

결론: Code에서 Silicon으로 넘어가는 다리

Pre-Sim이 “내가 의도한 대로 RTL 설계를 했는가?”를 확인하는 과정이라면, Post-Sim은 “공장에서 찍어 나와도 칩이 잘 돌아가는가?”를 확인하는 과정입니다.

물론 Post-Sim은 설정할 것도 많고, 시뮬레이션 속도도 매우 느리며, 디버깅하기도 어렵습니다. 하지만 이 과정을 거쳐야만 비로소 우리는 “설계가 끝났다”고 말할 수 있습니다.

다음 글에서는 이 Post-Sim의 핵심인 SDF 파일을 해부해 보고, 시뮬레이션에서 어떻게 Corner Case(Min/Max)를 설정하는지 실전적인 내용을 다뤄보겠습니다.

참고: chipverify

유사한 게시물