第三课 Timing Exceptions
即时序例外
Using Timing Exceptions
上一节课所讲到的时钟约束都是针对常规的单周期时钟,默认施加在所有path上。若有些path并不是常规路径,不需要PT分析,则需要额外的约束来对其进行设置。
-
Related Commands:
-
Start and end points
这类时序例外需要有合法的路径起点和终点,对起点和终点的规定如下:
起点:输入端口,寄存器的时钟端口
终点:输出端口,寄存器的信号端口
皆可:Clock objects(跨时钟域中的时钟信号本身) -
reduce the number of timing esceptions
尽量用最少的语句覆盖全面的例外路径。
示例:
第一种:从Q2的32位输出端口至任意终点的所有路径
第二种:Q2的32位输出端口至Q3的32位输入端口,虽然覆盖了所有路径,但是PT要额外分析Q2_reg[1]至Q3_reg[2~32]是否存在连线,会消耗额外的资源
第三种:限制在了32条路径上,但是命令条数过多。
第四种:所有Clk2和Clk3时钟域之间的路径。 -
through
可以用-through命令来对经过某一个端口的所有路径施加约束,但是不推荐这种写法。因为没有明确的起点终点的情况下,PT的计算量会大大增加,影响延时的计算。
如果实在无法用-from-to解决,只能指定经过某一端口的路径,则可以用set_disable_timing命令来替换set_false_path
示例:
set_false_path -through U12/A1 -through U12/Y #优化前
set_disable_timing [get_pins U12/A1] #优化后
最后用以下命令输出查看已经添加的例外约束:
report_exceptions -ignored
check_timing
当多条约束施加在同一条路径上时,不同的约束有不同的优先级
Multicycle Paths
create_clock -period 10 [get_ports CLK]
set_multicycle_path -setup 6 -to [get_pins "C_reg[*]/D"]
在多周期时钟的setup和hold当中,hold检查的时钟周期默认要比setup提前一个时钟周期。
因此这时setup time的命令已经涵盖了hold time的要求,示例中setup检查设置在第6个时钟周期,因此hold检查默认在第5个时钟周期。
-hold选项的数字会影响hold判定边沿和setup判定边沿之间的周期差。
第四课 Timing analysis techiniques
学会在发现时序违例之后,如何分析电路
path groups
查看时序违例的命令:
report_constraint -all_violators -max_delay
大型的电路当中有几万几十万条路径,因此为了方便分析需要将路径按照一定的性质、功能、位置进行分类,
- group_path
group_path -name INPUTS -from [all_inputs] #将所有从输入端口触发的路径归纳到INPUTS当中
group_path -name OUTPUTS -to [all_outputs]
report_timing -max_paths 5 -path short #列出5条时序违例最严重的路径
report_timing -group CLK #查看CLK路径组当中的时序
min-max analysis
一种用最差的环境条件同时分析setup/hold的方法,因此同时需要包含min max值的.sdf文件
set link_path "* cba_core_max.db"
set_min_library cba_core_max.db -min_version cba_core_min.db
link_design
使用了set_min_library之后PT会自动寻找两个.db文件之中同名的电路单元、管脚和时序弧,并使用最小时序分析holdtime,最大时序分析setuptime
pre-layout导入的是事先定义的文件(需要自己写),post-layout导入的是.sdf文件,不能同时导入两个格式不同的SPEF文件。
set_operating_conditions -analysis_type bc_wc -min MIN_OC -max MAX_OC #pre-layout的导入方法
read_sdf -analysis_type bc_wc ba_design.sdf #post-layout的导入方法
Case anaysis
case analysis可以使用逻辑常数(logic constants)或者逻辑转换(logic transition)来进行时序分析,指定只在某个电平/边沿进行时序分析,一般用在测试电路当中。
***功能类似于set_false_path
#logic constants
set_case_analysis 0 [get_ports test_scan_enable] #设置为0表示告诉PT这一条path不需要分析
#logic transition
set_case_analysis rising [get_pin U2/EN]
Additional reports
有下列可用的报告命令:
report_timing [-verbose] #输出简单的时序报告
report_analysis_coverage #对时序报告做一个总结,可以加上-statur_details来获取更多细节
- Bottleneck analysis
瓶颈分析可以查看涉及许多个violation共有的cell或者路径。
可以输出查看导致多少个时序路径违例/多少ns的时序违例/fanout为多少的cell
示例:
bottleneck
- cost_type path_count #以涉及的路径数量作为排序
-max_cells 20 #列出20个违例最严重的cell
-nworst_paths 100 #最严重的路径数为100
解决的顺序途径:
先查看是否是电容、线长等是否合理,可以通过size_cell(增强驱动强度), 插入/去掉buffer等途径解决;
如果参数都合理,那么需要对(bottleneck) cell进行调整。
也可用report_delay_calculation对某个路径做非常详细的报告:
report_delay_calculation -from U1/A -to U1/Z
report_delay_calculation -from U1/Z -to U21/B
Efficient STA methodology
不同的命令对系统资源占用程度不同