2023年11月27日发(作者:)
在vivado中使⽤tcl脚本(UG894)
本⽂源⾃UG894,主要介绍如何在vivado中使⽤tcl脚本
中如何获取tcl help
vivado中任何⾃带的命令都可以通过“-help”获取帮助信息。
也可以直接输⼊“help”取得vivado命令合集,并通过“help -category (tools)”来获取某类操作的所有命令简介。
2.⼯程模式下编译和报告⽰例脚本
该过程可以通过运⾏GUI vivado⾃动产⽣的记录⽂件查看,该⽂件中记录了⾃打开vivado后运⾏的所有命令。
1.通过create_project命令建⽴⼯程。
2.通过add_files或import_files添加⼯程⽂件。
3.通过launch_runs和wait_on_run依次进⾏综合实现。
3.在vivado中加载并运⾏⾃⼰的tcl脚本
3.1 vivado启动时⾃动初始化脚本
vivado会在启动时⾃动加载Vivado_⽂件中定义的脚本。可将⾃⼰写的proc写⼊该⽂件中,或者直接source⾃⼰的tcl脚本。
Vivado_路径为%APPDATA%/Xilinx/Vivado//Vivado_
3.2 通过source运⾏tcl脚本
可以通过source将tcl脚本加载进⼊vivado中
source
使⽤source会默认打印脚本代码内容,可通过“-notrace”隐藏代码内容
source
3.3 在vivado编译流程中添加脚本
在Setting中,找到综合、实现、⽣成⽐特流设置,都可以添加和的路径,即可在该流程之前或者之后插⼊⾃⼰的tcl脚本。
脚本编写⽅法
原⽂档这部分主要简介tcl脚本语法及经典问题,此处只挑出其中的经典问题进⾏记录
4.1 proc参数数量不定时的解决⽅法
当proc参数数量不定时,即proc有0-n个参数都可以正常运⾏时,参数可以以链表形式给出,在proc中,依次对输⼊参数列表元素进⾏分
set ports {}
# if {[llength $args] == 0} { incr help }; # Uncomment if necessary
# 以此分析参数元素,每次循环将第⼀个元素删除
局部变量是proc内部变量,该变量只在proc内使⽤,与外部变量相互独⽴(当与外部变量名字相同时,他们相互独⽴互不影响)。
全局变量是在proc外部定义的变量,属于全局命名空间变量。如果要在proc内部调⽤全局变量,需要在变量名前⽤global关键词;或者在
5.访问设计对象
vivado提供了⾮常丰富的get_*命令⽤于访问设计对象,这些命令会以列表形式返回所需内容。
5.1 对象特性
每种设计对象(net,pin,port……)都有不同种类的特性参数,可以通过get_* filter来找到某种特性的对象,可以通过report_property
来展⽰某个对象的所有特性。特性也可以增加和删除。
5.2 对象检索
通过get_*、-hierarchical、filter、-regxp、-of_objects等来检索相关对象,此处不在赘述。
# 打开⽂件前检查⽂件是否存在
if {[file exists $filename]} {
set FH [open $filename r]
if {$FH != {}} {
# The file is opened, do something
# …
close $FH
} else {
puts " File $filename could not be opened"
}
} else {
puts " File $filename does not exist"
}
proc get_file_content { filename } {
if {[catch {
set FH [open $filename r]
set content [read $FH]
close $FH
} errorstring]} {
error " File $filename could not be opened : $errorstring "
}
return $content
}
9.调⽤外部程序
使⽤exec调⽤外部程序,使⽤时要确保外部程序可以适配当前操作系统。
set result [exec /bin/perl
10.⾃定义设计规则检查(DRC)
可以⼿动将多个DRC检查加⼊DRC检查集,通过create_drc_ruledesk创建检查集,通过add_drc_checks新增检查,通过
remove_drc_checks删除检查。
create_drc_ruledeck myrules
add_drc_checks -ruledeck myrules {RAMW-1 RAMW-2 RAMW-3}
remove_drc_checks {RAMW-2} -ruledeck myrules
DRC检查集也有is_enable属性。
10.4 单独运⾏⾃定义DRC
⽤户⾃定义的DRC、DRC集合可以单独运⾏。
report_drc -check {RAMW-1}
report_drc -check {RAMW-1 RAMW-2}
report_drc -ruledecks myrules
当有⼀些运⾏结果需要多次使⽤时,最好先将其设置为⼀个变量,避免每次使⽤时都要重新检索或计算⼀遍。
12.3 vivado的object可以直接当作string作为其他命令的参数
当⼀些命令需要输⼊字符串时,vivado的设计对象可以直接输⼊,⽽⽆需再调⽤设计对象的NAME属性。
if {[regexp {.*enable.*} $MyObject]} { ... }
if {[regexp {.*enable.*} [get_property NAME $MyObject]]} { ... }
第⼀种写法不仅⽐第⼆种易读,同时运⾏时间更短。
12.4 写更⾼效的代码
提⾼运⾏时间的⼀种⽅法是⾼效地编写代码,以便构建⼀个容器,并在整个容器上运⾏⼀个命令,⽽不是在⼀个循环中对作为容器⼀部分的


发布评论