FC2カウンター FPGAの部屋 2017年11月06日

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

FPGAの部屋

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

Vivado HLSで#define と プラグマ指示子の使用

今日はVivado HLS の小ネタをご紹介したい。

Vivado HLS でFIFO を作ってみた3(hiyuhさんに教えてもらった回路)”でFIFO の C コードが書いてあるが、hiyuh さんに教えてもらったコードが興味深いので、試してみよう。

Vivado HLS 勉強会の乗算回路で、static const size_t を使用して PIPELINE指示子の II の値を指定する方法と、#define を使用してPIPELINE指示子(プラグマ指示子)を使用する方法だ。

参考にするのは、”Vivado Design Suite ユーザー ガイド 高位合成 UG902 (v2017.3) 2017 年 10 月 04 日”の 54 ページの”#define と プラグマ指示子の使用”だ。

まずは、”#define と プラグマ指示子の使用”を参考に、プラグマを入れてみた。なお、multi_apuint() 関数の ap_uint 引数の幅は、static const size_t 宣言した値で記述することができた。

// multi_apuint.cpp

#include <stdio.h>
#include <string.h>
#include <ap_int.h>

#define PRAGMA_SUB(x) _Pragma (#x)
#define PRAGMA_HLS(x) PRAGMA_SUB(x)
#define II_VAL_D 1


static const size_t INW = 8;
static const size_t OUTW = INW * 2;


void multi_apuint(ap_uint<INW> multi_in0, ap_uint<INW> multi_in1,
        ap_uint<OUTW> *multi_out){

PRAGMA_HLS(HLS PIPELINE II=II_VAL_D)
#pragma HLS INTERFACE s_axilite register port=multi_in1 bundle=AXI4LS
#pragma HLS INTERFACE s_axilite register port=multi_in0 bundle=AXI4LS
#pragma HLS INTERFACE s_axilite register port=multi_out bundle=AXI4LS
#pragma HLS INTERFACE s_axilite port=return bundle=AXI4LS
    *multi_out = multi_in0 * multi_in1;
}


これで C コードの合成を行った。結果を示す。
Vivado_HLS _1_171106

Interval は 1 になっていて、PIPELINE指示子が効いている。

次に、PIPELINE指示子の II の値を static const size_t で与えた。

// multi_apuint.cpp

#include <stdio.h>
#include <string.h>
#include <ap_int.h>

static const size_t INW = 8;
static const size_t OUTW = INW * 2;
static const size_t II_VAL = 2;

void multi_apuint(ap_uint<INW> multi_in0, ap_uint<INW> multi_in1,
        ap_uint<OUTW> *multi_out){
#pragma HLS PIPELINE II=II_VAL
#pragma HLS INTERFACE s_axilite register port=multi_in1 bundle=AXI4LS
#pragma HLS INTERFACE s_axilite register port=multi_in0 bundle=AXI4LS
#pragma HLS INTERFACE s_axilite register port=multi_out bundle=AXI4LS
#pragma HLS INTERFACE s_axilite port=return bundle=AXI4LS
    *multi_out = multi_in0 * multi_in1;
}


こちらは、#pragma を使用して、Vivado HLS のコードそのものだが、PIPELINE 指示子のとことでワーニングが出てしまっている。
Vivado_HLS _3_171106

このワーニングを気にしなければ、C コードの合成結果は満足できる。
Vivado_HLS _2_171106

Interval が 2 になっていて、PIPELINE指示子が効いているのわかる。
  1. 2017年11月06日 05:09 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0