FC2カウンター FPGAの部屋 PCI
FC2ブログ

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

FPGAの部屋

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

PCI-Xマスタ・モジュールのテスト2

PCI-Xマスタ・モジュールのテストで、ホストからのリードは64ビット幅で要求しても、そのスプリット完了のデータ転送は32ビット幅になってしまうという現象で悩んでいた。
mixiで聞いたり、FPGA Information Ltd.FPGA BBSで聞いたりしてみた。FPGA BBSでは、くりさんにお世話になりました。
その結果、PCI-Xターゲット・モジュールをバースト転送に対応させて、転送長を変更してやってみた。
そうしたところ、このチップセットは、転送長が8バイトでは、REQ64#をアサートしても、スプリット完了のデータ転送は32ビット幅でした。しかし、転送長を16バイトにしてみたところ、スプリット完了のデータ転送は、チップセットがREQ64#をアサートして64ビット幅のデータ転送になった。
下の図のピンクの部分が転送長8バイトでPCI-Xマスタ・リードを発行したところだ。ホスト(チップセット)からは、スプリット応答が帰ってきている。緑色の部分は関係ないPCI-Xターゲット転送だ。
青色の部分がスプリット完了のデータ転送だ。req64x_1d (REQ64#) が0にアサートされていないので、64ビット幅のデータ転送ではなく、32ビット幅のデータ転送だ。32ビット幅なので2クロックで8バイトをデータ転送している。
PCI-X_split_trans_1_070815.png

次に、転送長を16バイトにしてPCI-Xマスタ・リードをやってみた。ピンクの矢印のreq64x_1d (REQ64#) が0にアサートされているので、64ビット幅のデータ転送だ。こちらから ack64x_1d (ACK64#) を0にアサートして応答している。その結果、16バイトが2クロックでデータ転送できた。
PCI-X_split_trans_2_070815.png

よかった。これで先に進むことができる。
  1. 2007年08月15日 18:32 |
  2. PCI
  3. | トラックバック:0
  4. | コメント:0

PCI-Xマスタ・モジュールのテスト

PCI-Xマスタ・モジュールをやっとインプリメントして、テストしてみた。
PCI-Xのマスタ・リードを Memory Read Block コマンドで転送長を8バイト、REQ64#を0にアサートして、64ビットアクセスとしてアクセスした。そうするとホストはスプリット応答で返した。
やはり、ホストへのリードはスプリット転送になるようだ。
約750ns後にスプリット完了のためのトランザクションがホストから来た。まだスプリット完了に対応していないので無視してしまったが、これから対応したい。
疑問な点は、スプリット完了のときに、ホストがREQ64#をアサートしていなかったことだ。もしかして32ビット転送?
スプリット応答の時には ACK64# をアサートしていたんだけど。。。どうなんだろう。至急調査予定。

2007/08/10 : ホストからのリードは64ビット幅で要求しても、そのスプリット完了のデータ転送は32ビット幅になるようです。このチップセットでは。これではスループットが予定の半分。。。
  1. 2007年08月09日 20:09 |
  2. PCI
  3. | トラックバック:0
  4. | コメント:0

PCI-Xマスタ・モジュールのシミュレーション

どこかのBBSで書いてありましたが、”どこかの暇人”とは私のことでしょうか? まあ、主に自分のためですけどね。(自意識過剰かな?)

それはさておき、PCI-Xマスタ・モジュールのシミュレーションが大体できた。
pcix_master_simu_070806.png

pcix_req_bを 0 にアサートして、アービタがpcix_gnt_bをアサートして、バスがアイドルだったらトランザクションが開始。pcix_frame_bが 0 にアサートする。その後、pcix_irdy_bを 0 にアサートする。pcix_devsel_bが 0 にアサートされたらターゲットが応答。pcix_trdy_bをターゲットが 0 にアサートしたら1つ転送。今回は転送数がカーソルの位置でわかるとおり8バイト境界に位置合わせされた8バイトなので、64bit1つで終了。
次はインプリメントだが、問題が発生。経緯は次回に。
  1. 2007年08月06日 20:38 |
  2. PCI
  3. | トラックバック:0
  4. | コメント:0

PCI-Xマスタ・モジュール

PCI-Xマスタ・モジュールがだいぶできてきた。バースト転送には、まだ対応していないが、対応できるようには作っているつもり。とりあえず、1発だけマスタ・アクセスをやってみよう。でもまだ、PCI-Xのシミュレーション・モデルがうまくいっていない。PCIバスのシミュレーション・モデルを修正しながら使っているが、まだPCI-Xに対応しきっていないのだ。
PCI-Xマスタ・モジュールは、すべて64ビット幅のアクセスの予定だ。Memory WriteコマンドとMemory Read Blockコマンドを使う予定。64ビットに満たないWriteの場合はバイト・イネーブルを調節する。64ビットに満たないReadの場合は、読んできたデータの一部を使うようにするつもり。
現在、シミュレーションをしているので、これが完了したらインプリメントして確かめてみる。
  1. 2007年08月01日 19:10 |
  2. PCI
  3. | トラックバック:0
  4. | コメント:0

PCI-Xマスタ・モジュールの難しさ

PCI-Xマスタ・モジュールは、あまり進んでいない。夏休み自由研究サーポート企画があって、そっちに時間がとられているのもあるが、ターゲットだけならば簡単だが、マスタも入れるとなるとXilinxのFPGAのIOB特有の問題が出てきてしまう。
AD (アドレス・データ)はなるべくIOBのFFにマップしようと思っているし、そうでないと、タイミング的にも厳しい。また、絶対にひげが出ないようにするために、またIOBのFFに入れるために、ADの出力バッファ制御入力はFF出力からドライブするようにしている。ADの出力論理も同様だ。ターゲットの時に、このようになるように最適化してあるが、ここにマスタの出力を追加する必要がある。IOBに出力バッファが2つあって、ターゲット用、マスタ用に使えるのならば簡単なのだが、(Virtex2-proです)そうではないので、マスタの論理を追加する必要がある。しかもFF出力ではなくて、その一つ前の組み合わせ回路出力をターゲットとマスタを合わせて、IOBのFFで受けるようにする必要があるのだ。クリティカルパスの問題も気になるし、その辺が難しい。その前にFFで受けられれば良いのだが、PCI-Xの仕様的にそれは許されない。
ADはターゲットもマスタ・アクセスもRead, Writeがあるので、そのような問題が発生する。
FRAME#, IRDY#, DEVSEL#, TRDY#, STOP#などは、ドライブするモジュールがターゲット、マスタで一意に決まるので、そのような問題はない。
その辺は前のPCIが参考になるはずなのだが、もうまったく忘れちゃっているので、最初から考えたほうが速そう。前も確か苦労したと記憶している。
  1. 2007年07月25日 22:15 |
  2. PCI
  3. | トラックバック:0
  4. | コメント:2

PCI-Xバス・ターゲット・モジュールのテスト(終了)

PCI-Xバス・ターゲット・モジュールは Single Data Phase Disconnection を組み込んで、バックエンドがビジーの場合はリトライを返すことにした。スプリット・トランザクションを実装しないですんだので、大分簡単になった。
大体、ホストPCのプロセッサがPCI-Xボードにアクセスするときには、DWORDアクセスになるようだ。連続的に書いたり、読んだりしたら Writeの方はバーストになるかもしれないが、Read はDWORDアクセスのみかもしれない。よって、ターゲット・アクセスはとりあえず DWORD アクセスのみでスループットは求めないこととする。
下の図は、テスト回路で3回リトライを繰り返した後で正常に Write した時のChipScope波形だ。(クロックは133MHz)
write_retry_070718.png

下の図は、テスト回路で3回リトライを繰り返した後で正常に Read した時のChipScope波形だ。(クロックは133MHz)
read_retry_070718.png

このモジュールをインプリメントするうえで面倒なことがある。それは”PCI-Xバスへの出力信号のHDL記述”で制御信号をテーブルのように書いて、人間がわかりやすいようにしたのだが、自分で名前を指定していないので、論理合成で生成されるトライステート・バッファのイネーブルを制御するFFのインスタンス名がまちまちになることだ。制御信号の論理を変更した際にインスタンス名が変わってしまい、いちいち UCF で IOB=TURE; を変更している。これが面倒。インスタンス名を決められれば良いのだが、今のところその方法はわからない。

これでターゲットのテストは終了したので、明日からはマスタ・モジュールに移る。こっちはスプリット・トランザクションの実装方法を含めて、難易度が高い。
  1. 2007年07月18日 21:45 |
  2. PCI
  3. | トラックバック:0
  4. | コメント:0

PCI-Xバス・モジュールのテスト(続き4)

今日もあまりできなかったが、Configuration Writeの波形を確認した。問題なさそうだった。
まだ、Single Data Phase Disconnection は実装していないが、Memory Writeコマンドにも応答するはずなので、やってみることにした。バイト・カウントが0以外、4以下でないとデッドロックするかもしれないが、とりあえず単発でホストCPUからのWriteだったら大丈夫だろうということでやってみた。
PCIX_MEM_WRITE_70712.png

最初の信号がIDESL、その次がFRAME#, 次がIRDY#, DEVSEL#, TRDY#だ。やはり、FRAME#が 0 になったときにIDSELが 1 になっている。pcix_c_be_b_cが 7 なので、Memory Writeコマンド。次のpcix_c_be_b_cが 0 , pcix_ad_inが 00000004 なので、ホストのFunction Number 0, Device Number 0, Bus Number 0 つまりオール0だ。バイト・カウントが 4 なのでワード・アクセスだ。これだと破綻せずにうまく書き込むことができる。書き込んだデータが 00008000 。
  1. 2007年07月12日 18:00 |
  2. PCI
  3. | トラックバック:0
  4. | コメント:0