Slide 1

Slide 1 text

Copyright© Fixstars Group 実践的!FPGA開発セミナー vol.19 2023/02/22 18:00~

Slide 2

Slide 2 text

Copyright© Fixstars Group オープンソースで FPGA ボードを SmartNIC 化!

Slide 3

Slide 3 text

Copyright© Fixstars Group Who I am 写真 Ryuji NISHIDA 西田 竜之 ソリューション第四事業部  シニアエンジニア

Slide 4

Slide 4 text

Copyright© Fixstars Group 自己紹介 ● 西田竜之 ○ FPGAを用いたシステム開発に従事 ○ ハードウェア開発をメインに担当 ○ 略歴 ■ 半導体ベンダ ● サーバー向けASIC開発 ■ 映像事務機メーカー ● 高画質エンジンLSI 映像機器向けFPGA開発 ■ フィックスターズ ● FPGAを用いた高速取引金融システム ● OpenCLによるアプリの高速化

Slide 5

Slide 5 text

Copyright© Fixstars Group 本題の前に・・・ ● 実践的!FPGA 開発セミナー vol.15 「続 Intel® Agilex™ 開発キットを用いた各種機能トライアル」 ■ HPS (ARMコア) 上での Linux 起動を紹介 ● インテル® FPGA Advent Calendar 2022 に投稿 ⇒ ● プレゼント対象(4 名)に選んで頂きました! ○ 年末、投稿してみてはいかがでしょうか? 参照URL https://qiita.com/ryujinishida/items/be74f4a91231886cedc1 参照URL https://blog.qiita.com/adventcalendar-2022-presents-winners/ ・プレゼント品 Air Pods Pro

Slide 6

Slide 6 text

Copyright© Fixstars Group 本日のAgenda 1. SmartNICとは 2. Intel® Agilex™ ボードを SmartNIC 化 3. AMD Xilinx Alveo U250 ボードを SmartNIC 化

Slide 7

Slide 7 text

Copyright© Fixstars Group SmartNIC とは ● SmartNIC (Smart Network Interface Card) ○ CPU 負荷のかかるネットワーク処理を NIC にオフロードする ■ フィルタリング、暗号化、etc. ○ FPGA の特徴を有効的に使える 2019 Xilinx DataCenter Summit 発表資料抜粋

Slide 8

Slide 8 text

Copyright© Fixstars Group SmartNIC とは ● SmartNIC 的なアプリケーション例 2019 Xilinx DataCenter Summit 発表資料抜粋

Slide 9

Slide 9 text

Copyright© Fixstars Group SmartNIC とは ● SmartNIC 製品例 ○ AMD Xilinx ■ ALVEO™ SMARTRNIC ○ Intel®FPGA ■ SmartNIC N6000-PL 参照URL https://japan.xilinx.com/applications/data-center/network-acceleration.html#smartnics 参照URL https://www.intel.co.jp/content/www/jp/ja/products/details/fpga/platforms/smartnic/n6000-pl-platform.html

Slide 10

Slide 10 text

Copyright© Fixstars Group SmartNIC とは ● その他(参考) ○ P4 言語 https://p4.org/ ■ Programming Protocol-independent Packet Processors ■ データプレーンデバイス (NIC、スイッチ、ルーターなど) の パケット処理をプログラミングするドメイン固有言語 ■ ネットワーク用プロセッサ(ASIC, CPU)の制御に使用される ■ FPGA 製品でも P4 言語対応のものが多い ○ DPDK https://www.dpdk.org/ ■ The Data Plane Development Kit ■ 高速パケット処理用のライブラリ、ドライバ ■ カーネル機能をバイパスして CPU コアが直接低レイヤの処理をする

Slide 11

Slide 11 text

Copyright© Fixstars Group Intel® Agilex™ ボードを SmartNIC 化 ● 実行環境 ○ ホスト ■ OS:Ubuntu 18.04LTS ○ 使用 Agilex™ ボード ■ ES 品 ■ QSFP-DD x 2 ■ PCIe I/F ※ ES 品のため Gen4 未対応     NIC 化の I/F はそろっている ● SmartNIC として使うために・・・ ○ PCIe ⇔ Ethernet FPGA デザイン ○ Linux ドライバ 参照URL: https://www.intel.com/content/www/us/en/products/details/fpga/development- kits/agilex/f-series.html オープンソースで提供されている プラットフォームを利用して試行

Slide 12

Slide 12 text

Copyright© Fixstars Group Intel® Agilex™ ボードを SmartNIC 化 ● Corundum: An Open-Source 100-Gbps NIC ○ https://github.com/corundum/corundum 参照URL: https://cseweb.ucsd.edu//~snoeren/papers/corundum-fccm20.pdf 参照URL: https://docs.corundum.io/en/latest/index.html ■ サポートボードリスト Intel®FPGA ボード 対象のAgilex ボードにポーティングする

Slide 13

Slide 13 text

Copyright© Fixstars Group Intel® Agilex™ ボードを SmartNIC 化 ● Corundum: An Open-Source 100-Gbps NIC ○ 構成 ■ P-Tile PCIe IP (Gen3) はストリーム入出力 ■ App にユーザーアプリケーションを実装する デザインは RTL (verilog) ■ Linuxドライバも同梱されている

Slide 14

Slide 14 text

Copyright© Fixstars Group ● Corundum: An Open-Source 100-Gbps NIC ○ Quartus Prime 22.3 を使用 ○ ハードウェア構築 $ git clone https://github.com/corundum/corundum.git $ cd corundum/fpga/mqnic/DE10_Agilex/fpga_100g/fpga_24AR0 $ make ■ Quarutus プロジェクトが生成される ※ 実際には make がエラー返り値をうけて   途中停止するため、make を複数回実行 ■ ピン配置、PWRMGT 設定をポーティング対象の ボードに合わせて修正 ■ Quarutus を起動、合成を実行 Intel® Agilex™ ボードを SmartNIC 化

Slide 15

Slide 15 text

Copyright© Fixstars Group Intel® Agilex™ ボードを SmartNIC 化 ● Corundum: An Open-Source 100-Gbps NIC ○ ドライバビルド $ cd corundum/modules/mqnic $ make $ sudo insmod mqnic.ko ■ Ubuntu で問題なくビルドできた (CentOS は未対応だった)

Slide 16

Slide 16 text

Copyright© Fixstars Group ● Corundum: An Open-Source 100-Gbps NIC ○ 実機確認 ⇒ 失敗 ■ .sof をコンフィグレーション & reboot ■ lspci コマンドで PCI デバイスを確認 ⇒ 認識せず・・・ ○ デバッグ ■ P-Tile Debug tool Kit Intel® Agilex™ ボードを SmartNIC 化 ■ PLL もロックせず   全く動いていない・・ ■ クロック、リセット、ボード設定   を確認 ⇒ 問題なし (※ Intel 社に確認したところ、   ES 品ボードの初期不良の疑いがあり、   ボード返却と動作確認が必要とのこと)   ⇒ 今回は断念

Slide 17

Slide 17 text

Copyright© Fixstars Group ● ここまでのまとめ ○ SmartNIC の紹介 ○ オープンソースの FPGA NIC 化プラットフォーム Corundum の紹介 ○ Intel® Agilex™ ボード実行トライアル ■ 合成、ビルドは完了 ■ 実機確認でエラー Intel® Agilex™ ボードを SmartNIC 化

Slide 18

Slide 18 text

Copyright© Fixstars Group Who I am Takashi UCHIDA 内田 崇 ソリューション第四事業部  エンジニア

Slide 19

Slide 19 text

Copyright© Fixstars Group open-nicとは? ● AMD Xilinxから出ているFPGA designおよびdriver ● open source ● 内部ロジックをカスタムで追加可能(今回は未実施)

Slide 20

Slide 20 text

Copyright© Fixstars Group open-nicの構成 open-nicは以下3つのrepositoryから構成される。 ● open-nic-shell FPGA designのrepository ● open-nic-driver FPGAをHOSTから制御するためのdriverのrepository ● open-nic-dpdk dpdkを使用したdriver(今回は未使用)

Slide 21

Slide 21 text

Copyright© Fixstars Group open-nic-shell ● FPGA design ● Vivado version 2020.x、2021.xに対応 ● 以下のboardに対応 Xilinx Alveo U50, U55N, U200, U250, U280

Slide 22

Slide 22 text

Copyright© Fixstars Group open-nic-shell design 概要(1) ● HOST - FPGA間の通信はopen-nic-driverを 使用してPCIe経由でQDMAで行われる ● QSFPの制御はCMAC IPが使用されている ● ユーザーロジックを追加できる領域は2箇所 (左図の灰色部) ● CMACのポート数やQDMAのphysical functionの実装数などをパラメータ設定可 能 ● 今回の動作確認ではデフォルトで実行 FPGA design 全体図 (githubのREADMEから抜粋)

Slide 23

Slide 23 text

Copyright© Fixstars Group open-nic-shell design 概要(2) ● QDMA subsystem ● ザイリンクスのQDMA IPと、QDMA IPインター フェースと250MHzユーザーロジックボックスの橋渡 しをするRTLロジックが含まれる ● QDMAサブシステムと250MHzボックス間のインター フェースは、AXI4-streamプロトコルの変種を使用し ている ● CMAC subsystem ● ザイリンクスのCMAC IPといくつかのラッパーロジッ クが含まれる ● 1または2のCMACポートをサポートする2つのCMAC ポートの場合、専用のデータおよび制御インターフェ イスを持つCMACサブシステムのインスタンスが2つ 存在する ● CMACサブシステムは322MHzで動作し、 AXI4-streamプロトコルの変種を使用して322MHzの ユーザーロジックボックスに接続する FPGA design 全体図 (githubのREADMEから抜粋)

Slide 24

Slide 24 text

Copyright© Fixstars Group open-nic-shell design 概要(3) ● packet adapter ● 250MHz AXI-streamと322MHz AXI-stream間の変換 に使用される ● TXパスとRXパスの両方で、パケットモードFIFOとして 機能し、送出前にパケット全体をバッファリングする ● RXパスでは、CMACサブシステムインタフェースで欠 落しているバックプレッシャー機能を回復する ● system configuration ○ リセット機構を実装し、各コンポーネントのレジスタア ドレスを割り当てている ○ レジスタインタフェースはAXI4-liteプロトコルを使用 し、250MHzのクロックと位相が揃った125MHzで動作 する FPGA design 全体図 (githubのREADMEから抜粋)

Slide 25

Slide 25 text

Copyright© Fixstars Group open-nic-shell design 概要(4) ユーザーロジックのinterfaceは基本的にAXI4-streamだが、一部特殊 なデータが付随する。 250MHzのインターフェース(AXI4-streamベース) ● tvalid(1bit) ● tdata(512 bits) ● tkeep(64 bits) ● tlast(1 bit) ● tready(1 bit) ● tuser_size(16 bits):packet size(byte単位) ● tuser_src(16 bits) ● tuser_dst(16 bits) ○ MAC ports = CMACのポート(1 or 2) ○ cmac portとphysical functionの判別用 ○ 例) QDMA -> CMACの場合 FPGA design 全体図 (githubのREADMEから抜粋) tuser_src, tuser_dstのformat (READMEから抜粋) src dst 左赤丸 PCIe PFs 0固定 右赤丸 左赤丸の設定 そのまま) MAC Ports を設定

Slide 26

Slide 26 text

Copyright© Fixstars Group open-nic-shell design 概要(5) 322MHzのインターフェイスは以下の通り ● tvalid(1bit) ● tdata(512 bits) ● tkeep(64 bits) ● tlast(1 bit) ● tready(1 bit) ● tuser_err:パケットにエラーが発生している場合1 を設定 FPGA design 全体図 (githubのREADMEから抜粋)

Slide 27

Slide 27 text

Copyright© Fixstars Group open-nic-driver ● HOSTからPCIe経由でFPGAにデータ転送やregister設定するためのdriver ● OSは以下に対応している ○ Ubuntu 18.04 ○ Ubuntu 20.04 ○ Ubuntu 22.04 ● open-nicで指定されているrepositoryのコードだと動作しなかった(固まっ た)ので今回は最新版(2023/2/21時点)のrepositoryで動作確認した

Slide 28

Slide 28 text

Copyright© Fixstars Group open-nicビルド手順 ● open-nic repositoryのscriptディレクトリ内で以下を実行する ./checkout.sh . ● これによりopen-nic-shellとopen-nic-driverのrepositoryがscriptフォルダ内にcloneされる

Slide 29

Slide 29 text

Copyright© Fixstars Group open-nic-shell 合成手順(1) 注意) cmacの合成にはlicense(無料)が必要なので事前に取得/設定しておく必要がある ● open-nicで使用するboardの種類などのoptionを指定して、/scriptにあるbuild.tclを実行 例) alveo u250を指定する場合 $ vivado -mode batch -source ./build.tcl -tclargs -board au250 ● open-nicで指定されているrepositoryの構成だとvivadoのversionが2020.2で固定されており変 更する必要があるので注意 ● スクリプト実行完了後手動でGUIを立ち上げbitstreamを作成する

Slide 30

Slide 30 text

Copyright© Fixstars Group script(build.tcl)修正箇所 例) vivadoのversionを2021.2にする場合 53 # Vivado version check 54 # set VIVADO_VERSION "2020.2" 55 set VIVADO_VERSION "2021.2" 56 if {![string equal [version -short] $VIVADO_VERSION]} { 57 puts "OpenNIC shell requires Vivado version $VIVADO_VERSION" 58 exit 59 }

Slide 31

Slide 31 text

Copyright© Fixstars Group open-nic-shell 合成手順(2) build実行時のoptionを一部抜粋する。 ● -user_plugin ○ user pluginとしてuser logicをdesignに挿入するためのoption ○ user pluginを指定しない場合はdefaultで用意されているlogicが使用される ● -num_phys_func 使用するphysical functionの数を指定する(1 ~ 4、default:1) ● -num_queue QDMAに使用するqueueの数を指定する(1 ~ 2048、default:512) ● -num_cmac_port 使用するCMAC port数を指定する(1 or 2、default 1)

Slide 32

Slide 32 text

Copyright© Fixstars Group FPGA書き込み ● bitファイルを書き込んだ後hot rebootしないとlspciで認識されないので注 意 ● lspciでdeviceが以下のように表示されていればOK $ lspci | grep Xilinx XX:XX.X Memory controller: Xilinx Corporation Device 903f

Slide 33

Slide 33 text

Copyright© Fixstars Group driver実行手順 ● driverは最新版(2023/2/21時点)のrepositoryを使用すること ● repository内でmake後、以下コマンドでkernel moduleをinsertする $ sudo insmod onic.ko RS_FEC_ENABLED=1 ● 実行後、dmesgで確認してエラーがなければ問題なく動作している ● 注意点 1. ひとつ前の手順まで実行しlspciでXilinx deviceが確認できる状態にしてから実行すること 2. driverをinsert後FPGAを再度書き込む際は以下のコマンドでkernel moduleを取り除いてか ら実行すること $ sudo rmmod onic.ko

Slide 34

Slide 34 text

Copyright© Fixstars Group (dmsg log 例) $ dmsg … [ 366.528180] onic: loading out-of-tree module taints kernel. [ 366.528239] onic: module verification failed: signature and/or required key missing - tainting kernel [ 366.528737] OpenNIC Linux Kernel Driver 0.21 [ 366.528880] onic 0000:01:00.0 onic1s0f0 (uninitialized): Set MAC address to 00:0a:35:82:25:21 [ 366.528881] onic 0000:01:00.0: device is a master PF [ 366.528961] onic 0000:01:00.0: Allocated 8 queue vectors [ 366.529001] onic 0000:01:00.0: Number of CMAC instances = 1 [ 366.529012] onic 0000:01:00.0: Setup IRQ vector 34 with name onic1s0f0-0 [ 366.529019] onic 0000:01:00.0: Setup IRQ vector 35 with name onic1s0f0-1 [ 366.529027] onic 0000:01:00.0: Setup IRQ vector 36 with name onic1s0f0-2 [ 366.529034] onic 0000:01:00.0: Setup IRQ vector 37 with name onic1s0f0-3 [ 366.529040] onic 0000:01:00.0: Setup IRQ vector 38 with name onic1s0f0-4 [ 366.529047] onic 0000:01:00.0: Setup IRQ vector 39 with name onic1s0f0-5 [ 366.529054] onic 0000:01:00.0: Setup IRQ vector 40 with name onic1s0f0-6 [ 366.529060] onic 0000:01:00.0: Setup IRQ vector 41 with name onic1s0f0-7 [ 366.589007] onic 0000:01:00.0 enp1s0: renamed from onic1s0f0

Slide 35

Slide 35 text

Copyright© Fixstars Group ● 以下の構成で動作確認を行った 動作確認環境 HOST 1 (Ubuntu 20.04.4 LTS) HOST 2 (Ubuntu 22.04.1 LTS) u250 (192.168.10.1) ConnectX-5 (192.168.10.2) 100Gbps DACケーブル

Slide 36

Slide 36 text

Copyright© Fixstars Group open-nic動作確認(iperf)結果 host01(client) $ iperf -c 192.168.10.2 ------------------------------------------------------------ Client connecting to 192.168.10.2, TCP port 5001 TCP window size: 4.00 MByte (default) ------------------------------------------------------------ [ 3] local 192.168.10.1 port 57708 connected with 192.168.10.2 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 16.6 GBytes 14.2 Gbits/sec host02(server) $ iperf -s ------------------------------------------------------------ Server listening on TCP port 5001 TCP window size: 128 KByte (default) ------------------------------------------------------------ [ 1] local 192.168.10.2 port 5001 connected with 192.168.10.1 port 57708 [ ID] Interval Transfer Bandwidth [ 1] 0.0000-10.0009 sec 16.6 GBytes 14.2 Gbits/sec iperfが動作することが確認できた。

Slide 37

Slide 37 text

Copyright© Fixstars Group まとめ ● AMD Xilinxから出ているopen sourceのopen-nicを実際に動かしてみた ● 細かな注意点はあるが、比較的簡単にFPGAをNIC化できた

Slide 38

Slide 38 text

Copyright© Fixstars Group (Appendix)

Slide 39

Slide 39 text

Copyright© Fixstars Group QDMA(IP) ● QDMA wrapperに相当 ● MM(memory mapped)とST(stream)の2種類のAXI interfaceを使用可能 ● Physical Functionおよびその周辺の回路はIPに含 まれていないので準備する必要がある(open-nicの designにはRTL(verilog)が含まれている) ● 今回のopen-nicではStreamのinterfaceを使用し ている QDMA wrapper(IP) Architechture (PG302より抜粋)

Slide 40

Slide 40 text

Copyright© Fixstars Group QDMA(参考) QDMA Architechture (PG302より抜粋)

Slide 41

Slide 41 text

Copyright © Fixstars Group Thank you! お問い合わせ窓口 : [email protected]