« MAX1000とCYC1000の使い方をQiitaに投稿しました | トップページ | Artix-7のPCI Express基板を作りたい »

2020.04.21

Kintex-7のIBERT検査のやり方

Cosmo-K0というKintex-7ボードを4台作ったので、ギガビットトランシーバの動作テストをしたいと思い、IBERT試験を行うことにしました。

Kintexx4

この試験はギガビットトランシーバから信号を出して受けてそのエラーレートを計るもなのですが、受信や送信のタイミングや電圧を少しずつずらして、どの程度アイが広がっているかを見ることができます。

もちろん、そんな複雑な回路を自分で作るわけではなく、XILINXのIPを使います。

IBERT試験の回路は以前アルバイトさんが作ってくれたのがあったのですが、どのように作ったのかがよくわからないので、自分でも作ってみることにしました。

まず、普通にVivadoでプロジェクトを作ります。

Ibert1

そうしたら、IP Catalogをクリックし、Searchにibertと入力し、出てきた「IBERT 7 Series GTX」をクリックします。

IBERT 7 Series GTXのIPコアは、Block Designから使えないので IP Catalogから直接呼び出す必要があります。

Ibert2

ダイアログが開くので、Line Rateを10Gbpsにし、DataWidthを40bitに変更します。

RefClkは基板の設計によって異なるはずですが、Cosmo-K0の場合は150MHzのクロックと125MHzのクロックがGTXREFCLKにつながっています。ラインレートとクロック速度は綺麗な比になっていなければならないので125MHzのほうを選びます。

Ibert3

Protocol Selectionのタブでは、Protocol SelectedをCustom 1/10Gbpsにし、RefclkSelectionをMGTREFCLK1 116にします。

Ibert4

これでGTX Bank116のREFCLK1が使われます。

次のClock Settingsのタブでは、システムクロックをどうするかを選択するのですが、外部ピンのを使うか、GTXの中で使っているクロックを流用するかを決めます。当然ながらGTXのクロックを使いますのでQUAL116 1を選びます。

OKを押せば、コアが生成されます。

Ibert5

このダイアログにはRXOUTCLKをProbeするかというチェックボックスがありますが、これをONにしても受信クロックを内部の回路で使えるわけではなく、どこかのI/Oピンに割り当てられてしまいます。

IBERTコアは、入出力ピンのすべてが外部ピンを想定して作られています。ユーザ回路に埋め込むのではなく、これ単体でラッパして動かせという意図を感じます。

出来上がったコアをどのようにユーザ回路にインプリメントすればよいかというと、サンプル回路はコアを右クリックして出てくるプルダウンで「Open IP Example Design」を実行すると生成されます。

Ibert6

新しいVivadoのプロジェクトが、コアをインプリメントしたVHDLファイル(あるいはVerilogファイル)と共に、生成されます。

Ibert7

プロジェクト作成→コア作成→サンプルプロジェクト作成という手順で、トップのラッパを作るわけです。

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コアは、クロックやリセット、エラー状態などを一切出さない孤高のコアなので、ユーザができることはほとんどありません。

Ibert10

このようにしてコアができたら、Generate Bitstreamをして書き込むと、IBERTのコアが埋め込まれたことをVivadoは感知します。

HW ManagerにIBERTというのが出てくるので、右クリックしてAuto Detect Linkを行って、Create Scanを開始すると、1次元のバスタブカーブや、

Ibert9

2Dスキャンといって時間と電圧を振るスキャンを行ってくれます。

Ibert8

このようにして、GTXからSFTを通じて光ファイバまで含めたトータルのギガビットリンクの性能(耐久性)が簡単に測れるというわけです。

やり方がわかってしまえば、すごく簡単です。

|

« MAX1000とCYC1000の使い方をQiitaに投稿しました | トップページ | Artix-7のPCI Express基板を作りたい »

コメント

コメントを書く



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




« MAX1000とCYC1000の使い方をQiitaに投稿しました | トップページ | Artix-7のPCI Express基板を作りたい »