このページは、 timingに関する一連のページに属しています。前のページでは、 timing 計算の背後にある理論を説明し、いくつかの timing constraints を記述する方法を示し、 timing closureの原理について説明しました。前のページでは、 I/O timing constraintsに関するいくつかの基本原則について説明しました。このページでは、このトピックの実際的な側面について説明します。
序章
I/O timing constraints の目的は、外界との信頼できるインターフェイスを確保することです。 それらは、外界からの各 signal が FPGA上の関連する flip-flop に確実に到着することを保証します。同様に、 FPGA から外界への各 signal が外部コンポーネントの flip-flop に確実に到達するようにします。
I/O timing constraints は、 timing constraintsの中で最も難しい種類です。 timing パラメータの一部は、 PCB (Printed Circuit Board) の外部電子部品に依存します。 timing の正しい要件を判断するには、通常、これらの外部コンポーネントの datasheets を読み取る必要があります。多くの場合、正確な timing constraintを取得するには、ペンと紙で計算する必要があります。
この複雑なタスクをスキップして、単純な代替手段を好むのは魅力的です。 試行錯誤。このショートカットは、ツールに必要なことをさせ、それが機能するかどうかを確認することで構成されています。 input portに問題がある場合は、 input signalを受け取る flip-flop で反対の clock edge を使用します。同様に、 output がうまく機能しない場合は、 output flip-flopで反対の clock edge を使用します。この方法では、通常、電子機器がすばやく簡単に機能します。
このアプローチの問題点は、 timing の動作が温度とともに変化することです。また、半導体部品の製造工程による不確実性もあります。これは、 FPGA だけでなく、外部電子機器にも当てはまります。したがって、不適切な timing constraints は「 Black Magic モード」につながる可能性があります。これはすべての timing constraintsに当てはまりますが、 I/O timing constraintsではより多く発生します。
ペンと紙の計算をスキップすることの最悪の点は、 board designが原因で timing の要件を保証できない場合があることです。このような状況が board designのプロセス中に発見された場合、簡単な解決策 ( FPGA に配線を変更するか、 clocksの配布を再考する) があることがよくあります。しかし、 PCB の製造後にこの種の欠陥が発見された場合、それを修正する方法がない可能性があります。つまり、電子機器が確実に動作することを保証できなくなります。
このページの内容
このページでは、 I/O ports用の基本的な timing constraints の概要を説明します。ここに示されている構文は SDCであり、 Vivado と Quartus、および他の FPGA ツールで使用されます。
このページは、 I/O専用の timing constraints から始まります。 set_input_delay と set_output_delay。これらの constraints の意味を説明します。これに続いて、 Vivado および Quartusによる timing reports の例を示す 2 つの別個のページへの参照が続きます。
set_max_delay と set_min_delayで timing constraints を定義することもできます。これらのコマンドは、いくつかのシナリオでより適しています。 FPGA内の paths に関しては、すでにお会いしました。 I/O timing constraints としての意味についても以下で説明します。
このページでは、これらの I/O timing constraintsに関する技術的な側面のみを説明します。理論的な部分については、 I/O portsに対して false paths を定義する方法も示されている前のページを参照してください。
set_input_delay と set_output_delayの意味
これら 2 つのコマンドは、外部コンポーネントとのインターフェイスがsystem synchronousの場合に適しています。要するに、
- set_input_delay -clock … -max … : input port + boardの trace delayに接続される外部コンポーネントの最大 clock-to-output 。
- set_input_delay -clock … -min … : input portに接続される外部コンポーネントの最小 clock-to-output 。 datasheet がこの情報を提供しない場合は、ゼロを選択してください (このコンポーネントの将来のリビジョンが非常に高速な processで製造される場合に備えて)。
- set_output_delay -clock … -max … : output signal + boardの trace delayを受ける外部コンポーネントの tsu 。
- set_output_delay -clock … -min … : output signalを受け取る外部コンポーネントの –thold 。マイナス記号に注意してください。たとえば、 hold time が 1 nsの場合、この constraint を -1 に設定します。
これらの定義は、次の 2 つの条件が満たされている場合にのみ正しいことに注意してください。
- インターフェースはsystem synchronousです。
- clock を定義する create_clock コマンドは、 get_ports コマンドで clock signal を参照します (たとえば、 get_pinsで FPGA 内の別の signal に依存するのとは対照的に)。
これら 2 つの条件は、 clock delays が正しく計算されるようにするために必要です。
また、 -min と -max のどちらも使用されていない場合、コマンドは 2 つのコマンドとして解釈されることに注意してください。 -minを使用した 1 つのコマンドと、 -maxを使用した 2 番目のコマンド。これはおそらくあなたが望むものではありません。
これらのコマンドの定義は少し混乱しています: set_input_delay は、 clock edgeの後で data signal がその値をいつ変更できるかを定義します。ただし、 set_output_delay は、 data signal がその値を変更した後にいつ clock edge が許可されるかを定義します。おそらく、これらの定義の背後にある理論的根拠は、 datasheet の数値を timing constraintsで直接使用できるということです。
set_input_delay および set_output_delay コマンドには、ここでは説明しないオプションがいくつかあります。特に、 falling clock edge は時間基準として選択できます。詳細については、ツールのドキュメントを参照してください。
常に min と maxの両方を使用する
timing constraintごとに -min と -max の両方を使用することを主張するのは無意味に思えるかもしれません。例えば、外部コンポーネントの tsetup が 8 nsの場合、これの何が問題になっていますか?
set_output_delay -clock theclk 8 [get_ports test_out]
これにより、 setup time が正しく定義されます。 hold timeに関しては、意図せず –8 nsと定義されています。これにより、 output port は clockの前に値 8 ns を変更できます。しかし、誰が気にしますか?そんなことありえませんよね?
実際、それは可能です。 input pin から clock に基づいて内部 clockを生成するための PLL の使用法については既に説明しました (つまり、 boardで表示される clock )。これにより、 PLL は FPGAの内部 clock を input clockに合わせることができます。 PLL は、 clock distribution networkの delay を補正するために clock をわずかに移動 (shifting) することでこれを行います。
実際、 FPGA ツールは、 timing constraintを実現するために、 clock を boardの clockよりも少し前に自由に移動できます。 FPGA 内の clock を外部 clockの前に移動すると、外部コンポーネントによって認識される clock-to-output が小さくなります。これは、 FPGA 内の flip-flop が内部 clockと同期しているが、可視 timing は外部 clockに関連しているためです。
ただし、 FPGAの内部 clock が board上の clock よりも古い場合、 FPGAの output は、外部 clockの clock edge の前に変更できます。これにより、これらの outputsを受け取るコンポーネントで hold time 違反が発生する可能性があります。
set_output_delay コマンドが hold time を –8 nsとして定義する場合、 output が clockの前にその値 8 ns を変更するという意味ではありません。しかし、これにより、ツールは thold 要件に違反する方法で内部 clock を移動することができます。 -min で set_output_delay を正しく使用すると、この問題が発生しなくなります。
trace delayによる調整
ツールは PCBの trace delay を考慮していないことに注意してください。ツールにはこの情報がありません。したがって、 set_input_delay と set_output_delayの timing 計算を行うとき、この delay はゼロであると仮定します。修正は、 clock-to-output と tsuの datasheetの値に trace delay を追加することです。
clock skew を考慮する必要がある場合もあります。 完璧な PCBでは、 clock は同じ delayを持つすべてのコンポーネントに届きます。実際には、 FPGA と外部コンポーネントの間に clock skew が存在する可能性があります。このような clock skew は、ツールの timing 計算では考慮されません。
したがって、 clock が FPGA よりも早く到着した場合 (外部コンポーネントと比較して)、次の修正が必要です。
- set_input_delay -clock … -max … の場合: clock skew をコマンドの delay 値に追加します (これは、外部コンポーネントのより大きな clock-to-output に似ています)。
- set_output_delay -clock … -min … の場合: コマンドの delay 値から clock skew を減らします。つまり、より負にします (これは、外部コンポーネントのより大きな thold に似ています)。
同様に、 clock が FPGAに遅れて到着した場合は、次の修正が必要です。
- set_input_delay -clock … -min … の場合: コマンドの delay 値から clock skew を減らします (これは、外部コンポーネントのより小さい clock-to-output に似ています)。外部コンポーネントの datasheetに clock-to-output の最小値が指定されていない場合は、このコマンドの値として clock skew のマイナスを使用します。
- set_output_delay -clock … -max … : clock skew をコマンドの delay 値に追加します (これは、より大きな PCB trace delayに似ています)。
timing report は、ここで概説されている調整に関係なく、ゼロではない clock skew を表示する場合があることに注意してください。ただし、 timing report に表示される clock skew は、 PCBではなく、 FPGA内の clock delays に関連しています。
timing reportsの例
例は、次の Verilog コードに基づいています。
module top(
input test_clk,
input test_in,
output reg test_out
);
reg test_samp;
always @(posedge test_clk)
begin
test_samp <= test_in;
test_out <= test_samp;
end
endmodule
@test_clk は input clock、 @test_in は input pin、 @test_out は output pinです。内部 clock を boardの clockと位置合わせするために PLL は使用されないため、重要な clock delayが存在することに注意してください。
timing constraints は次のとおりです。
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]
timing reports はかなり長いので、別のページに表示されます。
set_max_delay と set_min_delayの使用
外部コンポーネントとのインターフェースがsource synchronousの場合、 set_input_delay と set_output_delay の使用はあまり自然ではありません。 set_max_delay と set_min_delay は、この状況により適しています。前のページでは、これら 2 つのコマンドは、 clock period constraintsに対する補足または調整 (timing exceptions) としてのみ言及されていました。すべての paths は内部でした: それらは sequential elementで始まり、 sequential elementで終わりました。これらのコマンドを I/O timing constraintsとして使用すると、 path の先頭または末尾のいずれかが I/O portになります。この状況で timing analysis はどのように行われますか?
真実は、これらのコマンドの timing analysis を掘り下げても意味がないことが多いということです。 それらの目的は通常、ツールがほとんど実行できない timing constraints を記述することによって、ツールの動作を制限することです。したがって、これらの timing constraints の値は、これらの constraints をより厳密にする試みを繰り返すことによって見つけられます。この方法論では、 timing analysis 自体は重要ではありません。
そうは言っても、 set_max_delay と set_min_delayの背後にある計算を理解することは依然として良い考えです。
timing analysis には次の2 つの部分があることを思い出してください。 最初の部分は source pathです。 clock edge (外部 clock pinで) から、2 番目の flip-flopの data input で更新された有効な値までの時間を計算します。この部分は、次の 3 つの要素の合計です。
- clock edge が最初の flip-flop ( clock path) に到達するのにかかる時間
- この flip-flop がその値を更新するのにかかる時間
- この新しい値が 2 番目の flip-flopに到達するまでにかかる時間
2 番目の部分は destination pathで、 clock edge が 2 番目の flip-flopに到達するのにかかる時間のみで構成されます。この flip-flopの input が ( source pathから) いつ更新されるかは既にわかっているため、必要に応じて tsu または tholdとの時間差を比較できます。
しかし、それは 2 つの sequential elementsについても当てはまりました。片側が I/O portの場合はどうなりますか? timing analysisのために、 port は架空の flip-flopであるかのように扱われます。この flip-flop への clock path delay はゼロです。
clock が get_ports に依存する create_clock コマンドで定義されている通常の状況を考えてみましょう (ほとんどすべての例で示されているように)。ゼロの clock path delay は、この架空の flip-flopの clock input が clock pinに直接接続されていることを意味します。したがって、 clock pin とこの架空の flip-flopの間に delay はありません。
この flip-flop の timing パラメータはすべてゼロです。 tsu、 thold 、 clock-to-output。これは現実的な電子部品を反映したものではありませんが、 output portと組み合わせて使用する場合、 set_max_delay と set_min_delay に意味を与えます。 portの clock-to-output。例えば:
set_max_delay -to [get_ports test_out] 7 set_min_delay -to [get_ports test_out] 0
これら 2 つの timing constraints では、 @test_outの clock-to-output が 0 ns と 7 nsの間にある必要があります。
理由を説明しましょう: 通常、 set_max_delay コマンドは、特定の flip-flops間の paths に対する period constraint に似ていることを思い出してください。では、 Destination Clock Pathはどうなるでしょうか。計算は、2 番目の clock edge、つまり 7 nsの時点で開始されます。しかし、 clock path delay から 2 番目の flip-flop まではゼロであり、この flip-flop の tsu もゼロです。したがって、 Destination Clock Path の計算結果は 7 nsになります。これは Source Pathに許可される最大値であり、通常どおり計算されます。 Source Clock Path と Data Path。要約すると、要件は、 data output が最初の clock edgeの後に有効な 7 ns であることです。これはまさに output portの clock-to-output の定義です。関連する clock の create_clock コマンドが get_portsに基づいていた場合、この clock-to-output は PCB上の clock に関連しています。
Vivadoを使用した timing reportsの例を参照してください。
set_output_delay は、外部コンポーネントの tsu または thold に関連していることに注意してください。 set_max_delay は、 FPGAの output portの clock-to-output を定義します。したがって、これら 2 つのオプションの主な違いは、焦点がどこにあるかです。
input portに関して、 set_max_delay と set_min_delay が何を意味するかについての直感的な説明はありません。 Source Path は、 input pin と input signalを受信する flip-flop の data input の間の delay で構成されます。 Destination Clock Path は、 timing constraint コマンドで指定された時刻に開始します。今回は clock path delay を追加。これらは無意味な計算です ( timing reportsを参照してください)。外部コンポーネントの clock-to-output に関連する set_input_delayを使用する方が自然です。
set_max_delay と set_min_delay に代わって作成された timing analysis は、 clock periodに依存しないことに注意してください。したがって、 clockの周波数が変更された場合、ツールがこれらの constraintsを適用している間、同じ数値が使用されます。対照的に、 set_input_delay と set_output_delay の計算は、 clockの周波数に依存します。
I/O timing constraints が clockの周波数に依存していることは、状況に応じて長所にも短所にもなります。 timing constraints が外部コンポーネントの timing パラメーターに基づいて作成されている場合 (およびインターフェースがsystem synchronousである場合)、 set_input_delay および set_output_delayに依存する方がおそらく適切です。 これらの constraints は、 clockの周波数が変わっても正しいままです。ただし、 timing constraints の目的が、ツールに特定の選択を強制すること (たとえば、 IOB registersを使用すること) である場合、 set_max_delay および set_min_delay が適している可能性が高くなります。
-datapath_onlyの使用
timing constraint の考えられる動機の 1 つは、 FPGA ツールが、 I/O portとの間で最小限の delay を実現するために必要なことは何でも行うようにすることです。これは通常、 IOB registerを使用することを意味します。これは、 input port と flip-flop の間に余分な delay を挿入しないようにすることも意味します (ツールは、 thold の要件をより余裕を持って満たすために行う場合があります)。
この目的で timing constraint を使用する場合、目標となる特定の delay はありません。アイデアは、ツールが可能な限り最高の結果を達成する以外のことをしないようにすることです。 FPGA ツールが -datapath_onlyをサポートしている場合は、このオプションで set_max_delay を使用することをお勧めします。これにより、計算から clock delay path が完全に除外されるため、 I/O port と flip-flop の間の delay のみが考慮されます。このように、 timing constraintの要件はその目的に正確に対応しています。 flip-flop と I/O pinの間で delay を制御します。
これは Vivadoの簡単な例です:
set_max_delay -datapath_only -from [get_ports test_in] 2 set_max_delay -datapath_only -from [all_registers] \ -to [get_ports test_out] 3
しかし、「-from [all_registers]」と書かれている部分の目的は何ですか?なぜ「-from」が必要なのですか?簡単に言うと、 Vivado は "-from" の部分がないこのコマンドの受け入れを拒否したということです。 input portに関するコマンドには、同様の要件はありませんでした。
datapath_only を搭載した timing reports は、例とともにページの下部にあります。
概要
set_input_delay と set_output_delay は、多くの場合、 I/O timing constraintsの優先コマンドと見なされます。実際、インターフェースがsystem synchronousの場合、これは通常正しい選択です。他のシナリオでは、代わりに set_max_delay と set_min_delay を使用することを検討する価値があります。 I/O portの timingで必要な制限をより適切に反映している可能性があるからです。
このページで、 timingに関するこの一連のページを終了します。しかし、既存の designを検査するのに便利な方法で多くのトピックをまとめた最後のページが 1 つあります。