如何方便地使用TCL恢复带BD设计的Vivado工程

恢复无BD设计的Vivado工程

当工程中无Block Design设计时,工程恢复过程相对简单。使用write_project_tcl命令可以直接生成用于恢复工程的tcl文件,如*_prj.tcl,在恢复时直接运行就可以了。

修改恢复工程的路径

*_prj.tcl在恢复工程时会将其放在tcl文件所在的文件夹。每个人都有各自喜好的工程目录结构,我比较喜欢将源文件、IP文件、BD文件和tcl文件放在不同的文件夹中,工程文件放在project文件夹中,这些文件夹处于统一层次。

所以我在恢复工程前,需要对*_prj.tcl进行小的修改。在*_prj.tcl中有两个关键变量,分别是origin_dir和orig_proj_dir。前者是指源文件的路径,我把它修改为tcl所在文件夹的上一层;后者是恢复的工程所在的路径,把它修改为tcl所在文件夹的上一层,名称为project的文件夹。修改如下。

set origin_dir "." ----> set origin_dir ".."

set orig_proj_dir "[file normalize "$origin_dir/top"]" ----> set orig_proj_dir "[file normalize "$origin_dir/project"]"

恢复带BD设计的Vivado工程

使用write_bd_tcl命令可以直接生成用于bd设计的tcl文件,如_bd.tcl。这样我们就有了两个tcl文件,_bd.tcl和*_prj.tcl。按照以下步骤修改tcl文件。

  1. 修改tcl中的路径

除*_prj.tcl外,*_bd.tcl也需要修改相应的路径。由于在原工程中,BD设计是在bds这个文件夹中,所生成的*_bd.tcl也将使用该文件夹,但是是放在tcl所在的路径下的,需要把他重新指向上层目录的bds中。

set origin_dir ./bds ----> set origin_dir ../bds

2. 为bd生成wrapper文件

在*_bd.tcl的最后添加以下代码。

make_wrapper -files [get_files $origin_dir/bds/mybd/mybd.bd] -top -import

该代码为bd设计生成顶层的wrapper.v,该文件在*_prj.tcl会用到。如果没有,恢复工程时会报找不到wrapper.v的错误。

3. 关闭project

在新建bd时是需要先打开一个project的,如果没有已打开的project,在调用_bd.tcl时会自动新建一个。这个新建的project在完成bd恢复后就没用了,可以关闭并删除。所以在*_bd.tcl的最后在添上以下代码。

close_project -delete

4. 恢复工程

为了运行方便,新建一个run.tcl,先后调用两个tcl文件,整个工程就能顺利恢复出来。

source ./*_bd.tcl
source ./*_prj.tcl

当BD中包含自定义IP如何恢复Vivado工程

在BD中调用了自己封装的IP时,按照上述流程恢复工程时会报错。这是因为*_bd.tcl在执行时会检查BD中IP的状态,而用户自己封装的IP还没有加入ip_catalog中。如*_bd.tcl中的下面这段代码。

##################################################################
# CHECK IPs
##################################################################
set bCheckIPs 1
if { $bCheckIPs == 1 } {
   set list_check_ips "****BD‘s IP List****”}

所以需要在CHECK IPs之前添加以下代码,用于加入用户IP路径并刷新ip_catalog。

set origin_dir ".."

# Set IP repository paths
set obj [get_filesets sources_1]
set_property "ip_repo_paths" "[file normalize "$origin_dir/ips/User Created IP Directory"]" $obj

# Rebuild user ip_repo's index before adding any source files
update_ip_catalog -rebuild

该方法可以恢复带BD以及自定义IP的工程。但是恢复后的工程中,除了在bds文件夹中存在BD设计文件(这是由*_bd.tcl生成的),在project->top.srcs->sources_1->bd中还会有一份同样的BD设计文件(这是由*_prj.tcl生成的)。为了避免这种情况发生,还需要删除*_prj.tcl中的proc cr_bd_xdma { parentCell }函数(也可以不删除,不调用即可)以及相关调用,如下。

cr_bd_*** ""
set_property REGISTERED_WITH_MANAGER "1" [get_files ***.bd ] 
set_property SYNTH_CHECKPOINT_MODE "Hierarchical" [get_files ***.bd ] 

然后使用add_files将BD文件添加进工程并刷新sources_1,即如下代码。这样修改后,在project文件夹下就不会再出现另一份BD设计文件了。

add_files -norecurse $origin_dir/bds/***/***.bd
export_ip_user_files -of_objects [get_files $origin_dir/bds/***/***.bd] -force -quiet
update_compile_order -fileset sources_1

以上就是我用来恢复Vivado工程的方法,过程简单,代码基本上都是由Vivado生成。不过在修改代码时要特别注意,*_bd.tcl和*_prj.tcl是顺序调用的,两个文件中有很多变量的名字是相同的。如果要修改这些变量,需要再三确认。如果后面的程序也用到这些变量,要搞清楚他们是否需要修改。如果需要修改,那么是否被重新赋予正确的值。

你可能感兴趣的:(#,FPGA,应用,TCL学习,tcl,Block,Design,fpga)