Newer
Older
目的:Vivadoの使い方になれるのをFixed Latencyトランシーバー実装を通じて行う。Fixed Latencyでのトランシーバーの実装の仕方を学ぶ。
また、IP Core GeneratorでつくってフラットなHDLコードで実装する技術はこの例のユニークなところで、その技術も学ぶ。
## 参考資料
- KC705 ユーザーズ・ガイド:[ug810_KC705_Eval_Bd.pdf](/uploads/33f3eaa6904d1b14a28ecd439b3b391f/ug810_KC705_Eval_Bd.pdf)
- KC705 回路図:[kc705_Schematic_xtp132_rev1_1.pdf](/uploads/0a432d78b91315dff3471c73a4bc11ac/kc705_Schematic_xtp132_rev1_1.pdf)
- 図表 [transceiver_lecture.pdf](/uploads/2767f29298dfaf26648223d8d57e0ef6/transceiver_lecture.pdf)
- 青木くん(東大博士課程学生)のATLS Phase-2 Upgarade 会合での発表資料 (https://indico.cern.ch/event/1020010/contributions/4304939/attachments/2221347/3761830/aoki_20210407_FixedLatency.pdf) (protected)
- YouTube動画(その1) https://www.youtube.com/watch?v=l3EDor-2qt0 (最初はGTトランシーバー一般についてのまとめ、その後に、作業を実演。51:47分頃より)
- YouTube動画(その2) https://www.youtube.com/watch?v=i39lgt6y_pY
## すでに準備されたものをとりあえず使ってみたい人向け
- \# 2020.1 の vivado をセットアップ
- cd kc705-transceiver-fixed-latency-test/
- cd projects
- vivado -source project_1/project_1.tcl
- \# あとは立ち上がったプロジェクトでcompileなりsimulationなりをやってみてください。
1. IP Core Generator で GT transceiver を作って example design をつくる。
2. Example designは閉じたループバックの試験になっているので、自分のprojectにインテグレートするような形になっていないので、若干の修正をする。
3. 必要なファイルをリストする。IPコアとして使うわけではなく、すっぴんのHDLコードを全部抜き出すというのが味噌なので注意。
4. 自分のプロジェクトをつくって、integrateする。
### テストファームウェアのデザイン
- KC705 ユーザーズ・ガイド:[ug810_KC705_Eval_Bd.pdf](/uploads/33f3eaa6904d1b14a28ecd439b3b391f/ug810_KC705_Eval_Bd.pdf)参照
- トランシーバーの設定
- BANK117 MGTREFCLK0 (125MHz clock)
- BANK117 (0から数えて2channel目) X0Y10 (SFP+に接続している)
- SYSTEM clock
- SYSCLK 200 MHz を transceiver reference clock とは独立なクロックとして使う
- 200 は "DFP クロック"としては選べないので、60MHzとしておく (後で追加するトップモジュールで200->60に分周する部分を含む)
### 1: IP Core Generator の Transceiver Wizard 機能を使って GT トランシーバーのコアを作る
- 'Manage IP' 機能から GT transceiver のコアを作る
- 適切な directory にいって Vivado 起動
- `Manage IP` -> `New IP Location`
- `Manage IP Settings` で以下を設定してIP作成プロジェクトを生成
- Part: `xc7k325tffg900-2`
- Target Language: `VHDL`
- Target Simulator: `Vivado Simulator`
- Simulator Language: `Mixed`
- IP location: `適切にディレクトリパスを記述(適切なディレクトリでvivadoを実行したならデフォルトで適切なパスがはいっていると思う)`
- `Transceiver Wizard` でGTトランシーバーのコアを作成
- `Search`で、`Transceiver`を検索し、その中で`7 Series FPGA Transceiver`を選択
- 名前は`gtwizard_0`のままでokay
- GT Selection タブ
- GT Type: `GTX` (強制的に選択)
- Shared Logic: `Include Shared Logic in example design` (selected by default)
- Line Rate, RefClk Selection タブ
- Protocol: `Start from scratch`
- TX
- Line Rate `3.125` Gbps (本当は`125x40=5Gbps`がよいデモなのですが、ちょっと練習でなぜかうまくいっていないので、デバッグする時間もないのでとりあえず今回のデモはこの実績があるこちらで。)
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
- Reference Clock `125` MHz
- RX (TXと同じ設定)
- PLL Selection:
- TX `CPLL`
- RX `CPLL`
- 左のマップで使うGT channelの選択
- X0Y0のGTXの選択を解除 ([] User GTX 0Y0 というチェックボックスをuncheckする)
- X0Y10のGTXを選択
- TX Clock Source `REFCLK0 Q2`
- RX Clock Source `REFCLK0 Q2` (強制的に選択)
- 他のチャンネルは選択ていないことを確認
- Encoding and Clocking タブ
- TX
- External Data Width `32` Bits
- Encoding `8B10B`
- Internal Data Width `40` Bits
- RX (TXと同じ設定)
- DRP/System Clock Frequency `60` MHz (defaultのまま修正せず)
- Optional Port `RXCHARISK` のみ強制的にチェックされている状態。その他はdefaultのまま修正せず
- Synchronization and Clocking
- Enable TX Buffer [Checked] (defaultのまま修正せず)
- TXUSRCLK Source [TXOUTCLK] (強制的に選択)
- TXOUCTLK Source: Use TXPLLREFCLK [Unchecked] (defaultのまま修正せず)
- Enable RX Buffer [Checked] (defaultのまま修正せず)
- RX Buffer Bypass Mode [Auto] (強制的に選択)
- RXUSRCLK Source [RXOUTCLK] (修正)
- RXOUCTLK Source: Use RXPLLREFCLK [Unchecked] (defaultのまま修正せず)
- Optional Ports: RXPMARESETのみが強制的にチェックされている状態。defaultのまま修正せず。
- Comma Alignment and Equalizationタブ
- RXCOMMA detection:
- Use comma detectionが強制的にチェックされている状態
- Comma Value: `K28.5` (default)
- Comma Mask: `11111111` (default)
- Decode valid comma only `unchecked` (default)
- Align to: `Four Byte Boundaries` (修正特に意味はないと思っているけど、一応こっちにしておきます)
- Combine plus/minus commas `unchecke` (default)`
- Optional Ports:
- RXSLIDE [checked] = 必須 (defaultでついている)
- RXBYTEISALIGN [checked] (必須ではないけど、今回のデモではモニターのために enable しましょう。)
- RXBYTEREALIGN [checked] (必須ではないけど、今回のデモではモニターのために enable しましょう。)
- RXCOMMADET [checked] (必須ではないけど、今回のデモではモニターのために enable しましょう。)
- Termination and Equalization
- Differential Swing and Emphasis Mode: `Custom`
- RX Equalization: Mode: `LPM-Auto`
- Automatic Gain Control: `Auto`
- RX Termination:Voltage: `Programmable`
- Trim Value: `800` mV
- Optional Ports: RXDFELPMRESETだけ強制的にチェックがかかっている状態、その他はdefaultのまま修正せず。
- PCIe, SATA, PRBS タブ [No change]
- CB and CC Sequence [No change]
- [OK] => Generate ("out of context per IP", "On local host" で Generate)
- Design Runs のタブで Out-of-Context Module Runs をモニターして `gtwizard_0_synth_1` が完了するのをまつ (終わったら右下に `Run Successfully Completed` とでてくる)
- Generate が完了するのをまって、`Open example design` (右クリックででてくる)。 exampleデザインを展開するディレクトリを決めて作成。
- 新しいProjectのGUIが立ち上がるので、それを放置して次の手続きへいく。
- example designを修正
- gtwizard でできた example design の以下のファイルを編集 (不要な部分を消して、そとに信号を出すようにする & fixed latency のためのパラメタの変更)
- `gtwizard_0_ex/gtwizard_0_ex.srcs/sources_1/ip/gtwizard_0/gtwizard_0_gt.vhd` (https://gitlab.cern.ch/okumura/kc705-gtx-demo-2022/-/blob/master/gtwizard_0/gtwizard_0_gt.vhd.diff)
- `gtwizard_0_ex/gtwizard_0_ex.srcs/sources_1/imports/example_design/gtwizard_0_exdes.vhd` (https://gitlab.cern.ch/okumura/kc705-gtx-demo-2022/-/blob/master/gtwizard_0/gtwizard_0_exdes.vhd.diff)
- '.diff' の拡張子がついたファイルは、emacs でみるとうまく色がついてくれてよいです。
- 不要なモジュール/data fileを project から削除 (simulationの用のソースも消しておくと、わかりやすくなって良いと思います。)
- 動画時間指定リンク:https://youtu.be/l3EDor-2qt0?t=6191
(補足:最初にリストしたファイルには一つ足りないものがあったことをあとのパートで気がつきました。気がつく部分はこちら https://youtu.be/l3EDor-2qt0?t=7796 )
- その上で、tclスクリプトを作成 `File` -> `Project` -> `Write Tcl`
- tcl ファイル内をみて add fileすべきファイルをリストする。これらが自分のプロジェクトにインテグレートしたいファイル。
- sources_1/imports/example_design/support/gtwizard_0_common.vhd
- sources_1/imports/example_design/support/gtwizard_0_common_reset.vhd
- sources_1/imports/example_design/support/gtwizard_0_gt_usrclk_source.vhd
- sources_1/imports/example_design/support/gtwizard_0_support.vhd
- sources_1/imports/example_design/gtwizard_0_exdes.vhd
- constrs_1/imports/example_design/gtwizard_0_exdes.xdc (これについては、実は全部自分のプロジェクトのトップに移動させているので、本質的には不要です。) (https://gitlab.cern.ch/okumura/kc705-gtx-demo-2022/-/blob/master/constrs/gtwizard_0_exdes.xdc.diff)
- 一方、xci はこの場合は使いません。xciの中で "手で修正をする必要がある"ためです。 **sources_1/ip/gtwizard_0/gtwizard_0.xci はインテグレートしません**。
- xci でできあいのIPとして組み込む代わりに、すべての必要な記述がはいっているコードを xci の代わりにインテグレートします。
- 逆に、そのまま使える場合はこのxciを組み込めばよいです。
- xciの代わりに組み込むフラットなHDLコードをリストしますgtwizard_0_ex.srcs/sources_1/ip/gtwizard_0/gtwizard_0.xml と、GUI中でみることができるツリーを参考にしながら足すファイルを決めます。
- stubというファイルは不要- simというファイルも不要HDLのコードと制約ファイルを vhd, v, xdc (**xdcファイルも組み込みが必要なので注意**) ファイルを注意してリストします。
- `gtwizard_0_ex/gtwizard_0_ex.srcs/sources_1/ip/gtwizard_0/`内のファイル
- `gtwizard_0_ex/gtwizard_0_ex.srcs/sources_1/ip/gtwizard_0/gtwizard_0/example_design/`内のファイル
- `mkdir constrs gtwizard_0 sources simulations projects` で準備
- 別で準備してあった top module 等 HDL ファイルを sources に追加 (git からとってくる)
- 別で準備してあった top module 用の xdc ファイルを constrs に追加 (exampleコードのトップのxdcから情報をmigrateしているのでよく注意する)
- gtwizard_0 に上で作ったファイルを追加
- 制約ファイルを準備する。gtwizard_0に先程作ったトランシーバーまわりのファイル群を置くconstrs に gtwizard_0.xdc と、gtwizard_0_exdes.xdc をもってくる。example design の top モジュールの xdc であった gtwizard_0_exdes.xdc については、別で準備した kc705_top.xdc にマージするため全部コメントアウトしてある。
- 別で準備してあった simulation 用のテストベンチファイルを simulations に追加
- `cd projects` をして `mkdir project_1; cd project_1` そこで、vivado をたちあげて、新しい projects をvivadoでつくる。`xc7k325tffg900-2`がパーツ番号。
### 5. 作ったビットファイルをKC705実機にダウンロードして正常動作を確認する
- 動画リンク:https://youtu.be/i39lgt6y_pY
- bitstreamをHardware managerでダウンロードする。
- LEDが光るのをみる。(LED0, 1, 2, 3, 4 が点灯状態)、LED5, 6, 7がカウントアップで動作
- TX comma pulseとRX comma pulseの間がfixed latencyとなっていることを確認する。(パルス幅は12.8ns, パルス間隔は12.8nsx8words=102.4ns。これがこうなることは手で計算をしてみてください。)