AR# 64980

SDK - カスタム IP のドライバーを作成するための HSI 使用方法

説明

カスタム IP のドライバーを作成する目的で HSI はどのように使用できますか。

ソリューション

このアンサーでは、xparameters.h ファイルを SDK に読み込むカスタム ドライバーを作成する目的で HSI を使用する方法を説明します。

手順 1: IP パッケージャーで IP を作成

次の例では、単純な AXI スレーブ IP が作成され、MPSoC デバイスに接続されています。



デフォルトでは、IP パッケージャーが IP の単純なドライバーを生成します。ハードウェアが SDK にエクスポートされると、ドライバーはハードウェア プラットフォーム内にパッケージされます。

手順 2: HSI を使用してハードウェア デザインを確認

エクスポートされたハードウェア デザイン (HDF ファイル) は HSI を使用して確認できます。ドライバーを生成する Tcl 内でツールを使用してデザインに合わせてカスタマイズできます。

SDK からシェルを起動し、HSI を呼び出してコマンド プロンプトを表示させます。

$ hsi
****** hsi v2018.2 (64-bit)
  **** SW Build 2258646 on Thu Jun 14 20:02:38 MDT 2018
    ** Copyright 1986-2018 Xilinx, Inc. All Rights Reserved.

hsi%

  • ハードウェア デザインを開きます。

hsi% open_hw_design system.hdf
INFO: [Hsi 55-1698] elapsed time for repository loading 1 seconds
open_hw_design: Time (s): cpu = 00:00:10 ; elapsed = 00:00:12 . Memory (MB): peak = 519.324 ; gain = 194.016 ; free physical = 10326 ; free virtual = 350695
design_1_wrapper

  • デザインで IP をチェックします。

hsi% get_cells *
myip_0 ps8_0_axi_periph rst_ps8_0_99M zynq_ultra_ps_e_0 psu_axi_interconnect_0 psu_coresight_0 psu_acpu_gic psu_rcpu_gic psu_r5_tcm_ram_global psu_r5_tcm_ram_0 psu_ocm_ram_0 psu_ocm psu_r5_1_btcm psu_r5_1_btcm_global psu_r5_1_atcm psu_r5_1_atcm_global psu_r5_0_btcm_lockstep psu_r5_0_btcm psu_r5_0_btcm_global psu_r5_0_atcm_lockstep psu_r5_0_atcm psu_r5_0_atcm_global psu_bbram_0 psu_pmu_ram psu_pmu_iomodule psu_pmu_global_0 psu_mbistjtag psu_rsa psu_efuse psu_csu_wdt psu_csudma psu_smmu_gpv psu_fpd_gpv psu_cci_gpv psu_fpd_slcr_secure psu_fpd_slcr psu_smmu_reg psu_cci_reg psu_fpd_xmpu_cfg psu_apu psu_gdma_7 psu_gdma_6 psu_gdma_5 psu_gdma_4 psu_gdma_3 psu_gdma_2 psu_gdma_1 psu_gdma_0 psu_fpd_xmpu_sink psu_dpdma psu_gpu psu_dp psu_apm_5 psu_serdes psu_siou psu_afi_5 psu_afi_4 psu_afi_3 psu_afi_2 psu_afi_1 psu_afi_0 psu_crf_apb psu_pcie_dma psu_pcie_low psu_pcie_high1 psu_pcie_high2 psu_pcie psu_pcie_attrib_0 psu_sata psu_apm_0 psu_ddr_qos_ctrl psu_ddr_phy psu_ddr_xmpu5_cfg psu_ddr_xmpu4_cfg psu_ddr_xmpu3_cfg psu_ddr_xmpu2_cfg psu_ddr_xmpu1_cfg psu_ddr_xmpu0_cfg psu_adma_7 psu_adma_6 psu_adma_5 psu_adma_4 psu_adma_3 psu_adma_2 psu_adma_1 psu_adma_0 psu_ocm_xmpu_cfg psu_rtc psu_ams psu_apm_2 psu_apm_1 psu_usb_0 psu_usb_xhci_0 psu_lpd_xppu_sink psu_afi_6 psu_rpu psu_lpd_xppu psu_crl_apb psu_lpd_slcr_secure psu_lpd_slcr psu_ipi_0 psu_ipi_1 psu_ipi_2 psu_ipi_3 psu_ipi_4 psu_ipi_5 psu_ipi_6 psu_ctrl_ipi psu_message_buffers psu_iou_s psu_iou_scntrs psu_iou_scntr psu_iousecure_slcr psu_iouslcr_0 psu_r5_ddr_0 psu_ddr_0 psu_ddr_1 psu_ddrc_0 psu_sd_1 psu_wdt_0 psu_wdt_1 psu_ttc_3 psu_ttc_2 psu_ttc_1 psu_ttc_0 psu_qspi_0 psu_ethernet_3 psu_gpio_0 psu_can_1 psu_i2c_1 psu_i2c_0 psu_uart_1 psu_uart_0 psu_qspi_linear_0 psu_cortexa53_0 psu_cortexa53_1 psu_cortexa53_2 psu_cortexa53_3 psu_cortexr5_0 psu_cortexr5_1 psu_pmu_0

  • IP プロパティを取得します。

hsi% list_property [get_cells myip_0]
ADDRESS_TAG CLASS CONFIG.C_INTR_ACTIVE_STATE CONFIG.C_INTR_SENSITIVITY CONFIG.C_IRQ_ACTIVE_STATE CONFIG.C_IRQ_SENSITIVITY CONFIG.C_NUM_OF_INTR CONFIG.C_S00_AXI_ADDR_WIDTH CONFIG.C_S00_AXI_BASEADDR CONFIG.C_S00_AXI_DATA_WIDTH CONFIG.C_S00_AXI_HIGHADDR CONFIG.C_S_AXI_INTR_ADDR_WIDTH CONFIG.C_S_AXI_INTR_BASEADDR CONFIG.C_S_AXI_INTR_DATA_WIDTH CONFIG.C_S_AXI_INTR_HIGHADDR CONFIG.Component_Name CONFIG.EDK_IPTYPE CONFIGURABLE DRIVER_MODE HIER_NAME IP_NAME IP_TYPE IS_HIERARCHICAL IS_PL NAME PRODUCT_GUIDE SLAVES VLNV

  • IP ピンを取得します。

get_pins -of_objects [get_cells myip_0]
s00_axi_awaddr s00_axi_awprot s00_axi_awvalid s00_axi_awready s00_axi_wdata s00_axi_wstrb s00_axi_wvalid s00_axi_wready s00_axi_bresp s00_axi_bvalid s00_axi_bready s00_axi_araddr s00_axi_arprot s00_axi_arvalid s00_axi_arready s00_axi_rdata s00_axi_rresp s00_axi_rvalid s00_axi_rready s00_axi_aclk s00_axi_aresetn irq s_axi_intr_awaddr s_axi_intr_awprot s_axi_intr_awvalid s_axi_intr_awready s_axi_intr_wdata s_axi_intr_wstrb s_axi_intr_wvalid s_axi_intr_wready s_axi_intr_bresp s_axi_intr_bvalid s_axi_intr_bready s_axi_intr_araddr s_axi_intr_arprot s_axi_intr_arvalid s_axi_intr_arready s_axi_intr_rdata s_axi_intr_rresp s_axi_intr_rvalid s_axi_intr_rready s_axi_intr_aclk s_axi_intr_areset

  • IP クロック ピンを取得します。

get_pins -of_objects [get_cells myip_0] -filter TYPE==clk

s00_axi_aclk_axi_intr_aclk

  • ピン プロパティを獲得します。

list_property [get_pins s00_axi_aclk]
CLASS CLK_FREQ DIRECTION INTERFACE IRQID IS_CONNECTED LEFT NAME RIGHT SENSITIVITY TYPE

  • ピン プロパティ値を獲得します。

get_property CLK_FREQ [get_pins s00_axi_aclk]
99990000

  • 割り込みピンが割り込みコントローラーに接続されているかチェックします。

hsi% set int_pin [get_pins -of_objects [get_cells myip_0] -filter TYPE==INTERRUPT]
irq
hsi% set intc_type [:hsi::utils::get_connected_intr_cntrl myip_0 $int_pin]

HSI コマンドの詳細は、(UG1138) を参照してください。


手順 3: ドライバー Tcl ファイルをアップデート

開発フローの一環としてハードウェア プラットフォームのドライバー内でカスタム IP の Tcl スクリプトを変更します。 

ドライバーでの変更は、ハードウェア プロジェクトで生成した BSP にのみ適用されますが、いったん安定すると、この変更は Vivado で作成された IP リポジトリにエクスポートできます。

proc generate {drv_handle} {
        xdefine_include_file $drv_handle "xparameters.h" "myip" "NUM_INSTANCES" "DEVICE_ID"  "C_S00_AXI_BASEADDR" "C_S00_AXI_HIGHADDR"

        #Custom Diver handler
        set periph_name [get_property IP_NAME [get_cells  $drv_handle]]
        set found [string first $periph_name $drv_handle]
        if {$found != -1} {
                set ip_name [string toupper [string range $drv_handle $found [string length $drv_handle]]]
        } else {
                set ip_name [string toupper $drv_handle]
        }

        set file_handle [::hsi::utils::open_include_file xparameters.h]
        puts $file_handle "/* This is from the custom addition $ip_name */"

        set clk_pins [get_pins -of_objects [get_cells $drv_handle] -filter TYPE==clk]
        for {set i 0} {$i < [llength $clk_pins]} {incr i} {
                set clk_freq [get_property CLK_FREQ [lindex $clk_pins $i]]
                set clk_name [string toupper [get_property NAME [lindex $clk_pins $i]]]
                puts $file_handle "\#define XPAR_${ip_name}_${clk_name} $clk_freq"
        }

        set int_pin [get_pins -of_objects [get_cells $drv_handle] -filter TYPE==INTERRUPT]
        set intc_periph_type [::hsi::utils::get_connected_intr_cntrl myip_0 $int_pin]
        if {$intc_periph_type != ""} {
                puts $file_handle "\#define XPAR_${ip_name}_INTERRUPT_CONNECTED 1"
        } else {
                puts $file_handle "\#define XPAR_${ip_name}_INTERRUPT_CONNECTED 0"
        }

        close $file_handle
}


Tcl スクリプトのカスタム コードは次のことを実行します。


  • xparameters.h ファイルを開く。
  • drv_handler を使用して IP を検索する。IP がサブブロックにある場合は、ドライバー名のみを使用。
  • カスタム IP のクロック ピンをすべて取得し、これらをヘッダー ファイルに出力。
  • カスタム IP の割り込みが接続されていて、これがヘッダー ファイルに出力されることをチェックする。
  • ヘッダー ファイルを閉じる。

手順 4: BSP をテスト

Tcl スクリプトの準備ができたら、BSP プロジェクトを作成して、カスタム IP のドライバーが正しく生成されているかどうかチェックします。




BSP の xparameters.h ファイルにはカスタマイズされた値が含まれています。


/* This is from the custom addition MYIP_0 */
#define XPAR_MYIP_0_S00_AXI_ACLK 99990000
#define XPAR_MYIP_0_S_AXI_INTR_ACLK 99990000
#define XPAR_MYIP_0_INTERRUPT_CONNECTED 1


手順 5: Vivado リポジトリに統合する

カスタム ドライバーを Vivado に統合するには、IP が保存されている ip_repo フォルダーに Tcl スクリプトをコピーするだけです。

こうすると Vivado 内で IP が変更されるので、新しいドライバーを統合するためにデザインをアップデートします。 

こうしておくと、カスタム IP を使用してハードウェアをエクスポートするたびに、この新しいスクリプトが使用されます。

アンサー レコード リファレンス

マスター アンサー レコード

Answer Number アンサータイトル 問題の発生したバージョン 修正バージョン
66297 SDK - デザイン アシスタント N/A N/A
AR# 64980
日付 08/20/2018
ステータス アクティブ
種類 ソリューション センター
ツール