Jump to content

    
Sign in to follow this  
Lutovid

Вопрос по Xilinx AXI VIP

Recommended Posts

Здравствуйте! Появилась необходимость верифицировать самописный AXI мастер, хочу научться работать с AXI Verification IP. Попробовал покопаться в примерах. В итоге написал такой модуль:

`timescale 1ns / 1ps
  
import axi_vip_v1_0_1_pkg::*;
import axi_vip_0_pkg::*;

module tb_vip_top(

    );
     
         
    tb_with_vip DUT
    (    
    );
    axi_vip_0_slv_t      slv_agent;
    
    initial begin
    
        //Create an agent
        slv_agent = new("slave vip agent",DUT_wrapped_bd.axi_vip_0_inst.inst.IF);
        
        // set tag for agents for easy debug
        slv_agent.set_agent_tag("Slave VIP");
        
        // set print out verbosity level.
        slv_agent.set_verbosity(0);
        
        //Start the agent
        slv_agent.start_slave();
    end        
      
endmodule    

 у него дочерний модуль это

`timescale 1ns / 1ps

module tb_with_vip(
    );
    parameter PERIOD = 4;
    reg clk;
    always begin
       clk = 1'b0;
       #(PERIOD/2) clk = 1'b1;
       #(PERIOD/2);
    end
    
    wire [31 : 0] s_axi_awaddr;
    wire [7 : 0] s_axi_awlen;
    wire [2 : 0] s_axi_awsize;
    wire [1 : 0] s_axi_awburst;
    wire [0 : 0] s_axi_awlock;
    wire [3 : 0] s_axi_awcache;
    wire [2 : 0] s_axi_awprot;
    wire [3 : 0] s_axi_awqos;
    wire s_axi_awvalid;
    wire s_axi_awready;
    wire [511 : 0] s_axi_wdata;
    wire [63 : 0] s_axi_wstrb;
    wire s_axi_wlast;
    wire s_axi_wvalid;
    wire s_axi_wready;
    wire [1 : 0] s_axi_bresp;
    wire s_axi_bvalid;
    wire s_axi_bready;
    wire [31 : 0] s_axi_araddr;
    wire [7 : 0] s_axi_arlen;
    wire [2 : 0] s_axi_arsize;
    wire [1 : 0] s_axi_arburst;
    wire [0 : 0] s_axi_arlock;
    wire [3 : 0] s_axi_arcache;
    wire [2 : 0] s_axi_arprot;
    wire [3 : 0] s_axi_arqos;
    wire s_axi_arvalid;
    wire s_axi_arready;
    wire [511 : 0] s_axi_rdata;
    wire [1 : 0] s_axi_rresp;
    wire s_axi_rlast;
    wire s_axi_rvalid;
    wire s_axi_rready;      

    reg m00_axi_init_axi_txn;
    wire [639 : 0] tdata;
    wire tready;
    wire tlast;
    wire tvalid;   
 input_data_emulator input_data_emulator_inst (
           .clk(clk),
           .rst(m00_axi_init_axi_txn),
           .data_size(32'h50),
           .zeros(0),
           .dv_in(tready),        
           .data_out(tdata),
           .dv_out(tvalid),
           .tlast_out(tlast)
       );     
    
   initial begin
    m00_axi_init_axi_txn <= 1;
    #50;
    m00_axi_init_axi_txn <= 0;
    #50;
    m00_axi_init_axi_txn <= 1;
    
   end
   
             
    // Add user logic here
    axi_ddr_data_master # ( 
        .INTERFACE_NUMBER(0)
    ) axi_ddr_data_master_inst (
    //INPUT AXIS INTERFACE
        .s_axis_DSP_tdata(tdata),
        .s_axis_DSP_tvalid(tvalid),
        .s_axis_DSP_tready(tready),
        .s_axis_DSP_tlast(tlast),        

    //INPUT AXIS INTERFACE
        .m_axis_out_tdata(),
        .m_axis_out_tvalid(),
        .m_axis_out_tready(1),
        .m_axis_out_tlast(),        
    // User ports ends
    // Do not modify the ports beyond this line
    // Ports of Axi Master Bus Interface M00_AXI
        .m00_axi_aclk(clk),
        .m00_axi_aresetn(m00_axi_init_axi_txn),
        .m00_axi_awaddr(s_axi_awaddr),
        .m00_axi_awlen(s_axi_awlen),
        .m00_axi_awsize(s_axi_awsize),
        .m00_axi_awburst(s_axi_awburst),
        .m00_axi_awlock(s_axi_awlock),
        .m00_axi_awcache(s_axi_awcache),
        .m00_axi_awprot(s_axi_awprot),
        .m00_axi_awqos(s_axi_awqos),
        .m00_axi_awvalid(s_axi_awvalid),
        .m00_axi_awready(s_axi_awready),
        .m00_axi_wdata(s_axi_wdata),
        .m00_axi_wstrb(s_axi_wstrb),
        .m00_axi_wlast(s_axi_wlast),
        .m00_axi_wvalid(s_axi_wvalid),
        .m00_axi_wready(s_axi_wready),
        .m00_axi_bresp(s_axi_bresp),
        .m00_axi_bvalid(s_axi_bvalid),
        .m00_axi_bready(s_axi_bready),
        .m00_axi_araddr(s_axi_araddr),
        .m00_axi_arlen(s_axi_arlen),
        .m00_axi_arsize(s_axi_arsize),
        .m00_axi_arburst(s_axi_arburst),
        .m00_axi_arlock(s_axi_arlock),
        .m00_axi_arcache(s_axi_arcache),
        .m00_axi_arprot(s_axi_arprot),
        .m00_axi_arqos(s_axi_arqos),
        .m00_axi_arvalid(s_axi_arvalid),
        .m00_axi_arready(s_axi_arready),
        .m00_axi_rdata(s_axi_rdata),
        .m00_axi_rresp(s_axi_rresp),
        .m00_axi_rlast(s_axi_rlast),
        .m00_axi_rvalid(s_axi_rvalid),
        .m00_axi_rready(s_axi_rready)
    );    
    
axi_vip_0 axi_vip_0_inst (
      .aclk(clk),                      // input wire aclk
      .aresetn(1'b1),                // input wire aresetn
      .s_axi_awaddr(s_axi_awaddr),      // input wire [31 : 0] s_axi_awaddr
      .s_axi_awlen(s_axi_awlen),        // input wire [7 : 0] s_axi_awlen
      .s_axi_awsize(s_axi_awsize),      // input v
      .s_axi_awburst(s_axi_awburst),    // input wire [1 : 0] s_axi_awburst
      .s_axi_awlock(s_axi_awlock),      // input wire [0 : 0] s_axi_awlock
      .s_axi_awcache(s_axi_awcache),    // input wire [3 : 0] s_axi_awcache
      .s_axi_awprot(s_axi_awprot),      // input wire [2 : 0] s_axi_awprot
      .s_axi_awqos(s_axi_awqos),        // input wire [3 : 0] s_axi_awqos
      .s_axi_awvalid(s_axi_awvalid),    // input wire s_axi_awvalid
      .s_axi_awready(s_axi_awready),    // output wire s_axi_awready
      .s_axi_wdata(s_axi_wdata),        // input wire [31 : 0] s_axi_wdata
      .s_axi_wstrb(s_axi_wstrb),        // input wire [3 : 0] s_axi_wstrb
      .s_axi_wlast(s_axi_wlast),        // input wire s_axi_wlast
      .s_axi_wvalid(s_axi_wvalid),      // input wire s_axi_wvalid
      .s_axi_wready(s_axi_wready),      // output wire s_axi_wready    
      .s_axi_bresp(s_axi_bresp),        // output wire [1 : 0] s_axi_bresp
      .s_axi_bvalid(s_axi_bvalid),      // output wire s_axi_bvalid
      .s_axi_bready(s_axi_bready),      // input wire s_axi_bready
      .s_axi_araddr(s_axi_araddr),      // input wire [31 : 0] s_axi_araddr
      .s_axi_arlen(s_axi_arlen),        // input wire [7 : 0] s_axi_arlen
      .s_axi_arsize(s_axi_arsize),      // input wire [2 : 0] s_axi_arsize
      .s_axi_arburst(s_axi_arburst),    // input wire [1 : 0] s_axi_arburst
      .s_axi_arlock(s_axi_arlock),      // input wire [0 : 0] s_axi_arlock
      .s_axi_arcache(s_axi_arcache),    // input wire [3 : 0] s_axi_arcache
      .s_axi_arprot(s_axi_arprot),      // input wire [2 : 0] s_axi_arprot
      .s_axi_arqos(s_axi_arqos),        // input wire [3 : 0] s_axi_arqos    
      .s_axi_arvalid(s_axi_arvalid),    // input wire s_axi_arvalid
      .s_axi_arready(s_axi_arready),    // output wire s_axi_arready
      .s_axi_rdata(s_axi_rdata),        // output wire [31 : 0] s_axi_rdata
      .s_axi_rresp(s_axi_rresp),        // output wire [1 : 0] s_axi_rresp
      .s_axi_rlast(s_axi_rlast),        // output wire s_axi_rlast
      .s_axi_rvalid(s_axi_rvalid),      // output wire s_axi_rvalid
      .s_axi_rready(s_axi_rready)      // input wire s_axi_rready
    );        
    
    
endmodule

По сути это подобие DMA

Симуляция запускается, проходит до начала первой транзакции в слэйв и останавливается со следующим сообщением:

XilinxAXIVIP: Found at Path: tb_vip_top.DUT_wrapped_bd.axi_vip_0_inst.inst
Fatal: [AXI_WMON0_0] (axi_vip_v1_0_1_pkg.axi_transaction::create_data_array) 462000 : Attempted to generate a DATA array greater than 4K in size (      4416)
Time: 462 ns  Iteration: 0  Process: /axi_vip_v1_0_1_pkg/axi_monitor(C_AXI_WDATA_WIDTH=512,C_AXI_RDATA_WIDTH=512,C_AXI_HAS_REGION=0)::aw_channel/AW_LOOP  File: /wrk/2017.1/nightly/2017_04_14_1846317/packages/customer/vivado/data/ip/xilinx/axi_vip_v1_0/hdl/axi_vip_v1_0_vl_rfs.sv
$finish called at time : 462 ns : File "/wrk/2017.1/nightly/2017_04_14_1846317/packages/customer/vivado/data/ip/xilinx/xil_common_vip_v1_0/hdl/xil_common_vip_v1_0_vl_rfs.sv" Line 100
WARNING: [Simulator 45-29] Cannot open source file /wrk/2017.1/nightly/2017_04_14_1846317/packages/customer/vivado/data/ip/xilinx/xil_common_vip_v1_0/hdl/xil_common_vip_v1_0_vl_rfs.sv: file does not exist.
INFO: [USF-XSim-96] XSim completed. Design snapshot 'tb_vip_top_behav' loaded.
INFO: [USF-XSim-97] XSim simulation ran for 1000ns
launch_simulation: Time (s): cpu = 00:00:11 ; elapsed = 00:00:07 . Memory (MB): peak = 6378.914 ; gain = 10.691 ; free physical = 23880 ; free virtual = 61100

Я так понял размер транзакции слишком большой для дефолтного буфера, но покопавшись в автогенерируемых файлах исходников мне показалось, что resize должен быть автоматический.

Параметры у меня такие:

        parameter integer C_M00_AXI_BURST_LEN    = 128;
        parameter integer C_M00_AXI_ID_WIDTH    = 1;
        parameter integer C_M00_AXI_ADDR_WIDTH    = 32;
        parameter integer C_M00_AXI_DATA_WIDTH    = 512;
        parameter integer C_M00_AXI_AWUSER_WIDTH    = 0;
        parameter integer C_M00_AXI_ARUSER_WIDTH    = 0;
        parameter integer C_M00_AXI_WUSER_WIDTH    = 0;
        parameter integer C_M00_AXI_RUSER_WIDTH    = 0;
        parameter integer C_M00_AXI_BUSER_WIDTH    = 0;	

 

Подскажите пожалуйста куда копать?

Share this post


Link to post
Share on other sites
1 hour ago, Lutovid said:

Подскажите пожалуйста куда копать?

А зачем куда-то копать? Размер AXI Slave 4k. Границу слейва транзакция пересекать не должна.

Share this post


Link to post
Share on other sites
6 minutes ago, one_eight_seven said:

А зачем куда-то копать? Размер AXI Slave 4k. Границу слейва транзакция пересекать не должна.

Я посмотрел в стандартах на ограничение размера берста и не посмотрел на максимальный объем данных в берсте спасибо, глупо получилось

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this