makeコマンドでVivado HLSを使う

はじめに

私がVivado HLSでIPを作っているときに使う機能はほとんど限られている. Cシミュレーション,HDLの合成,そしてIPの出力である. これにGUIを使う必要はほとんど感じられない. makeコマンドでそれらの一連の処理が出来れば楽チンである.

CUIでVivado HLSを使う

tclでビルドする

FPGA開発日記のmsyksphinzさんが,tclとmakeを使ってビルドする方法を記事にしていた.

記事:コマンドラインからVivado HLSを使用するためのスクリプト

なるほど! Makefileで環境変数を定義しておいて,tclのスクリプトでそれらを参照すれば,汎用的なMakefileを作れるみたいだ.

このMakefileのターゲットは,allとcleanしかない. allはCのソースコードをIPに,cleanは生成物やログを削除する. しかし私はHDLの合成までやって,Cのコードにpragmaを追加してチューニングを行うことがある. なので場合によっては,HDLの合成までで止めたい.

makeコマンドでビルドする

私がVivado HLSを使うときのディレクトリ構成に合わせて,Makefileとtclスクリプトを作る. 作ったMakefileとサンプルプロジェクトはGithubに用意した. ディレクトリ構成を下に示す

adder/
├── Makefile
├── directives.tcl
├── include: 合成する関数のヘッダ
│   └── adder.hpp
├── src: 合成する関数の定義
│   └── adder.cpp
├── test: 合成する関数のテストベンチ
│   ├── include
│   │  └── test_adder.hpp
│   └── src
│       └── test_adder.cpp
└── script: 合成のためのtclスクリプト
     ├── csim.tcl
     ├── csynth.tcl
     ├── cosim.tcl
     └── export.tcl

msyksphinzさんの記事を参考に作ったMakefileを下に示す.

#### configuration #####

# project and solution name
export HLS_TARGET   = adder
export HLS_SOLUTION = basys3
# source files
export HLS_SOURCE   = $(wildcard src/*)
export HLS_TEST     = $(wildcard test/src/*)

# result
BASE_DIR = $(HLS_TARGET)/$(HLS_SOLUTION)
IP       = $(BASE_DIR)/impl
COSIM    = $(BASE_DIR)/sim
HDL      = $(BASE_DIR)/syn
CSIM     = $(BASE_DIR)/csim

##### targets and commands #####

.PHONY: all
all: $(IP)

.PHONY: export
export: $(IP)
$(IP): $(HDL)
        vivado_hls script/export.tcl

cosim: $(COSIM)
$(COSIM): $(HDL)
        vivado_hls script/cosim.tcl

.PHONY: csynth
csynth: $(HDL)
$(HDL): $(CSIM) $(HLS_SOURCE)
        vivado_hls script/csynth.tcl

.PHONY: csim
csim: $(CSIM)
$(CSIM):
        vivado_hls script/csim.tcl

.PHONY: clean
clean:
        rm -rf $(HLS_TARGET) *.log

これでmakeと打てばCのコードからIPが生成される. またHDLの合成だけやりたい場合は,make csynthと打てば良い. 協調シミュレーション(cosim)は使わない場合もあるので,ターゲットを指定して実行した場合のみ使えるようになっている.

Makefileとtclスクリプトを自動生成する

新しくプロジェクトを作る場合,先程のMakefileとtclスクリプトをコピーすればよい. しかしプロジェクトによって変えたい部分がいくつかある.

  • Makefile: プロジェクト名とソリューション名
  • csynth.tcl: チップ情報とクロック制約

これらの情報を入力として,Makefileとtclスクリプトを生成できるツールを作った↓

vivado_hls_create_project

vivado_hls_create_projectの設定

このツールを使うにあたって,設定が2つ必要となる. 1つ目の設定は,Vivadoのパスである. ホームディレクトリに".vivado_hls_create_project"という名前でVivadoのパスを書いたJSONファイルを置く. 例えば"/opt/Xilinx/Vivado/2018.3"であれば,".vivado_hls_create_project"の内容を以下のようにする.

{
    "path_to_vivado": "/opt/Xilinx/Vivado/2018.3"
}

2つ目の設定は,vivado_hls_create_projectを使う際にsettings.(sh|zsh)をsourceすることである.

またこれはオプションだが,Vivado HLSのボードファイルに普段使っているボードの情報を追記しておくと良い. ボードの情報は(Vivadoをインストールした場所が"/opt/Xilinx/Vivado/2018.3"であれば),"/opt/Xilinx/Vivado/2018.3/common/config/VivadoHls_boards.xml"にある. ボード情報を追記する例として,Digilent社のBasys3を追記する場合を以下に示す.

<board name="Basys3" display_name="Basys3" family="artix7" part="xc7a35t1cpg236-1"  device="xc7a35t" package="cpg236" speedgrade="-1" vendor="digilentinc.com" />

vivado_hls_create_projectで使えるボードの情報を見る

vivado_hls_create_projectには,Makefileとtclスクリプトを作成できるボードの情報を表示する機能がある. “vivado_hls_create_project -l"と入力してみると,以下の表示が得られる. Vivado HLSにデフォルトで登録されているボードだけでなく,追記したBasys3も見えている.

$ vivado_hls_create_project -l
Board               Part
----------------------------
Alpha-Data          xc7vx690tffg1157-2
KU_Alphadata        xcku060-ffva1156-2-e
Xilinx_ZedBoard     xc7z020clg484-1
Xilinx_AC701        xc7a200tfbg676-2
Xilinx_KC705        xc7k325tffg900-2
Xilinx_KCU105       xcku040-ffva1156-2-e
Xilinx_KCU116       xcku5p-ffvb676-2-e
Xilinx_KCU1500      xcku115-flvb2104-2-e
Xilinx_VC707        xc7vx485tffg1761-2
Xilinx_VC709        xc7vx690tffg1761-2
Xilinx_VCU108       xcvu095-ffva2104-2-e
Xilinx_VCU110       xcvu190-flgc2104-2-e
Xilinx_VCU118       xcvu9p-flga2104-2L-e
Xilinx_VCU1525      xcvu9p-fsgd2104-2L-e
Xilinx_ZC702        xc7z020clg484-1
Xilinx_ZC706        xc7z045ffg900-2
Xilinx_ZCU102       xczu9eg-ffvb1156-2-i
Xilinx_ZCU106       xczu7ev-ffvc1156-2-i-es2
Xilinx_A-U200       xcu200-fsgd2104-2-e
Xilinx_A-U250       xcu250-figd2104-2L-e
Basys3              xc7a35t1cpg236-1

vivado_hls_create_projectでMakefileとtclスクリプトを生成する

プロジェクト名とボード名を入力して,以下のようにコマンドを入力する. -pにはプロジェクト名,-bにはボード名(先程-lオプションで表示したもの)を指定する. するとMakefileとtclスクリプト,そしていくつかのディレクトリが生成される.

includeとsrcはハードウェア化する関数のためのディレクトリ,test以下はテスト用のディレクトリだ.

$ vivado_hls_create_project -p adder -b Basys3
INFO:  Found part
INFO:  Generate Makefile
INFO:  Generate directories
INFO:  Generate tcl scripts
$ tree .
.
├── Makefile
├── directives.tcl
├── include
├── script
│   ├── cosim.tcl
│   ├── csim.tcl
│   ├── csynth.tcl
│   └── export.tcl
├── src
└── test
    ├── include
    └── src

6 directories, 6 files

ハードウェア化するCコードをinclude, srcに,テストコードをtestに置けば,makeでIPの生成までやってくれる.

おわりに

これでGUI無しにVivado HLSのプロジェクトを作ったりIPの生成が出来るようになった. もしこのツールを使いたい人や使ってみた人がいれば,感想や質問等を是非聞かせてほしい.