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

このとき、FPGA内で使用されるグローバルクロックは、上の図の赤い線の部分の2つのクロックであって、青い線のクロックはグローバルクロックではなく、ローカルな配線を使用しているため、非常に遅くなってしまったようである。
次の図は、1026ビットのシフトレジスタと、バイナリカウンタをVirtex2Proにインプリメントしたときの合成結果である。

明らかに重い。Localと書かれている点に注目。
これをFPGA Editorで見ると、確かにローカルの配線を使っている。
一方、次の図はCLK0_OUTを使った場合の合成結果である。


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

なお、アンサー#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
| 固定リンク


コメント