FC2カウンター FPGAの部屋 Vivado HLS 2014.4 の高位合成テスト15(ラプラシアンフィルタ10、Clock Period = 4 ns の場合のシミュレーション)
FC2ブログ

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

FPGAの部屋

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

Vivado HLS 2014.4 の高位合成テスト15(ラプラシアンフィルタ10、Clock Period = 4 ns の場合のシミュレーション)

”Vivado HLS 2014.4 の高位合成テスト14(ラプラシアンフィルタ9、Clock Period の変更2)”の続き。

今回は、Clock Period = 4 ns の場合、つまり、Latency = 7 クロックの時に出力された Verilog HDLファイルをシミュレーションしてみようと思う。

・”Vivado HLS 2014.4 の高位合成テスト7(ラプラシアンフィルタ2、シミュレーション)”で作製したZYBO 用のプロジェクトの laplacian_filter.v を Clock Period = 4 ns の場合の laplacian_filter.v と入れ替えた。

・テストベンチの laplacian_filter_tb.v のクロック周期を 10 ns から 4 ns に変更した。

    // clk_gen のインスタンス(ap_clk)
    clk_gen #(
        .CLK_PERIOD(40),    // 4nsec, 250MHz
        .CLK_DUTY_CYCLE(0.5),
        .CLK_OFFSET(0),
        .START_STATE(1'b0)
    ) ACLKi (
        .clk_out(ap_clk)
    );


・Vivado Simulator で論理シミュレーションを行った。(laplacian_filter_tb.v の LAP_FILTER_END_COUNT = 0 とした)
下にシミュレーション波形を示す。(Vivado HLS のディレクティブは、PIPELINEを入れてある)
Vivado_HLS_Study_76_150121.png

ap_start が 1 にアサートされてから、ap_done が 1 にアサートされるまでに約 28 ns 掛かっている。今のクロック周期は 4 ns なので、28/4 = 7 クロックとなる。
ap_done がアサートされた最初のクロックでは、ap_return に 255が出力され、次のクロックでは、13が出力されている。この値は合っているので、正常にパイプライン動作をしているのが分かる。

現在の laplacian_filter.v を貼っておく。以前のLatency の小さい laplacian_filter.v に比べて行数が増えた。

// ==============================================================
// RTL generated by Vivado(TM) HLS - High-Level Synthesis from C, C++ and SystemC
// Version: 2014.4
// Copyright (C) 2014 Xilinx Inc. All rights reserved.
// 
// ===========================================================

`timescale 1 ns / 1 ps 

(* CORE_GENERATION_INFO="laplacian_filter,hls_ip_2014_4,{HLS_INPUT_TYPE=cxx,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=0,HLS_INPUT_PART=xc7z010clg400-1,HLS_INPUT_CLOCK=4.000000,HLS_INPUT_ARCH=pipeline,HLS_SYN_CLOCK=3.940000,HLS_SYN_LAT=7,HLS_SYN_TPT=1,HLS_SYN_MEM=0,HLS_SYN_DSP=0,HLS_SYN_FF=485,HLS_SYN_LUT=393}" *)

module laplacian_filter (
        ap_clk,
        ap_rst,
        ap_start,
        ap_done,
        ap_idle,
        ap_ready,
        x0y0,
        x1y0,
        x2y0,
        x0y1,
        x1y1,
        x2y1,
        x0y2,
        x1y2,
        x2y2,
        ap_return
);

parameter    ap_const_logic_1 = 1'b1;
parameter    ap_const_logic_0 = 1'b0;
parameter    ap_ST_pp0_stg0_fsm_0 = 1'b1;
parameter    ap_const_lv32_0 = 32'b00000000000000000000000000000000;
parameter    ap_const_lv1_1 = 1'b1;
parameter    ap_const_lv32_3 = 32'b11;
parameter    ap_const_lv32_1F = 32'b11111;
parameter    ap_const_lv32_8 = 32'b1000;
parameter    ap_const_lv24_0 = 24'b000000000000000000000000;
parameter    ap_const_lv7_0 = 7'b0000000;
parameter    ap_const_lv10_FF = 10'b11111111;
parameter    ap_true = 1'b1;

input   ap_clk;
input   ap_rst;
input   ap_start;
output   ap_done;
output   ap_idle;
output   ap_ready;
input  [31:0] x0y0;
input  [31:0] x1y0;
input  [31:0] x2y0;
input  [31:0] x0y1;
input  [31:0] x1y1;
input  [31:0] x2y1;
input  [31:0] x0y2;
input  [31:0] x1y2;
input  [31:0] x2y2;
output  [31:0] ap_return;

reg ap_done;
reg ap_idle;
reg ap_ready;
(* fsm_encoding = "none" *) reg   [0:0] ap_CS_fsm = 1'b1;
reg    ap_sig_cseq_ST_pp0_stg0_fsm_0;
reg    ap_sig_bdd_17;
wire    ap_reg_ppiten_pp0_it0;
reg    ap_reg_ppiten_pp0_it1 = 1'b0;
reg    ap_reg_ppiten_pp0_it2 = 1'b0;
reg    ap_reg_ppiten_pp0_it3 = 1'b0;
reg    ap_reg_ppiten_pp0_it4 = 1'b0;
reg    ap_reg_ppiten_pp0_it5 = 1'b0;
reg    ap_reg_ppiten_pp0_it6 = 1'b0;
reg    ap_reg_ppiten_pp0_it7 = 1'b0;
reg   [31:0] x2y2_read_reg_214;
reg   [31:0] ap_reg_ppstg_x2y2_read_reg_214_pp0_it1;
reg   [31:0] ap_reg_ppstg_x2y2_read_reg_214_pp0_it2;
reg   [31:0] ap_reg_ppstg_x2y2_read_reg_214_pp0_it3;
reg   [31:0] ap_reg_ppstg_x2y2_read_reg_214_pp0_it4;
reg   [31:0] x1y2_read_reg_219;
reg   [31:0] ap_reg_ppstg_x1y2_read_reg_219_pp0_it1;
reg   [31:0] ap_reg_ppstg_x1y2_read_reg_219_pp0_it2;
reg   [31:0] ap_reg_ppstg_x1y2_read_reg_219_pp0_it3;
reg   [31:0] x0y2_read_reg_224;
reg   [31:0] ap_reg_ppstg_x0y2_read_reg_224_pp0_it1;
reg   [31:0] ap_reg_ppstg_x0y2_read_reg_224_pp0_it2;
reg   [31:0] x2y1_read_reg_229;
reg   [31:0] ap_reg_ppstg_x2y1_read_reg_229_pp0_it1;
reg   [31:0] x1y1_read_reg_234;
wire   [31:0] tmp1_fu_107_p2;
reg   [31:0] tmp1_reg_239;
wire   [31:0] tmp2_fu_113_p2;
reg   [31:0] tmp2_reg_244;
wire   [31:0] sum3_neg_fu_128_p2;
reg   [31:0] sum3_neg_reg_249;
wire   [31:0] tmp_1_fu_134_p2;
reg   [31:0] tmp_1_reg_254;
wire   [31:0] tmp_2_fu_138_p2;
reg   [31:0] tmp_2_reg_259;
wire   [31:0] tmp_3_fu_142_p2;
reg   [31:0] tmp_3_reg_264;
wire   [31:0] y_fu_146_p2;
reg   [31:0] y_reg_269;
reg   [31:0] ap_reg_ppstg_y_reg_269_pp0_it6;
reg   [0:0] tmp_4_reg_274;
reg   [0:0] ap_reg_ppstg_tmp_4_reg_274_pp0_it6;
reg   [23:0] tmp_5_reg_279;
reg   [0:0] tmp_6_reg_284;
reg   [0:0] ap_reg_ppstg_tmp_6_reg_284_pp0_it6;
wire   [0:0] icmp_fu_176_p2;
reg   [0:0] icmp_reg_290;
wire   [31:0] tmp_fu_119_p2;
wire   [31:0] sum2_fu_124_p2;
wire   [8:0] tmp_s_fu_181_p4;
wire  signed [9:0] tmp_7_cast_fu_189_p1;
wire  signed [9:0] tmp_8_fu_193_p2;
wire   [0:0] tmp_9_fu_203_p2;
wire  signed [31:0] tmp_8_cast_fu_199_p1;
reg   [0:0] ap_NS_fsm;
reg    ap_sig_pprstidle_pp0;




/// the current state (ap_CS_fsm) of the state machine. ///
always @ (posedge ap_clk)
begin : ap_ret_ap_CS_fsm
    if (ap_rst == 1'b1) begin
        ap_CS_fsm <= ap_ST_pp0_stg0_fsm_0;
    end else begin
        ap_CS_fsm <= ap_NS_fsm;
    end
end

/// ap_reg_ppiten_pp0_it1 assign process. ///
always @ (posedge ap_clk)
begin : ap_ret_ap_reg_ppiten_pp0_it1
    if (ap_rst == 1'b1) begin
        ap_reg_ppiten_pp0_it1 <= ap_const_logic_0;
    end else begin
        if (((ap_const_logic_1 == ap_sig_cseq_ST_pp0_stg0_fsm_0) & ~((ap_const_logic_1 == ap_reg_ppiten_pp0_it0) & (ap_start == ap_const_logic_0)))) begin
            ap_reg_ppiten_pp0_it1 <= ap_reg_ppiten_pp0_it0;
        end
    end
end

/// ap_reg_ppiten_pp0_it2 assign process. ///
always @ (posedge ap_clk)
begin : ap_ret_ap_reg_ppiten_pp0_it2
    if (ap_rst == 1'b1) begin
        ap_reg_ppiten_pp0_it2 <= ap_const_logic_0;
    end else begin
        if (~((ap_const_logic_1 == ap_reg_ppiten_pp0_it0) & (ap_start == ap_const_logic_0))) begin
            ap_reg_ppiten_pp0_it2 <= ap_reg_ppiten_pp0_it1;
        end
    end
end

/// ap_reg_ppiten_pp0_it3 assign process. ///
always @ (posedge ap_clk)
begin : ap_ret_ap_reg_ppiten_pp0_it3
    if (ap_rst == 1'b1) begin
        ap_reg_ppiten_pp0_it3 <= ap_const_logic_0;
    end else begin
        if (~((ap_const_logic_1 == ap_reg_ppiten_pp0_it0) & (ap_start == ap_const_logic_0))) begin
            ap_reg_ppiten_pp0_it3 <= ap_reg_ppiten_pp0_it2;
        end
    end
end

/// ap_reg_ppiten_pp0_it4 assign process. ///
always @ (posedge ap_clk)
begin : ap_ret_ap_reg_ppiten_pp0_it4
    if (ap_rst == 1'b1) begin
        ap_reg_ppiten_pp0_it4 <= ap_const_logic_0;
    end else begin
        if (~((ap_const_logic_1 == ap_reg_ppiten_pp0_it0) & (ap_start == ap_const_logic_0))) begin
            ap_reg_ppiten_pp0_it4 <= ap_reg_ppiten_pp0_it3;
        end
    end
end

/// ap_reg_ppiten_pp0_it5 assign process. ///
always @ (posedge ap_clk)
begin : ap_ret_ap_reg_ppiten_pp0_it5
    if (ap_rst == 1'b1) begin
        ap_reg_ppiten_pp0_it5 <= ap_const_logic_0;
    end else begin
        if (~((ap_const_logic_1 == ap_reg_ppiten_pp0_it0) & (ap_start == ap_const_logic_0))) begin
            ap_reg_ppiten_pp0_it5 <= ap_reg_ppiten_pp0_it4;
        end
    end
end

/// ap_reg_ppiten_pp0_it6 assign process. ///
always @ (posedge ap_clk)
begin : ap_ret_ap_reg_ppiten_pp0_it6
    if (ap_rst == 1'b1) begin
        ap_reg_ppiten_pp0_it6 <= ap_const_logic_0;
    end else begin
        if (~((ap_const_logic_1 == ap_reg_ppiten_pp0_it0) & (ap_start == ap_const_logic_0))) begin
            ap_reg_ppiten_pp0_it6 <= ap_reg_ppiten_pp0_it5;
        end
    end
end

/// ap_reg_ppiten_pp0_it7 assign process. ///
always @ (posedge ap_clk)
begin : ap_ret_ap_reg_ppiten_pp0_it7
    if (ap_rst == 1'b1) begin
        ap_reg_ppiten_pp0_it7 <= ap_const_logic_0;
    end else begin
        if (~((ap_const_logic_1 == ap_reg_ppiten_pp0_it0) & (ap_start == ap_const_logic_0))) begin
            ap_reg_ppiten_pp0_it7 <= ap_reg_ppiten_pp0_it6;
        end
    end
end

/// assign process. ///
always @(posedge ap_clk)
begin
    if (~((ap_const_logic_1 == ap_reg_ppiten_pp0_it0) & (ap_start == ap_const_logic_0))) begin
        ap_reg_ppstg_tmp_4_reg_274_pp0_it6 <= tmp_4_reg_274;
        ap_reg_ppstg_tmp_6_reg_284_pp0_it6 <= tmp_6_reg_284;
        ap_reg_ppstg_x0y2_read_reg_224_pp0_it2 <= ap_reg_ppstg_x0y2_read_reg_224_pp0_it1;
        ap_reg_ppstg_x1y2_read_reg_219_pp0_it2 <= ap_reg_ppstg_x1y2_read_reg_219_pp0_it1;
        ap_reg_ppstg_x1y2_read_reg_219_pp0_it3 <= ap_reg_ppstg_x1y2_read_reg_219_pp0_it2;
        ap_reg_ppstg_x2y2_read_reg_214_pp0_it2 <= ap_reg_ppstg_x2y2_read_reg_214_pp0_it1;
        ap_reg_ppstg_x2y2_read_reg_214_pp0_it3 <= ap_reg_ppstg_x2y2_read_reg_214_pp0_it2;
        ap_reg_ppstg_x2y2_read_reg_214_pp0_it4 <= ap_reg_ppstg_x2y2_read_reg_214_pp0_it3;
        ap_reg_ppstg_y_reg_269_pp0_it6 <= y_reg_269;
        icmp_reg_290 <= icmp_fu_176_p2;
        tmp_1_reg_254 <= tmp_1_fu_134_p2;
        tmp_2_reg_259 <= tmp_2_fu_138_p2;
        tmp_3_reg_264 <= tmp_3_fu_142_p2;
        tmp_4_reg_274 <= y_fu_146_p2[ap_const_lv32_1F];
        tmp_5_reg_279 <= {{y_fu_146_p2[ap_const_lv32_1F : ap_const_lv32_8]}};
        tmp_6_reg_284 <= y_fu_146_p2[ap_const_lv32_1F];
        y_reg_269 <= y_fu_146_p2;
    end
end

/// assign process. ///
always @(posedge ap_clk)
begin
    if (((ap_const_logic_1 == ap_sig_cseq_ST_pp0_stg0_fsm_0) & ~((ap_const_logic_1 == ap_reg_ppiten_pp0_it0) & (ap_start == ap_const_logic_0)))) begin
        ap_reg_ppstg_x0y2_read_reg_224_pp0_it1 <= x0y2_read_reg_224;
        ap_reg_ppstg_x1y2_read_reg_219_pp0_it1 <= x1y2_read_reg_219;
        ap_reg_ppstg_x2y1_read_reg_229_pp0_it1 <= x2y1_read_reg_229;
        ap_reg_ppstg_x2y2_read_reg_214_pp0_it1 <= x2y2_read_reg_214;
        sum3_neg_reg_249 <= sum3_neg_fu_128_p2;
        tmp1_reg_239 <= tmp1_fu_107_p2;
        tmp2_reg_244 <= tmp2_fu_113_p2;
        x0y2_read_reg_224 <= x0y2;
        x1y1_read_reg_234 <= x1y1;
        x1y2_read_reg_219 <= x1y2;
        x2y1_read_reg_229 <= x2y1;
        x2y2_read_reg_214 <= x2y2;
    end
end

/// ap_done assign process. ///
always @ (ap_start or ap_reg_ppiten_pp0_it0 or ap_reg_ppiten_pp0_it7)
begin
    if (((ap_const_logic_1 == ap_reg_ppiten_pp0_it7) & ~((ap_const_logic_1 == ap_reg_ppiten_pp0_it0) & (ap_start == ap_const_logic_0)))) begin
        ap_done = ap_const_logic_1;
    end else begin
        ap_done = ap_const_logic_0;
    end
end

/// ap_idle assign process. ///
always @ (ap_start or ap_sig_cseq_ST_pp0_stg0_fsm_0 or ap_reg_ppiten_pp0_it0 or ap_reg_ppiten_pp0_it1 or ap_reg_ppiten_pp0_it2 or ap_reg_ppiten_pp0_it3 or ap_reg_ppiten_pp0_it4 or ap_reg_ppiten_pp0_it5 or ap_reg_ppiten_pp0_it6 or ap_reg_ppiten_pp0_it7)
begin
    if ((~(ap_const_logic_1 == ap_start) & (ap_const_logic_1 == ap_sig_cseq_ST_pp0_stg0_fsm_0) & (ap_const_logic_0 == ap_reg_ppiten_pp0_it0) & (ap_const_logic_0 == ap_reg_ppiten_pp0_it1) & (ap_const_logic_0 == ap_reg_ppiten_pp0_it2) & (ap_const_logic_0 == ap_reg_ppiten_pp0_it3) & (ap_const_logic_0 == ap_reg_ppiten_pp0_it4) & (ap_const_logic_0 == ap_reg_ppiten_pp0_it5) & (ap_const_logic_0 == ap_reg_ppiten_pp0_it6) & (ap_const_logic_0 == ap_reg_ppiten_pp0_it7))) begin
        ap_idle = ap_const_logic_1;
    end else begin
        ap_idle = ap_const_logic_0;
    end
end

/// ap_ready assign process. ///
always @ (ap_start or ap_sig_cseq_ST_pp0_stg0_fsm_0 or ap_reg_ppiten_pp0_it0)
begin
    if (((ap_const_logic_1 == ap_sig_cseq_ST_pp0_stg0_fsm_0) & (ap_const_logic_1 == ap_reg_ppiten_pp0_it0) & ~((ap_const_logic_1 == ap_reg_ppiten_pp0_it0) & (ap_start == ap_const_logic_0)))) begin
        ap_ready = ap_const_logic_1;
    end else begin
        ap_ready = ap_const_logic_0;
    end
end

/// ap_sig_cseq_ST_pp0_stg0_fsm_0 assign process. ///
always @ (ap_sig_bdd_17)
begin
    if (ap_sig_bdd_17) begin
        ap_sig_cseq_ST_pp0_stg0_fsm_0 = ap_const_logic_1;
    end else begin
        ap_sig_cseq_ST_pp0_stg0_fsm_0 = ap_const_logic_0;
    end
end

/// ap_sig_pprstidle_pp0 assign process. ///
always @ (ap_start or ap_reg_ppiten_pp0_it0 or ap_reg_ppiten_pp0_it1 or ap_reg_ppiten_pp0_it2 or ap_reg_ppiten_pp0_it3 or ap_reg_ppiten_pp0_it4 or ap_reg_ppiten_pp0_it5 or ap_reg_ppiten_pp0_it6)
begin
    if (((ap_const_logic_0 == ap_reg_ppiten_pp0_it0) & (ap_const_logic_0 == ap_reg_ppiten_pp0_it1) & (ap_const_logic_0 == ap_reg_ppiten_pp0_it2) & (ap_const_logic_0 == ap_reg_ppiten_pp0_it3) & (ap_const_logic_0 == ap_reg_ppiten_pp0_it4) & (ap_const_logic_0 == ap_reg_ppiten_pp0_it5) & (ap_const_logic_0 == ap_reg_ppiten_pp0_it6) & (ap_const_logic_0 == ap_start))) begin
        ap_sig_pprstidle_pp0 = ap_const_logic_1;
    end else begin
        ap_sig_pprstidle_pp0 = ap_const_logic_0;
    end
end
/// the next state (ap_NS_fsm) of the state machine. ///
always @ (ap_start or ap_CS_fsm or ap_reg_ppiten_pp0_it0 or ap_sig_pprstidle_pp0)
begin
    case (ap_CS_fsm)
        ap_ST_pp0_stg0_fsm_0 : 
        begin
            ap_NS_fsm = ap_ST_pp0_stg0_fsm_0;
        end
        default : 
        begin
            ap_NS_fsm = 'bx;
        end
    endcase
end

assign ap_reg_ppiten_pp0_it0 = ap_start;
assign ap_return = ((tmp_9_fu_203_p2)? tmp_8_cast_fu_199_p1: ap_reg_ppstg_y_reg_269_pp0_it6);

/// ap_sig_bdd_17 assign process. ///
always @ (ap_CS_fsm)
begin
    ap_sig_bdd_17 = (ap_CS_fsm[ap_const_lv32_0] == ap_const_lv1_1);
end
assign icmp_fu_176_p2 = ($signed(tmp_5_reg_279) > $signed(24'b000000000000000000000000)? 1'b1: 1'b0);
assign sum2_fu_124_p2 = (tmp2_reg_244 + tmp1_reg_239);
assign sum3_neg_fu_128_p2 = (tmp_fu_119_p2 - sum2_fu_124_p2);
assign tmp1_fu_107_p2 = (x1y0 + x0y0);
assign tmp2_fu_113_p2 = (x2y0 + x0y1);
assign tmp_1_fu_134_p2 = (sum3_neg_reg_249 - ap_reg_ppstg_x2y1_read_reg_229_pp0_it1);
assign tmp_2_fu_138_p2 = (tmp_1_reg_254 - ap_reg_ppstg_x0y2_read_reg_224_pp0_it2);
assign tmp_3_fu_142_p2 = (tmp_2_reg_259 - ap_reg_ppstg_x1y2_read_reg_219_pp0_it3);
assign tmp_7_cast_fu_189_p1 = $signed(tmp_s_fu_181_p4);
assign tmp_8_cast_fu_199_p1 = tmp_8_fu_193_p2;
assign tmp_8_fu_193_p2 = ($signed(tmp_7_cast_fu_189_p1) + $signed(ap_const_lv10_FF));
assign tmp_9_fu_203_p2 = (ap_reg_ppstg_tmp_4_reg_274_pp0_it6 | icmp_reg_290);
assign tmp_fu_119_p2 = x1y1_read_reg_234 << ap_const_lv32_3;
assign tmp_s_fu_181_p4 = {{{{ap_reg_ppstg_tmp_6_reg_284_pp0_it6}, {ap_const_lv7_0}}}, {ap_reg_ppstg_tmp_6_reg_284_pp0_it6}};
assign y_fu_146_p2 = (tmp_3_reg_264 - ap_reg_ppstg_x2y2_read_reg_214_pp0_it4);


endmodule //laplacian_filter

  1. 2015年01月21日 04:57 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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