将 SVN 与 Xilinx Vivado 一起使用?

电器工程 FPGA 赛灵思
2022-01-18 02:44:49

我刚刚声明在一个新项目中使用 Vivado,并希望将项目文件放在 SVN 下。

Vivado 似乎在项目名称下创建了所有项目文件(比如 proj1):

/<path to the project>/proj1/
                            proj1.xpr
                            proj1.srcs/
                                       constrs_1/
                                                new/
                                                    const1.xdc
                            proj1.runs/
                            proj1.data/
                            proj1.cache/

我的问题是除了 XDC 和 XPR 文件之外,我需要在 SVN 下放置哪些文件?

4个回答

Xilinx 创建了一个 YouTube 视频(叹气)来解决这个问题。这是视频的链接

http://www.xilinx.com/training/vivado/vivado-version-control-overview.htm

这是我的视频摘要(8分钟)

在你开始前

如果您真的喜欢完全控制,Xilinx 建议您完全放弃 GUI 并在命令行上执行所有操作,然后您就知道什么是源代码,什么不是。

否则,赛灵思会意识到 Vivado 项目并非专为版本控制而设计。不要检查整个项目。但请继续阅读以获取提示...

基线

当然,您在 Vivado 工具之外编写的任何内容都应检入。

签入以下文件

*.v, *.vh, *.vhdl, *.edif  - HDL and Netlist
*.xdc - Constraints
*.xci - IP Core
*.bd  - IP Integrator Block Diagram
*.xmp - Embedded Subsystem
*.sgp - System Generator Subsystem
*.bmm
*.cdc - Chipscope
*.elf
*.mem

IP块

如果您使用 IP 块,请在唯一文件夹中生成 IP,然后签入所有内容。

检查站

如果您希望能够在不运行所有内容的情况下重新运行部分流程,请签入检查点文件。

*.dcp - Design Checkpoints

我的附录

如果 Xilinx 工具高效,我不建议签入 dcp 文件,但它们需要运行这么多小时,以丑陋的版本控制系统为代价可能是值得的。

视频中没有提到 Vivado 项目文件 (*.xpr),所以这是我的建议:

*.xpr
*.data/*/fileset.xml
*.data/*/runs.xml

Xilinx 推荐的替代方法(这实际上是一种 hack,不适合版本控制)是File -> Write Project Tcl每次要提交时运行该命令,然后将该 TCL 文件提交给版本控制。当您更新本地文件夹时,您需要重新运行该 TCL 文件以创建所有项目文件。呸。

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 命令。

有一个Xilinx 培训视频解释了如何将版本控制系统与 Vivado 一起使用。基本上,文件列表取决于您使用的功能。

如果您使用脚本化方法(如 vermaete 所做的那样),您可以让 Vivado 将所有中间/临时文件写入一个单独的目录(请参见此处),这样您就可以轻松地将它们分开。

否则,您可以通过 Vivado 清理构建文件夹,剩下的任何内容都可能受到版本控制。