« ESECに行けない | トップページ | 技術士第二次試験の受験票届く »

2005.07.06

IBUFGとBUFGの違い

IBUFGというコンポーネントがあるが、IBUFGとBUFGは全く別物で、IBUFGの出力はBUFGの出力(グローバルクロック)にはならないようだ。
つまり、
IBUFG≠IBUF+BUFG
である。
少なくとも、Spartan2とSpartan3とVirtex2Proではそうなった。

なぜこんなことが気になったかというと、CoregenでDCMを合成すると、CLKIN_IBUFG_OUTとCLK0_OUTという同じ周波数の2つの出力が作られる。
ここで、CLK0_OUTを使っていればよかったのだが、CLKIN_IBUFG_OUTを使ってしまった。

そして次の図のような回路を組んだときに、下側の青いクロックで組んだ回路のスキューが非常に大きく、ハマったからである。(ハマりの詳細については前回と前々回を参照)

ibufg1

このとき、FPGA内で使用されるグローバルクロックは、上の図の赤い線の部分の2つのクロックであって、青い線のクロックはグローバルクロックではなく、ローカルな配線を使用しているため、非常に遅くなってしまったようである。

次の図は、1026ビットのシフトレジスタと、バイナリカウンタをVirtex2Proにインプリメントしたときの合成結果である。

ibufg2

明らかに重い。Localと書かれている点に注目。
これをFPGA Editorで見ると、確かにローカルの配線を使っている。

一方、次の図はCLK0_OUTを使った場合の合成結果である。

ibufg3

ibufg4

今度はBUFGMUX7Sと書かれている点に注目。

さらに、次のリストのようにDLLやDCMを使わない場合であっても、クロックの入力をIBUFGに通したけどBUFGを通さない場合、この場合も遅いローカル配線に接続されてしまうようである。

ibufg5

なお、アンサー#5304によれば、IBUFGはDLLまたはBUFG専用の入力信号であって、DLL への入力として使用されていない場合は、遅延が増加することがあるそうである。確かに実感。
http://www.xilinx.co.jp/xlnx/xil_ans_display.jsp?iLanguageID=2&iCountryID=2&getPagePath=5304

アンサー#11756には、IBUFG→DCM→BUFGというクロックの構造が描かれている。
http://www.xilinx.co.jp/xlnx/xil_ans_display.jsp?iLanguageID=2&iCountryID=2&getPagePath=11756

ところで、FPGAエディタでいくら見てもIBUFGの正体が見えない。その配線は単なる入力パッドからの出力であって、通常の配線と何らと変わらないように見える。ロングラインすら使われていない。
IBUFGの出力というのは、実装上は、DCM(DLL)やBUFGの入力やRocketIOのREFCLKのどれかにつなぐためのローカルな配線なのだろうか。

今回は、クロック入力にIBUFGだけを使うと、かえってパフォーマンスが悪くなるという教訓を得た。IBUFGはBUFGとセットで使わなければならないようである。

※検証に使ったツール ISE6.2

|

« ESECに行けない | トップページ | 技術士第二次試験の受験票届く »

コメント

コメントを書く



(ウェブ上には掲載しません)




« ESECに行けない | トップページ | 技術士第二次試験の受験票届く »