下面的脚本演示了一个项目流程,该流程sythesis了设计并执行了一个完整的implementation,包括bit流生成。它基于Vivado安装树中提供的CPU示例设计。
//----------------------------------------------begin 这些官方资源的路径: [vivado安装路径]\Vivado\2017.1\examples\Vivado_Tutorial
这个路径下面的run_cpu_kintex7_batch.tcl
脚本就是Non-project模式的脚本,以我使用的Vivado2017.1为例,脚本内容为:
//----------------------------------------------end
用户手册中的示例脚本:
#
# STEP#1: define the output directory area.
#
set outputDir ./Tutorial_Created_Data/cpu_project
file mkdir $outputDir
create_project project_cpu_project ./Tutorial_Created_Data/cpu_project \
-part xc7k70tfbg676-2 -force
#
# STEP#2: setup design sources and constraints
#
add_files -fileset sim_1 ./Sources/hdl/cpu_tb.v
add_files [ glob ./Sources/hdl/bftLib/*.vhdl ]
add_files ./Sources/hdl/bft.vhdl
add_files [ glob ./Sources/hdl/*.v ]
add_files [ glob ./Sources/hdl/mgt/*.v ]
add_files [ glob ./Sources/hdl/or1200/*.v ]
add_files [ glob ./Sources/hdl/usbf/*.v ]
add_files [ glob ./Sources/hdl/wb_conmax/*.v ]
add_files -fileset constrs_1 ./Sources/top_full.xdc
set_property library bftLib [ get_files [ glob ./Sources/hdl/bftLib/*.vhdl ]]
#
# Physically import the files under project_cpu.srcs/sources_1/imports directory
import_files -force -norecurse
#
# Physically import bft_full.xdc under project_cpu.srcs/constrs_1/imports directory
import_files -fileset constrs_1 -force -norecurse ./Sources/top_full.xdc
# Update compile order for the fileset 'sources_1'
set_property top top [current_fileset]
update_compile_order -fileset sources_1
update_compile_order -fileset sim_1
#
# STEP#3: run synthesis and the default utilization report.
#
launch_runs synth_1
wait_on_run synth_1
#
# STEP#4: run logic optimization, placement, physical logic optimization, route and
# bitstream generation. Generates design checkpoints, utilization and timing
# reports, plus custom reports.
set_property STEPS.PHYS_OPT_DESIGN.IS_ENABLED true [get_runs impl_1]
set_property STEPS.OPT_DESIGN.TCL.PRE [pwd]/pre_opt_design.tcl [get_runs impl_1]
set_property STEPS.OPT_DESIGN.TCL.POST [pwd]/post_opt_design.tcl [get_runs impl_1]
set_property STEPS.PLACE_DESIGN.TCL.POST [pwd]/post_place_design.tcl [get_runs impl_1]
set_property STEPS.PHYS_OPT_DESIGN.TCL.POST [pwd]/post_phys_opt_design.tcl [get_runs impl_1]
set_property STEPS.ROUTE_DESIGN.TCL.POST [pwd]/post_route_design.tcl [get_runs impl_1]
launch_runs impl_1 -to_step write_bitstream
wait_on_run impl_1
puts "Implementation done!"
为了更好的学习使用Tcl进行工程编译,在cmd中执行[Vavado安装路径]\Vivado\2017.1\bin\vivado.bat -mode tcl
或通过快捷方式打开Vivado xxxx.x Tcll shell
软件,并逐句运行脚本。
示例脚本的细节:
- 第1步:
项目是用create_project
命令创建的。指定项目目录和目标设备。如果项目目录不存在,则会自动创建它。 在本例中,保存各种报告的输出目录与项目目录相同。
//---------------------------------------------begin
这里要注意进入Vivado Tcl Shell后,路径不可以使用Windows的反斜杠\
而应该使用正斜杠/
了。
将当前路径切换到资源文件的路径,然后创建工程,结果如下:
可以看到,名为project_cpu_project
的项目已经创建好了。打开project_cpu_project.xpr文件,可以看到项目的基本信息与脚本设置的是一致的。
//---------------------------------------------end
- 第2步:
项目中使用的所有文件都需要显式声明并添加到项目中。这是通过add_files
命令完成的。当一个文件被添加到项目中时,它被添加到一个特定的文件集。文件集是为了某种目的将文件分组的容器。在这个示例脚本中,大多数文件被添加到默认文件集(sources_1)。只有testbench文件 cpu_tb.V被添加到默认的模拟文件集sim_1中。
文件也可以用import_files
命令复制到项目目录中。通过这样做,项目将指向源文件的本地副本,而不再跟踪原始源文件。
//---------------------------------------------begin 执行第2步的命令:
这里的-fileset
选项将指定的源文件添加到其中的文件集。如果指定的文件集不存在,则返回错误。如果没有指定文件集,则默认将文件添加到source文件集。所以只需要对testbench文件和约束文件指定文件集。
可以看到,项目文件已经添加了相关文件:
//---------------------------------------------end
- 第3步:
该设计是通过在后台启动launch_run进行综合的(launch_run synth_1)。Vivado IDE自动生成在单独的Vivado会话中运行综合所需的所有脚本。因为综合是在一个不同的进程中运行的,所以在继续当前脚本之前必须等待综合完成。这是通过使用wait_on_run
命令完成的。
一旦synthesis运行完成,就可以使用open_run synth_1
命令将结果加载到内存中。没有约束的 checkpoint保存在项目目录中,在那里运行synthesis。在这个例子中,它可以在下面的路径找到: ./Tutorial_Created_Data/cpu_project/project_cpu.runs/synth_1/top.dcp
注意:名称synth_1和impl_1是synthesis和implementation运行的默认名称。可以使用create_run
命令创建额外的运行。
//---------------------------------------------begin 执行第3步的命令:
运行过程中的log会打印在控制台中:
//---------------------------------------------end
- 第4步
implementation是通过使用launch_run
命令完成的。从pre-place optimization到写入bit流的完整的P&R流程可以通过一个命令中执行。在这个示例脚本中, implementation一直到bit流生成(launch_run impl_1 -to_step write_bitstream
)。
//---------------------------------------------begin 执行第4步的命令:
运行完成之后,与我们使用图形界面运行的结果一致,生成了bit流以及相应的checkPoint。
//---------------------------------------------end
可选步骤phys_opt_design在脚本中通过属性启用STEPS.PHYS_OPT_DESIGN.IS_ENABLED
。与允许基于用户定义的条件动态调用实现命令的非项目流不同,项目流的运行必须在启动之前静态配置。这就是在本例中启用物理逻辑优化步骤而不检查放置后的时间松弛值的原因,这与使用非项目流进行编译的示例不同。
在每个实现步骤之前或之后使用Tcl hook属性STEPS..TCL.PRE
和STEPS..TCL.POST
运行生成各种报告。这些属性允许用户在使用run基础架构时指定在流中的哪个位置执行Tcl脚本。
因为实现运行是在一个单独的Vivado会话中执行的,所以需要在该会话中初始化所有Tcl变量和过程,以便脚本使用。
这可以通过以下几种方式实现:
- 方法1:在Vivado_init.tcl中定义Tcl变量和过程。这对所有的Vivado项目都有效。
- 方法2:将包含变量和过程的Tcl脚本添加到运行所使用的约束集。当打开内存中的设计时,它总是作为你的约束的一部分被执行。
- 方法3:设置
STEPS.OPT_DESIGN.TCL.PRE
到 包含变量和proc的Tcl脚本。这个脚本只在OPT_DESIGN
步骤被启用时才会被引用,默认为true。
示例脚本通过方法3来实现:
set_property STEPS.PHYS_OPT_DESIGN.IS_ENABLED true [get_runs impl_1]
set_property STEPS.OPT_DESIGN.TCL.PRE [pwd]/pre_opt_design.tcl [get_runs impl_1]
set_property STEPS.OPT_DESIGN.TCL.POST [pwd]/post_opt_design.tcl [get_runs impl_1]
set_property STEPS.PLACE_DESIGN.TCL.POST [pwd]/post_place_design.tcl [get_runs impl_1]
set_property STEPS.PHYS_OPT_DESIGN.TCL.POST [pwd]/post_phys_opt_design.tcl [get_runs impl_1]
set_property STEPS.ROUTE_DESIGN.TCL.POST [pwd]/post_route_design.tcl [get_runs impl_1]
必须指定Tcl脚本的绝对路径,因为implementation 运行是在项目树的子目录中执行的,这与执行完整编译Tcl脚本的目录不同。
注意:在上面的post-route过程中生成的大多数Tcl报告也是由Vivado自动创建的。类似地,设计 checkpoint 是在流的每个步骤之后生成的,所以在使用项目流时,通常不需要在脚本中调用write_checkpoint
命令。可以在实现implementation目录中找到所有的checkpoint和默认报告。
在implementation运行完成后,可以使用open_run impl_1
命令将实现的设计加载到内存中。