3、版本控制基础:Git与Vivado的集成、.gitignore文件配置、工程文件提交策略

版本控制这件事,说实话,很多FPGA工程师一开始都不太重视。

我刚入行那会儿,项目文件全靠「复制粘贴」来备份——今天加个_v1,明天加个_final,后天再来个_final2。结果呢?有一次我误删了一个关键IP核的配置,翻遍了整个文件夹都找不到原始版本。从那以后,我老老实实学起了Git。

这一章,我就把Git和Vivado集成的那些坑和经验,一次性讲清楚。

核心观点:Vivado工程不是代码工程,不能无脑提交。你得知道哪些文件该管,哪些文件碰都不要碰。

3.1 Git与Vivado的集成方式

Git和Vivado的集成,说白了就两种路子。

第一种:命令行硬核流

我个人的习惯是直接在Vivado的Tcl Console里敲Git命令。Vivado底层是Tcl环境,你可以在里面直接执行git status、git add、git commit。这样做的好处是——你不用切窗口,效率高。

# 在Vivado Tcl Console中执行
cd [get_property DIRECTORY [current_project]]
exec git status
exec git add .
exec git commit -m "更新了时序约束"

注意那个exec关键字。Vivado的Tcl里,调用外部命令必须加exec。我第一次用的时候忘了加,结果报错半天没反应过来。

第二种:外部GUI流

如果你用SourceTree、GitKraken或者VS Code的Git插件,那就更直观了。我建议你把Vivado工程目录直接拖进Git GUI工具里,改完文件切出去看一眼变更,心里踏实。

嗯,这里要注意:Vivado在后台会自动生成大量临时文件。如果你开着Vivado同时用Git GUI,可能会看到一堆莫名其妙的改动。别慌,那些大多是缓存文件,后面我们用.gitignore把它们屏蔽掉。

3.2 .gitignore文件配置——避坑指南

我曾经在一个项目里,直接把整个Vivado工程目录提交到了Git仓库。结果呢?仓库体积直接飙到2个G,同事拉代码拉了半小时。更惨的是,那些.XPR、.DCP文件每次编译都会变,导致合并冲突不断。

所以,.gitignore是FPGA工程师的救命稻草。

下面这个模板,是我在多个项目中打磨出来的,你可以直接拿去用:

# Vivado 生成文件
*.jou
*.log
*.str
*.xdc.bak
*.dcp
*.bit
*.bin
*.mcs

# 运行目录
*.runs/
*.sim/
*.cache/
*.hw/
*.ip_user_files/

# 临时文件
*.tmp
*.swp
*.swo
*~

# 综合与实现结果
*.rpt
*.xml
*.html (除了你手动写的文档)

# 项目备份
*.backup
*.old

我的个人习惯:只提交源码文件(.v/.sv/.vhd)、约束文件(.xdc)、Tcl脚本(.tcl)和IP核的配置导出文件(.xci)。其他一切,统统ignore掉。

你可能会问:那IP核怎么办?IP核的.xci文件是文本格式,记录了IP的配置参数。提交它就够了。其他同事拉下来后,用source ip_regen.tcl就能重新生成IP核。这样仓库体积能控制在几十MB以内。

3.3 工程文件提交策略

提交策略这件事,我踩过的坑比走过的路还多。总结下来就三条铁律:

  1. 按功能拆分提交,别搞大杂烩
  2. 提交信息写清楚「为什么改」,别只写「修改」
  3. 二进制文件(.dcp/.bit)坚决不入库

举个例子,我一般这样组织提交:

提交类型 包含内容 提交信息示例
RTL代码 .v / .sv 文件 feat: 添加AXI4-Lite从机接口逻辑
约束文件 .xdc 文件 fix: 修正DDR3输出延迟约束,解决时序违例
IP核配置 .xci / .bd 文件 chore: 升级MIG IP核至7系列最新版本
Tcl脚本 .tcl 文件 docs: 添加自动生成时序报告脚本

你想想看,如果某天你发现时序出了问题,你只需要回滚约束文件的提交,而不会影响到RTL代码。这就是拆分提交的好处。

警告:千万不要在Vivado工程打开的状态下执行git pull。Vivado会锁定部分文件,导致合并失败。我吃过这个亏,工程直接崩了,最后只能重新创建。

3.4 知识体系总览

下面这张图,是我对本章内容的结构化总结。你可以把它当作一个快速索引:

Git与Vivado集成 集成方式 命令行(Tcl Console) 外部GUI(SourceTree等) .gitignore配置 屏蔽临时文件(.jou/.log) 屏蔽运行结果(.dcp/.bit) 只保留源码+约束+脚本 提交策略 按功能拆分提交 写清楚提交信息 二进制文件不入库 核心原则:只管理「可读、可复用、可追溯」的文件

3.5 实战小技巧

最后分享几个我常用的命令组合,能帮你省不少事:

# 一键查看Vivado工程里哪些文件被改了
git status --short | grep -E "\.(v|sv|vhd|xdc|tcl|xci)$"

# 只提交RTL文件,忽略其他
git add *.v *.sv *.vhd
git commit -m "feat: 完成UART收发模块编码"

# 回滚某个文件的修改(慎用!)
git checkout -- project_1.srcs/sources_1/new/top.v

我的建议:每周五下班前,做一次git push。这样即使周末电脑出问题,周一来也不慌。我曾经周六加班改代码,结果硬盘坏了...还好周五推了代码,不然一周白干。

版本控制这件事,前期花10分钟配置好.gitignore,后期能省下10小时的扯皮时间。你想想看,值不值?