01signal.com

clock period constraint、 clock objects

このページは、 timingに関する一連のページに属しています。前のページでは、 timing 計算の背後にある理論を説明し、 clock period constraintについて説明し、 timing closureの原理を示しました。 timing constraintsの技術的な詳細から始めましょう。

create_clock の Tcl commandとしての意味

これまでのページはすべて、この timing constraintを中心に展開されています。

create_clock -period 4 -name clk [get_ports clk]

これまで、この行の構文については意図的に説明していませんでした。それでは、これが実際に何を意味するのかを説明する時が来ました。

この timing constraint は、 timing constraintsの最も一般的な形式である SDC (Synopsys Design Constraints) 形式で記述されています。 Vivado と Quartus は、この形式と、他のいくつかの FPGA toolsを使用します。

SDC ファイルは、本質的には Tclで記述された script です。したがって、 SDC ファイルの内容は短いコンピュータ プログラムであり、単なる情報の集まりではありません。ただし、 script としての SDC ファイルの機能は、 constraintsの書き込みを目的とした commandsの小さなサブセットに限定されています。 Tcl script で許可されているすべてのことを SDC ファイルで実行できるわけではありません。

create_clock command は timing constraintを定義するために使用されます。しかし実際には、この command は FPGA tools に新しい clock objectを作成するように指示します。そして、「object」という単語は、ソフトウェア エンジニアリングの用語で通常意味するものです。したがって、新しい clock object は、独自の propertiesを持つ object として Tcl interpreterのメモリに保存されるものです。

たとえば、 create_clock command の「-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 command があります: 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 および類似の commands については、次のページでさらに詳しく説明します。

これらの 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を作成するだけであるということです。この command の parameters は、この objectの propertiesをどのように設定するかを決定するだけです。たとえば、「-period 4」という部分 (繰り返し示した timing constraint 内) は、「PERIOD」と呼ばれる特定の propertyが値 4を持つ必要があることを意味します。

これらの Tcl commands を自分で試してみたい場合は、 FPGA toolsとの間に違いがあることに注意してください。

Vivadoでは、これらの commands は Implemented Designを開いた後にのみ使用できます。

Quartusでは、まず TimeQuest Timing Analyzerを開き、次に Create Timing Netlist、 Read SDC File 、 Update Timing Netlistをクリックします。次に、 Tcl consoleで commands を試します。例:

> join [ query_collection -all [ get_clocks ] ] "\n"
> get_clock_info -waveform [get_clocks clk]

「clock」という言葉の意味

FPGA tools が「clock」という単語を使用する場合、それは通常、 clock objectを意味し、 FPGA内の物理的な signal を意味するものではありません。これは特に 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 commandとともに「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 tools では、 SDC ファイルにコマンドを追加することで clock objects の名前を変更できますが、ほとんどのプロジェクトではこれが行われません。そして、黄金律 #4は、プロジェクトに特有のものを控えることです。

clock のソースが IP block (例えば Gigabit transceiver、 PCIe block または on-chip processor core) である場合、名前の問題はさらに難しくなります。この場合、 clock の名前は、多くの場合、それがどこから来たのか、何に関連しているのかについてほとんど語っていません。

では、この問題はどのように解決されるのでしょうか? まず、 clockの名前が、独自の SDC ファイル内の create_clock command から取得されるという最も単純な状況から始めましょう。これは、再び同じ timing constraint です。

create_clock -period 4 -name clk [get_ports clk]

この command の最後の部分は「[get_ports clk]」です。 Tcl 言語では、角括弧は括弧の内容を Tcl commandとして実行し、この command の結果をこれらの括弧の代わりに使用することを意味します。

get_ports command は、「clk」という名前の I/O port を見つけます。この command の結果は、この portを表す object です。したがって、上記の create_clock command では、この object はこの commandの argument です。このようにして、 create_clock は clock object と実際の signalを結び付けます。

port の名前と object の名前は両方とも「clk」であることに注意してください。これらが同じである必要はありませんが、同じにすることをお勧めします。 objectの名前は timing reportsに表示されます。したがって、通常は port の名前が最適です。

signalの識別子として net objects と pin objects を使用することもできます。これは、 IP blocksに代わって自動的に生成される timing constraints で一般的です。ただし、自分の constraintsでこれを行う必要があると感じた場合は、何か間違ったことをしている可能性が高くなります。

したがって、 SDC ファイルで create_clock command が使用された場合、 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 であり、質問に対する答えがあります。

もう 1 つの方法は、 Tcl commandを使用して情報を取得することです。これを行う方法は、 FPGA tool ごとに異なります。 Vivadoでは、 Implemented Designを開いた後、次のような command を使用できます。

> get_clocks -of_objects [ get_nets pll_clk_8 ]
clk_out1_clk_wiz_1

この方法では、 netの名前を知っている必要があります。この例のように簡単な場合もありますが、この netの名前を見つける必要がある場合もあります。 FPGA tools では通常、 GUIを使用してこれを行う方法を提供しています。この目的で Tcl commands を使用することもできます。

実際、 Tcl を使ったいくつかの例で、 Tcl を適切に扱う方法を知ることの重要性を理解していただけたでしょうか。それが次のページです。

get_portを使う意義

上記の例では、 create_clock command は 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 つの重要な欠点があります。

したがって、可能な場合は常に get_port を使用する必要があります。それ以外の場合、 clockの timing は、それ自体以外は不明であると見なされます。


このページでは、 Tcl commands が多数紹介されましたが、十分な説明がありませんでした。次のページでそのギャップを埋めます。

このページは英語から自動翻訳されています。 不明な点は元のページを参照してください。
Copyright © 2021-2024. All rights reserved. (b4b9813f)