FC2カウンター FPGAの部屋 PCI Express

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

FPGAの部屋

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

Spartan-6のPCIe Endpoint Block IPの勉強7(pio_writeReadBack_test1その5)

Spartan-6のPCIe Endpoint Block IPの勉強6(pio_writeReadBack_test1その4)”の続き。

9. 送信TLP。コンフィギュレーション・ライト・リクエスト。5番レジスタへのWrite。5番目のレジスタはベースアドレス1なので、オール1を書いて、どのくらいの領域を要求しているかを見ている部分だろう?
pio_writeReadBack_test1_23_100610.pngpio_writeReadBack_test1_24_100610.png

10. 送信TLP。5番レジスタに対するコンフィギュレーション・リード・リクエスト。これは、どのくらいの領域を要求しているかをリードする。5番目のレジスタはベースアドレス・レジスタ1だ。
pio_writeReadBack_test1_25_100611.pngpio_writeReadBack_test1_26_100611.png

11. 受信TLP。タグ番号0x02なので、9. のコンフィギュレーション・ライト・リクエスト対するコンプリーションだ。コンフィギュレーション・ライト・リクエストが成功しているというお知らせ。
pio_writeReadBack_test1_27_100611.pngpio_writeReadBack_test1_28_100611.png

12. 受信TLP。10.のコンフィギュレーション・リード・リクエストに対するコンプリーション。値は0x00000000。すべてが0なので、ベースアドレスレジスタ1はディスエーブルとなる。
pio_writeReadBack_test1_29_100611.pngpio_writeReadBack_test1_30_100611.png

13. その後、レジスタ番号6~9(ベースアドレス・レジスタ2~5)に0xffffffffをWriteして、Readしたら0x00000000が帰ってきて、ディスエーブルされていることがわかった。その後、レジスタ番号0x0C(拡張ROMベースアドレス)を同様に調査して、0x00000000が帰ってきてディスエーブルされていることがわかった。これでベースアドレス関連のレジスタはすべて調べたことになる。これはPCIのコンフィギュレーションのやり方と同じだ。

14. 送信TLP。コンフィギュレーション・ライト・リクエスト。4番レジスタへのWrite。ベースアドレス0のみ有効なので、そこにアドレスを書いていると思われる。オール0を書いているので、0番地から1Mバイトマップされる。
pio_writeReadBack_test1_31_100612.pngpio_writeReadBack_test1_32_100612.png

15. 送信TLP。5番レジスタ(ベースアドレス1)へオール0を書いている。ディスエーブルとわかっていてもオール0を書くんだ?その後、残りのベースアドレス全部と拡張ROMベース・アドレスにオール0を書き込んでいる(多分、途中は確かめてないけど)。その間にもコンフィギュレーション・ライト・リクエストのコンプリーションは帰ってきている。

16. 送信TLP。コンフィギュレーション・ライト・リクエスト。レジスタ番号1番への書き込み。レジスタ番号1番はステータス・レジスタとコマンド・レジスタだ。コマンド・レジスタへ0x0003を書き込んでいる。これは、メモリ空間とI/O空間に対するアクセスを有効化するビットを1にしている。
pio_writeReadBack_test1_33_100612.pngpio_writeReadBack_test1_34_100612.png

17. 送信TLP。コンフィギュレーション・ライト・リクエスト。レジスタ番号0x18番への書き込み。つまりコンフィギュレーション・レジスタ0x60番地への書き込み。最下位のバイトに0x5Fを書き込んでいる。これはなんだろう?要調査。
pio_writeReadBack_test1_35_100612.pngpio_writeReadBack_test1_36_100612.png

18. その後は、コンフィギュレーション・ライト・リクエストへのコンプリーションが次々着ている。

19. 送信TLP。65.25 usecあたりに0x00000000番地へのメモリ・ライト・リクエストが、データは1バイトずつのリトルエンディアンで0x04030201。これは、”Spartan-6のPCIe Endpoint Block IPの勉強4(pio_writeReadBack_test1その2)”でEndPoint側で観測されたパケットでもある。Root Portでメモリ・ライト・リクエストを送ってから、EndPointで受信されるまでに約1usec経過している。
pio_writeReadBack_test1_37_100612.pngpio_writeReadBack_test1_38_100612.png

20. 送信TLP。0x00000000番地へのメモリ・リード・リクエスト。
pio_writeReadBack_test1_39_100612.pngpio_writeReadBack_test1_40_100612.png

21. 受信TLP。20.の0x00000000番地へのメモリ・リード・リクエストのコンプリーション。受信したデータは、データは1バイトずつのリトルエンディアンで0x04030201で、19.で送ったデータと同一。EndPoint側の記事は、”Spartan-6のPCIe Endpoint Block IPの勉強5(pio_writeReadBack_test1その3)”。
pio_writeReadBack_test1_41_100612.pngpio_writeReadBack_test1_42_100612.png

これで、pio_writeReadBack_test1は終了。一般的なPCIe EndPointの初期化手順を見てきた気がする。
  1. 2010年06月11日 05:26 |
  2. PCI Express
  3. | トラックバック:0
  4. | コメント:0

Spartan-6のPCIe Endpoint Block IPの勉強6(pio_writeReadBack_test1その4)

”Spartan-6のPCIe Endpoint Block IPの勉強4(pio_writeReadBack_test1その2)”と”Spartan-6のPCIe Endpoint Block IPの勉強5(pio_writeReadBack_test1その3)”で、EndPointのトランザクション・パケットを見てきたが、Root Portのトランザクション・パケット(TLP)を見て行こう。

下に、Root PortのTLPの波形を示す。
pio_writeReadBack_test1_1_100605.png

1. 最初のRoot Portの送信TLPは、コンフィギュレーション・リード・リクエスト。レジスタ番号0番地のリード。
pio_writeReadBack_test1_7_100609.pngpio_writeReadBack_test1_8_100609.png

2. 次は、受信TLP。1.のコンフィギュレーション・リード・リクエストに対応するコンプリーション。レジスタ番号0のデータ。データはee100700。デバイスIDが0x0007、ベンダIDが0x10EE。ここではコンプリータIDは0000。
pio_writeReadBack_test1_9_100609.pngpio_writeReadBack_test1_10_100609.png

3. 送信TLP。コンフィギュレーション・リード・リクエスト。レジスタ番号0x17のリード。0x17と言うと0x5C番地のはず。これは、PCIe機能レジスタ?
pio_writeReadBack_test1_11_100609.pngpio_writeReadBack_test1_12_100609.png

4. 2.62 usec後に、受信TLP。当然ながら、3.のコンフィギュレーション・リード・リクエストに対応するコンプリーション。レジスタ番号0x17のデータ。データはc28f0000。となると、ルートコントロールが0x8fc2で、ルート機能が0x0000?
pio_writeReadBack_test1_13_100610.pngpio_writeReadBack_test1_14_100610.png

5. 送信TLP。コンフィギュレーション・ライト・リクエスト。4番レジスタへのWrite。4番目のレジスタはベースアドレス0なので、オール1を書いて、どのくらいの領域を要求しているかを見ている部分だろう?
pio_writeReadBack_test1_15_100610.pngpio_writeReadBack_test1_16_100610.png

コンフィギュレーション・ライト・リクエストのバス番号とデバイス番号をEndPointは記憶するそうだ。
I.Kさん、やはり、コンフィギュレーション・ライト・リクエストのバス番号とデバイス番号は、Root Portと同じでした。このパケットをRoot Portが出力してから、1.14 usec後に、EndPointのcfg_bus_number出力が0x00から0x01に、cfg_function_number出力が0x00から0x14に変化しました。ありがとうございました。

6. また送信TLP。当然ながら、4番レジスタに対するコンフィギュレーション・リード・リクエスト。これは、どのくらいの領域を要求しているかをリードする。
pio_writeReadBack_test1_17_100610.pngpio_writeReadBack_test1_18_100610.png

7. 受信TLP。タグ番号0x00なので、5. のコンフィギュレーション・ライト・リクエスト対するコンプリーションだ。5. から2.67 usecかかている。
pio_writeReadBack_test1_19_100610.pngpio_writeReadBack_test1_20_100610.png

8. 受信TLP。6. の4番レジスタに対するコンフィギュレーション・リード・リクエストに対応するコンプリーション。送られてきたデータは0x0000f0ff。これを左のビットがMSBに直すと、0xfff00000。つまり、20ビットのアドレス空間があるので、ベースアドレス0は1Mバイトメモリ。
pio_writeReadBack_test1_21_100610.pngpio_writeReadBack_test1_22_100610.png

次の記事に続く。
  1. 2010年06月10日 05:33 |
  2. PCI Express
  3. | トラックバック:0
  4. | コメント:0

Spartan-6のPCIe Endpoint Block IPの勉強5(pio_writeReadBack_test1その3)

PCI Express(PCIe)のトランザクション・パケット解析ソフトができて、PICeのパケットを解析しようと思っているが、素朴な疑問が出てきた。

1. PCIeの初期化はどうやっているのだろうか?PCIバスでは、IDSEL信号があって、FRAME#がアサートされた時にIDSELが1だと、自分へのコンフィギュレーション・アクセスだということが識別できたが、PCIeでは、スイッチを通っているので、スイッチが自分に投げたパケットは自分宛のパケットとして処理して良いということだろうか?
2. 1が言えるということは、自分に投げられた最初のコンフィギュレーション・パケットのバス番号とデバイス番号を自分の物と認識しても良いということだろうか?


今のところ、2冊のPCIeの日本語の本を見ても書いてないようだ。英語の本を読まないとだめかな?それとも当たり前のだろうか?

さて、疑問は置いといて、”Spartan-6のPCIe Endpoint Block IPの勉強4(pio_writeReadBack_test1その2)”で、メモリ・リード・リクエストのパケットがあったので、コンプリーション・パケットがあるはずだ。それを見てみよう。下に、その波形を示す。
pio_writeReadBack_test1_4_100609.png

このパケットの値は、4a000001 01a00004 01a00a00 04030201 となっている。これをトランザクション・パケット解析ソフトに入れて、解析する。
pio_writeReadBack_test1_5_100609.png
pio_writeReadBack_test1_6_100609.png

コンプリーション(データあり)となっている。これはメモリ・リード・リクエストに対するコンプリーションなのでデータはありとなる。タグもメモリ・リード・リクエストと同じ0Aだ。腑に落ちないのは、リクエスタIDとコンプリータIDが01A0で同一ということだ。これは、おかしい気がする。
第4DWはデータで、以前Writeしたデータがそのまま読み出されている。

ちなみに、”Spartan-6のPCIe Endpoint Block IPの勉強1(シミュレーションでRoot Portの動作を確認)”では、アクセス先のトランザクションID(バス番号&デバイス番号&機能番号)は 01A0だったが、”Spartan-6のPCIe Endpoint Block IPの勉強2(シミュレーションでRoot Portの動作を確認2)”では、コンプリータIDが 0000 になっていた。これは同一でないとおかしいと思うのだが、まだコンフィギュレーションの途中ということでトランザクションIDが入っていなかったのだろうか?

次は、pio_writeReadBack_test1でのコンフィギュレーションの様子を観察することにする。
  1. 2010年06月09日 05:21 |
  2. PCI Express
  3. | トラックバック:0
  4. | コメント:2

PCI Expressのトランザクション・パケット解析ソフト

現在、PCI Expressのトランザクション・パケット解析ソフトをOpenOffice.orgのCalcで作っている。
OpenOffice.orgのCalcの関数は大体EXCELの関数と同じだが、区切りの記号は,から;に変更する必要がある。例えば、IF(A1="";"";"A")となる。
はじめはよく分からないで苦労したが、色々なサイトを参考に大分できてきた。
まずはパケットを解析するにあたってシフトはどうするのか?と思ったが、左シフトは2のn乗を掛け、右シフトは2のn乗で割っている。その際にINT関数をつけておかないと、浮動小数点演算の丸めの影響で+1されてしまう場合があるようだ。例、INT($A$5/2^20)
マスクはどうやってやるか戸惑ったが、”Excel で bit演算”のサイトを参考にして、マクロで関数を実装することにした。ビット演算を行う関数については、”OpenOffice.org Basic”を参考にした。
OpenOffice.orgのCalcのツールメニュー -> マクロ -> マクロの管理 -> OpenOffice.org Basicを選ぶとOpenOffice.org Basicマクロダイアログが出てくる。そのマイマクロに登録してある。
OpenOffice_macro_100608.png

これで、BitANDが使えるのでマスクができる。あまり体裁は良くないが、下のような感じで作っている。現在はコンプリーション・パケット解析を作っている。だいたいこれで、お終いにして、今度はRoot Portの送っているパケットを解析してみよう。
TLP_Analyzer_100608.png
  1. 2010年06月08日 05:27 |
  2. PCI Express
  3. | トラックバック:0
  4. | コメント:0

Spartan-6のPCIe Endpoint Block IPの勉強4(pio_writeReadBack_test1その2)

今回は、pio_writeReadBack_test1でEndPointのTRNインターフェースまで行って、受信したパケットを解析してみる。
TRNインターフェースの送信と受信のインターフェースの波形を下に示す。”Spartan-6のPCIe Endpoint Block IPの勉強3(pio_writeReadBack_test1その1)”の波形の黄色い四角で囲った部分の受信側を拡大した。
pio_writeReadBack_test1_3_100606.png

上の図でtrn_rsof_n, trn_reof_n, trn_rsrc_rdy_n, trn_rdst_rdy_nなどを見るとわかるように、最初にtrn_rsof_nが0にアサートされて、3つデータが来た後に、trn_reof_nがアサートされて、現在のデータで終了となる。都合4つのデータを持つパケットを受信した。そのデータは、40000001 01a009ff 00000000 04030201だった。もう1つパケットを受信している。最初はtrn_rsof_nが0にアサートされても、trn_rdst_rdy_nが0にアサートされていないため、EndPointはアサートされるまでtrn_rsof_nを0にして待っている。trn_rdst_rdy_nはユーザーアプリ側がアサートする信号で、受信パケットの受け入れ準備ができていないことを示している。trn_rsrc_rdy_nはEndPoint側の準備ができていないことを示し、trn_rsrc_rdy_nとtrn_rdst_rdy_nが同時にアサートされた時が、データをユーザーアプリ側に転送できた時だ。説明が長くなったが、2回目に受信したパケットは、00000001 01a00aff 00000000だった。
最初の40000001 01a009ff 00000000 04030201から解析してみる。

最初のフレームの0x40000001から解析する。
最初のバイト、バイト0は0x40となっている。このバイトの6,5番目のビットがTLPのフォーマット(Fmt)を表す。10なので、3DWデータありを表す。ビット4~0がTLPの種類(Type)を表す。Fmtが10、Typeが00000なので、メモリ・ライト・リクエストという事になる。
バイト1は、ビット6~4がトラフィック・クラス(TC)を表す。TCは000。後はリザーブ。
バイト2のビット7がECRCの有無、0なので無し。ビット6がエラー・フォワーディングかな?0なので無し?ビット5~4は属性。値は00。ビット5はRelaxed Ordering Bitで、ビット4は、No Snoop Bitなので、どちらも0
バイト2のビット1~0とバイト3の全部がデータのペイロード長。0000000001なので、データは1DW。

次のフレームの0x01a009ffを解析してみる。
次のバイト4とバイト5はリクエスタID。0x01a0
バイト6がタグ。これは0x09、これは今までで10個目のパケットなのかな?
バイト7のビット7~4が最後のDWのバイトイネーブル。これは1111。ビット3~0が最初のDWのバイトイネーブルで1111。どちらのバイトイネーブルもオール1だった。最初と最後のバイトイネーブルをパケットに含めることで、バイト単位(のアドレス)でバースト転送をすることができる。でもPCIバスの様に個別に、常時バイトイネーブルが付くわけではないので、1バイト置きに書くということは出来ない。

3番目のフレームの0x00000000を解析する。
ビット32~ビット2はアドレスを表す。つまり0番地ということ、ビット1~ビット0はリザーブなのは、バイト単位ではなく、32ビットのダブルワード単位のアドレスだから。

4番目のフレーム、0x04030201はデータということになる。
前回の解析結果から行くと、最初のバイトはバイト0となっているはずなので、32ビット幅のデータとして表示すると、順序が逆になって0x01020304になる。

最初のパケットをまとめると、1DWを0番地に書き込むメモリ・ライト・リクエストで、書き込む32ビット幅のデータは0x01020304


次のパケット、00000001 01a00aff 00000000の解析してみよう。
最初のバイト、バイト0は0x00となっている。このバイトの6,5番目のビットがTLPのフォーマット(Fmt)を表す。00なので、3DWデータ無しを表す。ビット4~0がTLPの種類(Type)を表す。Fmtが00、Typeが00000なので、メモリ・リード・リクエストという事になる。

バイト1は、ビット6~4がトラフィック・クラス(TC)を表す。TCは000。後はリザーブ。
バイト2のビット7がECRCの有無、0なので無し。ビット6がエラー・フォワーディングかな?0なので無し?ビット5~4は属性。値は00。ビット5はRelaxed Ordering Bitで、ビット4は、No Snoop Bitなので、どちらも0
バイト2のビット1~0とバイト3の全部がデータのペイロード長。0000000001なので、データは1DW。

次のフレームの0x01a00affを解析してみる。
次のバイト4とバイト5はリクエスタID。0x01a0
バイト6がタグ。これは0x0a、これは今までで11個目のパケット?
バイト7のビット7~4が最後のDWのバイトイネーブル。これは1111。ビット3~0が最初のDWのバイトイネーブルで1111。どちらのバイトイネーブルもオール1だった。

3番目のフレームの0x00000000を解析する。
ビット32~ビット2はアドレスを表す。つまり0番地

このパケットは、0番地から1DWを読むメモリ・リード・リクエスト。
つまり0番地へ4バイトをWriteして、また0番地からReadする。

パケット解析するのが面倒なので、パケット解析プログラムを作ることにする。ExcelかRubyかそれともOpenOffice.orgのCalcで作ろうかな?
  1. 2010年06月06日 06:50 |
  2. PCI Express
  3. | トラックバック:0
  4. | コメント:0

Spartan-6のPCIe Endpoint Block IPの勉強3(pio_writeReadBack_test1その1)

Spartan-6のPCIe Endpoint Block IPの勉強2(シミュレーションでRoot Portの動作を確認2)”の続き。
今回は、pio_writeReadBack_test1を行った。pio_writeReadBack_test1は”Spartan-6 FPGA PCI Express 用インテグレイテッド エンドポイント ブロック ユーザー ガイド (英語版)”の150ページに全ソースが載っている。これをtests.vに追加した。だが、それだけではだめで、信号やTASKの実体は下の階層のVerilogソースにあるので、board.RP.tx_usrappまでのパスを全部の信号やTASKに追加した。一部を転載すると下のような感じになっている。

board.RP.tx_usrapp.P_READ_DATA = 32'hffff_ffff; // make sure P_READ_DATA has known initial value
board.RP.tx_usrapp.TSK_TX_MEMORY_WRITE_32(board.RP.tx_usrapp.DEFAULT_TAG, board.RP.tx_usrapp.DEFAULT_TC, 10'd1, board.RP.tx_usrapp.BAR_INIT_P_BAR[ii][31:0] , 4'hF, 4'hF, 1'b0);


まさにVerilogだから、参照出来ているので、VHDLの言語仕様ではできない。良いのか悪いのかよく分からないが、下位の信号やTASKが自由に使えるのは取り敢えず便利だ。
書き直してコンパイル、リンクして、下のコマンドでISimを起動した。

demo_tb.exe -gui -testplusarg TESTNAME=pio_writeReadBack_test1


Root Port (RP)から、多量のパケットを送信して、同様のパケットを受信している。下にRPの送受信タイミングを示すISimの波形ウインドウを示す。
pio_writeReadBack_test1_1_100605.png

次にEndPointを見てみる。やっと、EndPointでも送信と受信を観測することができた。下にEndPointの送受信タイミングのISimの波形ウインドウを示す。
pio_writeReadBack_test1_2_100605.png

黄色い四角の部分で、パケットを受信して、次にパケットを送信している。
シミュレーション時のISimのログを下に示す。

Simulator is doing circuit initialization process.
Running test {pio_writeReadBack_test1}......
[ 0] : System Reset Asserted...
Finished circuit initialization process.
[ 399600000] : System Reset De-asserted...
[ 960680600] : Transaction Reset Is De-asserted...
board.EP.s6_pcie_v1_3_i.PCIE_A1.B_PCIE_A1_INST.SHIP.SHELL.BUT.pcie_pcie_inv.pcie_pcie.pcie_core.xil_pcie_sa_mod18.xil_pcie_sa_mod19.com.tlm.u_tlm_rx.xil_pcie_sa_mod75 checking
[ 1894626600] : Transaction Link Is Up...
[ 1895816600] : TSK_PARSE_FRAME on Transmit
[ 2233396600] : TSK_PARSE_FRAME on Receive
[ 2295792600] : Check Device/Vendor ID - PASSED
[ 2296992600] : TSK_PARSE_FRAME on Transmit
[ 2559776600] : TSK_PARSE_FRAME on Receive
[ 2696968600] : Check CMPS ID - PASSED
[ 2696968600] : SYSTEM CHECK PASSED
[ 2696968600] : Inspecting Core Configuration Space...
[ 2698168600] : TSK_PARSE_FRAME on Transmit
[ 2739366600] : TSK_PARSE_FRAME on Transmit
[ 2966151800] : TSK_PARSE_FRAME on Receive
[ 3007750600] : TSK_PARSE_FRAME on Receive
[ 3140542600] : TSK_PARSE_FRAME on Transmit
[ 3181740600] : TSK_PARSE_FRAME on Transmit
[ 3407728200] : TSK_PARSE_FRAME on Receive
[ 3452524600] : TSK_PARSE_FRAME on Receive
[ 3582916200] : TSK_PARSE_FRAME on Transmit
[ 3624114600] : TSK_PARSE_FRAME on Transmit
[ 3849302600] : TSK_PARSE_FRAME on Receive
[ 3890898600] : TSK_PARSE_FRAME on Receive
[ 4025289800] : TSK_PARSE_FRAME on Transmit
[ 4066488600] : TSK_PARSE_FRAME on Transmit
[ 4290876600] : TSK_PARSE_FRAME on Receive
[ 4335672600] : TSK_PARSE_FRAME on Receive
[ 4467663800] : TSK_PARSE_FRAME on Transmit
[ 4508862600] : TSK_PARSE_FRAME on Transmit
[ 4735664600] : TSK_PARSE_FRAME on Receive
[ 4777262600] : TSK_PARSE_FRAME on Receive
[ 4910064600] : TSK_PARSE_FRAME on Transmit
[ 4951262600] : TSK_PARSE_FRAME on Transmit
[ 5177262600] : TSK_PARSE_FRAME on Receive
[ 5222064600] : TSK_PARSE_FRAME on Receive
[ 5352462600] : TSK_PARSE_FRAME on Transmit
[ 5393664600] : TSK_PARSE_FRAME on Transmit
[ 5618864600] : TSK_PARSE_FRAME on Receive
[ 5660462600] : TSK_PARSE_FRAME on Receive
[ 5793664600] PCI EXPRESS BAR MEMORY/IO MAPPING PROCESS BEGUN...
BAR 0: VALUE = 00000000 RANGE = fff00000 TYPE = MEM32 MAPPED
BAR 1: VALUE = 00000000 RANGE = 00000000 TYPE = DISABLED
BAR 2: VALUE = 00000000 RANGE = 00000000 TYPE = DISABLED
BAR 3: VALUE = 00000000 RANGE = 00000000 TYPE = DISABLED
BAR 4: VALUE = 00000000 RANGE = 00000000 TYPE = DISABLED
BAR 5: VALUE = 00000000 RANGE = 00000000 TYPE = DISABLED
EROM : VALUE = 00000000 RANGE = 00000000 TYPE = DISABLED
[ 5793664600] : Setting Core Configuration Space...
[ 5794864600] : TSK_PARSE_FRAME on Transmit
[ 5836062600] : TSK_PARSE_FRAME on Transmit
[ 5877264600] : TSK_PARSE_FRAME on Transmit
[ 5918462600] : TSK_PARSE_FRAME on Transmit
[ 5959664600] : TSK_PARSE_FRAME on Transmit
[ 6000862600] : TSK_PARSE_FRAME on Transmit
[ 6042064600] : TSK_PARSE_FRAME on Transmit
[ 6060464600] : TSK_PARSE_FRAME on Receive
[ 6083262600] : TSK_PARSE_FRAME on Transmit
[ 6108465400] : TSK_PARSE_FRAME on Receive
[ 6124464600] : TSK_PARSE_FRAME on Transmit
[ 6150061800] : TSK_PARSE_FRAME on Receive
[ 6194864600] : TSK_PARSE_FRAME on Receive
[ 6239662600] : TSK_PARSE_FRAME on Receive
[ 6284464600] : TSK_PARSE_FRAME on Receive
[ 6329262600] : TSK_PARSE_FRAME on Receive
[ 6374064600] : TSK_PARSE_FRAME on Receive
[ 6418862600] : TSK_PARSE_FRAME on Receive
[ 6524464600] : Transmitting TLPs to Memory 32 Space BAR 00000000
[ 6525664600] : TSK_PARSE_FRAME on Transmit
[ 6530864600] : TSK_PARSE_FRAME on Transmit
[ 6783664600] : TSK_PARSE_FRAME on Receive
[ 6930862600] : Test PASSED --- Write Data: 01020304 successfully received
[ 6934865000] : Finished transmission of PCI-Express TLPs
Stopped at time : 69348650 ps : File "H:/HDL/FndtnISEWork/Spartan6/sp605_pcie_ISE121/s6_pcie_v1_3/simulation/tests/tests.v" Line 254

  1. 2010年06月05日 05:03 |
  2. PCI Express
  3. | トラックバック:0
  4. | コメント:0

Spartan-6のPCIe Endpoint Block IPの勉強4(PIOデザインの勉強)

Spartan-6のPCIe Endpoint Block IPのサンプル・デザイン、PIOデザインの勉強をする。これは、下の図で言うと、Spartan-6のPCIe Endpoint Block IPの下の部分で、サンプル・デザインの時のメモリやIOの実装だ。実際には4つのBRAMが載っていて、それぞれ違うアドレスを持っている。
pcie_example_design_1_100526.png

Root PortからのTLPを受信したEnd Pointは、どのBase Address Register (BAR) にヒットしたかをtrn_rbar_hit_n[6:0]でユーザー回路に知らせるようだ。下に、trn_rbar_hit_n[6:0]の説明をユーザーズガイドから引用する。

Receive BAR Hit: Active low. Indicates BAR(s)
targeted by the current receive transaction.
Asserted throughout the packet, from trn_rsof_n to trn_reof_n.
• trn_rbar_hit_n[0] => BAR0
• trn_rbar_hit_n[1] => BAR1
• trn_rbar_hit_n[2] => BAR2
• trn_rbar_hit_n[3] => BAR3
• trn_rbar_hit_n[4] => BAR4
• trn_rbar_hit_n[5] => BAR5
• trn_rbar_hit_n[6] => Expansion ROM Address.
Note that if two BARs are configured into a single 64-bit address, both corresponding trn_rbar_hit_n bits are asserted.


#そういえば、End Pointとユーザー回路のインターフェースを真面目に勉強するのを忘れていた。これは後で勉強することにする。

4つのBRAMがどのBARに割り当てられているかを示すテーブルがユーザーズガイド129ページからに載っている。Table 9-1: TLP Traffic Typesを下に引用する。
pcie_example_design_2_100527.png

上図のようになるようだが、疑問が2つ。End Point IPは、前回、1つのBARで、1MBytesに設定したはずなのだが、それは無視されるのだろうか?サンプル・デザインはこのコンフィギュレーションになるの?
ep_mem0はIOで、trn_rbar_hit_n[6:0]はDefaultと書いてあるが、PCIeはそうなるのかな?PCIでは、IOもBARにアドレスを登録するんじゃなかったか?

もう少し、PCIeの勉強が必要なようだ。

ソースを読んでみたところ、64ビット幅アドレスは無効になっていた。trn_rbar_hit_n[0] => BAR0の32ビット幅アドレスは有効でBRAMがアサインされていた。trn_rbar_hit_n[6] => Expansion ROM Addressも有効でBRAMがアサインされていた。それ以外のアクセスがあったときは、デフォルトのIO領域のBRAMがアクセスされていた。

  1. 2010年05月28日 05:46 |
  2. PCI Express
  3. | トラックバック:0
  4. | コメント:0
»