この前から悩んでいることが検証できたので、覚書。
使用デバイスはVirtex2の1000-6-FG456。
回路はPCIバスのインターフェースとSDRAMやPowerPCインターフェース回路などが集まった回路。
FPGAのクロックはPCIバスの66MHzクロックから取って、DCMへ入力、それをFPGA全体のクロックとして使用している。もう1つのDCMを使用し、FPGAの外部にクロックを出力。PowerPCやSDRAMなどに供給している。
そういう回路で、ISE6.3で以前にコンパイルした回路を、再度コンパイルするとセットアップ時間やクロックからの出力時間がおかしくなるという現象があった。
以前のものは
COMP "ad(0)" OFFSET = OUT 6 nS AFTER COMP "clk" | 6.000ns | 5.204ns | 1
--------------------------------------------------------------------------------
COMP "ad(0)" OFFSET = IN 3 nS BEFORE COMP "clk" | 3.000ns | 2.064ns | 1
--------------------------------------------------------------------------------
COMP "ad(1)" OFFSET = OUT 6 nS AFTER COMP "clk" | 6.000ns | 5.226ns | 1
--------------------------------------------------------------------------------
COMP "ad(1)" OFFSET = IN 3 nS BEFORE COMP "clk" | 3.000ns | 1.402ns | 1
こんな感じである。ちなみに回路はPCIバス64ビット66MHzなので、セットアップ時間が3ns、クロックからの出力時間が6nsである。
これが新たにコンパイルすると、
* COMP "ad(0)" OFFSET = OUT 6 nS AFTER COMP "clk" | 6.000ns | 6.224ns | 1
--------------------------------------------------------------------------------
COMP "ad(0)" OFFSET = IN 3 nS BEFORE COMP "clk" | 3.000ns | 0.179ns | 1
--------------------------------------------------------------------------------
* COMP "ad(1)" OFFSET = OUT 6 nS AFTER COMP "clk" | 6.000ns | 6.296ns | 1
--------------------------------------------------------------------------------
COMP "ad(1)" OFFSET = IN 3 nS BEFORE COMP "clk | 3.000ns | 0.721ns | 1
このようにセットアップ時間が小さくなって、クロックからの出力時間が伸びて、規格をオーバーしてしまった。
明らかにクロックのディレイが増えてしまった。何でだかわからずに、FPGAエディタを見てみると、CLK入力からBUFGMUXまでの経路がぜんぜん違うことに気が付いた。
ちなみにHDLソースは、CLK入力からIBUFGプリミティブに接続し、それをリセット回路とDCMに入力している。
リセット回路が入っているわけは、PCIバスのクロックはホスト・パソコンがリセットされる時に1msほど、PCIクロックが停止するマザーボードがあった。そのようなマザーではDCMをリセットしなければクロックがおかしくなる。DCMリセット後はDCMのクロック波形が安定するのを待って、その他の回路のリセットを開放する。その場合に普通はDCMのLOCKED信号が1になるタイミングでその他の回路のリセットを放すわけだ。
だが、それではどうしても不都合が生じてしまった。それで、DCMを一定時間リセットしてから、10ms(これはデータシートに書いてあるDFSのクロックが安定する最大の時間)後にDCM以外の回路のリセットを放すようにしてあるのだ。これで不都合は解消され、うまく動作している。
以上のような動作をするリセット回路を作って入れてある。リセット回路はDCMからのクロックで動くわけに行かないので、CLKパッドから直接入力されたクロックで動作する。
前振りが長くなってしまったが、前者のFPGAエディタの経路。

赤い線の配線の遅延は0.143ns。VHDLソースにBUFGは入っていないが、どれかのツールが自動的に入れてくれたようだ。つまりCLK入力パッドからIBUFGを経由してBUFG(BUFGMUX)に、そこからリセット回路とDCMに入力される。BUFGへの入力配線を赤でハイライトしてみているわけ。BUFGからの出力は表示していないが、実はリセット回路とDCMにつながっている。つまり余計な配線は全て消して表示しているので注意。
後者のFPGAエディタの経路。

配線遅延は1.467ns。配線遅延が大幅に増えている。
大きな白線の中が黒い箱と細長い白線の中が黒い箱はスイッチボックスで配線を切り替えるところ。無駄に回っているのがわかる。配線がないのだろうか?
以前コンパイルした回路はBUFGMUX7Pを使用していて、今回、コンパイルした回路はBUFGMUX5Pを使用している。
ためしに、いままで暗黙的にBUFG(BUFGMUXの一部を使用するとBUFGの機能になる)を使用していたが、明示的にHDLソースでBUFGプリミティブを使ってみた。そうすると中間のクロック遅延になった。そのFPGAエディタの経路はこれ。

赤い線の配線遅延は0.759ns。
今度は、UCFでBUFGMUX7Pを指定してみた。そうしたら前者と同様の配線になり、配線遅延は0.143nsになった。
どうやらCLK入力パッドの位置だと、遅延の少ない配線が出来る可能性があるBUFGMUXは7Pと6Sらしい。そこを使った方が有利なので、これからはFPGA Editorで最適な配線になるように、使用するBUFGMUXを選択したい。
いままで、これらの値が変動することがあったが(特にISEのバージョンが変わると)この辺が影響していたのだろう。
しかし、同じISE6.3のはずなのになぜなのだろうか?
- 2005年11月28日 15:16 |
- FPGAチップ内の配線方法
-
| トラックバック:0
-
| コメント:0