实验室的项目代码越来越乱,想引入Git进行版本管理。但FPGA/IC设计和软件项目不同,会生成大量中间文件(如Vivado的.xpr/.rpt/.bit,仿真产生的.vcd/.log)。直接全部提交显然不行。请问在硬件开发中使用Git,有哪些公认的最佳实践?比如,通常只提交源代码(.v, .sv, .xdc, .tcl)、约束文件和仿真脚本,而忽略所有工具生成的文件。有没有针对Vivado/Quartus等工具的通用.gitignore模板可以参考?如何管理IP核(尤其是自定义IP)的版本?
使用Git进行FPGA/IC数字设计项目的版本管理,有哪些针对硬件开发的最佳实践和.gitignore模板?
提问
回答 5

我们实验室去年刚折腾过这个,踩了不少坑。核心原则就是:只提交人写的代码,工具生成的一律忽略。
具体来说,Verilog/VHDL/SystemVerilog源码(.v .vh .sv .svh .vhd)、约束文件(.xdc .sdc)、Tcl脚本(.tcl)、仿真测试文件(.sv .v)和Makefile/脚本(.sh .py)这些必须进版本库。
像Vivado项目文件.xpr、整个.ip_user_files目录、实现后的网表、比特流.bit、各种报告.rpt、仿真波形.vcd/.wdb,还有综合实现产生的整个目录(如Vivado的project_1.cache, project_1.hw, project_1.runs),都应该在.gitignore里。
网上有现成的模板,比如GitHub官方的FPGA.gitignore,覆盖了Vivado、Quartus、ISE、Modelsim等主流工具。你直接搜一下,拿过来根据自己项目微调就行。
对于IP核,如果是用工具(如Vivado的IP Catalog)生成的,只提交生成IP的Tcl脚本或.xci文件(Vivado),用脚本就能重新生成IP。如果是完全自己写的RTL代码IP,就当普通源码管理。
另外,强烈建议用Tcl脚本从头创建和管理整个项目,而不是依赖GUI保存的.xpr。这样项目结构清晰,可重现性强。

最佳实践就一句话:让项目在任何一台干净机器上,通过git clone和运行几个脚本命令,就能从头开始综合出比特流。
所以,你提交到仓库的应该是:
1. 所有RTL设计源文件。
2. 约束文件(时序、管脚)。
3. 用于构建项目的Tcl脚本(例如create_project.tcl, 里面设置器件、添加源文件、约束等)。
4. 用于生成或配置IP的脚本/配置文件(如.xci, .xco, .qsys文件)。
5. 仿真环境和测试用例。
6. 一个README,说明如何构建和仿真。.gitignore模板,你可以参考这个(Vivado为主):
.bit
.bin
.mcs
.prm
.xsa
.hw
.xpr
.jou
.log
.str
.zip
project_/
.cache/
.hw/
.sim/
.ip_user_files/
.runs/
.gen/
.srcs/管理IP,关键是版本控制其“源”,而不是“产物”。对于Vivado,IP的.xci文件是源,要提交。它会记录IP的配置。千万别提交.ip_user_files里生成的一大堆文件。

刚从软件转做FPGA,用Git管理硬件项目一开始很不适应。分享点经验:
痛点:工具生成的文件太多、太大,而且不同工具版本生成的可能不兼容。全提交的话仓库会爆炸,而且容易冲突。
解决思路:
1. 仓库里只放“源文件”和“构建指令”。
2. 用一个好的.gitignore文件屏蔽所有生成物。网上模板很多,但最好自己根据项目工具链整理一个,理解每一条忽略规则。
3. 使用子模块(git submodule)或包管理来管理第三方IP或共享代码库。比如你们实验室可能有公共的模块库,用子模块引入很方便。
4. 对于Vivado/Quartus项目,强烈建议放弃用GUI建工程保存。改用Tcl脚本驱动。这样,你的仓库里根本没有.xpr或.qpf文件,只有.tcl脚本。构建时,运行脚本,工具会临时生成所有工程文件,这些都在.gitignore里。这是最干净的做法。关于IP:如果是Vivado IP Catalog里的,配置好后,保存.xci文件并提交。确保用脚本模式生成IP(generate_target all [get_files .xci])。自定义IP如果是纯RTL,当源码管。如果是封装了Xilinx IP的Block Design(.bd),.bd文件要提交,同时记得把关联的.tcl文件(有时会自动生成)也提交。
最后,记得在README里写好构建步骤,比如“1. git clone … 2. cd project 3. vivado -mode batch -source create_project.tcl”。

简单直接版:
最佳实践:
– 提交:.v, .sv, .vhd, .xdc, .sdc, .tcl, .bd (Vivado Block Design), .xci (Vivado IP配置), .py, Makefile, README.md。
– 忽略:一切带.cache, .runs, .hw, .sim, .data, .jou, .log, .str, .bit, .mcs, .prm, .xpr, .qpf, .qsf (但注意.qsf有时是约束源,Quartus下需提交),.vcd, .wdb, .wcfg, 整个project_目录。.gitignore模板去GitHub搜“FPGA gitignore”或“Vivado gitignore”,一堆现成的。选一个星星多的。
IP管理:
– Xilinx IP:提交.xci文件。
– 自定义RTL IP:当源码提交。
– 复杂IP(如用Block Design做的):提交.bd文件和可能需要的.tcl包装脚本。额外建议:仿真目录(如sim)下,也建个.gitignore,忽略波形、log和编译库。

除了上面大家说的文件管理,再补充几个工程管理上的实践和容易踩的坑:
1. 目录结构要清晰。建议按功能模块分目录,比如rtl/, sim/, const/, ip/, scripts/。每个模块的rtl和testbench放一起。.gitignore放在项目根目录。
2. 使用Tcl脚本自动化。这是硬件项目版本控制的灵魂。一个主构建脚本(比如build.tcl)应该能:创建工程、添加源码、添加约束、配置IP、运行综合实现、生成比特流。这个脚本要提交。这样新人拿到代码,一键重现。
3. 注意约束文件(.xdc)的版本管理。有时候工程师在GUI里修改约束后忘记保存到.xdc文件,导致版本库里的约束不是最新的。一定要养成在保存.xpr前“Write XDC”的习惯,或者直接用脚本管理约束。
4. 仿真文件管理。测试激励、验证环境代码当然要提交。但仿真脚本(比如用Makefile或Python脚本编译仿真库、运行仿真)也要提交。仿真产生的波形、覆盖率数据库等巨大文件必须忽略。建议在sim目录下也放一个.gitignore。
5. IP核的“锁版本”问题。特别是Vivado,IP升级可能导致接口变化。在团队协作中,最好在Tcl脚本里固定Vivado/IP的版本号。提交.xci文件可以锁定大部分配置,但工具大版本升级时仍可能有问题。
6. 二进制文件(如初版比特流、ROM初始化文件.coe/.mif)要不要提交?如果很小且是设计输入的一部分,可以提交。如果很大或可由脚本生成,则只提交生成脚本。
7. 考虑使用Git LFS(大文件存储)来管理偶尔需要版本控制的超大文件(比如大型的coe文件或早期参考的比特流),但不要滥用。
最后,找个时间给实验室做个简短培训,统一工作流程,不然每个人提交的东西不一样,还是乱。
发表回答
登录后可在本页底部提交回答
