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

この解析は時刻 0 を起点にします。そこに、最大入力遅延 (input delay -max) 制約で指定した 4 ns(クロックから出力までの遅延、clock-to-output delay)を加えて、データパス (data path) の計算を進めます。ロジック素子の遅延値には、プロセス・電圧・温度の組み合わせとして最速 (fastest) のケースを使います。これに FPGA 内部のデータパス遅延 (2.465 ns) を合わせると、データパス全体の遅延は 6.465 ns になります。

続いてクロックパス (clock path) を計算します。基準は、20 ns 時点の次のクロックエッジです。ここでも遅延値は最速ケースが選ばれます。クロックは入力ピンからフリップフロップまで進みます(PLL を使っていないため、クロックネットワーク遅延の補正はありません)。この計算には、推定ジッタ (jitter) も「クロック不確実性 (clock uncertainty)」として含まれます。結果としてクロック側の要求時刻は 22.129 ns です。これとデータ到着時刻 6.465 ns との差 15.664 ns がスラック (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

この解析は時刻 0 から始まります。そこに、最小入力遅延 (input delay -min) 制約で指定した 2 ns(クロックから出力までの遅延、clock-to-output delay)を加えてデータパスを進めます。ロジック素子の遅延値には、プロセス・電圧・温度の組み合わせとして最遅 (slowest) のケースを使います。これに FPGA 内部のデータパス遅延 (3.443 ns) を合わせると、データパス全体の遅延は 5.443 ns になります。先ほどの最速解析に比べて、FPGA 内部の遅延が大きくなっているのは当然ですね。

次に、今度は最遅ケースでクロックパスを計算します。この計算の基準は、0 ns の同じクロックエッジです。ホールドタイミング (hold timing) の解析では、フリップフロップがデータをサンプリング (sampling) する前に、入力データが変化してしまっていないかを確認するからです。

クロックは入力ピンからフリップフロップまで進みます(PLL を使っていないため、クロックネットワーク遅延の補正はありません)。この計算にも、推定ジッタ (jitter) が「クロック不確実性 (clock uncertainty)」として含まれます。セットアップの計算と同じ値ですが、符号が逆になっていることに注意してください。同じジッタでも、最悪の効き方は反対方向になるからです。

結局、クロックパスは 5.488 ns に到達します。しかしデータは 5.443 ns で変化しているため、0.045 ns 遅すぎます。つまり制約違反で、スラックは -0.045 ns になります。

この解析から分かるように、set_input_delay -min に入れる値は、入力ピンを駆動する外部デバイスの最小クロックから出力までの遅延です。この値がデータパスの開始時刻として使われるからです。レポートの Path Type に「Min」と書かれている点にも注目してください。

最小のクロックから出力までの遅延が 2 ns しかなくてもホールド制約に違反し得る、と驚かれるかもしれません。しかし軽視は禁物です。ほかのタイミング制約違反と同様、放置すると実際に問題を引き起こす可能性があります。

この場合の解決策は、クロックパスに PLL を追加して、グローバルクロックネットワーク上のクロックを入力クロックにロックさせることです。実質的にクロックエッジを数 ns 早く持ってくることになり、確実に問題が解決します。

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

この解析は、出力遅延を検証するのが目的なので、まずクロックエッジをフリップフロップまで進め、そこからデータパスに沿って出力まで進みます。合計遅延は 8.982 ns になります。

なお、Path Type にはセットアップ (setup) の計算とは明記されていません(混乱を避けるためでしょうか?)。しかし、基準としているのは同じクロック (0 ns) ではなく次のクロック (20 ns) です。

この計算は、プロセス・電圧・温度の組み合わせが最遅のケースで行われます(入力のセットアップ解析が最速ケースだったのを思い出してください)。クロックパスの様子は、入力遅延のホールド解析で見たクロックパスとよく似ています。どちらも遅いモデル (slow model) を使うため、当然といえば当然です。

比較対象となるのは、次のクロックエッジ (20 ns) から、set_output_delay の指定値と推定ジッタ (jitter、この例では 0.035 ns) を差し引いた時刻です。

まとめると、データは 8.982 ns で安定し、安定を保たなければならない期限は約 12 ns なので、スラックは約 3 ns 残っています。

このことから、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

基本的な流れは set_output_delay -max の解析と同じですが、基準になるのは次のクロックではなく同じクロックエッジです。また、プロセス・電圧・温度の組み合わせは最速ケースで計算します。

ここでも、クロックパスは入力遅延のセットアップ解析のクロックパスとよく似ています。どちらも速いモデル (fast model) を使うからで、当然の結果です。

set_output_delay -max のときと同様に、クロックパスに続いて、出力が安定するまでデータパスを進めます。今回は 3.826 ns で安定します(スローモデルとの差に注目してください)。

比較対象は、0 ns の同じクロックエッジから出力遅延を差し引いた時刻です。制約の set_output_delay -min は -3 ns と負の値なので、計算上は正の数として加算されるわけです。

さらに、推定ジッタ (jitter) 0.035 ns も加算されています(同じクロックサイクル内の計算なのに、なぜジッタを考慮するのか、私はよく理解できていません)。

結論として、データは 3.826 ns まで安定していて、3.035 ns まで安定していればよいので、スラック 0.791 ns で問題ありません。

このことから、set_output_delay -min に入れる値は、外部デバイスの入力に規定されているホールドタイム (hold time) の符号を反転させたものだという理由が分かります。このタイミング制約の検証では、出力までの合計遅延が指定した値よりも大きいことを確認しています。言い換えれば、クロックエッジの後にデータをその時間だけ安定させ続ける必要があり、これがホールドタイムの定義です。

このページは英語から機械翻訳されたものです。不明な点があれば、原文を参照してください。
Copyright © 2021-2026. All rights reserved. (dcc38493)