FC2カウンター FPGAの部屋 square_root_apfixed で Vitis HLS 2021.2 の合成時の動作を確認した
fc2ブログ

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

FPGAの部屋

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

square_root_apfixed で Vitis HLS 2021.2 の合成時の動作を確認した

square_root_apfixed プロジェクトを Vitis HLS 2021.2 で作成し、C コードの合成を行った時に、Vitis HLS 2021.2 の動作が確認できたので、書いておく。

square_root_apfixed プロジェクトは以前作成した整数版の square_root の任意精度固定小数点データ型版になる。(”square root を Vivado HLS で実装する1”参照)

square_root_apfixed.h を示す。

// square_root_apfixed.h
// 2022/02/07 by marsee
//

#ifndef __SQUARE_ROOT_APFIXED__
#define __SQUARE_ROOT_APFIXED__

#include <stdint.h>
#include <ap_int.h>
#include <ap_fixed.h>
#include <math.h>

#define INT_BIT 8
#define BIT_LEN 16

int square_root_apfixed(ap_ufixed<BIT_LEN, INT_BIT, AP_TRN_ZERO, AP_WRAP> in_val,
  ap_ufixed<BIT_LEN, INT_BIT, AP_TRN_ZERO, AP_WRAP> &sqroot);
#endif


square_root_apfixed.cpp を示す。

// square_root_apfixed.cpp
// 2022/02/07 by marsee
//

#include "square_root_apfixed.h"

static constexpr int DB_BIT_LEN = BIT_LEN*2;
static constexpr int DB_INT_BIT = INT_BIT*2;

int square_root_apfixed(ap_ufixed<BIT_LEN, INT_BIT, AP_TRN_ZERO, AP_WRAP> in_val,
    ap_ufixed<BIT_LEN, INT_BIT, AP_TRN_ZERO, AP_WRAP> &sqroot){
#pragma HLS INTERFACE mode=s_axilite port=return
#pragma HLS INTERFACE mode=s_axilite port=sqroot
#pragma HLS INTERFACE mode=s_axilite port=in_val
    ap_ufixed<DB_BIT_LEN, DB_INT_BIT, AP_TRN_ZERO, AP_WRAP> temp = 0.0;
    ap_ufixed<DB_BIT_LEN, DB_INT_BIT, AP_TRN_ZERO, AP_WRAP> square;
    ap_ufixed<DB_BIT_LEN, DB_INT_BIT, AP_TRN_ZERO, AP_WRAP> val = pow(2.0, INT_BIT-1);

    for(int i=(BIT_LEN-1); i>=0; --i){
//#pragma HLS PIPELINE II=1
        temp += val;
        square = temp * temp;

        if(square > in_val){
            temp -= val;
        }

        val /= 2;
    }
    sqroot = (ap_ufixed<BIT_LEN, INT_BIT, AP_TRN, AP_WRAP>)temp;

    return(0);
}


square_root_apfixed_tb.cpp を示す。

// square_root_apfixed_tb.cpp
// 2022/02/07 by marsee
//

#include "square_root_apfixed.h"

int main(){
    ap_ufixed<BIT_LEN, INT_BIT, AP_TRN_ZERO, AP_WRAP> result;

    for(uint32_t i=0; i<256; i++){
        square_root_apfixed((ap_ufixed<BIT_LEN, INT_BIT, AP_TRN_ZERO, AP_WRAP>)i, result);
        printf("i = %d, result = %f\n", i, (float)result);
    }

    return(0);
}


Vitis HLS 2021.2 の square_root_apfixed プロジェクトを示す。なお、ZYBO Z7-20 用だ。
sqaure_root_apfixed_1_220212.png

C シミュレーションを行った。
sqaure_root_apfixed_2_220212.png

C コードの合成を行った。
sqaure_root_apfixed_3_220212.png

レイテンシは 50 クロックだった。
VITIS_LOOP_19_1 の Inteval は 3 クロックだった。Vitis HLS ではループの中はパイプラインされているが、II = 1 にはならないようだ。Estimated の制約が守られる範囲で一番小さい Interval になるようだ。

次に、 square_root_apfixed.cpp の for ループの HLS `PIPELINE II=1 プラグマを生かした。
明示的に II = 1 のパイプライン・ディレクティブを追加したらどうだろうか?
sqaure_root_apfixed_4_220212.png

再度、C コードの合成を行った。
sqaure_root_apfixed_5_220212.png

VITIS_LOOP_19_1 の Inteval は 1 クロックになったが、Estimated は 11.671 ns となって、ターゲットの 10 ns を超えてしまっている。

Vitis HLS 2021.2 では、ループ上にパイプライン指示子が無ければ、ターゲットの動作周波数を確保するようにパイプラインの開始間隔を大きくする。ループ上にパイプライン指示子があれば、その指定に従う。ただし、Target に Estimated の値が届かないことがある。

C シミュレーションの結果を示す。

i = 0, result = 0.000000
i = 1, result = 1.000000
i = 2, result = 1.414062
i = 3, result = 1.730469
i = 4, result = 2.000000
i = 5, result = 2.234375
i = 6, result = 2.449219
i = 7, result = 2.644531
i = 8, result = 2.828125
i = 9, result = 3.000000
i = 10, result = 3.160156
i = 11, result = 3.316406
i = 12, result = 3.460938
i = 13, result = 3.605469
i = 14, result = 3.738281
i = 15, result = 3.871094
i = 16, result = 4.000000
i = 17, result = 4.121094
i = 18, result = 4.242188
i = 19, result = 4.355469
i = 20, result = 4.468750
i = 21, result = 4.582031
i = 22, result = 4.687500
i = 23, result = 4.792969
i = 24, result = 4.898438
i = 25, result = 5.000000
i = 26, result = 5.097656
i = 27, result = 5.195312
i = 28, result = 5.289062
i = 29, result = 5.382812
i = 30, result = 5.476562
i = 31, result = 5.566406
i = 32, result = 5.656250
i = 33, result = 5.742188
i = 34, result = 5.828125
i = 35, result = 5.914062
i = 36, result = 6.000000
i = 37, result = 6.082031
i = 38, result = 6.164062
i = 39, result = 6.242188
i = 40, result = 6.324219
i = 41, result = 6.402344
i = 42, result = 6.480469
i = 43, result = 6.554688
i = 44, result = 6.632812
i = 45, result = 6.707031
i = 46, result = 6.781250
i = 47, result = 6.855469
i = 48, result = 6.925781
i = 49, result = 7.000000
i = 50, result = 7.070312
i = 51, result = 7.140625
i = 52, result = 7.210938
i = 53, result = 7.277344
i = 54, result = 7.347656
i = 55, result = 7.414062
i = 56, result = 7.480469
i = 57, result = 7.546875
i = 58, result = 7.613281
i = 59, result = 7.679688
i = 60, result = 7.742188
i = 61, result = 7.808594
i = 62, result = 7.871094
i = 63, result = 7.933594
i = 64, result = 8.000000
i = 65, result = 8.058594
i = 66, result = 8.121094
i = 67, result = 8.183594
i = 68, result = 8.246094
i = 69, result = 8.304688
i = 70, result = 8.363281
i = 71, result = 8.425781
i = 72, result = 8.484375
i = 73, result = 8.542969
i = 74, result = 8.601562
i = 75, result = 8.660156
i = 76, result = 8.714844
i = 77, result = 8.773438
i = 78, result = 8.828125
i = 79, result = 8.886719
i = 80, result = 8.941406
i = 81, result = 9.000000
i = 82, result = 9.054688
i = 83, result = 9.109375
i = 84, result = 9.164062
i = 85, result = 9.218750
i = 86, result = 9.273438
i = 87, result = 9.324219
i = 88, result = 9.378906
i = 89, result = 9.433594
i = 90, result = 9.484375
i = 91, result = 9.539062
i = 92, result = 9.589844
i = 93, result = 9.640625
i = 94, result = 9.695312
i = 95, result = 9.746094
i = 96, result = 9.796875
i = 97, result = 9.847656
i = 98, result = 9.898438
i = 99, result = 9.949219
i = 100, result = 10.000000
i = 101, result = 10.046875
i = 102, result = 10.097656
i = 103, result = 10.148438
i = 104, result = 10.195312
i = 105, result = 10.246094
i = 106, result = 10.292969
i = 107, result = 10.343750
i = 108, result = 10.390625
i = 109, result = 10.437500
i = 110, result = 10.484375
i = 111, result = 10.535156
i = 112, result = 10.582031
i = 113, result = 10.628906
i = 114, result = 10.675781
i = 115, result = 10.722656
i = 116, result = 10.769531
i = 117, result = 10.816406
i = 118, result = 10.859375
i = 119, result = 10.906250
i = 120, result = 10.953125
i = 121, result = 11.000000
i = 122, result = 11.042969
i = 123, result = 11.089844
i = 124, result = 11.132812
i = 125, result = 11.179688
i = 126, result = 11.222656
i = 127, result = 11.265625
i = 128, result = 11.312500
i = 129, result = 11.355469
i = 130, result = 11.398438
i = 131, result = 11.445312
i = 132, result = 11.488281
i = 133, result = 11.531250
i = 134, result = 11.574219
i = 135, result = 11.617188
i = 136, result = 11.660156
i = 137, result = 11.703125
i = 138, result = 11.746094
i = 139, result = 11.789062
i = 140, result = 11.832031
i = 141, result = 11.871094
i = 142, result = 11.914062
i = 143, result = 11.957031
i = 144, result = 12.000000
i = 145, result = 12.039062
i = 146, result = 12.082031
i = 147, result = 12.121094
i = 148, result = 12.164062
i = 149, result = 12.203125
i = 150, result = 12.246094
i = 151, result = 12.285156
i = 152, result = 12.328125
i = 153, result = 12.367188
i = 154, result = 12.406250
i = 155, result = 12.449219
i = 156, result = 12.488281
i = 157, result = 12.527344
i = 158, result = 12.566406
i = 159, result = 12.609375
i = 160, result = 12.648438
i = 161, result = 12.687500
i = 162, result = 12.726562
i = 163, result = 12.765625
i = 164, result = 12.804688
i = 165, result = 12.843750
i = 166, result = 12.882812
i = 167, result = 12.921875
i = 168, result = 12.960938
i = 169, result = 13.000000
i = 170, result = 13.035156
i = 171, result = 13.074219
i = 172, result = 13.113281
i = 173, result = 13.152344
i = 174, result = 13.187500
i = 175, result = 13.226562
i = 176, result = 13.265625
i = 177, result = 13.300781
i = 178, result = 13.339844
i = 179, result = 13.378906
i = 180, result = 13.414062
i = 181, result = 13.453125
i = 182, result = 13.488281
i = 183, result = 13.527344
i = 184, result = 13.562500
i = 185, result = 13.597656
i = 186, result = 13.636719
i = 187, result = 13.671875
i = 188, result = 13.710938
i = 189, result = 13.746094
i = 190, result = 13.781250
i = 191, result = 13.816406
i = 192, result = 13.855469
i = 193, result = 13.890625
i = 194, result = 13.925781
i = 195, result = 13.960938
i = 196, result = 14.000000
i = 197, result = 14.035156
i = 198, result = 14.070312
i = 199, result = 14.105469
i = 200, result = 14.140625
i = 201, result = 14.175781
i = 202, result = 14.210938
i = 203, result = 14.246094
i = 204, result = 14.281250
i = 205, result = 14.316406
i = 206, result = 14.351562
i = 207, result = 14.386719
i = 208, result = 14.421875
i = 209, result = 14.453125
i = 210, result = 14.488281
i = 211, result = 14.523438
i = 212, result = 14.558594
i = 213, result = 14.593750
i = 214, result = 14.625000
i = 215, result = 14.660156
i = 216, result = 14.695312
i = 217, result = 14.730469
i = 218, result = 14.761719
i = 219, result = 14.796875
i = 220, result = 14.832031
i = 221, result = 14.863281
i = 222, result = 14.898438
i = 223, result = 14.929688
i = 224, result = 14.964844
i = 225, result = 15.000000
i = 226, result = 15.031250
i = 227, result = 15.066406
i = 228, result = 15.097656
i = 229, result = 15.128906
i = 230, result = 15.164062
i = 231, result = 15.195312
i = 232, result = 15.230469
i = 233, result = 15.261719
i = 234, result = 15.296875
i = 235, result = 15.328125
i = 236, result = 15.359375
i = 237, result = 15.394531
i = 238, result = 15.425781
i = 239, result = 15.457031
i = 240, result = 15.488281
i = 241, result = 15.523438
i = 242, result = 15.554688
i = 243, result = 15.585938
i = 244, result = 15.617188
i = 245, result = 15.652344
i = 246, result = 15.683594
i = 247, result = 15.714844
i = 248, result = 15.746094
i = 249, result = 15.777344
i = 250, result = 15.808594
i = 251, result = 15.839844
i = 252, result = 15.871094
i = 253, result = 15.902344
i = 254, result = 15.933594
i = 255, result = 15.964844


  1. 2022年02月12日 05:33 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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