ドキュメント一覧

07 JTAG

3 種類の転送方式

--jtag / VVD_JTAG_MODE で指定する。

値 hw_server の場所 コンテナに渡す権限
host (既定) ホスト なし。TCP 接続のみを行う
remote:HOST[:PORT] 指定したマシン なし。TCP 接続のみを行う
usb コンテナ内 該当する USB デバイスノードのみを渡す
none — —

既定の host が最も安全であり、通常はこれを使用する。コンテナにはデバイスも ケーパビリティも一切渡らない。--privileged はいずれのモードでも使用しない。

host モード

ホスト上で hw_server を起動し、コンテナからそこへ TCP で接続する。

# ホスト側 (一度だけ)
source /tools/Xilinx/Vivado/2025.2/settings64.sh
hw_server &
vvd program                    # 既定でこの経路を使用する
vvd program --list             # スキャンチェーンの列挙のみを行う

コンテナ内からは host.docker.internal (docker) または host.containers.internal (podman) で解決される。docker では --add-host ...:host-gateway が自動的に付与される。

ホストに Vivado が導入されていない場合は、USB を渡したコンテナで hw_server を 起動し、そのポートを公開できる。

vvd hw-server                       # 127.0.0.1:3121 で待ち受ける
vvd hw-server --bind 0.0.0.0        # 他マシンからも到達可能にする (誰でも書き込める点に注意)

remote モード

ラボの共有マシンや CI のハードウェアランナーへ接続する場合に使用する。

vvd --jtag remote:lab-01.example.com:3121 program
# vvd.local.conf
VVD_JTAG_MODE=remote:lab-01.example.com
VVD_HW_SERVER_PORT=3121

usb モード

ケーブルをコンテナへ直接渡す方式である。簡便だが、host モードより広い権限を 必要とする。

vvd --jtag usb program

lsusb の出力を参照し、既知のベンダ ID を持つデバイスの /dev/bus/usb/<bus>/<dev> のみを --device で渡す。

VID ケーブル
0403 FTDI 系。Digilent HS1/HS2/HS3、JTAG-SMT2/SMT3、Arty/Nexys のオンボード
03fd Xilinx Platform Cable USB / USB II (DLC9, DLC10)
1443 Digilent (旧 VID)
1d50 一部のオープンハードウェアのアダプタ

制約として、USB のバス番号およびデバイス番号は抜き差しによって変化する。ケーブルを 接続し直した場合はコンテナを再起動する必要がある。これを回避するには host モードを 使用するか、次のように USB ツリー全体を明示的に渡す。

VVD_JTAG_USB_ALL=1 vvd --jtag usb program     # 全 USB デバイスが見える (警告を表示する)

udev ルール

デバイスノードを一般ユーザで開けるようにするための設定である。ホスト側の設定で あり、これによって Vivado もコンテナも root で実行する必要がなくなる。

vvd jtag-rules --print     # 内容を確認する
vvd jtag-rules --install   # /etc/udev/rules.d/ に導入する (sudo)
vvd jtag-rules --list      # 現在接続されているケーブルを表示する

導入後はケーブルを接続し直す。ルールは uaccess タグ (ローカルログインセッションの ユーザに付与される) と plugdev グループの両方を設定するため、いずれの運用にも 対応する。

デバイスへの書き込み

vvd program                                 # build/<top>.bit
vvd program --bit build/other.bit
vvd program --target xc7a35t_0              # スキャンチェーンに複数デバイスがある場合
vvd program --probes build/blinky.ltx       # ILA/VIO のプローブを指定する
vvd program --list                          # 列挙のみ

tcl/program.tcl が connect_hw_server → open_hw_target → program_hw_devices を実行し、最後に DONE ビットを確認する。到達できない場合や ターゲットが存在しない場合は、原因と対処方法を示して失敗する。

確認

vvd doctor                   # hw_server の待ち受け、ケーブル、パーミッションを検査する
vvd selftest --stage jtag    # 実際に接続してスキャンチェーンを読み取る

vvd selftest の JTAG ステージは、ケーブルが接続されていない場合や hw_server が 起動していない場合、失敗ではなく skip として扱う。ハードウェアの有無によって CI が 失敗しないようにするためである。

よくあるエラー

症状 対処
cannot reach hw_server at TCP:host.docker.internal:3121 ホストで hw_server が起動していない。vvd doctor で確認できる
no JTAG target is attached ケーブル、ボードの電源、udev ルールを確認する
no JTAG cable found on the USB bus vvd jtag-rules --list で認識状況を確認する。接続し直した場合はコンテナを再起動する
抜き差し後に動作しない (usb モード) デバイス番号が変化している。コンテナを再起動する
権限エラー vvd jtag-rules --install を実行し、ケーブルを接続し直す