时序约束告诉工具时钟频率和 IO 时序,create_clock 定义主时钟,create_generated_clock 定义派生时钟;set_input_delay/set_output_delay 约束外部 IO 时序;工具分析 setup(建立时间,数据要在时钟沿前稳定)和 hold(保持时间,数据要在时钟沿后保持);违例要降频、改流水线、优化路径。
本文概述
时序约束是 FPGA 设计必备,面试常考:create_clock、input_delay、setup/hold、违例解决。回答要给约束命令和分析。
核心要点
create_clock 定义主时钟:周期、占空比、波形(上升沿/下降沿位置)
create_generated_clock 定义派生时钟(分频/倍频/PLL 输出)
set_input_delay:输入数据相对于时钟的延迟(外部 Tco+板级延迟)
set_output_delay:输出数据要求相对于时钟的延迟(外部建立时间)
setup 检查:数据在下一个时钟沿前到达(Tdata < Tclk - Tsu);hold 检查:数据在当前时钟沿后保持(Tdata > Th)

面试官考察点
FPGA 时序核心题。面试官看你是否理解时序分析。重点听:setup/hold 公式、违例解决。
回答思路
讲时序约束命令,setup/hold 公式,违例解决方法。
参考回答
基本时钟约束。
# 主时钟 50MHz,周期 20ns
create_clock -name clk -period 20 [get_ports clk]
# 派生时钟:2 分频(PLL 输出)
create_generated_clock -name clk_div2 -source [get_pins pll/CLKOUT0] \
-divide_by 2 [get_pins reg/clk]
# 虚拟时钟(外部时钟,用于 IO 约束)
create_clock -name clk_ext -period 10
IO 约束。
# 输入延迟:外部器件 Tco=3ns + 板级 1ns = 4ns
set_input_delay -clock clk -max 4 [get_ports data_in]
set_input_delay -clock clk -min 1 [get_ports data_in]
# 输出延迟:下游器件建立时间 2ns + 板级 1ns = 3ns
set_output_delay -clock clk -max 3 [get_ports data_out]
set_output_delay -clock clk -min -1 [get_ports data_out]
-max 用于 setup 分析(最坏情况,延迟最大);
-min 用于 hold 分析(最好情况,延迟最小);
输入延迟 = 外部器件时钟到输出延迟(Tco)+ 板级走线延迟;
输出延迟 = 下游器件建立时间 + 板级走线延迟。
setup 和 hold 公式。
| 检查 | 公式 | 含义 |
|---|---|---|
| Setup(建立) | Tclk + Tskew ≥ Tco + Tdata + Tsu | 数据要在下一个时钟沿前稳定 |
| Hold(保持) | Tco + Tdata ≥ Th + Tskew | 数据要在当前时钟沿后保持 |
Setup 裕量 = Tclk - (Tco + Tdata + Tsu - Tskew)
Hold 裕量 = (Tco + Tdata) - (Th + Tskew)
裕量 > 0 满足,< 0 违例
Setup 违例解决。
降频:增大 Tclk,最直接(但可能不允许);
流水线:把长组合逻辑拆成多级,插入寄存器;
优化逻辑:减少组合逻辑层级,状态机编码优化;
物理约束:set_max_delay、关键路径布局约束;
换更快的器件/速度等级。
Hold 违例解决。
加延迟:在数据路径插入缓冲器(set_min_delay 或手动加 LUT);
降频无效:hold 检查不涉及 Tclk(同一沿发射和捕获),降频不改变 hold 裕量;
减少时钟偏斜:时钟树平衡,用全局时钟网络;
同步器:跨时钟域路径用打两拍,不做 hold 检查(set_false_path 或 set_clock_groups)。
注意。
所有时钟都要约束,未约束时钟工具不分析(默认 1GHz 假定时钟);
跨时钟域路径要 set_clock_groups 或 set_false_path,否则工具会分析(可能误报违例);
异步复位路径不做时序分析(set_false_path through 复位);
看时序报告:report_timing -setup/-hold,找最差路径。












