FC2カウンター FPGAの部屋 IOBの入力用FFを活用する

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

FPGAの部屋

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

IOBの入力用FFを活用する

XilinxのFPGAのIOBにビルトインされている出力用FF(フリップフロップ)はFDDRCPEなどを使えば直接インスタンシエーションできるが、IOBの入力用FFを使うときには論理合成ツールに推定させなければいけないので使うつもりでも使えていないときがある。(現在使っているのはVirtex2pro-VP30)
入力用FFを使えればかなりセットアップ時間を安定して稼ぐことが出来るのでなるべく入れて使いたい。通常は下の図のようにMAPのプロパティの"Pack I/O Registers/Latchs into IOBs"で"For Inputs and Outputs"に設定してあってFFがIOBのFFに合う形に書いてあればIOBに入るはずだが、そうならない時もある。これは不確定だがDCMを通していないクロックで使用するFFの時がそうなのだろうか?今回のケースもソースクロックでサンプルするFFの話である。
IOB_FF_0_061008.png

入力パッド後の最初のFFは入力に論理がなく、ただ単に入力パッドの状態を1クロック分ラッチしておくだけである。こんな感じ。
process(reset, rxclk) begin
 if reset='1' then
  rxdata_int <= '0';
 elsif rxclk'event and rxclk='1' then
  rxdata_int <= rxdata; -- 入力パッドから入力
 end if;
end process;

MAPのプロパティの"Pack I/O Registers/Latchs into IOBs"で"For Inputs and Outputs"に設定しただけでは下の図のようにFPGA Editorで見てみるとIOB内の入力用FFを使用していない。
IOB_FF_1_061008.png

この状態でのTiming Analyzerのタイミング解析結果を下に示す。IOBは入力だけで他のスライスにFFをアサインしているのがわかる。
IOB_FF_TA_Tiopi_061008.png

そこでIOB内の入力用FFを使うためにUCFに明示的にIOB内の入力用FFを使うように制約を書いてみる。今回はConstraints Editorを使用してみよう。最初にISEのウインドウ内のProcessesペインのUser Contraintsを展開してCreate Timing Constraintsをダブルクリックする。
IOB_FF_2_061008.png

Constraints Editorが立ち上がるのでMiscタブをクリックする。
IOB Register Control内のSpecify...ボタンをクリック。
IOB_FF_3_061008.png

IOB Register Controlのダイアログが開く。
Available Registers:で必要なレジスタを選択してAddボタンをクリックする。
IOB_FF_4_061008.png

Constraints Editorに戻ると右下のConstraintsペインに制約が追加されている。
IOB_FF_5_061008.png

INST "FFの名前(階層付)" IOB = TRUE;
これでインプリメントしてみた。結果のFPGA EditorでのIOBの様子とTiming Analyzerの結果を下に示す。
IOB_FF_6_061008.png

IOB_FF_TA_Tiopickd_061008.png

これで見るとTiopickdが使用されていてデータの遅延時間が3.732nsとかなり遅くなっている。データシートを見るとどうやらIOBの入力用ディレイが使用されているようだ。おかげでセットアップ時間は1.941nsとなってしまって、規格の1.5nsを満足しなくなってしまった。少なくともVirtex2proではホールド時間を確保するためにDCMが入らない時(たぶん)はIOBディレイが入ってしまうのだろう。(未確認)
次にこれではだめなので、IOBディレイを抜くことにした。今度はUCFを手書きで制約を追加することにする。前回の制約にIOBDELAY = NONEを追加する。
INST "FFの名前(階層付)" IOB = TRUE | IOBDELAY = NONE;
これでインプリメントしてみたところ下の図のようにIOBディレイが削除できた。
IOB_FF_7_061008.png

IOB_FF_TA_Tiopick_061008.png

IOBディレイが削除されデータ入力の遅延はTiopick = 0.847nsだけになった。結果としてセットアップ時間は-0.944nsになった。これだとクロックのほうがデータより遅れているのでホールド時間がきついが、うちのアプリではホールド時間はたっぷり余裕があるので大丈夫だろう。
余裕がない場合はやはりデータ入力用FFをIOBから出してスライスに持っていって遅延を適当に加えるしかないと思われる。その場合は手動でスライスを配置したほうが偏差が少なくてよいかもしれない。
もう1つIOBの入力用FF使用のディレイ有りでクロックを遅延する方法もあった。このほうが1つのクロック入力にLUTディレイを入れればよいので簡単だと思う。
  1. 2006年10月08日 22:09 |
  2. UCFの書き方
  3. | トラックバック:0
  4. | コメント:9

コメント

入力IOBのFFが使用されない件ですが、FFを生成するコードがトップモジュール以外にあって、XSTのオプションが「keep hierarchy = YES」になっている時に発生しました。
Synplifyを使ってらっしゃるので現象は違うかもしれません。
  1. 2006/10/15(日) 02:16:18 |
  2. URL |
  3. windy #JalddpaA
  4. [ 編集 ]

XilinxのFPGAでのタイミング・クロージャの達成手法ですが、どのように習得されましたか?
デバイスのプリミティブ(DCMやBRAM等)の情報は日本語のユーザーガイドに親切丁寧に解説されていますが、タイミングレポートの見方やFPGA Editor・Constraint Editorの使い方に関しては体系的な資料って無いですよね。
やっぱりXilinx主催のセミナーですか?
  1. 2006/10/15(日) 02:20:51 |
  2. URL |
  3. windy #JalddpaA
  4. [ 編集 ]

Synplifyはデフォルトでは階層をキープできる信号ではキープして、キープできない信号はしない様になっています。他のDCM出力のクロックを使用したFFはIOBに入るところは入っているので、DCMを使わないとホールド時間がきついのでデフォルトではプレーサーがIOBにいれないのでは?と思っています。

FPGA Editorは見当がつかなかったので、セミナーに行くまではFPGA内部を見るだけでした。タイミングレポートやタイミングアナライザ、PACE、フロアプランナなどは自分でヘルプを見てトライしています。その結果を忘れないように、このブログに書き込んで後で見えるようにしているわけです。
特にFPGA Editorの使い方は資料がないので資料を残そうと思ったというのもあります。FPGA Editorを使えるようになってデバックが楽になりました。でもFPGA Editor動かすとメモリを食うのでパソコンのメモリは2GBほしくなります。今のノートは1GBなので。。。
  1. 2006/10/15(日) 06:54:32 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

補足しますと1階層下の入力用FFはIOBに入りましたが、3階層下の入力用FFはIOBに入っていません。
1階層下の入力用FFはDCMを使用したクロックですが、3階層下の入力用FFはソースクロックを直接BUFGに入れただけです。
これだけではわからないので後日調査したいと思います。
  1. 2006/10/15(日) 21:19:48 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

今はISE8.2を使っているのですが、いつのまにか日本語ドキュメントがかなり充実していました。
というか、ISEに関してはヘルプもPDFも全部日本語になってますね。
タイミングの確認方法やFPGA Editorについてもヘルプにキッチリ書かれていました。
日本語になっていると楽ですね。
  1. 2006/10/18(水) 00:43:54 |
  2. URL |
  3. windy #JalddpaA
  4. [ 編集 ]

ヘルプ日本語だと助かります。
FPGA Editorはどこをどうしてよいやら見当がつかなかったのでチュートリアルがあったらよいですよね。かなり前のバージョンのチュートリアルがXilinxのサイトにあったと思ったのですが、見つからなくなりました。
Timing AnalyzerもDelay TypeのTiopickdなどをクリックするとブラウザが立ち上がってどこの遅延だよというのをグラフィカルに見えていて助かったのですが、ISE8.2iではエラーで見えなくなりました。残念です。
  1. 2006/10/18(水) 05:50:01 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

IOBDELAYに関して

はじめまして、maeharaと申します。

FPGAに関する勉強サイトとしてコチラを参考にさせて
いただいております。本ページにて紹介されている
「IOBDELAY=NONEを追加してIOBディレイを使用しない」
に関してアドバイスをいただけないでしょうか。

IOBの入力用FF使用、かつ、IOBディレイは使用しない
を試してみようと、以下の制約にてインプリしたところ
IOBディレイが使用されているようにみえます。

ISE : Release 10.1.03 Trace (lin64)
dev : xc5vlx330,ff1760,-1

== UCFファイル一部抜粋 ==
NET "MCLKI" TNM_NET = MCLKI;
TIMESPEC TS_MCLKI = PERIOD "MCLKI" 15.3 ns HIGH 50%;
NET "FPGA_DIN[*]" OFFSET = IN 15 ns BEFORE "MCLKI" RISING;
NET "MCLKI" LOC = J30 |IOSTANDARD = "LVTTL";
NET "FPGA_DIN[0]" LOC = AU24 | IOSTANDARD = "LVTTL";
INST "din_dly1_r_0" IOB = TRUE | IOBDELAY = NONE;
==

Maximum Data Path: FPGA_DIN[0] to din_dly1_r_0
--
AU24.I Tiopi 0.922 FPGA_DIN[0]
FPGA_DIN[0]
FPGA_DIN_0_IBUF
ILOGIC_X0Y32.DDLY net (fanout=1) 5.538 FPGA_DIN_0_IBUF
ILOGIC_X0Y32.CLK Tidockd 0.352 din_dly1_r[0]
din_dly1_r_0
--
Total 6.812ns

FPGA Editorで確認したところIODELAYブロックを通過
しているようです。この結果に関して、制約が不適切である、
別の対応が必要である、結果は妥当であり勘違いである
などアドバイスをいただけないでしょうか。

以上、よろしくお願いいたします。
  1. 2010/04/06(火) 01:19:36 |
  2. URL |
  3. maehara #-
  4. [ 編集 ]

maeharaさん、こんにちは。はじめまして。ブログを読んでいただいてありがとうございます。

>xc5vlx330,ff1760,-1
最大のデバイスですね。完全にお仕事用ですね。お仕事ならば、プロのコンサルタントか代理店のFAEにアドバイスをもらった方が良いと思います。
私がこの情報から原因を考えると、やはりIOBDELAY = NONEでとホールド時間が取れなくなるので、IOBDEALYをツールが入れてしまうのではないか?と思います。P&Rのレポートとかにワーニング出ていませんか?
ISEはバージョンアップするたびに、そういうのに厳しくなっている気がします。たぶん、思わぬ誤動作を防ぐためでしょう?
もしどうしてもやりたいのであれば、環境変数があればそれを設定するか(いまXilinxのサイトを見たらなかったです)、din_dly1_r_0の入力セットアップ時間の制約にVALID制約を追加してみてはどうでしょうか?
http://marsee101.blog19.fc2.com/blog-entry-579.html
  1. 2010/04/06(火) 04:26:57 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

アドバイスありがとうございます。
レポートの確認およびVALID制約を試してみます。
後ほどあらためて伺いたいと思います。
まずはお礼まで。
  1. 2010/04/06(火) 18:00:01 |
  2. URL |
  3. maehara #-
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/326-ace5439c
この記事にトラックバックする(FC2ブログユーザー)