时序的各种概念详见这一篇:FPGA时序分析_居安士的博客-CSDN博客
目录
时钟周期约束
主时钟
Generated Clocks(生成时钟)
计数器分频
锁相环、MMCM
分组约束
输入约束
输出约束
输入-输出约束
虚拟时钟约束
多周期约束
无需做时序约束Types of False Paths
如上图,有两种表示方法,可以说period或者waveform
主时钟指的是晶振输入给FPGA管脚的时钟,或者采用高速收发器的方法
对主时钟进行约束,用create_clock:
代码示例 create_clock -period 10 [get_ports sysclk]
意思是创建一个周期10ns的时钟,时钟管脚是sysclk(晶振的输出)
还有一种使用高速收发器产生主时钟的方法,高速收发器rxclk经过MMCM
create_clock -name rxclk -period 3.33 [get_pins gt0/RXOUTCLK]
内部模块用pins,FPGA管脚用port
比如计数器分频得到的时钟,用PLL生成的时钟,也需要约束
约束的时候先约束主时钟,再约生成时钟
create_clock -name clkin -period 10 [get_ports clkin]
如图是一个2分频电路
# Option 1:
create_generated_clock -name clkdiv2 -source [get_ports clkin] -divide_by 2 \ [get_pins REGA/Q]
REGA/Q:regA的Q端口(粉圈处)
# Option 2:
create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -divide_by 2 \ [get_pins REGA/Q]
此外,还可以用沿来定义:
create_generated_clock -name clkdiv2 -source [get_pins REGA/C] \ -edges {1 3 5} [get_pins REGA/Q]
clkdiv2 一个周期里面有clkin 3个时钟沿(1 3 5)
由锁相环和MMCM生成的时钟无需约束,vivado会自动约束
需把不同晶振的不同的时钟分成一组,否则布局布线时会很慢
osc1和osc2为两个晶振,分别输出clka,b,c,d和clke,f,g,h,代码如下:
set_clock_groups –name async_clk0_clk1 –asynchronous \
–group [get_clocks –include_generated_clocks clk0] \
–group [get_clocks –include_generated_clocks clk1]
clk0和clk1经过BUFG(经过选择,只有一个时钟作用在电路上)互斥时钟分组:
set_clock_groups –name exclusive_clk0_clk1 –physically_exclusive \ –group clk0 –group clk1
set_input_delay [-clock args] [-reference_pin args] [-clock_fall] [-rise] [-fall] [-max] [-min]
[-add_delay] [-network_latency_included] [-source_latency_included] [-quiet] [-verbose] delay objects
create_clock –name sysclk –period 10 [get_ports clk] 首先约束主时钟
set_input_delay –clock sysclk 4 [get_ports din] 约束输入延迟
这样的目的是,告诉FPGA,数据传输的时间要小于6ns
约束最大值和最小值
set_input_delay –clock sysclk –max 4 [get_ports din] 建立时间检测会用到
set_input_delay –clock sysclk –min 2 [get_ports din] 保持时钟检测会用到
双沿采集数据的情况
set_input_delay 1 –min –clock Clk [get_ports Data_In] 上升沿最小1ns延时
set_input_delay 2 –max –clock Clk [get_ports Data_In] 上升沿最大2ns延时
set_input_delay 1 –min –clock Clk [get_ports Data_In]\ -clock_fall –add_delay 下降沿最小1ns延时
set_input_delay 2 –max –clock Clk [get_ports Data_In]\ -clock_fall –add_delay 下降沿最大2ns延时
create_clock –name sysclk –period 10 [get_ports clkin]
set_output_delay –clock sysclk 6 [get_ports din]
最大延时和最小延时的约束
create_clock –name sysclk –period 10 [get_ports clkin]
set_output_delay –clock sysclk –max 2 [get_ports dout] 约束建立时间
set_output_delay –clock sysclk –min -1 [get_ports dout] hold time要取负
数据手册可以看到建立时间和保持时间的数值
双沿情况
set_output_delay –min -1 –clock Clk [get_ports Data_Out]
set_output_delay –max 3 –clock Clk [get_ports Data_Out]
set_output_delay –min -1 –clock Clk [get_ports Data_Out]\ -clock_fall –add_delay
set_output_delay –max 3 –clock Clk [get_ports Data_Out]\ -clock_fall –add_delay
对组合逻辑延时进行约束,基本不需要
set_max_delay 15 –from [get_ports din] –to [get_ports dout]
set_multicycle_path -from [get_cells rega] -to [get_cells rega] –setup -end 2
set_multicycle_path -from [get_cells regb] -to [get_cells regb] –hold -end 1
*语句中数字的含义:
对于-setup:表示该多周期路径所需要的时钟周期个数;
对于-hold:表示相对于缺省捕获沿(图中的Default hold),实际捕获沿 (图中的New hold)应回调的时钟周期个数
*参考时钟周期的选取:
-end表示参考时钟为捕获端(收端)所用时钟,对于-setup缺省为-end
-start表示参考时钟为发送端(发端)所用时钟,对于-hold缺省为-start
组合逻辑
时序逻辑