AXI Verification IPのコマンドライン実行

FPGA

VivadoのAXI Verification IP(AXI VIP)をWindows10のコマンドプロンプトから実行したときのメモです。

サンプルの生成

Vivadoで適当なプロジェクトを作成してIP CatalogからAXI VIPを生成します。次にSourcesタブでIPを右クリックして表示されるメニューからOpen IP Example Design…を選ぶとAXI VIPのサンプルプロジェクトが生成されます。 このサンプルプロジェクトを参考に実行環境を作成します。

サンプルの生成

バッチファイルの用意

シミュレーション用のバッチファイルを作成します。バッチファイルでは、xvlog, xelab, xsimを順に実行します。トップモジュール名はtopです。

// sim.bat
call xvlog  --incr --relax -L uvm -L axi_vip_v1_1_8 -L xilinx_vip -prj spi.prj

call xelab  xil_defaultlib.top --incr --debug typical --relax --mt 2 -L xil_defaultlib -L axi_infrastructure_v1_1_0 -L axi_vip_v1_1_8 -L uvm -L xilinx_vip --snapshot xil_defaultlib.top

call xsim  xil_defaultlib.top -tclbatch spi.tcl

xvlogで読み込んでいるspi.prjには、コンパイル対象のファイルを記述します。AXI マスターのVIPのみを使用する場合、必要なファイルは ex_sim_axi_vip_mst_0_pkg.sv と ex_sim_axi_vip_mst_0.sv です。

// spi.prj
sv xil_defaultlib  -i "../../../../imports" \
"./vip/ex_sim_axi_vip_mst_0/sim/ex_sim_axi_vip_mst_0_pkg.sv" \
"./vip/ex_sim_axi_vip_mst_0/sim/ex_sim_axi_vip_mst_0.sv" \

verilog xil_defaultlib  -i "../include" --include "../opencores/rtl/verilog"  \
"../opencores/rtl/verilog/spi_top.v" \
"../opencores/rtl/verilog/spi_shift.v" \
"../opencores/rtl/verilog/spi_clgen.v" \
"../rtl/fm_axi_s.v" \
"../rtl/fm_fifo.v" \
"../rtl/spi_oc.v" \
"../scenario/dut.v" \

sv xil_defaultlib  -i "../../../../imports"\
"../scenario/test.sv" \

nosort

xsim用のtclスクリプトを用意します。xsimを実行して終了するたけのスクリプトです。

// spi.tcl
run -all
exit

テストシナリオ

サンプルで生成されるaxi_vip_0_mst_stimulus.svhを参考にテストシナリオを作成します。単純なAXIのリードとライトは、ファイル内で定義されているsingle_write_transaction_apiと single_read_transaction_apiの2つのtaskで生成できます。

//axi_vip_0_mst_stimulus.svh
import axi_vip_pkg::*;
import ex_sim_axi_vip_mst_0_pkg::*;
ex_sim_axi_vip_mst_0_mst_t  mst_agent;

task mst_start_stimulus();
    mst_agent = new("master vip agent",DUT.axi_vip_mst.inst.IF);
    mst_agent.start_master();
    // single write transaction
    mtestWID = $urandom_range(0,(1<<(0)-1)); 
    mtestWADDR = 0;
    mtestWBurstLength = 0;
    mtestWDataSize = xil_axi_size_t'(xil_clog2((32)/8));
    mtestWBurstType = XIL_AXI_BURST_TYPE_INCR;
    mtestWData = $urandom();

    single_write_transaction_api("single write with api",
                                 .id(mtestWID),
                                 .addr(mtestWADDR),
                                 .len(mtestWBurstLength), 
                                 .size(mtestWDataSize),
                                 .burst(mtestWBurstType),
                                 .wuser(mtestWUSER),
                                 .awuser(mtestAWUSER), 
                                 .data(mtestWData)
                                 );
    //single read transaction 
    mtestRID = $urandom_range(0,(1<<(0)-1));
    mtestRADDR = $urandom_range(0,(1<<(32)-1));
    mtestRBurstLength = 0;
    mtestRDataSize = xil_axi_size_t'(xil_clog2((32)/8)); 
    mtestRBurstType = XIL_AXI_BURST_TYPE_INCR;
    single_read_transaction_api("single read with api",
                                 .id(mtestRID),
                                 .addr(mtestRADDR),
                                 .len(mtestRBurstLength), 
                                 .size(mtestRDataSize),
                                 .burst(mtestRBurstType)
                                 );
endtask

テストベンチのトップモジュール

シミュレーション用のトップモジュールでは、クロックとリセットを生成します。また、AXI VIPのテストシナリオをincludeして、実行するトランザクションを記述したtaskをinitial文で呼び出します。

// test.sv
`timescale 1ns/1ns

import axi_vip_pkg::*;

module top;

  bit clk;
  bit rst_x;

  
  `include "axi_vip_0_mst_stimulus.svh"

  dut DUT(
    .aresetn(rst_x),
    .aclk(clk)
  );

  initial begin
    clk = 1;
    forever begin
      #5 clk = ~clk;
    end
  end

  initial begin
    $dumpvars;
    rst_x = 1;
    @(negedge clk);
    @(negedge clk);
    rst_x = 0;
    @(negedge clk);
    @(negedge clk);
    rst_x = 1;
    @(negedge clk);
  end

  initial begin
    repeat (10) @(posedge clk);
    fork
      mst_start_stimulus();
    join;
    repeat (1000) @(posedge clk);
    $finish;
  end
endmodule

シミュレーション実行

コマンドプロンプトを開いて、Vivadoのインストールディレクトリに格納されているsettings64.batを実行します。その後、sim.batが存在するディレクトリに移動してsim.batを実行するとシミュレーションが始まります。実行時、AXIのプロトコルに問題があれば、ワーニングやエラーが表示されます。

XilinxAXIVIP: Found at Path: top.DUT.axi_vip_mst.inst

Error: Pre-reset violation: AXI4_ERRS_AWREADY_X: When not in reset, a value of X on AWREADY is not permitted. Spec: section A3.1.2.

ERROR: 40 ns top.DUT.axi_vip_mst.inst.IF  : XILINX_RESET_PULSE_WIDTH: Holding AXI ARESETN asserted for 16 cycles of the slowest AXI clock is generally a sufficient reset pulse width for Xilinx IP. --UG1037. To downgrade, use <hierarchy_path to VIP>.IF.set_xilinx_reset_check_to_warn(), or filter using clr_xilinx_reset_check().
essfully
Executing Axi4 End Of Simulation checks
$finish called at time : xx ns
## exit
INFO: [Common 17-206] Exiting xsim at ...

テストベンチでvcdを生成すれば波形を確認できます。

AXI VIPで生成したAXIトランザクションの波形
タイトルとURLをコピーしました