网络课程《数字集成电路静态时序分析基础》的笔记 地址:https://www.iccollege.cn/portal/courseDetail/193.mooc
例如,统计时钟数量,人数显然不合理,可以用脚本语言统计,但是可以更加简单,直接用Synopsys Tcl的拓展命令更加便捷
参考资料
通过对Design Object的分析,了解和学习DC获取电路并进行解析的方法
get_ports CLK
{CLK}
get—_ports SPI
No object Found!
get_port *
{A B C D CLK OUT[0] OUT[1]}
get_ports C*
{CLKA CLKB}
get_cells U4
{U4}
get_cells *
{U1 U2 U3 U4}
get_cells *3
{U3}
get_nets INV*
{INV0 INV1}
get_nets *
{A B C D CLK BUS0 BUS1 INV0 INV1 OUT[0 OUT[1]]}
llength [get_object_name [get_nets *]]
11
sizeof_collection [get_nets *]
11
get_pins */Z
{INV0/Z INV1/Z}
get_pins */Q*
{ENCODER/Q0 ENCODER/Q1 REGFILE/Q[1] REGFILE/Q[0]}
数据类型:”object(对象)“及其“属性”
说明:
Cell object
get_attribute[get_cell -h U3] ref_name
{INV}
Pin object
get_attribute [get_pins U2/A] owner_net
{BUS0}
Port object
get_attribute [get_ports A] direction
{in}
get_attribute [get_ports OUT[1]] direction
{out}
Net object
get_attribute [gets_nets INV0]
{INV0}
get_object_name [get_nets INV0]
{INV0}
get_attribute INV0 full_name
Error:No attribute found
理解属性以后,就可以完成更多的任务:
get_ports * -f "direction==in"
{A B C D CLK}
get_pins * -f "direction==out"
{U1/Q0 U1/Q1 U2/Z U3/Z REGFILE/Q[0] REGFIEL/Q[1]}
get_cells * -f "ref_name==INV"
{U2 U3}
1.直接使用Synopsys TCL指令
get_buffers -inverter
2.人工拓展TCL指令
get_inverters
讲述一个简单的、入门级的Synopsys DesignComplier自动化方案,供初学者参考,感兴趣的同学可以对该方案进行优化升级
特点
自动化电路综合平台只需要用户将待综合的设计与库文件放入一个文件加,修改与带综合设计对象有关的环境变量参数,在命令窗唤醒DC的指令,即自动化地完成综合过程,并得到综合后的网表文件和所需报告
运行流程:
#!/bin/csh -f
# 清除之前的文档
\rm -rf *.log *svf alib* reports log work
# 新建文件夹
mkdir reports work
# 启动DC并运行top.tcl
dc_shell-xg-t -32bit -f ./top.tcl
top.tcl脚本运行机制:
注意:
工作流程:
set extension v
source[file join $::script_path test/filelist.tcl]
#调用filelist.tcl脚本
set des[open[file join $::script_path test/work/v—list]r]
set design [gets $des] #打开vlist文档
for{}{$design!=""}{set design [gets $des]}{
puts $script [format "read_file -format verilog %s"$deslgn]
#输出读入设计文件指令
}
puts $scnpt[format "current_design %s" $top]
#输出设置顶层设计指令
功能:便利目标文件下所有文件,并将拓展名(.v)符合要求的文件完成路径输出到指定的文档,最终形成DC读取verilog代码的约束,写入script.tcl中
工作流程:
proc FindFile{myDirresult}{
if([catch {cd $WDir} err]}{
puts $result $err
return}
foreach myfile [glob-nocomplam *]{
cd $myDir #切换到对应路径
if{[string equal $myfile ""]}{
return} #如果是空文件夹就返回
set fullfile [file join $myDir $myfile]
if{[file isdirectory $myfile]}{
FindFile $fullfile $result #如果有下一级路径则递归调用本函数
}elseif{[string equal [file extension $fullfile] [format ".%s" $::extension]]){#判断扩展名是否与要求一致
puts $result $fullfile}}}
功能和流程:
source [file join $::script_path test/findclk.tcl]
#调用find_clk.tcl脚本
set a [open [file join $::script_path test/work/clk_list] r]
#打开v_list文档
set b [gets $a]
set result [open[file join $::script_path test/work/script.tcl]
#DC时钟约束
for {} {$b!=""}{set b [gets $a]}{
puts $result [format "create_clock -name \"clock\" -period %u -waveform {0 %d}{ %s }" $::clk_source[expr $::clk_source/2]$b]
#将生成时钟源的指令输出到scnpt.tcl脚本
puts $result [format "set_dont_touch_network \[get_ports%s\]"$b]
#对时钟网络设置don't touch
puts $result [format "set_drive 0 \[get_ports%s\]"$b]
#设置时钟端口驱动为无穷大
puts $result [format "set_ideal_network \[get_ports%s\]"$b]
#设置时钟端为理想网线
}
close $result
功能:搜索代码中所有的时钟端口,将结果输出到work文件夹下的clk_list文档
工作流程
for {} {[eof $designfile]==0}{set fdesign [gets $designfile]}{
if{[regexp{input.*} $fdesign a]}{
#利用正则表达式匹配到声明输入端口那一行
if{[regexp {[^,( ]*clk[^,;]*}$a rport]}{
#利用正则表达式在那一行匹配后缀为clk的端口
puts $fport $rport
#将匹配到的端囗名输出到clk_list文档
}
}
}