!tclでVivado HW Manager 試した環境は,ちょっと古くて,Vivado 2020.1. ターゲット→デバイスっていう関係に注意してアクセスするといい. USBで接続されているターゲットの情報は get_hw_targets # 接続されてるFPGAユニットのリストがとれる get_hw_targets {*/500202A503FAA} # で名前でフィルタリングできる で取れる.open_hw_targetで open_hw_target [get_hw_targets {*/500202A503FAA}] などとしてターゲットを開いたら, get_hw_devices でFPGAにアクセスできるようになる. get_hw_devicesは,同じ種類のFPGAがたくさんUSB接続下にいる場合, 連番のサフィックスがつくので注意. 一つしかなければ,get_hw_devicesの返り値が一つだから問題ないけど複数だとちょっと厄介. 複数でも名前でわかりやすく区別できればサフィックス以外でフィルタリングして get_hw_devices {*xcu50*} とかして選別できる. そうじゃない場合,順番気にしないといけなそうで,ちょっと面倒そう. ::例0: 接続されているアダプタの識別子リストを得る open_hw_manager connect_hw_server -allow_non_jtag puts [get_hw_targets] disconnect_hw_server close_hw_manager quit ::例1: 狙ったプログラミングアダプタに接続されたFPGA(Alveo U50)をROMから起動する プログラミングアダプタの識別子が環境変数 ADAPTER で定義されていて, その先にはAlveo U50が接続されていることを想定. open_hw_manager connect_hw_server -allow_non_jtag set adapter "" append adapter "*/" $::env(ADAPTER) set target [get_hw_targets -quiet $adapter]; # 以降 $target で参照できる if {[string equal $target ""]} { disconnect_hw_server close_hw_manager quit } open_hw_target $target; # これでターゲットに接続 set dev [current_hw_device [get_hw_devices -quiet {*50*}]]; # 念の為にAlveo U50を選別できるように ; # 以降 $dev で参照できる if {[string equal $dev ""]} { close_hw_target $target disconnect_hw_server close_hw_manager quit } boot_hw_device [lindex $dev 0]; # ROMから起動 # 後片付け close_hw_target $target disconnect_hw_server close_hw_manager quit ::例2: 狙ったプログラミングアダプタに接続されたFPGA(Alveo U50)のROMにMCSを書き込む プログラミングアダプタの識別子が環境変数 ADAPTER で定義されていて その先にはAlveo U50が接続されていること,および, 書き込むMCSファイルは環境変数 MCSFILE で定義されていること,を想定. Alveo U50想定ということで,ROMは mt25qu01g-spi-x1_x2_x4 のはず,という想定. open_hw_manager connect_hw_server -allow_non_jtag set adapter "" append adapter "*/" $::env(ADAPTER) set target [get_hw_targets -quiet $adapter]; # 以降 $target で参照できる if {[string equal $target ""]} { disconnect_hw_server close_hw_manager quit } open_hw_target $target; # これでターゲットに接続 set dev [current_hw_device [get_hw_devices -quiet {*50*}]]; # 念の為にAlveo U50を選別できるように ; # 以降 $dev で参照できる if {[string equal $dev ""]} { close_hw_target $target disconnect_hw_server close_hw_manager quit } # ここからROMの設定 create_hw_cfgmem -hw_device $dev [lindex [get_cfgmem_parts {mt25qu01g-spi-x1_x2_x4}] 0] set_property PROGRAM.ADDRESS_RANGE {use_file} [ get_property PROGRAM.HW_CFGMEM $dev] set_property PROGRAM.FILES $::env(MCSFILE) [ get_property PROGRAM.HW_CFGMEM $dev] set_property PROGRAM.PRM_FILE {} [ get_property PROGRAM.HW_CFGMEM $dev] set_property PROGRAM.UNUSED_PIN_TERMINATION {pull-none} [ get_property PROGRAM.HW_CFGMEM $dev] set_property PROGRAM.BLANK_CHECK 0 [ get_property PROGRAM.HW_CFGMEM $dev] set_property PROGRAM.ERASE 1 [ get_property PROGRAM.HW_CFGMEM $dev] set_property PROGRAM.CFG_PROGRAM 1 [ get_property PROGRAM.HW_CFGMEM $dev] set_property PROGRAM.VERIFY 1 [ get_property PROGRAM.HW_CFGMEM $dev] set_property PROGRAM.CHECKSUM 0 [ get_property PROGRAM.HW_CFGMEM $dev] # ROM書き込み用bitファイルの書き込み create_hw_bitstream -hw_device $dev [get_property PROGRAM.HW_CFGMEM_BITFILE $dev] program_hw_devices $dev # ROM書き込み program_hw_cfgmem -hw_cfgmem [ get_property PROGRAM.HW_CFGMEM $dev] # 後片付け close_hw_target $target disconnect_hw_server close_hw_manager quit