FC2カウンター FPGAの部屋
FC2ブログ

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

FPGAの部屋

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

Vitis 2019.2 のアプリケーション・プロジェクトの作り方3

Vitis 2019.2 のアプリケーション・プロジェクトの作り方2”の続き。

自分でアプリケーション・プロジェクトを作り、自分でアクセラレーションする関数を指定してビルドしていないので、それをやってみようと思うということで、前回は、ビルド後のSummary を観察した。
今回は、出来上がったSD_CARD イメージをMicroSD カードに書いて、実際にUltra96-V2 でテストしてみよう。

Vitis 2019.2 の左下の Assistant ウインドウで vitis_ctut_systerm -> vitis_ctut -> Hardware -> SD Card Image を右クリックし右クリックメニューから Open -> Open in File Browser を選択した。
Vitis_tub_38_191211.png

すると vitis_ctut/Hardware/sd_card ディレクトリが開く。
Vitis_tub_39_191211.png

このディレクトリの内容を、MircroSD カードの第 1 パーティションに書き込む。
Vitis_tub_33_191211.png

Root FS はすでに書いてあるので、Ultra96-V2 に挿入して、電源ON した。
PetaLinux が起動した。
root ノーパスでログインした。
zocl ドライバを insmod でロードした。
insmod /lib/modules/4.19.0-xilinx-v2019.2/extra/zocl.ko

アプリケーションを起動した。
cd /run/media/mmcblk0p1/
export XILINX_XRT=/usr
./vitis_ctut.exe binary_container_1.xclbin

Vitis_tub_34_191211.png

Vitis_tub_35_191211.png

TEST WITH ONE KERNEL PASSED と表示された。成功だ。

2 回目やってみた。
./vitis_ctut.exe binary_container_1.xclbin
Vitis_tub_36_191211.png

3 回目。
./vitis_ctut.exe binary_container_1.xclbin
Vitis_tub_37_191211.png
  1. 2019年12月11日 04:27 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

Vitis 2019.2 のアプリケーション・プロジェクトの作り方2

Vitis 2019.2 のアプリケーション・プロジェクトの作り方1”の続き。

自分でアプリケーション・プロジェクトを作り、自分でアクセラレーションする関数を指定してビルドしていないので、それをやってみようと思うということで、前回は、Xilinx 社のGitHub の Xilinx/Vitis-Tutorials の Mixing C++ and RTL Kernels のソースコードを使用してVitis 2019.2 のプロジェクトを作成し、ビルドする手順を行うことができた。今回は、ビルド後のSummary を見ていこう。

Vitis のビルド後のSummary を見るのに便利なのは、binary_container_1.xclbin.link_summary を見ることのようだ。
Vitis 2019.2 の左上のウインドウ Explorer の vitis_ctut_system -> vitis_ctut -> Hardware -> binary_container_1.xclbin.link_summary をダブルクリックすると、Vitis Analyzer が起動する。
Vitis_tub_16_191210.png

Vitis_tub_17_191210.png

binary_contaianer_1 (Hardware) のSummary が表示されている。

左ウインドウの項目をクリックしていく。

System Diagram をクリックした。
Vitis_tub_18_191210.png

これは、binary_contaianer_1 (Hardware) の接続ブロック図?かな?
Vivado のブロックデザインを見てみると、確かに Zynq UltraScale+ MPSoC の S_AXI_HP0_FPD にAXI4 Master のポートが接続されている。
Vitis_tub_32_191210.png

Platform Diagram をクリックした。
Vitis_tub_19_191210.png

これは、AXI4 Master が HP ポートで接続されていて、AXI4 Lite Slave がHPC ポートで接続されているという図かな?

System Estimate をクリックした。
Vitis_tub_20_191210.png

これはVivado HLS のSummary のようだ。

System Guidance をクリックした。
Vitis_tub_21_191210.png

Timing Summary をクリックした。
Vitis_tub_22_191210.png

これはVivado のタイミングのSummary のようだ。

Utilization をクリックした。
Vitis_tub_24_191210.png

リソース使用量の表だった。

Logs をクリックした。
Vitis_tub_25_191210.png


次に、krnl_vadd に移る。
Vitis_tub_26_191210.png

Kernel Estimate をクリックした。
Vitis_tub_27_191210.png

現状では、カーネルが 1 つなので、System Estimate と同じだけど、カーネルが 2 つになると、カーネルごとの Estimate 情報を表示するのだろう?

Kernel Guidance をクリックした。
Vitis_tub_28_191210.png

HLS Syntyesis では Vivado HLS のレポートがそのまま表示された。
Vitis_tub_29_191210.png

Logs をクリックした。
最初のログは、krnl_vadd.steps のログだった。
Vitis_tub_30_191210.png

krnl_vadd.steps のプルダウンメニューを選択し、viado_hls に変更すると、vivado_hls のログが表示された。
Vitis_tub_31_191210.png
  1. 2019年12月10日 04:55 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

Vitis 2019.2 のアプリケーション・プロジェクトの作り方1

Ultra96-V2 のVitis アクセラレーション・プラットフォームを作成したが、それを使用して自分のアプリケーション・プロジェクトを動作させてみよう。そのために、まだVitis 2019.2 でサンプル・プロジェクトしかやっていないので、自分でアプリケーション・プロジェクトを作り、自分でアクセラレーションする関数を指定してビルドしていないので、それをやってみようと思う。

最初に自分で一からアプリケーションのソースコードを書くのは負担が重いので、Xilinx 社のGitHub の Xilinx/Vitis-Tutorials の Mixing C++ and RTL Kernels のソースコードを使用してVitis 2019.2 のプロジェクトを作成していこう。

まずは、”Ultra96-V2 の Vitis アクセラレーション・プラットフォームの作り方3(Vitis プラットフォーム作成)”で作成した ultra96v2_min2 Vitis 2019.2 アクセラレーション・プラットフォームをVitis 2019.2 から使用できるようにしよう。
Vitis 2019.2 のインストール・ディレクトリ(私の場合は、 tools/Xilinx/Vitis/2019.2)の下の platform ディレクトリに ultra96v2_min2/images/linux/ultra96v2_min2_pkg/pfm/wksp1/ultra96v2_min2/export/ultra96v2_min2 ディレクトリをコピーする。
Vitis_tub_1_191208.png

これで、Vitis 2019.2 のプラットフォームとして使用できる。

Vitis 2019.2 を立ち上げて、 workspace を指定する。
Vitis_tub_2_191208.png

Vitis 2019.2 が立ち上がった。
Vitis_tub_3_191208.png

ここからアプリケーション・プロジェクトを作成する。
File メニューから New -> Application Project ... を選択する。
New Application Project ダイアログの Create Application Project 画面が立ち上がる。
Project name に vitis_ctut と入力した。
Vitis_tub_4_191208.png

Platform 画面で、自分で作成した ultra96v2_min2 プラットフォームを選択することができるので、選択した。
Vitis_tub_5_191208.png

Domain 画面は、OS として linux が選択されているので、そのままとする。(というかプラットフォームで Domain が linux しか作っていないので、選べない)
Vitis_tub_6_191208.png

Templates 画面で、Empty Application を選択して、Finish ボタンをクリックする。
Vitis_tub_7_191208.png

vitis_ctut アプリケーション・プロジェクトが作成された。(スクリーンショットをトルのを忘れました。。。)

左上のExplorer 画面の vitis_ctut_system -> vitis_ctut -> src を右クリックし、右クリックメニューから New -> File を選択した。
New File ダイアログが表示された。
File name に host_step1.cpp と入力し、Finish ボタンをクリックする。(これがホストのコード)
Vitis_tub_8_191208.png

host_step1.cpp を新規作成後に、Vitis-Tutorials/docs/mixing-c-rtl-kernels/reference-files/src/host ディレクトリから host_step1.cpp のコードをコピー&ペーストした。

左上のExplorer 画面の vitis_ctut_system -> vitis_ctut -> src を右クリックし、右クリックメニューから New -> File を選択した。
New File ダイアログが表示された。
File name に kernel_vadd.cpp と入力し、Finish ボタンをクリックする。(これがカーネルのコード)
Vitis_tub_9_191208.png

kernel_vadd.cpp を新規作成後に、Vitis-Tutorials/docs/mixing-c-rtl-kernels/reference-files/src/kernel_cpp ディレクトリから krnl_vadd.cpp のコードをコピー&ペーストした。

Vitis 2019.2 の様子を示す。
Vitis_tub_10_191208.png

左上のExplorer 画面の vitis_ctut_system -> vitis_ctut の vitis_ctut.prj をクリックする。
Application Project Settings 画面が表示される。
Add Hardware Functions... ボタンをクリックする。
Vitis_tub_11_191208.png

Add Hardware Functions ダイアログが表示された。
Matching items には、krnl_vadd のみ表示されて、選択されているので、そのまま OK ボタンをクリックする。
Vitis_tub_12_191208.png

krnl_vadd が Hardware Functions に入った。
Vitis_tub_13_191208.png

Active build configuration を Hardware に変更して、build ボタンをクリックする。
Vitis_tub_14_191208.png

ビルドが終了して、sd_card イメージが生成された。
Vitis_tub_15_191208.png
  1. 2019年12月09日 05:23 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

『御前山サイクリングフェスティバル』に出場します

今日は『御前山サイクリングフェスティバル』に参加します。

ロードバイク買って初めて大会に出場するのですが、とっても寒そうです。まだノーマルのペダルでビンディングペダルにもしていないのですが、大丈夫でしょうか?ちょっと不安です。。。高低差が 100 m なので登れるかどうか?も不安ですが、何とかなるでしょう?
楽しんでこようと思います。

また、雪の予想でしたが、雪は降らなそうなので良かったです。
出場するのは、3時間サイクルリレー(男子・女子・混合)のトリオチーム (3名)です。チームの他の方々は女性ですが、凄い方々なので、迷惑かけ内容に頑張ってきます。なお、交通規制が許可が降りなかったので、レースじゃなくなったそうです。

御前山まで車で、下道で行ってきました。約 1 時間 30 分くらい、約 65 km でした。
御前山ダムはとても風光明媚なロックフェラーダムで、ダムや周りの紅葉を見るだけでも心が安らぎます。
さて、コースは最初の高低差 100 m の登りがとても疲れましたが、何とか休まないで登り切れました。後は下りも含めて快適なコースでしたよ。私は 5 週しました。1 週が 6.1 km なので、30 km くらい走りましたね。無料の豚汁、パスタ、御前山ラーメン、デザートが無料で食べ放題だったので、楽しめました。ラーメン 2 杯とパンナコッタ食べました。
ただ、とっても寒かったです。。。
cycling_191208.jpg
  1. 2019年12月07日 04:07 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

array_patition example をultra96v2_min2 プラットフォームでやってみよう

Vitis アクセラレーション・プラットフォームの ultra96v2_min2 ができたので、array_patition example をやってみよう。
array_patition example は”Vitis_Accel_Examples を Ultra96V2 のプラットフォームでやってみる1(array_partition)”でやっているので、結果が出ている。これは、動作クロックが 100 MHz だったが、今回の動作クロックは 200 MHz にしてあるので、どのくらい性能向上したか?を確かめてみよう。

Vitis でarray partition のアプリケーション・プロジェクトを作成した。
Vitis_Platform2_87_191201.png

Hardware をビルドして sd_card ディレクトリの内容をMicroSD カードの第 1 パーティションにコピーした。MicroSD カードの第 2 パーティションには、Petalinux でビルドし sdk.sh で生成した aarch64-xilinx-linux ディレクトリの内容をコピーした。
MicroSD カードを Ultra96-V2 に入れて電源ON した。

root ノーパスでログインした。
zocl ドライバを insmod でロードした。
insmod /lib/modules/4.19.0-xilinx-v2019.2/extra/zocl.ko

アプリケーションを起動した。
cd /run/media/mmcblk0p1/
export XILINX_XRT=/usr
./ultra96v2_arrayp.exe matmul.xclbin

Vitis_Platform2_89_191204.png

どうやら
matmul: が 631730 ns で、 matmul: partition が 63230 ns のようだ。
前回、ultra96v2_min プラットフォームで実行した時は、matmul: が 927760 ns で、 matmul: partition が 134180 ns だったので、速くなっている。

matmul: は、927760 / 631730 ≒ 1.47 倍
matmul: partition は 134180 / 63230 ≒ 2.12 倍


になった。matmul: partition が 2 倍以上になっているのはクロック周波数以外の条件が効いているのかも知れない?

更に数回実行してみた。
Vitis_Platform2_90_191204.png

Vitis_Platform2_91_191204.png

2 回目以降は、うるさい [drm] メッセージが表示されなくなって見やすい。
  1. 2019年12月06日 05:27 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

AXI4 MasterとAXI4 Streamインターフェースがあって、AXI4 Masterにmemcpy()を使用しているVivado HLSの回路

AXI4 Master インターフェースと AXI4 Stream インターフェースを持っているVivado HLS で作成した回路でAXI4 Master に memcpy() を使用していると合成時のレポートがでないということをツィッターで聞いた。ツィッターでつぶやいていたのは、 @lp6m2 さんで、聞いていみると、Xilinx のCommunity Forums にも、”Is it possible to set internal BRAM values using AXI4 protocol in HLS IP using AXI-Stream protocol?”で質問しているそうだ。

私も試してみることにした。ソースコードはmemcpy() の代わりに for() 文でコピーする行も追加させていただいた。今はコメントアウトしてある。bram_setparam_test.cpp を示す。

#include "hls_video.h"
#include <hls_stream.h>
#include <ap_axi_sdata.h>
#include <iostream>
#include <string.h>

void bram_setparam_test(bool mode, int *inputparam,
        hls::stream<ap_axiu<32,1,1,1> >& instream, hls::stream<ap_axiu<32,1,1,1> >& outstream){
#pragma HLS INTERFACE axis port = instream
#pragma HLS INTERFACE axis port = outstream
#pragma HLS INTERFACE s_axilite port = mode
#pragma HLS INTERFACE m_axi port = inputparam offset=slave depth=100
#pragma HLS INTERFACE s_axilite port = mode
#pragma HLS INTERFACE s_axilite port = return
    static int internal_param[100];
#pragma HLS RESOURCE variable=internal_param core=RAM_1P_BRAM
    if(mode == true){
        //AXI4 set parameter mode
        memcpy(internal_param, inputparam, sizeof(int) * 100);
        /*for(int i=0; i<100; i++){
#pragma HLS PIPELINE II=1
            internal_param[i] = inputparam[i];
        }*/
    }else{
        //AXI4-stream MODE
        for(int i = 0; i < 100; i++){
#pragma HLS PIPELINE II=1
            int inval = instream.read().data;
            ap_axiu<32,1,1,1> outval;
            outval.data = inval * internal_param[i];
            outval.last = (i == 99 ? 1 : 0);
            outstream.write(outval);
        }
    }
}


自分なりにテストベンチのbram_setparam_test_tb.cpp を作ったので、それを示す。

// bram_setparam_test_tb.cpp
// 2019/12/04 by marsee
//

#include "hls_video.h"
#include <hls_stream.h>
#include <ap_axi_sdata.h>
#include <iostream>
#include <string.h>

void bram_setparam_test(bool mode, int* inputparam,
        hls::stream<ap_axiu<32,1,1,1> >& instream, hls::stream<ap_axiu<32,1,1,1> >& outstream);

int inputparam[100];

int main(){
    using namespace std;

    hls::stream<ap_axiu<32,1,1,1> > ins;
    hls::stream<ap_axiu<32,1,1,1> > outs;
    ap_axiu<32,1,1,1> streamd;
    ap_axiu<32,1,1,1> vals;

    for(int i=0; i<100; i++){
        inputparam[i] = i;
    }

    bram_setparam_test(true, inputparam, ins, outs);

    for(int i=0; i<100; i++){
        streamd.data = i;
        if(i == 0)
            streamd.user = 1;
        else
            streamd.user = 0;
        if(i == 100-1)
            streamd.last = 1;
        else
            streamd.last = 0;
        ins << streamd;
    }

    bram_setparam_test(false, inputparam, ins, outs);

    for(int i=0; i<100; i++){
        outs >> vals;
        if((int)vals.data != i*i){
            fprintf(stderr, "Error: i = %d, i^2 = %d; outs = %d\n", i, i*i, (int)vals.data);
            exit(1);
        }
        printf("i = %d, i^2 = %d; outs = %d\n", i, i*i, (int)vals.data);
    }
    return(0);
}


Vivado HLS 2019.2 のプロジェクトを示す。
Vivado_HLS_MS_memcpy_2_191205.png

C シミュレーションを行って成功した。結果を示す。
Vivado_HLS_MS_memcpy_1_191205.png

C コードの合成を行った。この結果はスカスカだった。レポートが表示されない。
Vivado_HLS_MS_memcpy_3_191205.png

C/RTL 協調シミュレーションを行った。結果を示す。
Vivado_HLS_MS_memcpy_4_191205.png

波形を見ると、正常に動作しているようだ。
Vivado_HLS_MS_memcpy_5_191205.png

Vivado_HLS_MS_memcpy_6_191205.png

Export RTL もそれらしく動いている。
Vivado_HLS_MS_memcpy_7_191205.png

レポートの結果にも問題は無いようだ。

次に、memcpy() をコメントアウトして、for() を活かしてみよう。

 if(mode == true){
  //AXI4 set parameter mode
  //memcpy(internal_param, inputparam, sizeof(int) * 100);
  for(int i=0; i<100; i++){
#pragma HLS PIPELINE II=1
   internal_param[i] = inputparam[i];
  }
 }else{


これでC コードの合成を行った。結果を示す。今度はちゃんとレポートが出た。
Vivado_HLS_MS_memcpy_8_191205.png

C/RTL 協調シミュレーションのレイテンシも memcpy() の場合と同一だ。
Vivado_HLS_MS_memcpy_9_191205.png

Export RTL を示す。memcpy() とあまり変わりがない。
Vivado_HLS_MS_memcpy_10_191205.png

今までも memcpy() は使っていたので、それだけの原因では無いと思う。
AXI4 Master を memcpy() でやっている時に、AXI4 Stream インターフェースを使ったことは無いので、その時にC コードの合成のレポートが消えてしまうのかも知れない?
なお、Vivado HLS 2018.3 でも、Vivado HLS 2017.4 でも、同様にC コードの合成のレポートが消えてしまう。
  1. 2019年12月05日 05:44 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

Ultra96-V2 の Vitis アクセラレーション・プラットフォームの作り方4(Vitis アプリケーション・プロジェクトの作成)

Ultra96-V2 の Vitis アクセラレーション・プラットフォームの作り方3(Vitis プラットフォーム作成)”の続き。

Vitis のアクセラレーション・プラットフォームを作成できたので、それを使用してアプリケーション・プロジェクトを作成し、Ultra96-V2 で動作させてみよう。

Vitis 2019.2 のGUI で、New -> Application Project... を選択する。
Vitis_Platform2_72_191201.png

New Application Project ダイアログの Create a New Application Project 画面で、Project Name に ultra96v2_app1 を入力した。
Vitis_Platform2_73_191201.png

Platform では、今回作成したプラットフォームの ultra96v2_min2 を選択した。Flow を見ると Embedded Acceleration と表示されていることが分かる。これは、アクセラレーションができるプラットフォームということらしい?
Vitis_Platform2_74_191201.png

Domain 画面はディフォルトのままとした。
Vitis_Platform2_75_191201.png

Template 画面は、最初は下図の様には項目がなかったが、Download ボタンをクリックして、チュートリアルをダウンロードするとサンプル・プロジェクトが増えた。その内の最初から入っている Vector Addition を選択して、Finish ボタンをクリックした。
Vitis_Platform2_76_191201.png

ultra96v2_app1 アプリケーション・プロジェクトが作成された。
Vitis_Platform2_77_191201.png

Qemu を設定してないので、無駄とは思うがEmulation-SW をビルドしてみよう。
Assistant ウインドウの ultra96v2_app1_system を展開して、 ultra96v2_app1 -> Emulation -SW を右クリックし、右クリックメニューから Build を選択した。
Vitis_Platform2_78_191201.png

エラーになった。
Vitis_Platform2_79_191201.png

Emulation-HW もビルドしてみたが、同様にエラーになった。
Vitis_Platform2_80_191201.png

Hardware をビルドすると、こちらは成功した。
sd_card のディレクトリもできている。
Vitis_Platform2_81_191201.png

Hardware -> binary_container_1 -> SD Card Image を右クリックし、右クリックメニューから Open -> Open File Browser を選択すると、ファイル・ブラウザで sd_card ディレクトリが表示された。
Vitis_Platform2_82_191201.png

sd_card ディレクトリをMicroSD カードの第 1 パーティションにコピーした。
Vitis_Platform2_84_191201.png

MicroSD カードの第 2 パーティションには、PetaLinux で生成した ultra96v2_min2/images/linux/ultra96v2_min2_pkg/pfm/sysroots/aarch64-xilinx-linux ディレクトリの内容を書き込んだ。
(注意: Vitis プラットフォームのRoot FS を使用するとLinux が起動しません)
Vitis_Platform2_84_191201.png

MicroSD カードをUltra96V2 に入れて、電源ON するとLinux が起動した。
root ノーパスでログインした。
zocl ドライバを insmod でロードする。
insmod /lib/modules/4.19.0-xilinx-v2019.2/extra/zocl.ko
Vitis_Platform2_85_191201.png

アプリケーションを起動する。
cd /run/media/mmcblk0p1/
export XILINX_XRT=/usr
./ultra96v2_app.exe bianry_container_1.xclbin

Vitis_Platform2_86_191201.png

TEST_PASSED が表示され、アクセラレーションされたアプリケーションの実行に成功した。
  1. 2019年12月03日 05:21 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0
»