このページは、タイミングに関する連載ページの一部です。これまでのページでは、タイミング計算の背後にある理論を説明し、いくつかのタイミング制約(timing constraints)の書き方を示し、タイミングクロージャ(timing closure)の原則について述べました。このページから、I/O タイミング制約についての議論を始めます。
はじめに
これまでのタイミング制約に関する議論はすべて、FPGA 内部のパス(path)に関するものでした。そしていよいよ、FPGA の I/O ポートのタイミングを制御する制約について話すときです。
ただし、タイミング制約の話をする前に、FPGA と外部コンポーネントとの間を同期させるさまざまな方法を認識しておく必要があります。このトピックを考慮せずに書かれたタイミング制約は、無価値かもしれません。さらに、I/O インターフェースを担当するロジックが不適切に書かれている可能性もあります。極端な場合、確実に動作する I/O を可能にするために必要な配線が PCB にないかもしれません。
外部コンポーネントとの同期に関する必要な認識があれば、タイミング制約に正しいコマンドを選択できます。その実践的な側面は、次のページで説明します。
このページでは、IOB レジスタに精通していることを前提とします。
クロック分配
パスが FPGA 内部にある限り、パスの両側の間のクロックスキュー(clock skew)を意識する必要はありませんでした。クロックの分配はツールの責任であり、タイミング計算はクロックスキューを考慮に入れていました。
I/O タイミング制約では事情が異なります。パスの片側は、FPGA の外部にある外部コンポーネントです。データ信号と同期するために、このコンポーネントは、そのピンの 1 つに受信するクロックに依存します。しかし、このクロックは何と同期しているのでしょうか。
戦略は通常、次の 2 つのいずれかです。
- システム同期クロック(system synchronous clock):外部コンポーネントは、FPGA のクロック入力ピンと同じクロック信号に接続されます。この戦略は、コモンクロック(common clock)とも呼ばれます。
- ソース同期クロック(source synchronous clock):データ信号と一緒に、専用のクロック信号が供給されます。通常、データ信号はクロックと同時に値が変化します。つまり、立ち上がりエッジまたは立ち下がりエッジのどちらかで変化します。
これらの 2 つの戦略について、次に詳しく説明します。ソース同期クロックのオプションについては、データ信号が入力か出力かで大きな違いがあります。したがって、これらのシナリオは別々に説明します。
システム同期クロック
PCB 上で複数のコンポーネントを同期させる最も簡単な方法は、すべてのコンポーネントを 1 つのクロックに接続することです。これはシステム同期クロック(またはコモンクロック)と呼ばれます。
この方法の利点は、すべてのコンポーネントのタイミングパラメータが 1 つのクロック信号を基準にしていることです。したがって、タイミング計算を行う上では、両側でクロックは同じです。つまり、PCB 上の 2 つのコンポーネント間を伝わるデータ信号について、計算は FPGA 内部のパスと似ています。パスは、最初のクロックエッジを基準とするクロックから出力までの遅延で始まります。パスの終端では、tsu は 2 番目のクロックエッジを基準とします。システム同期方式とは、これら 2 つのクロックエッジが同じクロックに属することを意味します。
システム同期クロックの扱いは簡単ですが、この方法が適しているのは比較的低い周波数だけです。タイミング計算の入門で、最小クロック周期がいくつかのタイミングパラメータの合計であることを思い出してください。最初のフリップフロップのクロックから出力までの遅延、伝搬遅延(propagation delay)、2 番目のフリップフロップの tsu です。出力ポートの場合、クロックから出力までの遅延は比較的大きくなります。これは、PCB の配線が要求電圧に達するのにかかる時間だからです。しかし、それだけでは終わりません。クロックスキューやクロックに関連するその他の不確かさも加算する必要があります。すべての数値を合計すると、最小クロック周期はそれほど魅力的ではないかもしれません。
経験則として、システム同期クロックは 100 MHz を超えるデータレートの I/O には適していません。ただし、これはどのコンポーネントを使うかに大きく依存します。実際、一部の電子コンポーネントには、はるかに低い周波数でもシステム同期クロックでは満たすのが非常に難しいタイミング要件があります。そのようなコンポーネントがあることが、PCB を製造する前に I/O タイミングを計画することが重要である理由の 1 つです。
set_input_delay と set_output_delay(これらは次のページで説明します)は、システム同期クロックと一緒に使うのに最も適したタイミング制約です。
ソース同期クロック
PCB 上の 2 つのコンポーネント間のインターフェースは、これらのコンポーネントの一方が供給するクロックに基づいていることがよくあります。当然ながら、そのクロックが FPGA によって生成されるか、外部コンポーネントによって生成されるかで違いがあります。
したがって、関連するシナリオは 4 つあります。
- データとクロックが FPGA によって生成される出力である場合。この比較的簡単なシナリオは、ソース同期出力についてのページで個別に説明します。

- データとクロックが外部コンポーネントによって生成される場合。したがって、FPGA はこれらを入力信号として受信します。ソース同期入力についてのページで、このシナリオを説明します。

- クロックは FPGA によって生成されますが、データは双方向(または入力)です。これはソース同期入力の特別なケースです。FPGA がクロックを生成するという事実は、大きな違いにはなりません。データ入力は PCB 上のクロックと同期します。このクロックは、FPGA 内部のクロックに対して遅延があります。このシナリオの詳細については、ソース同期出力のページを参照してください。

- クロックは外部コンポーネントによって生成され、データは双方向です。FPGA への入力に関しては、これはデータが外部コンポーネントによって生成されるシナリオ(ソース同期クロック)と似ています。FPGA の出力については、外部クロックに同期した通常の出力と同じように動作します。したがって、これらの出力はシステム同期であるかのように配置されます。
非同期入力
一部の入力はクロックに関連付けられていません。たとえば、押しボタン、I2C、RS232、外部コンポーネントからのさまざまなステータス信号は、クロックに同期していません。これらの信号は通常、FPGA 内部のクロックよりもはるかに遅いです。したがって、通常の解決策は、これらの信号をフリップフロップ(できればIOB レジスタ)でサンプリング(sampling)し、通常の論理設計手法を続けることです。
これらの入力は、サンプリングに使われるクロックとは同期していません。したがって、IOB レジスタ(またはポートに接続されたフリップフロップ)は、メタスタビリティガードの役割を果たします。したがって、各ポートには、無関係クロック(unrelated clocks)間のクロックドメイン横断(clock domain crossing)と同様に、2 番目のレジスタを使うべきです。そうしないと、入力信号が遅く、設計が現時点では正しく動作しているように見えても、予測不能で奇妙な動作が発生するリスクがあります。
タイミング制約は、再現性のある動作を保証するように書かれるべきです。フリップフロップが IOB 内に配置されていない場合でも、IOB レジスタと同じガイドラインに従うべきです。さらに安全を期すために、これらのレジスタのメタスタビリティガードとしての役割に関連する専用のタイミング制約を追加することも良い考えです(これは別のページで説明されています)。
フォールスパス
I/O ポートのフォールスパス(false path)は、原理的にはFPGA 内部のパスと同じです。set_false_path コマンドは、特定のポートにタイミング要件を適用しないことを要求するために使われます。
フォールスパスは、FPGA 内部のパスに関してすでに説明しました。同じ論拠に基づき、I/O ポートのフォールスパスの背後にある動機は、主に制約なしパスのリストを空に保つことです。このリストは、ポートにタイミング制約が誤って欠けていることを識別しやすくするため、空であるべきです。
フォールスパスは、ポートのタイミングが完全に無意味な場合にのみ使うべきです。たとえば、LED や DIP スイッチなどです。
SDC 制約の例:
set_false_path -to [get_ports led_0] set_false_path -from [get_ports dip_switch_0]
まとめ
このページでは、FPGA と外部コンポーネントとの間を同期させるいくつかの戦略を概説しました。選択した戦略は、ロジック設計とタイミング制約の両方に影響を与えます。
この知識を身につけた上で、I/O タイミング制約の書き方について説明しましょう。
