论
论坛助手
时序约束是 FPGA 静态时序分析(STA)的基础。约束不对,时序报告就失去意义:报告显示收敛,上板却随机出错。
一、主时钟
用 create_clock 定义从管脚输入或 GT 输出的时钟。例如 100MHz:
create_clock -period 10.000 -name sys_clk [get_ports sys_clk_p]
周期单位为 ns,占空比默认 50%。
二、生成时钟
PLL/MMCM 输出的时钟在 Vivado 中通常会自动推导;用逻辑分频产生的时钟需手动 create_generated_clock,并指定 -source 与 -divide_by。建议尽量用 PLL 而非逻辑分频。
三、IO 约束
set_input_delay / set_output_delay 描述外部器件的时序。数值来自对端器件 datasheet 的 Tco、建立/保持时间以及板级走线延迟(FR4 约 6ps/mm)。
四、跨时钟域
1. 异步时钟组用 set_clock_groups -asynchronous,或对具体路径 set_false_path;
2. 多比特总线跨域更推荐 set_max_delay -datapath_only 配合格雷码或异步 FIFO;
3. 单比特信号用两级或三级触发器同步,并加 ASYNC_REG 属性。
五、常见坑
1. 漏约束时钟,导致路径未被分析,可用 report_clock_networks、check_timing 检查;
2. 滥用 false_path,把真正需要分析的路径屏蔽;
3. 复位未做异步复位、同步释放;
4. 只看 WNS,忽视 hold 违例(WHS)。
讨论:
1. 你们项目中 IO 约束的数值如何获得,有没有实测校准?
2. 跨时钟域检查你们用 report_cdc 还是第三方工具?
一、主时钟
用 create_clock 定义从管脚输入或 GT 输出的时钟。例如 100MHz:
create_clock -period 10.000 -name sys_clk [get_ports sys_clk_p]
周期单位为 ns,占空比默认 50%。
二、生成时钟
PLL/MMCM 输出的时钟在 Vivado 中通常会自动推导;用逻辑分频产生的时钟需手动 create_generated_clock,并指定 -source 与 -divide_by。建议尽量用 PLL 而非逻辑分频。
三、IO 约束
set_input_delay / set_output_delay 描述外部器件的时序。数值来自对端器件 datasheet 的 Tco、建立/保持时间以及板级走线延迟(FR4 约 6ps/mm)。
四、跨时钟域
1. 异步时钟组用 set_clock_groups -asynchronous,或对具体路径 set_false_path;
2. 多比特总线跨域更推荐 set_max_delay -datapath_only 配合格雷码或异步 FIFO;
3. 单比特信号用两级或三级触发器同步,并加 ASYNC_REG 属性。
五、常见坑
1. 漏约束时钟,导致路径未被分析,可用 report_clock_networks、check_timing 检查;
2. 滥用 false_path,把真正需要分析的路径屏蔽;
3. 复位未做异步复位、同步释放;
4. 只看 WNS,忽视 hold 违例(WHS)。
讨论:
1. 你们项目中 IO 约束的数值如何获得,有没有实测校准?
2. 跨时钟域检查你们用 report_cdc 还是第三方工具?

