« MITOUJTAG BASIC 1.2.1出荷 | トップページ | EDKを使ってみた »

2005.05.03

RocketIOを動作させる

大型連休を利用して、VirtexII ProのRocketIOをカスタムモード(GT_CUSTOM)で動かしてみました。

RocketIOというのは、XILINXのVirtexII ProやVirtex4などのFPGAに内蔵されている高速シリアル通信インタフェースで、これを使うと1チャネルあたり最大3.125Gbpsの通信が行えます。

XILNIXのアプリケーションノートには8b/10bをバイパスした設計例はいくつかありましたが、内蔵8b/10bを活用した設計例は見つけられませんでした。
そこで、試行錯誤の末、RocketIOの使い方をマスターできました。

私がRocketIOを動かす上で、ポイントだと思った箇所を書きます。

デコードされた適当なフレーム(特に意味はない)

★マニュアルの熟読
ユーザーガイド(UG024)にはすべて目を通すこと。読み飛ばしていい個所は、Visetteディスパリティ、チャネルボンディング、CRCそして第4章、付録AとC。これ以外の箇所は細部まで重要。
特に、デジタル部の設計ではこのマニュアルと東京エレクトロンデバイス殿のWebサイトにある資料「wb_Rocket_IO_Manual_rev20」を熟読すること。
アナログ部の設計(基板設計と電源フィルタ、部品の選定など)は、wb_Rocket_IO_Manual_rev20とUG024、そしてアプリケーションノートを熟読。

★デバッグの順序(送信側)
1 ありえないK符号を送信し、TXKERRが立つことを確認。
2 適当なK符号やD符号を送信し、TXRUNDISPが正しく変化することを確認。
3 カンマやIDLEにどのようなK符号を使うかを決める。
 これは、ユーザが勝手に決めていいのだが、GigabitEtherやFiberchannelを参考にして合わせても良い。カンマでもIDLEでもないダミーのK符号(自分専用)も決めておくと便利。
 なお、ユーザガイドにはK28.7をプロトコルに使用するなと書かれている。ビット配列が0011111000と単純なためだろうか。
4 以下のようなフレームを連続して繰り返し送信する機能を作る。これで受信側のテストに備える。
 COMMA、適当なデータ(乱数など)・・・、IDLE・・・
 順番は適当でよい。

★デバッグの順序(受信側)
1 送信側と異なる水晶モジュールを使って実験し、RXRECCLKが復元できることを確認。
2 RXCOMMADETが見えるか
 (*COMMA_DETECTや*COMMA_10B_VALUEアトリビュートなどの設定が必要)
3 RXCHARISKが見えるか
 (長いK符号の列を送ると、弾性バッファの影響で多少不思議な挙動をするかも)
4 受信ステートマシンを作って、データの中身をチェック
 →LFSRで作った乱数を送受信するなどして、データを検証

次に、ユーザガイドや、wb_Rocket_IO_Manual_rev20を読んでもなかなか掴めなかったポイントを以下に書きます。

★GT_CUSTOMでは、以下のアトリビュートの設定は必須
CLK_COR_SEQ_*_*
 →これは、IDLEの符号を指定する。これを入れないと送受信間のクロックの差を吸収することができず、エラーが頻発する。
  これは11ビットのベクトルである。最上位ビットは8b/10bをバイパスする(1)か、否(0)かの指定。8b/10bを使用する場合、9ビット目はK符号かD符号かを表す(マニュアルに詳しく記載されていない?)。
CLK_COR_SEQ_LEN 16ビットモード時には、当然、「2」でしょう。
M/PCOMMA_10B_VALUEと関連するアトリビュート一式。いわゆるカンマの符号を設定する。

★その他のポイント
・RXCHARISCOMMAとRXCOMMADETの違い。RXCHARISCOMMAは8b/10bと弾性バッファの後ろなので、クロック補正などの影響を受ける。
  ・RXCOMMADET    *COMMA_DETECTに影響を受ける
  ・RXCHARISCOMMA DEC_*COMMA_DETECTに影響を受ける。K符号すべてに反応!?(MCOMMA_10B_VALUEとかで設定した値が反映されない!?)

・再アラインメントは行ってくれないと思ったほうがいい。
・16ビットモードならば、クロックコレクションのシーケンス長を2にすること。1だと補正の時にバイトの上位下位がひっくり返ってしまう。
・8b/10bを使用する場合、送信ディスパリティの計算は自動で行ってくれるようだ。ユーザがTXCHARDISPMODEとTXCHARDISPVALを触る必要はない。
・1.2Gbpsくらいでは内蔵シリアルループバックは正常に動作したが、2.5Gbpsでは内蔵のシリアルループバックがうまくいかない。なぜ?何か設定を間違えたか?
・送信電圧を増やすと消費電流が増加。かなり熱くなる。きちんとした基板と伝送線路なら最小電力でも十分。
・カンマの値は、マスクを利用して複数の値を設定するのではなく、1つの値に特定させたほうがデバッグが楽。
・作動ペアの片側をはずしても2.5Gbpsでそれなりに通信できる。ただし、多少エラーは発生する。頻度は未測定。しっかりしたエラー訂正を行えば1本線での通信ができないだろうか。(邪道か?)

|

« MITOUJTAG BASIC 1.2.1出荷 | トップページ | EDKを使ってみた »

コメント

FPGAメーリングリストではご丁寧なアドバイスありがとうございます
最初まったく動作しないため この内容に従い調査しましたところ
ようやく一方のRocket-ioからもう一方にrocket-ioへ転送できるところまでいきました

別な質問として すこしFPGAからかけ離れるので
ここで質問させてください

rocket-ioのバスは1バイト,2バイト,4バイトバスがありますが
どのバスで設計するかの指針はどう考えればいいのでしょうか?


すこし漫然とした質問ですけど
よろしくお願いいたします

それともうひとつですが
転送レートとの関係は以下と考えればいいのでしょうか?

REFCLK=125MHzとして   
1バイトバス  1ギカビット/SEC
2バイトバス  2ギガビット/SEC
4バイトバス  4ギガビット/SEC          

投稿: 壁ばかり | 2007.06.05 18:50

こんばんは

>rocket-ioのバスは1バイト,2バイト,4バイトバスがありますが
>どのバスで設計するかの指針はどう考えればいいのでしょうか?

2バイトです。理由はユーザーガイドに書かれています。

>REFCLK=125MHzとして   
バス幅と速度は関係ありません。


投稿: なひたふ | 2007.06.05 22:23

教えてください。
私は、VHDLを本などで勉強したものです。学習キットも購入し多少は
体験している程度です。
TEDでボードを購入して4V-FX60-MGTなんでが、勢いでやっています
最終的には、SFPで4GでRBERTを使用する予定ですが、
わからないことは、まずアトリビュートの設定、ファイルとか
書き方とかが、本に記載していないのです。
もちろん、いろんなところが分からないのですが・・・・・
サポートは、質問しても2~3日経っても帰ってきません。ザイリンクスのサイトは、一応みましたがわかりません。
すみませんが、聞けるところがありません。
教えてください。

投稿: 勢いだけでは | 2007.08.09 08:36

>学習キットも購入し多少は体験している程度です。

正直に言って、その段階ではRocketIOを動作させるのは無理です。

ザイリンクスのサイトをみて、それなりにRocketIOのことがわかるくらいの経験を積まないと、RocketIOを触ることはできません。

もし、掲示板やメーリングリストなど無料の手段で情報を得ようとするならば、1年くらいやれば設計できるようになるかもしれませんが、仕事でやるには時間がかかりすぎます。

会社の仕事なら、代理店の設計サービスに丸投げしてしまうのがベストです。

どうしても自分(自社)で開発したいというのであれば、高価な有料トレーニングセミナーに申し込んで、お金を払って数週間みっちりと特訓を受けるしかありません。

悠久の時間を使って独学でという選択もなくはないのですが、厳しいことを言うようですが今の段階からではネットで聞いて何とかなるというレベルの話ではないと思われます。
そのように上長に相談してみてください。

投稿: なひたふ | 2007.08.09 10:56

いろいろマニュアルを読んで見たのですが、やはりピンと来ません。
残念ながら、その道の達人に投げる方が早いと思いました。
どうもありがとうございました。
 別件ですが、近日中MitoujtagとBASICを注文すると思いますのでその時は、よろしくお願いします。

投稿: 勢いでは | 2007.08.20 12:14

コメントを書く



(ウェブ上には掲載しません)




« MITOUJTAG BASIC 1.2.1出荷 | トップページ | EDKを使ってみた »