---
title: 実践的！FPGA開発セミナー vol.24（2023/07/26）
tags:  #fpga #fpga開発 #fpga開発シリーズ  
author: [株式会社フィックスターズ](https://convert.docswell.com/user/fixstars)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/YE65V261JV.jpg?width=480
description: フィックスターズならではの「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
published: January 26, 24
canonical: https://convert.docswell.com/s/fixstars/KGXPQ8-20230726
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/YE65V261JV.jpg)

実践的！FPGA開発セミナー
vol.24
2023/07/26 18:00～
Copyright© Fixstars Group
1


# Page. 2

![Page Image](https://bcdn.docswell.com/page/GE5YD26LE4.jpg)

OpenNIC の
ユーザーロジック実装を試す
Copyright© Fixstars Group
2


# Page. 3

![Page Image](https://bcdn.docswell.com/page/972G84M37R.jpg)

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


# Page. 4

![Page Image](https://bcdn.docswell.com/page/DJYV6MX8JM.jpg)

OpenNIC について
●
AMD から提供されている open source のリポジトリ
●
FPGA を NIC として動作させるための driver と FPGA design がセットで提
供されている
●
詳細は以下を参照
○
実践的！FPGA開発セミナー vol.19
○
実践的！FPGA開発セミナー vol.20
Copyright© Fixstars Group
4


# Page. 5

![Page Image](https://bcdn.docswell.com/page/V7NMZW19E8.jpg)

今回の内容
●
受信した ether header から
送信元 mac address を見て
packet drop 判定を実施する
簡単な ﬁrewall を作成し、動
作することが確認できたた
め、手順を紹介する
●
今回は 322 MHz 用の
user_plugin (box_322mhz、
左図の赤枠) を使用
Copyright© Fixstars Group
5


# Page. 6

![Page Image](https://bcdn.docswell.com/page/YJ9NZX53J3.jpg)

agenda
●
作成した design の説明
●
user plugin を使用した合成手順
●
動作確認結果
Copyright© Fixstars Group
6


# Page. 7

![Page Image](https://bcdn.docswell.com/page/GJ8K12YLED.jpg)

作成した 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


# Page. 8

![Page Image](https://bcdn.docswell.com/page/LJLZQ24Q7R.jpg)

作成した design の説明 (全体)
generate for (genvar i = 0; i &lt; 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 ﬁle
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


# Page. 9

![Page Image](https://bcdn.docswell.com/page/47MV18ZK7W.jpg)

作成した 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


# Page. 10

![Page Image](https://bcdn.docswell.com/page/P7R2L566J9.jpg)

作成した 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


# Page. 11

![Page Image](https://bcdn.docswell.com/page/PJXDWKMDEX.jpg)

作成した design の説明 (block design)
●
Alveo U250 が受信したパ
ケットの ether header を取
り出して drop 処理部で判定
する
●
Alveo U250 から送信される
packet に対しては何もしな
い
●
drop 処理部 は vitis hls で
作成した
Copyright© Fixstars Group
11


# Page. 12

![Page Image](https://bcdn.docswell.com/page/3JKXV5GDED.jpg)

作成した design の説明 (drop 処理部)
●
大まかな流れは以下の通り
●
各処理部を dataﬂow pragma を適用
して接続 (左図の vitis hls の data
ﬂow viewer を参照)
入力 buﬀer
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


# Page. 13

![Page Image](https://bcdn.docswell.com/page/LE35MKNPJ5.jpg)

作成した 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


# Page. 14

![Page Image](https://bcdn.docswell.com/page/8EDD63W3EG.jpg)

user plugin の使い方
directory の作成
●
○
open-nic-shell の &lt;open-nic-shell_top&gt;/plugin/p2p directory をコピー
し、必要なファイルを置く
○
hls は path を通せば良いため、不要
○
今回は box_322mhz ディレクトリ に axil register のコードを追加し、
block design の tcl ﬁle を p2p ディレクトリに追加し、以下の構成とした
-
p2p
- box_250mhz
- (default)
- box_322mhz
- (default) + axil register code
- (default) + block_design tcl ﬁle
Copyright© Fixstars Group
14


# Page. 15

![Page Image](https://bcdn.docswell.com/page/V7PXY49PE8.jpg)

user plugin の使い方 (tcl ﬁle 全体)
●
set design_bd_tcl_file &quot;design_1.tcl&quot;
今回使用した
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 &lt;path_to_hls&gt;/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 ﬁle 名の定義なので適宜
save_bd_design
修正が必要
Copyright© Fixstars Group
15


# Page. 16

![Page Image](https://bcdn.docswell.com/page/2JVLGXMV7Q.jpg)

user plugin の使い方 (tcl ﬁle 詳細)
●
verilog の場合は、以下のように記載することで ﬁle が読み込まれる
read_verilog -quiet box_322mhz/axil_slave_drop.v
●
hls を使用している場合は、以下のように path を設定する
set_property ip_repo_paths &lt;path_to_vitis_hls_project&gt;/solution1/impl/ip [current_project]
○
もし verilog で hls で作成した ip を使用したい場合は、以下のコマンドで ip を生成しておく
(block design を使用する場合は block design tcl 内で生成されるので不要)
create_ip -name &lt;ip_name&gt; -vendor xilinx.com -library hls -version 1.0 -module_name &lt;module_name&gt;
Copyright© Fixstars Group
16


# Page. 17

![Page Image](https://bcdn.docswell.com/page/5EGX8VG1JL.jpg)

user plugin の使い方 (tcl ﬁle 詳細)
●
もし verilog で IP を使用したい場合は、以下 2 通りの方法で可能
1. 予め生成した IP の xci ﬁle を import_ﬁles コマンドで 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 &lt;module_name&gt;
set_property -dict [list CONFIG.TDATA_NUM_BYTES {8} CONFIG.FIFO_DEPTH {32}
CONFIG.IS_ACLK_ASYNC {1} CONFIG.Component_Name {&lt;module_name&gt;}] [get_ips &lt;module_name&gt;]
Copyright© Fixstars Group
17


# Page. 18

![Page Image](https://bcdn.docswell.com/page/4JQ896XN7P.jpg)

user plugin の使い方 (tcl ﬁle 詳細)
●
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


# Page. 19

![Page Image](https://bcdn.docswell.com/page/K742X463J1.jpg)

user plugin の使い方 (tcl ﬁle の編集)
●
block design の tcl ﬁle は
block design を開いた状態
で Export → Export Block
Design で生成可能
Copyright© Fixstars Group
19


# Page. 20

![Page Image](https://bcdn.docswell.com/page/LJ1MN4VZEG.jpg)

FPGA design のビルド
●
open-nic-shell で準備されている build を実行する
●
詳細は 実践的！FPGA 開発セミナー vol.19 を参照
●
option として “-user_plugin &lt;path_to_user_plugin&gt;” を使用する
○
●
設定しない場合は default の directory が適用される
“-impl 1” の option を使用すれば以下のコマンドで (error がなければ) gui を開かな
くても bitstream の生成まで実行される
$ vivado -mode batch -srouce build.tcl -tclargs -board au250 -user_plugin &lt;path_to_user_plugin&gt; -impl 1
Copyright© Fixstars Group
20


# Page. 21

![Page Image](https://bcdn.docswell.com/page/GJW34XL6J2.jpg)

design のビルド (参考)
# Read user plugin files
set include_dirs [get_property include_dirs [current_fileset]]
foreach freq [list 250mhz 322mhz] {
set box &quot;box_$freq&quot;
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
○
これらの ﬁle はコピーし
てきた user_plugin
}
set_property include_dirs $include_dirs [current_fileset]
directory に含まれてい
るので特に追加する必要
はない
Copyright© Fixstars Group
21


# Page. 22

![Page Image](https://bcdn.docswell.com/page/4EZV26MRJ3.jpg)

design のビルド
●
ビルドが完了後、左図のように 作
成した block design が組み込まれ
ていることが確認できた
Copyright© Fixstars Group
22


# Page. 23

![Page Image](https://bcdn.docswell.com/page/Y765V2N1EV.jpg)

動作確認 (構成)
●
以下の構成で drop する address の設定なし -&gt; あり -&gt; なしの順で 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


# Page. 24

![Page Image](https://bcdn.docswell.com/page/G75YD25L74.jpg)

動作確認 (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


# Page. 25

![Page Image](https://bcdn.docswell.com/page/9J2G84N3JR.jpg)

動作確認結果 (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


# Page. 26

![Page Image](https://bcdn.docswell.com/page/DEYV6MP8EM.jpg)

動作確認結果 (wireshark)
wireshark での packet capture でも問題なく drop されていることが確認できた
Alveo U250 側
NIC 側
Copyright© Fixstars Group
26


# Page. 27

![Page Image](https://bcdn.docswell.com/page/VJNMZW5978.jpg)

動作確認結果 (system ILA, drop 設定なし)
出力があるのが確認できる
Copyright© Fixstars Group
27


# Page. 28

![Page Image](https://bcdn.docswell.com/page/YE9NZXY3E3.jpg)

動作確認結果 (system ILA, drop 設定あり)
出力されていないことが確認できる
Copyright© Fixstars Group
28


# Page. 29

![Page Image](https://bcdn.docswell.com/page/GE8K126L7D.jpg)

まとめ
●
Open NIC の user_plugin を使用して packet drop をする簡単な ﬁrewall を
作成することができた
●
もう少し負荷の大きい処理 (vitis library の暗号処理など) を FPGA にオフ
ロード実装してみるのも面白そう
●
vol.20 で未完となっているボトルネックの解析も個人的には追究したい (セ
ミナーで発表するかは未定)
Copyright© Fixstars Group
29


# Page. 30

![Page Image](https://bcdn.docswell.com/page/LELZQ29QJR.jpg)

参考) 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


# Page. 31

![Page Image](https://bcdn.docswell.com/page/4JMV18VKJW.jpg)

AI を活用したFPGA 開発の
新たなフロントライン：
効率と革新の追求
Copyright© Fixstars Group
31


# Page. 32

![Page Image](https://bcdn.docswell.com/page/PJR2L526E9.jpg)

Who I am
Shinya KAJI
写真
梶 信也
ソリューション第四事業部
事業部長
Copyright© Fixstars Group
32


# Page. 33

![Page Image](https://bcdn.docswell.com/page/PEXDWKDD7X.jpg)

本日お話しすること
実践的！FPGA開発セミナー vol.21 の Lightning Talk で発表した、
『Generative AI を活用した FPGA 開発談』の続編として、
生成 AI を利活用して楽しい FPGA ライフを送るためのヒントを提供します。
1. 生成 AI (のベースと言われる Transformer) とは？
2. FPGA とは？
3. FPGA 開発における生成 AI 活用
4. 少し先の未来に起こること
5. まとめ
Copyright© Fixstars Group
33


# Page. 34

![Page Image](https://bcdn.docswell.com/page/3EKXV5XD7D.jpg)

注意事項
● 本セミナーは生成 AI 関連ツール (e.g. ChatGPT) の
使用を推奨するものではありません
● 生成 AI 関連ツールを使用する際には
重要情報の流出には十分注意してください
Copyright© Fixstars Group
34


# Page. 35

![Page Image](https://bcdn.docswell.com/page/L735MK5PE5.jpg)

生成 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


# Page. 36

![Page Image](https://bcdn.docswell.com/page/87DD63D37G.jpg)

生成 AI のベースとなっている Transformer とは？ (続)
[ Transformer の分類 ]
Transformer には、
アーキテクチャの変更の種類、
事前学習方法、
アプリケーション
の3つの観点から様々な派生が存在す
る。
Copyright© Fixstars Group
引用元：『A Survey of Transformers』
https://arxiv.org/pdf/2106.04554.pdf
36


# Page. 37

![Page Image](https://bcdn.docswell.com/page/VJPXY4XP78.jpg)

(念のために) FPGA について
FPGA（英: ﬁeld-programmable gate array）は、製造後に購入者や設計者が構成を設定で
きる集積回路であり、広義にはPLD（プログラマブルロジックデバイス）の一種である。現
場でプログラム可能なゲートアレイであることから、このように呼ばれている。
（Wikipedia より引用）
FPGA の特徴
1.
2.
3.
引用元：https://ja.wikipedia.org/wiki/FPGA
性能
○ 専用ロジックの実装により、
高い性能を引き出すことが可能
柔軟性
○ FPGA のリソースが許す限り、
ユーザ仕様の独自回路が実現可能
○ いつでも再構成出来るため、
ユーザロジックの追加、変更、削除が可能
低消費電力
○ 動作周波数を低く抑えられるため、
CPU や GPU よりも低消費電力
Copyright© Fixstars Group
37


# Page. 38

![Page Image](https://bcdn.docswell.com/page/2EVLGXLVJQ.jpg)

FPGA 開発における生成 AI 活用
要件定義
技術調査
設計
(デザインレビュー)
実装
(コードレビュー)
調査／設計／実装工程で
生成 AI を活用してみました！
テスト
デバッグ
Copyright© Fixstars Group
38


# Page. 39

![Page Image](https://bcdn.docswell.com/page/57GX8VX1EL.jpg)

要件定義／技術調査：Code Reading への活用
ChatGPT に様々なプラグインが追加可能。
(右図のようなフローチャートを作成)
既存コードを調査したり理解を深めたりする際
にコードの可視化や重要なポイントに絞って詳
細な解説を求めることができるため、
慣れない分野の実装でも比較的短時間で概要を
理解することができる。
Copyright© Fixstars Group
39


# Page. 40

![Page Image](https://bcdn.docswell.com/page/4EQ8968NJP.jpg)

設計／レビュー：ドキュメンテーションへの活用
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&#039;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&#039;h1).
Copyright© Fixstars Group
40


# Page. 41

![Page Image](https://bcdn.docswell.com/page/KJ42X423E1.jpg)

実装／レビュー：コードレビューへの活用
コードレビューに利用してコードの品質を担保 and/or 改善する。
以下のコードは System Verilog で実装した 4bit カウンターです。
コードレビューしてください。
module counter (
SH
input clk,
input rstn,
output reg[3:0] out);
always @ (posedge clk) begin
if (! rstn)
out &lt;= 0;
else
out &lt;= out + 1;
end
endmodule
Copyright© Fixstars Group
41


# Page. 42

![Page Image](https://bcdn.docswell.com/page/LE1MN4MZ7G.jpg)

実装／レビュー：コードレビューへの活用 (続)
コードは非常にシンプルで簡潔な 4ビットカウンタですが、一部改善できる点があります。
以下に提案を挙げてみます。
1.
2.
3.
rstn がアクティブローのリセット信号であることを示すために、rst_n や nRST のように名
前を変えることを検討してみてください。コードを読む際にリセット信号のポーラリティが明確
になります。
out はシンセサイズ可能なハードウェアの出力ポートに直接代入すると、何か問題が発生
した場合にデバッグが難しくなる可能性があります。一般的には、内部レジスタに結果を格
納してからそれを出力ポートに割り当てる方が良いです。
シンクロナスリセットを使用すると、リセットが解除されたときにカウンタが
1から始まることに
注意してください。アサート期間中にリセットが解除されると、カウンタは
0をスキップして1か
ら始まります。もし、リセットが解除された後にカウンタが0から始まることが重要ならば、ア
シンクロナスリセットを使用するべきです。
Copyright© Fixstars Group
42


# Page. 43

![Page Image](https://bcdn.docswell.com/page/GEW34X36E2.jpg)

実装／レビュー：コードレビューへの活用 (続)
これらの点を考慮に入れた改善版のコードを以下に示します。
module counter (
input clk,
input nRST,
output [3:0] out
);
reg [3:0] count;
always @(posedge clk or negedge nRST) begin
if (!nRST)
count &lt;= 0;
else
count &lt;= count + 1;
end
assign out = count;
endmodule
Copyright© Fixstars Group
43


# Page. 44

![Page Image](https://bcdn.docswell.com/page/47ZV26VRE3.jpg)

テスト／デバッグ：テストベンチ作成
コードレビューに利用してコードの品質を担保 and/or 改善する。
SH
ありがとうございます。
ついでに System Verilog でテストベンチを作成してください。
Copyright© Fixstars Group
44


# Page. 45

![Page Image](https://bcdn.docswell.com/page/YJ65V2517V.jpg)

テスト／デバッグ：テストベンチ作成 (続)
以下に、あなたの 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


# Page. 46

![Page Image](https://bcdn.docswell.com/page/GJ5YD2YLJ4.jpg)

テスト／デバッグ：テストベンチ作成 (続)
このテストベンチでは、クロック信号 clk が生成され、10ns周期で動作します。リセット信
号 nRST は初期状態では 0に設定され、10ns後に1に設定されます。これにより、カウン
タはリセットから始まります。
テストベンチは合計 200ns後、つまり20のクロックサイクル後に停止します。その間、カウ
ンタの出力 out は毎クロックサイクルでモニターされます。
結果のログを確認して、カウンタが期待通りに動作しているかを確認してください。
テストベンチに対する詳しい説明が提示されるため、プロンプティング
を続けることで更にテストケースを拡充することも可能。
Copyright© Fixstars Group
46


# Page. 47

![Page Image](https://bcdn.docswell.com/page/LE35MK5DJ5.jpg)

少し先の話・・・
Flux Copilot: Generative AI for Hardware Design
●
ハードウェアデザイン (回路図作成) を支援
@copilot, how would I connect these parts to make the LED ﬂash at 1kHz?
FPGA でのブロック図
設計でも複数のリファ
レンス実装を学習すれ
ば原理的には実現でき
るはず…
Copyright© Fixstars Group
引用元：Flux ブログ『Generative AI for Hardware Design』
https://www.flux.ai/p/blog/generative-ai-for-hardware-design
47


# Page. 48

![Page Image](https://bcdn.docswell.com/page/8EDD63D2EG.jpg)

&lt;参考情報&gt; Synopsys.ai: AI-Powered EDA Suite
システム・アーキテクチャ開発から製造に至るまでの開発フローでAIパワーの活用を可能にしたEDA
● DSO.ai (Design Space Optimization AI)
● VSO.ai (Veriﬁcation Space Optimization)
● TSO.ai (Test Space Optimization AI)
引用元：Synopsys.ai
https://www.synopsys.com/ai.html
Copyright© Fixstars Group
48


# Page. 49

![Page Image](https://bcdn.docswell.com/page/V7PXY4XLE8.jpg)

まとめ
生成
●
●
●
●
AI を適切に活用することは FPGA エンジニアの生産性向上になる
既存技術や先行論文の調査に活用できる
仕様書などのドキュメント作成の一部をお任せできる
一人プロジェクトでもコードレビューができる
比較的小規模のコードであればテストベンチも自動作成
生成 AI の出力を評価するレビュー能力が益々重要になる
● 周りの人や OSS の設計／実装に触れる機会を増やし、違和感への感度を高める
FPGA エンジニアの仕事がなくなることは (おそらく) ない
● ただし技術の恩恵を受けるためにも仕事のやり方はアップデートするのが望ましい
情報の取り扱いに対するセキュリティ意識を今まで以上に強く持つ
(もしくはセキュリティが担保されるまでは使用を我慢する)
Copyright© Fixstars Group
49


# Page. 50

![Page Image](https://bcdn.docswell.com/page/2JVLGXL67Q.jpg)

裏話
しっかりと生成 AI を活用しました！
(素案をベースに修正＆レビューを繰り返してブラッシュアップしました)
SH
生成 AI を活用した効率的な FPGA 開発について講演したいので、セミナータイトルとセミナー概要を日本語
で提案してください。
もちろんです。以下に提案させていただきます。
-------------------------------------------------------------------------------セミナータイトル：
「AIを活用したFPGA開発の新たなフロントライン：効率と革新の追求」
セミナー概要：
本セミナーでは、AIの力を借りてFPGA（Field Programmable Gate Array）開発を効率化し、より革新的なアプローチを探求する
方法について深く掘り下げます。開発の初期段階からのデザイン最適化、テストプロセスの自動化、そして高度な問題解決まで、
AIがどのようにFPGA開発を推進するかの具体的な例を紹介します。
…
Copyright© Fixstars Group
50


# Page. 51

![Page Image](https://bcdn.docswell.com/page/5EGX8VX2JL.jpg)

Thank you!
お問い合わせ窓口 : hr-seminar@fixstars.com
Copyright © Fixstars Group
51


