おっさん、今回はVitis HLS やって来ました。正直に言うと、めっちゃ苦労しました。
どのぐらい苦労したかって言うと、ここ3日ほどUnityもBlenderもゲームもしてません。
あぁ、GPGPUもやらなきゃ………やることだけが積み上がっていく。お金も積み上がってくれませんかね。
Vitis HLS に入門したいけど出来ない
おっさんは2021.1を入れているのですが、何やらVivado HLS ではなく、 Vitis HLS と言う物になっているらしい。細々色々違って大変だという話は聞きますが、入門どころか門戸を叩けてすらいない私には何の関係もないので、このままVitis HLS で行きます。
とりあえず、HLSで合成したものでLEDをチカらせます。そこまでの道がだいぶ長いです。ゾルディック家かな?
VS Code で開発できるプロジェクト構成を作る
Vivado や Vitis HLS の エディタはないので、何らかのエディタを選ぶ必要があります。おっさんはEmacs………は最近開いてないので VSCode にしました。
VSCode で CMake Tools の拡張機能を入れていると、 CMakeLists.txt の情報から勝手にライブラリの検索候補などを引っ張ってきてくれます。マジ便利。
というわけで、 Vitis HLS はMakefileではなく、 CMake で合成します。
VSCode でライブラリのパスなどに反応させたければ、適当に add_library
や add_exec
などでターゲットを作って、リンクしてやれば上手くいきます。
Vitis HLS のインクルード対象ファイルは Vitis HLS のインストールディレクトリのinclude ディレクトリです。
add_libray(foobar foobar.cpp) target_link_library(foobar C:/Xilinx/Vitis/2021.1/include)
上記のようなCMakeLists.txt をディレクトリに置いておけば、割と良い感じに補間候補を見つけてきてくれます。
ただ、これだと他人が使えないし、自分もバージョンを選べないし、他のプロジェクトに使い回せないしで不便なので FindXXX.cmake
を作ります。
むろん、既存の FindVivado.cmake とか、 FindoVitis.cmake は GitHubとかにあるのでそれを使ってもいいんですが、なんというか、わかりにくいんですよね。
大抵プロジェクト専用の定数やらビルド手順が書き込まれてるので、出発点となるようなFindVitisは見つかりませんでした。
なので、とにかくシンプルに使えて、後から必要なら付け足せるように作ることを目指しました↓。
一見ゴチャゴチャしているように見えますが、実際には引数の値の確認と、相対パスの修正をしているだけで固定値は殆ど持っていません。
なので、たぶん、各プロジェクト用に付け足ししやすいはずです。たぶん。一応、vivado_hls でも動きました。
以下の様な感じで Vitis/Vivado HLSプロジェクトを定義 します。
add_hls_project(hlsled TOP HlsLED VERSION 1.0 VENDOR nodamushi NAME "HLS LED Chika" PERIOD 10 # 100MHz PART xc7z007sclg400-1 SOURCES hlsled.cpp # Test TB_SOURCES tb.cpp )
この関数を使うと、以下のターゲットが作られます。
create_project_hlsled
: Vitis HLSのプロジェクトの作成clear_hlsled
: 作成したプロジェクトの削除csynth_hlsled
: 高位合成の実行cosim_hlsled
: C/RTL シミュレーションtest_hlsled
: テストベンチのコンパイル
高位合成したければ、 csynth_hlsled
で出来ます。
Vivado もCMake化する
ここまで作っておっさんは気がつきました。この CMake、 MSYS2 の上で動くじゃん。
おっさんの環境問題かもしれませんが、VivadoはMSYS2のシェル上では動きません↓(左がMSYS2のbash、右がDOS窓)
しかし、上で作った CMake は Vitis HLS の合成が MSYS2 の上で出来たのです。(MSYS2で合成したのは無意識)
あれ? CMake 化すれば DOS 窓要らないんじゃね?
というわけで、 Vivado を前回は Makefile で合成してましたが、これも同様に CMake 化しました。
この FindVivado.cmake には xsdb ターゲットが定義してあります。と、いうことは………
やった、MSYS2でxsdb が動いたよ!脱DOS窓!
Vivadoのプロジェクト定義 も、Makefileの時 より分かりやすくなったんじゃないかな。
project(vivado_study) add_vivado_project(vivado_study TOP design_1_wrapper BOARD digilentinc.com:cora-z7-07s:part0:1.0 RTL ../src/rtl CONSTRAINT ../src/constraint IP ../build/src/hls DESIGN design_1.tcl DEPENDS csynth_hlsled )
実はメチャクチャ苦労した
ました工法でサクッと出来ましたが、裏では実は苦労しました。
- VSCode で上手く補完が効かない
- Vitis HLS の cosim_design で GoogleTest が使えない
Windowsで選択すべき構成について
VSCodeではScan for kitsで大凡上手くスキャンしてくれるから、あまり今まで気にしてなかったんだけど、上手くいかないときは構成を選択する必要があります。
そして、マジで上手くいかなかって苦労したんよ………。
こんな感じで見つからなかったり………、見つかるようになっても iostream が見つかりませんとか言われたり………。まじなんなの。
環境固有の問題かもしれませんが、私の環境ではどう足掻いても Visual Studio のコンパイラやClang では解析することが出来ませんでした。
Windowsの環境において選ぶべきはこのへんのMSYS系。ない場合は、 MSYS2 をインストールして、64bit版のGCCやClangを入れてください。
ただ、これを選択しても最初は全然安定しなかったんだけど、この3日で何したのかを覚えていないの。同じような症状になったら頑張ってください。1回VSCodeを再起動すると治ることも良くあります。
また、私が作った FindHLS.cmake はvitisを探すために、環境変数 XILINX_HLS かVITIS_HLS_ROOT を設定する必要があります。でも環境変数は設定したくないので、構成を追加します。
まずは、VSCodeのコマンドでCmake: ユーザーローカル CMake キットの編集を実行します。
で、なんかJSONファイルが出てくるので、ご自身の上手く動く構成をコピーして追加し、"cmakeSetting"に VITIS_HLS_ROOT
を設定します。
私の場合は以下の様にしています。
{ "name": "Vivado 2021.1", "compilers": { "C": "C:\\msys64\\mingw64\\bin\\gcc.exe", "CXX": "C:\\msys64\\mingw64\\bin\\g++.exe" }, "cmakeSettings": { "VITIS_HLS_ROOT": "C:\\Xilinx\\Vitis_HLS\\2021.1", "VIVADO_ROOT": "C:\\Xilinx\\Vivado\\2021.1" } }
あとは、この Vivado構成を選択するだけです。
cosim_designでGoogleTestがコンパイルできない
これは、もう諦めました。
最初は Cベースのテストを GoogleTest で作って動いたのでヤッタね!とか言ってたんですが、これをcosimで実行しようとするとどうしても コンパイルできません でした………。
実行できないんじゃないんですよ。 コンパイル できないんですよ。リンクが出来ないんじゃないのですよ。 コンパイル が出来ないんですよ。
それも、インクルードが見つからないというエラーが出るのなら対処しようもあるのですが、以下の様なエラーが出るんですよ………
#
という不正な文字があるifndef
という不正な文字がある#endif
が出てきたが#if
の範囲内にない
むろん、私はテストコードの中でマクロは使っていませんし、ifdefなどもheaderでしか使ってません。まず間違いなく GoogleTest がincludeで展開された結果でしょう。
もう、どうにもならねぇよ………。なんだ、これ………。エラーで検索すると「 (全角空白)」を間違えて入れてるときによく初心者が遭遇するエラーらしいのですけど、「#」だよ。知らねぇよ。
誰かタスケロ
まとめ
色々苦労しましたが、 HLS でLED をチカらせるコードを書いて、 Vivado の IP Integrator でつなぎ、ビルドも書き込みもは全て MSYS2 で行えるようになりました。
おっさんも、これでようやくVivadoの門戸を叩くことが出来そうです。