Kintex-7のIBERT検査のやり方
Cosmo-K0というKintex-7ボードを4台作ったので、ギガビットトランシーバの動作テストをしたいと思い、IBERT試験を行うことにしました。
この試験はギガビットトランシーバから信号を出して受けてそのエラーレートを計るもなのですが、受信や送信のタイミングや電圧を少しずつずらして、どの程度アイが広がっているかを見ることができます。
もちろん、そんな複雑な回路を自分で作るわけではなく、XILINXのIPを使います。
IBERT試験の回路は以前アルバイトさんが作ってくれたのがあったのですが、どのように作ったのかがよくわからないので、自分でも作ってみることにしました。
まず、普通にVivadoでプロジェクトを作ります。
そうしたら、IP Catalogをクリックし、Searchにibertと入力し、出てきた「IBERT 7 Series GTX」をクリックします。
IBERT 7 Series GTXのIPコアは、Block Designから使えないので IP Catalogから直接呼び出す必要があります。
ダイアログが開くので、Line Rateを10Gbpsにし、DataWidthを40bitに変更します。
RefClkは基板の設計によって異なるはずですが、Cosmo-K0の場合は150MHzのクロックと125MHzのクロックがGTXREFCLKにつながっています。ラインレートとクロック速度は綺麗な比になっていなければならないので125MHzのほうを選びます。
Protocol Selectionのタブでは、Protocol SelectedをCustom 1/10Gbpsにし、RefclkSelectionをMGTREFCLK1 116にします。
これでGTX Bank116のREFCLK1が使われます。
次のClock Settingsのタブでは、システムクロックをどうするかを選択するのですが、外部ピンのを使うか、GTXの中で使っているクロックを流用するかを決めます。当然ながらGTXのクロックを使いますのでQUAL116 1を選びます。
OKを押せば、コアが生成されます。
このダイアログにはRXOUTCLKをProbeするかというチェックボックスがありますが、これをONにしても受信クロックを内部の回路で使えるわけではなく、どこかのI/Oピンに割り当てられてしまいます。
IBERTコアは、入出力ピンのすべてが外部ピンを想定して作られています。ユーザ回路に埋め込むのではなく、これ単体でラッパして動かせという意図を感じます。
出来上がったコアをどのようにユーザ回路にインプリメントすればよいかというと、サンプル回路はコアを右クリックして出てくるプルダウンで「Open IP Example Design」を実行すると生成されます。
新しいVivadoのプロジェクトが、コアをインプリメントしたVHDLファイル(あるいはVerilogファイル)と共に、生成されます。
プロジェクト作成→コア作成→サンプルプロジェクト作成という手順で、トップのラッパを作るわけです。
XDCファイルも一緒に生成されますが、
set_property RXBUF_ADDR_MODE "FAST" [get_cells u_ibert_core/inst/QUAD[0].u_q/CH[*].u_ch/u_gtxe2_channel]
set_property RXBUF_EIDLE_HI_CNT 4'b1000 [get_cells u_ibert_core/inst/QUAD[0].u_q/CH[*].u_ch/u_gtxe2_channel]
set_property RXBUF_EIDLE_LO_CNT 4'b0000 [get_cells u_ibert_core/inst/QUAD[0].u_q/CH[*].u_ch/u_gtxe2_channel]
set_property RXBUF_EN "TRUE" [get_cells u_ibert_core/inst/QUAD[0].u_q/CH[*].u_ch/u_gtxe2_channel]
set_property RX_BUFFER_CFG 6'b000000 [get_cells u_ibert_core/inst/QUAD[0].u_q/CH[*].u_ch/u_gtxe2_channel]
set_property RXBUF_RESET_ON_CB_CHANGE "TRUE" [get_cells u_ibert_core/inst/QUAD[0].u_q/CH[*].u_ch/u_gtxe2_channel]
set_property RXBUF_RESET_ON_COMMAALIGN "FALSE" [get_cells u_ibert_core/inst/QUAD[0].u_q/CH[*].u_ch/u_gtxe2_channel]
set_property RXBUF_RESET_ON_EIDLE "FALSE" [get_cells u_ibert_core/inst/QUAD[0].u_q/CH[*].u_ch/u_gtxe2_channel]
set_property RXBUF_RESET_ON_RATE_CHANGE "TRUE" [get_cells u_ibert_core/inst/QUAD[0].u_q/CH[*].u_ch/u_gtxe2_channel]
set_property RXBUFRESET_TIME 5'b00001 [get_cells u_ibert_core/inst/QUAD[0].u_q/CH[*].u_ch/u_gtxe2_channel]
set_property RXBUF_THRESH_OVFLW 61 [get_cells u_ibert_core/inst/QUAD[0].u_q/CH[*].u_ch/u_gtxe2_channel]
set_property RXBUF_THRESH_OVRD "FALSE" [get_cells u_ibert_core/inst/QUAD[0].u_q/CH[*].u_ch/u_gtxe2_channel]
set_property RXBUF_THRESH_UNDFLW 4 [get_cells u_ibert_core/inst/QUAD[0].u_q/CH[*].u_ch/u_gtxe2_channel]
set_property RXDLY_CFG 16'h001F [get_cells u_ibert_core/inst/QUAD[0].u_q/CH[*].u_ch/u_gtxe2_channel]
set_property RXDLY_LCFG 9'h030 [get_cells u_ibert_core/inst/QUAD[0].u_q/CH[*].u_ch/u_gtxe2_channel]
set_property RXDLY_TAP_CFG 16'h0000 [get_cells u_ibert_core/inst/QUAD[0].u_q/CH[*].u_ch/u_gtxe2_channel]
のような謎パラメータが延々と並んでいるので、手作業で作るのは不可能でしょう。Vivadoに模範解答を作ってもらうしかありません。
このトップのHDLファイルとXDCファイルを自分のプロジェクトにコピーしてくれば、プロジェクトは完成です。
同軸ケーブルやSATAケーブルの場合は信号が出っぱなしになるのでいいのですが、光ファイバを使う場合にはSFPというモジュールのDISABLE信号を無効にしなければならないので、TOPのHDLファイルに
sfp_dis : out std_logic_vector(2 downto 0);
・・・
sfp_dis <= "000";
という感じで定数を出すだけの回路を追加することはできると思います。
IBERTコアは、クロックやリセット、エラー状態などを一切出さない孤高のコアなので、ユーザができることはほとんどありません。
このようにしてコアができたら、Generate Bitstreamをして書き込むと、IBERTのコアが埋め込まれたことをVivadoは感知します。
HW ManagerにIBERTというのが出てくるので、右クリックしてAuto Detect Linkを行って、Create Scanを開始すると、1次元のバスタブカーブや、
2Dスキャンといって時間と電圧を振るスキャンを行ってくれます。
このようにして、GTXからSFTを通じて光ファイバまで含めたトータルのギガビットリンクの性能(耐久性)が簡単に測れるというわけです。
やり方がわかってしまえば、すごく簡単です。
| 固定リンク
コメント