来自微信公众号 “数字芯片实验室”

程序是执行特定任务或功能的语句块。我们可以使用现有的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优化设计仿真速度

想了解更多内容,欢迎关注芯片数字实验室专栏,由于工具,你可以专注在更重要的事情上。

发表评论

邮箱地址不会被公开。 必填项已用*标注