FC2カウンター FPGAの部屋 2020年07月16日
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Vitis 2020.1 で ultra96v2_min2_201 アクセラレーション・プラットフォームを使用した自作アプリケーション・プロジェクトが動作しない原因がわかった

ここ数日間悩んでいた、 Vitis 2020.1 で ultra96v2_min2_201 アクセラレーション・プラットフォームを使用した自作アプリケーション・プロジェクトが動作しない原因がわかったので、ブログに書いておく。

ここ数日間、少しホスト・コードを変えてはビルドして、Ultra96-V2 の Debian に SFTP してテストしてみて、やはりダメでがっくりを繰り返してきた。ここまで、やってみてダメだったらホスト・ソフトウェアではないということで、カーネル部分をチェックすることにした。そうすると、違いが分かってきたのだった。

まずは自作カーネルの square.cpp の関数宣言部分と指示子を示す。
ZynqMP-FPGA-Linux201_78_200715.png

extern "C" {
void square(int32_t *inm, int32_t *outm, int32_t size){
#pragma HLS INTERFACE m_axi port = inm offset = slave bundle = gmem
#pragma HLS INTERFACE m_axi port = outm offset = slave bundle = gmem
#pragma HLS INTERFACE s_axilite port = size bundle = control
#pragma HLS INTERFACE s_axilite port = return bundle = control


次に、Vitis 2020.1 のサンプル・アプリケーションの vector addition のカーネル・コード krnl_vadd.cpp の関数宣言部分と指示子を引用する。
ZynqMP-FPGA-Linux201_79_200715.png

void krnl_vadd(
                int* a,
                int* b,
                int* c,
                const int n_elements)
{

#pragma HLS INTERFACE m_axi offset=SLAVE bundle=gmem port=a max_read_burst_length = 256
#pragma HLS INTERFACE m_axi offset=SLAVE bundle=gmem port=b max_read_burst_length = 256
#pragma HLS INTERFACE m_axi offset=SLAVE bundle=gmem1 port=c max_write_burst_length = 256

#pragma HLS INTERFACE s_axilite port=a  bundle=control
#pragma HLS INTERFACE s_axilite port=b  bundle=control
#pragma HLS INTERFACE s_axilite port=c  bundle=control

#pragma HLS INTERFACE s_axilite port=n_elements  bundle=control
#pragma HLS INTERFACE s_axilite port=return bundle=control


お分かりだろうか? krnl_vadd.cpp では、AXI4 Master と宣言された引数も AXI4 Lites Slave で再指定されている。
これだ〜ということで、square.cpp にも AXI4 Lites Slave での再指定をやってみた。
ZynqMP-FPGA-Linux201_85_200716.png

extern "C" {
void square(int *inm, int *outm, int size){
#pragma HLS INTERFACE m_axi port = inm offset = slave bundle = gmem
#pragma HLS INTERFACE m_axi port = outm offset = slave bundle = gmem

#pragma HLS INTERFACE s_axilite port=inm bundle=control
#pragma HLS INTERFACE s_axilite port=outm bundle=control

#pragma HLS INTERFACE s_axilite port = size bundle = control
#pragma HLS INTERFACE s_axilite port = return bundle = control


これでビルドを行って成功した。
Ultra96-V2 の Debian に SFTP で square_u96v2 ホスト・アプリケーションと square_c.xclbin をコピーした。
xclbin ファイルから bit ファイルを取り出して、 /lib/firmware/ にコピーし、zocl などのドライバをロードして、 square_u96v2 ホスト・アプリケーションを実行する一連の流れを実行した。
xclbinutil --input square_c.xclbin --dump-section BITSTREAM:RAW:square.bit
sudo cp square.bit /lib/firmware/
source /opt/xilinx/xrt/setup.sh
sudo ./dtbocfg.rb --install zocl --dts zocl.dts
sudo chmod 666 /dev/dri/renderD128
./square_u96v2 square_c.xclbin

ZynqMP-FPGA-Linux201_80_200715.png
ZynqMP-FPGA-Linux201_81_200715.png

やったぞ。。。TEST PASSED
Vitis 2020.1 では m_axi 指示子を使用して AXI_Master アクセスをする場合に(たぶん offset=slave の場合だと思う)、 AXI4 Lites Slave で再指定する必要があるようだ。

現在の正常に動作する square プロジェクトの Vitis HLS 2020.1 プロジェクトと正常に動作しない lap_filter_axis_dma プロジェクトの Vitis HLS 2020.1 プロジェクトを見比べてみよう。

まずは、正常に動作する square プロジェクトの Vitis HLS 2020.1 プロジェクトを確認する。
solution1 から合成結果の Verilog ファイルの内の AXI4 Lite Slave のレジスタマップが載っている square_control_s_axi.v を見たところ、1つのアドレスマップに統一されている。
ZynqMP-FPGA-Linux201_82_200715.png

正常に動作しない lap_filter_axis_dma プロジェクトの Vitis HLS 2020.1 プロジェクトを確認する。
solution1 から合成結果の Verilog ファイルの内の AXI4 Lite Slave のレジスタマップが載っている Verilog HDL ファイルが lap_filter_axis_dma_control_r_s_axi.v と lap_filter_axis_dma_control_s_axi.v に分断されている。
lap_filter_axis_dma_control_r_s_axi.v のレジスタマップを示す。
こちらには、 inm と outm の INTERFACE 指示子の m_axi offset=slave のレジスタマップがあるようだ。
ZynqMP-FPGA-Linux201_83_200715.png

lap_filter_axis_dma_control_s_axi.v を示す。
こちらは、AXI4 Lite Slave のレジスタマップとなっているようだ。
ZynqMP-FPGA-Linux201_84_200715.png

Vitis HLS では INTERFACE 指示子の m_axi offset=slave でAXI4 Master の DMA のオフセット・アドレス・レジスタをマップする時に同時に AXI4 Lites Slave のレジスタ設定をする必要があるのかも知れない?
Vitis 2020.1 でアクセラレーション・カーネルを書く場合は少なくともそうする必要があるようだ。
  1. 2020年07月16日 04:51 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0