2.4K Views
January 26, 24
スライド概要
フィックスターズならではの「FPGA」に関する高速化手法、 効率的な開発ノウハウ、苦労話などについてお話しいたします。
<講演内容>
1、OpenNIC のユーザーロジック実装を試す
以前に AMD Xilinx から公開されている OpenNIC をご紹介しましたが、肝心のカスタム実装可能なユーザーロジック領域は未着手のままでした。
※前回セミナー資料: https://www.docswell.com/s/fixstars/ZJL9Y3-20230329
今回はそのユーザーロジック領域への追加実装による Smart NIC 化を試し、ご紹介したいと思います。
具体的には、予め設定したアドレスから送信されたパケットをドロップするファイアーウォール機能を実装してみる予定です。
2、AI を活用した FPGA 開発の新たなフロントライン:効率と革新の追求
AI の力を借りて FPGA (Field Programmable Gate Array) 開発を効率化し、より革新的なアプローチを探求する方法について深く掘り下げます。
まずはじめに、生成 AI と FPGA の基礎について触れ、生成 AI が FPGA 開発にどのように組み込まれ、
設計・プロトタイピング・テスト・デバッグの各フェーズにおいて開発者にどのような利益をもたらすのかを詳しく説明します。
次に、生成 AI を活用した先端事例 (例えば、自動化された設計やルーティングの最適化など) を紹介し、
AI を用いた FPGA 開発が製品のパフォーマンス向上、開発時間の短縮、およびコスト削減にどのように貢献していくのかを検討します。
このセミナーは、エンジニア、研究者、FPGA 開発者、または AI 技術に興味があるすべての人々にとって、
有益な情報と洞察を提供することを狙っています。
我々と一緒に、AI の力を借りて FPGA 開発の新しい時代を切り開く旅に出てみませんか?
・当社技術ブログ 記事: https://proc-cpuinfo.fixstars.com/
・フィックスターズグループ/セミナー一覧: https://www.fixstars.com/ja/seminar
・フィックスターズのFPGAシステム開発: https://www.fixstars.com/ja/services/fpga
フィックスターズは、コンピュータの性能を最大限に引き出すソフトウェア開発のスペシャリストです。車載、産業機器、金融、医療など、幅広い分野での開発経験があります。また、ディープラーニングや機械学習などの最先端技術にも力を入れています。 並列化や最適化技術を駆使して、マルチコアCPU、GPU、FPGA、量子アニーリングマシンなど、さまざまなハードウェアでソフトウェアを高速化するサービスを提供しています。さらに、長年の経験から培ったハードウェアの知識と最適化ノウハウを活かし、高精度で高性能なアルゴリズムの開発も行っています。 ・開催セミナー一覧:https://www.fixstars.com/ja/seminar ・技術ブログ :https://proc-cpuinfo.fixstars.com/
実践的!FPGA開発セミナー vol.24 2023/07/26 18:00~ Copyright© Fixstars Group 1
OpenNIC の ユーザーロジック実装を試す Copyright© Fixstars Group 2
Who I am Takashi UCHIDA 写真 内田 崇 ソリューション第四事業部 エンジニア Copyright© Fixstars Group
OpenNIC について ● AMD から提供されている open source のリポジトリ ● FPGA を NIC として動作させるための driver と FPGA design がセットで提 供されている ● 詳細は以下を参照 ○ 実践的!FPGA開発セミナー vol.19 ○ 実践的!FPGA開発セミナー vol.20 Copyright© Fixstars Group 4
今回の内容 ● 受信した ether header から 送信元 mac address を見て packet drop 判定を実施する 簡単な firewall を作成し、動 作することが確認できたた め、手順を紹介する ● 今回は 322 MHz 用の user_plugin (box_322mhz、 左図の赤枠) を使用 Copyright© Fixstars Group 5
agenda ● 作成した design の説明 ● user plugin を使用した合成手順 ● 動作確認結果 Copyright© Fixstars Group 6
作成した design の説明 (全体) ● PCIe 経由で register に設定 された mac address を drop module に AXI-Stream で渡 す ● axi register 部以外を block p2p_322mhz block design from / to PCIe axil_register drop 処理 from cmac ● to PCIe from PCIe to cmac 赤:AXI-Stream 黒:AXI-Lite ● Copyright© Fixstars Group design 化した axil register module は verilog で作成 ○ ベースとなる code が open-nic-shell に含まれ ていて簡単に作れそう だったため drop 処理は受信 packet のみ 7
作成した design の説明 (全体) generate for (genvar i = 0; i < NUM_CMAC_PORT; i = i + 1) begin ● を p2p_322mhz.sv で以下のようにして design_1_wrapper design_1_wrapper ( .M_AXIS_0_tdata (m_axis_cmac_tx_tdata[`getvec(512, i)]), .M_AXIS_0_tkeep (m_axis_cmac_tx_tkeep[`getvec(64, i)]), .M_AXIS_0_tlast 作成した block design の wrapper file instance して接続した ○ (m_axis_cmac_tx_tlast[i]), Open NIC の FPGA 実装は RTL base なので、手動でつなぐ必要が .M_AXIS_0_tready (m_axis_cmac_tx_tready[i]), .M_AXIS_0_tuser (m_axis_cmac_tx_tuser_err[i]), .M_AXIS_0_tvalid (m_axis_cmac_tx_tvalid[i]), .S_AXIS_0_tdata (axis_set_drop_mac_addr_tdata[`getvec(64, i)]), 数で instance 数を変えているため、そ .S_AXIS_0_tready (axis_set_drop_mac_addr_tready[i]), れに合わせた .S_AXIS_0_tvalid ある ● (axis_set_drop_mac_addr_tvalid[i]), ● ... design 全体で build 時の CMAC PORT 今回の build では CMAC PORT 使用数は 1 つのみ ); ● end endgenerate “`getvec” は open nic shell で用意され ている macro (index i に応じて 1 つ目の 引数 の数だけ取り出す Copyright© Fixstars Group 8
作成した design の説明 (register map) ● register map ○ 今回使用する box_322mhz は default では 0x10000 ~ 0x10FFF の address 領域が割り当 てられている ○ CMAC port の使用数に関わらず割り当てられているのでアドレスで各 port の領域を割り当 てることにした ● ○ 0x10000 - 0x107FF: port0 ○ 0x10800 - 0x10FFF: port1 今回設定する mac address は 6 byte なので、以下のように 2 address を使用して設定するように した address byte3 byte2 byte1 byte0 0x10000 addr0[31:24] addr0[23:16] addr0[15:8] addr0[7:0] 0x10004 0x00 0x00 addr0[47:40] addr0[39:32] 0x10008 addr1[31:24] addr1[23:16] addr1[15:8] addr1[7:0] … Copyright© Fixstars Group 9
作成した design の説明 (register map) ● axil regsiter 部分からの AXI-Stream は以下のように、書き込まれた address と data を送信する format とした ● drop 側は address から 設定される mac address の MSB 側 / LSB 側のどち らかを判断して格納するようにした [63:32] [31:0] 書き込まれた address 書き込まれた data Copyright© Fixstars Group 10
作成した design の説明 (block design) ● Alveo U250 が受信したパ ケットの ether header を取 り出して drop 処理部で判定 する ● Alveo U250 から送信される packet に対しては何もしな い ● drop 処理部 は vitis hls で 作成した Copyright© Fixstars Group 11
作成した design の説明 (drop 処理部) ● 大まかな流れは以下の通り ● 各処理部を dataflow pragma を適用 して接続 (左図の vitis hls の data flow viewer を参照) 入力 buffer parse 処理部 1. parse 処理部 で header と payload を分離し、header は drop 処理部、 drop 処理部 deparse 処理部 payload は depase 処理部 に渡す 2. drop 処理部で drop 判定を行い、 header と drop 判定結果を deparse 処理部 に渡す 3. deparse 処理部で入力された header と payload を再結合し、drop 判定結 果をもとに drop しない場合は出力す Copyright© Fixstars Group る 12
作成した design の説明 (drop 処理部) (疑似コード) ● void drop (入出力) { drop 処理部 は左の疑似コードのように して実装した while (true) { ○ if (header 入力あり)) break; drop 判定を行う header が入力さ れたら 判定を行い、 deparse 処理 if (drop address 更新入力あり) { (drop address を格納する内部配列を更新する) 部 に結果を渡す } ○ } header が入力されない状態で、設 定を更新する AXI-stream が入力 (drop 判定を実施する) されたら内部の配列に書き込む } Copyright© Fixstars Group 13
user plugin の使い方 directory の作成 ● ○ open-nic-shell の <open-nic-shell_top>/plugin/p2p directory をコピー し、必要なファイルを置く ○ hls は path を通せば良いため、不要 ○ 今回は box_322mhz ディレクトリ に axil register のコードを追加し、 block design の tcl file を p2p ディレクトリに追加し、以下の構成とした - p2p - box_250mhz - (default) - box_322mhz - (default) + axil register code - (default) + block_design tcl file Copyright© Fixstars Group 14
user plugin の使い方 (tcl file 全体) ● set design_bd_tcl_file "design_1.tcl" 今回使用した build_box_322mhz.tcl の read_verilog -quiet -sv p2p_322mhz.sv read_verilog -quiet box_322mhz/axil_slave_drop.v 全体は左の通り set_property ip_repo_paths <path_to_hls>/solution1/impl/ip [current_project] update_ip_catalog source $design_bd_tcl_file regenerate_bd_layout save_bd_design set design_bd_name [get_bd_designs] generate_target all [get_files $design_bd_name.bd] make_wrapper -files [get_files $design_bd_name.bd] -top -import update_compile_order -fileset sources_1 ● コピーした directory にあ る build_box_322mhz.tcl を編集する ● 一番上は block design の tcl file 名の定義なので適宜 save_bd_design 修正が必要 Copyright© Fixstars Group 15
user plugin の使い方 (tcl file 詳細) ● verilog の場合は、以下のように記載することで file が読み込まれる read_verilog -quiet box_322mhz/axil_slave_drop.v ● hls を使用している場合は、以下のように path を設定する set_property ip_repo_paths <path_to_vitis_hls_project>/solution1/impl/ip [current_project] ○ もし verilog で hls で作成した ip を使用したい場合は、以下のコマンドで ip を生成しておく (block design を使用する場合は block design tcl 内で生成されるので不要) create_ip -name <ip_name> -vendor xilinx.com -library hls -version 1.0 -module_name <module_name> Copyright© Fixstars Group 16
user plugin の使い方 (tcl file 詳細) ● もし verilog で IP を使用したい場合は、以下 2 通りの方法で可能 1. 予め生成した IP の xci file を import_files コマンドで import する import_files box_322mhz/drop_mac_addr_fifo.xci 2. tcl で IP を生成する command を書く create_ip -name axis_data_fifo -vendor xilinx.com -library ip -version 2.0 -module_name <module_name> set_property -dict [list CONFIG.TDATA_NUM_BYTES {8} CONFIG.FIFO_DEPTH {32} CONFIG.IS_ACLK_ASYNC {1} CONFIG.Component_Name {<module_name>}] [get_ips <module_name>] Copyright© Fixstars Group 17
user plugin の使い方 (tcl file 詳細) ● block design を使用する場合は、以下のように記載することで、open nic の build コマンドで block design の tcl ファイルからの block design の再現が 可能 source $design_bd_tcl_file regenerate_bd_layout save_bd_design set design_bd_name [get_bd_designs] generate_target all [get_files $design_bd_name.bd] make_wrapper -files [get_files $design_bd_name.bd] -top -import update_compile_order -fileset sources_1 save_bd_design Copyright© Fixstars Group 18
user plugin の使い方 (tcl file の編集) ● block design の tcl file は block design を開いた状態 で Export → Export Block Design で生成可能 Copyright© Fixstars Group 19
FPGA design のビルド ● open-nic-shell で準備されている build を実行する ● 詳細は 実践的!FPGA 開発セミナー vol.19 を参照 ● option として “-user_plugin <path_to_user_plugin>” を使用する ○ ● 設定しない場合は default の directory が適用される “-impl 1” の option を使用すれば以下のコマンドで (error がなければ) gui を開かな くても bitstream の生成まで実行される $ vivado -mode batch -srouce build.tcl -tclargs -board au250 -user_plugin <path_to_user_plugin> -impl 1 Copyright© Fixstars Group 20
design のビルド (参考) # Read user plugin files set include_dirs [get_property include_dirs [current_fileset]] foreach freq [list 250mhz 322mhz] { set box "box_$freq" set box_plugin ${user_plugin}/${box} ● open-nic-shell で準備されて いる build.tcl の user_plugin if {![file exists $box_plugin] || ![file exists ${user_plugin}/build_${box}.tcl]} { set box_plugin ${plugin_dir}/p2p/${box} } script 実行部分が左 ● register の address range を設定している crossbar は source ${box_plugin}/${box}_axi_crossbar.tcl read_verilog -quiet ${box_plugin}/${box}_address_map.v lappend include_dirs $box_plugin ここで必要 cd $user_plugin source build_${box}.tcl cd $script_dir ○ これらの file はコピーし てきた user_plugin } set_property include_dirs $include_dirs [current_fileset] directory に含まれてい るので特に追加する必要 はない Copyright© Fixstars Group 21
design のビルド ● ビルドが完了後、左図のように 作 成した block design が組み込まれ ていることが確認できた Copyright© Fixstars Group 22
動作確認 (構成) ● 以下の構成で drop する address の設定なし -> あり -> なしの順で 3 回ずつ HOST 1 から ping を実行した。 ● driver などの使用方法は 実践的!FPGA開発セミナー vol.19 を参照 HOST 1 (Ubuntu 20.04.6 LTS) HOST 2 (Ubuntu 22.04.1 LTS) Alveo U250 (192.168.10.2) ConnectX-5 (192.168.10.1) 100Gbps DACケーブル Copyright© Fixstars Group 23
動作確認 (pcimem) ● PCIe 経由での FPGA 内の register への書き込みは open-nic-shell で紹介さ れている pcimem を使用した ● 単純に repository を clone、 make して README に書かれている通りに以 下のようにして書き込める $ sudo ./pcimem /sys/bus/pci/devices/0000\:01\:00.0/resource2 0x10000 w*1 0x12345678 Copyright© Fixstars Group 24
動作確認結果 (ping log) 設定したときだけ packet が drop されていることが確認できた $ ping 192.168.10.1 -c 3 PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data. 64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.320 ms 64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=0.445 ms 64 bytes from 192.168.10.1: icmp_seq=3 ttl=64 time=0.208 ms 応答あり --- 192.168.10.1 ping statistics --3 packets transmitted, 3 received, 0% packet loss, time 2025ms rtt min/avg/max/mdev = 0.208/0.324/0.445/0.096 ms $ ping 192.168.10.1 -c 3 PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data. 応答なし --- 192.168.10.1 ping statistics --3 packets transmitted, 0 received, 100% packet loss, time 2028ms $ ping 192.168.10.1 -c 3 PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data. 64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.233 ms 64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=0.333 ms 64 bytes from 192.168.10.1: icmp_seq=3 ttl=64 time=0.289 ms 応答あり --- 192.168.10.1 ping statistics --3 packets transmitted, 3 received, 0% packet loss, time 2040ms rtt min/avg/max/mdev = 0.233/0.285/0.333/0.040 ms Copyright© Fixstars Group 25
動作確認結果 (wireshark) wireshark での packet capture でも問題なく drop されていることが確認できた Alveo U250 側 NIC 側 Copyright© Fixstars Group 26
動作確認結果 (system ILA, drop 設定なし) 出力があるのが確認できる Copyright© Fixstars Group 27
動作確認結果 (system ILA, drop 設定あり) 出力されていないことが確認できる Copyright© Fixstars Group 28
まとめ ● Open NIC の user_plugin を使用して packet drop をする簡単な firewall を 作成することができた ● もう少し負荷の大きい処理 (vitis library の暗号処理など) を FPGA にオフ ロード実装してみるのも面白そう ● vol.20 で未完となっているボトルネックの解析も個人的には追究したい (セ ミナーで発表するかは未定) Copyright© Fixstars Group 29
参考) iperf の性能 $ iperf -s -----------------------------------------------------------Server listening on TCP port 5001 TCP window size: 128 KByte (default) -----------------------------------------------------------[ 1] local 192.168.10.1 port 5001 connected with 192.168.10.2 port 49084 [ 2] local 192.168.10.1 port 5001 connected with 192.168.10.2 port 49082 [ 3] local 192.168.10.1 port 5001 connected with 192.168.10.2 port 49066 [ 4] local 192.168.10.1 port 5001 connected with 192.168.10.2 port 49090 [ 5] local 192.168.10.1 port 5001 connected with 192.168.10.2 port 49086 [ 6] local 192.168.10.1 port 5001 connected with 192.168.10.2 port 49094 [ 7] local 192.168.10.1 port 5001 connected with 192.168.10.2 port 49100 [ 8] local 192.168.10.1 port 5001 connected with 192.168.10.2 port 49108 [ ID] Interval Transfer Bandwidth [ 8] 0.0000-10.0007 sec 5.59 GBytes 4.80 Gbits/sec [ 2] 0.0000-10.0030 sec 7.03 GBytes 6.04 Gbits/sec [ 5] 0.0000-10.0024 sec 4.28 GBytes 3.68 Gbits/sec [ 1] 0.0000-10.0061 sec 5.90 GBytes 5.06 Gbits/sec [ 6] 0.0000-10.0220 sec 4.38 GBytes 3.75 Gbits/sec [ 3] 0.0000-10.0240 sec 4.93 GBytes 4.23 Gbits/sec [ 7] 0.0000-10.0219 sec 4.13 GBytes 3.54 Gbits/sec [ 4] 0.0000-10.0234 sec 3.96 GBytes 3.40 Gbits/sec [SUM] 0.0000-10.0250 sec 40.2 GBytes 34.5 Gbits/sec Copyright© Fixstars Group ● ● drop 処理を入れたことによる明確 な性能低下は (今のところは) なし ただし、まだ open nic の性能を引 き出し切れていないと思われるた め、throughput が改善した場合は 影響する可能性はある 30
AI を活用したFPGA 開発の 新たなフロントライン: 効率と革新の追求 Copyright© Fixstars Group 31
Who I am Shinya KAJI 写真 梶 信也 ソリューション第四事業部 事業部長 Copyright© Fixstars Group 32
本日お話しすること 実践的!FPGA開発セミナー vol.21 の Lightning Talk で発表した、 『Generative AI を活用した FPGA 開発談』の続編として、 生成 AI を利活用して楽しい FPGA ライフを送るためのヒントを提供します。 1. 生成 AI (のベースと言われる Transformer) とは? 2. FPGA とは? 3. FPGA 開発における生成 AI 活用 4. 少し先の未来に起こること 5. まとめ Copyright© Fixstars Group 33
注意事項 ● 本セミナーは生成 AI 関連ツール (e.g. ChatGPT) の 使用を推奨するものではありません ● 生成 AI 関連ツールを使用する際には 重要情報の流出には十分注意してください Copyright© Fixstars Group 34
生成 AI のベースとなっている Transformer とは? Transfomer とは? Google の研究者が『Attention Is All You Need』 で発表した深層学習モデル。 何が良いのか? ● 高速動作 ○ ● 高い精度 ○ ● 並列処理を可能に(可能になったため学習) Compute, Dataset, Parameter で性能向上 汎用性 ○ テキストだけでなく画像や音声にも適用可能 Copyright© Fixstars Group 引用元:『Attention Is All You Need』 https://arxiv.org/pdf/1706.03762.pdf 35
生成 AI のベースとなっている Transformer とは? (続) [ Transformer の分類 ] Transformer には、 アーキテクチャの変更の種類、 事前学習方法、 アプリケーション の3つの観点から様々な派生が存在す る。 Copyright© Fixstars Group 引用元:『A Survey of Transformers』 https://arxiv.org/pdf/2106.04554.pdf 36
(念のために) FPGA について FPGA(英: field-programmable gate array)は、製造後に購入者や設計者が構成を設定で きる集積回路であり、広義にはPLD(プログラマブルロジックデバイス)の一種である。現 場でプログラム可能なゲートアレイであることから、このように呼ばれている。 (Wikipedia より引用) FPGA の特徴 1. 2. 3. 引用元:https://ja.wikipedia.org/wiki/FPGA 性能 ○ 専用ロジックの実装により、 高い性能を引き出すことが可能 柔軟性 ○ FPGA のリソースが許す限り、 ユーザ仕様の独自回路が実現可能 ○ いつでも再構成出来るため、 ユーザロジックの追加、変更、削除が可能 低消費電力 ○ 動作周波数を低く抑えられるため、 CPU や GPU よりも低消費電力 Copyright© Fixstars Group 37
FPGA 開発における生成 AI 活用 要件定義 技術調査 設計 (デザインレビュー) 実装 (コードレビュー) 調査/設計/実装工程で 生成 AI を活用してみました! テスト デバッグ Copyright© Fixstars Group 38
要件定義/技術調査:Code Reading への活用 ChatGPT に様々なプラグインが追加可能。 (右図のようなフローチャートを作成) 既存コードを調査したり理解を深めたりする際 にコードの可視化や重要なポイントに絞って詳 細な解説を求めることができるため、 慣れない分野の実装でも比較的短時間で概要を 理解することができる。 Copyright© Fixstars Group 39
設計/レビュー:ドキュメンテーションへの活用 ChatGPT にプロトタイプ実装を渡すとソースコードの解説が出力される。 (ソースコードが仕様というタイプのエンジニアに活用してほしい機能) The Verilog module provided is a simple 4-bit up-counter with synchronous reset (active high). Let me explain how this counter works: 1. 2. 3. 4. Module Ports: a. CLK: This is the clock input, and the counter will increment on the positive edge of the clock signal. b. RST: This is the reset input, and when it is asserted (high), the counter will be reset to 0. c. COUNT: This is a 4-bit output that represents the current count value. always_ff Block: a. The module contains an always_ff block, indicating that it is sensitive to the positive edge of the clock (posedge CLK). Additionally, it is also sensitive to the positive edge of the reset (posedge RST). Reset Behavior: a. When the reset (RST) signal is asserted (high), the counter (COUNT) is reset to 0 (4'h0). Counting Behavior: a. When the clock (CLK) is positive-edge triggered and the reset (RST) is not asserted, the counter will increment its current value (COUNT) by 1 (4'h1). Copyright© Fixstars Group 40
実装/レビュー:コードレビューへの活用 コードレビューに利用してコードの品質を担保 and/or 改善する。 以下のコードは System Verilog で実装した 4bit カウンターです。 コードレビューしてください。 module counter ( SH input clk, input rstn, output reg[3:0] out); always @ (posedge clk) begin if (! rstn) out <= 0; else out <= out + 1; end endmodule Copyright© Fixstars Group 41
実装/レビュー:コードレビューへの活用 (続) コードは非常にシンプルで簡潔な 4ビットカウンタですが、一部改善できる点があります。 以下に提案を挙げてみます。 1. 2. 3. rstn がアクティブローのリセット信号であることを示すために、rst_n や nRST のように名 前を変えることを検討してみてください。コードを読む際にリセット信号のポーラリティが明確 になります。 out はシンセサイズ可能なハードウェアの出力ポートに直接代入すると、何か問題が発生 した場合にデバッグが難しくなる可能性があります。一般的には、内部レジスタに結果を格 納してからそれを出力ポートに割り当てる方が良いです。 シンクロナスリセットを使用すると、リセットが解除されたときにカウンタが 1から始まることに 注意してください。アサート期間中にリセットが解除されると、カウンタは 0をスキップして1か ら始まります。もし、リセットが解除された後にカウンタが0から始まることが重要ならば、ア シンクロナスリセットを使用するべきです。 Copyright© Fixstars Group 42
実装/レビュー:コードレビューへの活用 (続) これらの点を考慮に入れた改善版のコードを以下に示します。 module counter ( input clk, input nRST, output [3:0] out ); reg [3:0] count; always @(posedge clk or negedge nRST) begin if (!nRST) count <= 0; else count <= count + 1; end assign out = count; endmodule Copyright© Fixstars Group 43
テスト/デバッグ:テストベンチ作成 コードレビューに利用してコードの品質を担保 and/or 改善する。 SH ありがとうございます。 ついでに System Verilog でテストベンチを作成してください。 Copyright© Fixstars Group 44
テスト/デバッグ:テストベンチ作成 (続) 以下に、あなたの 4ビットカウンタモジュールのテストベンチを示します。このテストベン チは、リセット状態から始め、リセットを解除した後、クロックエッジごとにカウンタが正し くインクリメントされることを確認します。 `timescale 1ns / 1ps module tb_counter; reg clk; reg nRST; wire [3:0] out; // Instantiate the counter module counter uut ( .clk(clk), .nRST(nRST), .out(out) ); (snip) Copyright© Fixstars Group 45
テスト/デバッグ:テストベンチ作成 (続) このテストベンチでは、クロック信号 clk が生成され、10ns周期で動作します。リセット信 号 nRST は初期状態では 0に設定され、10ns後に1に設定されます。これにより、カウン タはリセットから始まります。 テストベンチは合計 200ns後、つまり20のクロックサイクル後に停止します。その間、カウ ンタの出力 out は毎クロックサイクルでモニターされます。 結果のログを確認して、カウンタが期待通りに動作しているかを確認してください。 テストベンチに対する詳しい説明が提示されるため、プロンプティング を続けることで更にテストケースを拡充することも可能。 Copyright© Fixstars Group 46
少し先の話・・・ Flux Copilot: Generative AI for Hardware Design ● ハードウェアデザイン (回路図作成) を支援 @copilot, how would I connect these parts to make the LED flash at 1kHz? FPGA でのブロック図 設計でも複数のリファ レンス実装を学習すれ ば原理的には実現でき るはず… Copyright© Fixstars Group 引用元:Flux ブログ『Generative AI for Hardware Design』 https://www.flux.ai/p/blog/generative-ai-for-hardware-design 47
<参考情報> Synopsys.ai: AI-Powered EDA Suite システム・アーキテクチャ開発から製造に至るまでの開発フローでAIパワーの活用を可能にしたEDA ● DSO.ai (Design Space Optimization AI) ● VSO.ai (Verification Space Optimization) ● TSO.ai (Test Space Optimization AI) 引用元:Synopsys.ai https://www.synopsys.com/ai.html Copyright© Fixstars Group 48
まとめ 生成 ● ● ● ● AI を適切に活用することは FPGA エンジニアの生産性向上になる 既存技術や先行論文の調査に活用できる 仕様書などのドキュメント作成の一部をお任せできる 一人プロジェクトでもコードレビューができる 比較的小規模のコードであればテストベンチも自動作成 生成 AI の出力を評価するレビュー能力が益々重要になる ● 周りの人や OSS の設計/実装に触れる機会を増やし、違和感への感度を高める FPGA エンジニアの仕事がなくなることは (おそらく) ない ● ただし技術の恩恵を受けるためにも仕事のやり方はアップデートするのが望ましい 情報の取り扱いに対するセキュリティ意識を今まで以上に強く持つ (もしくはセキュリティが担保されるまでは使用を我慢する) Copyright© Fixstars Group 49
裏話 しっかりと生成 AI を活用しました! (素案をベースに修正&レビューを繰り返してブラッシュアップしました) SH 生成 AI を活用した効率的な FPGA 開発について講演したいので、セミナータイトルとセミナー概要を日本語 で提案してください。 もちろんです。以下に提案させていただきます。 -------------------------------------------------------------------------------セミナータイトル: 「AIを活用したFPGA開発の新たなフロントライン:効率と革新の追求」 セミナー概要: 本セミナーでは、AIの力を借りてFPGA(Field Programmable Gate Array)開発を効率化し、より革新的なアプローチを探求する 方法について深く掘り下げます。開発の初期段階からのデザイン最適化、テストプロセスの自動化、そして高度な問題解決まで、 AIがどのようにFPGA開発を推進するかの具体的な例を紹介します。 … Copyright© Fixstars Group 50
Thank you! お問い合わせ窓口 : [email protected] Copyright © Fixstars Group 51