Hardware ---Tcl 与 pt_shell 的使用

Tcl 是 Tool Command Language 的缩写,由于 PrimeTime 的命令语言是基于Tcl 标准的,所以在这大致介绍一下 Tcl 在 PrimeTime 中的基本使用。除了一些最常用的 Tcl 命令之外,主要介绍了 pt_shell 中有关对象和属性的操作。

Tcl 中的变量

与变量有关的有下列操作:
1)定义变量:set 变量名 变量值

例如: set clock_period 10

2)引用变量:$变量名

例如: echo $clock_period

3)删除变量:unset 变量名

4)打印变量:printvar 变量名(无变量名时打印所有变量)或者: echo $变量名

举个例子,在使用 PrimeTime 之前,我们可以把它设置成分页显示,以便于浏
览在运行时生成的信息,此时可以使用如下的命令:
set sh_enable_page_mode true
如果希望每次运行时 PrimeTime 总是分页显示,可以到.synopsys_pt.setup 文件
中去更改 sh_enable_page_mode 变量的设置。

命令的嵌套

在使用 PrimtTime 的过程中,命令的嵌套经常会被用到。嵌套命令时,用方括
号([])分隔开每一层的命令,例如:

命令 1 [命令 2 [命令 3] ]

在这样一个例子中,命令 3 首先被执行,它的结果将被作为命令 2 的一个参数,然
后依次执行下去。

文本的引用

在 Tcl 中,可以使用两种方法来引用文本或者说字符串:
1)弱引用:使用双引号来引用文本。在双引号里出现的变量、命令和反斜杠不会被转义,仍然保持特殊意义。
2)强引用:使用大括号来引用文本。大括号中的字符串将按照字面上被引用。

例如:set mydelay 10
echo “The value of mydelay is $mydelay”
得到的结果将是:The value of mydelay is 10,
而echo {The value of mydelay is $mydelay}
得到的结果将是:The value of mydelay is $mydelay。
除此之外,可以使用反斜杠来转义一个单一的特殊字符,以及使用 expr 命令
来得到算术表达式的值。

PrimeTime 中的对象

  • 对象的概念
    在 IC 设计中,“对象(object)”是一个常用的概念。一般来说,一个设计会包含以下的对象:Design、Cell、Port、Pin、Net、Clock 等。在分析和验证的过程中,也经常要跟这些对象打交道。因此搞清楚这些概念,才不会在使用软件的过程中遇到不必要的障碍。
    • Design:有一定逻辑功能的电路描述,它可以是独立的,也可以包含有其他
      的子设计。虽然严格地来说子设计只是设计的一部份,但是 Synopsys 也把它看作是一个 design。
    • Cell:在 Synopsys 的术语中,cell 和 instance 被认为是同样的概念,都是
      design 中例化的一个具体元件。
    • Port:指主要的 input、output 或者 design 的 I/O 管脚。
    • Pin:对应于设计中的 cell 的 input、output 或者 I/O 管脚。
    • Reference:cell 或者 instance 参考的源设计的定义。
    • Net:是指信号的名字,即通过连接 ports 与 pins 或者 pins 与 pins 而把一个设计连接在一起的金属线的名字。
    • Clock:作为时钟源的 port 或者 pin。

在 PrimeTime 中使用对象

PrimeTime 提供了一个命令来选中这些对象,或者更准确地说是建立一个这些
对象的 collection,命令的形式为:

get_objtype
其中 objtype 是这种对象的类型,可以使用“help get_*”来查看。这个命令与Design Compiler 中的 find 命令有点类似。

值得注意的是,这个命令并不是返回被选中对象的列表,而是建立一个指向被选中对象的 collection。这种方法比在 memory 中保存一个庞大的列表要节省时间和资源。要列举所选中的对象,可以用 query_objects 命令。通常可以把建立的collection 设置为变量,以方便使用,例如:

set data_ports [get_ports D[*] ]
query_objects $data_ports

另外,也可以用 all_objtype 命令来建立某种对象的 collection,例如:all_clocks、all_inputs、all_outputs、all_instances、all_registers、all_connected 等。其中all_connected 的作用是列出与某对象连接的所有 pin、port 或者 net,例如要得到所有连接到 CLOCK 的对象,可以:

query_objects [all_connected [get_nets CLOCK]]

针对 collection 的操作

1)foreach_in_collection
顾名思义,这个命令的作用是对一个 collection 中的所有的对象进行某种操作,其形式为
foreach_in_collection variable collection { body }
例如,要打印出端口总线 Y_OUTPUT 的电容:

foreach_in_collection outpin [get_ports Y_OUTPUT[*]] {
? set maxcap [get_attribute $outpin wire_capacitance_max]
? set pinnname [get_attribute $outpin full_name]
? echo “Max capacitance of port $pinname is $maxcap”
? }
说明:①问号表示命令尚未结束,出现在引号,大括号和中括号里。
②这个命令比较复杂,它的执行过程是这样的:执行 get_ports 命令得到collection;依次定义三个新的变量:outpin、maxcap 以及 pinname;然后对于collection 中的每一项,依次执行 echo 命令。
foreach_in_collection 命令是针对于 collection 的,对于一般的列表可以使用 Tcl 中的标准命令 foreach。

2)从 collection 中增加或删除对象

add_to_collection collection object
remove_from_collection collection object
其中的 object 表示要增加或者删除的对象,这两个命令将返回一个新的collection。

3)collection 的过滤,Tcl 根据一定的条件对 collection 进行过滤,可以使用 filter_collection 命令,它将在 collection 中寻找符合条件的对象,并返回一个新的 collection,如果没有匹配的对象的话将返回空的字符串。也可以 collection 命令中使用-filter参数。filter 命令中的条件表达式可以使用以下的运算符:==,!=,>,<,>=,<=,=~
例如,要列出名字是 ND2,ND21,ND3,ND4p 诸如此类的 cells:

query [get_cells * -hier -filter “ref_name =~ ND*”]
说明:在使用 PrimeTime 时可以使用缩略的命令,这里就使用了 query 来代替query_objects。

属性

属性(arritubes)可以是 PrimeTime 预定义的,也可以是从综合软件如 Design Compiler 继承下来的(例如时钟周期、输入延迟、net 的电容等),也可以是由用户定义的。与属性相关的命令有:

list_arritubes
get_arritube
report_arritube
define_user_arritube
set_user_arritube
remove_user_arritube

利用这些命令可以很方便地了解设计,例如想知道 AM2910 设计中的最大电压,可以:

get_attribute [get_designs AM2910] voltage_max

查看命令

与 Unix 相似,可以使用 help 或者 man 来查看命令的用法。例如查看与 clock相关的命令可以:

help *clock

查看命令的参数可以用如下的命令:

help -verbose


版权声明:本文为weixin_42683993原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。