1 时序路径组
如下图所示,设计中的时序路径可以视为路径的集合,每个子路径都有一个起点和一个终点
在STA中,时序路径是根据有效的起点和有效的终点划分的
有效起点包括:输入端口或同步器件(触发器和存储器)的时钟引脚
有效终点包括:输出端口或者同步器件的数据输入端
时序路径包括四类:
-
从输入端到输出端
-
从输入端到同步器件的数据输入端
-
从一个同步器件的时钟引脚到另一个同步器件的数据输入端
-
从一个同步器件的时钟引脚到输出端
举个例子进行说明
按序号对应:
- 输入端口A到输出端口Z
- 输入端口A到UFFA/D
- UFFA/CK到UFFB/D
- UFFB/CK到输出端口Z
可以根据不同的时钟对时序路径进行分组,而组合逻辑可以认为是默认路径组
就上面的例子而言:
- CLKA组是输入端口A到UFFA/D
- CLKB组是UFFA/CK到UFFB/D
- 默认路径组是输入端口A到输出端口Z 和UFFB/CK到输出端口Z
静态时序分析和报告通常在每个时序路径组单独进行
2 外部属性建模
在之前的内容中,介绍了create_clock
、set_input_delay
和set_output_delay
,这些已经足以约束设计中执行时序分析的所有路径,但是无法获取IO引脚上准确的时序,因此还需要一些属性的加入才能准确的对环境进行建模
读入输入端口,需要指定slew,可以用一下方式:
- set_drive
- set_driving_cell
- set_input_transition
对于输出,需要指定输出引脚的负载电容,
- set_load
先对这些内容进行接口
2.1 驱动强度建模
set_drive
和set_driving_cell
用来建模外部单元在输入端口的驱动强度,如果没有这些约束,则认为驱动强度是无限的
默认情况下,输入引脚的过渡时间是0,即默认情况下驱动强度是无限的
如下图所示,set_drive明确指定了DUA输入引脚上的驱动电阻值,电阻值越小,驱动强度越大
set_drive
的约束情况如下
#指定咋在input UCLK处的电阻是100
set_drive 100 UCLK
#上升驱动强度和下降驱动强度不同
set_drive -rise 3 [all_inputs]
set_drive -fall 2 [all_inputs]
指定驱动强度还可用来计算RC互连情况下从输入端口到第一个单元的延迟值,计算方式为:延迟值 = (驱动强度 * 线网负载) + 连线延迟
set_driving_cell
提供了一种更方便、更准确的方式来描述端口的驱动能力
可以用set_driving_cell
来指定一个cell驱动的输入端口
指定方式如下:
#INPB由slow库中的INV3驱动
set_driving_cell -lib_cell INV3 \
-library slow [get_ports INPB]
#所有的inputs都是由tech3g库中的INV2驱动
set_driving_cell -lib_cell INV2 \
-library tech13g [all_inputs]
#testmode[3]由tech90gwc库中的BUFFD4驱动
set_driving_cell -lib_cell BUFFD4 \
-library tech90gwc [get_ports {testmode[3]}]
同样set_driving_cell也可以用来指定互连时从输入端口到第一个单元的延迟值
需要注意,在使用set_driving_cell
进行约束时,由于输入端看上电容性负载的存在,会导致驱动单元有一个增量延迟,而这个增量延迟会被当做输入上的附加延迟被括在内
上述方法的一种替代方式是set_input_transition
,set_input_transition
提供了一种在输入端口表示过渡时间的便捷方式,并且可以指定参考时钟,比如下面这个例子
set_input_transiton 0.85 [get_ports INPC]
set_input_transiton 0.6 [all_inputs]
set_input_transiton 0.25 [get_ports SD_DIN*]
在指定set_input_transiton是,也可以指定-max
和-min
2.2 电容性负载
set_load
可以在输出端口设置电容性负载,用来模拟输出端口驱动外部负载的能力
默认情况下电容性负载为0,也可以将负载显示指定为电容值或某个单元的输入引脚电容
比如下面这个例子
#OUTX端口有一个pF的负载
set_load 5 [get_ports OUTX]
set_laod 25 [all_outputs]
set_load -pin_laod 0.007 [gets_ports {shift_write[31]}]
可以使用-wire_load
选项指定与端口连接的连线的线载电容
如果既没有-pin_load
,也没有-wire_load
,那么默认是-pin_load
指定输出上的负载很重要,因为该值会影响驱动输出单元的延迟
set_load约束也可以用于指定内部连线上的负载,比如下面这个例子
#线载电容为 25PF
set_load 0.25 [get_nets UCNT5/NET6]