01signal.com

Vivado의 set_input_delay 및 set_output_delay 제약 조건에 대한 타이밍 분석

자, 이게 뭐죠?

이 페이지는 다른 포스트의 예제 부분입니다. 그 포스트에서는 SDC 타이밍 제약 조건(timing constraints)에서 set_input_delay와 set_output_delay가 무엇을 의미하는지 설명합니다.

그 포스트에서 설명한 대로, 아래 예제들의 배경이 되는 타이밍 제약 조건은 다음과 같습니다.

create_clock -name theclk -period 20 [get_ports test_clk]
set_output_delay -clock theclk -max 8 [get_ports test_out]
set_output_delay -clock theclk -min -3 [get_ports test_out]
set_input_delay -clock theclk -max 4 [get_ports test_in]
set_input_delay -clock theclk -min 2 [get_ports test_in]

set_input_delay -max(셋업) 분석

Slack (MET) :             15.664ns  (required time - arrival time)
  Source:                 test_in
                            (input port clocked by theclk  {rise@0.000ns fall@10.000ns period=20.000ns})
  Destination:            test_samp_reg/D
                            (rising edge-triggered cell FDRE clocked by theclk  {rise@0.000ns fall@10.000ns period=20.000ns})
  Path Group:             theclk
  Path Type:              Setup (Max at Fast Process Corner)
  Requirement:            20.000ns  (theclk rise@20.000ns - theclk rise@0.000ns)
  Data Path Delay:        2.465ns  (logic 0.291ns (11.797%)  route 2.175ns (88.203%))
  Logic Levels:           1  (IBUF=1)
  Input Delay:            4.000ns
  Clock Path Skew:        2.162ns (DCD - SCD + CPR)
    Destination Clock Delay (DCD):    2.162ns = ( 22.162 - 20.000 )
    Source Clock Delay      (SCD):    0.000ns
    Clock Pessimism Removal (CPR):    0.000ns
  Clock Uncertainty:      0.035ns  ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE
    Total System Jitter     (TSJ):    0.071ns
    Total Input Jitter      (TIJ):    0.000ns
    Discrete Jitter          (DJ):    0.000ns
    Phase Error              (PE):    0.000ns

    Location             Delay type                Incr(ns)  Path(ns)    Netlist Resource(s)
  -------------------------------------------------------------------    -------------------
                         (clock theclk rise edge)     0.000     0.000 r
                         input delay                  4.000     4.000
    AE20                                              0.000     4.000 r  test_in (IN)
                         net (fo=0)                   0.000     4.000    test_in
    AE20                 IBUF (Prop_ibuf_I_O)         0.291     4.291 r  test_in_IBUF_inst/O
                         net (fo=1, routed)           2.175     6.465    test_in_IBUF
    SLICE_X0Y1           FDRE                                         r  test_samp_reg/D
  -------------------------------------------------------------------    -------------------

                         (clock theclk rise edge)    20.000    20.000 r
    AE23                                              0.000    20.000 r  test_clk (IN)
                         net (fo=0)                   0.000    20.000    test_clk
    AE23                 IBUF (Prop_ibuf_I_O)         0.077    20.077 r  test_clk_IBUF_inst/O
                         net (fo=1, routed)           1.278    21.355    test_clk_IBUF
    BUFGCTRL_X0Y4        BUFG (Prop_bufg_I_O)         0.026    21.381 r  test_clk_IBUF_BUFG_inst/O
                         net (fo=2, routed)           0.781    22.162    test_clk_IBUF_BUFG
    SLICE_X0Y1           FDRE                                         r  test_samp_reg/C
                         clock pessimism              0.000    22.162
                         clock uncertainty           -0.035    22.126
    SLICE_X0Y1           FDRE (Setup_fdre_C_D)        0.003    22.129    test_samp_reg
  -------------------------------------------------------------------
                         required time                         22.129
                         arrival time                          -6.465
  -------------------------------------------------------------------
                         slack                                 15.664

이 분석은 0ns에서 시작합니다. 이후 최대 입력 지연(max input delay) 제약 조건에 지정된 4ns(클럭-출력 지연)를 더해 데이터 경로(data path)를 계속 따라갑니다. 논리 소자의 지연 값은 공정·전압·온도 조건 중 가장 빠른(fastest) 조합의 값이 사용됩니다. FPGA 자체의 데이터 경로 지연(2.465ns)을 합치면 전체 데이터 경로 지연은 6.465ns가 됩니다.

그런 다음 클럭 경로(clock path)를 계산하는데, 이번에는 다음 클럭 엣지(20ns)에서 출발합니다. 여기서도 지연 값은 가장 빠른 조합으로 선택됩니다. 클럭은 입력 핀에서 플립플롭(flip-flop)까지 전파됩니다(PLL이 없으므로 클럭 네트워크 지연에 대한 보상은 없습니다). 이 계산에는 ‘클럭 불확실성(clock uncertainty)’으로 반영된 추정 지터(jitter)도 포함됩니다. 결과적으로 클럭 경로는 22.129ns에 도달하며, 이는 데이터가 플립플롭에 도착한 시각보다 15.664ns 뒤입니다. 이것이 이 제약 조건의 슬랙(slack)입니다.

이 분석을 통해 set_input_delay -max 제약 조건에 넣는 값은 입력 핀을 구동하는 외부 소자의 최대 클럭-출력 지연이며, 여기에 보드 배선 지연을 더한 값이라는 점을 알 수 있습니다. 그 값이 데이터 경로의 시작 시각으로 사용되기 때문입니다. 위 Path Type의 ‘Max’ 부분을 확인하세요.

set_input_delay -min(홀드) 분석

Min Delay Paths
--------------------------------------------------------------------------------------
Slack (VIOLATED) :        -0.045ns  (arrival time - required time)
  Source:                 test_in
                            (input port clocked by theclk  {rise@0.000ns fall@10.000ns period=20.000ns})
  Destination:            test_samp_reg/D
                            (rising edge-triggered cell FDRE clocked by theclk  {rise@0.000ns fall@10.000ns period=20.000ns})
  Path Group:             theclk
  Path Type:              Hold (Min at Slow Process Corner)
  Requirement:            0.000ns  (theclk rise@0.000ns - theclk rise@0.000ns)
  Data Path Delay:        3.443ns  (logic 0.626ns (18.194%)  route 2.817ns (81.806%))
  Logic Levels:           1  (IBUF=1)
  Input Delay:            2.000ns
  Clock Path Skew:        5.351ns (DCD - SCD - CPR)
    Destination Clock Delay (DCD):    5.351ns
    Source Clock Delay      (SCD):    0.000ns
    Clock Pessimism Removal (CPR):    -0.000ns
  Clock Uncertainty:      0.035ns  ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE
    Total System Jitter     (TSJ):    0.071ns
    Total Input Jitter      (TIJ):    0.000ns
    Discrete Jitter          (DJ):    0.000ns
    Phase Error              (PE):    0.000ns

    Location             Delay type                Incr(ns)  Path(ns)    Netlist Resource(s)
  -------------------------------------------------------------------    -------------------
                         (clock theclk rise edge)     0.000     0.000 r
                         input delay                  2.000     2.000
    AE20                                              0.000     2.000 r  test_in (IN)
                         net (fo=0)                   0.000     2.000    test_in
    AE20                 IBUF (Prop_ibuf_I_O)         0.626     2.626 r  test_in_IBUF_inst/O
                         net (fo=1, routed)           2.817     5.443    test_in_IBUF
    SLICE_X0Y1           FDRE                                         r  test_samp_reg/D
  -------------------------------------------------------------------    -------------------

                         (clock theclk rise edge)     0.000     0.000 r
    AE23                                              0.000     0.000 r  test_clk (IN)
                         net (fo=0)                   0.000     0.000    test_clk
    AE23                 IBUF (Prop_ibuf_I_O)         0.734     0.734 r  test_clk_IBUF_inst/O
                         net (fo=1, routed)           2.651     3.385    test_clk_IBUF
    BUFGCTRL_X0Y4        BUFG (Prop_bufg_I_O)         0.093     3.478 r  test_clk_IBUF_BUFG_inst/O
                         net (fo=2, routed)           1.873     5.351    test_clk_IBUF_BUFG
    SLICE_X0Y1           FDRE                                         r  test_samp_reg/C
                         clock pessimism              0.000     5.351
                         clock uncertainty            0.035     5.387
    SLICE_X0Y1           FDRE (Hold_fdre_C_D)         0.101     5.488    test_samp_reg
  -------------------------------------------------------------------
                         required time                         -5.488
                         arrival time                           5.443
  -------------------------------------------------------------------
                         slack                                 -0.045

이 분석도 0ns에서 시작합니다. 이후 최소 입력 지연(min input delay) 제약 조건에서 지정된 2ns(클럭-출력 지연)를 더해 데이터 경로를 이어갑니다. 논리 소자의 지연 값은 공정·전압·온도 조건 중 가장 느린(slowest) 조합의 값이 사용됩니다. FPGA 자체의 데이터 경로 지연(3.443ns)을 합치면 전체 데이터 경로 지연은 5.443ns가 됩니다. 앞선 빠른 조건 분석보다 FPGA 자체 지연이 더 크게 잡히는 것은 당연합니다.

그다음에는 가장 느린(slowest) 조합으로 클럭 경로를 계산합니다. 이 계산은 같은 클럭 엣지(0ns)에서 출발합니다. 어차피 홀드(hold) 타이밍 계산이니까요. 핵심은 플립플롭이 데이터를 샘플링(sampling)하기도 전에 데이터가 바뀌지는 않았는가 하는 것입니다.

클럭은 입력 핀에서 플립플롭까지 전파됩니다(PLL이 없으므로 클럭 네트워크 지연 보상은 없습니다). 이 계산에도 추정된 지터가 ‘클럭 불확실성’으로 반영됩니다. 셋업 계산 때와 값은 같지만 부호는 반대입니다. 지터 자체는 같아도 최악의 경우가 반대 방향으로 작용하기 때문입니다.

결국 클럭 경로는 5.488ns에 도달합니다. 그런데 데이터는 5.443ns에 이미 바뀌었으므로 0.045ns 늦은 셈입니다. 따라서 제약 조건이 위반되었고, 슬랙은 -0.045ns입니다.

이 분석은 set_input_delay -min 제약 조건에 넣는 값이 입력 핀을 구동하는 외부 소자의 최소 클럭-출력 지연이라는 것을 보여줍니다. 이 값이 데이터 경로의 시작 시각으로 쓰이기 때문입니다. 위 Path Type의 ‘Min’ 부분을 확인하세요.

최소 클럭-출력 지연이 2ns인데도 홀드 제약 조건을 위반할 수 있다는 점은 의외일 수 있습니다. 하지만 가볍게 여겨서는 안 됩니다. 다른 타이밍 제약 조건 위반과 마찬가지로, 무시하면 실제 문제를 일으킬 수 있습니다.

이 경우의 해결책은 클럭 경로에 PLL을 추가해 글로벌 클럭 네트워크가 입력 클럭에 위상 고정(lock)되도록 하는 것입니다. 그러면 클럭이 사실상 수 나노초 일찍 당겨지므로 문제가 확실히 해결됩니다.

set_output_delay -max(셋업) 분석

Slack (MET) :             2.983ns  (required time - arrival time)
  Source:                 test_out_reg/C
                            (rising edge-triggered cell FDRE clocked by theclk  {rise@0.000ns fall@10.000ns period=20.000ns})
  Destination:            test_out
                            (output port clocked by theclk  {rise@0.000ns fall@10.000ns period=20.000ns})
  Path Group:             theclk
  Path Type:              Max at Slow Process Corner
  Requirement:            20.000ns  (theclk rise@20.000ns - theclk rise@0.000ns)
  Data Path Delay:        3.631ns  (logic 2.583ns (71.152%)  route 1.047ns (28.848%))
  Logic Levels:           1  (OBUF=1)
  Output Delay:           8.000ns
  Clock Path Skew:        -5.351ns (DCD - SCD + CPR)
    Destination Clock Delay (DCD):    0.000ns = ( 20.000 - 20.000 )
    Source Clock Delay      (SCD):    5.351ns
    Clock Pessimism Removal (CPR):    0.000ns
  Clock Uncertainty:      0.035ns  ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE
    Total System Jitter     (TSJ):    0.071ns
    Total Input Jitter      (TIJ):    0.000ns
    Discrete Jitter          (DJ):    0.000ns
    Phase Error              (PE):    0.000ns

    Location             Delay type                Incr(ns)  Path(ns)    Netlist Resource(s)
  -------------------------------------------------------------------    -------------------
                         (clock theclk rise edge)     0.000     0.000 r
    AE23                                              0.000     0.000 r  test_clk (IN)
                         net (fo=0)                   0.000     0.000    test_clk
    AE23                 IBUF (Prop_ibuf_I_O)         0.734     0.734 r  test_clk_IBUF_inst/O
                         net (fo=1, routed)           2.651     3.385    test_clk_IBUF
    BUFGCTRL_X0Y4        BUFG (Prop_bufg_I_O)         0.093     3.478 r  test_clk_IBUF_BUFG_inst/O
                         net (fo=2, routed)           1.873     5.351    test_clk_IBUF_BUFG
    SLICE_X0Y1           FDRE                                         r  test_out_reg/C
  -------------------------------------------------------------------    -------------------
    SLICE_X0Y1           FDRE (Prop_fdre_C_Q)         0.223     5.574 r  test_out_reg/Q
                         net (fo=1, routed)           1.047     6.622    test_out_OBUF
    AK21                 OBUF (Prop_obuf_I_O)         2.360     8.982 r  test_out_OBUF_inst/O
                         net (fo=0)                   0.000     8.982    test_out
    AK21                                                              r  test_out (OUT)
  -------------------------------------------------------------------    -------------------

                         (clock theclk rise edge)    20.000    20.000 r
                         clock pessimism              0.000    20.000
                         clock uncertainty           -0.035    19.965
                         output delay                -8.000    11.965
  -------------------------------------------------------------------
                         required time                         11.965
                         arrival time                          -8.982
  -------------------------------------------------------------------
                         slack                                  2.983

이 분석의 목적은 출력 지연(output delay)을 측정하는 것이므로, 클럭 엣지에서 출발해 플립플롭까지, 이어서 데이터 경로를 따라갑니다. 그 합계가 전체 지연이며 8.982ns로 계산됩니다.

흥미롭게도 Path Type에는 셋업(setup) 계산이라고 명시되지 않습니다(혼란을 피하려는 것일까요?). 그런데도 계산은 같은 클럭 엣지(0ns)가 아니라 다음 클럭 엣지(20ns)를 기준으로 합니다.

이 계산은 공정·전압·온도 조건 중 가장 느린(slowest) 조합에서 이루어집니다(입력 셋업 계산은 가장 빠른 조합에서 이루어졌던 것과 대조적입니다). 이 클럭 경로는 입력 지연의 홀드 타이밍 분석에서 본 클럭 경로와 매우 비슷합니다. 두 계산 모두 슬로 모델(slow model)을 기준으로 하기 때문에 당연한 결과입니다.

전체 지연은 다음 클럭의 시각(20ns)에서 set_output_delay에 지정한 값을 뺀 값과 비교됩니다. 여기서 추정 지터(0.035ns)도 추가로 뺍니다.

요약하면, 데이터는 8.982ns에 안정적인 논리 상태가 되고, 안정적으로 유지되어야 하는 시각은 약 12ns입니다. 따라서 슬랙은 거의 3ns가 됩니다.

이 결과는 set_output_delay -max에 넣는 값이 외부 소자의 입력에 명시된 셋업 시간(setup time)이어야 하는 이유를 보여줍니다. 이 타이밍 제약 조건은 출력에 유효한 데이터가 나타날 때까지의 전체 지연과 다음 클럭 시각의 차이를 계산해 검증합니다. 그 차이가 바로 달성해야 할 목표값입니다. 이것은 셋업 시간의 정의, 즉 다음 클럭이 오기 전에 데이터가 얼마나 오랫동안 안정적으로 유지되어야 하는지와 정확히 일치합니다.

set_output_delay -min(홀드) 분석

Slack (MET) :             0.791ns  (arrival time - required time)
  Source:                 test_out_reg/C
                            (rising edge-triggered cell FDRE clocked by theclk  {rise@0.000ns fall@10.000ns period=20.000ns})
  Destination:            test_out
                            (output port clocked by theclk  {rise@0.000ns fall@10.000ns period=20.000ns})
  Path Group:             theclk
  Path Type:              Min at Fast Process Corner
  Requirement:            0.000ns  (theclk rise@0.000ns - theclk rise@0.000ns)
  Data Path Delay:        1.665ns  (logic 1.384ns (83.159%)  route 0.280ns (16.841%))
  Logic Levels:           1  (OBUF=1)
  Output Delay:           -3.000ns
  Clock Path Skew:        -2.162ns (DCD - SCD - CPR)
    Destination Clock Delay (DCD):    0.000ns
    Source Clock Delay      (SCD):    2.162ns
    Clock Pessimism Removal (CPR):    -0.000ns
  Clock Uncertainty:      0.035ns  ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE
    Total System Jitter     (TSJ):    0.071ns
    Total Input Jitter      (TIJ):    0.000ns
    Discrete Jitter          (DJ):    0.000ns
    Phase Error              (PE):    0.000ns

    Location             Delay type                Incr(ns)  Path(ns)    Netlist Resource(s)
  -------------------------------------------------------------------    -------------------
                         (clock theclk rise edge)     0.000     0.000 r
    AE23                                              0.000     0.000 r  test_clk (IN)
                         net (fo=0)                   0.000     0.000    test_clk
    AE23                 IBUF (Prop_ibuf_I_O)         0.077     0.077 r  test_clk_IBUF_inst/O
                         net (fo=1, routed)           1.278     1.355    test_clk_IBUF
    BUFGCTRL_X0Y4        BUFG (Prop_bufg_I_O)         0.026     1.381 r  test_clk_IBUF_BUFG_inst/O
                         net (fo=2, routed)           0.781     2.162    test_clk_IBUF_BUFG
    SLICE_X0Y1           FDRE                                         r  test_out_reg/C
  -------------------------------------------------------------------    -------------------
    SLICE_X0Y1           FDRE (Prop_fdre_C_Q)         0.100     2.262 r  test_out_reg/Q
                         net (fo=1, routed)           0.280     2.542    test_out_OBUF
    AK21                 OBUF (Prop_obuf_I_O)         1.284     3.826 r  test_out_OBUF_inst/O
                         net (fo=0)                   0.000     3.826    test_out
    AK21                                                              r  test_out (OUT)
  -------------------------------------------------------------------    -------------------

                         (clock theclk rise edge)     0.000     0.000 r
                         clock pessimism              0.000     0.000
                         clock uncertainty            0.035     0.035
                         output delay                 3.000     3.035
  -------------------------------------------------------------------
                         required time                         -3.035
                         arrival time                           3.826
  -------------------------------------------------------------------
                         slack                                  0.791

이 분석은 최대 출력 지연 분석과 비슷합니다. 다만 다음 클럭 엣지가 아니라 같은 클럭 엣지를 기준으로 계산합니다. 또한 공정·전압·온도 조건 중 가장 빠른(fastest) 조합으로 계산합니다.

앞에서와 마찬가지로, 이 클럭 경로는 입력 지연의 셋업 타이밍 분석에서 본 클럭 경로와 매우 비슷합니다. 두 계산 모두 패스트 모델(fast model)을 기준으로 하기 때문에 당연한 결과입니다.

set_output_delay -max 계산과 마찬가지로, 데이터 경로는 클럭 경로에 이어 출력이 안정될 때까지 계속됩니다. 그 시점은 3.826ns로 계산됩니다(슬로 모델과의 차이를 확인하세요).

이 값은 같은 클럭의 시각(0ns)에서 출력 지연을 뺀 값과 비교됩니다. 타이밍 제약 조건에서 최소 출력 지연이 -3ns로 음수였다는 점을 기억하세요. 그래서 계산에서는 양수 3ns로 나타나는 것입니다.

추정된 지터 0.035ns도 더해집니다(같은 클럭 사이클에서 일어나는 일인데 왜 이 계산에 지터가 사용되는지는 저도 잘 이해하지 못했습니다).

결론적으로 데이터는 3.826ns까지 안정적이었고, 3.035ns까지는 안정적으로 유지되어야 합니다. 따라서 슬랙이 0.791ns로 문제없습니다.

이 결과는 set_output_delay -min에 넣는 값이 외부 소자의 입력에 명시된 홀드 시간(hold time)을 부호만 바꾼 값이어야 하는 이유를 보여줍니다. 이 타이밍 제약 조건은 전체 지연이 주어진 값보다 커야 한다는 조건을 확인하는 방식으로 검증됩니다. 다시 말해, 클럭 이후에도 데이터가 그 시간만큼은 안정적으로 유지되어야 한다는 뜻입니다. 이것이 바로 홀드 시간의 정의입니다.

이 페이지는 영어 원문을 기계 번역한 것입니다. 의문이 드는 부분이 있으면 원문을 참조하시기 바랍니다.
Copyright © 2021-2026. All rights reserved. (dcc38493)