数字电路静态时序分析基础
1.TCL入门
1.1 变量、数组、列表
1.1.1 变量
1.1.1.1 设置变量替换
-
设置变量 set a “snow”
snow
-
打印变量信息 puts $a
snow
puts a
a
1.1.1.2 用[]表示命令置换/转义
-
set a [expr 3 + 4]
7
expr(express)命令是一个手工命令行计数器
-
用\表示反斜杠置换
puts “[expr $X + $Y]”2.5
puts “[expr $X + $Y]”
[expr 1.2 + 1.3]
-
用\t表示TAB
-
用\n表示换行
-
#表示注释
1.1.1.3 花括号与双引号
-
TCL对双引号的$和[]符号会进行变量替换和命令替换
puts “\t[expr $X + $Y]”2.5
-
TCL{} 中所有特殊字符变成普通字符
puts {\t[expr $X + $Y]}\t[expr $X + $Y]
1.1.2 数组
- set数组名(元素名) 值
set cell_1(ref_name) “bufx2”
set cell_1(full_name) “top/cell_1”
set cell_1(pins) “A B C”
- 取值: $数组名(元素名)
put $cell_1(ref_name)
- array指令获取数组信息
数组大小:array size cell_1
数组成员: array names cell_1
1.1.3 列表
- 设置列表
set list {list1 list2 list3}
list1 list2 list3
- 取值
puts $list
list1 list2 list3
- 列表基本操作
命令 | 功能 | 举例 |
---|---|---|
concat | 合并两个列表 | concat $list1 $list2 $list3 |
lindex | 选取列表中的某个元素 | lindex $list 1 |
llength | 列表长度 | llength $list & llength [concat $list1 $list2] |
lappend | 在列表末尾追加元素 | lappend list 4 |
lsort | 列表排序 | -real 按照浮点数大小排序 -unique 删除重复元素 |
1.2 控制流
1.2.1 控制流-if
if (condition) {
...
} else { ...
}
1.2.2 循环指令-foreach
set list1 {1,2,3}
foreach i $list1 { //i为变量
puts $i
}
1.2.3 循环控制指令-break
结束整个循环
1.2.4 循环控制指令-continue
仅结束本次循环
1.2.5 循环控制指令-while
1.2.6 循环控制指令-for
for { set i 3} {$i > 0} {incr i -1} { //初始化参数,判断语句, 重新初始化参数
puts $i
}
1.3 过程函数
1.3.1 定义
proc 函数名 参数列表 函数主体
proc add {a b} { // 函数名 参数列表 函数主体
set sum {expr $a + $b}
retutn $sum
}
1.3.2 属性
- 全局变量:过程外定义
- 局部变量:过程中使用
- 指令global,可以在过程中引用全局变量
1.4 正则匹配
1.4.1 常见匹配
命令 | 功能 | 举例 |
---|---|---|
\w | 匹配一个字母、数字、下划线 | |
\d | 匹配一个数字 | |
* | 重复零次或多次匹配 | .* |
+ | 一次或者多次匹配 | \d+ |
? | 零次或者一次匹配 | |
^ | 字符串开头 | |
$ | 字符串结尾 | |
\s | 空格 | |
. | 任意一个字符 | .+ 匹配多个 |
1.4.2 匹配指令
- regrexp
regexp {\w+\d+} “abc123”
regexp {^\d.*\d$} “1 dsf] 1”
-()捕获
%regexp {^(\w+)\s\w+\s(\d+)." “Snow is 30 years old” total name age
%puts $total
Snow is 30 years old // 第一个匹配所有
%puts $name
%puts $age
1.5 文本处理
1.5.1 open
实例:读取文件
set INPUTFILE [ open file.txt r] // r 只读; w写
while { [gets $INPUTFILE line] >= 0} { //按照行将文件复制给变量line
puts "$line"
}
close $ INPUTFILE
1.5.2 close
1.5.3 gets
按照行将文件复制给变量,文件尾返回-1
实例:求取Slack之和
slack = -0.051
slack = -0.234
…
set sum 0 //全局变量
set INPUTFILE [ open file.txt r]
while { [gets $INPUTFILE line] >= 0} {
if ([regexp {^slack\s+=\s+(-?\d+\.?\d+)} $line total slack
set sum [expr $sum + $slack]
}
}
close $INPUTFILE
puts $sum
1.6 synopsys tcl(EDA)
1.6.1 实例分析gets
注意电路与代码中模块的对应
- 语法格式:get_ports portsname
指令功能:返回design中对应的port object
-
语法格式:get_cells cellsname
指令功能:返回design中对应的cell的instance name object
reference name: 设计者设计的模块
instance name: 实例化出来的,可以例化多个
-
语法格式:get_nets netsname
语法功能:返回design中的net的 object
-
get_object_name
-
collection
这个命令可以返回指定集合中的object名字。 在Innovus或者ICC中,诸如get_cells, get_pins等get_*命令返回的是一个集合,我们称之为collection。
collection是无法返回具体的名称的。如果你想要抓取具体的名称,可以通过该命令将 collection转化成名称。
collection 指定集合的名称
- sizeof_collection [get_nets *] 返回集合大小
- sizeof_collection [get_nets *] 返回集合大小
-
语法格式: get_pins pinsname
指令功能:返回design中pin的object
1.6.2 object(对象)与其属性
- cell objiect
- pin object
- port objiect - Net object
- get_* -f :过滤属性
- get_* [object] -of :返回的也是对象
1.7 TCL在DC中的自动化Flow
-DC tcl flow
1.7.1 运行流程
- 1.运行run.csh脚本,启动DC
#!/bin/csh-f
\rm -rf *.log .svf alib reports log work #清除之前的文档
mkdir reports work #新建文件夹
dc_shell-xg-t -32bit -f./top.tcl #启动DC并运行top.tcl
-
2.建立reports与work两个文件夹。reports文件夹用于存放生成的报告,work文件夹用于存放该平台运行过程中生成的文档、脚本
-
3.启动顶层脚本top.tcl
-
4.top.tcl按先后顺序启动各个子脚本,最终生成script.tcl
-
5.DC读取script.tcl中的约束,最终完成综合,并将所有报告写入reports文件夹中。
- top.tcl脚本运行机制:
(1)set_library.tcl:生成设定库文件和search path的约束
(2)read_design.tcl:生成读入设计文件的约束
(3)creat_clock.tcl:生成时钟源相关的约束
(4)set_rst.tcl:生成复位端口约束的约束
(5)set_io.tcl:生成输入输出端口的约束
(6)set_cons.tcl:生成保存门级网表,各种report文件的约束
以上步骤只是生成DC所需要的约束文件(xxx.tcl),合并后放入script.tcl
1.7.2代码读入约束生成