さて、これは何?
このページは、別の記事 の具体例パートです。その記事では、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) の符号を反転させたものだという理由が分かります。このタイミング制約の検証では、出力までの合計遅延が指定した値よりも大きいことを確認しています。言い換えれば、クロックエッジの後にデータをその時間だけ安定させ続ける必要があり、これがホールドタイムの定義です。