1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Vivado でプロジェクトを作る Tcl スクリプト(2025年版)

1
Last updated at Posted at 2026-05-18

はじめに

Xilinx 社のFPGA開発環境の Vivado、いちいち GUI でマウスボタンをポチポチするのは面倒です。
Vivado は Tcl スクリプトでバッチ処理が出来るので、決まり切った仕事なら Tcl スクリプトを書いて処理させたほうが楽です。
この記事では、Vivado で新しいプロジェクトを作る Tclスクリプトを解説します。

環境

  • Xilinx Vivado 2015.4
  • Xilinx Vivado 2016.4
  • Xilinx Vivado 2017.1
  • Xilinx Vivado 2017.2
  • Xilinx Vivado 2018.3
  • Xilinx Vivado 2019.1
  • Xilinx Vivado 2019.2 (Vitis)
  • Xilinx Vivado 2023.1
  • Xilinx Vivado 2025.1

Tclスクリプトの説明

1 新しい空のプロジェクトを作る

まずまっさらのプロジェクトを作ります。
変数 project_name にプロジェクト名を、変数 project_directory にプロジェクトを生成するディレクトリを設定しておきます。
この例では、project_name に "project" を、project_directory にTclスクリプトのあるディレクトリを指定しています。

create_project.tcl
set project_directory   [file dirname [info script]]
set project_name        "project"

cd $project_directory
create_project -force $project_name $project_directory

お好みで project_directory をカレントディレクトリにします。project_directory をカレントディレクトリにしておいた方が、間違いがなくて良いでしょう。

create_project のオプションに -force を付けているので、もしすでにプロジェクトが存在していた場合、すでにあったプロジェクトは削除されることに注意してください。

2 プロジェクトにプロパティを設定する

2.1 プロジェクトにボードまたはデバイスを設定する

プロジェクトにボードまたはデバイスを設定します。
変数 board_part にボードの名前を設定するか、変数 device_part にデバイス名を設定します。
この例では board_part に Xilinx社のZC706評価ボードを指定しています。

create_project.tcl
set board_part "xilinx.com:zc706:part0:1.2"

どのようなボードが指定できるかは get_board_parts コマンドで調べることが出来ます。
また、次のようにすればワイルドカードを使って最新のボード情報を指定する事が出来ます。

create_project.tcl
set board_part [get_board_parts -quiet -latest_file_version "*zc706*"]

変数 board_part が設定されている場合は、そちらを優先するようにしています。もし変数 board_part も 変数 device_part も設定されていなかった場合はエラーで終了します。

create_project.tcl
if       {[info exists board_part ] && [string equal $board_part  "" ] == 0} {
    set_property "board_part"     $board_part      [current_project]
} elseif {[info exists device_part] && [string equal $device_part "" ] == 0} {
    set_property "part"           $device_part     [current_project]
} else {
    puts "ERROR: Please set board_part or device_part."
    return 1
}

2.2 IP リポジトリを設定する

ユーザーが作った IP を使えるように、IPリポジトリを追加します。
変数 ip_repo_path_list に追加した IP が格納されているディレクトリをリスト形式で設定します。
この例ではプロジェクトのあるディレクトリと同じ階層にある ip ディレクトリを指定しています。

create_project.tcl
set     ip_repo_path_list   {}
lappend ip_repo_path_list   [file join $project_directory "ip"]

変数 ip_repo_path_list が存在し、かつ要素を1以上持つリストの場合、プロジェクトに変数 ip_repo_path_list に格納されている IP リポジトリをプロジェクトに追加します。

create_project.tcl
if {[info exists ip_repo_path_list] && [llength $ip_repo_path_list] > 0 } {
    set_property ip_repo_paths $ip_repo_path_list [current_fileset]
    update_ip_catalog
}

2.3 デフォルトライブラリや言語などのプロパティを設定する

create_project.tcl
set_property "default_lib"        "xil_defaultlib" [current_project]
set_property "simulator_language" "Mixed"          [current_project]
set_property "target_language"    "VHDL"           [current_project]

3 ファイルセットを生成する

Vivado では各種入力ファイル(HDLや設定ファイルなど)をファイルセットで管理しています。ここではまず空のファイルセットをプロジェクトに生成します。

3.1 ファイルセット sources_1 を生成する

HDLやブロックデザインなど論理合成可能な各種ソースコードを管理するためのファイルセット sources_1 を新たに生成します。

create_project.tcl
if {[string equal [get_filesets -quiet sources_1] ""]} {
    create_fileset -srcset sources_1
}

3.2 ファイルセット constrs_1 を生成する

タイミング設定ファイルやピンアサイン指定ファイルを管理するためのファイルセット constrs_1 を新たに生成します。

create_project.tcl
if {[string equal [get_filesets -quiet constrs_1] ""]} {
    create_fileset -constrset constrs_1
}

3.3 ファイルセット sim_1 を生成する

シミュレーション用のファイルを管理するためのファイルセット sim_1 を新たに生成します。ここにはシミュレーション用のテストベンチや各種設定ファイルを格納します。

create_project.tcl
if {[string equal [get_filesets -quiet sim_1] ""]} {
    create_fileset -simset sim_1
}

4 Design Run を生成する

Vivado では論理合成(Synthesis)と配置配線(Implementation)の各工程を Design Run という単位で管理しています。この Design Run 毎に各種設定および実行します。

4.1 Synthesis 用 Design Run synth_1 を生成する

論理合成(Synthesis)用の Design Run synth_1 を生成します。ここで論理合成時のオプションを指定します。どのようなオプションを指定できるかはマニュアルなどを参照してください。-constrset オプションで、3.2 で生成したファイルセット constrs_1 と関連づけています。

create_project.tcl
set synth_1_flow     "Vivado Synthesis 2020"
set synth_1_strategy "Vivado Synthesis Defaults"
if {[string equal [get_runs -quiet synth_1] ""]} {
    create_run -name synth_1 -flow $synth_1_flow -strategy $synth_1_strategy -constrset constrs_1
} else {
    set_property flow     $synth_1_flow     [get_runs synth_1]
    set_property strategy $synth_1_strategy [get_runs synth_1]
}
current_run -synthesis [get_runs synth_1]

4.2 Implementation 用 Design Run impl_1 を生成する

配置配線やビットストリーム生成用の Design Run impl_1 を生成します。-parent_run オプションで論理合成(Synthesis)用の Design Run と関連づけています。-constrset オプションで、3.2 で生成したファイルセット constrs_1 と関連づけています。

create_project.tcl
set impl_1_flow      "Vivado Implementation 2020"
set impl_1_strategy  "Vivado Implementation Defaults"
if {[string equal [get_runs -quiet impl_1] ""]} {
    create_run -name impl_1 -flow $impl_1_flow -strategy $impl_1_strategy -constrset constrs_1 -parent_run synth_1
} else {
    set_property flow     $impl_1_flow      [get_runs impl_1]
    set_property strategy $impl_1_strategy  [get_runs impl_1]
}
current_run -implementation [get_runs impl_1]

5 各種ファイルを追加する

ファイルセットに各種ファイルを追加します。

5.1 constrs_1 に設定ファイルを追加する

変数 constrs_file_list に設定ファイルをリスト形式で設定します。
この例ではプロジェクトのあるディレクトリと同じ階層にある "design_1_pin.xdc" を指定しています。

create_project.tcl
set constrs_file_list       [list [file join $project_directory "design_1_pin.xdc" ]]

変数 constrs_file_list が存在し、かつ要素を1以上持つリストの場合、constrs_file_list に格納されているファイルをファイルセット constrs_1 に追加します。

create_project.tcl
if {[info exists constrs_file_list] && [llength $constrs_file_list] > 0 } {
    add_files    -fileset constrs_1 -norecurse $constrs_file_list
}

5.2 sources_1 に Block Design を追加する

この例では、変数 design_bd_tcl_file にファイル名が設定されていた場合、ファイルセット sources_1 に Block Design を追加して、さらにラッパーファイルも生成します。

create_project.tcl
if {[info exists design_bd_tcl_file]} {
    source $design_bd_tcl_file
    regenerate_bd_layout
    save_bd_design
    set design_bd_name  [get_bd_designs]
    make_wrapper -files [get_files $design_bd_name.bd] -top -import
}

ここで design_bd_tcl_file はTclスクリプトになっています。Vivado には一度 GUI で作成した Block Design を Tclスクリプトファイルに出力する機能があります。具体的には次のようにします。

Vivado > Flow Navigator > Open Block Design
Vivado > File > Export > Export Block Design

ここで出力したTclスクリプトを変数 design_bd_tcl_file に指定することが出来ます。

5.3 sources_1 にVHDLファイルを追加する。

VHDLファイルをsources_1 に追加する場合は次のようにします。
VHDLファイルは多数あることが多いので、まずはファイルセットに追加するためのプロシージャを定義しておきます。

なお、ファイルセットに追加する際、ファイルの参照を追加する場合は次のように add_files を使用します。

create_project.tcl
proc add_vhdl_file {fileset_name library_name file_name} {
    set file     [file normalize $file_name   ]
    set fileset  [get_filesets   $fileset_name]
    set file_obj [add_files -norecurse -fileset $fileset $file]
    set_property "file_type" "VHDL"        $file_obj
    set_property "library"   $library_name $file_obj
}

また、ファイルセットに追加する際、ファイルそのものをプロジェクトにコピーする場合は次のように import_files を使用します。こちらはどちらかというと、IP を作る際に使用します。なぜなら IP として配布する際にソースコードがリファレンス(他のディレクトリを参照)だと問題があるからです。

create_project.tcl
proc add_vhdl_file {fileset_name library_name file_name} {
    set file     [file normalize $file_name   ]
    set fileset  [get_filesets   $fileset_name] 
    set file_obj [import_files -norecurse -fileset $fileset $file]
    set_property "file_type" "VHDL"        $file_obj
    set_property "library"   $library_name $file_obj
}

上記プロシージャを使って、追加したいVHDLファイルを指定します。
次の例ではファイルセット sources_1 に../../src/main/vhdl/top.vhdを追加しています。ファイル名はTclスクリプトを実行するディレクトリからの相対パスで指定しています。また、WORKライブラリに属するVHDLファイルであることを指定しています。

create_project.tcl
add_vhdl_file sources_1 WORK ../../src/main/vhdl/top.vhd

また、次のように追加したいVHDLファイルを別のスクリプトファイルと用意しておき(この例では add_sources.tcl)、そのファイルを読み込むことも可能です。

create_project.tcl
source add_sources.tcl

この例ではVHDLファイルを追加する方法を説明していますが、同様の方法でVerilogファイルを追加することも出来るはずです。

5.4 sim_1 にVHDLファイルを追加する。

シミュレーション目的でプロジェクトを作る際、sim_1 にも VHDL ファイルを追加することがあります。この場合も前節で紹介したプロシージャを使って、追加したいVHDLファイルを指定します。
次の例ではファイルセット sim_1 に../../src/test/vhdl/testbench.vhdを追加しています。ファイル名はTclスクリプトを実行するディレクトリからの相対パスで指定しています。また、WORKライブラリに属するVHDLファイルであることを指定しています。

create_project.tcl
add_vhdl_file sim_1 WORK ../../src/test/vhdl/testbench.vhd

Tclスクリプトの実行

Vivado のバッチモードで実行する

Tclスクリプトを Vivado のバッチモードで実行する場合は次のようにします。

shell% cd project
shell% vivado -mode batch -source create_project.tcl

Vivado の GUIモードから実行する

Tclスクリプトを Vivado のGUIモードから動かす場合は次のようにします。

Vivado > Tools > Run Tcl Script... > project/create_project.tcl

Tclスクリプトサンプル

サンプルその1

以下の記事で使った create_project.tcl をサンプルとして示します。

create_project.tcl
#
# create_project.tcl  Tcl script for creating project
#
set project_directory       [file dirname [info script]]
set project_name            "project"
set board_part              [get_board_parts -quiet -latest_file_version "*kv260*"]
set constrs_file_list       [list [file join $project_directory "design_1_pin.xdc" ]]
set design_bd_tcl_file      [file join $project_directory "design_1_bd_2021.2.tcl"  ]
#
# Create project
#
if {[info exists project_name     ] == 0} {
    set project_name        "project"
}
if {[info exists project_directory] == 0} {
    set project_directory   [pwd]
}
cd $project_directory
create_project -force $project_name $project_directory
#
# Set project properties
#
if       {[info exists board_part ] && [string equal $board_part  "" ] == 0} {
    set_property "board_part"     $board_part      [current_project]
} elseif {[info exists device_part] && [string equal $device_part "" ] == 0} {
    set_property "part"           $device_part     [current_project]
} else {
    puts "ERROR: Please set board_part or device_part."
    return 1
}
set_property "default_lib"        "xil_defaultlib" [current_project]
set_property "simulator_language" "Mixed"          [current_project]
set_property "target_language"    "VHDL"           [current_project]
#
# Create fileset "sources_1"
#
if {[string equal [get_filesets -quiet sources_1] ""]} {
    create_fileset -srcset sources_1
}
#
# Create fileset "constrs_1"
#
if {[string equal [get_filesets -quiet constrs_1] ""]} {
    create_fileset -constrset constrs_1
}
#
# Create fileset "sim_1"
#
if {[string equal [get_filesets -quiet sim_1] ""]} {
    create_fileset -simset sim_1
}
#
# Create run "synth_1" and set property
#
set synth_1_flow     "Vivado Synthesis 2020"
set synth_1_strategy "Vivado Synthesis Defaults"
if {[string equal [get_runs -quiet synth_1] ""]} {
    create_run -name synth_1 -flow $synth_1_flow -strategy $synth_1_strategy -constrset constrs_1
} else {
    set_property flow     $synth_1_flow     [get_runs synth_1]
    set_property strategy $synth_1_strategy [get_runs synth_1]
}
current_run -synthesis [get_runs synth_1]
#
# Create run "impl_1" and set property
#
set impl_1_flow      "Vivado Implementation 2020"
set impl_1_strategy  "Vivado Implementation Defaults"
if {[string equal [get_runs -quiet impl_1] ""]} {
    create_run -name impl_1 -flow $impl_1_flow -strategy $impl_1_strategy -constrset constrs_1 -parent_run synth_1
} else {
    set_property flow     $impl_1_flow      [get_runs impl_1]
    set_property strategy $impl_1_strategy  [get_runs impl_1]
}
current_run -implementation [get_runs impl_1]
#
# Set IP Repository
#
if {[info exists ip_repo_path_list] && [llength $ip_repo_path_list] > 0 } {
    set_property ip_repo_paths $ip_repo_path_list [current_fileset]
    update_ip_catalog
}
#
# Create block design
#
if {[info exists design_bd_tcl_file]} {
    # 
    # Read block design file
    #
    source $design_bd_tcl_file
    #
    # Save block design
    #
    regenerate_bd_layout
    save_bd_design
    #
    # Generate wrapper files
    #
    set design_bd_name  [get_bd_designs]
    make_wrapper -files [get_files $design_bd_name.bd] -top -import
}
#
# Import pin files
#
if {[info exists constrs_file_list] && [llength $constrs_file_list] > 0 } {
    add_files    -fileset constrs_1 -norecurse $constrs_file_list
}

参考

1
1
0

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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?