トップ 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

Diary/2022-11-3

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