FC2カウンター FPGAの部屋 Spartan-6のPCIe Endpoint Block IPの勉強4(pio_writeReadBack_test1その2)
FC2ブログ

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

FPGAの部屋

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

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

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/1491-3cb03ca8
この記事にトラックバックする(FC2ブログユーザー)