ドキュメント一覧

08 CI

何をテストできるか

CI ランナーに Vivado が導入されていない場合が一般的であるため、必要な前提条件に 応じてテストを 3 段階に分けている。

段階 Vivado ライセンス ハードウェア 実行環境
lint + 単体テスト 不要 不要 不要 通常のランナー
イメージ + 可用性テスト 不要 不要 不要 通常のランナー
フルセルフテスト + 実フロー 必要 必要 任意 セルフホストランナー

同梱の .github/workflows/ci.yml はこの 3 ジョブ構成である。

単体テスト

make check      # ピン留め検証 + shellcheck + hadolint + Tcl 構文 + bats

bats のテストは、コンテナエンジンのスタブを PATH に配置し、vvd が組み立てる コマンドラインをそのまま検証する。検証対象はマウント構成、ライセンス注入、 ディスプレイ方式、JTAG 方式、権限、およびエラー時の終了コードである。

可用性テスト (Vivado なし)

Vivado が存在しない環境でも、コンテナの実体を検証できる。

VVD_VIVADO_MODE=none VVD_DISPLAY_MODE=xvfb vvd selftest

VVD_VIVADO_MODE=none は、このコンテナに Vivado が存在しないことを宣言する指定で ある。ホスト側の Vivado 探索を行わず、Vivado を必要とするステージを skip する。

ステージ Vivado 不在時 内容
image 実行 イメージが存在し、entrypoint が動作する
libs 実行 Vivado が dlopen する共有ライブラリ 22 個がすべて解決する
identity 実行 /work に作成されたファイルが呼び出しユーザの所有となる
display 実行 コンテナ内から X ディスプレイに接続できる
env skip vivado / xsim / hw_server が PATH に含まれる
version skip vivado -version が期待バージョンを返す
tcl skip Tcl スクリプトが完走し、/work に書き込める
license skip ライセンスがコンテナから参照できる
sim skip 同梱のスモークテストベンチが PASS する
synth skip 同梱のスモーク設計が合成できる
jtag skip hw_server に接続してスキャンチェーンを読み取る

前提条件が満たされないステージは、失敗ではなく skip として扱う。ただし mount / image モードで Vivado が見つからない場合は、意図しない環境の不整合であるため失敗と して扱う。VVD_SELFTEST_REQUIRE_VIVADO=0 を指定すれば skip に変更できる。

libs ステージは実用上の効果が大きい。Vivado は GUI や特定の IP フローに入って初めて ライブラリを dlopen するため、共有ライブラリの欠落は数十分を要する合成の最終段階で 表面化しやすい。このステージはそれを起動直後に検出する。

セルフホストランナー

Vivado、ライセンス、ケーブルを備えたマシンに vivado ラベルを付与して登録し、 リポジトリ変数を設定する。

変数 例
VVD_HW_RUNNER true (このジョブを有効化する値)
VVD_LICENSE 2100@license.example.com
VVD_XILINX_ROOT /tools/Xilinx
runs-on: [self-hosted, vivado]
steps:
  - run: ./bin/vvd build
  - run: ./bin/vvd doctor --deep || true
  - run: ./bin/vvd -C examples/blinky selftest
  - run: ./bin/vvd -C examples/blinky sim
  - run: ./bin/vvd -C examples/blinky flow

自身のプロジェクトへの組み込み

サブモジュールとして取り込んでいる場合:

- uses: actions/checkout@<commit-sha>       # v6.0.3
  with:
    submodules: recursive

- name: Build the container image
  run: ./tools/vvd/bin/vvd build

- name: Simulate
  env:
    VVD_LICENSE: $
  run: ./tools/vvd/bin/vvd sim

- name: Synthesise and implement
  env:
    VVD_LICENSE: $
  run: ./tools/vvd/bin/vvd flow

- uses: actions/upload-artifact@<commit-sha>   # v4.6.2
  if: always()
  with:
    name: reports
    path: |
      build/reports/
      build/logs/
      build/*.bit

タイミング未達は vvd impl が失敗として扱うため、追加の判定は不要である。 未達を許容する場合は VVD_ALLOW_TIMING_VIOLATION=1 を指定する。

キャッシュ

VVD_CACHE_DIR (既定値は $XDG_CACHE_HOME/vivado-container-suite) がコンテナの $HOME となる。IP のキャッシュやツール設定がここに保存されるため、ランナー間で 共有するとビルド時間を短縮できる。

- uses: actions/cache@<commit-sha>
  with:
    path: ~/.cache/vivado-container-suite
    key: vvd-cache-$-$

ピン留めのドリフト検出

lock-drift ジョブが make lock-check を実行し、上流のイメージダイジェストや apt スナップショットとロックファイルの差分を報告する。continue-on-error: true を指定 しているため、上流の更新のみでプルリクエストが失敗することはなく、ロックファイルの 更新をレビュー可能な差分として扱える。

make lock          # ロックファイルを更新する (要ネットワーク)

デバッグ

vvd --dry-run flow      # 実行されるコンテナコマンドを表示する
vvd -v flow             # デバッグログを出力する
vvd info --all --cmd    # 解決済みの設定とコマンド全体を表示する