vivado tcl脚本指南

本文源于《ug894-vavado-tcl-scripting》以及本人的设计实践。

编写一个Tcl脚本

当编写一个Tcl脚本时,重点在于,呈现的代码要能够增强用户体验。这就是说,撰写的代码要能像嵌入vivado的命令行一样提供相同的用户体验,例如提供嵌入式的Help和交互式命令行参数。将所有可能发生的场景考虑到也是很重要的,例如当使用get_*命令后返回的vivado对象可能是空的。编写Tcl代码时,创建用于代码中的low_level procedure也是很常见的。为了避免procedure和全局变量的名字冲突,建议在这些procedure和全局变量的名字空间内编码,这样可以避免名字冲突。

定义Tcl Procedure

因为Vivado Design Suite在其内部提供了完全的Tcl脚本翻译器,创建定制的命令和过程是简单的工作。你可以撰写可以被Vivado IDE加载或运行的Tcl脚本,或者你可以撰写procedure(表现得像新的Tcl命令,可以有参数、检查错误、返回结果)。

一个Tcl procedure用proc命令来定义,包含3个元素:procedure名字,参数列表,可执行的代码块。下面的代码时一个procedure的定义的简单例子:

proc helloProc { arg1 } {
    # This is a comment inside the body of the procedure
    puts "Hello World! Arg1 is $arg1"
}

上面这个procedure中,尽管花括号是可选的(因为helloProc只有一个参数),但是用括号把参数括起来,使得procedure的定义更容易阅读。当配rocedure接收多个参数时,花括号是必需的。

通常,一个procedure会具有预先定义好的参数。每一个参数可以具有默认值。当一个参数具有默认值时,如果所有前面的参数被指定了(译者注:这里还要体会下什么意思),就不要要再指定该参数的值了。如果没有返回其他值,procedure返回空字符串。

下面的例子定义了一个procedure,具有3个参数的reportWorstViolations:

proc reportWorstViolation { nbrPaths corner delayType } {
    report_timing -max_paths $nbrPaths -corner $corner -delay_type $delayType -nworst 1
}

当运行procedure时,所有参数都必须被赋值,如下所示:

%> reportWorstViolations 2 Slow max
%> reportWorstViolations 10 Fast min

接下来的例子也是同样的procedure,但是形式上有所不同;不同之处在于,三个参数中的最后两个有默认值。corner参数的默认值是Slow,delayType的默认参数是Max。因为在procedure的定义中执行了默认参数,当调用procedure时corner和delayType参数是可选的。

proc reportWorstViolations { nbrPaths { corner Slow } { delayType Max } } {
report_timing -max_paths $nbrPaths -corner $corner -delay_type $delayType
-nworst 1
}

当调用这个procedure时,下面的调用方式都是正确的:

%> reportWorstViolations 2
%> reportWorstViolations 10 Fast
%> reportWorstViolations 10 Slow Min

接下来的例子是一个只有一个强制参数的procedure,但是该procedure可以接收任意个额外参数。这里,在定义procedure时,在参数列表中使用了Tcl关键字args。args关键字是一个Tcl链表,可以有任意个元素,包括不含任何元素的情形。

proc reportWorstViolations { nbrPaths args } {
eval report_timing -max_paths $nbrPaths $args
}

当执行Tcl命令时,我们可以使用“变量替换”来替换一些被Tcl命令行接受或需求的命令行参数。在这种场景下,我们必须使用Tcl eval命令来执行包含Tcl变量args的的命令。在上面的例子中,变量链表$args被作为变量传递给封装好的额report_timing命令,因此需要使用eval命令。

当使用上面的procedure时,下面任何一种命令格式均可正常工作:

%> reportWorstViolations 2
%> reportWorstViolations 1 -to [get_ports]
%> reportWorstViolations 10 -delay_type min_max -nworst 2

在上面的命令中,对于第一个命令,数字2被传递给$nbrPaths参数,并被用于max_paths。在第二个和第三个命令中,数字1和10分别被用于max_paths,所有剩余的参数被传递给$args。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值