XDC 约束语法解析:set_false_path#
示例命令#
1
2
| set_false_path -to [get_pins -hierarchical -filter {NAME =~ */xil_reset_sync/u_sync_r*/PRE}]
|
命令结构总览#
set_false_path -to [get_pins -hierarchical -filter {NAME =~ */xil_reset_sync/u_sync_r*/PRE}]
│ │ │ │ │ │ │
│ │ │ │ │ └───────────────────────────────────────┘
│ │ │ │ │ filter 表达式
│ │ │ │ └── 参数: 过滤条件
│ │ │ └── 开关: 递归搜索
│ │ └── 内嵌命令: 获取 pin 对象
│ └── 参数: 指定路径终点
└── 主命令: 设置 false path
XDC 与 Tcl 的关系#
| 层次 | 说明 |
|---|
| Tcl | 底层语言,提供语法框架(变量、命令、括号、通配符等) |
| XDC | 基于 Tcl 的约束文件格式,定义了一组特定命令 |
XDC 本质上就是 Tcl 脚本,只是里面调用的命令是 Vivado 定义的时序/物理约束命令。
语法元素分解#
1. Tcl 基础语法#
| 语法元素 | 写法 | 含义 | 示例 |
|---|
| 命令替换 | [命令] | 先执行 [] 内的命令,返回值替换到外层 | [get_pins ...] 返回 pin 集合 |
| 花括号引用 | {字符串} | 字符串原样保留,不做变量/命令替换 | {NAME =~ ...} |
| 双引号引用 | "字符串" | 允许变量替换 $var | 这里没用 |
| 空格分隔 | cmd arg1 arg2 | 命令和参数用空格分隔 | 整条命令 |
2. XDC/SDC 命令语法#
主命令: set_false_path#
| 参数 | 格式 | 含义 | 是否必需 |
|---|
-from | -from [对象] | 路径起点 | 可选 |
-to | -to [对象] | 路径终点 | 可选 |
-through | -through [对象] | 路径经过点 | 可选 |
-rise_from/-fall_from | | 指定边沿 | 可选 |
-setup/-hold | | 只豁免特定检查 | 可选 |
注:-from、-to、-through 至少指定一个
内嵌命令: get_pins#
| 参数 | 格式 | 含义 |
|---|
pin名 | get_pins a/b/c | 直接指定 pin 路径 |
-hierarchical | 开关(无值) | 递归搜索所有层级 |
-filter | -filter {表达式} | 过滤条件 |
-of_objects | -of_objects [cell] | 获取某个 cell 的 pin |
3. Filter 表达式语法#
| 语法 | 写法 | 含义 |
|---|
| 属性名 | NAME, DIRECTION, IS_CLOCK 等 | Vivado 对象的属性 |
| 等于 | - | 精确匹配 |
| 模式匹配 | - | 支持通配符 * ? |
| 不等于 | !=, !~ | 否定匹配 |
| 逻辑与 | && | 多条件同时满足 |
| 逻辑或 | || | 多条件任一满足 |
4. 通配符语法 (Tcl glob)#
| 符号 | 含义 | 示例 |
|---|
* | 匹配任意长度任意字符 | */xil_reset_sync/* |
? | 匹配单个任意字符 | u_sync_r? 匹配 u_sync_r0 |
[abc] | 匹配括号内任一字符 | [012] 匹配 0、1、2 |
[a-z] | 匹配范围内字符 | |
完整语法树#
set_false_path ← XDC 命令
├── -to ← XDC 参数
│ └── [ ... ] ← Tcl 命令替换
│ └── get_pins ← XDC 命令
│ ├── -hierarchical ← XDC 开关
│ └── -filter ← XDC 参数
│ └── { ... } ← Tcl 花括号引用
│ └── NAME =~ */xil_reset_sync/u_sync_r*/PRE
│ ├── NAME ← Vivado 属性
│ ├── =~ ← 模式匹配运算符
│ └── */.../* ← Tcl glob 通配符
执行流程#
| 步骤 | 动作 | 结果 |
|---|
| 1 | Tcl 解析 [...] | 发现需要先执行 get_pins |
| 2 | 执行 get_pins -hierarchical | 获取设计中所有层级的 pin |
| 3 | 应用 -filter | 筛选出 NAME 匹配通配符的 pin |
| 4 | 返回 pin 集合 | 替换到 -to 参数位置 |
| 5 | 执行 set_false_path | 对这些 pin 的路径设置 false path |
常用 get_* 命令对比#
| 命令 | 获取对象 | 典型用途 |
|---|
get_pins | Cell 的端口 | 约束到特定 pin(如 PRE/CLR) |
get_cells | 实例化的 cell | 设置属性、LOC 约束 |
get_nets | 网线 | 约束布线、debug |
get_ports | 顶层 IO 端口 | input_delay / output_delay |
get_clocks | 时钟对象 | 时钟分组、false path |
调试技巧#
在 Vivado Tcl Console 中单独运行查询命令,确认匹配结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # 查看匹配到哪些 pin
get_pins -hierarchical -filter {NAME =~ */xil_reset_sync/u_sync_r*/PRE}
# 查看某个 pin 的所有属性
report_property [get_pins u_xxx/u_sync_r0/PRE]
# 列出可用的属性名
list_property [get_pins u_xxx/u_sync_r0/PRE]
|
应用场景总结#
| 场景 | 约束写法 |
|---|
| 豁免复位同步器 | set_false_path -to [get_pins -hier -filter {NAME =~ *reset_sync*/PRE}] |
| 豁免 CDC 同步器 | set_false_path -to [get_pins -hier -filter {NAME =~ *cdc_sync*/D}] |
| 豁免静态配置信号 | set_false_path -from [get_cells cfg_reg*] |
| 异步时钟之间 | set_clock_groups -asynchronous -group clkA -group clkB |