Vivado 2014.1允许使用.tcl脚本来重新生成项目。
为此,请打开您的项目,然后转到文件->写入项目tcl。
基础项目
我通常将源代码和.tcl脚本存储在项目目录之外的位置。通过右键单击核心并选择“复制IP”,可以将项目内生成的xilinx 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脚本。
我将前三行更改如下:
# 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
我还修改了IP内核的设计运行,如该答案所示。
.wcfg文件的包含方式类似于ip和srcs。
这是处理更简单项目(仅包含源和IP,不包含框图)的地方。为了存储框图数据,还需要执行以下操作。
框图项目
为了保存程序框图,在程序框图打开的情况下,转到文件->导出->程序框图到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命令。