# Vivado XDC 约束参考

> 来源: UG903 / UG835
> XDC 基于 SDC (Synopsys Design Constraints)

## 引脚约束

```tcl
# 基础引脚绑定
set_property PACKAGE_PIN <pin> [get_ports <port>]
set_property IOSTANDARD <standard> [get_ports <port>]

# 示例: LED 引脚
set_property PACKAGE_PIN V17 [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]
```

常用 IOSTANDARD:
| 标准 | 电压 | 场景 |
|------|------|------|
| LVCMOS33 | 3.3V | GPIO、LED、按键 |
| LVCMOS25 | 2.5V | 中间电平 |
| LVCMOS18 | 1.8V | DDR 辅助信号 |
| LVDS_25 | 2.5V | 高速差分对 |
| DIFF_SSTL15 | 1.5V | DDR3 数据 |

## 时钟约束

```tcl
# 主时钟 (从 pad 进入)
create_clock -period <ns> -name <name> [get_ports <port>]

# 示例: 100 MHz
create_clock -period 10.000 -name clk_100m [get_ports sys_clk]

# 50 MHz
create_clock -period 20.000 -name clk_50m [get_ports sys_clk_50]
```

## 时序例外

```tcl
# 假路径 (完全忽略时序)
set_false_path -from [get_clocks clk_a] -to [get_clocks clk_b]

# 多周期路径
set_multicycle_path 2 -setup -from [get_pins src/C] -to [get_pins dst/D]

# 输入延迟
set_input_delay -clock clk_100m -max 5.0 [get_ports data_in]

# 输出延迟
set_output_delay -clock clk_100m -max 3.0 [get_ports data_out]
```

## 分组约束

```tcl
# 对多个引脚批量设置
set_property PACKAGE_PIN U18 [get_ports {gpio[0]}]
set_property PACKAGE_PIN U19 [get_ports {gpio[1]}]
set_property PACKAGE_PIN W18 [get_ports {gpio[2]}]
set_property PACKAGE_PIN W19 [get_ports {gpio[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio[*]}]
```

## GTX/GTH 高速收发器约束

```tcl
# GTX 参考时钟（差分）
set_property PACKAGE_PIN F10 [get_ports gtx_refclk_p]
set_property PACKAGE_PIN E10 [get_ports gtx_refclk_n]

# GTX 参考时钟约束
create_clock -period 6.400 -name gtx_refclk [get_ports gtx_refclk_p]

# GTX 收发数据引脚通常自动布局，无需手动约束
# 但参考时钟必须约束
```

## 电气属性

```tcl
# 驱动强度
set_property DRIVE 12 [get_ports led]

# 上拉
set_property PULLUP TRUE [get_ports key]

# 慢速翻转率
set_property SLEW SLOW [get_ports gpio]
```

## XDC 文件加载

```tcl
# 在 Vivado TCL 中加载约束文件
add_files -fileset constrs_1 -norecurse {path/to/system.xdc}
set_property target_constrs_file {path/to/system.xdc} [current_fileset -constrset]

# 读取约束（在综合/实现脚本中）
read_xdc {path/to/system.xdc}
```

## 约束优先级

1. XDC 文件按添加顺序执行
2. 后面的约束覆盖前面的
3. `set_false_path` 优先级高于 `set_multicycle_path`
4. OOC (Out-of-Context) 模块的约束在顶层约束之前应用
