来自微信公众号 “数字芯片实验室”
程序是执行特定任务或功能的语句块。我们可以使用现有的Tcl和Synopsys命令来创建新命令。
使用proc命令创建一个程序。 proc命令的语法是
proc name args body
name参数为程序名。不能使用现有Tcl或Synopsys的命令名称。
程序的参数在args参数中指定,也可以创建没有参数的程序。 程序的参数必须是标量变量(scalar variables),不能将数组(arrays)用作程序的参数。
以下是程序示例:
# procedure max
# returns the greater of two values
proc max {a b} {
if {$a > $b} {
return $a
}
return $b
}
可以输入max 10 5来执行该程序,或者通过set bigger [max 10 5]将程序返回的值存到其它变量
Variable Scope
在Tcl中,变量作用域(Variable scope)可以是局部的(local)或全局的(global)。使用脚本和程序时,必须要了解变量的范围,以确保使用正确的变量。
程序调用时,将为程序的每个参数创建一个局部变量。在程序内部创建的变量也是局部变量。
局部变量只能被所在程序访问,并在程序终止时被删除。
在程序外部创建的变量称为全局变量。可以在程序中使用global命令访问全局变量。
global命令在程序中引用全局变量,直到程序终止。
还可以使用upvar命令访问全局变量。该命令可用于将非标量变量(例如,数组)传递给程序,因为非标量变量不能用作程序的参数。
不同变量作用域可能存在具有相同名称的变量,其中一个变量的更改不会影响另一个变量。
# Variable scope example
set gb 5
proc scope_ex1 {a b} {
echo $a $b
set gb 100
echo $gb
}
proc scope_ex2 {a b} {
echo $a $b
set gb 4.25
echo $gb
}
在此脚本示例中,第一个 gb是全局变量。 同一个变量名称gb也用于scope\_ex1和scope\_ex2程序中。
在这些程序中,gb是局部变量。 更改这三个gb变量中的一个不影响其他同名变量。
Variable Numbers of Arguments
还可以创建带有可变数量参数args的程序。 该参数必须作为参数列表中的最后一个参数
以下示例显示了如何创建带有可变数量参数args的程序:
# print the square of at least one number
proc squares {num args} {
set nlist $num
append nlist " "
append nlist $args
foreach n $nlist {
echo "Square of $n is [expr $n*$n]"
}
}
执行
squares 1 2 3 4 5
打印
Square of 1 is 1
Square of 2 is 4
Square of 3 is 9
Square of 4 is 16
Square of 5 is 25
Using Arrays With Procedures
之前提到不能将数组(arrays)用作程序的参数。如果有将数组与程序一起使用的需求时,可以将数组设为全局变量,也可以使用array的get和set命令来操纵数组。
如下示例:
proc my_proc { bar_list } {
# bar was an array in the main code
array set bar_array $bar_list;
# manipulate bar_array
return [array get bar_array];
}
set orig_data(one) {two};
set orig_data(alpha) {green};
array set new_data [my_proc [array get orig_data]];
本文转载自公众号:芯片数字实验室
原文链接:https://mp.weixin.qq.com/s/3sQ0T0OjgUlkErd-khg4pA
未经作者同意,请勿转载!
推荐阅读
- SNUG论文巡礼一:Design-Compiler Graphical 's improvement
- SNUG论文巡礼系列二:FSM Coding styles for Synthesis
- 使用$test$plusargs优化设计仿真速度
想了解更多内容,欢迎关注芯片数字实验室专栏,由于工具,你可以专注在更重要的事情上。