2023年2月22日に開催した、「実践的!FPGA開発セミナーvol.19」の当日資料です。
Copyright© Fixstars Group実践的!FPGA開発セミナーvol.192023/02/22 18:00~
View Slide
Copyright© Fixstars GroupオープンソースでFPGA ボードをSmartNIC 化!
Copyright© Fixstars GroupWho I am写真RyujiNISHIDA西田 竜之ソリューション第四事業部 シニアエンジニア
Copyright© Fixstars Group自己紹介● 西田竜之○ FPGAを用いたシステム開発に従事○ ハードウェア開発をメインに担当○ 略歴■ 半導体ベンダ● サーバー向けASIC開発■ 映像事務機メーカー● 高画質エンジンLSI 映像機器向けFPGA開発■ フィックスターズ● FPGAを用いた高速取引金融システム● OpenCLによるアプリの高速化
Copyright© Fixstars Group本題の前に・・・● 実践的!FPGA 開発セミナー vol.15「続 Intel® Agilex™ 開発キットを用いた各種機能トライアル」■ HPS (ARMコア) 上での Linux 起動を紹介● インテル® FPGA Advent Calendar 2022 に投稿 ⇒● プレゼント対象(4 名)に選んで頂きました!○ 年末、投稿してみてはいかがでしょうか?参照URLhttps://qiita.com/ryujinishida/items/be74f4a91231886cedc1参照URLhttps://blog.qiita.com/adventcalendar-2022-presents-winners/ ・プレゼント品 Air Pods Pro
Copyright© Fixstars Group本日のAgenda1. SmartNICとは2. Intel® Agilex™ ボードを SmartNIC 化3. AMD Xilinx Alveo U250 ボードを SmartNIC 化
Copyright© Fixstars GroupSmartNIC とは● SmartNIC (Smart Network Interface Card)○ CPU 負荷のかかるネットワーク処理を NIC にオフロードする■ フィルタリング、暗号化、etc.○ FPGA の特徴を有効的に使える2019 Xilinx DataCenter Summit発表資料抜粋
Copyright© Fixstars GroupSmartNIC とは● SmartNIC 的なアプリケーション例2019 Xilinx DataCenter Summit発表資料抜粋
Copyright© Fixstars GroupSmartNIC とは● SmartNIC 製品例○ AMD Xilinx■ ALVEO™ SMARTRNIC○ Intel®FPGA■ SmartNIC N6000-PL参照URLhttps://japan.xilinx.com/applications/data-center/network-acceleration.html#smartnics参照URLhttps://www.intel.co.jp/content/www/jp/ja/products/details/fpga/platforms/smartnic/n6000-pl-platform.html
Copyright© Fixstars GroupSmartNIC とは● その他(参考)○ 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 コアが直接低レイヤの処理をする
Copyright© Fixstars GroupIntel® 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オープンソースで提供されているプラットフォームを利用して試行
Copyright© Fixstars GroupIntel® 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 ボードにポーティングする
Copyright© Fixstars GroupIntel® Agilex™ ボードを SmartNIC 化● Corundum: An Open-Source 100-Gbps NIC○ 構成■ P-Tile PCIe IP (Gen3) はストリーム入出力■ App にユーザーアプリケーションを実装する デザインは RTL (verilog)■ Linuxドライバも同梱されている
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 化
Copyright© Fixstars GroupIntel® Agilex™ ボードを SmartNIC 化● Corundum: An Open-Source 100-Gbps NIC○ ドライバビルド$ cd corundum/modules/mqnic$ make$ sudo insmod mqnic.ko■ Ubuntu で問題なくビルドできた (CentOS は未対応だった)
Copyright© Fixstars Group● Corundum: An Open-Source 100-Gbps NIC○ 実機確認 ⇒ 失敗■ .sof をコンフィグレーション & reboot■ lspci コマンドで PCI デバイスを確認 ⇒ 認識せず・・・○ デバッグ■ P-Tile Debug tool KitIntel® Agilex™ ボードを SmartNIC 化■ PLL もロックせず 全く動いていない・・■ クロック、リセット、ボード設定 を確認 ⇒ 問題なし(※ Intel 社に確認したところ、 ES 品ボードの初期不良の疑いがあり、 ボード返却と動作確認が必要とのこと) ⇒ 今回は断念
Copyright© Fixstars Group● ここまでのまとめ○ SmartNIC の紹介○ オープンソースの FPGA NIC 化プラットフォーム Corundum の紹介○ Intel® Agilex™ ボード実行トライアル■ 合成、ビルドは完了■ 実機確認でエラーIntel® Agilex™ ボードを SmartNIC 化
Copyright© Fixstars GroupWho I amTakashiUCHIDA内田 崇ソリューション第四事業部 エンジニア
Copyright© Fixstars Groupopen-nicとは?● AMD Xilinxから出ているFPGA designおよびdriver● open source● 内部ロジックをカスタムで追加可能(今回は未実施)
Copyright© Fixstars Groupopen-nicの構成open-nicは以下3つのrepositoryから構成される。● open-nic-shellFPGA designのrepository● open-nic-driverFPGAをHOSTから制御するためのdriverのrepository● open-nic-dpdkdpdkを使用したdriver(今回は未使用)
Copyright© Fixstars Groupopen-nic-shell● FPGA design● Vivado version 2020.x、2021.xに対応● 以下のboardに対応Xilinx Alveo U50, U55N, U200, U250, U280
Copyright© Fixstars Groupopen-nic-shell design 概要(1)● HOST - FPGA間の通信はopen-nic-driverを使用してPCIe経由でQDMAで行われる● QSFPの制御はCMAC IPが使用されている● ユーザーロジックを追加できる領域は2箇所(左図の灰色部)● CMACのポート数やQDMAのphysicalfunctionの実装数などをパラメータ設定可能● 今回の動作確認ではデフォルトで実行FPGA design 全体図(githubのREADMEから抜粋)
Copyright© Fixstars Groupopen-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から抜粋)
Copyright© Fixstars Groupopen-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から抜粋)
Copyright© Fixstars Groupopen-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を設定
Copyright© Fixstars Groupopen-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から抜粋)
Copyright© Fixstars Groupopen-nic-driver● HOSTからPCIe経由でFPGAにデータ転送やregister設定するためのdriver● OSは以下に対応している○ Ubuntu 18.04○ Ubuntu 20.04○ Ubuntu 22.04● open-nicで指定されているrepositoryのコードだと動作しなかった(固まった)ので今回は最新版(2023/2/21時点)のrepositoryで動作確認した
Copyright© Fixstars Groupopen-nicビルド手順● open-nic repositoryのscriptディレクトリ内で以下を実行する./checkout.sh .● これによりopen-nic-shellとopen-nic-driverのrepositoryがscriptフォルダ内にcloneされる
Copyright© Fixstars Groupopen-nic-shell 合成手順(1)注意) cmacの合成にはlicense(無料)が必要なので事前に取得/設定しておく必要がある● open-nicで使用するboardの種類などのoptionを指定して、TOP>/scriptにあるbuild.tclを実行例) alveo u250を指定する場合$ vivado -mode batch -source ./build.tcl -tclargs -board au250● open-nicで指定されているrepositoryの構成だとvivadoのversionが2020.2で固定されており変更する必要があるので注意● スクリプト実行完了後手動でGUIを立ち上げbitstreamを作成する
Copyright© Fixstars Groupscript(build.tcl)修正箇所例) vivadoのversionを2021.2にする場合53 # Vivado version check54 # 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 exit59 }
Copyright© Fixstars Groupopen-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_queueQDMAに使用するqueueの数を指定する(1 ~ 2048、default:512)● -num_cmac_port使用するCMAC port数を指定する(1 or 2、default 1)
Copyright© Fixstars GroupFPGA書き込み● bitファイルを書き込んだ後hot rebootしないとlspciで認識されないので注意● lspciでdeviceが以下のように表示されていればOK$ lspci | grep XilinxXX:XX.X Memory controller: Xilinx Corporation Device 903f
Copyright© Fixstars Groupdriver実行手順● 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
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
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ケーブル
Copyright© Fixstars Groupopen-nic動作確認(iperf)結果host01(client)$ iperf -c 192.168.10.2------------------------------------------------------------Client connecting to 192.168.10.2, TCP port 5001TCP window size: 4.00 MByte (default)------------------------------------------------------------[ 3] local 192.168.10.1 port 57708 connected with192.168.10.2 port 5001[ ID] Interval Transfer Bandwidth[ 3] 0.0-10.0 sec 16.6 GBytes 14.2 Gbits/sechost02(server)$ iperf -s------------------------------------------------------------Server listening on TCP port 5001TCP window size: 128 KByte (default)------------------------------------------------------------[ 1] local 192.168.10.2 port 5001 connected with192.168.10.1 port 57708[ ID] Interval Transfer Bandwidth[ 1] 0.0000-10.0009 sec 16.6 GBytes 14.2 Gbits/seciperfが動作することが確認できた。
Copyright© Fixstars Groupまとめ● AMD Xilinxから出ているopen sourceのopen-nicを実際に動かしてみた● 細かな注意点はあるが、比較的簡単にFPGAをNIC化できた
Copyright© Fixstars Group(Appendix)
Copyright© Fixstars GroupQDMA(IP)● QDMA wrapperに相当● MM(memory mapped)とST(stream)の2種類のAXIinterfaceを使用可能● Physical Functionおよびその周辺の回路はIPに含まれていないので準備する必要がある(open-nicのdesignにはRTL(verilog)が含まれている)● 今回のopen-nicではStreamのinterfaceを使用しているQDMA wrapper(IP) Architechture(PG302より抜粋)
Copyright© Fixstars GroupQDMA(参考)QDMA Architechture (PG302より抜粋)
Copyright © Fixstars GroupThank you!お問い合わせ窓口 : [email protected]