LoginSignup
13
17

More than 3 years have passed since last update.

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

Last updated at Posted at 2015-12-22

はじめに

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

環境

  • Xilinx Vivado SDK 2015.4
  • Xilinx Vivado SDK 2016.4

ここで紹介する Tcl スクリプトは、Xilinx Vivado SDK 2017.1 以降では動作しません。Xilinx Vivado SDK 2017.1 で同様のことを行うには、「Vivado SDK でZynq FSBL(First Stage Boot Loader)をビルドするTclスクリプト(hsi編)」を参照してください。

手順

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

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

Tclスクリプトを用意する

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

build_fsbl.tcl
#!/usr/bin/tclsh

set app_name            "fsbl"
set app_type            {Zynq FSBL}
set bsp_name            "fsbl_bsp"
set hw_name             "design_1_wrapper_hw_platform_0"
set hwspec_file         "design_1_wrapper.hdf"
set proc_name           "ps7_cortexa9_0"
set project_directory   [file dirname [info script]]
set workspace           [file join $project_directory "project.sdk"]

if {[info commands sdk::setws] ne ""} {
    sdk::setws        $sdk_workspace
} else {
    sdk set_workspace $sdk_workspace
}

if {[info commands sdk::createhw] ne ""} {
    sdk::createhw         -name $hw_name -hwspec [file join $sdk_workspace $hwspec_file]
} else {
    sdk create_hw_project -name $hw_name -hwspec [file join $sdk_workspace $hwspec_file]
}

hsi::open_hw_design  [file join $workspace $hw_name "system.hdf"]
hsi::create_sw_design $bsp_name -proc $proc_name -os standalone
hsi::add_library xilffs
hsi::generate_bsp -sw $bsp_name -dir [file join $workspace $bsp_name] -compile
hsi::close_sw_design  $bsp_name

if {[info commands sdk::createapp] ne ""} {
    sdk createapp          -name $app_name -hwproject $hw_name -proc $proc_name -os standalone -lang C -app $app_type -bsp $bsp_name
} else {
    sdk create_app_project -name $app_name -hwproject $hw_name -proc $proc_name -os standalone -lang C -app $app_type -bsp $bsp_name
}

if {[info commands sdk::projects] ne ""} {
    sdk projects -build
} else {
    sdk build_project $app_name
}

exit

Vivado SDK を実行する

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

Vivado% xsdk -batch -source build_fsbl.tcl

Tclスクリプトの説明

各種定数を定義しておく

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

build_fsbl.tcl

set app_name            "fsbl"
set app_type            {Zynq FSBL}
set bsp_name            "fsbl_bsp"
set hw_name             "design_1_wrapper_hw_platform_0"
set hwspec_file         "design_1_wrapper.hdf"
set proc_name           "ps7_cortexa9_0"

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

Vivado SDK はワークスペースを設定する必要があります。
ここでは Tclスクリプトのあるディレクトリの下の project.sdk という名前のディレクトリをワークスペースとして設定します。
SDK 2016.1 あたりから set_workspace コマンドではなく setws コマンドを使うことが推奨されているので、setws コマンドが存在するならばそちらを使うようにしています。

build_fsbl.tcl
set project_directory   [file dirname [info script]]
set workspace           [file join $project_directory "project.sdk"]
if {[info commands sdk::setws] ne ""} {
    sdk setws         $sdk_workspace
} else {
    sdk set_workspace $sdk_workspace
}

ハードウェアプラットフォームプロジェクトを作る

ここでワークスペースの下に事前に用意しておいたハードウェアスペックファイルを指定します。
SDK 2016.1 あたりから create_hw_project コマンドではなく createhw コマンドを使うことが推奨されているので、createhw コマンドが存在するならばそちらを使うようにしています。

build_fsbl.tcl
if {[info commands sdk::createhw] ne ""} {
    sdk createhw          -name $hw_name -hwspec [file join $sdk_workspace $hwspec_file]
} else {
    sdk create_hw_project -name $hw_name -hwspec [file join $sdk_workspace $hwspec_file]
}

BSP(Board Support Package)プロジェクトを作る

BSPプロジェクトを作るにはちょっとしたコツ(というかVivado SDK のバグ回避?)が必要です。
本来なら、次のように create_bsp_project コマンドを使ってプロジェクトを作るのがスジなのですが、

build_fsbl.tcl
sdk create_bsp_project -name $bsp_name -hwproject $hw_name -proc $proc_name -os standalone

何故か Vivado SDK 2015.4(以前)のバージョンでは、次のフェーズのアプリケーションプロジェクト生成時に次のようなメッセージが出て失敗します。

BSP project 'fsbl_bsp' created successfully.
Specified template name 'Zynq FSBL' is not valid for configuration. Reason: This
 application requires xilffs and xilrsa libraries in the Board Support Package..
 List of valid names are Empty Application, Zynq DRAM tests, Peripheral Tests, H
ello World, Memory Tests, Dhrystone.
Failed to create Application project 'fsbl'.
Failed to create Application project fsbl.
    while executing
"error [dict get $msg err]"
    (procedure "xsdk_eval" line 15)
    invoked from within
"xsdk_eval $chan createProject "o{$fmt}" e [list $data]"
    (procedure "::xsdb::sdk::create_app_project" line 43)
    invoked from within
"sdk create_app_project -name $app_name -hwproject $hw_name -proc $proc_name -os
 standalone -lang C -app $app_type -bsp $bsp_name"

どうやら、xilffs と xilrsa というライブラリが無いと言っているようです。
ここで躓きましたが、こちら(AR# 63384)に解決策が載っていました。
次のように BSP(Board Support Package)プロジェクトに xilffs ライブラリを(強引に?)追加してやれば、上手くいくようです。

build_fsbl.tcl
hsi::open_hw_design  [file join $workspace $hw_name "system.hdf"]
hsi::create_sw_design $bsp_name -proc $proc_name -os standalone
hsi::add_library xilffs
hsi::generate_bsp -sw $bsp_name -dir [file join $workspace $bsp_name] -compile
hsi::close_sw_design  $bsp_name

create_bsp_project を使わずに、まずは create_sw_design でソフトウェアプロジェクトを作って xilffs ライブラリを追加してから generate_bsp で BSP(Board Support Package)プロジェクトを作るようです。

アプリケーションプロジェクトを作る

create_app_project を使ってアプリケーション(Zynq FSBL)プロジェクトを作ります。
SDK 2016.1 あたりから create_app_project コマンドではなく createapp コマンドを使うことが推奨されているので、createapp コマンドが存在するならばそちらを使うようにしています。

build_fsbl.tcl
if {[info commands sdk::createapp] ne ""} {
    sdk createapp          -name $app_name -hwproject $hw_name -proc $proc_name -os standalone -lang C -app $app_type -bsp $bsp_name
} else {
    sdk create_app_project -name $app_name -hwproject $hw_name -proc $proc_name -os standalone -lang C -app $app_type -bsp $bsp_name
}

FSBLをビルドする

build_project を使ってアプリケーション(Zynq FSBL)プロジェクトをビルドします。
SDK 2016.1 以降、build_project コマンドではなく projects -build コマンドを使用しなければなりません。

build_fsbl.tcl
if {[info commands sdk::projects] ne ""} {
    sdk projects -build
} else {
    sdk build_project $app_name
}

参考

13
17
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
17