Vivado 2014.1 允许使用 .tcl 脚本重新生成项目。
为此,打开您的项目,转到 File -> Write Project tcl。
基础项目
我通常将我的源代码和 .tcl 脚本存储在项目目录之外的位置。在项目中生成的 xilinx IP 内核可以通过右键单击内核并选择“复制 IP”来复制到其他地方。并删除原件。生成 tcl 脚本时,它会创建到这些文件的相对链接。这通常是我的目录结构的样子:
base_project/
srcs/
project.v
ip/
ip1/
ip1.xml
ip1.xci
genproject.tcl
只有 IP .xml 和 .xci 文件需要提交。(从技术上讲,即使这也不是必需的,请参阅最后的注释)。
这是提交给 git 的内容,请注意缺少 project.xpr 或项目目录。
当我运行时genproject.tcl
,它会为项目创建另一个目录。
base_project/
srcs/
ip/
genproject.tcl
projectdir/
project.runs/
project.cache/
project.xpr
这个新文件夹完全是一次性的。为了创建这个结构,我按以下方式修改了 tcl 脚本。
我将前 3 行更改如下:
# Set the reference directory for source file relative paths (by default the value is script directory path)
set origin_dir [file dirname [info script]]
# Set the directory path for the original project from where this script was exported
set orig_proj_dir "[file normalize "$origin_dir/projectdir"]"
# Create project
create_project project $projectdir/project
这将创建一个新项目目录和该目录中的新项目。
然后我修改路径以指向正确的位置。您可能需要在脚本的其他位置更改这些路径。
# Set 'sources_1' fileset object
set obj [get_filesets sources_1]
set files [list \
"[file normalize "$origin_dir/srcs/project.v"]"\
"[file normalize "$origin_dir/ip/ip1/ip1.xci"]"\
]
add_files -norecurse -fileset $obj $files
如this answer所示,我还修改了 IP 内核的设计运行。
.wcfg 文件可以以与 ip 和 srcs 类似的方式包含在内。
这是更简单项目的处理结束的地方(仅包含源和 IP,没有框图)。为了存储框图数据,还需要执行以下操作。
框图项目
为了保存框图,在框图打开的情况下,转到 File -> Export -> Block Diagram to Tcl,并将其保存在与其他 tcl 文件相同的目录中。
然后我制作了一个Generate_Wrapper.tcl
脚本来创建框图包装文件,因此您无需手动执行此操作。project/project.srcs 文件夹用于存储 bd 数据,但它仍然是完全一次性的,因为 bd 存储在 tcl 脚本中。将此与其他两个一起保存。
set origin_dir [file dirname [info script]]
make_wrapper -files [get_files $origin_dir/project/project.srcs/sources_1/bd/design_1/design_1.bd] -top
add_files -norecurse -force $origin_dir/project/project.srcs/sources_1/bd/design_1/hdl/design_1_wrapper.v
update_compile_order -fileset sources_1
update_compile_order -fileset sim_1
在我的最后,我genproject.tcl
添加了以下几行来生成框图和包装器:
source $origin_dir/Create_bd.tcl
source $origin_dir/Generate_Wrapper.tcl
regenerate_bd_layout
对于没有源的项目(只是框图),我的 git commit 如下:
base_project/
Generate_Wrapper.tcl
Create_Bd.tcl
genproject.tcl
为了生成一切,运行genproject.tcl
.
如果你特别有效率,你甚至可以将所有这些组合成一个,我还没有考虑到这一点。
自定义组件:组件项目
关于创建自定义组件的另一个快速说明。如果您有一个 component.xml,请将其添加到您的 tcl 源列表中:
"[file normalize "$origin_dir/component.xml"]"\
然后还添加以下部分:
set file "$origin_dir/component.xml"
set file [file normalize $file]
set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]]
set_property "file_type" "IP-XACT" $file_obj
这包括组件设计到项目中,以便于定制。
自定义组件:引用您的组件
您可以像这样指定您的自定义组件存储库路径:
# Set IP repository paths
set obj [get_filesets sources_1]
set_property "ip_repo_paths" "[file normalize "$origin_dir/path/to/repository"]" $obj
在我的 repo 文件夹中,有单独的文件夹包含 .xml 文件。因此,您引用的不是包含 .xml 的文件夹,而是该文件夹的父文件夹。例如:
repository/
component1/component1.xml
component2/component2.xml
我们如何运行这些 tcl 脚本?
打开 Vivado,不打开任何项目,选择工具 -> 运行 TCL 脚本,然后导航到您的脚本。
额外的 TCL 笔记
您在 Vivado 中运行的每个命令都在 tcl 控制台中显示为 tcl 命令。例如,当我使用 GUI 生成一个新的 Xilinx IP 时,这出现在 tcl 控制台中:
create_ip -name floating_point -vendor xilinx.com -library ip -module_name floating_point_0
set_property -dict [list CONFIG.Operation_Type {Fixed_to_float} CONFIG.A_Precision_Type {Custom} CONFIG.C_A_Exponent_Width {38} CONFIG.C_A_Fraction_Width {0} CONFIG.Result_Precision_Type {Custom} CONFIG.C_Result_Exponent_Width {8} CONFIG.C_Result_Fraction_Width {16} CONFIG.Flow_Control {NonBlocking} CONFIG.Has_ARESETn {true}] [get_ips floating_point_0]
这意味着几件事:
您甚至不需要保存 xilinx ip 内核 - 一旦它们是您想要的方式,将命令复制到 tcl 脚本,您就不需要再提交 ip/ 了。
在 -module_name 之后使用 -dir 参数指定 IP 目录,以将其放置在您想要的任何位置(默认情况下它位于 project.srcs 中)。
大多数情况下,您在 GUI 中所做的任何事情都可以在 tcl 中完成,了解 xilinx 如何做事的最简单方法是在 GUI 中完成,然后查看 TCL 控制台中的内容。
这个巨大的 pdf详细介绍了所有 vivado tcl 命令。