目录

fpga系列-硬件时序收敛set_input_delay-最大输入延时最小输入延时建立时间保持时间

fpga系列 硬件(时序收敛):set_input_delay +最大输入延时&最小输入延时+建立时间&保持时间

Layer 1

建立时间

保持时间

最大输入延时

  • 对于最大输入延时,需确保数据在时钟的有效边沿之前已经稳定,并且满足寄存器的建立时间要求(

    T s e t u p T_{setup}

    T

    se

    t

    u

    p

    )。 可以表示为:

    最大输入延时 + T c l k − q + T s e t u p ≤ 时钟周期 \text{最大输入延时} + T_{clk-q} + T_{setup} \leq \text{时钟周期}

    最大输入延时

T

c

l

k

q

T

se

t

u

p

时钟周期

  • T c l k − q T_{clk-q}

    T

    c

    l

    k

    q

    :时钟上升沿(下降沿)到达FPGA,至FPGA内部触发器Q更新的时间。

  • T s e t u p T_{setup}

    T

    se

    t

    u

    p

    :FPGA内部触发器的建立时间

  • 如果这个条件不满足,则会产生建立时间违例(Setup Violation),表明数据可能无法在下一个时钟边沿前被正确采样。

最小输入延时

  • 对于最小输入延时,确保数据在时钟的有效边沿之后仍然保持稳定,并且满足寄存器的保持时间要求(

    T h o l d T_{hold}

    T

    h

    o

    l

    d

    )。 公式可以表示为:

    最小输入延时 ≥ T c l k − q + T h o l d \text{最小输入延时} \geq T_{clk-q} + T_{hold}

    最小输入延时

    T

    c

    l

    k

    q

T

h

o

l

d

  • 如果这个条件不满足,则会产生保持时间违例(Hold Violation),表明数据可能在时钟边沿后过早变化,导致采样错误。

set_input_delay语法

  • set_input_delay用于指定输入数据引脚相对于其时钟沿的延时,主要用于数据路径中的pin2reg(输入端口到内部寄存器的延迟):
set_input_delay delay_value [-clock clock_name] [-reference_pin pin_name] [-max] [-min] [-rise] [-fall] [-add_delay] [-clock_fall] [-level_sensitive] port_list

参数说明

  • delay_value
    输入延迟的时间值,通常以纳秒(ns)为单位。
  • -clock clock_name
    指定与输入延迟相关的时钟信号。如果不指定,默认使用设计的主时钟。
  • -reference_pin pin_name
    指定参考引脚,延迟是相对于该引脚的。
  • -max
    设置最大延迟值。
  • -min
    设置最小延迟值。
  • -rise
    仅针对上升沿设置延迟。
  • -fall
    仅针对下降沿设置延迟。
  • -add_delay
    添加延迟值到现有的延迟上,而不是替换。
  • -clock_fall
    指定延迟相对于时钟的下降沿。
  • -level_sensitive
    指定延迟是电平敏感的。
  • port_list
    需要设置延迟的输入端口列表。
set_input_delay -clock { clock } -clock_fall -fall -max 20 foo // https://www.intel.cn/content/www/cn/zh/docs/programmable/683243/20-1/input-constraints-set-input-delay.html

FPGA工具将执行的操作:

  • 计算路径延时

    • 设置 set_input_delay 后,FPGA工具主要进行的是时序分析,计算从外部输入端口到内部寄存器的数据路径是否满足建立时间和保持时间的要求。
  • 生成时序报告

    • 然后工具会生成一个详细的时序报告,显示所有路径的延时情况,并指出是否满足建立时间和保持时间的要求。

set_input_delay示例

  • 假设时钟为100 MHz的(即周期为10 ns),FPGA内部寄存器的建立时间为0.5 ns。FPGA内部寄存器的保持时间为0.4 ns。外部设备到FPGA的数据传输延迟范围为2ns至6ns:
# 定义主时钟信号及其周期
create_clock -name clk_main -period 10.0 [get_ports clk] # 100MHz时钟

# 建立时间的偏移:
set_clock_uncertainty -setup 0.5 [get_clocks clk_main]  # https://www.intel.com/content/www/us/en/docs/programmable/683068/18-1/clock-uncertainty.html
#保持时间的偏移:
set_clock_uncertainty -hold 0.4 [get_clocks clk_main] 

# 设置输入延迟
set_input_delay -max 6 -clock clk_main [get_ports data_in*] # 最大输入延时
set_input_delay -min 2 -clock clk_main [get_ports data_in*] # 最小输入延时

CG

  • set_input_delay 并不是用来延迟信号的,它只是一个静态时序分析(STA)中的约束命令,用于告诉时序分析工具输入信号相对于时钟的延迟情况。它不会对设计中的信号产生任何实际的延迟效果。如果需要对输入信号进行实际延迟,必须使用 IODELAY 或其他延迟电路。