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

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

FPGAの部屋

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

Vitis HLS 2020.1 の Pre-synthesis Control Flow Viewer 機能

Vitis HLS 2020.1 の Pre-synthesis Control Flow Viewer 機能について見て行こう。
Pre-synthesis Control Flow Viewer 機能は、 C シミュレーション時に C Simulation Dialog で Enable Pre-synthesis Control Flow Viewer をチェックすることにより使用することができる。

(注) なお、この機能は今のところLinux だけのようである。Windows 10 の Vitis HLS 2020.1 では、そもそも C Simulation Dialog に Enable Pre-synthesis Control Flow Viewer のチェック項目が存在しない。

Vitis HLS ユーザーガイド UG1399 (v2020.1) 2020 年 6 月 24 日”の 44 ページの”[Pre-Synthesis Control Flow] ビュー”から引用する。それによると

[Pre-Synthesis Control Flow] ビューは、関数内のホット スポット (演算負荷の高い制御構造) を見つけたり、結果を改善または最適化するためにプラグマまたは指示子を適用するのに便利です。

ということだ。

使用する Vitis 2020.1 プロジェクトは”Vitis HLS 2020.1 と Vivado HLS 2019.2 の違い(AXI4 Master インターフェースでの offset=slave オプション時の扱いの違い)”の square プロジェクトを使用する。
Run C Simulation ボタンをクリックし、出てきた C Simulation Dialog で Enable Pre-synthesis Control Flow Viewer をチェックする。
Vitis_HLS201_62_200719.png

OK ボタンをクリックすると、[Pre-Synthesis Control Flow] ビューが表示された。
Vitis_HLS201_63_200719.png

簡単な例ではよく分からないため、square_vhls.cpp を Vitis のカーネル・コードに書き換えた。ただし、 extern C は外してある。
ソースコードを貼っておく。なお、テストベンチの方も volatile を外してある。

// square.cpp
// 2019/12/11 by marsee
//

// Vitis_Accel_Examples/cpp_kernels/dataflow_stream/src/adder.cpp を参考にしています
// https://github.com/Xilinx/Vitis_Accel_Examples/blob/master/cpp_kernels/dataflow_stream/src/adder.cpp

#include <hls_stream.h>
#include <stdint.h>

static void read_dma(int32_t *inm, hls::stream<int32_t> &outs, int32_t size){
    LOOP_RDMA: for(int i=0; i<size; i++){
#pragma HLS PIPELINE II=1
#pragma HLS LOOP_TRIPCOUNT min=10 max=10
        outs.write(inm[i]);
    }
}

static void square_stream(hls::stream<int32_t> &ins, hls::stream<int32_t> &outs, int32_t size){
    LOOP_SQAURE_ST: for(int i=0; i<size; i++){
#pragma HLS PIPELINE II=1
#pragma HLS LOOP_TRIPCOUNT min=10 max=10
        int32_t tmp = ins.read();
        outs.write(tmp * tmp);
    }
}

static void write_dma(hls::stream<int32_t> &ins, int32_t *outm, int32_t size){
    LOOP_WDMA: for(int i=0; i<size; i++){
#pragma HLS PIPELINE II=1
#pragma HLS LOOP_TRIPCOUNT min=10 max=10
        outm[i] = ins.read();
    }
}

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=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

    static hls::stream<int32_t> ins;
    static hls::stream<int32_t> outs;
#pragma HLS STREAM variable = ins depth = 32
#pragma HLS STREAM variable = outs depth = 32

#pragma HLS dataflow
    read_dma(inm, ins, size);
    square_stream(ins, outs, size);
    write_dma(outs, outm, size);
}


Vitis_HLS201_65_200719.png

Run C Simulation ボタンをクリックし、出てきた C Simulation Dialog で Enable Pre-synthesis Control Flow Viewer をチェックして、C シミュレーションを実行した。
[Pre-Synthesis Control Flow] ビューが表示された。
Vitis_HLS201_66_200719.png

下の Loops タブから LOOP_SQUARE_ST をクリックすると、 square_stream が展開され、ソースコード上で LOOP_SQUARE_ST が選択された。
Vitis_HLS201_67_200719.png

下の Loops タブから LOOP_WDMA をクリックすると、 write_dma が展開され、ソースコード上で LOOP_WDMA が選択された。
Vitis_HLS201_68_200719.png
  1. 2020年07月19日 05:06 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

Vitis HLS 2020.1 と Vivado HLS 2019.2 の違い(AXI4 Master インターフェースでの offset=slave オプション時の扱いの違い)

Vitis 2020.1 で ultra96v2_min2_201 アクセラレーション・プラットフォームを使用した自作アプリケーション・プロジェクトが動作しない原因がわかった”で Vitis 2020.1 と Vitis 2019.2 のカーネル・コードの書き方が違っていることが分かった。これはつまり、Vitis HLS 2020.1 と Vivado HLS 2019.2 の書き方が違っているということになる。そこで、 Vitis HLS 2020.1 と Vivado HLS 2019.2 で同じコードを実装してみようと思う。

実装するコードは、”Vitis 2020.1 で ultra96v2_min2_201 アクセラレーション・プラットフォームを使用した自作アプリケーション・プロジェクトが動作しない原因がわかった”の square だが、簡単化のために大幅にコードを短くして、また、HLS ツール用に多少、指示子を修正してある。またテストベンチも作成した。

まずは、HLS ツール用の square の square_vhls.cpp を示す。

// square_vhls.cpp
// 2019/12/11 by marsee
// 2020/07/14 : ハードウェア・アクセラレーション関数を1つにした
//

#include <stdint.h>

void square(volatile int32_t *inm, volatile int32_t *outm, int32_t size){
#pragma HLS INTERFACE m_axi depth=10 port = inm offset = slave bundle = gmem
#pragma HLS INTERFACE m_axi depth=10 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

    MAIN_LOOP: for(int i=0; i<size; i++){
#pragma HLS PIPELINE II=1
#pragma HLS LOOP_TRIPCOUNT min=10 max=10

        int32_t indata = inm[i];
        int32_t square_data = indata * indata;
        outm[i] = square_data;
    }
}


テストベンチの square_vhls_tb.cpp を示す。

// square_vhls_tb.cpp
// 2020/07/17 by marsee
//

#include <stdint.h>
#include <stdio.h>

void square(volatile int32_t *inm, volatile int32_t *outm, int32_t size);

int main(){
    int32_t data[10];
    int32_t result[10];

    for(int i=0; i<10; i++){
        data[i] = i;
    }

    square(data, result, 10);

    for(int i=0; i<10; i++){
        printf("i = %d, data[%d] = %d, result[%d] = %d\n", i, i, data[i], i, result[i]);
    }

    return(0);
}


Vitis 2020.1 の C シミュレーション結果を示す。
Vitis_HLS_vs_Vivado_HLS_1_200718.png

Vivado HLS 2019.2 の C シミュレーション結果を示す。
Vitis_HLS_vs_Vivado_HLS_2_200718.png

次に Vitis 2019.2 の C コードの合成結果を示す。
Vitis_HLS_vs_Vivado_HLS_3_200718.png

Vivado HLS 2019.2 のC コードの合成結果を示す。
Vitis_HLS_vs_Vivado_HLS_4_200718.png

Vitis 2020.1 の生成された Verilog HDL コードを見てみよう。
s_axi つまり Slave の AXI4 Lite インターフェースが 2 個ある。 square_control_r_s_axi.v と square_control_s_axi.v だ。
トップのファイルの square.v を見ると、 s_axi_control インターフェースと s_axi_control_r インターフェースの 2 個の AXI4 Lite インターフェースが実装されている。
Vitis_HLS_vs_Vivado_HLS_5_200718.png

Vivado HLS 2019.2 の生成された Verilog HDL コードを見てみよう。
s_axi つまり Slave の AXI4 Lite インターフェースは square_control_s_axi.v の 1 個だけだ。トップのファイルの square.v を見ても s_axi_control インターフェース 1 個だけとなっていた。
Vitis_HLS_vs_Vivado_HLS_6_200718.png

Vitis 2020.1 の square_control_r_s_axi.v のアドレス・マップ部分を表示する。

//------------------------Address Info-------------------
// 0x00 : reserved
// 0x04 : reserved
// 0x08 : reserved
// 0x0c : reserved
// 0x10 : Data signal of inm
//        bit 31~0 - inm[31:0] (Read/Write)
// 0x14 : Data signal of inm
//        bit 31~0 - inm[63:32] (Read/Write)
// 0x18 : reserved
// 0x1c : Data signal of outm
//        bit 31~0 - outm[31:0] (Read/Write)
// 0x20 : Data signal of outm
//        bit 31~0 - outm[63:32] (Read/Write)
// 0x24 : reserved
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on Handshake)


AXI4 Master 部分だけのアドレス・マップになっている。

Vitis 2020.1 の square_control_s_axi.v のアドレス・マップ部分を表示する。

//------------------------Address Info-------------------
// 0x00 : Control signals
//        bit 0  - ap_start (Read/Write/COH)
//        bit 1  - ap_done (Read/COR)
//        bit 2  - ap_idle (Read)
//        bit 3  - ap_ready (Read)
//        bit 7  - auto_restart (Read/Write)
//        others - reserved
// 0x04 : Global Interrupt Enable Register
//        bit 0  - Global Interrupt Enable (Read/Write)
//        others - reserved
// 0x08 : IP Interrupt Enable Register (Read/Write)
//        bit 0  - enable ap_done interrupt (Read/Write)
//        bit 1  - enable ap_ready interrupt (Read/Write)
//        others - reserved
// 0x0c : IP Interrupt Status Register (Read/TOW)
//        bit 0  - ap_done (COR/TOW)
//        bit 1  - ap_ready (COR/TOW)
//        others - reserved
// 0x10 : Data signal of size
//        bit 31~0 - size[31:0] (Read/Write)
// 0x14 : reserved
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on Handshake)


AXI4 Lites Slave 部分のアドレス・マップだ。
つまり、Vitis HLS 2020.1 では square_vhls.cpp の指示子を与えると、AXI4 Master と AXI4 Lite Slave の AXI4 Lite インターフェースが分かれてしまうようだ。これだと単一の AXI4 Lites Slave ポートを必要とする Vitis で動作しないはずだ。。。

Vivado HLS 2019.2 の square_control_s_axi.v のアドレス・マップ部分を表示する。

//------------------------Address Info-------------------
// 0x00 : Control signals
//        bit 0  - ap_start (Read/Write/COH)
//        bit 1  - ap_done (Read/COR)
//        bit 2  - ap_idle (Read)
//        bit 3  - ap_ready (Read)
//        bit 7  - auto_restart (Read/Write)
//        others - reserved
// 0x04 : Global Interrupt Enable Register
//        bit 0  - Global Interrupt Enable (Read/Write)
//        others - reserved
// 0x08 : IP Interrupt Enable Register (Read/Write)
//        bit 0  - Channel 0 (ap_done)
//        bit 1  - Channel 1 (ap_ready)
//        others - reserved
// 0x0c : IP Interrupt Status Register (Read/TOW)
//        bit 0  - Channel 0 (ap_done)
//        bit 1  - Channel 1 (ap_ready)
//        others - reserved
// 0x10 : Data signal of inm
//        bit 31~0 - inm[31:0] (Read/Write)
// 0x14 : reserved
// 0x18 : Data signal of outm
//        bit 31~0 - outm[31:0] (Read/Write)
// 0x1c : reserved
// 0x20 : Data signal of size
//        bit 31~0 - size[31:0] (Read/Write)
// 0x24 : reserved
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on Handshake)


AXI4 Master と AXI4 Lite Slave の AXI4 Lite インターフェースが統合されている。これだったら、 Vitis も動作する。


さて、それでは、 Vitis 2020.1 の square_vhls.cpp の 2 個の指示子のコメントアウトを外してみよう。

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


C コードの合成を行った。結果を示す。
Vitis_HLS_vs_Vivado_HLS_7_200718.png

Vivado HLS 2019.2 と同様に Slave の AXI4 Lite インターフェースは square_control_s_axi.v の 1 個だけとなった。
Vitis_HLS_vs_Vivado_HLS_8_200718.png

これで、 Vitis 2020.1 のアクセラレーション・プロジェクトも動作するようになった訳だ。
square_control_s_axi.v のアドレス・マップ部分を貼っておく。

//------------------------Address Info-------------------
// 0x00 : Control signals
//        bit 0  - ap_start (Read/Write/COH)
//        bit 1  - ap_done (Read/COR)
//        bit 2  - ap_idle (Read)
//        bit 3  - ap_ready (Read)
//        bit 7  - auto_restart (Read/Write)
//        others - reserved
// 0x04 : Global Interrupt Enable Register
//        bit 0  - Global Interrupt Enable (Read/Write)
//        others - reserved
// 0x08 : IP Interrupt Enable Register (Read/Write)
//        bit 0  - enable ap_done interrupt (Read/Write)
//        bit 1  - enable ap_ready interrupt (Read/Write)
//        others - reserved
// 0x0c : IP Interrupt Status Register (Read/TOW)
//        bit 0  - ap_done (COR/TOW)
//        bit 1  - ap_ready (COR/TOW)
//        others - reserved
// 0x10 : Data signal of inm
//        bit 31~0 - inm[31:0] (Read/Write)
// 0x14 : Data signal of inm
//        bit 31~0 - inm[63:32] (Read/Write)
// 0x18 : reserved
// 0x1c : Data signal of outm
//        bit 31~0 - outm[31:0] (Read/Write)
// 0x20 : Data signal of outm
//        bit 31~0 - outm[63:32] (Read/Write)
// 0x24 : reserved
// 0x28 : Data signal of size
//        bit 31~0 - size[31:0] (Read/Write)
// 0x2c : reserved
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on Handshake)


Vitis HLS では INTERFACE 指示子の m_axi オプションで AXI4 Master インターフェースを実装した時に、 offset=slave でオフセット・アドレスをレジスタマップする時は、その引数に AXI4 Lite Slave インターフェースの指示子、 INTERFACE 指示子の s_axilite オプションも付加する必要がある。
  1. 2020年07月18日 05:44 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

Vitis HLS 2020.1 で”(目標)Vivado HLSで1クロック毎に結果を出力できるNNを作る4(チューンナップ1)”をやってみる

Vivado HLS では悩まされた large runtime and excessive memory のエラーが Vitis HLS 2020.1 では改善されているか?を確認してみる。
(目標)Vivado HLSで1クロック毎に結果を出力できるNNを作る4(チューンナップ1)”を Vitis HLS 2020.1 でやってみることにした。結果はやはり、同様に large runtime and excessive memory のエラーがでる。

Vitis HLS 2020.1 で”(目標)Vivado HLSで1クロック毎に結果を出力できるNNを作る4(チューンナップ1)”と同様のプロジェクトを作ったが、ただし、Ultra96V2 用のFPGA として、動作周波数は 200 MHz とした。

それでは C コードの合成を行ったがやはりエラーだった。エラー内容を示す。

ERROR: [HLS 200-1471] Stop unrolling loop 'af1_dot1' (all_deploy_afnet4mnist2/mnist_nn.cpp:841) in function 'mnist_nn' because it may cause large runtime and excessive memory usage due to increase in code size. Please avoid unrolling the loop or form sub-functions for code in the loop body.\


やはり、Vivado HLS と同じで large runtime and excessive memory のエラーだった。
Vitis_HLS201_58_200629.png

なお、 C シミュレーションは通常通り成功している。
Vitis_HLS201_59_200629.png

#pragma HLS PIPELINE II=1

をコメントアウトして、

#pragma HLS DATAFLOW

を追加した。これで C コードの合成を行った。結果を示す。
Vitis_HLS201_61_200629.png

合成はできたがDSP と LUT の使用率が 100 % を超えてしまっている。結局、この FPGA には実装できない。
  1. 2020年06月29日 05:28 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

Vitis HLS 2020.1 で all_layers_template を IP にする3(C/RTL 協調シミュレーション)

Vitis HLS 2020.1 で all_layers_template を IP にする2(合成レポートの確認)”の続き。

Vitis HLS 2020.1 を使用して、白線走行用CNN の all_layers_template を実装してみよう。 all_layers_template は縦 10 ピクセル x 横 56 ピクセルの白線画像を使用して、右に行くか、直進するか、左に行くかの 3 つの走行状態を出力する畳み込みニューラルネットワークだ。ということで、前回は、C コードの合成レポートを見ていこう。更に、Export RTL を行って、Vitis HLS の合成結果を Vivado の Place & Route で検証した。今回は、C/RTL 協調シミュレーションと Dataflow Viewer を見ていこう。

Vitis HLS の機能を確認するために C/RTL 協調シミュレーションを行う。

まずは、テストベンチのソースコードの NUM_ITERATIONS を 300 から 2 にする。これは、推論する数に相当する。つまり、 C/RTL 強調シミュレーションに表示する数が多いと時間がかかりすぎて、ログの大きさも大きくなるので、推論数を少なくした。
Vitis_HLS201_50_200623.png

Run C/RTL Cosimulation ボタンをクリックして C/RTL 協調シミュレーションを行う。
Co-simulation Dialog が表示された。
Extra Options for DATAFLOW の Wave Debug と Disable Deadlock Detection, Channel (PIPO/FIFO) Profiling にチェックを入れた。
Vitis_HLS201_51_200623.png

これらの情報は Vitis Unified Software Development Platform DocumentationC/RTL Co-Simulation in Vitis HLS に書いてある。
Disable Deadlock Detection にチェックを入れると Cosim Deadlock Viewer が立ち上がるそうだ。デッドロックシナリオを視覚化してくれるということで楽しみだ。
Dataflow Viewer も表示することができるということで、こちらも見てみたい。

C/RTL 協調シミュレーションが終わって、Vivado が立ち上がり、Verilog HDL のテストベンチの $finish; で終了しているシミュレーション結果が表示された。
Wave Debug にチェックを入れると Vivado のシミュレーションをそのまま見ることができる。
Vitis_HLS201_52_200623.png

そこで、自分でテストベンチにスティミュラスを追加してもう一度、シミュレーションしても良いだろう?

C/RTL 協調シミュレーションの波形を示す。
Vitis_HLS201_53_200623.png

Vivado を終了して Vitis HLS を見ると、C/RTL 協調シミュレーションの結果が表示されている。
Vitis_HLS201_54_200623.png

Latency の min は 9444 クロック、 avg は 9464 クロック、 max は 9485 クロックだった。イテレーションは 2 だったはずなので、3つのデータが取れたはずはない。この Latency は動的に分かる、つまり、シミュレーション結果から導き出すのではなく、静的解析の結果も加味して表示するのだろうか?

C コードの合成結果の Performance & Resource Estimates の all_layers を右クリックして、右クリックメニューから Open Dataflow Viewer を選択する。
Vitis_HLS201_55_200623.png

Dataflow Viewer が表示された。
Vitis_HLS201_56_200623.png

ここでは各関数が並べて表示されていた。
下の Process ウインドウの後ろ部分を貼っておく。
Vitis_HLS201_57_200623.png

Cosim Deadlock Viewer は開かなかった。残念。。。
  1. 2020年06月28日 04:26 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

Vitis HLS 2020.1 で all_layers_template を IP にする2(合成レポートの確認)

Vitis HLS 2020.1 で all_layers_template を IP にする1(C シミュレーション、C コードの合成)”の続き。

Vitis HLS 2020.1 を使用して、白線走行用CNN の all_layers_template を実装してみよう。 all_layers_template は縦 10 ピクセル x 横 56 ピクセルの白線画像を使用して、右に行くか、直進するか、左に行くかの 3 つの走行状態を出力する畳み込みニューラルネットワークだ。ということで、前回は、デバックしながら C シミュレーション、C コードの合成を行った。今回は、C コードの合成レポートを見ていこう。更に、Export RTL を行って、Vitis HLS の合成結果を Vivado の Place & Route で検証した。

まずは、前回の C コードの合成結果を全部展開してみた。
Vitis_HLS201_41_200623.png
Vitis_HLS201_42_200623.png

conv_layer1 の Loop_y_Loop_x と input_layer の Loop2_Loop3 に Timing Violation が表示されている。

アイコンの意味は以下のようだ。
Vitis_HLS201_43_200623.png

Timing Violation ボタンをクリックすると Timing Violation だけが表示される。
Vitis_HLS201_44_200623.png

Analysis 画面を示す。
Vitis_HLS201_45_200623.png

conv_layer1 の Loop_y_Loop_x を表示すると、 Timing Violation 部分が赤く見えるようだ。
ソースコードを表示すると、畳み込みの処理の中のまだ n X n のカーネルと演算するだけデータが貯まっていないので、先に進める部分が選択されている。
Vitis_HLS201_46_200623.png

input_layer の Loop2_Loop3 も見ると、やはり Timing Violation 部分が赤く見えるようだ。
ソースコードを表示すると、入力処理の内側のループの for() 文が選択されている。
Vitis_HLS201_47_200623.png

本当に Timing Violation あるのかどうををチェックするために、 Vivado synthesis, place and route にチェックを入れて、Export RTL を行う。
Vitis_HLS201_48_200623.png

Export RTL の結果を示す。
Vitis_HLS201_49_200623.png

CP achieved post-implementation は 3.226 ns で問題ないようだ。
何処が Timing Violation なのだろうか?何か違う意味があるだろうか?
  1. 2020年06月24日 04:52 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

Vitis HLS 2020.1 で all_layers_template を IP にする1(C シミュレーション、C コードの合成)

Vitis HLS 2020.1 を使用して、白線走行用CNN の all_layers_template を実装してみよう。 all_layers_template は縦 10 ピクセル x 横 56 ピクセルの白線画像を使用して、右に行くか、直進するか、左に行くかの 3 つの走行状態を出力する畳み込みニューラルネットワークだ。今回は、デバックしながら C シミュレーション、C コードの合成を行った。

以前の記事を紹介する。
テンプレートで書いた畳み込みニューラルネットワーク1(ソースコード)
テンプレートで書いた畳み込みニューラルネットワーク2(C シミュレーションとC コードの合成)
テンプレートで書いた畳み込みニューラルネットワーク2(C/RTL協調シミュレーションとExport RTL)

これらの記事では、テンプレートの引数は size_t で宣言されていたが、Vivado HLS 2019.2 で実装した時にコンパイルが通らなかったので、 std::size_t に修正してある。
Vitis_HLS201_27_200622.png

これを C シミュレーションを行ったが、 hls_video.h が無いと言われてエラーになった。
Vitis_HLS201_28_200622.png

これは、”UG1391 (v2020.1) June 3, 2020 Vitis HLS Migration Guide”の 18 ページの”HLS Video Library”にも書いてあるようだが、 Vitis vision library を使うようになったようだ。 hls_video.h は無くなってしまったようだ。なお、 Viavdo HLS 2020.1 でも hls_video.h は無くなってしまった。
そこで、 hls_video.h をインクルードしている行を消去した。
Vitis_HLS201_29_200622.png

もう一度、 C シミュレーションを行うと、LineBuffer や Window が無いというエラーが出た。
Vitis_HLS201_30_200622.png

これは HLS Video Library から Vitis Vision Library に移行する必要がある。

@ciniml さんに教えてもらった”Migrating HLS Video Library to Vitis vision”から”xf_video_mem.hpp”をインクルードすれば良いということが分かった。そして、LineBuffer や Window の前に hls:: ではなく xf::cv:: と付ける必要がある。

”xf_video_mem.hpp”は /media/masaaki/Ubuntu_Disk/Xilinx_github/Vitis_Libraries/vision/L1/include/common ディレクトリにあるので、/media/masaaki/Ubuntu_Disk/Xilinx_github/Vitis_Libraries/vision/L1/include までのインクルードパスを付け加える必要がある。
Vitis_HLS201_31_200622.png

Vitis HLS 2020.1 の Project メニューから Project Settings... を選択する。
Simulation を選択して、TestBench Files の中の conv_layer_soft.cpp の CFLAGS に -I/media/masaaki/Ubuntu_Disk/Xilinx_github/Vitis_Libraries/vision/L1/include を設定する。
Vitis_HLS201_32_200622.png

hls::LineBuffer と hls::Window 関数を xf::cv::LineBuffer と xf::cv::Window に書き直した。
Vitis_HLS201_33_200622.png

これで、 C シミュレーションを行うと、結果が出力できた。
Vitis_HLS201_34_200622.png

次に C コードの合成を行う。
まずは Top Function を指定する。
Vitis HLS 2020.1 の Project メニューから Project Settings... を選択する。
Synthesis を選択して、Top Function: の Browse ボタンをクリックする。
Vitis_HLS201_35_200622.png

Select Top Function ダイアログがでる。Vivado HLS と違って、とっても項目が多いので、キー入力で検索する。”all_l”程度、キー入力すると all_layers が出てきた。 all_layers を選択して OK ボタンをクリックする。
Vitis_HLS201_36_200622.png

Top Function に all_layers が入った。
Vitis_HLS201_37_200622.png

これで C コードの合成をしたところ、std namespace に sizi_t が無いというエラーが出た。
Vitis_HLS201_38_200622.png

AR# 72348 Vivado HLS 2019.1 - Must explicity define size_t data type”を見ると、 size_t は、標準ライブラリヘッダーの および で定義されているということなので、cstddef をインクルードする。
Vitis_HLS201_39_200622.png

これでもう一度 C コードの合成を行ったところ成功した。
Vitis_HLS201_40_200622.png
  1. 2020年06月23日 05:21 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

Vitis HLS 2020.1 の C/RTL 強調シミュレーション時の新機能1(Web Debug)

Vitis HLS 2020.1 の C/RTL 強調シミュレーション時に新しい機能が 3 つある。その内の Wave Debug (Vivado XSIM only) を試してみよう。

この機能に関しては、Vitis Unified Software Development Platform DocumentationC/RTL Co-Simulation in Vitis HLS に記述がある。

さて早速やってみよう。
Vitis HLS 2020.1 で Run C/RTL Cosimulation ボタンをクリックする。
Co-simulation ダイアログで Wave Debug (Vivado XSIM only) にチェックを入れた。
Vitis_HLS201_23_200622.png

Vivado 2020.1 が起動して、シミュレーションの $finish; で止まっている。
つまり、シミュレーションを自由にできるようになるようだ。この状態だと、波形ウインドウに信号を追加して見ることもできるし、もっと長くシミュレーションすることもできる。更に、スティミュラスを追加して、回路の挙動を見ることもできそうだ。これは良い。
Vitis_HLS201_24_200622.png

Vitis_HLS201_25_200622.png

Vivado を終了すると、Vitis HLS に結果が表示された。チェックを入れないときと同じだ。
Vitis_HLS201_26_200622.png

  1. 2020年06月22日 05:12 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0
»