约束的目的 介绍 FPGA 约束原理,理解约束的目的为设计服务,是为了保证设计满足时序要求,指导 FPGA 工具进行综合和实现,约束是 Vivado 等工具努力实现的目标。所以首先要设计合理,才可能满足约束,约束反过来检查设计能否满足时序。主要涉及到 xilinx vivado xdc 约束语法,给出对应的 ISE ucf 语法。另外 quatus 的语法和 xdc 几乎兼容,原理都一样。 时序约束中最基本的是时钟,时钟有抖动(jitter),偏移(skew),占空比失真(duty cycle distorTIon)三种特性。 1、抖动,分为周期抖动(cycle jitter),周期差抖动(cycle to cycle jitter)和长期抖动(long term jitter)。 2、偏移和时钟线的长度,时序单元的负载电容和个数有关。FPGA 的全局时钟采用全铜工艺和树状结构,偏移非常小,可以忽略。 3、占空比失真就是高低电平不对称,会吞噬时序裕量。 2、基本的时钟约束 最简单的情况,设计只有一个时钟。这时候需要对这个时钟的周期进行约束,(当然也可以对占空比进行约束,默认为 50%)。如果不对时钟进行约束,我们就不知道自己的设计是否时序收敛。简单的说,比如系统时钟是 200M 的,那么周期就是 5ns,也就是说信号从一个寄存器出来,经过了一系列的组合逻辑,要在下一个时钟的上升沿到来之前被目的寄存器采样到。当然考虑到,实际情况还复杂很多。
假如设计里有很多时钟,那么哪些时钟是必须要约束的呢?
首先是从端口进入 FPGA 的时钟。其他衍生时钟(如通过 PLL 或者 MMCM 生成的)跟它是同源时钟,工具会自动推导。然后是 GT 的 rx_clk 和 tx_clk 必须要约束。最后是用户自己分频产生的行波时钟(用于简单的低频应用),必须约束。
create_clock -name clk_200m -period 5 [get_ports I_clk200]
3、跨时钟域 cdc 约束 set_clock_groups –asynchronous -group [get_clocks -include_generated_clocks clk_1] \ -group [get_clocks -include_generated_clocks clk_2] 4、input delay input delay 和 output delay 都是分析的外部延时,与 ISE 的 ucf 约束 FPGA 内部延时恰恰相反。 5、output delay 假设周期是 10ns OFFSET = OUT 4ns AFTER clock; set_output_delay 6 -clock [get_clocks ] [get_ports ] 通过把 input output register pack 到 IOB 中,和约束 slew 可以更容易满足接口时序要求。 rtl 中约束 (* IOB = “true” *) O_config_dat xdc 中约束 set_property IOB true [get_ports O_config_dat] set_property SLEW FAST [get_ports O_config_dat]
|