Vivado(Vitis) で Zynq FSBL(First Stage Boot Loader) をビルドするTclスクリプト

# はじめに

Xilinx 社のFPGA開発環境の Vivado(Vitis)、いちいち GUI でマウスボタンをポチポチするのは面倒です。
Vivado(Vitis) は Tcl スクリプトでバッチ処理が出来るので、決まり切った仕事なら Tcl スクリプトを書いて処理させたほうが楽です。
この記事では、Vivado(Vitis) で Zynq の FSBL(First Stage Boot Loader)を自動的に生成するスクリプトを紹介します。

# 環境

 - Xilinx Vivado 2019.2 (Vitis)

[「Vivado SDK でZynq FSBL(First Stage Boot Loader)をビルドするTclスクリプト」](https://qiita.com/ikwzm/items/e64f11844dd23bc6b90b) および [「Vivado SDK でZynq FSBL(First Stage Boot Loader)をビルドするTclスクリプト(hsi編)」](https://qiita.com/ikwzm/items/a0120079d2f7f86a5904) で紹介した Tcl スクリプトでは Vivado 2019.2 (Vitis) 以降では動作しません。Vivado(Vitis) で同様のことを行うには、ここで紹介する xsct コマンドを使います。(ちなみに xsct とは Xilinx Software Command line Tool だそうです。)

# 手順

## ハードウェアスペックファイルを用意しておく

この Tcl スクリプトではワークスペース(後述)の下にハードウェアスペックファイルを用意しておく必要があります。通常は Vivado でインプリメンテーションした後、Export > Export Hardware... でハードウェアスペックファイルを作ります。また、こちらの記事([「Vivadoでハードウェア情報をエクスポートするTclスクリプト」](http://qiita.com/ikwzm/items/057d67d4a9e0828663cf))も参考にしてください。

## Tclスクリプトを用意する

まずはスクリプト全体を示します。

```Tcl:build_fsbl.tcl
#!/usr/bin/tclsh

set app_name            "fsbl"
set app_type            "zynq_fsbl"
set hwspec_file         "design_1_wrapper.xsa"
set proc_name           "ps7_cortexa9_0"
set project_name        "project"
set project_directory   [file dirname [info script]]
set sdk_workspace       [file join $project_directory $project_name.sdk]
set app_dir             [file join $sdk_workspace $app_name]
set app_release_elf     $app_name.elf
set app_release_dir     $project_directory

setws $sdk_workspace

set hw_design           [hsi::open_hw_design [file join $sdk_workspace $hwspec_file]]

hsi::generate_app -hw $hw_design -os standalone -proc $proc_name -app $app_type -compile -dir $app_dir

file copy -force [file join $app_dir "executable.elf"] [file join $app_release_dir $app_release_elf]

exit
```

## xsct を実行する

Vivado(Vitis) の xsct で前節の Tclスクリプトを実行します。これで fsbl.elf が出来ていれば成功です。

```console
Vivado% xsct build_fsbl.tcl
```

# Tclスクリプトの説明

## 各種定数を定義しておく

まずは様々な定数を定義しておきます。
この例ではハードウェアスペックファイルの名前を design_1_wrapper.xsa としていますが、実際には Vivado で Export した時のファイル名を設定します。

```Tcl:build_fsbl.tcl
set app_name            "fsbl"
set app_type            "zynq_fsbl"
set hwspec_file         "design_1_wrapper.xsa"
set proc_name           "ps7_cortexa9_0"
set project_name        "project"
set project_directory   [file dirname [info script]]
set sdk_workspace       [file join $project_directory $project_name.sdk]
set app_dir             [file join $sdk_workspace $app_name]
set app_release_elf     $app_name.elf
set app_release_dir     $project_directory
```

## ワークスペースを設定する

Vivado(Vitis) はワークスペースを設定する必要があります。
ここでは Tclスクリプトのあるディレクトリの下の project.sdk という名前のディレクトリをワークスペースとして設定します。

```Tcl:build_fsbl.tcl
setws $sdk_workspace
```

## プラットフォームプロジェクトを作る

ここでワークスペースの下に事前に用意しておいたハードウェアスペックファイルを指定します。hsi::open_hw_design コマンドを使ってプラットフォームプロジェクトを作り hw_design 変数にセットしておきます。

```Tcl:build_fsbl.tcl
set hw_design           [hsi::open_hw_design [file join $sdk_workspace $hwspec_file]]
```

## アプリケーションプロジェクトをビルドする

hsi::generate_app コマンドを使ってアプリケーション(zynq_fsbl)を作ります。-compile オプションを指定することで、プロジェクトを作るだけでなくビルドもやってくれます。

```Tcl:build_fsbl.tcl
hsi::generate_app -hw $hw_design -os standalone -proc $proc_name -app $app_type -compile -dir $app_dir
```

## 生成した executable.elf を fsbl.elf にコピーする

hsi::generate_app コマンドが成功すると、app_dir で指定したディレクトリに executable.elf というファイルが出来ます。これが目的の fslb.elf です。このファイルを app_release_dir で指定したディレクトリに fsbl.elf としてコピーします。

```Tcl:build_fsbl.tcl
file copy -force [file join $app_dir "executable.elf"] [file join $app_release_dir $app_release_elf]
```

# 参考

- [「Vitis 統合ソフトウェアプラットフォームの資料」UG1400(v2019.2)2019年11月11日](https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2019_2/ug1400-vitis-embedded.pdf)
- [「VivadoをGUIを使わずに実行するためのTclスクリプト達」@Qiita](http://qiita.com/ikwzm/items/a0120079d2f7f86a5904)
- [「Vivado SDK でZynq FSBL(First Stage Boot Loader)をビルドするTclスクリプト」@Qiita](https://qiita.com/ikwzm/items/e09fab6b17986471cbda)
- [「Vivado SDK でZynq FSBL(First Stage Boot Loader)をビルドするTclスクリプト(hsi編)」@Qiita](https://qiita.com/ikwzm/items/e09fab6b17986471cbda)