このページは、 timingに関する一連のページに属しています。前のページでは、 timing 計算の背後にある理論を説明し、 clock period constraintについて説明し、 timing closureの原理を示しました。 timing constraintsの技術的な詳細から始めましょう。
Tcl コマンドとしての create_clock の意味
これまでのページはすべて、この timing constraintを中心に展開されています。
create_clock -period 4 -name clk [get_ports clk]
これまで、この行の構文については意図的に説明していませんでした。それでは、これが実際に何を意味するのかを説明する時が来ました。
この timing constraint は、 timing constraintsの最も一般的な形式である SDC (Synopsys Design Constraints) 形式で記述されています。 Vivado と Quartus はこの形式を使用し、他のいくつかの FPGA ツールも使用します。
SDC ファイルは本質的に Tclで書かれた script です。したがって、 SDC ファイルの内容は短いコンピューター プログラムであり、単なる情報の集まりではありません。ただし、 script としての SDC ファイルの機能は、 constraintsの書き込みを目的としたコマンドの小さなサブセットに限定されます。 Tcl script で許可されているすべてのことを SDC ファイルで実行できるわけではありません。
create_clock コマンドは、 timing constraintを定義するために使用されます。しかし実際には、このコマンドは FPGA ソフトウェアに新しい clock objectを作成するように指示します。そして、「object」という言葉は、ソフトウェア工学の観点から通常意味するものを意味します。したがって、新しい clock object は、独自の propertiesを持つ object として Tcl interpreterのメモリに格納されるものです。
たとえば、 create_clock コマンドの「-name clk」という部分は、「name」と呼ばれる property に値「clk」を与えます。前のページの 1 つから、この名前が timing reportsで使用されたことを思い出してください。 「clk」という名前は、この constraint のために計算された timing paths (より正確には、この clock objectのために計算されたもの) とともに登場しました。
後で、 clk_out1_clk_wiz_1 や clk_out2_clk_wiz_1など、 clocksの別の名前があることがわかりました。これらは実際には、ツールによって自動的に作成された他の clock objectsの名前でした。
すべての clocksを一覧表示する Tcl コマンドがあります。 get_clocks.したがって、前のページの 2 つの clocks の例では、これは Vivadoの Tcl consoleでのセッションです。
> get_clocks clk clkfbout_clk_wiz_1 clk_out1_clk_wiz_1 clk_out2_clk_wiz_1
get_clocks および同様のコマンドについては、次のページで詳しく説明します。
これらの objectsの properties を表示することも可能です。これらの propertiesのすべてを理解する必要はありません。 clock が objectであることを強調するために、これを示しています。個人的には、 objectの property を直接操作する必要はありませんでした。
> report_property [get_clocks clk] Property Type Read-only Value CLASS string true clock INPUT_JITTER double true 0.040 IS_GENERATED bool true 0 IS_PROPAGATED bool true 1 IS_USER_GENERATED bool true 0 IS_VIRTUAL bool true 0 NAME string true clk PERIOD double true 4.000 SOURCE_PINS string* true clk SYSTEM_JITTER double true 0.050 WAVEFORM double* true 0.000 2.000 > report_property [get_clocks clk_out1_clk_wiz_1] Property Type Read-only Value CLASS string true clock EDGES int* true 1 2 3 EDGE_SHIFT double* true 0.000 2.000 4.000 INPUT_JITTER double true 0.000 IS_GENERATED bool true 1 IS_INVERTED bool true 0 IS_PROPAGATED bool true 1 IS_RENAMED bool true 0 IS_USER_GENERATED bool true 0 IS_VIRTUAL bool true 0 MASTER_CLOCK clock true clk NAME string true clk_out1_clk_wiz_1 PERIOD double true 8.000 SOURCE pin true pll_i/inst/mmcme3_adv_inst/CLKIN1 SOURCE_PINS string* true pll_i/inst/mmcme3_adv_inst/CLKOUT0 SYSTEM_JITTER double true 0.050 WAVEFORM double* true 0.000 4.000
認識すべき重要なことは、 create_clock は単に objectを作成するということです。このコマンドの parameters は、この objectの propertiesを設定する方法のみを決定します。たとえば、「-period 4」と表示されている部分 (繰り返し示した timing constraint 内) は、「PERIOD」と呼ばれる特定の propertyが値 4を持つ必要があることを意味します。
これらの Tcl コマンドを自分で試してみたい場合は、 FPGA ツール間に違いがあることに注意してください。
Vivadoでは、これらのコマンドは Implemented Designを開いた後にのみ実行できます。
Quartusでは、最初に TimeQuest Timing Analyzerを開き、次に Create Timing Netlist、 Read SDC File 、および Update Timing Netlistをクリックします。次に、 Tcl consoleでいくつかのコマンドを試します。たとえば、次のようになります。
> join [ query_collection -all [ get_clocks ] ] "\n" > get_clock_info -waveform [get_clocks clk]
「clock」という言葉の意味
FPGA ツールが "clock" という単語を使用する場合、それは通常、 FPGA内の物理的な signal ではなく、 clock objectを意味します。これは特に timing reportsに当てはまります。
前のページで「理論上の clocks」という用語を数回使用したことを思い出してください。これらは実際には clock objectsです。これらは timing reportでは「clocks」と呼ばれますが、 timing analysis での使用は、それらが単なる情報のコンテナーであることを示しています。
では、これらの clock objects と実際の signalsの間の接続は何ですか? timing analysisにはすでに clock objects の名前があります。これらすべてがどのように連携するのでしょうか?
ツールが designの static timing analysis を実行すると、すべての paths が検査されます。 path が flip-flopで始まる場合、ツールは flip-flopの clock inputに接続されている signal (つまり net) を調べます。 この signalに関連する clock object はありますか?たとえば、 signal が @clkの場合、関連する clock object は、 create_clock コマンドで「clk」という名前が付けられたものです。関連する clock objectを見つけた後、ツールはこの objectの propertiesから必要な情報を取得できます。
pathの最後にある flip-flop でも同じことが起こります。そのため、ツールには pathに対応する 2 つの clock objects があります。これらの objectsからの情報を使用して、ツールは timing analysisを実行します。
そしてもちろん、同じ手順が flip-flopsだけでなく、すべての sequential elementに適用されます。
これを理解することがなぜ重要なのでしょうか。とりわけ、 clockのない registers があると言う timing report の中に error message がある場合があるためです。通常、これは clock inputに何も接続されていない flip-flop があるという意味ではありません。むしろ、これはツールがこの clock inputに関連する clock object を見つけられなかったことを意味します。つまり、ツールはこの flip-flopの clock inputに関する情報を見つけられませんでした。そのため、問題は通常 logic designにはありませんが、 timing constraint がありません (または間違って記述されています)。
これをもう一度言う価値があります: timing reportで「clock」と表示されている場合、それは logic designにその名前の signal があることを意味するのではなく、その名前で clock object が作成されたことを意味します。どの signalかはどのようにしてわかりますか?それが次のトピックです。
これは誰の clock ですか?
timing report を読みにくくするものの 1 つは、 clocksの名前です。 logic design の clock signals のほとんどは PLLによって作成されており、 timing report に表示される名前が役に立たない可能性があることは既に確認済みです。ほとんどの FPGA ツールでは、 SDC ファイルにコマンドを追加することで clock objects の名前を変更できますが、ほとんどのプロジェクトではこれが行われていません。ゴールデン ルール #4は、プロジェクトにとって特別なことは控えることです。
clock のソースが IP block (例えば Gigabit transceiver、 PCIe block または on-chip processor core) である場合、名前の問題はさらに難しくなります。この場合、 clock の名前は、多くの場合、それがどこから来たのか、何に関連しているのかについてほとんど語っていません。
では、この問題はどのように解決されるのでしょうか。 clockの名前が、私たち自身の SDC ファイルの create_clock コマンドに由来する場合の、最も単純な状況から始めましょう。これも同じ timing constraint です。
create_clock -period 4 -name clk [get_ports clk]
このコマンドの最後の部分は「[get_ports clk]」です。 Tcl 言語では、角括弧は、角括弧の内容を Tcl コマンドとして実行し、このコマンドの結果をこれらの角括弧の代わりに使用することを意味します。
get_ports コマンドは、「clk」という名前の I/O port を見つけます。このコマンドの結果は、この portを表す object です。したがって、上記の create_clock コマンドでは、この object はこのコマンドに対する argument です。これが、 create_clock が clock object と実際の signalを接続する方法です。
port の名前と object の名前は両方とも「clk」であることに注意してください。これらが同じである必要はありませんが、同じにすることをお勧めします。 objectの名前は timing reportsに表示されます。したがって、通常は port の名前が最適です。
signalの識別子として net objects と pin objects を使用することもできます。これは、 IP blocksに代わって自動的に生成される timing constraints で一般的です。ただし、自分の constraintsでこれを行う必要があると感じた場合は、何か間違ったことをしている可能性が高くなります。
したがって、 create_clock コマンドが SDC ファイルで使用された場合、 clock object がどの signal に関連しているかを簡単に判別できます。しかし、ツールによって自動的に作成された clock objects はどうでしょうか。
この場合、 clock を認識する最善の方法は、 timing reportを見ることです。たとえば、前のページの例の @pll_clk_8 に関連する clock object はどれですか?確認する簡単な方法は、 timing reportで text search を実行することです。そこで「pll_clk_8」で検索すると、以下の部分が見つかりました。
Location Delay type Incr(ns) Path(ns) Netlist Resource(s) -------------------------------------------------------------- ------------------- (clock clk_out1_clk_wiz_1 rise edge) 16.000 16.000 AG12 0.000 16.000 clk (IN) net (fo=0) 0.000 16.000 pll_i/inst/clkin1_ibuf/I AG12 INBUF (Prop_INBUF_HRIO_PAD_O) 0.738 16.738 pll_i/inst/clkin1_ibuf/INBUF_INST/O net (fo=1, routed) 0.105 16.843 pll_i/inst/clkin1_ibuf/OUT AG12 IBUFCTRL (Prop_IBUFCTRL_HRIO_I_O) 0.049 16.892 pll_i/inst/clkin1_ibuf/IBUFCTRL_INST/O net (fo=1, routed) 0.975 17.867 pll_i/inst/clk_in1_clk_wiz_1 MMCME3_ADV_X1Y0 MMCME3_ADV (Prop_MMCME3_ADV_CLKIN1_CLKOUT0) -4.438 13.429 pll_i/inst/mmcme3_adv_inst/CLKOUT0 net (fo=1, routed) 0.501 13.930 pll_i/inst/clk_out1_clk_wiz_1 BUFGCE_X1Y1 BUFGCE (Prop_BUFCE_BUFGCE_I_O) 0.101 14.031 pll_i/inst/clkout1_buf/O X2Y0 (CLOCK_ROOT) net (fo=1, routed) 1.369 15.400 pll_clk_8 SLICE_X49Y58 FDRE foo_reg_reg/C
これは clk_out1_clk_wiz_1の Source Clock Path であり、質問に対する答えがあります。
別の方法は、 Tcl コマンドで情報を取得することです。これを行う方法は、 FPGA ツールごとに異なります。 Vivadoでは、 Implemented Designを開いた後に次のようなコマンドを使用できます。
> get_clocks -of_objects [ get_nets pll_clk_8 ] clk_out1_clk_wiz_1
この方法では、 netの名前を知っている必要があります。この例のように単純な場合もあれば、この netの名前を見つける必要がある場合もあります。 FPGA ツールは通常、 GUIでこれを行う方法を提供します。この目的で Tcl コマンドを使用することもできます。
実際、 Tcl を使ったいくつかの例で、 Tcl を適切に扱う方法を知ることの重要性を理解していただけたでしょうか。それが次のページです。
get_portを使う意義
上記の例では、 create_clock コマンドは get_port に依存して、 clock object と物理 input pinの間の接続を確立します。前述のように、この接続は、どの logic elements がこの clock (またはそれから生成された clocks ) に接続されているかを知るために必要です。
しかし、 get_port を使用することが唯一の可能性ではありません。たとえば、 global clock bufferの output pin を参照することもできます。このようなもの:
create_clock -name clk -period 4 [get_pins my_BUFG_inst/O]
違いは、ツールが global clock bufferの output pin を clockの起源と見なすことです。つまり、 clock pathsの計算はこの位置から始まります。この原点での最初の clock edge は 0 nsで発生するため、この output pin が時間基準になります。
これは合法的な timing constraintですが、2 つの重要な欠点があります。
- 他のすべての clocksに関して、この clock をunrelated clockと見なすようにツールを要求する必要があります。これは、同じ PLLで生成された clocks にも当てはまります。その理由は、ツールが output pin を時間基準と見なすためです。したがって、 clock path delays に関する clocks 間の違いに対する補償はありません (つまり、 clock skews は考慮されません)。
- FPGAの外部に表示される clock に関連するI/O timing constraintsを定義することは不可能 (または非常に困難) です。これは、そのような constraints が時間基準として clock object に依存しているためです。しかし、繰り返しになりますが、時間基準は global clock bufferの output pinです。外部 clock から global clock buffer への clock skew は不明です (たとえば、温度によって変化します)。
したがって、可能な場合は常に get_port を使用する必要があります。それ以外の場合、 clockの timing は、それ自体以外は不明であると見なされます。
このページでは、多くの Tcl コマンドが提示されましたが、十分に説明されていませんでした。次のページはそのギャップを埋めます。