FC2カウンター FPGAの部屋 2005年11月17日
fc2ブログ

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

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Floorplannerの使い方覚書3

Floorplannerの使い方覚書1で現在のロジックセルの配置をすべてUCF(制約ファイル)とFNF(フロアプランのファイル)にコピーして、クリティカルパスのみ配置を移動した。
セミナに行ってみると、それはだめといわれてしまった。確かにV2-6000で6%くらいしかロジックを使っていないにもかかわらず、UCFファイルの行数は5000行を越え、容量は390Kbyte以上になっている。全部使うようになったら、UCFは5万行を越えそうである。これじゃだめだ。
それで、クリティカルパスだけUCFとFNFにコピーして、修正したほうが良いとセミナで言っていたのでやってみた。
例によって、インプリメンテーションしてから、タイミングアナライザを起動する。
Process View - Implement Design - Place & Route - Generate Post-Place & Route Static Timing - Analyze Post-Place & Route Static Timing(Timing Analyzer)をダブルクリックして、Timing Analyzerを起動。
ISE_timinga.jpg


Timinig Analyzerが起動する。一番左の時計マークのアイコン"Analyze against Timing Constrains"をクリックする。そうするとあらかじめUCFで制約をかけたパスについてタイミング解析をする。タイミングを満たしていないパスはで表示される。
Timing Analyzer画面の左側のペインの"Timing Constrains"の左の四角で囲ったプラスをクリックすると、制約ごとのタイミング解析結果を展開して表示する。その時に、タイミングを満たしていないパスはで表示される。
さらにその制約(ここではTIMEGRP "clk" PERIOD=の部分)の左の四角で囲ったプラスをクリックすると、一番遅延が大きいパス(クリティカルパス)から表示される。ここでもタイミング制約を満足していないパスはで表示される。
でクリティカルパスを確認。
timing_ana_051116.jpg

Timing AnalyzerでViewメニューからFloorplanner for crossprobingを選択し、Floorplannerを起動。クリティカルパス(赤い四角で囲った部分)をダブルクリック。
Floorplannerをクリックして前面に出すとクリティカルパスが表示される。
floorplanner_051116.jpg

FloorplannerでFloorplanメニューから"Constrain from placemant"を選ぶと、表示されているクリティカルパスだけ別画面のUCF Flowにコピーできる。
floorplanner_2_051116.jpg

現在のUCF Flowの画面には、インプリ前に指定したエリア制約も表示されている。(Floorplannerの使い方覚書2参照)
ロジックセルを移動して、クリティカルパスを改善する。その場合、そのままドラックするとそのまま移動してしまうので、いったんフォーカスをはずしてから、一番長いパスを縮めると良いだろう。(図はクリティカルパスを移動中)
floorplanner_3_051116.jpg

全てのクリティカルパスに操作を行うまで繰り返すか、飽きたら(いい加減20くらいやっていると飽きる)セーブしてもう一度インプリ。
UCF制約ファイルに書かれる例は。
INST "serial" AREA_GROUP = "AG_serial" ;
AREA_GROUP "AG_serial" RANGE = SLICE_X28Y40:SLICE_X37Y30 ;
INST "con" AREA_GROUP = "AG_con" ;
AREA_GROUP "AG_con" RANGE = SLICE_X24Y26:SLICE_X39Y16 ;
INST "iom" AREA_GROUP = "AG_iom" ;
AREA_GROUP "AG_iom" RANGE = SLICE_X30Y15:SLICE_X34Y4 ;
INST "core" AREA_GROUP = "AG_core" ;
AREA_GROUP "AG_core" RANGE = SLICE_X5Y39:SLICE_X22Y9 ;
INST "core/_n02021" LOC = "SLICE_X13Y12" ;
INST "core/_n01231" LOC = "SLICE_X10Y25" ;
INST "core/forbmux<7>_SW2" LOC = "SLICE_X15Y24" ;
INST "core/forbmux<14>_SW2" LOC = "SLICE_X12Y26" ;
INST "core/mem_wb/dff8/q_2" LOC = "SLICE_X8Y17" ;
INST "core/Inst_forwarding/forwardB<0>41" LOC = "SLICE_X14Y19" ;

という感じ。最初はエリア制約。次がロジックセルの位置固定。

この操作はあまりクリティカルパスが多いと、ほかと干渉して結局クリティカルパスが移動するだけの結果になる場合があるようだ。私もサンプルをやってみて、発散して止めてしまった。余りクリティカルパスが多いと、他のパスと干渉してしまうのではないだろうか?
クリティカルパスが少ない場合に有効かもしれない。
後は、クリティカルパスがあるモジュールを特定して、そこだけ配置を固定して、クリティカルパスを修正するという方法が使えるかもしれない。余りにもクリティカルパスが多いと、全部固定するのと変わらなくなるが。。。
やはり、HDLコードの品質が重要ということだろう。#それが一番難しいのだが。。。
  1. 2005年11月17日 20:51 |
  2. Floorplannerの使い方
  3. | トラックバック:0
  4. | コメント:2