王德福 Wonderful

Vivado HDL 源代码管理

2022-11-26 · 7 min read

Vivado HDL源代码管理

Vivado 的工程编译之后会有几百兆,每次拷给别人的时候都要备注好版本,还可能会有 IP 版本不兼容的问题(这个也不是完全解决版本不兼容的问题,但是在 IP Core没有大变化的情况下时没有问题的)

要做好版本管理直接用现在很成熟的 git 即可,加上少数的步骤就可以把代码管理好。

总的原则

  • IP core 文件和代码文件不要放在工程里面,放在单独的文件夹里面进行处理
  • 新生成的代码、仿真文件、约束、IP core 都放到对应的文件夹而不是放在默认的工程文件夹里面
  • 使用 write_project_tcl 命令来管理代码

导出工程

首先要有一个创建好的工程,在这里随便找了一个已有的代码管理的工程来演示。

首先是一定要注意代码和自己的工程不要放在一起,不然在别的机器上运行的时候会缺东西。

基本命令

使用 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>

其中比较重要的有下面几个:

  • ‑paths_relative_to,将文件中所有的绝对路径都改成相对路径,都是相对于这个tcl文件的路径。因此在管理代码的时候连着这个 tcl 一起管理了就好了
  • -force,强制覆盖之前的 tcl 文件,多次生成的时候很有用

如下图所示,在对应的 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 文件进行修改

生成的 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 文件也是直接管理的,但是这样可能会造成版本不兼容的问题,因此在这里的 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 Core 相关配置

前面最后一部去掉了 IP 相关的内容,因此在这里要重新导出所有的 IP Core。

使用 write_ip_tcl 来生成 IP Core 需要的配置文件

  • -force 是强制覆盖
  • -no_ip_version 是使得 IP 和Vivado 版本无关,但是一直不成功(有隐患,若 IP 版本变化很大,这个就会失效,目前没有很好的解决办法)
  • -multiple_files 是每个 IP 一个文件
  • 最后一个参数是 tcl 存放的路径
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注释掉,这样就只检查,但是不报错了

![image-20220619161022688](Vivado HDL源代码管理.assets/image-20220619161022688.png)

在原来的 tcl 文件中加入IP相关内容

使用 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 有没有报错,有报错多半是却什么文件