Vitis_HLS(2020.2.2) で C 合成した回路を Vitis で使用する際、一部のドライバがアップデートされなくて嵌ってしまった。
このメモはその時の解決法を書いたものです。もっといい方法があれば教えてください。
再現方法
「FPGA プログラミング大全第2版」にある、Patblt 回路を構成したのですが、このとき、offset を slave にするのを忘れて合成し、Vivado に取り込んでしまいました。全く気づかないまま論理合成し(これは成功)、Vitis を起動してプログラムを打ち込んでみると、XPatblt_Set_dstout 関数がないというエラーが発生しました。
ps7_cortexa9_0/standalone_domain/bsp/ps7_cortexa9_0/libsrc/patblt_v1_0/src/xpatblt.h を見ると確かにこの関数は定義されていません。xpatblt.c を見ると、やはり定義されていませんでした。
Vitis_HLS に戻って確認したところ、offset を slave にし忘れていることが判明したため、slave を指定して C 合成をやり直し、Vivado でデバイスを update して bitstream を作成、ハードウェアを export し直しました。
次に Vitis に移り、「Update Hardware Specification」を選択してハードウェア構成を取り込みました。
Clean で全ての生成ファイルをクリアしたあと、ps7_cortexa9_0/standalone_domain/bsp/ps7_cortexa9_0/ libsrc/patblt_v1_0/src/xpatblt.h を見ると、相変わらず XPatblt_Set_dstout 関数が定義されていません。
もちろん、この関数を使ったサンプルプログラムはコンパイルできません。
さて、どうするか?
hw ツリーにヒントが
よく見ると、hw/drivers/patblt_v1_0/src/xpatblt.h に定義されているファイルには XPatblt_Set_dstout 関数が定義されており、xpatblt_hw.h を見るとレジスタのオフセットも正しそうです。
そこで、以下の項目に修正を加えることにしました:
- ps7_cortexa9_0/standalone_domain/bsp/ps7_cortexa9_0/libsrc/patblt_v1_0/src/xpatblt.h: hw/drivers/patblt_v1_0/src/xpatblt.h の XPatblt_Set_dstout をコピーする。
- ps7_cortexa9_0/standalone_domain/bsp/ps7_cortexa9_0/libsrc/patblt_v1_0/src/xpatblt.c: hw/drivers/patblt_v1_0/src/xpatblt.c の XPatblt_Set_dstout をコピーする。
- ps7_cortexa9_0/standalone_domain/bsp/ps7_cortexa9_0/libsrc/patblt_v1_0/src/xpatblt_hw.h: hw/drivers/patblt_v1_0/src/xpatblt_hw.h を丸コピーする。
動くのか?
旧設定と新設定ではレジスタのオフセット値が異なっており、どちらか一方が正しいことになります。ここは新設定が正しいだろうという予想のもと、修正しましたが、実機で動くのか試して見る必要がありそうです。
そこで、patblt を使用したサンプルプログラムを Z7-20 ボードで実行してみました。
結果は新設定の方が正しいことがわかりました。
たまたま Vitis のバグを踏んだのですかねえ。。。