第九课
介绍一些特殊情况下会用到的功能和命令,如:占空比非50%的时钟,多个外部输入驱动/输出负载等等。
Define a clock
create_clock -period 2 -name my_clk [get_ports CLK]
set_input_delay -max 0.6 -clock my_clk [get_ports A]
create_clock命令时,已经给带有clock属性的时钟起名叫做my_clk,因此在设置输入延时时也需要注意,延时是相对于什么名字的时钟而言。
- duty_cycle
create_clock -period 2 -wave_form {0 0.6} [get_ports CLK]
-wave_form选项可以指定上升沿和下降沿的相对时间,从而设定时钟的初始偏移量和占空比。
但是利用-wave_form选项设定偏移量的做法并不推荐
更好的方式是用set_clock_latency
- complex
可以指定复杂信号/时钟
** Tmax = 0.6(最短的周期)- clk-q的延迟 - FF2setup
加-clock_fall选项可以设置成相对于下降沿的延迟
设置时钟的原则:1.完整 2.准确
Input/Output delay
- Multiple input paths
有多个输入路径时,即mux输入时可以用以下命令:
-add_delay选项可以告诉DC此端口有两种约束,否则后面一个约束会覆盖前面一个约束。
DC会采取保守的策略,用较差的条件进行综合。
如果用set_driving_cell命令设置驱动作为输入,那么在原来设置的input delay的基础上,会额外增加由驱动单元带来的延迟。
因此set_input_delay的值必须是零负载下的延迟。
- Multiple output paths
-clock_fall和-add_delay选项的用法与input时相同。
**由于TCL语言的特性,选项的顺序不会影响命令的执行。
TCL语言
set NAME zhangsan
set var 0 #前面是变量名,后面是变量值# if语句
if {$var} {echo "Good!"} else {echo "..."}# if语句在DC中的应用
if {[link] == 0} {
...} # []方括号可以起到嵌套命令的作用# switch结构,相当于case语句
switch -regexp -exact $NAME{ # -regexp表示用正则表达式 -exac表示精准匹配"zhangsan" {...}"lisi" {...}default {...}
} # while循环
while {$i < 10} {...incr i 1 #相当于 i++
}# for循环
for {set idx 0} {$idx < 10} {incr idx } {if {$ix ==8} {continue; } #continue和break的用法与C语言相通echo "...";
}# 数组与foreach结构
set NAMES [list "zhangsan" "lisi""wangwu""zhaoliu"]
foreach NAME $NAMES {
...} #每次都会把$NAMES中的变量赋给NAME,并执行括号中的语句#保存程序运行结果至文件
set SRC "Good night!"
set file_wr_id [open data.txt w+] #表明在当前文件夹下打开data.txt文件,w表示写,+表示若没有则创建一个新文件
puts $file_wr_id $SRC #表示将字符$SRC存入文件中
flush $file_wr_id #刷新命令
close $file_wr_id #关闭文件的命令,**一定要与打开文件的命令成对使用**#从文件中读取数据
set DST ""
set file_rd_id [open data.txt r] #r表示读取
gets $file_rd_id $DST #表示将字符$SRC存入文件中
echo "Data from file is {$DST}"
close $file_rd_id #不能忘记关闭文件#子程序
proc max {a b} { #proc为子程序关键字,max是程序名,a,b是程序变量if {$a > $b } {set y $a;} else {set y $b;}return $y;
}