FC2カウンター FPGAの部屋 2005年12月27日
FC2ブログ

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

FPGAの部屋

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

論理シミュレーション時のバグ

”Chipscopeのクロックの配置について”でバグがあってChipscopeを入れてみたのだが、シミュレーション時のVHDL記述に問題があることがわかった。
論理シミュレーション時には、検証回路(FPGA)をテストベンチでSDRAMモデルやその他の外部回路と接続している。原因としては、SDRAMモデル(簡易モデル)からの出力を0ディレイで検証回路に結んだのが原因だったようだ。
論理シミュレーション時に最初のSDRAMのデータを受けるフリップフロップが、受けたデータをそのまま(1クロック遅延しないで)出力するようになってしまっていた。
検証回路をつないで論理シミュレーションした時に、あれ?1クロック早いんだっけとよくも考えないで1クロックディレイしてしまったので、インプリメント後のFPGAの動作は1クロック遅れてしまっていた。
原因としては、クロックはDCMを使っているので、デルタ遅延が大きいのかも?
データはそのまま0ディレイで入れちゃったので、データが出たクロックでラッチしてしまったのかな?
本当はテストベンチの方に遅延を入れるのだが、書き直すのが面度いので、SDRAMのデータを受けるフリップフロップに入れてしまった。こんな感じ。
data_delay <= data
-- pragma translate_off
after 100 ps
-- pragma translate_on
;

よくわからないが、入力データは遅延しておいた方がいいようだ。
でも同じようなテストベンチで大丈夫なのもある。何か、アドバイスがあったらお願いします。

2006/02/10追記:データとクロックが同時に変化するようだと上のような現象になることがあるそうである。データをクロックより明示的に少し遅らせなければならないそうである。
Xilinxのアンサーはここ
  1. 2005年12月27日 14:58 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

Chipscopeのクロックの配置について

前回、BUFGMUXの配置方法で、BUFGMUXを配置したが、回路にバグがありChipscopeを入れて検証することになった。しかし、最初にChipscopeを入れたらトリガがかからず、波形を表示しようとしても波形が表示できない。これは困るので、どうなっているか解析してみることにした。
FPGA Editorで見てみると、Chipscopeで使われるBSCANユニットは、Virtex2-3000ではチップの右上端にある。最初にChipscopeを入れたものでは、チップ下側のBUFGMUXを使用していたので、BSCANユニットのDRCLK1からBUFGMUXに行くまでのパスが長く、7.694nsかかっていた。
FPGA_Editor_BSCAN_1_051226.png

次に、このネットがBUFGMUXを通過した後のネット(icon_control0<0>)の遅延は1.529nsから11.365nsの間でばらついている。グローバルクロック配線を使えているところもあるが、使えていないところもあるようだ。グローバルクロック配線の配線リソースの制限のためと思われる。
FPGA_Editor_BSCAN_2_051226.png

Chipscopeの動作がおかしいのはBSCANのDRCLK1からBUFGMUXまでの経路の遅延7.694nsとBUFGMUX0Pからのクロック遅延最大11.365nsが大きすぎるのが問題ではないかと考えた。
図3にクロック遅延が最大のスライス(actreset_pulse)付近のクロック配線図を示す。図3で赤いスライスがクロック遅延11.365nsのスライスである。
FPGA_Editor_BSCAN_3_051226.png

下図に最小クロック遅延のBRAM付近のクロック配線図を示す。図4で赤いBRAMがクロック遅延1.529nsのBRAMである。
FPGA_Editor_BSCAN_4_051226.png

次にChipscopeのクロック配線も考慮してBUFGMUXを使用する。チップ上側のBUFGMUXに空きをつくり、BSCANから短い遅延で配線できるようにした。(本当はChipscopeのクロック配線も制約ファイルで固定すれば良いと思う) また、反対側のBUFGMUXになるべく関係ないクロックを割り当てた。結果はChipscopeのクロック配線がうまくグローバルクロック配線を使用できるようになったが、rxclk1がグローバルクロック配線からはじき出され、ローカル配線を使用するようになってしまった。
図5に改良版のBSCANのDRCLK1からBUFGMUXまでの配線を示す。この配線の遅延は3.152nsで、以前の配線より4.542ns遅延が少なくなっている。
FPGA_Editor_BSCAN_5_051226.png

BUFGMUXの出力のネットicon_control0<0>は1.543ns~1.746ns位に収まるようになった。グローバルクロック配線を使えているようだ。
FPGA_Editor_BSCAN_6_051226.png

以前、クロック遅延が最大だったスライス(actreset_pulse)付近のクロック配線を図7に示す。今回のクロックの遅延時間は1.692nsである。前回は11.365nsなので、9.673ns改善している。
FPGA_Editor_BSCAN_7_051226.png

以上のように変更した所、Chipscopeは正常に動作するようになった。
どのくらいクロックが遅延すると動作しなくなるかはわからないが、やはり遅延が大きいとChipscopeの動作が不安定となるようだ。Chipscopeのクロックもグローバルクロック配線を使うようにしたほうが安定動作が望めると思う。
このようにChipscopeも所詮FPGAに組み込まれた1回路なので、他の自分で作った回路のような配慮も必要であるようだ。リソースがあまっていて、Chipscopeの影響がないようにしたいならば、全ロジック素子をロックしておかなければいけないのだろう。
  1. 2005年12月27日 06:01 |
  2. Chipscope
  3. | トラックバック:0
  4. | コメント:0