编写Tcl脚本创建整个Vivado工程并通过Git对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工程。

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

 01_led_project
    ├── .git                     #git generation
    ├── led.bat  
    ├── led.tcl                  # Project generator script
    ├── src/                     # Tracked source files
    │   ├── design/
    │   │    ├── *.v
    │   │    └── *.vhd
    │   ├── testbench/
    │   │    ├── *.v
    │   │    └── *.vhd
    │   ├── constraints/
    │   │    └── *.xdc
    │   └── ...
    ├── ips/                      # Tracked project-specific IP repository
    │   ├── sys_ip/
    │   │    │  
    │   │    └─.xci
    │   ├── my_ip/
    │   └── ...
    └── vivado_led_project/          # Untracked generated files
        ├── project_name.xpr
        ├── project_name.cache/
        ├── project_name.hw/
        ├── project_name.sim/
        ├── project_name.srcs/
        │    ├── sources_1/
        │    │    ├── bd/             # BDs are regenerated from script
        │    │    │    ├── my_bd/
        │    │    │    └── ...
        │    │    └── new/            # .v file
        │    │    │      ├── .{v,vhd}
        │    │    │      └── ...
        │    │    └──ip/
        │    └── ...
        └── ...
  • 向工程中添加需要的源文件和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为例
# 创建一个新的 ILA IP
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
set_property -dict [list CONFIG.C_PROBE0_WIDTH {32} CONFIG.C_NUM_OF_PROBES {2} CONFIG.Component_Name {ila}] [get_ips ila]
#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]
generate_target {instantiation_template} [get_files $work_dir/$proj_name/$proj_name.srcs/sources_1/ip/ila/ila.xci]
update_compile_order -fileset sources_1
generate_target all [get_files  $work_dir/$proj_name/$proj_name.srcs/sources_1/ip/ila/ila.xci]
catch { config_ip_cache -export [get_ips -all ila] }
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
create_ip_run [get_files -of_objects [get_fileset sources_1] $work_dir/$proj_name/$proj_name.srcs/sources_1/ip/ila/ila.xci]
launch_runs ila_synth_1 -jobs 5
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工程以及详细的注释。


#设置项目名称和工作目录
set proj_name "vivado_led"
set work_dir [pwd]
#创建工程
#**********************************************************************************************************
create_project -force $proj_name $work_dir/$proj_name -part xazu3eg-sfvc784-1-i
# Create 'sources_1' fileset (if not found);file mkdir创建ip、new、bd三个子文件
if {[string equal [get_filesets -quiet sources_1] ""]} {
  create_fileset -srcset sources_1
}
file mkdir $work_dir/$proj_name/$proj_name.srcs/sources_1/ip
file mkdir $work_dir/$proj_name/$proj_name.srcs/sources_1/new
file mkdir $work_dir/$proj_name/$proj_name.srcs/sources_1/bd
# Create 'constrs_1' fileset (if not found)
if {[string equal [get_filesets -quiet constrs_1] ""]} {
  create_fileset -constrset constrs_1
}
file mkdir $work_dir/$proj_name/$proj_name.srcs/constrs_1/new
# Create 'sim_1' fileset (if not found)
if {[string equal [get_filesets -quiet sim_1] ""]} {
  create_fileset -simset sim_1
}
file mkdir $work_dir/$proj_name/$proj_name.srcs/sim_1/new
#************************************************************************************************************
#添加源文件
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]
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]
#添加约束文件
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]
# 添加IP的.xci文件
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]
#生成Block Design
#source $work_dir/vivado_project/$proj_name.srcs/sources_1/bd/my_bd/my_bd.tcl
#*************************************************************************************************************
# 综合
launch_runs synth_1 -jobs 5
wait_on_run synth_1
# 设置顶层文件属性
#set_property top_auto_detect true [current_project]
set_property top_file "/$work_dir/$proj_name/$proj_name.srcs/sources_1/new/led.v" [current_fileset]
#运行综合、实现和生成比特流
#synth_design -to_current_top
#指定综合顶层模块为“led”
synth_design -top led
#执行逻辑综合优化,主要是优化逻辑电路的面积、时钟频率、功耗等指标
opt_design
#执行布局,将逻辑元素映射到物理位置,并考虑时序约束
place_design
#执行布线,将物理电路中的逻辑元素通过信号线连接在一起
route_design
#将比特流写入到指定的文件中,即生成.bit文件。-force参数用于强制覆盖已有的文件
write_bitstream -force $work_dir/$proj_name.bit
#生成用于调试的信号探针,将信号探针写入到指定的文件中,即生成.ltx文件
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

  • 14
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通过Tcl脚本修改Vivado工程中DDR的自刷新时间可以按照以下步骤进行: 1. 打开Vivado,打开您的DDR IP核所在的工程。 2. 打开Tcl Console,输入以下命令: ``` open_hw_manager ``` 这将打开硬件管理器。 3. 在硬件管理器中,选择您的DDR IP核,并在左侧面板中选择“Address Editor”。 4. 在“Address Editor”中,右键单击您的DDR IP核,并选择“Add Module…” 5. 在“Add Module…”对话框中,输入以下信息,并单击“OK”: ``` Name: ddr Type: Register Address: <Your DDR IP Core Address> Word Width: 32 ``` 请将 `<Your DDR IP Core Address>` 替换为您的DDR IP核的地址。 6. 在“Address Editor”中,展开“ddr”模块,右键单击“Control”寄存器,并选择“Create New Register Slice…” 7. 在“Create New Register Slice…”对话框中,输入以下信息,并单击“OK”: ``` Name: ref_ctrl Offset: <Your DDR IP Core Control Register Address> Width: 32 ``` 请将 `<Your DDR IP Core Control Register Address>` 替换为您DDR IP核的控制寄存器地址。 8. 在Tcl Console中输入以下命令,以将自刷新时间设置为100: ``` set_property FIELD REFRESH_TIME [get_hw_register_field /ddr/ref_ctrl/ 0 REFRESH_TIME] set_property VALUE 100 [get_property PARENT [get_hw_objs -of [get_hw_registers /ddr/ref_ctrl/]]] ``` 9. 在Tcl Console中输入以下命令,以保存并退出硬件管理器: ``` close_hw_manager ``` 现在,您的DDR IP核的自刷新时间应该已经更新。请注意,在进行任何修改之前,请备份您的工程以防止出现意外情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值