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 -notrace

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 /my_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 vivadoobject可以直接当作string作为其他命令的参数

当⼀些命令需要输⼊字符串时,vivado的设计对象可以直接输⼊,⽽⽆需再调⽤设计对象的NAME属性。

if {[regexp {.*enable.*} $MyObject]} { ... }

if {[regexp {.*enable.*} [get_property NAME $MyObject]]} { ... }

第⼀种写法不仅⽐第⼆种易读,同时运⾏时间更短。

12.4 写更⾼效的代码

提⾼运⾏时间的⼀种⽅法是⾼效地编写代码,以便构建⼀个容器,并在整个容器上运⾏⼀个命令,⽽不是在⼀个循环中对作为容器⼀部分的