SDCを使ったタイミング制約を押さえよう:必修! FPGAタイミング解析の基礎(2)(1/3 ページ)
回路設計におけるタイミング制約に悩む人も多いだろう。今回は実際の回路を例に取り、SDCを使ったタイミング制約を解説する。
前回は、タイミング解析の基本的な考え方や用語について説明をしました。今回からは、実際の回路のタイミングを、SDC(Synopsys Design Constraints)により制約する方法を解説します。
必要なタイミング制約は?
初めて回路の設計をしたときに、どれだけのタイミング制約をすればいいかで、悩んだことはないでしょうか?
この答えは、「少なくとも回路内のすべてのパスに対して」です。制約されていないパスが回路内にあれば、設計が完了したとはいえません。回路によっては、タイミングの考慮が不要なパスがあるかもしれませんが、その場合には、必ずフォルス・パス(False path)の制約をします。そうしないと、合成や配置・配線ツールは、本来は必要のないタイミングを満たそうとして、無駄に時間を使ったり、本当にタイミングを満たしたいパスを最適化できなくなったりします。
回路内のすべてのパスは、次の4つに分類できます(図1)。
- FFから、FFへのパス
- 入力ポートから、FFへのパス
- FFから、出力ポートへのパス
- 入力ポートから、出力ポートへのパス
4番目は同期パスではないので特殊ですが、最初の3つは、クロックを定義するのが第一段階となります。次にクロックの定義方法を見ることにします。
クロックの種類
タイミング制約をする上で、クロックは3種類に分類できます。基本クロック(Base Clock)、派生(生成)クロック(Generated Clock)、仮想クロック(Virtual Clock)です。
- 基本クロック
FPGAポートから入力されたクロックなど、他のクロックとは独立して生成されたクロックを指します。 - 派生クロック
回路内の分周レジスタやPLLによって、他のクロックを元に作られたクロックを指します。 - 仮想クロック
回路内には存在しないクロックです。入出力の制約をするときに使います。
また、クロックは互いに、同期(Synchronous)、非同期(Asynchronous)、排他(Exclusive)のいずれかの関係にあります。
- 同期関係
2つのクロックの位相に関連があり、その間にデータ・パスがあれば、タイミングの解析が必要になります。 - 非同期関係
2つのクロックの位相を無関係と見なしてよい場合で、その間のデータ・パスのタイミングは解析する必要がありません。 - 排他関係
2つのクロックが同時には有効にならない場合で、その間のデータ・パスのタイミングは解析する必要はありません。
基本クロックを定義する
図2に示す回路で、ターゲットのFPGAには100MHzのクロックが入力されています。これは基本クロックとして、次のように定義します。
create_clock -name clkin -period 10 [get_ports CLKIN]
- 「create_clock」コマンドは、基本クロックや仮想クロックを定義するのに使います。
- 「-name」オプションは、クロックの定義名を指定します。ここで定義した名前をSDC制約内の別の場所で使うことができます。
- 「-period」オプションは、クロックの周期を定義します。100MHzなので、10(ns)を指定しています。
- 最後にクロックを定義する対象ノードを指定します。この例では、「get_ports」コマンドを使って、「CLKIN」という名前のFPGAポートを指定しています。
- get_ports, get_pins, get_nets, get_cellsコマンドは、指定のパターンにマッチするノード名の集合(Collections)を返します。[](ブラケット)はコマンド置換の機能を持つため、この中にコマンドを書くと、コマンドの実行結果を書くのと同じ意味になります。
派生クロックを定義する
この基本クロックを基に、FPGAの内部で分周FFを使って、50MHzのクロックが生成されています。これは派生クロックとして、次のように定義します。
create_generated_clock -name divclk -source [get_ports CLKIN] \ -divide_by 2 [get_pins DIVFF|regout]
- 「create_generated_clock」コマンドは、派生クロックを定義するのに使います。
- 「-name」オプションは、クロックの定義名を指定します。
- 「-source」オプションは、派生クロックの元になるクロックを指定します。元のクロックの定義名ではなく、ノードを指定します。
- 「-divide_by」オプションは、元のクロックに対する分周率を指定します。この例では、2分周なので、2を設定しています。
- 最後にクロックを定義する対象ノードを指定します。この例では、「get_pins」コマンドを使って、「DIVFF|regout」というFFの出力ピンを指定しています。
- コマンドの途中で改行する場合には、バックスラッシュ(またはエンマーク)を行の最後に置きます。
Copyright © ITmedia, Inc. All Rights Reserved.