PCI Expressが動き出した!
ようやく、PCI Expressの自作IPコアが動き出しました。
開発における重要なマイルストーンを、何とか今年のうちに間に合わせることができました。
今回の実験では、XILINXのSpartan3 PCI Express評価ボードを使っています。
このボードはPhilippsのPX1101AというインタフェースチップをSpartan3から制御することでPCI Expressの機能を実現するというものです。
PCI Expressはよく、3層の構造で描かれます。
---------------------
| トランザクション層
---------------------
| データリンク層
---------------------
| 物理層
| FPGAの中
| PIPEインタフェース
| インタフェースチップ
---------------------
物理層を実現する「インタフェースチップ」は、主に8b10bの変換、シリアルパラレル変換などを行います。
この種のPCI Expressチップは、今回使用しているPX1101A以外にも、Texas InstrumentsのXIO1100など各社から似たようなチップが販売されています。こういったチップとFPGAとの間はPIPEと呼ばれるインタフェース規格を採用していますので、1つのチップで動くようになれば、他のチップにも同じように適用することができます。
これらPCI Expressのインタフェースチップは、要するにシリパラ変換ICにすぎないので、リンクを確立させるための初期化パケットなどは全部FPGAが作ってやらねばなりません。
下の図は、その初期化手順を実行している間の、FPGAの内部信号をMITOUJTAGを使って観測したものです。
なんだかいろいろな信号が飛び交っています。
これらはリンク初期化のためのいろいろなパケットを交換するための信号です。
PCI Expressは、リセットをしてから通常の動作モードに入るまでに、いろいろな初期化ステートを通ります。FPGAの中にそれらのステートを操るステートマシンを作らなければ、全く手も足もでません。
PCI Expressのステートについて簡単に説明すると、
・PCI Expressは、まずシステムをリセットしたら、まず12ms待って受信側チップが存在するか否かを調べます。これがDetectステートです。
・その次に、TS1というパケットを1024個送信し、逆に相手側からTS1が8個以上のTS1が受信できるか否かを調べます。このTS1にはCOMシンボル(K28.5)が含まれているので、ビット同期とシンボル同期が行われます。そういうわけで、1024個ものTS1パケットを送るわけです。その次に、TS2を送って互いの速度を確かめ合い、シリアルの線(TX+,TX-あるいはRX+,RX-)がひっくり返っていないかどうかを調べます。これがPollingステート。
・そしたら今度はTS1パケットの中のリンク番号とレーン番号をセットして、上流から下流に向かってパケットを流してそれを送り返します。一周したらTS2パケットに切り替え、TS2パケットも一周したら論理IDLEを流す。これがConfigステート。
・Configステートが送受信の両方で完了したら、晴れて通常の通信モード(L0)へ遷移します。
L0に移ったら、パソコン側(Intelのチップセット)はデータリンク層パケット(DLP)を送信してきました。
ようやく最初のDLPを見ることができました。
(上の図では、"K28.2 D0.2 D1.0 D0.0 D16.0 D27.7 D25.5 K29.7")
ユーザデータをやりとりできるようになるまでには、まだまだ先は長いですね。
いま思えば、この回路を開発するにあたって、ほとんどすべてのデバッグ作業をMITOUJTAGを使って行ってきました。開発の最初の段階で、クロックが正しい周波数で発振しているかどうかを確認すること以外、オシロスコープは全く使わなかったですね。
PCI Expressはバスのようですが、実は通信です。
拡張ボードを作って何かのデータを転送しようとした場合、パソコンと拡張ボードの間でまず最初にリンク確立の通信をいろいろ行ってデータを交換し、互いの存在を認識させなければなりません。
リンクが確立されなければ、2本のシリアル線にいかなるデータを流そうとも、すべて無視されてしまいます。
このため、バスが動いているかどうかを確認するための最初の敷居がとても高くなります。
逆に、リンクが確立できれば、基本的な部分はできたといえるでしょう。
最近のコメント