FC2カウンター FPGAの部屋 Spartan-6のPCIe Endpoint Block IPの勉強1(シミュレーションでRoot Portの動作を確認)
FC2ブログ

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

FPGAの部屋

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

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

コメント

ずいぶん昔の記事にコメントして申し訳ないのですが、
FPGAでPCIeを使うのは技術的にかなり難しいことですよね?

CycloneIVGXでPCIeを通信に使用したいと考えていたのですが、
AlteraのQuartusのなかにあるハードIPというものを使えば
使えるのでしょうか?

ぶしつけな質問ですみません。。。
  1. 2013/09/10(火) 16:17:57 |
  2. URL |
  3. 袋う #JalddpaA
  4. [ 編集 ]

今は、PCIeのFPGAボードも普通に売っていますし、その様なボードには大抵サンプル・デザイン付いていると思うので、普通はPCIeでパソコンにつながるんじゃないでしょうか?
但し、私は実際にPCIeのボードは持っていますが、パソコンのPCIeコネクタに接続して通信してみたことがないですし、AlteraのFPGAは知らないのでよくわかりません。(パソコン開けるのが面倒なので、なるべくやりたくない)
  1. 2013/09/10(火) 16:56:27 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

そうなのですか・・・
急な質問に答えていただいてありがとうございます
もうちょっと考えてみます
  1. 2013/09/18(水) 10:12:53 |
  2. URL |
  3. 袋う #JalddpaA
  4. [ 編集 ]

コメントの投稿


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

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