本节以静态时序分析为切入口,重点理解建立时间、保持时间以及裕量分析。
寄存器延迟
- 建立时间$t_{setup}$:数据D需要提前clk上升沿多长时间到来,数据的采集才不会出错
- 保持时间$t_{hold}$:时钟上升沿到来后,数据D还需要维持多长时间不变,才不会影响输出Q
- 传输延时$t_{cq}$:时钟上升沿到来后多久,数据才能传输到Q端

建立、保持时间裕量分析
时钟无延迟的情况下:
- 建立时间:
- 建立时间最大值=$t_{cycle}-(t_{cq}+t_{logic})$
- 建立时间裕量=$t_{cycle}-(t_{cq}+t_{logic})-t_{setup}$
- 保持时间:
- 保持时间最大值=$t_{cq}+t_{logic}$
- 保持时间裕量=$t_{cq}+t_{logic}-t_{hold}$
- 建立时间:
时钟有延时的情况下:
时钟正向延迟的情况下:
- 建立时间:
- 建立时间最大值=$t_{cycle}-(t_{cq}+t_{logic})+t_{clk_delay}$
- 建立时间裕量=$t_{cycle}-(t_{cq}+t_{logic})-t_{setup}+t_{clk_delay}$
- 保持时间:
- 保持时间最大值=$t_{cq}+t_{logic}-t_{clk_delay}$
- 保持时间裕量=$t_{cq}+t_{logic}-t_{hold}-t_{clk_delay}$
- 时钟存在抖动:
- 建立时间:
- 建立时间最大值=$t_{cycle}-(t_{cq}+t_{logic})+t_{clk_delay}-t_{jitter}$
- 建立时间裕量=$t_{cycle}-(t_{cq}+t_{logic})-t_{setup}+t_{clk_delay}-t_{jitter}$
- 保持时间:
- 保持时间最大值=$t_{cq}+t_{logic}-t_{clk_delay}-t_{jitter}$
- 保持时间裕量=$t_{cq}+t_{logic}-t_{hold}-t_{clk_delay}-t_{jitter}$
- 建立时间:
- 建立时间:
时钟反向延迟的情况下:
- 建立时间:
- 建立时间最大值=$t_{cycle}-(t_{cq}+t_{logic})-t_{clk_delay}$
- 建立时间裕量=$t_{cycle}-(t_{cq}+t_{logic})-t_{setup}-t_{clk_delay}$
- 保持时间:
- 保持时间最大值=$t_{cq}+t_{logic}+t_{clk_delay}$
- 保持时间裕量=$t_{cq}+t_{logic}-t_{hold}+t_{clk_delay}$
- 建立时间:
基本同步时钟约束路径

- 建立时间裕量:$t_{setup_slack}=t_{cycle}-(t_{cq}+t_{logic})-t_{setup}+t_{clk_delay}-t_{jitter}>0$
- 保持时间裕量:$t_{hold_slack}=t_{cq}+t_{logic}-t_{hold}-t_{clk_delay}-t_{jitter}>0$
- 手动设置clk时钟周期,如:
create_clock-period 10 [get_ports clk]
- EDA会根据我们给出的$t_{cycle}$,去计算建立保持时间裕量
- EDA会优化寄存器到寄存器之间的组合逻辑2的延时$t_{logic}$和$t_{clk_delay}$,以满足建立保持时间裕量要求
- 建立时间裕量:$t_{setup_slack}=t_{cycle}-t_{logic1}-t_{in_delay}-t_{setup}+t_{clk_delay}-t_{jitter}>0$
- 保持时间裕量:$t_{hold_slack}=t_{logic1} + t_{in_delay}-t_{hold}-t_{clk_delay}-t_{jitter}>0$
- 需输入$t_{cycle},t_{in_delay}$
- EDA会优化组合逻辑1的延时$t_{logic1}$和$t_{clk_delay}$
- 建立时间裕量:$t_{setup_slack}=t_{cycle}-t_{logic3}-t_{out_delay}-t_{setup}+t_{clk_delay}-t_{jitter}>0$
- 保持时间裕量:$t_{hold_slack}=t_{logic3} + t_{out_delay}-t_{hold}-t_{clk_delay}-t_{jitter}>0$
- 需输入$t_{cycle},t_{out_delay}$
- 建立时间裕量:$t_{setup_slack}=t_{cycle}-t_{logic4}-t_{in_delay}-t_{out_delay}-t_{setup}+t_{clk_delay}-t_{jitter}>0$
- 保持时间裕量:$t_{hold_slack}=t_{logic4} + t_{out_delay}+t_{in_delay}-t_{hold}-t_{clk_delay}-t_{jitter}>0$
- 需输入$t_{cycle},t_{in_delay},t_{out_delay}$
时序违例的优化方法概述
- 建立时间违例:
- 前端设计方案:
- 关键路径上的逻辑并行:串行–>并行
- 卡诺图化简
- 插入寄存器,形成流水线设计
- 后端设计方案:
- 调整关键路径时钟的$t_{clk_delay}$,一般针对小范围的违例
- 采用多阈值单元,关键路径采用阈值小的单元
- 采用面积更小的门级单元
- 其他方案:
- 降低时钟频率,增大时钟周期(但频率不能变动太大)
- 替换先进的工艺
- 提高工作电压
- 前端设计方案:
- 保持时间违例:
- 在组合逻辑中插入延时buffer,使得$t_{logic}$变大
- 调小正向时钟延时$t_{clk_delay}$
Reference
- 新新新手Icer练习(六):静态时序分析,深入了解建立时间、保持时间及其裕量分析_哔哩哔哩_bilibili(可以说,我这篇笔记全文抄袭该视频的,只是自己打了一遍公式,加深了一下印象,记录一下。不得不感叹一句,这位博主讲得东西简单明了,优秀)