ドキュメント一覧

05 フロー

コマンド

vvd synth       # 合成
vvd impl        # 配置配線。合成済みチェックポイントが無ければ先に合成する
vvd bitstream   # ビットストリーム。実装済みでなければ先に実装する
vvd flow        # 上記すべてを 1 回の Vivado 起動で実行する
vvd sim         # 論理シミュレーション

flow は Vivado の起動が 1 回で済むため高速である (起動には 20〜40 秒を要する)。 段階的にデバッグする場合は個別のコマンドを使用する。

nonproject フロー (既定)

.xpr を生成せず、チェックポイント (.dcp) を段階間の受け渡しに使用する。 生成物がすべてファイルとして残り、再現性が高いため CI に適している。

sources ──synth_design──▶ post_synth.dcp ──opt/place/phys_opt/route──▶ post_route.dcp ──▶ <top>.bit

実装は tcl/flow.tcl にある。各段階で build/reports/ にレポートを出力する。

レポート 内容
synth_utilization.rpt / impl_utilization.rpt リソース使用率
synth_timing.rpt / impl_timing.rpt タイミングサマリ
impl_drc.rpt DRC
impl_power.rpt 電力見積
impl_io.rpt I/O 割り当て

タイミング未達は失敗として扱う

Vivado はタイミング未達の場合でも終了コード 0 を返す。CI ではこの挙動が問題となる ため、vvd impl は WNS/WHS が負の場合にビルドを失敗させる。

VVD_ALLOW_TIMING_VIOLATION=1 vvd impl     # 未達を許容して続行する

フック

VVD_PRE_TCL=scripts/pre_synth.tcl     # ソース読み込み後、synth_design の前
VVD_POST_TCL=scripts/post_bit.tcl     # write_bitstream の後

フック内では tcl/lib.tcl のヘルパ (vvd::env、vvd::build_dir など) が 使用できる。

project フロー

既存の .xpr を正とするプロジェクト向けのモードである。

VVD_FLOW_MODE=project
VVD_XPR=hw/blinky.xpr

launch_runs synth_1 および launch_runs impl_1 -to_step write_bitstream を実行し、 wait_on_run で完了を待ち、生成された .bit / .ltx を build/ に収集する。 最新の状態にある run はスキップする (PROGRESS == 100% かつ NEEDS_REFRESH == 0)。

シミュレーション

vvd sim                       # ヘッドレス実行
vvd sim --gui                 # xsim の波形ビューアを開く
vvd sim --top tb_other        # トップモジュールを一時的に変更する
vvd sim --time 500us          # 実行時間を指定する
vvd sim --no-waves            # 波形を記録しない (高速)

Vivado プロジェクトを生成せず、xvlog / xvhdl / xelab / xsim を直接実行する ため、起動は 1 秒程度で完了する。unisims_ver / unimacro_ver / secureip は 常にリンクされる。

合否判定

xsim は、テストベンチが $fatal を呼んだ場合でもプロセスとしては 0 で終了する。 そのため container/sim.sh はログを走査し、Error / Fatal / $fatal / Failure: / *** FAILED / ASSERTION FAILED のいずれかが出力されていれば失敗として扱う。

テストベンチ側では、失敗時に *** FAILED: で始まる行を出力すれば確実に検出される。 同梱の examples/blinky/sim/tb_blinky.v および container/smoke/tb_smoke.v が その記述例である。

生成物のオーナーシップ

/work に書き込まれるファイルは、呼び出したユーザの uid/gid で作成される。 rootful docker では entrypoint が root から権限を降格し、rootless podman では --userns=keep-id が同一の結果をもたらす。

vvd selftest --stage identity     # 実際の所有者を確認する

VVD_USER_MODE=root を指定すると権限を降格しない。デバッグ用であり、生成物は root 所有となる。

生成物の削除

vvd clean          # build/ を削除する (確認あり)
vvd clean -f       # 確認なし
vvd clean --all    # ツールキャッシュも削除する

VVD_BUILD_DIR が絶対パスまたは .. を含む場合、vvd clean は実行を拒否する。

任意の Tcl スクリプトの実行

vvd run scripts/report_all.tcl              # vivado -mode batch -source
vvd run scripts/sweep.tcl arg1 arg2         # -tclargs として渡される
vvd tcl                                     # 対話コンソール

スクリプトはプロジェクトルート配下に配置する必要がある。それ以外の場所にある ファイルはコンテナから参照できない。tcl/lib.tcl を source するとヘルパを 使用できる。

source [file join $::env(VVD_CONTAINER_TCL) lib.tcl]
vvd::read_sources
vvd::info_ "part is [vvd::part]"