プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

Vivadoに入門したいんですけど~Vitis HLSの合成とVivadoのCMake化~

 おっさん、今回は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_libraryadd_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は見つかりませんでした。

 なので、とにかくシンプルに使えて、後から必要なら付け足せるように作ることを目指しました↓。

github.com

 一見ゴチャゴチャしているように見えますが、実際には引数の値の確認と、相対パスの修正をしているだけで固定値は殆ど持っていません。

 なので、たぶん、各プロジェクト用に付け足ししやすいはずです。たぶん。一応、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窓)

f:id:nodamushi:20220303114822p:plain

 

 しかし、上で作った CMake は Vitis HLS の合成が MSYS2 の上で出来たのです。(MSYS2で合成したのは無意識)

 あれ? CMake 化すれば DOS 窓要らないんじゃね?

 というわけで、 Vivado を前回は Makefile で合成してましたが、これも同様に CMake 化しました。

github.com

 この FindVivado.cmake には xsdb ターゲットが定義してあります。と、いうことは………

f:id:nodamushi:20220303115630p:plain

 やった、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
)

 

実はメチャクチャ苦労した

 ました工法でサクッと出来ましたが、裏では実は苦労しました。

  1. VSCode で上手く補完が効かない
  2. Vitis HLS の cosim_design で GoogleTest が使えない

 

Windowsで選択すべき構成について 

 VSCodeではScan for kitsで大凡上手くスキャンしてくれるから、あまり今まで気にしてなかったんだけど、上手くいかないときは構成を選択する必要があります。

f:id:nodamushi:20220303001008p:plain:w320

 

 そして、マジで上手くいかなかって苦労したんよ………。

f:id:nodamushi:20220303001248p:plain

 こんな感じで見つからなかったり………、見つかるようになっても iostream が見つかりませんとか言われたり………。まじなんなの。

 

 環境固有の問題かもしれませんが、私の環境ではどう足掻いても Visual Studio のコンパイラやClang では解析することが出来ませんでした。

f:id:nodamushi:20220303001931p:plain

 

 Windowsの環境において選ぶべきはこのへんのMSYS系。ない場合は、 MSYS2 をインストールして、64bit版のGCCやClangを入れてください。

 ただ、これを選択しても最初は全然安定しなかったんだけど、この3日で何したのかを覚えていないの。同じような症状になったら頑張ってください。1回VSCodeを再起動すると治ることも良くあります。

 また、私が作った FindHLS.cmake はvitisを探すために、環境変数 XILINX_HLS かVITIS_HLS_ROOT を設定する必要があります。でも環境変数は設定したくないので、構成を追加します。

f:id:nodamushi:20220303113710p:plain

 まずは、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で実行しようとするとどうしても コンパイルできません でした………。

 実行できないんじゃないんですよ。 コンパイル できないんですよ。リンクが出来ないんじゃないのですよ。 コンパイル が出来ないんですよ。

 それも、インクルードが見つからないというエラーが出るのなら対処しようもあるのですが、以下の様なエラーが出るんですよ………

  1. # という不正な文字がある
  2. ifndef という不正な文字がある
  3. #endif が出てきたが #if の範囲内にない

 

 むろん、私はテストコードの中でマクロは使っていませんし、ifdefなどもheaderでしか使ってません。まず間違いなく GoogleTest がincludeで展開された結果でしょう。

 もう、どうにもならねぇよ………。なんだ、これ………。エラーで検索すると「 (全角空白)」を間違えて入れてるときによく初心者が遭遇するエラーらしいのですけど、「#」だよ。知らねぇよ。

 誰かタスケロ

まとめ

 色々苦労しましたが、 HLS でLED をチカらせるコードを書いて、 Vivado の IP Integrator でつなぎ、ビルドも書き込みもは全て MSYS2 で行えるようになりました。

 おっさんも、これでようやくVivadoの門戸を叩くことが出来そうです。