目录
1、时钟声明
1、(主)时钟定义
2、时钟不确定性
3、时钟延迟
4、生成时钟
2、输入输出路径
1、输入延迟
2、输出延迟
3、时序路径分组
4、外部属性建模
1、输入:
2、输出
3、设计规则检查(DRC)
4、虚拟时钟
5、完善时间分析
1、set_case_analysis
2、set_disable_timing
3、set_false_path
4、set_multicycle_path
参考说明
本篇就主要学习 STA约束的建立。
定义时钟时需要声明如下几个因素:
以上的约束为:
create_clock -name SYSCLK -period 20 -waveform {0 5} [get_ports SCLK]
建立时钟不确定性声明,会使整个电路的时序变得更加严苛,满足设计的稳健性。
使用 set_clock_uncertainty 进行声明。如:
指定路径的不确定性,或者虚拟时钟的不确定性:
时钟不确定性的主要来由:
时钟偏差:时钟源到达不同触发器的时间偏差;
时钟抖动:时钟边沿的超前或滞后;
时钟延迟:网络延迟和源延迟(后面介绍)
时钟延迟包含:网络延迟和源延迟。
网络延迟:时钟定义点到触发器时钟引脚 的延迟;
源延迟:时钟源到时钟定义点的延迟;
如图所示:
声明时钟延迟使用 set_clock_latency ,示例:
【注意】:
时钟树建立之后,源延迟仍然保留;
时钟树建立之前 网络延迟的声明是一个估计值,在时钟树生成之后,就会使用实际的网络延迟,定义的网络延迟就失效。
由主时钟分频或者倍频得到的新时钟,就是生成时钟。生成时钟的定义很有必要,需要告诉分析器,在分频(倍频)逻辑的输出端时钟的周期已经改变,并且时钟的周期也需要声明。
声明如下:
create_clock -name CLKP 10 [get_pins UPLL0/CLKOUT]
# 创建主时钟,周期10ns。引脚在CLKOUT
create_generated_clock -name CLKPDIV2 -source UPLL0/CLKOUT \
-divide_by 2 [get_pins UFF0/Q]
# 创建二分频逻辑输出的生成时钟
【注意】:
生成时钟也可以声明为主时钟,而每个主时钟都代表一个时钟域。
一般来说,实际电路中的生成时钟就应该声明为生成时钟,因为主时钟和生成时钟认为是同相位的。而如果将原本实际的生成时钟声明为主时钟,那么就会产生两个时钟域。影响静态时序分析。
生成时钟也可以定义源延迟和网络延迟:
如果时钟操作输出的时钟和源时钟没有太多关系(不是直接的倍频分频等),失去了相位和周期的继承性,那么此时输出的时钟就是可以定义为主时钟,而非生成时钟:
声明如下:
create_clock -name SYS_CLK -period 4 -waveform {0 2} \
[get_pins UFFSYS/Q]
create_clock -name CORE_CLK -period 12 -waveform {0 4} \
[get_pins UFFCORE/Q]
create_clock -name MAIN_CLK -period 12 -waveform {0 2} \
[get_pins UAND2/Z]
# 与单元输出的地方,建立主时钟,而非生成时钟。
约束 使用 set_input_delay
set Tclk2q 0.9
set Tc1 0.6
set_input_delay -clock CLKA -max [expr Tclk2q + Tc1] \
[get_ports INP1]
create_clock -period 15 -waveform {5 12} [get_ports CLKP]
set_input_delay -clock CLKP -max 6.7 [get_ports INPA]
set_input_delay -clock CLKP -min 3.0 [get_ports INPA]
set Tc2 3.9
set Tsetup 1.1
set_output_delay -clock CLKQ -max [expr Tc2 + Tsetup] \
[get_ports OUTB]
同时存在输入和输出延迟声明的示例:
声明如下:
create_clock -period 100 -waveform {5 55} [get_ports MCLK]
set_input_delay 25 -max -clock MCLK [get_ports DATAIN]
set_input_delay 5 -min -clock MCLK [get_ports DATAIN]
set_output_delay 20 -max -clock MCLK [get_ports DATAOUT]
set_output_delay -5 -min -clock MCLK [get_ports DATAOUT]
时序路径分组主要是看路径终点位于那个时钟组:
• set_drive
• set_driving_cell
• set_input_transition第一种已经过时,不推荐。
第一种用来给输入端口设定驱动阻抗值;
第二种功能同第一种,用法更精准更方便;
第三种更为直接,直接指定输入端口的转换时间;
• set_load
用来给容性负载建模;
最常用的两个命令:
• set_max_transition
• set_max_capacitance
主要用来检查设计中的所有端口和引脚都满足转换时间和电容的要求。
示例:
set_max_transition 0.6 IOBANK
# Sets a limit of 600ps on IOBANK.
set_max_capacitance 0.5 [current_design]
# Max capacitance is set to 0.5pf on all nets in current design.
虚拟时钟存在但是不和设计中的端口和引脚相连接。它在STA分析中用作参考,以指定相对于时钟的输入和输出延迟。
create_clock -name VIRTUAL_CLK_SAD -period 10 -waveform {2 8}
create_clock -name VIRTUAL_CLK_CFG -period 8 \
-waveform {0 4}
create_clock -period 10 [get_ports CLK_CORE]
set_input_delay -clock VIRTUAL_CLK_SAD -max 2.7 \
[get_ports ROW_IN]
set_output_delay -clock VIRTUAL_CLK_CFG -max 4.5 \
[get_ports STATE_O]
虚拟时钟的输入输出路径对应的波形:
主要使用如下命令:
- set_case_analysis:声明单元引脚上的固定值,或者输入端口的固定值;
- set_disable_timing:断开单元时序弧;
- set_false_path:STA不需要进行分析检查的路径。
- set_multicycle_path:声明可能耗费超过一个周期的路径。
上述图片中,由选择器控制端S到输出端Z的路径也算是数据路径的一部分,但是没有分析的必要。因为我们关心的是数据传输的时序情况。
set_disable_timing -from S -to Z [get_cells UMUX0]
伪路径约束很重要,对于跨时钟域的模块之间的路径,不予分析。注意,伪路径约束是单向的。
输入到输出的延迟跨越了多个时钟周期:
【1】B站 邸老师学习视频。
【2】Static Timing Analysis for Nanometer Designs A Practical Approach . J. Bhasker • Rakesh Chadha