𝗦𝗧𝗔 │ set_output_delay -min은 왜 음수일까?
Negative `set_output_delay -min` encodes external receiver hold requirement

FPGA에서 외부 칩으로 내보내는 데이터의 hold violation을 잡다가 XDC에서 set_output_delay -min -0.7을 보면 멈칫하게 됩니다. “출력 지연이 음수라니, 데이터가 시간을 거슬러 가나?” 실제로 표현하는 것은 외부 칩의 hold 요구를 FPGA 출력 포트까지 거꾸로 환산한 값입니다.
10 ns 주기의 같은 clock edge를 공유하는 출력 인터페이스를 가정해 보겠습니다. FPGA는 edge 0에서 새 데이터를 launch하고, 외부 칩은 그 edge 이후 1.0 ns 동안 이전 데이터를 유지해야 합니다. FPGA 핀에서 외부 칩 입력까지 data trace의 최소 지연은 0.3 ns, 두 칩으로 가는 clock의 보드 지연 차이는 0이라고 가정합니다.
그러면 FPGA 출력 핀의 새 데이터는 edge 0으로부터 적어도 0.7 ns 뒤에 바뀌어야 합니다. 핀에서 0.7 ns, 보드에서 0.3 ns를 더해야 외부 칩 입력의 1.0 ns hold 요구에 도달하기 때문입니다. 이 조건을 XDC에서는 set_output_delay -min -0.7 -clock SYS_CLK [get_ports DOUT]으로 모델링합니다. 여기서 -0.7 ns는 물리적인 음수 전파 지연이 아닙니다.
같은 경로의 setup도 보겠습니다. 외부 칩의 setup time이 0.8 ns, data trace의 최대 지연이 0.9 ns라면 다음 capture edge인 10 ns 전에 1.7 ns의 시간이 필요합니다. FPGA 출력 핀의 데이터는 늦어도 8.3 ns에 도착해야 하므로 set_output_delay -max 1.7 -clock SYS_CLK [get_ports DOUT]이 됩니다. 즉 이 예시의 핀 기준 데이터 창은 0.7~8.3 ns입니다.
설계 검토 때는 -min의 부호만 외우지 말고 외부 칩의 setup/hold 수치, data/clock 배선의 min/max, 실제 기준 clock과 edge를 먼저 확인하세요. 위 숫자는 clock 보드 skew와 불확실성을 0으로 둔 설명용 사례입니다. 실제 XDC에는 각 지연의 worst case를 반영하고, 구현 후 output path의 setup과 hold timing report를 둘 다 확인해야 합니다. 한쪽 제약만 빠지면 그쪽 검사가 완전하지 않습니다.
근거: AMD Vivado UG949 (2026.1), Defining Output Delays; UG903 (2026.1), Output Delay / Use of set_output_delay Command Options; UG906 (2026.1), Check Timing Section.
https://docs.amd.com/r/en-US/ug949-vivado-design-methodology/Defining-Output-Delays
https://docs.amd.com/r/en-US/ug903-vivado-using-constraints/Output-Delay
https://docs.amd.com/r/en-US/ug903-vivado-using-constraints/Use-of-set_output_delay-Command-Options
https://docs.amd.com/r/en-US/ug906-vivado-design-analysis/Check-Timing-Section