接上一篇文章:FPGA 时序分析(二)-CSDN博客
6、输入延迟约束
输入延迟约束,其路径模型为FPGA引脚到寄存器的路径。输入延迟约束,向vivado工具说明了数据相对于时钟发生沿延迟的时间,工具根据此输入延迟时间,调整布局布线策略,已到达时序收敛的目的。
在vivado进行input delay约束时,我们告知工具的是,FPGA数据引脚的数据信号相对于FPGA时钟引脚的时钟信号的发射沿,在FPGA外部延时的最大时间和最小时间。在已知外部延时的情况下,FPGA就可以在内部布局布线时,尽可能保证进入到FPGA内部触发器的时钟和数据,达到时序收敛。
以下内容可以参考上一篇文章理解。
6.1 系统时钟同步输入约束
6.1.1 系统同步单边沿采样
对于系统同步接口,假设FPGA采用上升沿采样。为了保证数据在采样时是稳定的,锁存边沿晚于发射边沿1个时钟周期。
上图中,input_clock指的是FPGA的时钟引脚所接收到的时钟信号,data指的是到达FPGA引脚的数据信号。
数据相对于时钟的延迟,主要是外部器件的tco时间,以及PCB布线时间。其最大延迟时间为max_delay = tco_max + trce_dly_max;最小延迟时间为min_delay = tco_min + trce_dly_min;
其约束指令为:
#基于时钟上升沿的输入延迟约束,其中-clock_rise可省略
set_input_delay -clock <input_clock> -max max_delay [get_ports data] -clock_rise
set_input_delay -clock <input_clock> -min min_delay [get_ports data] -clock_rise
#基于时钟下降沿的输入延迟约束
set_input_delay -clock <input_clock> -max max_delay [get_ports data] -clock_fall
set_input_delay -clock <input_clock> -min min_delay [get_ports data] -clock_fall
6.1.2 系统同步双边沿采样
6.2 源时钟同步的输入约束
6.2.1 源时钟同步单边沿采样
源时钟同步接口数据和时钟信号边沿对齐有两种情况,一种是时钟直接送到采样寄存器;另一种是时钟经过PLL锁相环再送到寄存器。由于锁相环能对时钟相位进行调整,因此约束命令不同。
情况一:时钟直接送到采样寄存器。
FPGA引脚接收到时序图如下所示:
上图中,时钟的上升沿和数据的开始对齐,直接采样难以满足建立时间要求,因此锁存沿在发射沿后一个时钟周期。其中skew_bre指的skew before rise edge,skew_are指的是skew after rise edge,数据可能提前到达,也可能会延时到达,可以查阅外部设备手册获取参数。
最大延时即为max_delay = cycle + skew_are;
最小延时即为min_delay = cycle - skew_bre;
约束命令如下:
set_input_delay -clock <input_clock> -max max_delay [get_ports data] -clock_rise
set_input_delay -clock <input_clock> -min min_delay [get_ports data] -clock_rise
#若为下降沿采样,则可以如下约束,仅需要修改对应的延时时间计算即可。
set_input_delay -clock <input_clock> -max max_delay [get_ports data] -clock_fall
set_input_delay -clock <input_clock> -min min_delay [get_ports data] -clock_fall
情况二:时钟经过PLL后到达采样寄存器
时钟经过锁相环的情况,锁相环可以对时钟延时进行补偿,使时钟的上升沿和数据的结束对齐。此时可以直接用PLL时钟的上升沿采样数据,延时计算如下:
最大延时即为max_delay = skew_are;
最小延时即为min_delay = - skew_bre; (注意为负数,表示数据可能提前到达)
set_input_delay -clock <input_clock> -max max_delay [get_ports data] -clock_rise
set_input_delay -clock <input_clock> -min min_delay [get_ports data] -clock_rise
#若为下降沿采样,则可以如下约束,仅需要修改对应的延时时间计算即可。
set_input_delay -clock <input_clock> -max max_delay [get_ports data] -clock_fall
set_input_delay -clock <input_clock> -min min_delay [get_ports data] -clock_fall
6.2.2 源时钟同步双边沿采样边沿对齐
情况一:时钟直接送到采样寄存器。
对于双边沿采样,时钟直接送到采样寄存器的情况,时钟的边沿和数据的开始对齐,锁存沿在发生沿后半个时钟周期。
数据和时钟的时序图如下所示:
其中skew_bfe指的skew before fall edge,skew_afe指的是skew after fall edge,skew_bre指的skew before rise edge,skew_are指的是skew after rise edge,数据可能提前到达,也可能会延时到达,可以查阅外部设备手册获取参数。与单边沿的延时计算类似,上升沿采样的数据,由上一个下降沿发送;而下降沿的采样数据,由上一个上升沿发送。可得到如下结果:
上升沿最大延时为rise_max_delay= (cycle/2)+ skew_afe。
上升沿的最小延时为rise_min_delay = (cycle/2)- skew_bfe。
下降沿最大延时为fall_max_delay= (cycle/2)+ skew_are。
下降沿的最小延时为fall_min_delay = (cycle/2)- skew_bre。
输入延迟的约束命令如下:
set_input_delay -clock <input_clock> -max rise_max_delay [get_ports data] -clock_rise
set_input_delay -clock <input_clock> -min rise_min_delay [get_ports data] -clock_rise
set_input_delay -clock <input_clock> -max fall_max_delay [get_ports data] -clock_fall -add_delay
set_input_delay -clock <input_clock> -min fall_min_delay [get_ports data] -clock_fall -add_delay
情况二:时钟经过PLL后到达采样寄存器
时钟经过锁相环的情况,锁相环可以对时钟延时进行补偿,使时钟的边沿和数据的结束对齐。延时计算如下:
上升沿最大延时为rise_max_delay= skew_are。
上升沿的最小延时为rise_min_delay = -skew_bre。(注意为负数,表示数据可能提前到达)
下降沿最大延时为fall_max_delay= skew_afe。
下降沿的最小延时为fall_min_delay = - skew_bfe。(注意为负数,表示数据可能提前到达)
set_input_delay -clock <input_clock> -max rise_max_delay [get_ports data] -clock_rise
set_input_delay -clock <input_clock> -min rise_min_delay [get_ports data] -clock_rise
set_input_delay -clock <input_clock> -max fall_max_delay [get_ports data] -clock_fall -add_delay
set_input_delay -clock <input_clock> -min fall_min_delay [get_ports data] -clock_fall -add_delay
6.2.3 源时钟同步双边沿采样中心对齐
对于源时钟同步接口双边沿采样,数据和时钟中心对齐的情况(数据在时钟高低电平中心位置发生变化),发射沿和锁存沿为同一个时钟沿,其数据和时钟的关系图如下:
上图中,input_clock指的是FPGA的时钟引脚所接收到的时钟信号,data指的是到达FPGA引脚的数据信号。dv_bfe指的是:data valid before fall edge;dv_afe指的是:data valid after fall edge; dv_bre指的是,data_valid before rise edge; dv_are指的是data valid after rise edge。
上升沿最大延时为rise_max_delay= (cycle/2) - dv_bfe。 若大于此时间,则下个下降沿的建立时间无法满足。
上升沿的最小延时为rise_min_delay = dv_are。若小于此时间,则当前上升沿的保持时间无法满足。
下降沿最大延时为fall_max_delay= (cycle/2) - dv_bre。 若大于此时间,则下个上升沿的建立时间无法满足。
下降沿的最小延时为fall_min_delay = dv_afe。若小于此时间,则当前下降沿的保持时间无法满足。
输入延迟的约束命令如下:
set_input_delay -clock <input_clock> -max rise_max_delay [get_ports data] -clock rise
set_input_delay -clock <input_clock> -min rise_min_delay [get_ports data] -clock rise
#增加-add_delay的目的是告知vivado,不要覆盖上面的两条约束
set_input_delay -clock <input_clock> -max fall_max_delay [get_ports data] -clock fall -add_delay
set_input_delay -clock <input_clock> -min fall_min_delay [get_ports data] -clock rise -add_delay
当然,约束是一种方式,实际工程中,一般使用IDLEY原语和IDLEYA_CTRL原语,手动或者自动调整数据的延时时间,保证时序收敛。