FC2カウンター FPGAの部屋 Vitis 2019.2 アプリケーション・プロジェクトの C/C++ カーネル・コード作成手順
FC2ブログ

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

FPGAの部屋

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

Vitis 2019.2 アプリケーション・プロジェクトの C/C++ カーネル・コード作成手順

前回は、”Vitis 2019.2 アプリケーション・プロジェクトのホスト・コード作成手順”でしたが、今回は、Vitis 2019.2 アプリケーション・プロジェクトの C/C++ カーネル・コード作成手順をまとめていきたいと思う。

今回参照するのは、”Vitis 統合ソフトウェア プラットフォームの資料 アプリケーション アクセラレーション開発 UG1393 (v2019.2) 2019 年 11 月 11 日”の 68 ページの”第 7 章 C/C ++ カーネル”

カーネルはVivado HLS で高位合成される C/C++ のコードとなる。ただしVitis 用のルールがある。
Vitis_Accel_Examples/cpp_kernels/dataflow_stream/src/adder.cpp を参考にして自分で書いた square.cpp の C++ カーネルを例に説明する。

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 = size bundle = control
#pragma HLS INTERFACE s_axilite port = return bundle = control

    static hls::stream<int> ins;
    static hls::stream<int> 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);
}
}


C/C++ カーネルの書き方

1. extern "C" { } でハードウェア化する関数を囲む

2. ハードウェア化する関数の戻り値の型を void にする(int にするとビルドできてもカーネルの結果が 0 だった)

3. インターフェースは AXI4 Master とする(複数のAXI4 インターフェースを使用しても良い。複数のAXI4 インターフェースを使用する場合は bundle で変更する bundle = gmem)
#pragma HLS INTERFACE m_axi port = inm offset = slave bundle = gmem

4. スカラー値を設定するインターフェースの AXI4 Lite は 1 つにする必要がある(bundle = control)
#pragma HLS INTERFACE s_axilite port = size bundle = control

5. 使用できるデータ型
  int、float、double などの通常の C 言語のデータ型
  任意精度整数型(ap_int<11> aaa, ap_uint<12> bbb)
  任意精度固定小数点データ型(ap_fixed<9, 1, AP_TRN_ZERO, AP_SAT>、ap_fixed<4, 3, AP_TRN_ZERO, AP_WRAP>)

こんなところかな?後は一般的なVivado HLS の書き方でOK

なお、 square() では、
read_dma(inm, ins, size); がDMA Read して HLS ストリームに変換する関数
square_stream(ins, outs, size); がHLS ストリームを入力したデータを 2 乗して HLS ストリームで出力する関数
write_dma(outs, outm, size); が HLS ストリームを DMA Write する関数
の 3 つの関数を並列動作させるために dataflow 指示子を追加してある。このように書くのがお勧め。
  1. 2019年12月13日 04:15 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/4729-6704ee28
この記事にトラックバックする(FC2ブログユーザー)