FC2カウンター FPGAの部屋 Vivado HLS で 2 つの引数から DMA Read する AXI4 Master モジュールを作る2
FC2ブログ

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

FPGAの部屋

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

Vivado HLS で 2 つの引数から DMA Read する AXI4 Master モジュールを作る2

Vivado HLS で 2 つの引数から DMA Read する AXI4 Master モジュールを作る1”の続き。

前回は、x と y の平方数の和を求める C ソースコードをいろいろとチューニングしていった。しかし、入力の x と y を同じAXI4 インターフェースから取ってくるので、どうしても x と y をRead する DMA がバーストにならないという欠点があった。今回は、AXI4 インターフェースを独立な 3 個にすることで、DMA Read がバーストするようにしてみよう。

さて、AXI4 インターフェースを 3 個にするにはどうするかというと、x , y , result の 3 個の引数に独立な bundle を与えればよい。
今回の sum_of_squares.cpp を示す。

int sum_of_squares(volatile char *x, volatile char *y, volatile int *result){
#pragma HLS INTERFACE m_axi depth=10 port=y offset=slave bundle=y
#pragma HLS INTERFACE m_axi depth=10 port=x offset=slave bundle=x
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS INTERFACE m_axi depth=10 port=result offset=slave bundle=result

    LOOP1: for(int i=0; i<10; i++){
#pragma HLS PIPELINE II=1
        char xt = x[i];
        char yt = y[i];

        result[i] = xt*xt + yt*yt;
    }

    return(0);
}


今回の sum_of_squares.cpp を合成した。結果を示す。
sum_of_squares_14_190821.png

PIPELINE の Initiation Interval が 1 クロックになった。これで完璧だ。
Verilog HDL のトップのファイル sum_of_squares.v の module 定義を引用すると、 x , y , result の 3 個のAXI4 インターフェースが実装されているのが分かる。

module sum_of_squares (
        ap_clk,
        ap_rst_n,
        m_axi_x_AWVALID,
        m_axi_x_AWREADY,
        m_axi_x_AWADDR,
        m_axi_x_AWID,
        m_axi_x_AWLEN,
        m_axi_x_AWSIZE,
        m_axi_x_AWBURST,
        m_axi_x_AWLOCK,
        m_axi_x_AWCACHE,
        m_axi_x_AWPROT,
        m_axi_x_AWQOS,
        m_axi_x_AWREGION,
        m_axi_x_AWUSER,
        m_axi_x_WVALID,
        m_axi_x_WREADY,
        m_axi_x_WDATA,
        m_axi_x_WSTRB,
        m_axi_x_WLAST,
        m_axi_x_WID,
        m_axi_x_WUSER,
        m_axi_x_ARVALID,
        m_axi_x_ARREADY,
        m_axi_x_ARADDR,
        m_axi_x_ARID,
        m_axi_x_ARLEN,
        m_axi_x_ARSIZE,
        m_axi_x_ARBURST,
        m_axi_x_ARLOCK,
        m_axi_x_ARCACHE,
        m_axi_x_ARPROT,
        m_axi_x_ARQOS,
        m_axi_x_ARREGION,
        m_axi_x_ARUSER,
        m_axi_x_RVALID,
        m_axi_x_RREADY,
        m_axi_x_RDATA,
        m_axi_x_RLAST,
        m_axi_x_RID,
        m_axi_x_RUSER,
        m_axi_x_RRESP,
        m_axi_x_BVALID,
        m_axi_x_BREADY,
        m_axi_x_BRESP,
        m_axi_x_BID,
        m_axi_x_BUSER,
        m_axi_y_AWVALID,
        m_axi_y_AWREADY,
        m_axi_y_AWADDR,
        m_axi_y_AWID,
        m_axi_y_AWLEN,
        m_axi_y_AWSIZE,
        m_axi_y_AWBURST,
        m_axi_y_AWLOCK,
        m_axi_y_AWCACHE,
        m_axi_y_AWPROT,
        m_axi_y_AWQOS,
        m_axi_y_AWREGION,
        m_axi_y_AWUSER,
        m_axi_y_WVALID,
        m_axi_y_WREADY,
        m_axi_y_WDATA,
        m_axi_y_WSTRB,
        m_axi_y_WLAST,
        m_axi_y_WID,
        m_axi_y_WUSER,
        m_axi_y_ARVALID,
        m_axi_y_ARREADY,
        m_axi_y_ARADDR,
        m_axi_y_ARID,
        m_axi_y_ARLEN,
        m_axi_y_ARSIZE,
        m_axi_y_ARBURST,
        m_axi_y_ARLOCK,
        m_axi_y_ARCACHE,
        m_axi_y_ARPROT,
        m_axi_y_ARQOS,
        m_axi_y_ARREGION,
        m_axi_y_ARUSER,
        m_axi_y_RVALID,
        m_axi_y_RREADY,
        m_axi_y_RDATA,
        m_axi_y_RLAST,
        m_axi_y_RID,
        m_axi_y_RUSER,
        m_axi_y_RRESP,
        m_axi_y_BVALID,
        m_axi_y_BREADY,
        m_axi_y_BRESP,
        m_axi_y_BID,
        m_axi_y_BUSER,
        m_axi_result_AWVALID,
        m_axi_result_AWREADY,
        m_axi_result_AWADDR,
        m_axi_result_AWID,
        m_axi_result_AWLEN,
        m_axi_result_AWSIZE,
        m_axi_result_AWBURST,
        m_axi_result_AWLOCK,
        m_axi_result_AWCACHE,
        m_axi_result_AWPROT,
        m_axi_result_AWQOS,
        m_axi_result_AWREGION,
        m_axi_result_AWUSER,
        m_axi_result_WVALID,
        m_axi_result_WREADY,
        m_axi_result_WDATA,
        m_axi_result_WSTRB,
        m_axi_result_WLAST,
        m_axi_result_WID,
        m_axi_result_WUSER,
        m_axi_result_ARVALID,
        m_axi_result_ARREADY,
        m_axi_result_ARADDR,
        m_axi_result_ARID,
        m_axi_result_ARLEN,
        m_axi_result_ARSIZE,
        m_axi_result_ARBURST,
        m_axi_result_ARLOCK,
        m_axi_result_ARCACHE,
        m_axi_result_ARPROT,
        m_axi_result_ARQOS,
        m_axi_result_ARREGION,
        m_axi_result_ARUSER,
        m_axi_result_RVALID,
        m_axi_result_RREADY,
        m_axi_result_RDATA,
        m_axi_result_RLAST,
        m_axi_result_RID,
        m_axi_result_RUSER,
        m_axi_result_RRESP,
        m_axi_result_BVALID,
        m_axi_result_BREADY,
        m_axi_result_BRESP,
        m_axi_result_BID,
        m_axi_result_BUSER,
        s_axi_AXILiteS_AWVALID,
        s_axi_AXILiteS_AWREADY,
        s_axi_AXILiteS_AWADDR,
        s_axi_AXILiteS_WVALID,
        s_axi_AXILiteS_WREADY,
        s_axi_AXILiteS_WDATA,
        s_axi_AXILiteS_WSTRB,
        s_axi_AXILiteS_ARVALID,
        s_axi_AXILiteS_ARREADY,
        s_axi_AXILiteS_ARADDR,
        s_axi_AXILiteS_RVALID,
        s_axi_AXILiteS_RREADY,
        s_axi_AXILiteS_RDATA,
        s_axi_AXILiteS_RRESP,
        s_axi_AXILiteS_BVALID,
        s_axi_AXILiteS_BREADY,
        s_axi_AXILiteS_BRESP,
        interrupt
);


C/RTL 協調シミュレーションを行った。
sum_of_squares_15_190821.png

Latency は 84 クロックに減っている。

C/RTL 協調シミュレーションの波形を示す。
sum_of_squares_16_190821.png

result の DMA Write と y の DMA Read の波形だ。 y の DMA Read は ARLEN が 3 になっていてバーストで Read しているのが分かる。 x も波形がここにはないが同様にバースト Read してる。

これで、このインターフェースでのチューニングは終了だが、3 個のAXI4 インターフェースが実装されているのがもったいないと感じる。オーバースペックじゃないかな?
x と y は 8 ビットなので、バス幅 32 ビットの内の 8 ビットを 2 個使えば良いのではないか?というコンセプトで次回の検討を行おう。
  1. 2019年08月21日 05:04 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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