FC2カウンター FPGAの部屋 AXI VDMAのレジスタ設定用AXI Lite Master IPの作製3(HDLソースの公開)
FC2ブログ

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

FPGAの部屋

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

AXI VDMAのレジスタ設定用AXI Lite Master IPの作製3(HDLソースの公開)

AXI VDMAのレジスタ設定用AXI Lite Master IPの作製2(シミュレーション)”でシミュレーションが動作したので、シミュレーション環境を紹介する。

テストベンチにAXI VDMAのレジスタを設定するコントローラ (reg_set_axi_lite_master.v)(これはプロセッサの変わりだ)と、AXI4 Lite Slave BFM を接続してシミュレーションを行なっている。、AXI4 Lite Slave BFM は以前に公開したAXI4 Slave BFM に AXI4 Liteのラッパーをかませたものだ。

それでは、テストベンチから貼っておく。下に reg_set_axi_lite_master_tb.v を示す。

`default_nettype none

`timescale 100ps / 1ps

////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer:
//
// Create Date:   18:51:13 06/19/2013
// Design Name:   reg_set_axi_lite_master
// Module Name:   D:/HDL/FndtnISEWork/Zynq-7000/ZedBoard/test/reg_set_axi_lite_master/reg_set_axi_lite_master_tb.v
// Project Name:  reg_set_axi_lite_master
// Target Device:  
// Tool versions:  
// Description: 
//
// Verilog Test Fixture created by ISE for module: reg_set_axi_lite_master
//
// Dependencies:
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
////////////////////////////////////////////////////////////////////////////////

module reg_set_axi_lite_master_tb;

    // Inputs
    wire M_AXI_ACLK;
    wire M_AXI_ARESETN;
    wire M_AXI_AWREADY;
    wire M_AXI_WREADY;
    wire [1:0] M_AXI_BRESP;
    wire M_AXI_BVALID;
    wire M_AXI_ARREADY;
    wire [31:0] M_AXI_RDATA;
    wire [1:0] M_AXI_RRESP;
    wire M_AXI_RVALID;
    reg     init_done;

    // Outputs
    wire [31:0] M_AXI_AWADDR;
    wire [2:0] M_AXI_AWPROT;
    wire M_AXI_AWVALID;
    wire [31:0] M_AXI_WDATA;
    wire [3:0] M_AXI_WSTRB;
    wire M_AXI_WVALID;
    wire M_AXI_BREADY;
    wire [31:0] M_AXI_ARADDR;
    wire [2:0] M_AXI_ARPROT;
    wire M_AXI_ARVALID;
    wire M_AXI_RREADY;

    // Instantiate the Unit Under Test (UUT)
    reg_set_axi_lite_master uut (
        .M_AXI_ACLK(M_AXI_ACLK), 
        .M_AXI_ARESETN(M_AXI_ARESETN), 
        .M_AXI_AWADDR(M_AXI_AWADDR), 
        .M_AXI_AWPROT(M_AXI_AWPROT), 
        .M_AXI_AWVALID(M_AXI_AWVALID), 
        .M_AXI_AWREADY(M_AXI_AWREADY), 
        .M_AXI_WDATA(M_AXI_WDATA), 
        .M_AXI_WSTRB(M_AXI_WSTRB), 
        .M_AXI_WVALID(M_AXI_WVALID), 
        .M_AXI_WREADY(M_AXI_WREADY), 
        .M_AXI_BRESP(M_AXI_BRESP), 
        .M_AXI_BVALID(M_AXI_BVALID), 
        .M_AXI_BREADY(M_AXI_BREADY), 
        .M_AXI_ARADDR(M_AXI_ARADDR), 
        .M_AXI_ARPROT(M_AXI_ARPROT), 
        .M_AXI_ARVALID(M_AXI_ARVALID), 
        .M_AXI_ARREADY(M_AXI_ARREADY), 
        .M_AXI_RDATA(M_AXI_RDATA), 
        .M_AXI_RRESP(M_AXI_RRESP), 
        .M_AXI_RVALID(M_AXI_RVALID), 
        .M_AXI_RREADY(M_AXI_RREADY), 
        .init_done(init_done)
    );

    axi_lite_slave_BFM axi_lite_slave_BFM_i (
        .M_AXI_ACLK(M_AXI_ACLK), 
        .M_AXI_ARESETN(M_AXI_ARESETN), 
        .M_AXI_AWADDR(M_AXI_AWADDR), 
        .M_AXI_AWPROT(M_AXI_AWPROT), 
        .M_AXI_AWVALID(M_AXI_AWVALID), 
        .M_AXI_AWREADY(M_AXI_AWREADY), 
        .M_AXI_WDATA(M_AXI_WDATA), 
        .M_AXI_WSTRB(M_AXI_WSTRB), 
        .M_AXI_WVALID(M_AXI_WVALID), 
        .M_AXI_WREADY(M_AXI_WREADY), 
        .M_AXI_BRESP(M_AXI_BRESP), 
        .M_AXI_BVALID(M_AXI_BVALID), 
        .M_AXI_BREADY(M_AXI_BREADY), 
        .M_AXI_ARADDR(M_AXI_ARADDR), 
        .M_AXI_ARPROT(M_AXI_ARPROT), 
        .M_AXI_ARVALID(M_AXI_ARVALID), 
        .M_AXI_ARREADY(M_AXI_ARREADY), 
        .M_AXI_RDATA(M_AXI_RDATA), 
        .M_AXI_RRESP(M_AXI_RRESP), 
        .M_AXI_RVALID(M_AXI_RVALID), 
        .M_AXI_RREADY(M_AXI_RREADY)
    );

    initial begin
        // Initialize Inputs
        init_done = 1'b0;

        // Wait 100 ns for global reset to finish
        #100;
        
        // Add stimulus here
        init_done = 1'b1;
    end

    // ACLK のインスタンス
    clk_gen #(
        .CLK_PERIOD(100),    // 10nsec, 100MHz
        .CLK_DUTY_CYCLE(0.5),
        .CLK_OFFSET(0),
        .START_STATE(1'b0)
    ) ACLKi (
        .clk_out(M_AXI_ACLK)
    );
    
    // reset_gen のインスタンス
    reset_gen #(
        .RESET_STATE(1'b0),
        .RESET_TIME(1000)    // 100nsec
    ) RESETi (
        .reset_out(M_AXI_ARESETN)
    );
    
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

`default_nettype wire


下に axi_lite_slave_BFM を示す。

//
// AXI Lite Master 用 AXI Slave Bus Fuction Model (BFM)
// axi_lite_slave_BFM.v
// AXI Master用 AXI Slave Bus Function Mode (BFM)へのラッパー
// 
// 2013/06/19 
//

`default_nettype none

module axi_lite_slave_BFM # (
    parameter integer C_M_AXI_ADDR_WIDTH = 32,
    parameter integer C_M_AXI_DATA_WIDTH = 32,
    parameter C_M_AXI_AxSIZE = 3'b010,        // 4バイト
    
    parameter integer C_OFFSET_WIDTH = 10,    // 割り当てるRAMのアドレスのビット幅
    
    parameter integer WRITE_RANDOM_WAIT = 0, // Write Transaction のデータ転送の時にランダムなWaitを発生させる=1, Waitしない=0
    parameter integer WR_BVALID_RANDOM_WAIT = 0, // Write Transaction の時のM_AXI_BVALID をランダムにWaitする=1, Waitしない=0
    parameter integer READ_RANDOM_WAIT = 0 // Read Transaction のデータ転送の時にランダムなWaitを発生させる=1, Waitしない=0
) (
    // System Signals
    input wire M_AXI_ACLK,
    input wire M_AXI_ARESETN,

    // Master Interface Write Address
    input wire [C_M_AXI_ADDR_WIDTH-1:0] M_AXI_AWADDR,
    input wire [3-1:0] M_AXI_AWPROT,
    input wire M_AXI_AWVALID,
    output wire M_AXI_AWREADY,

    // Master Interface Write Data
    input wire [C_M_AXI_DATA_WIDTH-1:0] M_AXI_WDATA,
    input wire [C_M_AXI_DATA_WIDTH/8-1:0] M_AXI_WSTRB,
    input wire M_AXI_WVALID,
    output wire M_AXI_WREADY,

    // Master Interface Write Response
    output wire [2-1:0] M_AXI_BRESP,
    output wire M_AXI_BVALID,
    input wire M_AXI_BREADY,

    // Master Interface Read Address
    input wire [C_M_AXI_ADDR_WIDTH-1:0] M_AXI_ARADDR,
    input wire [3-1:0] M_AXI_ARPROT,
    input wire M_AXI_ARVALID,
    output wire M_AXI_ARREADY,

    // Master Interface Read Data 
    input wire [C_M_AXI_DATA_WIDTH-1:0] M_AXI_RDATA,
    input wire [2-1:0] M_AXI_RRESP,
    input wire M_AXI_RVALID,
    output wire M_AXI_RREADY
);
    

    // Instantiate the Unit Under Test (UUT_slave)
    axi_slave_bfm #(
        .C_M_AXI_ADDR_WIDTH(C_M_AXI_ADDR_WIDTH),
        .C_M_AXI_DATA_WIDTH(C_M_AXI_DATA_WIDTH),
        .C_OFFSET_WIDTH(C_OFFSET_WIDTH),
        .C_M_AXI_BURST_LEN(1),
        .WRITE_RANDOM_WAIT(WRITE_RANDOM_WAIT),
        .WR_BVALID_RANDOM_WAIT(WR_BVALID_RANDOM_WAIT),
        .READ_RANDOM_WAIT(READ_RANDOM_WAIT)
    ) axi_slave_bfm_i (
        .ACLK(M_AXI_ACLK), 
        .ARESETN(M_AXI_ARESETN), 
        .M_AXI_AWID(1'b0), 
        .M_AXI_AWADDR(M_AXI_AWADDR), 
        .M_AXI_AWLEN(8'd0),                // 1 Word
        .M_AXI_AWSIZE(C_M_AXI_AxSIZE), 
        .M_AXI_AWBURST(2'b01),             // INCR  (アドレスをインクリメント))
        .M_AXI_AWLOCK(1'b0),            // ノーマル・アクセス
        .M_AXI_AWCACHE(4'b0010),         // Normal Non-cacheable Non-bufferable
        .M_AXI_AWPROT(M_AXI_AWPROT),
        .M_AXI_AWQOS(4'b0000),            // default
        .M_AXI_AWUSER(), 
        .M_AXI_AWVALID(M_AXI_AWVALID), 
        .M_AXI_AWREADY(M_AXI_AWREADY), 
        .M_AXI_WDATA(M_AXI_WDATA), 
        .M_AXI_WSTRB(M_AXI_WSTRB), 
        .M_AXI_WLAST(1'b1), 
        .M_AXI_WUSER(), 
        .M_AXI_WVALID(M_AXI_WVALID), 
        .M_AXI_WREADY(M_AXI_WREADY), 
        .M_AXI_BID(), 
        .M_AXI_BRESP(M_AXI_BRESP), 
        .M_AXI_BUSER(), 
        .M_AXI_BVALID(M_AXI_BVALID), 
        .M_AXI_BREADY(M_AXI_BREADY), 
        .M_AXI_ARID(1'b0), 
        .M_AXI_ARADDR(M_AXI_ARADDR), 
        .M_AXI_ARLEN(8'd0),                // 1 Word
        .M_AXI_ARSIZE(C_M_AXI_AxSIZE), 
        .M_AXI_ARBURST(2'b01),             // INCR  (アドレスをインクリメント) 
        .M_AXI_ARLOCK(2'b00),            // ノーマル・アクセス
        .M_AXI_ARCACHE(4'b0010),         // Normal Non-cacheable Non-bufferable
        .M_AXI_ARPROT(M_AXI_ARPROT),
        .M_AXI_ARQOS(4'b0000),            // default
        .M_AXI_ARUSER(), 
        .M_AXI_ARVALID(M_AXI_ARVALID), 
        .M_AXI_ARREADY(M_AXI_ARREADY), 
        .M_AXI_RID(), 
        .M_AXI_RDATA(M_AXI_RDATA), 
        .M_AXI_RRESP(M_AXI_RRESP), 
        .M_AXI_RLAST(), 
        .M_AXI_RUSER(), 
        .M_AXI_RVALID(M_AXI_RVALID), 
        .M_AXI_RREADY(M_AXI_RREADY)
    );
endmodule

`default_nettype wire

  1. 2013年06月21日 03:29 |
  2. AXI Lite Master IPコアの作製
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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