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

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

FPGAの部屋

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

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

Vivado HLSの高位合成結果をHDLとして利用する4(register その2、ap_hs)”の続き。

今まで、Vivado HLS 2014.4 の高位合成結果をHDLとして利用する方法を見てきた。やっていることは入力データを +1 して出力データとして出力する単純な計算だったので、一度、sqrt() をやってみることにした。

下に新しい handshake_test.cpp を示す。

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

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

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
    *cntout = sqrt(cntin);
}


新しい handshake_test_tb.cpp を示す。

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

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

void handshake_test(ap_uint<8> cntin, ap_uint<8> *cntout);

int main(){
    using namespace std;

    ap_uint<8> result;
    ap_uint<8> *cntout;

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

    return 0;
}


Run C Simulation ボタンをクリックして、Cシミュレーションを行った。
C2HDL_38_150522.png

きちんと値が出ている。

C Synthesis ボタンをクリックして、高位合成を行った。
C2HDL_40_150522.png

Target の 10 ns に対して、Estimated は 8.62 ns で、Latency は 39 クロックで、Interval は 1 クロックとなった。Latency が大幅に増えている。

使用リソースを見た。
C2HDL_43_150522.png

FFが 2429 で、LUT が 3376 だった。+1 の演算と比べて二桁以上多い。

Analysis 画面を見た。
C2HDL_41_150522.png

C2HDL_42_150522.png

dsqrt はIPを使用している。
(2015/02/24 :追記) dsqrt はユーザーズガイドによると倍精度浮動小数点の平方根だそうです。倍精度になっていたので、クロック数が掛かるようです。
uitodp は、unsigned int から 倍精度浮動小数点型へのキャスト用だと思われます。

高位合成結果の handshake_test.v を見た。前回と同じポートだった。
C2HDL_44_150522.png

Run C/RTL Cosimulation ボタンをクリックして、C/RTL コシミュレーションを行った。
C2HDL_39_150522.png

Vivado 2015.1 を立ちあげて、例によってTCLコマンドを入力して、C/RTL コシミュレーション波形を表示させた。
C2HDL_45_150522.png

データを入力してから sqrt() 演算の結果が出るまでに 390 ns かかっている。クロック周期は10 ns なので、つまり、レイテンシとして 39 クロックということになる。

レイテンシは大きいし、コアも大きいが手軽に sqrt() を書けて、高位合成できるのは良いと思う。
但し、このくらいだったらROMテーブルで sqrt() の値を持っていたほうが良いと思うけれど。。。
  1. 2015年05月23日 05:24 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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