Vivado 的工程编译之后会有几百兆,每次拷给别人的时候都要备注好版本,还可能会有 IP 版本不兼容的问题(这个也不是完全解决版本不兼容的问题,但是在 IP Core没有大变化的情况下时没有问题的)
要做好版本管理直接用现在很成熟的 git 即可,加上少数的步骤就可以把代码管理好。
首先要有一个创建好的工程,在这里随便找了一个已有的代码管理的工程来演示。
首先是一定要注意代码和自己的工程不要放在一起,不然在别的机器上运行的时候会缺东西。
使用 Vivado 提供的 write_project_tcl 命令导出工程,这个 tcl 的用法见官方说明,下面截取一部分重要的参数来解释
write_project_tcl [‑paths_relative_to <arg>] [‑origin_dir_override <arg>]
[‑target_proj_dir <arg>] [‑force] [‑all_properties] [‑no_copy_sources]
[‑absolute_remote_path] [‑no_ip_version] [‑absolute_path]
[‑dump_project_info] [‑use_bd_files] [‑internal] [‑validate] [‑quiet]
[‑verbose] <file>
其中比较重要的有下面几个:
如下图所示,在对应的 tcl 的窗口中输入下面的命令,将相对路径设置为要存放tcl的位置,后面会有用;注意最后一个参数就是输出文件的名字。
write_project_tcl -all_properties -force -no_ip_version -paths_relative_to D:/MyProject/muon_tomography_ustc/source/scripts/ D:/MyProject/muon_tomography_ustc/source/scripts/create_aget_fec_project1.tcl
生成的 tcl 文件还有一些不科学的地方,因此在这里做一些修改
在文件中会找到这样的代码,这里的 origin_dir 就是刚刚指定的相对路径,接下来要把它换掉,因为每次tcl文件不一定都是放在了同一个位置。
set origin_dir "D:/MyProject/muon_tomography_ustc/source/scripts"
改成下面这个样子,第一行是获取文件的位置,第二行是把文件所在的文件夹传递给 origin_dir,后面所有的代码都是用的相对位置,因此完全没有问题。
variable scriptfile [file normalize [info script]]
variable origin_dir [file dirname $scriptfile]
tcl 生成的工程位置不能都自动指定相对位置,因此在这里直接就改成想要的相对位置,我一般习惯是在我所有代码的上一级文件夹中建一个 project 的文件夹,找到下面这个代码
# Create project
create_project ${_xil_proj_name_} ./${_xil_proj_name_} -part xc7a200tfbg484-2L
改成下面的内容,-force 的意思是强行覆盖已有的工程,然后把工程的路径改成 ${orig_proj_dir},也就是原始工程相对于 tcl 文件的位置,当然这里也可以改成自己想要的位置。(这里很奇怪的就是这个 tcl 前面有工程的相对位置,但是这里竟然不使用,而且还没有找到修改的参数)
create_project -force ${_xil_proj_name_} ${orig_proj_dir} -part xc7a200tfbg484-2L
IP 文件也是直接管理的,但是这样可能会造成版本不兼容的问题,因此在这里的 IP 文件先全部都去掉,下面会介绍使用 tcl 来重新生成 IP。
根据自己的 IP 名字,在文件中找到 IP 相关的那段代码并删掉,比如下面的内容要全部删掉。
注意:所有IP的文件都要删干净
# Set 'sources_1' fileset object
set obj [get_filesets sources_1]
# Import local files from the original project
set files [list \
[file normalize "${origin_dir}/../../../projects/AGET_FEC_V3_2_GBT/AGET_FEC_V3_2_GBT.srcs/sources_1/ip/ila_daq_chn_b_data/ila_daq_chn_b_data.xci" ]\
]
set imported_files [import_files -fileset sources_1 $files]
# Set 'sources_1' fileset file properties for remote files
# None
# Set 'sources_1' fileset file properties for local files
set file "ila_daq_chn_b_data/ila_daq_chn_b_data.xci"
set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]]
set_property -name "generate_files_for_reference" -value "0" -objects $file_obj
if { ![get_property "is_locked" $file_obj] } {
set_property -name "generate_synth_checkpoint" -value "1" -objects $file_obj
}
set_property -name "is_enabled" -value "1" -objects $file_obj
set_property -name "is_global_include" -value "0" -objects $file_obj
set_property -name "library" -value "xil_defaultlib" -objects $file_obj
set_property -name "path_mode" -value "RelativeFirst" -objects $file_obj
set_property -name "registered_with_manager" -value "1" -objects $file_obj
if { ![get_property "is_locked" $file_obj] } {
set_property -name "synth_checkpoint_mode" -value "Singular" -objects $file_obj
}
set_property -name "used_in" -value "synthesis implementation simulation" -objects $file_obj
set_property -name "used_in_implementation" -value "1" -objects $file_obj
set_property -name "used_in_simulation" -value "1" -objects $file_obj
set_property -name "used_in_synthesis" -value "1" -objects $file_obj
前面最后一部去掉了 IP 相关的内容,因此在这里要重新导出所有的 IP Core。
使用 write_ip_tcl 来生成 IP Core 需要的配置文件
write_ip_tcl -force -no_ip_version -multiple_files [get_ips] D:/MyProject/muon_tomography_ustc/source/HDL/aget_fec/ip/
虽说有 -no_ip_version 参数,但是还是生成了版本相关的信息,如下图所示,把最后的return 1注释掉,这样就只检查,但是不报错了

使用 source 命令来运行生成 IP 的 tcl 文件,如下面两行所示,注意依旧是使用相对路径,并且改成自己的tcl所在的位置
source $origin_dir/../HDL/aget_fec/ip/clock_generator.tcl
source $origin_dir/../HDL/aget_fec/ip/ila_daq_chn_b_data.tcl
用源代码管理器把代码同步到别的机器上,比如说 git(往前翻,有一篇文章讲了怎么用git,直接用起来就好)
下面用一台 Linux 主机上的 Vivado 来演示,首先是在 Vivado 的截面中点击 Tools->Run Tcl Script...,在弹出的框中选择之前生成好的 tcl 文件。
然后就等着大功告成了,最后检查下 tcl console 有没有报错,有报错多半是却什么文件