FPGAの部屋

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。ご利用ください。 http://marsee101.web.fc2.com/index.html

カテゴリ: Timing Analyzerの使い方

ISE9.2iでのTiming Analyzerの起動方法を解説しようと思う。ISE8まではTiming Analyzer単体で起動していたが、ISE9.2iではISEに統合されて起動する。
ISE92_Timing_Analyzer_1_080215.png

1.最初にISE9.2iでImplement Designを行う(ダブルクリックする)。
2.ProcessesペインのImplement Designを展開して、その中のPlace & Routeを展開する。
3.Generate Post-Place & Route Static Timingを展開して、Analyze Post-Place & Route Static Timingをダブルクリックする。

そうするとTiming Analyzerが立ち上がる。
この状態では、すでに静的にタイミングを解析した結果を表示する。エラーがあるときは、タイミングパスを表示する。
bada1606.png


しかし、タイミングが満足しているときにはタイミングパスを表示しない。
c1ac1cca.png


上の図では

TS_dcm_module_inst_clk_node = PERIOD TIMEGRP
"dcm_module_inst_clk_node" TS_dcm_module_inst_clk200_node HIGH 50%;


という制約は、9413 items タイミング解析してエラーなしで、最小クロック周期は 4.948ns だと書いてある。しかし、クリティカルパスがどこなのかはレポートがない。
そういうときには、Analyze against Timing Constraints アイコンをクリックすると、静的タイミング解析を行う。デフォルトでは3つのタイミングパスを解析する。
ISE92_Timing_Analyzer_3_080215.png

表示されたら、Sourcesペインの四角+をクリックするとタイミングパスを表示する。それをクリックするとタイミングの内訳が右のペインに表示される。
6e36497f.png


なおデフォルトが3なので、3つしかタイミングパスを表示しないが、メニューからAnalyze against Timing Constraints...を実行すると、解析するタイミングパスの個数を指定できる。
やり方は、AnalyzeメニューからAnalyze against Timing Constraints...を選択する。
ISE92_Timing_Analyzer_5_080215.png

Analyze against Timing Constrainsダイアログが開くので Options タブをクリックする。
ピンクの四角のところの3を任意の数字に変えると、その数分だけタイミング解析をしてくれる。たとえば10と入れれば、10個のタイミング解析をしてくれる。
ISE92_Timing_Analyzer_6_080215.png

下の図は10でやってみたところ。
b27e5749.png


さらに、Analyze against Timing Constrainsダイアログが開くので Options タブをクリックした状態で、Report fastest paths/verbose hold paths をチェックして解析をするとセットアップ時間と一緒にホールド時間も解析される。
ISE92_Timing_Analyzer_8_080215.png

結果はこれ。
56ea9a7d.png



皆さん、ご存知かもしれませんが、いろいろタイミング解析をやってみてください。

前回2回はISEで任意のパスのディレイを見る方法というよりは、クロックパスディレイを見る方法といったほうが良いような内容になってしまった。
でも、普段なかなか見ることが出来ないクロックパスディレイについて、確認できたのではないだろうか?
Timing AnalyzerのAnalyze against Users Paths by defining Endpointsを使用すると、非同期回路の入力パッドから出力パッドまでの遅延も見ることが出来る。LUTを使用したディレイがどの位遅延しているかも。実際に解析したときの結果が過去のブログのここに書いてある。
LUTを使用したディレイ回路を通ってFFに入っているのならば、クロックと同様に入力パッドからFFまでを遅延解析すれば良い。
今までは、ディレイの値はXilinxの保証値だったので、実際の遅延時間はどのくらいかという疑問がわくと思う。それも過去のブログで書いてあるので、そっちを参照してほしい。それは、FPGAの性能だ。以前の結果によると、実測値から計算される遅延量はTiming Analyzerによる保証値の70%だった。(ただし、この結果を元に失敗しても保障は出来ない。あくまで、私の持っているSpartan3のそのときの温度における結果がこうだったというだけだ)
今回はFPGA Editorで見ても、余り面白くなかったので、これにて終了とする。
最後に”ISEで任意のパスのディレイを見る方法2”で使用したxc3s200のフロアプランしてあるプロジェクトとxc3s1500のフロアプランしてあるプロジェクトをダウンロードできるようにしておくので、興味のある方はどうぞ。ここここです。

今回はFPGA Editorを使ってみようと思ったが、とりあえずFloorplannerで見てみよう。ISEのProcess View - Implement Design - Place & Route - View/Edit Placed Design (Floorplanner)をダブルクリックして、Floorplannerを起動。
右側のPlacementウインドウを見てみよう。赤丸の中、チップの下のほうにCLKパッドがある。SW入力パッドは右真ん中のあたり。いくらもロジックが無いので、チップの右真ん中のあたりに固まっている。(下図参照)
78732d85.png


Inst_ssgdisp_FreqDivi_lcnt_12を表示してみよう。右上のHierarchyウインドウのdynadisp_test "Primitives"を展開すると、Inst_ssgdisp_FreqDivi_lcnt_12がある。クリックすると、Placementウインドウに斜線でハッチングされて表示される。(図は拡大している)
4fcefffb.png


同様にswl_3をクリックすると出てこない。FPGA Editorでみると、IOパッド内のInputレジスタを使用しているようだ。Floorplannerでも片鱗が見える。SW3パッドを見ると、IQ1としてswl<3>がマップされている。FloorplannerでのIOBレジスタのマップ状況の見方はいまいち良くわからない。
0d3bfbea.png


次に、FPGAチップ内で、どの位クロックディレイに差があるか調べてみよう。いい加減な方法だが、適当にFloorplannerでFFの配置を移動して調べてみようと思う。やり方は以前このブログで紹介したので割愛するが、"Floorplannerの使い方覚書1"を見てほしい。(FloorplannerはTiming Analyzerからのクロスプローブで立ち上げないで、この前のように単体で立ち上げる)すべてのロジックをUCF Flowにコピーする。適当にInst_ssgdisp_FreqDivi_lcnt_11、Inst_ssgdisp_FreqDivi_lcnt_12を動かしてみた。
36e3f5ff.png


これでセーブして、コンパイルし、クロックディレイを観察してみよう。
Timinig Analyzerを起動しよう。
例によって、Process View - Implement Design - Place & Route - Generate Post-Place & Route Static Timing - Analyze Post-Place & Route Static Timing(Timing Analyzer)をダブルクリックして、Timing Analyzerを起動。起動したら、ツールバーの右から5番目の砂時計マーク(Analyze against Users Paths by defining Endpoint)をクリックする。
下図のようなダイアログが開く。
9742b6a3.png


前回と同様にSourcesにclkを入れる。DestinationsにはInst_ssgdisp_FreqDivi_lcnt_10、Inst_ssgdisp_FreqDivi_lcnt_11、Inst_ssgdisp_FreqDivi_lcnt_12を入れよう。
それでOKボタンを押す。
5f38193c.png


ディレイを計算して表示する。
d60bb3f3.png


その結果、Inst_ssgdisp_FreqDivi_lcnt_10だけclkパッドからFFまでのディレイは2.952nsで、他のディレイは2.950nsだった。2psしか変わらない。
今まではxc3s200だったが、今度はxc3s1500と大きなFPGAにしてやってみよう。
さっきと同様にFloorplannerでInst_ssgdisp_FreqDivi_lcnt_11、Inst_ssgdisp_FreqDivi_lcnt_12を動かしてみた。下の図はその位置。
278577bf.png


さっきと同様に、clkパッドからInst_ssgdisp_FreqDivi_lcnt_10、Inst_ssgdisp_FreqDivi_lcnt_11、Inst_ssgdisp_FreqDivi_lcnt_12間での遅延を見てみる。
923e27ca.png


そうするとclkパッドからInst_ssgdisp_FreqDivi_lcnt_11が2.355ns、Inst_ssgdisp_FreqDivi_lcnt_10が2.189ns、Inst_ssgdisp_FreqDivi_lcnt_12が2.172nsとなった。Inst_ssgdisp_FreqDivi_lcnt_11とInst_ssgdisp_FreqDivi_lcnt_12間のクロックスキューは183psとなった。これは適当にFFを配置しているので、確かなことはいえないが、大きいFPGAはクロックスキューも大きくなる傾向のようだ。チップが大きいので当たり前だが。。。もっと大きくなると、もっと顕著になる。大きいFPGAを速く動かすのは難しいと言えよう。

ISE7.1iで任意のパスのディレイを見る方法を紹介しようと思う。
サンプル回路は7セグメントLEDのダイナミック点灯の回路。サンプルはここにあります。
ファイルをダウンロードするとdynadisp_test_1ms.ZIPというファイルが出てくる。これをWindows XPだったらダブルクリックで、それ以外だったらソフト(Winzip等)を使って解凍する。
解凍すると、dynadisp_testというフォルダが出てくる。それを開けるとVHDLファイルとまたdynadisp_testというフォルダが出てくる。そのフォルダをまたダブルクリックすると、ISEのプロジェクトファイルdynadisp_test.iseがあるので、それをダブルクリックしてISEを起動する。
そうすると、すでにコンパイル済みのプロジェクトが出てくるので、"Processes for Source"の"Synthesize-XST"を展開して、"View Technology Schematic"をダブルクリックする。(下図参照)
65a94a6a.png


そうすると、一番上の回路図が出てくる。ここで、赤丸の所のアンドックアイコンをクリックして、ISEの外に出そう。(下図参照)
5f421d1f.png


下の図のウインドウが開く。これは一番トップの回路図。赤い矢印のところをダブルクリックすると、下の回路図が開く。
1e719dbd.png


Spartan3のテクノロジにマッピングした回路図が出てくる。(下図参照、注:下図の回路図は上図をクリックしてから、拡大して位置を調整してあります)
6c7abbe8.png


CLKから線がつながっている箱がBUFGだ。クロックがファンアウトが大きいのでそれ用のバッファ。黄色いダイアログがプロパティ。赤い線がネットで名前はclk_BUFGPである。
今度は、Inst_ssgdisp_FreqDivi_lcnt_12とswl_3のDフリップフロップを見てみよう。
bfc0d3d3.png


c7056171.png


検索するには左下のInstance ContentsペインからInstancesを展開するとインスタンスがあるので、swl_3とかをクリックすると右の回路図に赤でインスタンスが表示される。
これを覚えておいて、次にTiminig Analyzerを起動しよう。
例によって、Process View - Implement Design - Place & Route - Generate Post-Place & Route Static Timing - Analyze Post-Place & Route Static Timing(Timing Analyzer)をダブルクリックして、Timing Analyzerを起動。起動したら、ツールバーの右から5番目の砂時計マーク(Analyze against Users Paths by defining Endpoint)をクリックする。
下図のようなダイアログが開く。
9742b6a3.png


ここではclkパッドから上で見たInst_ssgdisp_FreqDivi_lcnt_12とswl_3のDフリップフロップまでのクロックパスのディレイを見てみよう。
Find whatのテキストボックスに正規表現で名前を指定してもいいが、今回は数が少ないので左下のResourcesペインからPadsを展開しよう。そうすると、clkパッドがある。clkをクリックして、右真ん中のSourcesペインの>ボタンをクリック。Resourcesの1行目にclkが入る。
次に左下のResourcesペインからFlip-Flopsを展開しよう。Inst_ssgdisp_FreqDivi_lcnt_12を見つけて、クリック。右下のDestinationsペインで>ボタンをクリックすると、同様にResourcesの1行目にInst_ssgdisp_FreqDivi_lcnt_12が入る。同様にswl_3もDestinationsペインの2行目に入れる。
a936bb55.png


OKボタンをクリックすると、ディレイを計算して表示する。
b8e21b10.png


赤で囲んだのがclkパッドからswl_3フリップフロップまでのディレイ、緑で囲んだのがclkパッドからInst_ssgdisp_FreqDivi_lcnt_12フリップフロップまでのディレイ。それぞれ2.991nsと2.952nsで異なっている。何が違うかというと、clk_BUFGPネットが1.051nsと1.012nsで違っている。これはグローバルバッファのネットである。このようにフリップフロップによっては、クロックのスキューが生じる。
これ以上はFPGA Editorでなければ視覚的にわからない。今日はここまでだが、FPGA Editorでどう見えるかも紹介したい。

↑このページのトップヘ