vivado工程动辄几百MB,用git管理所有编译文件是极其浪费和不方便的。以下描述了如何用write_project_tcl生成gen_prj.tcl,在用source gen_prj.tcl生成完整工程。
我常用的目录结构如下:
ip_core里放所有IP生成文件,包括bd文件。在生成ip时是可以更改location的,你可以新建ip时就将location修改到ip_core下,也可以建完工程后,在vivado工程中移除该ip,再将该ip文件夹拷贝到ip_core,再添加到工程里。bd同理,在新建bd时能选择位置,选择后内部的ip默认在该文件夹下,bd内的ip不能选择位置。
prj下存放了tcl文件,也可以单独新建一个tcl目录。
其中gen_prj.tcl是生成工程的。gen_prj_script.bat是快速执行该tcl的bat脚本,内容是:
C:\Xilinx\Vivado\2019.2\bin\vivado -source gen_prj.tcl
gen_mcs同理。set_version.tcl见本人另一个博客,用于生成version.h文件,方便每次编译时自动加入编译时间信息到寄存器。
write_cfgmem -format mcs -size 32 -interface SPIx4 -loadbit {up 0x00000000 "./pcie_k7_aurora/pcie_k7_aurora.runs/impl_1/PCIE_DMA.bit" } -force -file "../result/pcie_xdma.mcs"
C:\Xilinx\Vivado\2019.2\bin\vivado -mode tcl -source gen_mcs.tcl
result下存放了调试OK的某节点的mcs和bit文件。
sim下存放仿真相关。
xdc存放约束文件。
src下存放所有源码。src下的*.sv即是顶层文件,简洁明了。include下保存pkg或者头文件,interface定义文件等,其他文件夹随意。不建议文件夹个数过多。还有一些通用的ram和fifo等文件放在common下等常规用法不赘述。
README.md文件说明本工程怎么用。这是markdown文件,我用codechina管理代码自动会生成这个文件了,我就当txt使用了,这点不必纠结。
1.双击prj目录下的gen_prj_script.bat,执行C:\Xilinx\Vivado\2019.2\bin\vivado -source gen_prj.tcl,生成新的工程。
2.修改完工程后,执行reset_project,清理工程。执行write_project_tcl -all_properties -no_copy_sources -no_ip_version -use_bd_files ./gen_prj.tcl -force 更新脚本。
3.src -------> 存放源码;
ip_core ---> ip文件
sim -------> 仿真文件
xdc -------> 约束文件
当我们第一次新建工程时,在prj目录下新建工程,再增加一级文件夹,例如pcie_k7_aurora。添加好所有文件后,在tcl console下执行reset_project,再执行:
write_project_tcl -all_properties -no_copy_sources -no_ip_version -use_bd_files ./gen_prj.tcl -force
得到gen_prj.tcl后,就可以将pcie_k7_aurora下的所有文件夹全部删除,其余文件均上传至git作版本管理即可。
查看ip_core中的文件可以发现,一个ip只需要xci和xml文件即可重建。这里有OOC和Global模式的区别,感兴趣的自行了解。
前面看到write_project_tcl后面跟了一大堆命令,可以输入write_project_tcl -h查看这条命令的帮助信息。
简单说,-no_copy_sources -use_bd_files这2个比较关键,不拷贝源文件,使用bd源文件。这样在新建工程时才会使用原来文件夹下的文件,而不是拷贝到工程路径下的source文件下。