Vengineerの戯言

人生は短いけど、長いです。人生を楽しみましょう!

Xilinx Vitis の中を調べる(その14)

はじめに

Xilinx Vitis の中を調べるのその14。

今回は、INTERFACE に s_axilite を生成した時に、C/RTL Simulation (Random Stallを ON)での生成されるファイルをみていきます。

axivip

C/RTL Simulation (Random Stall を ON)にした時に生成ファイルは、ちょっとかわりました。

axivip ディレクトリの下に下記のファイルが生成されました。これは、AXI用のUVMベースの検証モデルっぽいです。

ls axivip/
axi_base_sequence.sv  axi_master_agent.sv    axi_master_wdrv.sv  axi_slave_awdrv.sv    axi_transfer.sv
axi_cfg.sv            axi_master_ardrv.sv    axi_monitor.sv      axi_slave_bdrv.sv     axi_type.sv
axi_driver_base.sv    axi_master_awdrv.sv    axi_pkg.sv          axi_slave_rdrv.sv     axi_virtual_sequencer.sv
axi_env.sv            axi_master_bdrv.sv     axi_sequencer.sv    axi_slave_seq_lib.sv
axi_if.sv             axi_master_rdrv.sv     axi_slave_agent.sv  axi_slave_wdrv.sv
axi_info.sv           axi_master_seq_lib.sv  axi_slave_ardrv.sv  axi_state.sv

sv_module_top.sv

svtb/sv_module_top.sv の中は、下記のようになっています。また、図示してみました。mult_in0/multi_in1/multi_out の svr_if から 1つの axi_if になっています。

//Vitis HLS - High-Level Synthesis from C, C++ and OpenCL v2022.1 (64-bit)
//Tool Version Limit: 2022.04
//Copyright 1986-2022 Xilinx, Inc. All Rights Reserved.
//==============================================================

`ifndef SV_MODULE_TOP_SV
`define SV_MODULE_TOP_SV


`timescale 1ns/1ps


`include "uvm_macros.svh"
import uvm_pkg::*;
import file_agent_pkg::*;
import multi_apuint_subsystem_pkg::*;
`include "multi_apuint_subsys_test_sequence_lib.sv"
`include "multi_apuint_test_lib.sv"


module sv_module_top;


    misc_interface              misc_if ( .clock(apatb_multi_apuint_top.AESL_clock), .reset(apatb_multi_apuint_top.AESL_
reset) );
    assign apatb_multi_apuint_top.ap_start = misc_if.tb2dut_ap_start;
    assign misc_if.dut2tb_ap_done = apatb_multi_apuint_top.ap_done;
    assign misc_if.dut2tb_ap_ready = apatb_multi_apuint_top.ap_ready;
    initial begin
        uvm_config_db #(virtual misc_interface)::set(null, "uvm_test_top.top_env.*", "misc_if", misc_if);
    end


    axi_if #(6,4,4,3,1)  axi_control_if (.clk  (apatb_multi_apuint_top.AESL_clock), .rst(apatb_multi_apuint_top.AESL_res
et));
    assign apatb_multi_apuint_top.control_AWADDR = axi_control_if.AWADDR;
    assign apatb_multi_apuint_top.control_AWVALID = axi_control_if.AWVALID;
    assign axi_control_if.AWREADY = apatb_multi_apuint_top.control_AWREADY;
    assign apatb_multi_apuint_top.control_WVALID = axi_control_if.WVALID;
    assign axi_control_if.WREADY = apatb_multi_apuint_top.control_WREADY;
    assign apatb_multi_apuint_top.control_WDATA = axi_control_if.WDATA;
    assign apatb_multi_apuint_top.control_WSTRB = axi_control_if.WSTRB;
    assign apatb_multi_apuint_top.control_ARADDR = axi_control_if.ARADDR;
    assign apatb_multi_apuint_top.control_ARVALID = axi_control_if.ARVALID;
    assign axi_control_if.ARREADY = apatb_multi_apuint_top.control_ARREADY;
    assign axi_control_if.RVALID = apatb_multi_apuint_top.control_RVALID;
    assign apatb_multi_apuint_top.control_RREADY = axi_control_if.RREADY;
    assign axi_control_if.RDATA = apatb_multi_apuint_top.control_RDATA;
    assign axi_control_if.RRESP = apatb_multi_apuint_top.control_RRESP;
    assign axi_control_if.BVALID = apatb_multi_apuint_top.control_BVALID;
    assign apatb_multi_apuint_top.control_BREADY = axi_control_if.BREADY;
    assign axi_control_if.BRESP = apatb_multi_apuint_top.control_BRESP;
    assign axi_control_if.BID = 0;
    assign axi_control_if.RID = 0;
    assign axi_control_if.RLAST = 1;
    initial begin
        uvm_config_db #( virtual axi_if#(6,4,4,3,1) )::set(null, "uvm_test_top.top_env.axi_lite_control.*", "vif", axi_c
ontrol_if);
    end


    initial begin
        run_test();
    end
endmodule
`endif

下記は、ap_hs の時の sv_module_top.sv を図示したものです。

おわりに

次回は、シナリオファイル (sim/verilog/svtb/multi_apuint_subsys_test_sequence_lib.sv) の中を覗いてみます。