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

# はじめに

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

# 環境

 - Xilinx Vivado SDK 2017.1
 - Xilinx Vivado SDK 2018.3
 - Xilinx Vivado SDK 2019.1

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

ここで紹介する Tcl スクリプトは、Xilinx Vivado 2019.2 (Vitis) 以降では動作しません。Vivado (Vitis) で同様のことを行うには、[「Vivado(Vitis) で Zynq FSBL(First Stage Boot Loader) をビルドするTclスクリプト」](https://qiita.com/ikwzm/items/165481921c3e984a9e70)を参照してください。

# 手順

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

この 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.hdf"
set proc_name         "ps7_cortexa9_0"
set project_name      "project"
set project_directory [pwd]
set sdk_workspace     [file join $project_directory $project_name.sdk]
set app_dir           [file join $sdk_workspace $app_name]
set app_release_dir   [file join $sdk_workspace $app_name "Release"]

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

generate_app -hw $hw_design -os standalone -proc $proc_name -app $app_type -compile -dir $app_dir
file mkdir $app_release_dir
file copy  [file join $app_dir "executable.elf"] [file join $app_release_dir "fsbl.elf"]

exit
```

## hsi を実行する

hsi のバッチモードで前節の Tclスクリプトを実行します。
これでワークスペース(後述)の下の fsbl/Release に fsbl.elf が出来ていれば成功です。

```shell
Vivado% hsi -mode tcl -source build_fsbl.tcl
```

# Tclスクリプトの説明

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

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

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

set app_name          "fsbl"
set app_type          "zynq_fsbl"
set hwspec_file       "design_1_wrapper.hdf"
set proc_name         "ps7_cortexa9_0"
set project_name      "project"
set project_directory [pwd]
set sdk_workspace     [file join $project_directory $project_name.sdk]
set app_dir           [file join $sdk_workspace $app_name]
set app_release_dir   [file join $sdk_workspace $app_name "Release"]
```

### ハードウェアスペックファイルを開く

ここでワークスペースの下に事前に用意しておいたハードウェアスペックファイルを指定します。

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

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

generate_app コマンドを使ってアプリケーションプロジェクトを作り、コンパイルします。
```-hw``` オプションには前節で開いておいたハードウェアスペックファイルを指定します。


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

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

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


```Tcl:build_fsbl.tcl
file mkdir $app_release_dir
file copy  [file join $app_dir "executable.elf"] [file join $app_release_dir "fsbl.elf"]
```

# 参考

- [Generating Basic Software Platforms Reference Guide UG1138(v2014.4) November 19,2014](http://www.xilinx.com/support/documentation/sw_manuals_j/xilinx2014_4/ug1138-generating-basic-software-platforms.pdf)
- [Xilinx Software Command-Line Tool(XSCT) UG1208(v2017.1) April 5, 2017](https://xilinx.com/support/documentation/sw_manuals_j/xilinx2017_1/ug1208-xsct-reference-guide.pdf)
- [http://www.wiki.xilinx.com/Build+FSBL](http://www.wiki.xilinx.com/Build+FSBL)
- [「VivadoをGUIを使わずに実行するためのTclスクリプト達」@Qiita](http://qiita.com/ikwzm/items/a0120079d2f7f86a5904)
- [「Vivado SDK でZynq FSBL(First Stage Boot Loader)をビルドするTclスクリプト」@Qiita](http://qiita.com/ikwzm/items/e64f11844dd23bc6b90b)
- [「Vivado(Vitis) で Zynq FSBL(First Stage Boot Loader) をビルドするTclスクリプト」@Qiita](https://qiita.com/ikwzm/items/165481921c3e984a9e70)