FC2カウンター FPGAの部屋 DMA Read IP を単体でシミュレーション3(DMA Read IP単体で論理合成後にシミュレーション)

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

FPGAの部屋

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

DMA Read IP を単体でシミュレーション3(DMA Read IP単体で論理合成後にシミュレーション)

DMA Read IP を単体でシミュレーション2(論理合成後の機能シミュレーション)”の続き。

前回は、DMA Read IP 、AXI4 Slave BFM、 reg_write_read IP の3つをIP Integrator に入れて、論理合成をしていたので、AXI4 Slave BFM、 reg_write_read IP のどちらかが論理合成できない可能性もある。そこで、DMA Read IP だけをブロックデザインにAdd IP して、AXI4 Slave BFM、 reg_write_read IP は、シミュレーション・ファイルにすることにした。

DMA_Read_test2 プロジェクトを作成した。
DMA_Read_IP_test_23_160917.png

DMA_Read_test2 ブロックデザインを作成した。DMA Read IP と2つのAXI インターコネクトで構成されている。
DMA_Read_IP_test_25_160917.png

Address Editorの画面を示す。
DMA_Read_IP_test_26_160917.png

ブロックデザインのラッパーファイルを生成して、論理合成を行った。
その結果を示す。さすがにIOが465 になってしまってオーバーしてしまった。これでも論理合成後のシミュレーションには影響がないようだ。
DMA_Read_IP_test_24_160917.png

この状態で、Flow Navigator の Simulation -> Run Simulation をクリックして、Run Post-Synthesis Fuctional Simulation を行った。
DMA_Read_IP_test_20_160917.png

シミュレーション波形を示す。(2016/09/19 変更:やはり、Post-Synthesis Fuctional Simulation は動いていないようでした。画像を変更します)
DMA_Read_IP_test_37_160918.png 

DMA_Read_IP_test_38_160918.png 

問題なく動作しているようだ。つまりDMA Read IP は問題ないようだ。
すると、AXI4-Stream 版のビットマップ・ディスプレイ・コントローラがおかしいのか?今度はそれをシミュレーションしてみよう。
どうやっても、Post-Synthesis Fuctional Simulation でDMA Read IP が動かない。

最後にテストベンチの DMA_Read_test2_tb.v を貼っておく。

// DMA_Read_test2_tb.v
// 2016/09/15 by marsee
//

module DMA_Read_test2_tb;
    wire [31:0]M00_AXI_araddr;
    wire [1:0]M00_AXI_arburst;
    wire [3:0]M00_AXI_arcache;
    wire [7:0]M00_AXI_arlen;
    wire [1:0]M00_AXI_arlock;
    wire [2:0]M00_AXI_arprot;
    wire [3:0]M00_AXI_arqos;
    wire M00_AXI_arready;
    wire [3:0]M00_AXI_arregion;
    wire [2:0]M00_AXI_arsize;
    wire M00_AXI_arvalid;
    wire [31:0]M00_AXI_awaddr;
    wire [1:0]M00_AXI_awburst;
    wire [3:0]M00_AXI_awcache;
    wire [7:0]M00_AXI_awlen;
    wire [1:0]M00_AXI_awlock;
    wire [2:0]M00_AXI_awprot;
    wire [3:0]M00_AXI_awqos;
    wire M00_AXI_awready;
    wire [3:0]M00_AXI_awregion;
    wire [2:0]M00_AXI_awsize;
    wire M00_AXI_awvalid;
    wire M00_AXI_bready;
    wire [1:0]M00_AXI_bresp;
    wire M00_AXI_bvalid;
    wire [31:0]M00_AXI_rdata;
    wire M00_AXI_rlast;
    wire M00_AXI_rready;
    wire [1:0]M00_AXI_rresp;
    wire M00_AXI_rvalid;
    wire [31:0]M00_AXI_wdata;
    wire M00_AXI_wlast;
    wire M00_AXI_wready;
    wire [3:0]M00_AXI_wstrb;
    wire M00_AXI_wvalid;
    wire [31:0]S00_AXI_araddr;
    wire [1:0]S00_AXI_arburst;
    wire [3:0]S00_AXI_arcache;
    wire [7:0]S00_AXI_arlen;
    wire [0:0]S00_AXI_arlock;
    wire [2:0]S00_AXI_arprot;
    wire [3:0]S00_AXI_arqos;
    wire S00_AXI_arready;
    wire [3:0]S00_AXI_arregion;
    wire [2:0]S00_AXI_arsize;
    wire S00_AXI_arvalid;
    wire [31:0]S00_AXI_awaddr;
    wire [1:0]S00_AXI_awburst;
    wire [3:0]S00_AXI_awcache;
    wire [7:0]S00_AXI_awlen;
    wire [0:0]S00_AXI_awlock;
    wire [2:0]S00_AXI_awprot;
    wire [3:0]S00_AXI_awqos;
    wire S00_AXI_awready;
    wire [3:0]S00_AXI_awregion;
    wire [2:0]S00_AXI_awsize;
    wire S00_AXI_awvalid;
    wire S00_AXI_bready;
    wire [1:0]S00_AXI_bresp;
    wire S00_AXI_bvalid;
    wire [31:0]S00_AXI_rdata;
    wire S00_AXI_rlast;
    wire S00_AXI_rready;
    wire [1:0]S00_AXI_rresp;
    wire S00_AXI_rvalid;
    wire [31:0]S00_AXI_wdata;
    wire S00_AXI_wlast;
    wire S00_AXI_wready;
    wire [3:0]S00_AXI_wstrb;
    wire S00_AXI_wvalid;
    wire [1:0]active_frame_V;
    wire ap_clk;
    wire ap_rst_n;
    wire interrupt;
    wire [31:0]outs_tdata;
    wire [0:0]outs_tdest;
    wire [0:0]outs_tid;
    wire [3:0]outs_tkeep;
    wire [0:0]outs_tlast;
    wire outs_tready;
    wire [3:0]outs_tstrb;
    wire [0:0]outs_tuser;
    wire outs_tvalid;

    DMA_Read_test2_wrapper DMA_Read_test2_wrapper_i(
        .M00_AXI_araddr(M00_AXI_araddr),
        .M00_AXI_arburst(M00_AXI_arburst),
        .M00_AXI_arcache(M00_AXI_arcache),
        .M00_AXI_arlen(M00_AXI_arlen),
        .M00_AXI_arlock(M00_AXI_arlock),
        .M00_AXI_arprot(M00_AXI_arprot),
        .M00_AXI_arqos(M00_AXI_arqos),
        .M00_AXI_arready(M00_AXI_arready),
        .M00_AXI_arregion(M00_AXI_arregion),
        .M00_AXI_arsize(M00_AXI_arsize),
        .M00_AXI_arvalid(M00_AXI_arvalid),
        .M00_AXI_awaddr(M00_AXI_awaddr),
        .M00_AXI_awburst(M00_AXI_awburst),
        .M00_AXI_awcache(M00_AXI_awcache),
        .M00_AXI_awlen(M00_AXI_awlen),
        .M00_AXI_awlock(M00_AXI_awlock),
        .M00_AXI_awprot(M00_AXI_awprot),
        .M00_AXI_awqos(M00_AXI_awqos),
        .M00_AXI_awready(M00_AXI_awready),
        .M00_AXI_awregion(M00_AXI_awregion),
        .M00_AXI_awsize(M00_AXI_awsize),
        .M00_AXI_awvalid(M00_AXI_awvalid),
        .M00_AXI_bready(M00_AXI_bready),
        .M00_AXI_bresp(M00_AXI_bresp),
        .M00_AXI_bvalid(M00_AXI_bvalid),
        .M00_AXI_rdata(M00_AXI_rdata),
        .M00_AXI_rlast(M00_AXI_rlast),
        .M00_AXI_rready(M00_AXI_rready),
        .M00_AXI_rresp(M00_AXI_rresp),
        .M00_AXI_rvalid(M00_AXI_rvalid),
        .M00_AXI_wdata(M00_AXI_wdata),
        .M00_AXI_wlast(M00_AXI_wlast),
        .M00_AXI_wready(M00_AXI_wready),
        .M00_AXI_wstrb(M00_AXI_wstrb),
        .M00_AXI_wvalid(M00_AXI_wvalid),
        .S00_AXI_araddr(S00_AXI_araddr),
        .S00_AXI_arburst(S00_AXI_arburst),
        .S00_AXI_arcache(S00_AXI_arcache),
        .S00_AXI_arlen(S00_AXI_arlen),
        .S00_AXI_arlock(S00_AXI_arlock),
        .S00_AXI_arprot(S00_AXI_arprot),
        .S00_AXI_arqos(S00_AXI_arqos),
        .S00_AXI_arready(S00_AXI_arready),
        .S00_AXI_arregion(S00_AXI_arregion),
        .S00_AXI_arsize(S00_AXI_arsize),
        .S00_AXI_arvalid(S00_AXI_arvalid),
        .S00_AXI_awaddr(S00_AXI_awaddr),
        .S00_AXI_awburst(S00_AXI_awburst),
        .S00_AXI_awcache(S00_AXI_awcache),
        .S00_AXI_awlen(S00_AXI_awlen),
        .S00_AXI_awlock(S00_AXI_awlock),
        .S00_AXI_awprot(S00_AXI_awprot),
        .S00_AXI_awqos(S00_AXI_awqos),
        .S00_AXI_awready(S00_AXI_awready),
        .S00_AXI_awregion(S00_AXI_awregion),
        .S00_AXI_awsize(S00_AXI_awsize),
        .S00_AXI_awvalid(S00_AXI_awvalid),
        .S00_AXI_bready(S00_AXI_bready),
        .S00_AXI_bresp(S00_AXI_bresp),
        .S00_AXI_bvalid(S00_AXI_bvalid),
        .S00_AXI_rdata(S00_AXI_rdata),
        .S00_AXI_rlast(S00_AXI_rlast),
        .S00_AXI_rready(S00_AXI_rready),
        .S00_AXI_rresp(S00_AXI_rresp),
        .S00_AXI_rvalid(S00_AXI_rvalid),
        .S00_AXI_wdata(S00_AXI_wdata),
        .S00_AXI_wlast(S00_AXI_wlast),
        .S00_AXI_wready(S00_AXI_wready),
        .S00_AXI_wstrb(S00_AXI_wstrb),
        .S00_AXI_wvalid(S00_AXI_wvalid),
        .active_frame_V(active_frame_V),
        .ap_clk(ap_clk),
        .ap_rst_n(ap_rst_n),
        .interrupt(interrupt),
        .outs_tdata(outs_tdata),
        .outs_tdest(outs_tdest),
        .outs_tid(outs_tid),
        .outs_tkeep(outs_tkeep),
        .outs_tlast(outs_tlast),
        .outs_tready(outs_tready),
        .outs_tstrb(outs_tstrb),
        .outs_tuser(outs_tuser),
        .outs_tvalid(outs_tvalid)
    );
    assign outs_tready = 1'b1;
    
    reg_write_read reg_write_read_i (
        .ap_clk(ap_clk),
        .ap_rst_n(ap_rst_n),
        .ap_start(1'b1),
        .ap_done(),
        .ap_idle(),
        .ap_ready(),
        .m_axi_axi4m_AWVALID(S00_AXI_awvalid),
        .m_axi_axi4m_AWREADY(S00_AXI_awready),
        .m_axi_axi4m_AWADDR(S00_AXI_awaddr),
        .m_axi_axi4m_AWID(),
        .m_axi_axi4m_AWLEN(S00_AXI_awlen),
        .m_axi_axi4m_AWSIZE(S00_AXI_awsize),
        .m_axi_axi4m_AWBURST(S00_AXI_awburst),
        .m_axi_axi4m_AWLOCK(S00_AXI_awlock),
        .m_axi_axi4m_AWCACHE(S00_AXI_awcache),
        .m_axi_axi4m_AWPROT(S00_AXI_awprot),
        .m_axi_axi4m_AWQOS(S00_AXI_awqos),
        .m_axi_axi4m_AWREGION(S00_AXI_awregion),
        .m_axi_axi4m_AWUSER(),
        .m_axi_axi4m_WVALID(S00_AXI_wvalid),
        .m_axi_axi4m_WREADY(S00_AXI_wready),
        .m_axi_axi4m_WDATA(S00_AXI_wdata),
        .m_axi_axi4m_WSTRB(S00_AXI_wstrb),
        .m_axi_axi4m_WLAST(S00_AXI_wlast),
        .m_axi_axi4m_WID(),
        .m_axi_axi4m_WUSER(),
        .m_axi_axi4m_ARVALID(S00_AXI_arvalid),
        .m_axi_axi4m_ARREADY(S00_AXI_arready),
        .m_axi_axi4m_ARADDR(S00_AXI_araddr),
        .m_axi_axi4m_ARID(),
        .m_axi_axi4m_ARLEN(S00_AXI_arlen),
        .m_axi_axi4m_ARSIZE(S00_AXI_arsize),
        .m_axi_axi4m_ARBURST(S00_AXI_arburst),
        .m_axi_axi4m_ARLOCK(S00_AXI_arlock),
        .m_axi_axi4m_ARCACHE(S00_AXI_arcache),
        .m_axi_axi4m_ARPROT(S00_AXI_arprot),
        .m_axi_axi4m_ARQOS(S00_AXI_arqos),
        .m_axi_axi4m_ARREGION(S00_AXI_arregion),
        .m_axi_axi4m_ARUSER(),
        .m_axi_axi4m_RVALID(S00_AXI_rvalid),
        .m_axi_axi4m_RREADY(S00_AXI_rready),
        .m_axi_axi4m_RDATA(S00_AXI_rdata),
        .m_axi_axi4m_RLAST(S00_AXI_rlast),
        .m_axi_axi4m_RID(),
        .m_axi_axi4m_RUSER(),
        .m_axi_axi4m_RRESP(S00_AXI_rresp),
        .m_axi_axi4m_BVALID(S00_AXI_bvalid),
        .m_axi_axi4m_BREADY(S00_AXI_bready),
        .m_axi_axi4m_BRESP(S00_AXI_bresp),
        .m_axi_axi4m_BID(1'b0),
        .m_axi_axi4m_BUSER(1'b0),
        .dummy_out(),
        .ap_return()
    );

    axi_slave_bfm #(
        .READ_DATA_IS_INCREMENT(1'b1)
    ) axi_slave_bfm_i (
        .ACLK(ap_clk),
        .ARESETN(ap_rst_n),
        .S_AXI_AWID(1'b0),
        .S_AXI_AWADDR(M00_AXI_awaddr),
        .S_AXI_AWLEN(M00_AXI_awlen),
        .S_AXI_AWSIZE(M00_AXI_awsize),
        .S_AXI_AWBURST(M00_AXI_awburst),
        .S_AXI_AWLOCK(M00_AXI_awlock),
        .S_AXI_AWCACHE(M00_AXI_awcache),
        .S_AXI_AWPROT(M00_AXI_awprot),
        .S_AXI_AWQOS(M00_AXI_awqos),
        .S_AXI_AWUSER(1'b0),
        .S_AXI_AWVALID(M00_AXI_awvalid),
        .S_AXI_AWREADY(M00_AXI_awready),
        .S_AXI_WDATA(M00_AXI_wdata),
        .S_AXI_WSTRB(M00_AXI_wstrb),
        .S_AXI_WLAST(M00_AXI_wlast),
        .S_AXI_WUSER(1'b0),
        .S_AXI_WVALID(M00_AXI_wvalid),
        .S_AXI_WREADY(M00_AXI_wready),
        .S_AXI_BID(),
        .S_AXI_BRESP(M00_AXI_bresp),
        .S_AXI_BUSER(),
        .S_AXI_BREADY(M00_AXI_bready),
        .S_AXI_ARID(1'b0),
        .S_AXI_ARADDR(M00_AXI_araddr),
        .S_AXI_ARLEN(M00_AXI_arlen),
        .S_AXI_ARSIZE(M00_AXI_arsize),
        .S_AXI_ARBURST(M00_AXI_arburst),
        .S_AXI_ARLOCK(M00_AXI_arlock),
        .S_AXI_ARCACHE(M00_AXI_arcache),
        .S_AXI_ARPROT(M00_AXI_arprot),
        .S_AXI_ARQOS(M00_AXI_arqos),
        .S_AXI_ARUSER(1'b0),
        .S_AXI_ARVALID(M00_AXI_arvalid),
        .S_AXI_ARREADY(M00_AXI_arready),
        .S_AXI_RID(),
        .S_AXI_RDATA(M00_AXI_rdata),
        .S_AXI_RRESP(M00_AXI_rresp),
        .S_AXI_RLAST(M00_AXI_rlast),
        .S_AXI_RUSER(),
        .S_AXI_RVALID(M00_AXI_rvalid),
        .S_AXI_RREADY(M00_AXI_rready)
    );

    // sys_clock
    clk_gen #(
        .CLK_PERIOD(100),    // 10.0nsec, 100MHz
        .CLK_DUTY_CYCLE(0.5),
        .CLK_OFFSET(0),
        .START_STATE(1'b0)
    ) sys_clock_i (
        .clk_out(ap_clk)
    );
    
    // reset_rtl_n
    reset_gen #(
        .RESET_STATE(1'b0),
        .RESET_TIME(1000)    // 100nsec
    ) RESET2i (
        .reset_out(ap_rst_n)
    );
    
endmodule

module clk_gen #(
    parameter         CLK_PERIOD = 100,
    parameter real    CLK_DUTY_CYCLE = 0.5,
    parameter        CLK_OFFSET = 0,
    parameter        START_STATE    = 1'b0 )
(
    output    reg        clk_out
);
    begin
        initial begin
            #CLK_OFFSET;
            forever
            begin
                clk_out = START_STATE;
                #(CLK_PERIOD-(CLK_PERIOD*CLK_DUTY_CYCLE)) clk_out = ~START_STATE;
                #(CLK_PERIOD*CLK_DUTY_CYCLE);
            end
        end
    end
endmodule

module reset_gen #(
    parameter    RESET_STATE = 1'b1,
    parameter    RESET_TIME = 100 )
(
    output    reg        reset_out
);
    begin
        initial begin
            reset_out = RESET_STATE;
            #RESET_TIME;
            reset_out = ~RESET_STATE;
        end
    end
endmodule    

  1. 2016年09月17日 05:06 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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