序:
本篇内容,基于阅读J. Bhasker • Rakesh Chadha著作《Static Timing Analysis for Nanometer Designs》后进行的总结以及自己的观点和感想,如有不正确的地方,还请指点。读者有微电子基础将更好理解内容。(图片内容绝大部分直接引用书中)
关于STA的概念,已经提到过很多次了,STA : Static Timing Analysis。做STA都需要准备哪些东西呢?从Timing Check – Timing signoff env中可以看到需要吃sdc/netlist/spef/lib等等。其中的每一项,都可以作为一个大的专题介绍,所以做STA并不是简简单单的run工具,需要对所有的数据输入键的内容非常了解,才能是STA check更加顺遂。书上本章内容,虽然名字写的STA环境配置,但是主要还是对SDC相关内容进行介绍。这一章节就详细的描述一下sdc相关内容。
2. IO约束
对于blk/sys/top上的port端口,如果对其进行timing check,外部path到这个ports是什么状态?外部path长短?内部需要预留多长的data path去做综合或者timing check?这是IO约束的来源。
2.1 input io 约束
set Tclk2q 0.9 ; set Tc1 0.6
Tclk2q表示UFF0 ck到q的cell delay ,Tc1表示data path上的组合逻辑的delay值。
set_input_delay -clock CLKA -max [expr Tclk2q + Tc1] [get_ports INP1]
表示端口INP1关于CLKA的input delay max值为1.5ns,用于setup check
set_input_delay -clock CLKA -min 1.3 [get_ports INP1]
表示端口INP1关于CLKA的input delay min值为1.3ns,用于hold check
2.2 output io 约束
set Tc2 3.9 ; set Tsetup 1.1
set_output_delay -clock CLKQ -max [expr Tc2 + Tsetup] [get_ports OUTB]
set_output_delay -clock CLKQ -min 4.5 [get_ports OUTB]
2.3 端口处attributes
由于前面章节介绍可以知道,对于一个cell的delay计算,取决于这个cell的input trans和output load,那么对于直连端口处的cell,比如input 端口处的cell,它的input端是个port,那它的input trans如何定义呢?对于output口处的cell,它的load是个port,那这个port的外部负载是多大呢?应该怎么表示呢?这就涉及到本小节内容:
-
对于input:
可以通过set_drive/set_drive_cell/set_input_transition的方式对端口处的input slew进行设置
● set_drive : 表示端口处的驱动能力,默认没有设置的时候,认为端口处的驱动能力无限强,slew为0。
set_drive 1 [all_inputs] 表示所有的输入端口电阻为1,当电阻为0时候表示驱动能力无限强
● set_drive_cell : 用具体的cell来代替port口的外部逻辑驱动。具体的驱动能力由该cell的真实的lib值决定。
set_driving_cell -lib_cell INV3 -library slow [get_ports INPB]
● set_input_trans : 直接用trans值来表示驱动能力,在芯片设计中,也常常用这种方法。
set_input_transition 0.85 [get_ports INPC] -
对于output:
通过直接对port设置电容负载之来进行属性标识
set_load 5 [get_ports OUTX]
3. drc constraint
因为cell的delay计算,由transition和capacitance两个值,通过lib中对应的查找表来计算,而当我们trans和cap的值超过了查找表的范围,那么工具会通过外插法的办法去计算delay,我们知道这样的计算必然是不准确的,因此在做STA check时候,会有DRC相关的check ,即设定max_transition和max_capacity来保证我们delay计算的准确定。
set_max_transition 0.6 IOBANK
set_max_capacitance 0.5 [current_design]
一般在lib库里面,每一个cell都会给一个默认的max_trans值,在STA中会以改值为不可容忍值进行check,可能还会在此基础上进行更加严格的check,这个都取决于design的工艺和大小。
除此之外,还会有set_max_fanout 和set_max_area的设定
4. sdc exception
- set_case_analysis:
对cell上的pin设置常数值,从而达到某种check的需求。如下图所示的mux ,当我们的mux的S端口设置为常数值,那么在STA check时候对于设置常数值的那一路arc或者它控制的那一路arc就没有相应的tming pathcheck 了。否则正常情况下,一个mux,如果没有对它的S端设置固定的值,那么它就会对MUX的I0和I1两路都进行sta 分析。这有时候对于我们来说是不必要的,甚至是浪费的。比如在scan mode时候,scan mux控制的func端口我们其实是不需要看的。
-
set_disable_timing:
打断一个cell的timing arc,如下图所示,比如如果存在S端口到Z端口的clock,这种就很有可能导致一个clock loop的存在,那么我们这个时候可以对S到Z进行一个timing arc的打断,这时候就会少很多的分析。经常遇到的还有ISO的EN端到Z的timing arc。在使用该命令时候需要注意,要非常谨慎。因为这个打断了timing arc ,是把经过这个arc所有的path全部打断了,可能有10条path ,都经过这个arc,那么这10条path就全部不会做timing 分析。所以如果你原本的意图只是对不去看某条path的timing,在可行的条件下了,最好设置false pathset_disable_timing -from S -to Z [get_cells UMUX0]
-
set_false_path:
对存在的timing path/arc设置false path,在做STAcheck时候不去查。真实的timing arc是存在的,且也是进行了时序和noise的update,只是在打报告的时候,把这部分隐藏起来而已,和set_disable_timing有很大区别。 -
set_multicycle_path:
常常用于不同时钟周期的同步时钟之间的check,增大setup 的check 裕度。
5. set max delay约束
set_max_delay的约束,可以参考sdc–set_max_delay的注意事项详细分析。
6. path groups
不得不佩服人类的智慧。对于一个庞大的design ,里面拥有着上百万甚至上千万条的path,如果对这些path下约束?如何对这些path就行check。在做STA分析工具的时候,牛人就想到了,无论path有多少,终归逃不过四类:reg2reg reg2out in2reg in2out,在进行约束的时候,每一类的path的约束可以按照类似的方式进行约束。就简单很多了。而在timing check的时候,分类 check也会提高效率。
7. Path Segmentation
这个其实就是把正常的timing arc打断,然后对path碎片化分析,这种在真实的芯片设计中几乎没有见过,感兴趣可以参考原书。