FC2カウンター FPGAの部屋 2016年09月17日
fc2ブログ

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