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

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

FPGAの部屋

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

Spartan-6のPCIe Endpoint Block IPの勉強3(ユーザーズ・ガイドで勉強)

Spartan-6 FPGA PCI Express 用インテグレイテッド エンドポイント ブロック ユーザー ガイド (英語版)”(UG654)でSpartan-6 FPGA PCI Express用インテグレイテッド エンドポイント ブロック(PCIe EP)を勉強中。
MCBもセレクトIOもそうだが、新しいFPGAが出るといろいろ勉強する必要があることがたくさん増える。(今日もSpartan-6ファミリセミナにXilinx社(大崎)に行ってきます)特にSpartan-6はハードIPのMCBやPCIe EPがあるので、読むマニュアルが沢山ある。Spartan-6 FPGA PCI Express 用インテグレイテッド エンドポイント ブロック ユーザー ガイド (英語版)は、234ページもあって理解するのが大変だ。マニュアルが多いということは、ユーザーに伝えなくてはいけないことが多いということだと思う。PCIe EPはこの前からシミュレーションをしているが、シミュレーションをするには、Root Port側のシミュレーション・モデルが必要で、それをハードIPのEnd Pointのシミュレーション・モデルと接続してシミュレーションを行う必要がある。
Example DesignでのRoot PortとEnd Point、それにPIOと呼ばれているProgrammed Input Output Exampel Designの関連を図示した、UG654の40ページのFigure 4-1: Simulation Example Design Block Diagramを下図に引用する。
pcie_example_design_1_100526.png

上図の様に、上の四角で囲まれた部分がRoot Portのシミュレーション・モデルで、それは、右の四角のTest Programに従って動作する。そのTest Programが”SP605でPCIe Coreを生成してみる3(PCIeユーザーズガイドを調べる)”で書いた、sample_smoke_test0, sample_smoke_test1, pio_writeReadBack_test0...だ。デフォルトでは、sample_smoke_test0が実行されるが、コマンドラインからISimを起動するときに、-testplusarg TESTNAME=sample_smoke_test1 をコマンドラインに追加すれば、sample_smoke_test1が実行される。pio_writeReadBack_test0...などのTest Programは、ファイルがないので実行できない。
Test Programに使用されるTaskもUG654の151ページからのRoot Port Model TPI Task Listに記述されている。
なお、私のブログで、”SP605でPCIe Coreを生成してみる2(シミュレーション)”はEnd Pointの波形を見ていて、”Spartan-6のPCIe Endpoint Block IPの勉強1(シミュレーションでRoot Portの動作を確認)”と”Spartan-6のPCIe Endpoint Block IPの勉強2(シミュレーションでRoot Portの動作を確認2)”はRoot Portの波形と動作を見ている。

さて、このようにEnd PointのテストはRoot PortのTest Programで行うようだ。pio_writeReadBack_test0...などのTest Programは、ファイルがないので実行できないと書いたが、pio_writeReadBack_test0は、UG654の150ページにソースが載っているので、PIOの構造をもう少し調べてから、ソースを打ち込んで試してみたいと思う。
Root Port Model TPI Taskを勉強すれば、自分でテストプログラムも書けそうだ。
  1. 2010年05月26日 05:26 |
  2. PCI Express
  3. | トラックバック:0
  4. | コメント:0

Spartan-6のPCIe Endpoint Block IPの勉強2(シミュレーションでRoot Portの動作を確認2)

Spartan-6のPCIe Endpoint Block IPの勉強1(シミュレーションでRoot Portの動作を確認)”の続き。
前回、Root Port(RP)からEnd Point(EP, Spartan-6のPCIeハードIP) に0番レジスタにコンフィギュレーション・リード・リクエスト(タイプ0)を送った。今回はその応答パケット(コンプリーション)を見てみることにする。

下の図に、コンフィギュレーション・リード・リクエスト(タイプ0)に対するコンプリーションのパケットを示す。(たぶん)
pcie_rp_tran_2_100523.png

今回も、前回同様に、たぶんtrn_rsof_nが受信パケットスタートで、trn_reof_nが受信パケットエンド。
trn_rsof_n、trn_reof_nが0にアサートされているどちらのクロックサイクルも、trn_rrem_nがアサートされている(0)ので、4DW長(4*32bit)だ。その時のtrn_rd[63:0]は、4a0000010000000401a00000ee100700だった。

この、2つの受信したTLPを解析してみよう。
最初のバイト、バイト0は0x4aだ。このバイトの6,5番目のビットがTLPのフォーマット(Fmt)を表す。値は10なので、3DWでデータありを表す。ビット4~0がTLPの種類(Type)を表す。Fmtが10でTypeが01010なので、コンプリーション(データあり)を示す。これは、前回のコンフィギュレーション・リード・リクエスト(タイプ0)に対するコンプリーションのパケットとなる。
バイト1は、ビット6~4がトラフィック・クラス(TC)を表す。TCは000。後はリザーブ。
バイト2のビット7がECRCの有無、0なので無し。ビット6がエラー・フォワーディングかな?0なので無し?ビット5~4は属性。値は00。これについてはPCIeの規格書を見ろとのことだった。.コンプリーションの場合の属性の値は書いていなかった(要調査)。66ページの図3.13参照。(2010/05/24:追加)PCI Express System Architecture によると、ビット5はRelaxed Ordering Bitで、ビット4は、No Snoop Bitだそうだ。
バイト2のビット1~0とバイト3の全部がデータのペイロード長。0000000001なので、データは1DW。
次のバイト4とバイト5はコンプリータID。0x0000。これは、End Point(EP, Spartan-6のPCIeハードIP)のID。
バイト6のビット7~5は、コンプリーション・ステータス、000なので、成功。ビット4はバイト・カウント・モデファイ。これはリクエストで要求したデータ長を変更してあると1になり、そのままだと0になると思う。値までは本に書いてなかった。値は0なので、データ長はリクエストで要求したまま。
バイト6のビット3~0とバイト7はバイト・カウント。値は004。DW=4バイトなので、あっている。

次のフレームの01a00000ee100700を解析してみよう。
最初のバイト(バイト8)とバイト9は、リクエスタID。値は0x01a0。これは、コンフィギュレーション・リード・リクエスト(タイプ0)のリクエスタIDと同一。
バイト10はタグ。値は0x00。これもコンフィギュレーション・リード・リクエスト(タイプ0)タグと同一。
バイト11のビット6~0は下位アドレス。値は0x00。
次のバイト12~15がペイロードでリード・データ。値は0xee100700。本によるとデータのペイロードのバイト列は0バイトから始まると書いてある。つまり逆順になっているので、今まで通りに書くと、0x000710EEとなる。

PCIコンフィギュレーション空間の0番地から32ビットだと、デバイスIDが16ビット、ベンダIDが16ビットとなっている。RPのコンフィギュレーション・リード・リクエスト(タイプ0)に対するEPのコンプリーションのペイロードのリード・データから、デバイスIDが0x0007、ベンダIDが0x10EEであることがわかった。Xilinx社のベンダIDは0x10EEだ。
  1. 2010年05月24日 05:23 |
  2. PCI Express
  3. | トラックバック:0
  4. | コメント:0

Spartan-6のPCIe Endpoint Block IPの勉強1(シミュレーションでRoot Portの動作を確認)

いろいろカテゴリーが分散してしまうが、”LogiCORE? IP Spartan-6 FPGA Integrated Endpoint Block v1.1 for PCI ExpressR User Guide ”を参考に、Programmed Input Output(PIO) Example Designのシミュレーションについて勉強して行きたいと思う。
SP605でPCIe Coreを生成してみる3(PCIeユーザーズガイドを調べる)”のsample_smoke_test1で、ISimのInstance and Process NameペインからRP(Root Port)を選択して、Object Nameに表示された信号名を波形ウインドウにドラック アンド ドロップし、シミュレーションしてみた。
その際に、波形にトランザクションパケットが見えたので、下に表示する。下のトランザクションパケットはRoot PortからEnd Pointへの送信のトランザクションパケットのようだ。(Root Portはシミュレーション用の記述のみです。End PointがFPGAに実装するハードIPを指します)
pcie_rp_tran_1_100522.png

Root Portの信号の説明は、”Spartan-6 FPGA PCI Express 用インテグレイテッド エンドポイント ブロック ユーザー ガイド (英語版)”の177ページからに書いてある信号名と一致する。
trn_td[63:0]はトランザクション層の送信データ。
trn_trem_nは、trn_td[63:0]のどこにデータが載っているかを示す。( 0 = packet data on all of trn_td[63:0]、 1 = packet data only on trn_td[63:32])
trn_sof_nは送信フレームの始まりを表し、trn_eof_nは送信フレームの終わりを表す。
最初の送信フレームの値は、0400000101a0000fで、次の送信フレームの値が、01a0000000000000だ。最初の送信フレームでは、trn_sof_n=0 となっていて、送信フレームの始まりを表している。
次の送信フレームでは、trn_eof_n=0 となっていて、送信フレームの終了を表している。この送信フレームでは、trn_trem_nも1になっていて、td[63:32]にのみデータが載っていることが分かる。

さて、このトランザクション層の送信フレームの値を解析してみることにする。
PCI Express 入門語講座によると、トランザクション層パケット(TLP)のヘッダには、3DW(DWは32ビット)と4DWの物があるそうだ。このTLPは、2番目の送信フレームで終了していて、データ長が32ビット長なので、3DWのTLPヘッダだけということが言える。
最初のバイト、バイト0は0x04となっている。このバイトの6,5番目のビットがTLPのフォーマット(Fmt)を表す。00なので、3DWデータ無しを表す。ビット4~0がTLPの種類(Type)を表す。Fmtが00、Typeが00100なので、コンフィギュレーション・リード・リクエスト(タイプ0)という事になる。
バイト1は、ビット6~4がトラフィック・クラス(TC)を表す。TCは000。後はリザーブ。
バイト2のビット7がECRCの有無、0なので無し。ビット6がエラー・フォワーディングかな?0なので無し?ビット5~4は属性。値は00。これについてはPCIeの規格書を見ろとのことだったが、コンフィギュレーション・リクエストの場合の属性は00だそうだ。64ページの図3.11参照。
バイト2のビット1~0とバイト3の全部がデータのペイロード長。0000000001なので、データは1DW。
次のバイト4とバイト5はリクエスタID。0x01a0
バイト6がタグ。これは0x00
バイト7のビット7~4が最後のDWのバイトイネーブル。これは0000に決まり。ビット3~0が最初のDWのバイトイネーブル。本には記載がなかったがアクティブハイだろうか?1111。最初と最後のバイトイネーブルをパケットに含めることで、バイト単位(のアドレス)でバースト転送をすることができる。でもPCIバスの様に個別に、常時バイトイネーブルが付くわけではないので、1バイト置きに書くということは出来ない。

次のフレームの0x01a00000を解析してみる。
最初のバイト(バイト8)は、バス番号、0x01
バイト9のビット7~3はデバイス番号、10100。ビット2~0は機能番号000
バイト10のビット3~0は拡張レジスタ番号、0000
バイト11のビット7~2はレジスタ番号、000000。つまり0番レジスタ。

まとめると、このTLPはバス番号01、デバイス番号10100、機能番号000(これがPCIeのエンド・ポイントのコンフィギュレーション時のアドレスのハズ)の0番レジスタへのコンフィギュレーション・リード・リクエスト(タイプ0)。Root PortのリクエスタIDは0x01a0。

結構、解析が面倒だった。次は、コンフィギュレーション・リード・リクエスト(タイプ0)にエンド・ポイント(Spartan-6のPCIeエンド・ポイントのハードIP)が応答して、返した値を調べてみる。
  1. 2010年05月22日 06:10 |
  2. PCI Express
  3. | トラックバック:0
  4. | コメント:3