FC2カウンター FPGAの部屋 Vivado HLSの高位合成結果をHDLとして利用する6(sqrt() その2)

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

FPGAの部屋

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

Vivado HLSの高位合成結果をHDLとして利用する6(sqrt() その2)

Vivado HLSの高位合成結果をHDLとして利用する5(sqrt())”の続き。

前回は平方根処理の Latency が 39 クロックも掛かっていた。これは倍精度小数点演算を行っていたからのようだ。最初に倍精度小数点にunsigned int から変換した後に、倍精度で平方根の演算をしているようだった。
今回は、倍精度小数点演算から単精度浮動小数点演算にしてみようと思う。
なお、Vivado HLS 2014.4 を使用する。

今回、単精度浮動小数点演算になったC++ソースコードを下に示す。

//
// handshake_test.cpp
// 2015/05/17
// by marsee
//

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

void handshake_test(ap_uint<8> cntin, ap_uint<8> *cntout){
#pragma HLS PIPELINE
#pragma HLS INTERFACE ap_hs register port=cntin
#pragma HLS INTERFACE ap_hs register port=cntout
#pragma HLS INTERFACE ap_ctrl_none port=return

    float fsqrt_data;

    fsqrt_data = sqrt((float)cntin);
    *cntout = (ap_int<8>)fsqrt_data;
}


これで高位合成を行った結果を下に示す。
C2HDL_47_150524.png

Latency は 倍精度の39 クロックから 20 クロックになった。

ちなみに単精度浮動小数点演算だと、リソース使用量も少ない。LUTの使用量は倍精度の42%程度だった。
C2HDL_48_150524.png

Analysis 画面を下に示す。uitofp と fsqrt が使われているのが分かる。
C2HDL_49_150524.png

ちなみに、このC++ ソースコードでは、単精度浮動小数点演算にならなかった。

*cntout = (ap_uint<8>)sqrt((float)cntin);

これでは倍精度浮動小数点演算だった。
C2HDL_46_150524.png


単精度浮動小数点の平方根をやってみた。
C++ ソースコードを下に示す。

//
// handshake_test.cpp
// 2015/05/24
// by marsee
//

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

void handshake_test(float cntin, float *cntout){
#pragma HLS PIPELINE
#pragma HLS INTERFACE ap_hs register port=cntin
#pragma HLS INTERFACE ap_hs register port=cntout
#pragma HLS INTERFACE ap_ctrl_none port=return
    *cntout = sqrt(cntin);
}


テストベンチを下に示す。

//
// handshake_test_tb.cpp
// 2015/05/24
// by marsee
//

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

void handshake_test(float cntin, float *cntout);

int main(){
    using namespace std;

    float result;
    float *cntout;

    cntout = &result;
    for(int i=0; i<10; i++){
        handshake_test((float)i, cntout);
        cout << "i = " << i << "  " << "result = " << result << endl;
    }

    return 0;
}


Cシミュレーション結果を下に示す。
C2HDL_50_150524.png

高位合成結果を下に示す。
C2HDL_53_150524.png

Latency は 13 クロックだった。

LUT使用量も unsigned int へのキャスト + 倍精度浮動小数点の平方根演算の 18% だった。
C2HDL_52_150524.png

C/RTLコシミュレーションを行った。
C2HDL_54_150524.png

Vivado 2015.1 を立ちあげて、例によってTCLコマンドとして、以下のコマンドを入力した。

cd C:/Users/Masaaki/Documents/Vivado_HLS/study/handshake_test/solution1/sim/verilog
current_fileset
open_wave_database handshake_test.wdb
open_wave_config handshake_test.wcfg

C/RTL コシミュレーション波形が表示された。
C2HDL_55_150524.png

Latency は 13 クロックだった。
  1. 2015年05月24日 05:29 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3161-ce4d7658
この記事にトラックバックする(FC2ブログユーザー)