FC2カウンター FPGAの部屋 Floorplannerの使い方

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

Floorplannerの使い方覚書2

今度は回路ブロックごとにエリアを制約するやり方を勉強。
オートルータで自動配線した結果を見ると、かなりばらばらに配置されている。それでは制限を満たすことが難しいと思われるため回路ブロックごとに領域を決められたら成績が良くなるはずだ。
やり方は、
1.ISEのProcess View -> Translate -> Floorplan Designをダブルクリック。
2.Floorplannerが起動
(ここからXilinxのソフトウェアマニュアルを転載)
3.[Design Hierarchy] ウィンドウで階層グループを選択します。
4.[Floorplan] → [Assign Area Constraint] をクリックします。
5.[Editable Floorplan] ウィンドウで、エリア制約を設定する位置にマウスをドラッグして矩形ボックスを描画します。ボックス内にあるすべてのタイルがエリア制約の対象となります。 エリア制約は、エリア グループに設定された RANGE 制約として UCF に書き込まれます。
(転載終わり)
エリア制約をかけたところ。
ploorplanner_051003.jpg


UCFファイルに書かれた制約。
INST "U_pci2pcicont" AREA_GROUP = "AG_U_pci2pcicont" ;
AREA_GROUP "AG_U_pci2pcicont" RANGE = SLICE_X105Y146:SLICE_X175Y33 ;
AREA_GROUP "AG_U_pci2pcicont" RANGE = RAMB16_X4Y5:RAMB16_X4Y17, RAMB16_X5Y5:RAMB16_X5Y17 ;
INST "U_ddr_cont_inf" AREA_GROUP = "AG_U_ddr_cont_inf" ;
AREA_GROUP "AG_U_ddr_cont_inf" RANGE = SLICE_X1Y191:SLICE_X104Y114 ;
AREA_GROUP "AG_U_ddr_cont_inf" RANGE = RAMB16_X0Y15:RAMB16_X0Y23, RAMB16_X1Y15:RAMB16_X1Y23, RAMB16_X2Y15:RAMB16_X2Y23, RAMB16_X3Y15:RAMB16_X3Y23 ;


これでセーブして、コンパイルする。
これで、指定した領域に回路ブロックがアサインされる。
アサインされたあとのFloorplanはこれ。
ploorplanner_051003_2.jpg


これでタイミング制約が満足できない場合は、Floorplannerの使い方覚書1で、もう一度クリティカルパスをつぶす。エリア制約がかけてあれば、オートルートしてもましだと思う。(確認はしてないけど)
  1. 2005年10月03日 20:46 |
  2. Floorplannerの使い方
  3. | トラックバック:0
  4. | コメント:0

Floorplannerの使い方覚書1

Floorplannerの使い方を勉強中。でその覚書。
5年ほど前、ALTERAのFLEX10Kシリーズで開発していた。使用ツールはMAX+PLUS2だった。動作周波数を満たすことがなかなか難しかったので、フロアプランを使用していた。クリティカルパスを表示して、遅延が大きいLEを同じROWや、同じLABへ移動していた。
その様な使い方をISEでやってみた。
まずはISEでコンパイル。
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"の左の四角で囲ったプラスをクリックすると、制約ごとのタイミング解析結果を展開して表示する。その時に、タイミングを満たしていないパスはで表示される。
さらにその制約(ここではTS_clk = PERIOD TIMEGRP"の部分)の左の四角で囲ったプラスをクリックすると、一番遅延が大きいパス(クリティカルパス)から表示される。ここでもタイミング制約を満足していないパスはで表示される。
でクリティカルパスを確認。
timingana1.jpg


Timing AnalyzerでViewメニューからFloorplanner for crossprobingを選択し、Floorplannerを起動。Timing Analyzerでクリティカルパスの中の一番遅延の大きいネットをFloorplannerで観察する。”net (fanout=9) 2.960 core_mem_wb_dff8_q<4>”をダブルクリックして、Floorplannerを見るとダブルクリックしたネットが表示されている。
floorplanner1.jpg


FloorplannerでFloorplanメニューからReplace All with placementを選ぶと、UCF Flowの方に前にPlace & Routeした配置をコピーすることが出来る。UCF Flowでロジックセルをマウスクリックで移動することが出来る。floorplanner2.jpg


図は選んだロジックセルを移動している所、線はロジックセルへの接続状況を表す。当然ながら、クリティカルパスの線が短くなるように配置する。
これでセーブすると、Floorplanが.fnfファイルへ、制約が.ucfへ書き込まれる。追加される制約は次のようなもの。
INST "core_Inst_alu__n010657_SW01" LOC = "SLICE_X5Y23" ;
INST "core_Inst_pc_lib_etemp21" LOC = "SLICE_X25Y27" ;
INST "core_Inst_pc_lib_dtemp<7>1111" LOC = "SLICE_X25Y32" ;

つまり、どのインスタンスをどこに配置というのが全て書いてある。
これでも一度Place & Routeを実行して、まだだめだったら、もう一度やり直す。
  1. 2005年10月02日 10:26 |
  2. Floorplannerの使い方
  3. | トラックバック:0
  4. | コメント:0