FPGA XDC 约束怎么写?
更新时间:2026-09-21。问题驱动短答页。入门见 XDC 约束入门 与 管脚与时序,SDC 通用语义见 SDC 约束,时序例外见 多周期与虚假路径。
一句话回答
XDC(Xilinx Design Constraints)本质是 Tcl 脚本,约束分两类:物理约束用 set_property 把 RTL 端口绑到具体管脚并指定电平标准(PACKAGE_PIN/IOSTANDARD);时序约束先用 create_clock 告诉工具时钟在哪、周期多少,再用生成时钟、时钟分组、输入/输出延迟和少量例外约束,把「真实板级时序」描述全,工具才能据此分析和优化时序。 不写或写错约束,时序报告没有意义。
一、物理(管脚)约束
tcl
# 时钟接到引脚并定电平(这是物理约束;时钟周期要用 create_clock 另外描述)
set_property PACKAGE_PIN Y9 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports {led[*]}]
set_property PACKAGE_PIN T22 [get_ports {led[0]}]管脚号要对照开发板原理图,电平要和外设匹配,见 管脚与时序。
二、时序约束
tcl
# 1) 主时钟:周期 10ns(100MHz),定义在时钟输入端口
create_clock -name sys_clk -period 10 [get_ports clk]
# 2) MMCM/PLL 输出的派生时钟通常工具自动推断;手动时用 create_generated_clock
# 3) 两个完全异步的时钟:声明互相关系为异步,工具不跨域做建立保持检查
set_clock_groups -asynchronous -group {clk_a} -group {clk_b}
# 4) 板级输入/输出延迟(相对参考时钟),让工具把片外时间算进裕量
set_input_delay -clock sys_clk -max 2.0 [get_ports data_in]
set_output_delay -clock sys_clk -max 1.5 [get_ports data_out]
# 5) 例外(谨慎、最小化)
set_false_path -from [get_ports rst_n] ;# 如异步复位这类确实不检查的路径
set_multicycle_path 2 -setup -from [get_pins a] -to [get_pins b]- 时钟是所有时序分析的根:必须先
create_clock,派生时钟、不确定度(jitter)工具会传播,PLL/MMCM 见 PLL/MMCM。 - 异步时钟域之间用
set_clock_groups -asynchronous,但电路本身仍要做 CDC 同步,见 CDC 怎么处理。 - 例外约束是「告诉工具这条路径不用按默认检查」,不能用来掩盖真正该收敛的时序。
三、写完怎么验证
- 综合/实现后看 timing report 的 WNS/WHS/TNS:负值即违例,见 时序违例怎么修。
- 用「check_timing / report_clock_interaction」查未约束端口、漏约束时钟、意外的时钟交互。
- 确保每个时钟、每组跨域、每个同步 IO 都被覆盖,见 时序报告入门。
常见坑
- 只绑管脚不写
create_clock:工具不知道目标频率,时序放任自流。 - 时钟周期填错单位(XDC 时间默认 ns)或漏掉外部时钟。
- 把跨时钟域路径全打 false_path 而不做硬件同步:功能仍可能亚稳态。
- 复位、单拍脉冲滥用 false_path/multicycle,掩盖真实问题。
- 端口位宽用
led[*]/led[3:0]匹配错误导致约束没生效。
总结
XDC 是 Tcl 约束:物理上用 set_property 绑管脚、定电平;时序上以 create_clock 建主时钟为根,配合 generated_clock、set_clock_groups 处理异步域、input/output_delay 描述板级延迟,并用最小化的 false_path/multicycle 标例外;写完必须看 WNS/WHS 和 check_timing 确认全覆盖,最忌只绑管脚不约束时钟或用例外约束硬掩盖违例。