Slide 1

Slide 1 text

Cyclone V SoC の Ether MAC を ベアメタルアプリから使ってみた話 @homelith 2019/11/09 RTLを語る会(16) Using EMAC peripherals on HPS bare metal apps for Cyclone V SoC

Slide 2

Slide 2 text

本日のお話 ARM コア CPU と FPGA が一緒になった SoC FPGA を触り始めました ARM コア用に用意されたハードマクロのペリフェラル群 (Ethernet / SDCard / USB ...)を使い倒すために 頑張ろうとした話です

Slide 3

Slide 3 text

導入 Terasic DE10-Nano  ・SoC FPGA 搭載品で   比較的安価&入手性高い  ・SD Card にイメージを焼いて   差し込むと Linux 起動とお手軽 FPGA 部のみを使って PID 制御で GPS 同期周波数源 (GPSDO) を作ったりしました “GPSと仲良くなってNTPサーバを作ろう” (第二版出ました) https://chofutech.booth.pm/items/1310612

Slide 4

Slide 4 text

イーサネットが使いたい RJ45 コネクタがついている Linux を起動すると eth0 として見える 1. FPGA 部から直接アクセスして使えな いか? 2. ギガビットイーサなので、 なるたけ高速に使いたい!

Slide 5

Slide 5 text

説明書を見ないでGO! DE10_NANO_SoC_GHRD.v の構造 (CPU 利用時のデザインテンプレート) クロックとか トップモジュール Ethernet RGMII PHY 接 続ピン hps_io (CPU 部の ポート定義) クロックとか トップモジュール Ethernet RGMII PHY 接 続ピン hps_io 自作 ネットワーク処 理 安直に考えた構造

Slide 6

Slide 6 text

ダメでした クロックとか トップモジュール Ethernet RGMII PHY 接 続ピン hps_io (CPU 部の ポート定義) ここは Cyclone V SoC においては HPS に接続固定 Arria 10 SoC などでは可能と思われる   Shared Pin Multiplexer に接続されており、   HPS への接続と FPGA 部への接続を   バンク単位で切り替え出来る 参考: Intel Arria 10 Hard Processor System Technical Reference Manual 26章 Hard Processor System I/O Pin Multiplexing

Slide 7

Slide 7 text

cv_5v4.pdf (Cyclone V Hard Processor System Technical Reference Manual) のブロック図 説明書を読む Ethernet MAC HPS 本体 メイン AXI インターコネクト FPGA 部 とのブリッジ

Slide 8

Slide 8 text

Connectivity Matrix (8章 System Interconnect) を見る限り、 FPGA to HPS Bridge から Ether MAC まで のアクセス経路はありそう FPGA -> EMAC 直接 アクセス可能か? ※ FPGA 部とのブリッジは HPS 側 からの開通が必要なので、最低限 開通用のプログラムを書き込む必 要がある

Slide 9

Slide 9 text

Ethernet MAC peripheral は port 0 : 0xFF700000 port 1 : 0xFF702000 にマッピングされており、 FPGA-to-HPS bridge から見 える模様 (右図 Peripherals and L3 GPV 領域) FPGA -> EMAC 直接 アクセス可能か?

Slide 10

Slide 10 text

考えられるアプローチ 作業1 MAC の初期化 作業2 EMAC <-> FPGA 間 パケット転送 特徴 性能 Linux のネットワークド ライバに任せる Linux 上のプログラムとして実装 (libpcap 等使用?) 実装が簡便、 起動に少々時間が掛かる (数十秒) ARM ベアメタルアプリ ケーションで実装 ARM ベアメタルアプリとして実装 HWLib 使えば実装も容易 か? FPGA 側から直接 AXI バスを通じて アクセス ↑ 構成からアップグレードで きる FPGA 側から直接アク セスして初期化 FPGA 側から直接 AXI バスを通じて アクセス 参考にできそうなコードが無 く大変かも知れない (多分) 低 高

Slide 11

Slide 11 text

考えられるアプローチ 作業1 MAC の初期化 作業2 EMAC <-> FPGA 間 パケット転送 特徴 性能 Linux のネットワークド ライバに任せる Linux 上のプログラムとして実装 (libpcap 等使用?) 実装が簡便、 起動に少々時間が掛かる (数十秒) ARM ベアメタルアプリ ケーションで実装 ARM ベアメタルアプリとして実装 HWLib 使えば実装も容易 か? FPGA 側から直接 AXI バスを通じて アクセス ↑ 構成からアップグレードで きる FPGA 側から直接アク セスして初期化 FPGA 側から直接 AXI バスを通じて アクセス 参考にできそうなコードが無 く大変かも知れない (多分) 低 高

Slide 12

Slide 12 text

Linux を起動して性能にアタリを付ける sftp (暗号化負荷、ディスク書き込み)込みで 80Mbps 程度

Slide 13

Slide 13 text

もうちょっと欲しい 1ポート上り下り計 80Mbps  → 2ポート間の中継では 40Mbps 程度となる可能性あり もう少し高速化したい

Slide 14

Slide 14 text

考えられるアプローチ 作業1 MAC の初期化 作業2 EMAC <-> FPGA 間 パケット転送 特徴 性能 Linux のネットワークド ライバに任せる Linux 上のプログラムとして実装 (libpcap 等使用?) 実装が簡便、 起動に少々時間が掛かる (数十秒) ARM ベアメタルアプリ ケーションで実装 ARM ベアメタルアプリとして実装 HWLib 使えば実装も容易 か? FPGA 側から直接 AXI バスを通じて アクセス ↑ 構成からアップグレードで きる FPGA 側から直接アク セスして初期化 FPGA 側から直接 AXI バスを通じて アクセス 参考にできそうなコードが無 く大変かも知れない (多分) 低 高

Slide 15

Slide 15 text

早速スタート マクニカ社の ”SoC FPGA ベアメタル All-in-One アプリケーション・サンプル” ( https://www.macnica.co.jp/business/semiconductor/articles/intel/131910/ ) を動かしてみる ARM DS-5 デバッガ(有償ライセンス)を使用して  ・ARM コアへの命令ロード&起動  ・デバッグコンソールの使用  ・ブレークポイントの設定 等を行う方法が解説されているが、 実機の UART シリアルコンソールが開通している DE10-Nano なら、 デバッガ無し& printf デバッグ前提で無償環境のみで開発可能

Slide 16

Slide 16 text

実機 + printf デバッグで開発していくために SoC はじめてガイド - DS-5 によるベアメタル・アプリケーション・デバッグ ( https://www.macnica.co.jp/business/semiconductor/articles/intel/118693/ ) の 8 章 “ベアメタル・アプリケーションを SD カードからスタンドアローン実行する例 ” を参考に、ベアメタルアプリケーションバイナリを生成し、 FAT パーティションに配置 ブートシーケンスは @ikwzm さん “FPGA+SoC+Linuxのブートシーケンス” ( https://qiita.com/ikwzm/items/c22d15803ed98f0e52ab ) を参考にセットアップ BootROM (ハードコード) u-boot-spl (preloader-mkpimage.bin) 2nd stage プリローダ u-boot 1.FPGA 部を   コンフィグレーション 2.自作アプリを起動する 自作アプリの バイナリ

Slide 17

Slide 17 text

いざイーサネット サンプルを使ってボタン押下 -> LED 点灯等の GPIO ペリフェラルの動作を確認 【大まかな手順】 GPIO ペリフェラルを qsys 上で接続してアドレスを割り当て、 ARM ベアメタルプログラムから該当ペリフェラルの HWLib ヘッダファイルを ロードして、API を叩けば OK   → いざイーサネットの HWLib をロードして・・・

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

イーサネットは未対応 ※本当にこの時点まで気づきませんでした・・

Slide 20

Slide 20 text

フォーラムにもこんな投稿が・・ Q. HWLib に Ethernet 関連らしき関数が   無いのだけど。 A. なさそう。   Altera さんが整備してくれることに期待。 A. Xilinx 環境にはあるのに!!!!! orz https://forums.intel.com/s/question/0D50P00003yySHOSA2 /altera-emac-hwlib-for-cyclone-v-soc?language=en_US Q. u-boot から移植しようと頑張ってるんだけど   色々詰まっている。 A. cv_5v4.pdf をちゃんと読み込むことだね。   俺はできた。君も頑張れ! https://forums.intel.com/s/question/0D50P00003yyQrYS AU/hps-baremetal-emac-driver?language=en_US その後3年音沙汰無し・・・ (※意訳)

Slide 21

Slide 21 text

仕方ないので  u-boot/drivers/net/designware.c  u-boot/drivers/net/dwmac_socfpga.c  u-boot/drivers/net/phy/micrel_ksz90x1.c あたりを見ながら、レジスタアクセスを IOWR / IORD 等のプリミティブな関数で 置き換えて、頑張って移植

Slide 22

Slide 22 text

動いた レイテンシも 1 ミリ秒以下と優秀? ※ FPGA 部で折り返した時の ping パケット

Slide 23

Slide 23 text

性能測定してみる FPGA 部にループバックのコードを書いて試験 ※ ARP 応答しないと ping 等が送れず面倒なので、i++ 高位合成で ARP 応答コードを作成 RJ45 コネクタ Micrel Ether PHY チップ ARM コア 試験機PC (ostinato) DDR3 メモリ ARPパケット 抽出分離 出力合流器 ARPパケット 応答生成器 IPv4パケットは全て跳ね返す ARP リクエストには応答を返す ARM HPS 部 FPGA 部 ボード上デバイス

Slide 24

Slide 24 text

測定結果 102 bytes Ping Echo Request パケットで 6kpps / 4.4Mbps

Slide 25

Slide 25 text

測定結果 1518 bytes までパディングしたパケットで 445pps / 5.3Mbps

Slide 26

Slide 26 text

遅い・・

Slide 27

Slide 27 text

原因 EMAC <-> HPS 間 : DMA 有効なので、速い       (※ EMAC ペリフェラルに DMA コントローラが内蔵されている) HPS <-> FPGA 間 : IOWR / IORD レジスタアクセス(32bit)で逐次処理            されているため、遅い   → mSGDMA(modular Scatter-Gather DMA)等を FPGA 側に付けて、     FPGA 側に SDRAM とのデータ転送作業を押し付ければ解決

Slide 28

Slide 28 text

その前に ARM ベアメタルアプリ自体のポテンシャルを見てみることに RJ45 コネクタ Micrel Ether PHY チップ 試験機PC (ostinato) DDR3 メモリ ARM HPS 部 ARM コア HPS 内で 全パケットを折り返す ボード上デバイス

Slide 29

Slide 29 text

測定結果(HPS のみ) 102 bytes Ping Echo Request パケットで 82kpps / 69.8Mbps

Slide 30

Slide 30 text

測定結果(HPS のみ) 1518 bytes までパディングしたパケットで 17kpps / 208Mbps

Slide 31

Slide 31 text

考察 DMA 有効下で 1 ポート上り下り計 200Mbps 程度   → 2 ポート間の中継の場合、     100 Mbps 程度まで落ちる可能性も   → 一旦 SDRAM を経由せずダイレクトに FPGA に転送     できればさらに高速化可能か

Slide 32

Slide 32 text

考えられるアプローチ 作業1 MAC の初期化 作業2 EMAC <-> FPGA 間 パケット転送 特徴 性能 Linux のネットワークド ライバに任せる Linux 上のプログラムとして実装 (libpcap 等使用?) 実装が簡便、 起動に少々時間が掛かる (数十秒) ARM ベアメタルアプリ ケーションで実装 ARM ベアメタルアプリとして実装 HWLib 使えば実装も容易 か? FPGA 側から直接 AXI バスを通じて アクセス ↑ 構成からアップグレードで きる FPGA 側から直接アク セスして初期化 FPGA 側から直接 AXI バスを通じて アクセス 参考にできそうなコードが無 く大変かも知れない (多分) 低 高

Slide 33

Slide 33 text

考えられるアプローチ 作業1 MAC の初期化 作業2 EMAC <-> FPGA 間 パケット転送 特徴 性能 Linux のネットワークド ライバに任せる Linux 上のプログラムとして実装 (libpcap 等使用?) 実装が簡便、 起動に少々時間が掛かる (数十秒) ARM ベアメタルアプリ ケーションで実装 ARM ベアメタルアプリとして実装 HWLib 使えば実装も容易 か? FPGA 側から直接 AXI バスを通じて アクセス ↑ 構成からアップグレードで きる FPGA 側から直接アク セスして初期化 FPGA 側から直接 AXI バスを通じて アクセス 参考にできそうなコードが無 く大変かも知れない (多分) 低 高 今後の課題としました (汎用性も低いので・・)

Slide 34

Slide 34 text

まとめ ・DE10-Nano イーサネットポートに FPGA 部から直接アクセスす るための ARM ベアメタルアプリを作りました ・100Mbps 程度まで出そうですが、まだまだ要改善です ・EMAC アクセス用のライブラリが出来たので、  他にも色々使って遊べそうです