FC2カウンター FPGAの部屋 Vivado HLS 2017.4 で片方が定数の場合の乗算の検討2(C コードの合成1)
FC2ブログ

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

FPGAの部屋

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

Vivado HLS 2017.4 で片方が定数の場合の乗算の検討2(C コードの合成1)

”Vivado HLS 2017.4 で片方が定数の場合の乗算の検討1(C シミュレーション)”の続き。

前回は、Vivado HLS 2017.4 で片方が定数の場合の乗算を乗算記号を使用した演算と 2 の n 乗の数に分解し、それを足し合わせることで乗算する演算との比較を C シミュレーションで行った。今回は、C コードの合成を行って、2 つの演算の比較を行う。

まずは、multi_test.h を元に戻す。つまり、任意精度固定小数点データ型の ap_fixed の量子化モードは 0 への切り捨て(AP_TRN_ZERO)で、オーバーフローモードは飽和(AP_SAT)にするということだ。
multi_test_9_180128.png

次に、multi_test.cpp を out1 の通常の乗算記号を使った out1 の演算だけにする。out2 は out1 の出力をコピーする。
multi_test_10_180128.png

これで C コードの合成を行った。なお、使用したFPGAは、PYNQ やZYBO Z7-20 を想定した xc7z020clg400-1 だ。
結果を示す。
multi_test_11_180128.png

Estmated は 8.30 ns だった。
Latency が 1 クロックなので 2 クロックで 1 出力だが、PIPELINE指示子があるので、Interval は 1 クロックになっている。FF は 12 個、LUT は 227 個使用している。飽和演算をしているので、組み合わせ回路では回路的にダメの様で 2 クロックに分けているのではないだろうか?

Analysis 画面を示す。
multi_test_12_180128.png

出力された Verilog HDL コードを見てみよう。
multi_test_13_180128.png

演算は、in1 を 3 ビット左シフトする。下2ビットは小数点部なので、3 ビットシフトするということは 2 を乗算するのに等しい。そこから in1 そのものを引いている。つまり、in1 の 1/4 (0.25 )を引いている。 2 - 0.25 = 1.75 倍ということになる。思ったより賢い。乗算をシフト+引き算で実現している。

それでは、量子化モードが負の無限大への切り捨て(AP_TRN)で、オーバーフローモードが折り返し(AP_WRAP)に変更する。
multi_test.h の下の 2 行のコメントを外して、上の 2 行をコメントアウトする。
multi_test_5_180127.png

これで C コードの合成を行った。結果を示す。
multi_test_14_180128.png

今回は、Latency が 0 クロックなので、組み合わせ回路となっている。Estmated は 1.92 ns なので、500 MHz でも動作可能な数値だ。
組み合わせ回路なので、FF は 0 個、LUT はわずか 15 個となっている。ap_fixed の量子化モードは 0 への切り捨て(AP_TRN_ZERO)で、オーバーフローモードは飽和(AP_SAT)のモードの時と比べて、LUT は 15 / 227 ≒ 0.066 倍となり、7 % 弱となっている。
つまり、演算器のビット幅は増えても、量子化モードやオーバーフローモードの回路負担が大きいので、飽和演算をしたほうが回路規模は大きいようだ。この結果からではまだ何とも言えないだろうが、途中の計算では、無理にビット幅を落として飽和演算をするよりも、演算器のビット幅を増やして、桁あふれの無い演算をしたほうがリソース使用量は少ないという結論になった。

Analysis 画面を見てみよう。
multi_test_15_180128.png

組み合わせ回路なので、C0 ステートのみとなっているようだ。演算も1つだけでとってもシンプルだ。

出力された Verilog HDL コードを見てみよう。
multi_test_16_180128.png

ポート宣言を見ても組み合わせ回路なので、クロックとリセットが無い。
演算は、in1 を 3 ビット左シフトし、そこから in1 自体を引いているだけだ。
multi_test.v を貼っておく。

// ==============================================================
// RTL generated by Vivado(TM) HLS - High-Level Synthesis from C, C++ and SystemC
// Version: 2017.4
// Copyright (C) 1986-2017 Xilinx, Inc. All Rights Reserved.
// 
// ===========================================================

`timescale 1 ns / 1 ps 

(* CORE_GENERATION_INFO="multi_test,hls_ip_2017_4,{HLS_INPUT_TYPE=cxx,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=1,HLS_INPUT_PART=xc7z020clg400-1,HLS_INPUT_CLOCK=10.000000,HLS_INPUT_ARCH=pipeline,HLS_SYN_CLOCK=1.915000,HLS_SYN_LAT=0,HLS_SYN_TPT=1,HLS_SYN_MEM=0,HLS_SYN_DSP=0,HLS_SYN_FF=0,HLS_SYN_LUT=15}" *)

module multi_test (
        ap_start,
        ap_done,
        ap_idle,
        ap_ready,
        in1_V,
        out1_V,
        out1_V_ap_vld,
        out2_V,
        out2_V_ap_vld,
        ap_return
);


input   ap_start;
output   ap_done;
output   ap_idle;
output   ap_ready;
input  [5:0] in1_V;
output  [5:0] out1_V;
output   out1_V_ap_vld;
output  [5:0] out2_V;
output   out2_V_ap_vld;
output  [31:0] ap_return;

reg out1_V_ap_vld;
reg out2_V_ap_vld;

wire   [4:0] tmp_fu_58_p1;
wire   [7:0] p_shl_fu_62_p3;
wire  signed [7:0] OP1_V_cast_fu_54_p1;
wire   [7:0] p_Val2_s_fu_70_p2;

always @ (*) begin
    if ((ap_start == 1'b1)) begin
        out1_V_ap_vld = 1'b1;
    end else begin
        out1_V_ap_vld = 1'b0;
    end
end

always @ (*) begin
    if ((ap_start == 1'b1)) begin
        out2_V_ap_vld = 1'b1;
    end else begin
        out2_V_ap_vld = 1'b0;
    end
end

assign OP1_V_cast_fu_54_p1 = $signed(in1_V);

assign ap_done = ap_start;

assign ap_idle = 1'b1;

assign ap_ready = ap_start;

assign ap_return = 32'd0;

assign out1_V = {{p_Val2_s_fu_70_p2[7:2]}};

assign out2_V = {{p_Val2_s_fu_70_p2[7:2]}};

assign p_Val2_s_fu_70_p2 = ($signed(p_shl_fu_62_p3) - $signed(OP1_V_cast_fu_54_p1));

assign p_shl_fu_62_p3 = {{tmp_fu_58_p1}, {3'd0}};

assign tmp_fu_58_p1 = in1_V[4:0];

endmodule //multi_test

  1. 2018年01月28日 08:26 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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