06 GUI と Tcl
Tcl コンソールと GUI は、いずれも同一のイメージとマウント構成で動作する。 両者の違いはディスプレイの受け渡し方のみである。
Tcl コンソール
vvd tcl
vivado -mode tcl が対話モードで起動する。ディスプレイは不要である。
Vivado% source $env(VVD_CONTAINER_TCL)/lib.tcl
Vivado% vvd::read_sources
Vivado% synth_design -top blinky -part xc7a35ticsg324-1L
Vivado% report_utilization
Vivado% exit
バッチ実行の場合は次のようにする。
vvd run scripts/analyze.tcl
vvd run scripts/sweep.tcl 100 200 400 # -tclargs として渡される
GUI
vvd gui # 空の IDE
vvd gui hw/blinky.xpr # プロジェクトを開く
vvd gui build/post_route.dcp # チェックポイントを開く (nonproject フローの標準手順)
vvd sim --gui # xsim の波形ビューアを開く
ディスプレイ方式
--display / VVD_DISPLAY_MODE で指定する。
| 値 | 動作 |
|---|---|
auto (既定) |
DISPLAY があれば x11、Wayland のみであれば xvfb、いずれも無い場合は none を選択する |
x11 |
X ソケット、または ssh 転送された TCP ディスプレイを使用する。実行ごとに untrusted な xauth cookie を渡す |
wayland |
XWayland の X ソケットを経由する。実体は x11 と同一である |
xvfb |
コンテナ内で Xvfb を起動する。--vnc を指定すると VNC で表示できる |
none |
ディスプレイを使用しない。vvd gui は理由を示して実行を拒否する |
X11
vvd は実行のたびに xauth nlist | sed 's/^..../ffff/' | xauth nmerge によって
untrusted な使い捨て cookie を生成し、これのみをコンテナに渡す。xhost +local: の
ようにアクセス制御全体を開放する必要はなく、cookie ファイルはコマンドの終了時に
削除される。
ホストに xauth が存在しない場合は警告を表示する。その場合は次の方法で代替する。
xhost +SI:localuser:$(id -un) # 自分のユーザだけ許可する
ssh -X 経由 (headless サーバ)
ビルドサーバに ssh -X で接続して GUI を表示する場合、DISPLAY は :0 ではなく
localhost:10.0 という TCP ディスプレイとなる。sshd は既定 (X11UseLocalhost yes)
でホストの 127.0.0.1 のみを listen するため、ブリッジネットワーク上のコンテナからは
いずれのゲートウェイアドレスを経由しても到達できない。
そのため vvd は、DISPLAY が TCP 形式の場合に自動的にホストネットワーク
(--network host) を使用する。X ソケットの mount は行わず、xauth cookie の扱いは
同一である。
ssh -X buildserver
vvd gui # --network host が自動的に付与される
このとき --jtag host の接続先も host.docker.internal から localhost へ
切り替わる。ホストのネットワーク名前空間を共有するためである。VVD_NETWORK に
別の値を設定している場合は、競合を警告する。
DISPLAY がリモートの X サーバ (10.20.30.40:0 など) を指す場合は、コンテナから
通常どおり到達できるため、特別な処理は行わない。
Wayland
Vivado は X11 専用の Qt を同梱しているため、Wayland ネイティブでは動作しない。
ほぼすべての Wayland コンポジタが XWayland を備えているため、DISPLAY が設定されて
いれば x11 方式で動作する。DISPLAY が存在しない場合は、その旨のエラーを表示する。
ヘッドレス (xvfb) と VNC
X サーバが存在しないマシンで GUI を使用する場合の方式である。
vvd gui --vnc # 127.0.0.1:5901 に公開する
vvd gui --vnc --vnc-port 5999 # ポートを変更する
vvd sim --vnc # 波形ビューアを VNC で表示する
コンテナ内で Xvfb が :99 以降の空き番号で起動し (解像度は VVD_XVFB_GEOMETRY、
既定値は 1920x1080x24)、x11vnc がこれを公開する。
既定では 127.0.0.1 のみに公開し、パスワードを必須とする。パスワードの指定が無い
場合は 1 回限りのものを生成して表示する。VVD_VNC_PASSWORD で任意のものを指定する
こともできる。
パスワードは環境変数にも引数にも格納しない。いずれも docker inspect や ps を
実行できる相手から読み取れるためである。パーミッション 0600 の一時ファイルを
read-only で mount して受け渡し、コマンドの終了時に削除する。x11vnc へは
-passwdfile で渡す。
別のマシンから接続する場合は SSH ポート転送を使用する。VNC の通信自体は暗号化 されないためである。
ssh -L 5901:127.0.0.1:5901 you@buildserver
vncviewer 127.0.0.1:5901
--vnc-bind 0.0.0.0 を指定すると全インタフェースに公開できるが、警告を表示する。
そのポートに到達できる相手は誰でも GUI を操作できる状態となる。
VNC を使用せず Xvfb のみを起動することもできる。GUI が起動すること自体を CI で 確認する場合などに使用する。
vvd --display xvfb gui
描画
既定は LIBGL_ALWAYS_SOFTWARE=1 によるソフトウェアレンダリングである。移植性が
高い一方、大規模なデバイスビューでは描画が遅い。GPU を使用する場合は次のように
指定する。
vvd --gpu gui # /dev/dri を渡す
/dev/dri が存在しない場合はエラーとなる。ホスト側の GPU ドライバとコンテナ内の
Mesa の組み合わせによっては、効果が得られない場合がある。
フォント
fontconfig と fonts-dejavu-core をイメージに含めているため、豆腐文字の
発生しない状態になっている。追加のフォントが必要な場合は、VVD_EXTRA_MOUNTS で
ホストの /usr/share/fonts を mount する。
確認
vvd doctor # ディスプレイ方式の判定結果を表示する
vvd selftest --stage display # コンテナ内から X に接続できるかを検証する