0%

FPGA设计之静态时序分析

本节以静态时序分析为切入口,重点理解建立时间、保持时间以及裕量分析。

寄存器延迟

  • 建立时间$t_{setup}$:数据D需要提前clk上升沿多长时间到来,数据的采集才不会出错
  • 保持时间$t_{hold}$:时钟上升沿到来后,数据D还需要维持多长时间不变,才不会影响输出Q
  • 传输延时$t_{cq}$:时钟上升沿到来后多久,数据才能传输到Q端
image-20250310200317813

建立、保持时间裕量分析

  • 时钟无延迟的情况下

    image-20250310200632988

    image-20250310201149618

    • 建立时间:
      • 建立时间最大值=$t_{cycle}-(t_{cq}+t_{logic})$
      • 建立时间裕量=$t_{cycle}-(t_{cq}+t_{logic})-t_{setup}$
    • 保持时间:
      • 保持时间最大值=$t_{cq}+t_{logic}$
      • 保持时间裕量=$t_{cq}+t_{logic}-t_{hold}$
  • 时钟有延时的情况下:

    • 时钟正向延迟的情况下

      image-20250310201305890

      image-20250310202332660
      • 建立时间
        • 建立时间最大值=$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}$
    • 时钟反向延迟的情况下

      image-20250310202545365

      • 建立时间:
        • 建立时间最大值=$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}$

基本同步时钟约束路径

image-20250310202657798
  • 建立时间裕量:$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}$,以满足建立保持时间裕量要求

image-20250310203602542

  • 建立时间裕量:$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}$

image-20250310204153115

  • 建立时间裕量:$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}$

image-20250310204524092

  • 建立时间裕量:$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

欢迎来到ssy的世界