Cosmo-ZのSATA開発
Cosmo-ZのSATAが動くようにと開発しています。
Spartan-6LXTの時に作ったSATAコアがあるので、その物理層部分をGTXに置き換えてみたのですが、どうもうまく動きません。GTXをSATA1の1.5Gbpsで動かそうと、QPLLを使ったりCPLLを使ったりしているのですが、どうにもうまく動かないのです。
具体的に言うと、受信したデータが化け化け。
Spartan-6のGTPのときは、COMRESET→COMWAKEというOOB(信号の有無を使って情報を伝達する)の手順の後で、D10.2が安定して見えていたのですが・・
ZYNQの7Z030(Kintex-7)で、ラインレート1.5Gbpsの設定でやってみると・・
何か汚い。
COMWAKEやCOMINITは受信できているけど、その後、rxerrorがずっとバタバタしていたりcdrlockがふらふらしていたり、CDRがちゃんとロックしていない感じがするのです。
XILINXのアンサーを見ていたら、「7 シリーズ FPGA GTX/GTH トランシーバー - SATA Gen 1、Gen 2、Gen 3 の最適パフォーマンスを得るための推奨事項および設定 http://japan.xilinx.com/support/answers/53364.html」
というのがありました。
SATAはスペクトラム拡散をしているので、RXOUT_DIVという値をCoreGeneratorが生成した値から、下記の表の値に直せというものです。
- SATA3(6G)・・・ RXOUT_DIV=1, RXCDR_CFG=72'h03_8000_8BFF_1020_0010
- SATA2(3G)・・・ RXOUT_DIV=1, RXCDR_CFG=72'h03_8800_8BFF_4020_0008
- SATA1(1.5G)・・・ RXOUT_DIV=1, RXCDR_CFG=72'h03_8000_8BFF_4010_0008
これを変更する箇所は、ipcore_dir/sataphy_gt.vhdの368行目付近にあるようです。(※sataphyというのはCoreGenで自分で付けた名前)
RXCDR_CFG => (x"0380008BFF40100008"),
この変更を行ってみると、心なしか安定したような気もしますが、あまり変わっていないような気もします。
リンクはアップしたり、しなかったりです。
次の図は、デバイスがALIGNを送ってきて、ホストがD10.2を送っていた段階から、次のホストがALIGNを送るところです。
このときもまだcdrlockがバタバタしています。xrdyが送られてくることはあるのですが、その後のwtrmがなかったり、不正なプリミティブが来たり、極めて不安定な感じでした。
こんな感じで行き詰まっていたのですが、ためしにPLLとGTXの設定を3.0Gbpsにしてみました。すると、なんということでしょう!
最初のCOMINITとCOMEAKEから綺麗です。
今までの苦労が嘘みたいにリンクアップはするし、XRDYも普通に来るではないですか!
もちろん、最初のD2Hパケットもちゃんと受信でき、ホストから送るソフトリセットも認識されたようです。
3Gbpsよりも1.5Gbpsのほうが難しいってどういうことでしょう。受信イコライザや送信のエンファシスの問題か、それともSATAはリンクアップのときに、デバイスはまず3GbpsでリンクアップしようとしてALIGNを送ってくるからかもしれません。
つまり、1.5Gbpsにコンフィグした状態でCDR(クロック・データ・リカバリ)ユニットが3GbpsのALIGNを受け取るとおかしくなるとか。
まとめると、
- CDRがSpartan-6とだいぶん違いそうだ
- RXELECIDLEだけじゃなく、何か別の信号もいろいろ使って、CDRRESETとRXCDRHOLDを動かさなければならないのかもしれない。
- なぜか1.5Gbpsでは安定しない。3.0Gのほうが安定する
- イコライザはDFE AUTOでよく、受信終端電圧は600mVでよい
- クロックコレクションは自分でやるから特にいらない
です。
とりあえず、リセット関係の再点検と、イコライザレベル・電圧振幅などをデータシート上でチェックし、それでもダメなら工業試験場に行って高速オシロを使わせてもらって波形を見てこようと思います。
| 固定リンク
コメント