当前位置:   article > 正文

编写Tcl脚本创建整个Vivado工程并通过Git对Tcl脚本进行管理_vivado tcl脚本管理工程

vivado tcl脚本管理工程

I.引文

简介

Tcl(Tool Command Language)是一种简单易学、高效的脚本语言,可用于多种应用程序和操作系统。Xilinx Vivado是一款用于FPGA开发的综合软件平台,其内部集成了Tcl Shell,可以通过编写Tcl脚本自动化完成Vivado的工程创建和配置,从而提高工作效率和代码复用性。本文将介绍如何使用Tcl脚本创建整个Vivado工程,并通过Git对Tcl脚本进行管理。

目的

本文的目的是介绍如何使用Tcl脚本自动化完成Vivado工程的创建和配置,并使用Git对Tcl脚本进行管理,以提高工作效率和代码复用性。

优势

使用Tcl脚本和Git管理Vivado工程有以下优势:

  • 提高工作效率,省去手动创建和配置工程的繁琐过程。
  • 方便维护,通过Git可以方便地追踪修改历史、协作开发和版本控制,避免出现冲突和错误。
  • 可复用性强,通过Tcl脚本和Git可以轻松地复用已有的代码和工程,避免重复工作和浪费资源。
  • 灵活性高,使用Tcl脚本可以自定义各种Vivado工程配置选项,使得工程的配置更加灵活,满足不同的项目需求。

II.Vivado Tcl Shell介绍

Tcl Shell是什么

Vivado Tcl Shell是一种内置在Vivado中的交互式解释器,它支持Tcl语言和Vivado Shell命令,用户可以通过Tcl脚本在Vivado Tcl Shell中执行各种命令,自动化地完成Vivado工程的创建、配置、仿真等操作。

Tcl Shell的优势

Vivado Tcl Shell有以下优势: 

  • 方便快捷,Tcl语言简单易学,用户可以通过Tcl脚本快速完成复杂的Vivado工程配置和操作。
  • 高效准确,Tcl脚本可以保证配置的准确性和一致性,避免人为疏漏和错误。
  • 可扩展性强,用户可以编写自己的Tcl脚本和命令,根据实际需求扩展Vivado Tcl Shell的功能

Tcl Shell命令举例

以下是一些常用的Vivado Tcl Shell命令: 

  • create_project:创建一个新的Vivado工程。
  • add_files:向工程中添加源文件或IP核。
  • set_property:设置某个对象的属性。
  • add_bd_design:在Vivado Block Design中添加一个新的设计。
  • start_gui:启动Vivado GUI界面。
  • open_project:打开一个已存在的Vivado工程。
  • write_bd_tcl:将当前的Block Design保存为Tcl脚本文件。
  • write_project_tcl:将整个Vivado工程保存为Tcl脚本文件。
  • synthesize:对设计进行综合。
  • implement:对综合后的设计进行实现。
  • export_ip_user_files:导出IP核的用户文件。
  • run_simulation:运行仿真。

III. Tcl脚本创建Vivado工程

工程创建流程 

创建Vivado工程通常需要以下步骤:

  • 创建一个新的Vivado工程。

以下是本项目的项目结构: 

  1. 01_led_project
  2. ├── .git #git generation
  3. ├── led.bat
  4. ├── led.tcl # Project generator script
  5. ├── src/ # Tracked source files
  6. │ ├── design/
  7. │ │ ├── *.v
  8. │ │ └── *.vhd
  9. │ ├── testbench/
  10. │ │ ├── *.v
  11. │ │ └── *.vhd
  12. │ ├── constraints/
  13. │ │ └── *.xdc
  14. │ └── ...
  15. ├── ips/ # Tracked project-specific IP repository
  16. │ ├── sys_ip/
  17. │ │ │
  18. │ │ └─.xci
  19. │ ├── my_ip/
  20. │ └── ...
  21. └── vivado_led_project/ # Untracked generated files
  22. ├── project_name.xpr
  23. ├── project_name.cache/
  24. ├── project_name.hw/
  25. ├── project_name.sim/
  26. ├── project_name.srcs/
  27. │ ├── sources_1/
  28. │ │ ├── bd/ # BDs are regenerated from script
  29. │ │ │ ├── my_bd/
  30. │ │ │ └── ...
  31. │ │ └── new/ # .v file
  32. │ │ │ ├── .{v,vhd}
  33. │ │ │ └── ...
  34. │ │ └──ip/
  35. │ └── ...
  36. └── ...
  • 向工程中添加需要的源文件和IP核。

  • 编写Tcl脚本用于生成vivado工程。

  • vivado工具中的Tcl控制台进行工程项目的创建。

 

 

 

 

 这样就算是创建工程完成了,可以发现源文件已经添加并且已经综合、生成bit流可以直接下板了

 以下是vivado工程创建完成后文件夹的变化:

  •  也可以双击运行.bat文件进行工程的创建,只是不会进入Vivado工具的GUI界面。

右键使用编辑器编辑.bat文件

Tcl脚本实现步骤 

使用Tcl脚本自动化完成Vivado工程创建的步骤,一般需要以下步骤:

  • 定义变量和路径,包括项目名称、工程路径、IP核路径等。
  • 创建工程并设置工程属性,包括工程名称、工程路径、Vivado版本等。
  • 添加源文件和IP核,可以使用add_files、add_ip等命令。
  • 配置工程选项,包括综合、实现、仿真等选项,可以使用set_property等命令。
  • 生成比特流文件和仿真波形,可以使用write_bitstream、run_simulation等命令。
  • 如果需要从0到1添加一个IP,以ILA为例
  1. # 创建一个新的 ILA IP
  2. create_ip -name ila -vendor xilinx.com -library ip -version 6.2 -module_name ila -dir $work_dir/$proj_name/$proj_name.srcs/sources_1/ip
  3. set_property -dict [list CONFIG.C_PROBE0_WIDTH {32} CONFIG.C_NUM_OF_PROBES {2} CONFIG.Component_Name {ila}] [get_ips ila]
  4. #set_property -dict [list CONFIG.C_PROBE4_WIDTH {128} CONFIG.C_PROBE3_WIDTH {8} CONFIG.C_PROBE2_WIDTH {32} CONFIG.C_PROBE1_WIDTH {16} CONFIG.C_DATA_DEPTH {2048} CONFIG.C_NUM_OF_PROBES {5} CONFIG.C_ENABLE_ILA_AXI_MON {false} CONFIG.C_MONITOR_TYPE {Native}] [get_ips ila_0]
  5. generate_target {instantiation_template} [get_files $work_dir/$proj_name/$proj_name.srcs/sources_1/ip/ila/ila.xci]
  6. update_compile_order -fileset sources_1
  7. generate_target all [get_files $work_dir/$proj_name/$proj_name.srcs/sources_1/ip/ila/ila.xci]
  8. catch { config_ip_cache -export [get_ips -all ila] }
  9. export_ip_user_files -of_objects [get_files $work_dir/$proj_name/$proj_name.srcs/sources_1/ip/ila/ila.xci] -no_script -sync -force -quiet
  10. create_ip_run [get_files -of_objects [get_fileset sources_1] $work_dir/$proj_name/$proj_name.srcs/sources_1/ip/ila/ila.xci]
  11. launch_runs ila_synth_1 -jobs 5
  12. export_simulation -of_objects [get_files $work_dir/$proj_name/$proj_name.srcs/sources_1/ip/ila/ila.xci] -directory $work_dir/$proj_name/vivado_led.ip_user_files/sim_scripts -ip_user_files_dir $work_dir/$proj_name/vivado_led.ip_user_files -ipstatic_source_dir $work_dir/$proj_name/vivado_led.ip_user_files/ipstatic -lib_map_path [list {modelsim=$work_dir/$proj_name/vivado_led.cache/compile_simlib/modelsim} {questa=$work_dir/$proj_name/vivado_led.cache/compile_simlib/questa} {riviera=$work_dir/$proj_name/vivado_led.cache/compile_simlib/riviera} {activehdl=$work_dir/$proj_name/vivado_led.cache/compile_simlib/activehdl}] -use_ip_compiled_libs -force -quiet

代码示例 

下面是一个简单的Tcl脚本示例,演示了如何创建一个新的led的Vivado工程以及详细的注释。

  1. #设置项目名称和工作目录
  2. set proj_name "vivado_led"
  3. set work_dir [pwd]
  4. #创建工程
  5. #**********************************************************************************************************
  6. create_project -force $proj_name $work_dir/$proj_name -part xazu3eg-sfvc784-1-i
  7. # Create 'sources_1' fileset (if not found);file mkdir创建ip、new、bd三个子文件
  8. if {[string equal [get_filesets -quiet sources_1] ""]} {
  9. create_fileset -srcset sources_1
  10. }
  11. file mkdir $work_dir/$proj_name/$proj_name.srcs/sources_1/ip
  12. file mkdir $work_dir/$proj_name/$proj_name.srcs/sources_1/new
  13. file mkdir $work_dir/$proj_name/$proj_name.srcs/sources_1/bd
  14. # Create 'constrs_1' fileset (if not found)
  15. if {[string equal [get_filesets -quiet constrs_1] ""]} {
  16. create_fileset -constrset constrs_1
  17. }
  18. file mkdir $work_dir/$proj_name/$proj_name.srcs/constrs_1/new
  19. # Create 'sim_1' fileset (if not found)
  20. if {[string equal [get_filesets -quiet sim_1] ""]} {
  21. create_fileset -simset sim_1
  22. }
  23. file mkdir $work_dir/$proj_name/$proj_name.srcs/sim_1/new
  24. #************************************************************************************************************
  25. #添加源文件
  26. add_files -fileset sources_1 -copy_to $work_dir/$proj_name/$proj_name.srcs/sources_1/new -force -quiet [glob -nocomplain $work_dir/src/design/*.v]
  27. add_files -fileset sim_1 -copy_to $work_dir/$proj_name/$proj_name.srcs/sim_1/new -force -quiet [glob -nocomplain $work_dir/src/testbench/*.v]
  28. #添加约束文件
  29. add_files -fileset constrs_1 -copy_to $work_dir/$proj_name/$proj_name.srcs/constrs_1/new -force -quiet [glob -nocomplain $work_dir/src/constraints/*.xdc]
  30. # 添加IP的.xci文件
  31. add_files -fileset sources_1 -copy_to $work_dir/$proj_name/$proj_name.srcs/sources_1/ip -force -quiet [glob -nocomplain $work_dir/ips/sys_ip/*.xci]
  32. #生成Block Design
  33. #source $work_dir/vivado_project/$proj_name.srcs/sources_1/bd/my_bd/my_bd.tcl
  34. #*************************************************************************************************************
  35. # 综合
  36. launch_runs synth_1 -jobs 5
  37. wait_on_run synth_1
  38. # 设置顶层文件属性
  39. #set_property top_auto_detect true [current_project]
  40. set_property top_file "/$work_dir/$proj_name/$proj_name.srcs/sources_1/new/led.v" [current_fileset]
  41. #运行综合、实现和生成比特流
  42. #synth_design -to_current_top
  43. #指定综合顶层模块为“led”
  44. synth_design -top led
  45. #执行逻辑综合优化,主要是优化逻辑电路的面积、时钟频率、功耗等指标
  46. opt_design
  47. #执行布局,将逻辑元素映射到物理位置,并考虑时序约束
  48. place_design
  49. #执行布线,将物理电路中的逻辑元素通过信号线连接在一起
  50. route_design
  51. #将比特流写入到指定的文件中,即生成.bit文件。-force参数用于强制覆盖已有的文件
  52. write_bitstream -force $work_dir/$proj_name.bit
  53. #生成用于调试的信号探针,将信号探针写入到指定的文件中,即生成.ltx文件
  54. write_debug_probes -file $work_dir/$proj_name.ltx

IV. Git管理Tcl脚本和Vivado工程 

Git是什么

 Git是一种分布式版本控制系统,可以记录文件的修改历史、协作开发和版本控制。Git的核心思想是将文件的修改历史保存在一个本地或远程的代码库中,每次修改都会生成一个新的提交,提交可以被视为文件的一个快照。Git还支持分支、合并等高级功能,使得协作开发变得更加灵活和效。

Git的优势

使用Git进行版本控制有以下优势:

  • 完整的版本历史记录,可以回溯每一个版本的修改记录,方便排查错误和恢复代码。
  • 多人协作开发,可以方便地管理多个开发者的代码贡献,协作开发更加高效。
  • 分支管理,可以方便地管理和合并不同的代码分支,使得代码的开发和维护更加灵活和高效。
  • 远程仓库,可以将代码仓库上传到远程服务器,方便协作开发和备份。

Git与Vivado工程集成

将Git与Vivado工程集成需要以下步骤:

  • 创建Git仓库:在Vivado工程所在的目录下创建一个新的Git仓库。
  • 添加文件:将Vivado工程的文件和Tcl脚本添加到Git仓库中。
  • 提交更改:在对工程进行更改后,将更改提交到本地仓库。
  • 推送到远程仓库:将本地仓库的更改推送到远程仓库中,以便多人协作开发和备份。

代码管理流程

使用Git进行代码管理的基本流程如下:

  • 克隆代码仓库:从远程仓库中克隆代码到本地。
  • 创建分支:在本地创建一个新的分支,以便进行新的代码开发或修改。
  • 修改代码:对代码进行修改或添加新的功能。
  • 提交代码:将代码更改提交到本地仓库中。
  • 合并分支:将新的代码合并到主分支中。
  • 推送到远程仓库:将本地仓库的更改推送到远程仓库中。

分支管理

使用Git进行分支管理可以使得代码的开发和维护更加灵活和高效。以下是一些常用分支管理令:

  • 创建分支:git branch [branch_name]
  • 切换分支:git checkout [branch_name]
  • 合并分支:git merge [branch_name]
  • 删除分支:git branch -d [branch_name]

提交代码

使用Git提交代码需要以下步骤:

  • 添加修改文件到暂存区:git add [file_name]
  • 提交更改到本地仓库:git commit -m "commit message"
  • 推送更改到远程仓库:git push origin [branch_name]

V. 总结

本文介绍了如何使用Tcl脚本自动化完成Vivado工程的创建和配置,并通过Git进行代码管理,以提高工作效率和代码复用性。使用Tcl脚本和Git管理Vivado工程可以方便地追踪修改历史、协作开发和版本控制,避免出现冲突和错误,同时也可以实现工程代码的复用。在本文中,我们讨论了Vivado Tcl Shell的优势和常用命令,并介绍了如何使用Tcl脚本自动创建Vivado工程,并使用Git进行代码管理。
在实际项目中,使用Tcl脚本和Git管理Vivado工程可以极大地提高开发效率和代码质量,特别是对于重复性工作和多人协作开发场景。然而,在使用Tcl脚本自动化创建Vivado工程时,需要注意配置选项的正确性和一致性,以避免出现不可预期的错误。
总的来说,Tcl脚本和Git管理是Vivado工程开发中不可或缺的技术,能够帮助开发者提高工作效率和代码质量,同时也促进了代码的可重用性和协作开发的便捷性。

由此本文分享结束!

欢迎指正!

VI. 参考博客

作者:Jeff Johnson

 Version control for Vivado projects - FPGA Developer

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/471105
推荐阅读
相关标签
  

闽ICP备14008679号