---
title: 実践的！FPGA開発セミナー vol.13（2022/08/31）
tags:  #fpga #fpga開発 #fpga開発シリーズ  
author: [株式会社フィックスターズ](https://www.docswell.com/user/fixstars)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/5JGX3W9R7L.jpg?width=480
description: フィックスターズならではの「FPGA」に関する高速化手法、 効率的な開発ノウハウ、苦労話などについてお話しいたします。  ＜講演内容＞  1、論理検証の効率化＆自動化テクニック　～テストベンチ作成からCIまで　ラクできる検証環境を創る～  FPGA開発で、何時間も合成した回路が凡ミスで動かなかったという徒労感を経験された方は多いと思います。 モジュール設計をした際、ロジックシミュレーションで機能確認をしますが、この論理検証が確実にFPGAデザインを動作させる鍵です。 しかしながら、論理検証の重要性は理解しているものの、検証環境の準備やテストケースを網羅する工数が多くなるのであれば、実機で見てしまいたい、という誘惑にかられるのも確かです。 論理検証をもっと効率的に実行するために、 　- DPI-Cを利用したテストベンチ作成の効率化 　- シミュレーションのコマンドライン実行とmakeコマンド対応 　- git commit &amp; pushするだけで論理検証するCI環境の実現 といったテクニックを用いて構築した環境について紹介します。 Vivado Simulator, Questa*(Intel®️ FPGA)の両環境対応です。 論理検証の効率化、自動化をする環境を探している方、それ以外の方も、是非ご聴講ください！  2、AI Engine の使い方とシミュレーション方法の解説 第7回のセミナー では、Versal の AI Engine について、そのアーキテクチャの紹介を行いました。 本セミナーでは、 AI Engine を使用する際のプログラミング方法についてより詳細に解説し、無償のライセンスを使用して AI Engine のシミュレーションを行うフローを紹介します。   ・当社技術ブログ 記事：　https://proc-cpuinfo.fixstars.com/  ・フィックスターズグループ／セミナー一覧：　https://www.fixstars.com/ja/seminar  ・フィックスターズのFPGAシステム開発：　https://www.fixstars.com/ja/services/fpga
published: August 31, 22
canonical: https://www.docswell.com/s/fixstars/K6YJJM-20220831
---
# Page. 1

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

実践的！FPGA開発セミナー
vol.13
2022/08/31 18:00～
Copyright© Fixstars Group


# Page. 2

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

論理検証の効率化＆
自動化テクニック
～テストベンチ作成からCIまで
ラクできる検証環境を創る～
Copyright© Fixstars Group


# Page. 3

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

Who I am
Hiroki
NISHIMOTO
写真
西本 宏樹
ソリューション第四事業部
エンジニア
Copyright© Fixstars Group


# Page. 4

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

突然ですが、こんな経験ありませんか？
シミュレーションの波形見る感じ
動きそうだし、
合成回してみよう......
6時間後......
→ 動かない
Copyright© Fixstars Group
4


# Page. 5

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

突然ですが、こんな経験ありませんか？
ちょっと修正した回路、
簡単な変更しかしてないし、
シミュレーションはいらないかな......
6時間後......
→ 動かない
Copyright© Fixstars Group
5


# Page. 6

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

丁寧な論理検証は転ばぬ先の杖、しかし手間が......
『少しの手間を省かなければ避けられていたいたな...』
みたいなこと、誰しもあると思います。
- 期待値検証のため、
Cで書いたアプリケーションをSystemVerilogに書き直すの手間
- 立ち上がりに1,2分掛かるGUIを起動してチェックするのが億劫
- ちょっとした修正の度に毎回検証する待ち時間がもどかしい
こういった絶妙な手間は、どうしても億劫になり、
『多分動く......！（合成ボタンを押す）』の誘惑についつい乗ってしまいます
Copyright© Fixstars Group
6


# Page. 7

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

色々使って出来るだけストレスなく検証しよう
SystemVerilogでのテストベンチ作成が面倒
→ DPI-Cを使って、豊富なC/C++のライブラリを直接使おう
GUIの起動を待つのが億劫
→ CUI＆バッチ化で繰り返しのストレスなく論理検証をしよう
ちょっと修正する度にテストするのが......
→ 典型化したテストをCIに投げよう
Copyright© Fixstars Group
7


# Page. 8

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

今回の検証対象モジュール
AXI-Lite
グレースケール化係数
coef_r, coef_g, coef_b
AXI-Stream
ABA27AFFAA…
AXI-Stream
グレースケールモジュール
Output[i]
= Input[i].r × coef_r
+ Input[i].g × coef_g
+ Input[i].b × coef_b
2ABABC…
Copyright© Fixstars Group
8


# Page. 9

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

具体的な論理検証のシナリオ
1.
2.
3.
4.
5.
6.
7.
テストパラメータを設定
入力値・期待値を生成する
AXI-Liteで係数を書き込む
tvalidやtreadyの入力開始
入力値を検証対象モジュールへ送信する
検証対象モジュールからの出力値の受信する
期待値を用いた出力値の検証
Copyright© Fixstars Group
9


# Page. 10

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

具体的な論理検証のシナリオ
1.
2.
3.
4.
5.
6.
7.
テストパラメータを設定
入力値・期待値を生成する
AXI-Liteで係数を書き込む
tvalidやtreadyの入力開始
入力値を検証対象モジュールへ送信する
検証対象モジュールからの出力値の受信する
期待値を用いた出力値の検証
グレースケール化係数
coef_r, coef_g, coef_b
入力画像
tvalid, treadyは
- 遷移タイミングはランダム
- Highとなる頻度をパラメータとして与える
ex1) tvalid 50%, tready 50%
Copyright© Fixstars Group
ex2) tvalid 20%, tready 80%
10


# Page. 11

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

具体的な論理検証のシナリオ
1.
2.
3.
4.
5.
6.
7.
テストパラメータを設定
入力値・期待値を生成する
AXI-Liteで係数を書き込む
tvalidやtreadyの入力
入力値を検証対象モジュールへ送信する
検証対象モジュールからの出力値の受信する
期待値を用いた出力値の検証
Output[i]
= Input[i].r × coef_r
+ Input[i].g × coef_g
+ Input[i].b × coef_b
Copyright© Fixstars Group
11


# Page. 12

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

具体的な論理検証のシナリオ
1.
2.
3.
4.
5.
6.
7.
テストパラメータを設定
入力値・期待値を生成する
AXI-Liteで係数を書き込む
tvalidやtreadyの入力開始
入力値を検証対象モジュールへ送信する
検証対象モジュールからの出力値の受信する
期待値を用いた出力値の検証
グレースケール化係数
coef_r, coef_g, coef_b
グレースケールモジュール
Output[i]
= Input[i].r × coef_r
+ Input[i].g × coef_g
+ Input[i].b × coef_b
Copyright© Fixstars Group
12


# Page. 13

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

具体的な論理検証のシナリオ
1.
2.
3.
4.
5.
6.
7.
テストパラメータを設定
入力値・期待値を生成する
AXI-Liteで係数を書き込む
tvalidやtreadyの入力開始
入力値を検証対象モジュールへ送信する
検証対象モジュールからの出力値の受信する
期待値を用いた出力値の検証
期待値
出力画像
FAILED
Copyright© Fixstars Group
OK
13


# Page. 14

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

色々使って出来るだけストレスなく検証しよう
SystemVerilogで期待値作成が面倒
→ DPI-Cを使って、豊富なCのライブラリを直接使おう
GUIの起動を待つのが億劫
→ CUI＆バッチ化で繰り返しのストレスなく論理検証をしよう
ちょっと修正する度にテストするのが......
→ 典型化したテストをCIに投げよう
Copyright© Fixstars Group
14


# Page. 15

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

DPI-Cとは？
Direct Programming Interface : DPI
用いることで他言語とSystemVerilogを接続できる
SystemVerilog
export &quot;DPI-C&quot; task run_stream;
C/C++
C/C++で呼び出すための関数を
生成するための宣言
run_stream();
task automatic run_stream;
SystemVerilogのtaskの実装部分
…
C/C++での
呼び出し
endtask : run_stream
import &quot;DPI-C&quot; context task
int c_main(
c_main(input string testcase, output int ret);
const char* testcase_file,
int* ret){
C/C++関数をSystemVerilog で呼び出すための宣言
…
c_main(testcase_file, ret);
}
SystemVerilogでの呼び出し
C/C++の関数の実装部分
Copyright© Fixstars Group
15


# Page. 16

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

設定値読み込みはC++のライブラリを用いて楽に
1. テストパラメータを設定
&lt;テストケース名&gt;.cfg
DPI-C
C/C++ライブラリ
呼び出し
ファイル
読み込み
・解析
テストベンチ
(SystemVerilog)
&lt;テストケース名&gt;
&lt;テストパラメータ&gt;
GenImage.width = 256
GenImage.height = 256
…
width = 256
height = 256
…
DPI-C パラメータ
設定タスク呼び出し
Copyright© Fixstars Group
テストパラメータ設定
16


# Page. 17

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

期待値はライブラリで計算したものをそのまま持ってくる
2. 入力値・期待値を生成する
ファイル
読み込み・解析
(png, bmp, etc.)
DPI-C
C/C++ライブラリ呼び出し
グレー
スケール化
DPI-C テストデータ
設定タスク呼び出し
テストベンチ
(SystemVerilog)
&lt;入力値テストデータ&gt;
ABA27AFFAA…
cv::Mat img_in;
&lt;期待値テストデータ&gt;
cv::Mat img_out;
Copyright© Fixstars Group
2ABABC…
17


# Page. 18

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

直接の検証モジュールとやり取りするところは
SystemVerilogで
1.
2.
テストパラメータを設定
期待値を生成する
3. AXI-Liteで係数を書き込む
4. tvalidやtreadyの入力開始
5. 入力値を検証対象モジュールへ送信する
呼出
C++
(DPI-C)
-
テストパラメータ読み込み
入力画像読み込み
テスト用期待値の作成
テストドライバ
(SystemVerilog)
-
CLK, RSTの生成
FIFOを用いたデータの送受信
それらをCLK同期且つ非同期で実行
結果と期待値を用いた検証
CLK
RST
検証回路
(Verilog)
送信部
受信部
coef.r = 0.299
coef.g = 0.587
ceef.b = 0.144
GenImage.width = 256
GenImage.height = 256
…
SimImage.out_file = act_gray.pgm
Copyright© Fixstars Group
18


# Page. 19

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

直接の検証モジュールとやり取りするところは
SystemVerilogで
1.
2.
3.
4.
5.
テストパラメータを設定
期待値を生成する
AXI-Liteで係数を書き込む
tvalidやtreadyの入力開始
入力値を検証対象モジュールへ送信する
6. 検証対象モジュールからの出力値の受信する
7. 期待値を用いた出力値の検証
C++
-
テストパラメータ読み込み
テスト用期待値の作成
テストドライバ
(SystemVerilog)
期待値
-
CLK, RSTの生成
FIFOを用いたデータの送受信
それらをCLK同期且つ非同期で実行
結果と期待値を用いた検証
CLK
RST
結果
検証回路
(Verilog)
送信部
受信部
OK
or
Copyright© Fixstars Group
FAILED
19


# Page. 20

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

次はテストの効率化へ
SystemVerilogで期待値作成が面倒
→ DPI-Cを使って、豊富なCのライブラリを直接使おう
GUIの起動を待つのが億劫
→ CUI＆バッチ化で繰り返しのストレスなく論理検証を走らせよう
ちょっと修正する度にテストするのが......
→ 典型化したテストをCIに投げよう
Copyright© Fixstars Group
20


# Page. 21

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

CUI（バッチ処理）で論理検証しよう
モジュール少し修正したし、
論理検証回したいな...
長い......
GUI起動......
こういった微妙なストレスは
CUIベースでテスト環境を構築して置くことで、解決することができます
VIVADO is a trademark of Xilinx, Inc.
Copyright© Fixstars Group
21


# Page. 22

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

論理検証全体の流れ
1.
2.
3.
4.
RTL・Simulation Sourceのコンパイル
DPI-C用のコンパイル
テストベンチのelaborate
シミュレーションの実行
今回はこれら全てをCUIコマンド一発でビルド・実行できるようにします
Xilinx環境用シミュレータ
Vivado Simulator v2021.2
Intel環境用シミュレータ
Questa Intel Starter FPGA Edition-64 vsim
2022.1 Simulator 2022.01 Jan 29 2022
OS
CentOS Linux release 7.9.2009 (Core)
QUESTA is a trademark of QUESTA CORPORATION.
Copyright© Fixstars Group
22


# Page. 23

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

CUIコマンドはGUIから持ってこよう
GUIで実行するとTcl Consoleに
対応するCUIコマンドが表示されている
Vivadoの場合、vivado.jouというファイルに
同様の内容が出力されている。
これらのTclコマンドを参考にバッチ処理コマンドを作成していく
Copyright© Fixstars Group


# Page. 24

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

Vivado simulator 実行コマンドフロー
xvlog
… テストベンチとRTLファイルをコンパイル
xvlog -work work --sourcelibdir . -sv [rtlファイル] …
xelab –dpiheader [DPIヘッダファイル名 ] … DPIヘッダファイルの出力
xelab --timescale 1ns/1ps -sv -dpiheader \
sv_export.h tb_gray_scale -L [ベンダモジュール]
g++ -o [.soファイル]
… DPI共有ライブラリを生成
g++ -c -g -std=c++11 -Wall -fPIC -I[インクルードパス] c_main.cpp
g++ c_main.o -o dpi.so -L[ライブラリパス] -L… -l[ライブラリ]
xelab -sv_lib [共有ライブラリ名 ]
… DPI共有ライブラリを含めてelaboration
xelab --debug typical --timescale 1ns/1ps --snapshot \
work.tb_gray_scale tb_gray_scale -L [ライブラリパス] \
-sv_lib dpi
xsim
… シミュレーションの実行
xsim work.tb_gray_scale -onfinish quit -runall \
-testplusarg TESTCASE=[テストケース名]
\
-testplusarg TESTCASE_FILE=[テストパラメータ設定ファイル]
Copyright© Fixstars Group


# Page. 25

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

Questa simulator 実行コマンドフロー
vlog
… テストベンチとRTLファイルをコンパイル
vlog -work work +incdir+[参照先] -sv [rtlファイル].v [テストベンチ].sv
vlog -sv -dpiheader sv_export.h
… DPIヘッダファイルの出力
g++ -o [.soファイル]
… DPI共有ライブラリを生成
vsim
… シミュレーションの実行（実行時、elaborationも行われる）
vlog -sv -dpiheader sv_export.h ../tb_gray_scale.sv
g++ -c -g -std=c++11 -Wall -fPIC -I[include先] ../c_main.cpp
g++ c_main.o -o dpi.so -L[ライブラリ参照先] -L… -l[ライブラリ] -l…
vsim work.tb_gray_scale -c -do &quot;run -all; quit&quot; \
-L [モジュールパス] -L ... -sv_lib dpi \
+TESTCASE=[テストケース名] \
+TESTCASE_FILE=[テストパラメータ設定ファイル]
Copyright© Fixstars Group


# Page. 26

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

CUI化 ≒ 手続きをファイルにまとめておく
xvlog -work ...
手続きを順に記述し、
実行可能な形でまとめておく
xelab -dpiheader [DPIヘッダファイル名]
g++
-o [.soファイル] コマンド
xelab -sv_lib [共有ライブラリ名] コマンド
xsim コマンド：シミュレーション実行
ex) make, shell script, Python
-
Makeﬁle中に、ターゲットと実行されるコマンドの対応、
コマンド実行に必要となる依存ファイルの関係を記載する
①
②
③
④
⑤
make [target]で用意しておいたコマンドが実行される
make
make
make
make
make
comp
... コンパイル
dpi_c
... ① + ヘッダファイル生成 &amp; DPI-Cライブラリコンパイル
elab
... ① + ② + elabration
&lt;TESTCASE名&gt;
... ③ + テストケースの シミュレーション実行
all
... ④の全テストケースを順次シミュレーション実行
Copyright© Fixstars Group
※ファイル更新をチェックするので、
例えば④シミュレーション実行をすると、
①～③の実行要否を判断して、
必要に応じて再コンパイルをする。


# Page. 27

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

最後に、CI化やってみました
SystemVerilogで期待値作成が面倒
→ DPI-Cを使って、豊富なCのライブラリを直接使おう
GUIの起動を待つのが億劫
→ CUI＆バッチ化で繰り返しのストレスなく論理検証を走らせよう
ちょっと修正する度にテストするのが......
→ 典型化したテストをCIに投げよう
Copyright© Fixstars Group
27


# Page. 28

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

細かくテストを行うことで原因特定は容易になる
修正ごとにテストを行うことで、どの修正がエラーの原因になったかが分かる。
修正
テスト
OK
修正
テスト
OK
Copyright© Fixstars Group
修正
テスト
28


# Page. 29

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

CIについて
CI : Continuous Integration（継続的インテグレーション）
CloneからBuild, Testの手順を確立しておけば、自動でやってくれる
テスト
修正
1.
2.
3.
4.
リポジトリのクローン
検証対象のビルド
テストの実行
成功 or 失敗判定
GITLAB is a trademark of GitLab Inc. in the United States and other countries and regions
Copyright© Fixstars Group
29


# Page. 30

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

こういうことがしたい
テストをCIにやらせておき、自分は修正を進める
テスト
OK
修正
修正
テスト
OK
修正
テスト
FAILED
修正
Copyright© Fixstars Group
30


# Page. 31

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

GitLab-Runnerの利用
CI/CDは基本的にクラウドのサーバ等で行う。
ベンダツールのインストール時間やライセンスは......？
→
ローカルでGitLab-CIのテスト環境を実現するGitLab-Runnerの導入で解決
やれ
はい...
ベンダツールがインストールしたサーバで
CIテストが実行できる
社内サーバ
Copyright© Fixstars Group
31


# Page. 32

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

5分くらいでできるGitLab-Runner導入
curl -L --output /usr/local/bin/gitlab-runner &quot;https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64&quot;
chmod +x /usr/local/bin/gitlab-runner
useradd --comment &#039;GitLab Runner&#039; --create-home gitlab-runner --shell /bin/bash
gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
gitlab-runner start
実行ファイルのダウンロード・権限付与, Runner用アカウントの追加, インストール・実行
gitlab-runner register
項目
入力内容
GitLab instance URL
CIの説明ページに書いてある URL
〃
registration token
トークン
description for the runner
任意
tags for the runner
任意
Executer
色々ある。今回は shellに設定
Copyright© Fixstars Group
追加されたGitLab Runner
32


# Page. 33

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

させたいことを.gitlab-ci.ymlに書く
CIはリポジトリ内の.gitlab-ci.ymlに書かれた内容を元に
テストのPipelineを作成し、順にテストを実行する
stage
… Pipelineのstage。前のstageが止まると以降は実行されない
job
… stage内で実際に実行される命令群。並列にも逐次にも設定可能
例）
Build1
Build2
Test
Test Case 1
Test Case 2
Test Case 3
Copyright© Fixstars Group
並列に実行


# Page. 34

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

CIでさせたいこと
1. xilinx_ipディレクトリでmakeを実行し、
Xilinxのipのシミュレーションファイルを作成
2. hw_proj/simディレクトリでmake comp elab dpi_cを実行し、
シミュレーション実行ファイルを作成
3. 同ディレクトリでmake simを実行
これらをそれぞれstagesとして.gitlab-ci.ymlに記述した
Copyright© Fixstars Group


# Page. 35

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

.gitlab-ci.ymlの記述
ステージの設定
stages:
- build_xilinx_ip
- build_hw
- test
3つのstageを定義
ジョブの設定
build_xilinx_ip-job:
stage: build_xilinx_ip
stageにjobが属するstageを設定
variables:
GIT_STRATEGY: clone
before_script:
ko
- source /home/hiroki.nishimoto/share/.bashrc
script:
- cd xilinx_ip/ &amp;&amp; make
Copyright© Fixstars Group
before_script, scriptに
実際にjobでさせたいでことを書く
35


# Page. 36

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

.gitlab-ci.ymlの記述
GIT_STRATEGYについて
build_xilinx_ip-job:
build_hw-job:
stage: build_xilinx_ip
stage: build_hw
variables:
variables:
GIT_STRATEGY: clone
GIT_STRATEGY: none
before_script:
before_script:
- source /home/hiroki.nishimoto/share/.bashrc
script:
- source /home/hiroki.nishimoto/share/.bashrc
script:
- cd xilinx_ip/ &amp;&amp; make
- ls
- ls xilinx_ip
- cd gray_scale/sim &amp;&amp; make comp elab dpi_c
リポジトリに対して最初に行う処理。
前のstageでbuildした実行ファイルを使いたい場合noneにしていないと初期化されるので注意。
Copyright© Fixstars Group
36


# Page. 37

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

実際に動かして見る
どのコミットでテストが失敗したかが分かる
Copyright© Fixstars Group
どのstageで失敗したかが分かる


# Page. 38

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

まとめ
- DPI-Cを使って、豊富なCのライブラリを直接使おう
SystemVerilogで書くには煩雑な処理も
OpenCV等のC/C++の豊富なライブラリでらくらく実装
- CUI＆バッチ化で繰り返しのストレスなく論理検証をしよう
GUIで行っていた処理をCUIコマンドでまとめることで、
GUIを立ち上げることなくコマンド一発で論理検証が可能に
また、GUIを使用しないことでテストのCI化も容易に
- 典型化したテストをCIに投げよう
ちょっとした修正もcommit &amp; pushしておけば、
CIが代わりにテストしてくれるように
尚、ライセンスの問題はGitLab-Runnerで解決（5分程度で導入可能）
Copyright© Fixstars Group
38


# Page. 39

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

AI Engine の使い方と
シミュレーション
方法の解説
Copyright© Fixstars Group


# Page. 40

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

Who I am
Yuki
MATSUDA
写真
松田 裕貴
ソリューション第四事業部
リードエンジニア
Copyright© Fixstars Group


# Page. 41

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

本日のセミナーの内容
●
前回のセミナーで AI Engine のアーキテクチャとプログラミング方法につい
て概説したので、その続き
○
●
https://speakerdeck.com/ﬁxstars/shi-jian-de-fpgakai-fa-semina-vol-dot-7?slide=2
プログラミング方法についてもう少し掘り下げ &amp;
論理シミュレーションを通して
AI Engine がどのように動くかについてを解説します
Copyright© Fixstars Group


# Page. 42

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

AI Engine とは
●
Versal FPGA に追加された Intelligent Engines
●
従来の FPGA + 計算に特化したエンジン (AI Engine) というアーキテクチャ
https://github.com/Xilinx/Vitis-Tutorials/tree/2022.1/AI_Engine_Development/Design_Tutorials/02-super_sampling_rate_fir
Copyright© Fixstars Group


# Page. 43

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

AI Engine 開発環境の準備
●
ライセンスセンターから AI Engine Tools License をダウンロードする
○
●
https://japan.xilinx.com/getlicense
ダウンロードしたライセンスを XILINXD_LICENSE_FILE 環境変数に
設定すれば準備完了
○
シミュレーションまではこのライセンスで可能となる
Copyright© Fixstars Group


# Page. 44

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

AI Engine のプログラミングモデル
●
AI Engine は、複数のコアの上で
異なる命令列を実行することができる MIMD architecture
●
AI Engine のプログラミングモデルでは、
kernel, graph という抽象化を行って C++ でプログラミングを行う
○
kernel : 1つのコア上で動く処理ブロック
○
graph : 複数の kernel を組み合わせて構成するグラフ
Copyright© Fixstars Group


# Page. 45

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

AI Engine のプログラミングモデル (cont.)
●
このセミナーでは、 vector multiplication + addition をサンプルに
プログラミングモデルについて説明する
○
multiplication, addition はそれぞれ別のカーネルで処理する
out[i] = a[i] * b[i] + c[i];
●
公式の資料だと以下のものが参考になる
○
https://github.com/Xilinx/Vitis-Tutorials/tree/2022.1/AI_Engine_Development
○
https://docs.xilinx.com/r/ja-JP/ug1076-ai-engine-environment
Copyright© Fixstars Group


# Page. 46

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

kernel の作成
●
kernel には 1 つの AI Engine 上で動かすロジックを記載する
●
kernel のインターフェースは選択肢があるので、適切なものを使用する
○
window型: 高帯域なローカルメモリ (青線)
■
○
○
容量に制限あり (32KiB / tile)
stream型: 低帯域なストリーム (黒線)
■
隣接してないコアとやり取り可能
■
multicast などが可能
cascade型: 高帯域なストリーム (緑線)
■
accumulator を
直接渡せるので速い
https://docs.xilinx.com/r/en-US/am009-versal-ai-engine/AI-Engine-Tile-Architecture
Copyright© Fixstars Group


# Page. 47

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

kernel の作成: vecadd
●
vecadd kernel のコード例 (window interface)
○
window interface だと容量の限界があるので、要素数N だけ処理する
○
window API だとランダムアクセス可能なため、普通の C++ コードのように書ける
kernel.cpp
Copyright© Fixstars Group


# Page. 48

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

graph の作成
●
複数のカーネルを組み合わせてグラフを構成する
●
top のグラフには外部への IF が含まれるので、
PL と接続するのか (PLIO), DDR と接続するのか
(GMIO) を選ぶ
Copyright© Fixstars Group


# Page. 49

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

graph の作成
●
graph には kernel 定義, kernel と入出力の接続を書く
graph.hpp
Copyright© Fixstars Group


# Page. 50

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

テストコードの作成
●
グラフを定義し、main 関数内にテストロジックを記載する
test.cpp
Copyright© Fixstars Group


# Page. 51

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

コンパイル
●
●
aiecompiler でテストコードをコンパイルする
○
kernel のビルド、グラフで記載された形式でのデバイスへのマッピングが行われる
○
libadf.a という実際のデバイスで使用可能なライブラリが出力される
○
$ aiecompiler test.cpp
vitis_analyzer によりシミュレーションポートを確認できる
○
$ vitis_analyzer *.aiecompile_summary
Copyright© Fixstars Group


# Page. 52

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

コンパイラレポートの確認
●
コンパイラレポートにはグラフの形状や AI Engine のどの領域に
物理的にマッピングされたかが記載される
●
window interface を使う場合はデフォルトでダブルバッファリングされる
Copyright© Fixstars Group


# Page. 53

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

aiesimulator によるシミュレーションの実行
●
aiesimulator コマンドでサイクルアキュレートなシミュレーションを行う
○
●
$ aiesimulator –proﬁle –dump-vcd=wave
■
-proﬁle: CPU プロファイリングの有効化
■
-dump-vcd: シミュレーション波形の出力
vitis_analyzer によりコンパイルレポートを確認できる
○
$ vitis_analyzer *.aierun_summary
Copyright© Fixstars Group


# Page. 54

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

シミュレーション結果の確認 : タイムライン
●
vecmul/add を 4 回実行したときのタイムライン
a.
AIE のカーネルは、 window buﬀer にデータが埋まってから動き始める (window IF の場合)
b.
今回のように複数のカーネルを使う場合だと、パイプライン上に動いていく
c.
バッファがダブルバッファであるため、前後のカーネルは同時に動くことができる
Copyright© Fixstars Group


# Page. 55

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

シミュレーション結果の確認 : タイムライン
●
vecmul/add を 4 回実行したときのタイムライン
a.
AIE のカーネルは、 window buﬀer にデータが埋まってから動き始める (window IF の場合)
b.
今回のように複数のカーネルを使う場合だと、パイプライン上に動いていく
c.
バッファがダブルバッファであるため、前後のカーネルは同時に動くことができる
Copyright© Fixstars Group


# Page. 56

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

シミュレーション結果の確認: プロファイル結果
●
プロファイル結果には、CPU 上の命令毎の実行数が出力される
○
●
下図は vecadd kernel における加算ループの部分
この例だと 1 回の加算に 22 cycle 使っているので非常に遅い
○
前回のセミナーで話したように、SIMD 命令を使うとこのあたりは高速化可能
Copyright© Fixstars Group


# Page. 57

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

まとめ
●
前回のセミナーに引き続き、AI Engine における
プログラミング方法・シミュレーション方法について解説した
●
AI Engine は新しいアーキテクチャで動作するため、
シミュレーションを通して動作を理解するのが大事
○
aiesimulator が優秀なため、シミュレーション結果から分かることは多い印象
Copyright© Fixstars Group


# Page. 58

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

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


