参数 | 定义 | 工具行为 | 工具兼容性 |
---|---|---|---|
-asynchronous |
完全异步时钟组,无任何相位或频率关系(如独立晶振、不同时钟树) | 工具完全禁用组间路径的时序分析,但需用户自行处理跨时钟域(CDC)问题 | Xilinx Vivado、Intel Quartus、Gowin(等效参数-Exclusive ) |
-logically_exclusive |
逻辑互斥时钟组,同一时刻仅一个有效(如MUX选择时钟) | 工具认为组间路径逻辑上无法同时激活,直接跳过时序分析,但保留物理路径检查 | Vivado、PrimeTime、Synplify Pro |
-physically_exclusive |
物理互斥时钟组,硬件上无法共存(如不同配置模式、电源域隔离) | 工具认为组间路径物理不存在,彻底忽略路径分析,包括时序和串扰 | Vivado(需配合-add 生成多源时钟)、PolarFire |
-Exclusive
参数,同时覆盖逻辑与物理互斥场景 。-exclusive
是 -logically_exclusive
的别名,与 -asynchronous
效果相同 。-physically_exclusive
禁用串扰分析,-logically_exclusive
仅禁用时序分析 。场景:FPGA外部输入的两个独立晶振时钟(50MHz和100MHz)。
约束:
create_clock -period 20 -name clk_50m [get_ports clk_ext1]
create_clock -period 10 -name clk_100m [get_ports clk_ext2]
set_clock_groups -asynchronous -group clk_50m -group clk_100m
解释:
命令作用:禁用clk_50m
与clk_100m
之间的所有路径分析,包括跨时钟域路径。
替代方案:若使用set_false_path
,需双向约束:
set_false_path -from [get_clocks clk_50m] -to [get_clocks clk_100m]
set_false_path -from [get_clocks clk_100m] -to [get_clocks clk_50m ]
优劣对比:set_clock_groups
更高效,避免遗漏路径;set_false_path
适合局部例外路径
场景:两级MUX串联选择时钟,第一级选clk0/clk1
,第二级选clk2/clk3
。
约束:
# 第一级MUX生成时钟
create_generated_clock -name mux1_clk0 [get_pins mux1/Y] -source clk0 -add
create_generated_clock -name mux1_clk1 [get_pins mux1/Y] -source clk1 -add
# 第二级MUX生成时钟
create_generated_clock -name mux2_clk2 [get_pins mux2/Y] -source clk2 -add
create_generated_clock -name mux2_clk3 [get_pins mux2/Y] -source clk3 -add
# 设置互斥组
set_clock_groups -logically_exclusive -group {mux1_clk0 mux1_clk1} -group {mux2_clk2 mux2_clk3}
解释:
mux1_clk0
到mux2_clk2
)自动忽略 场景:模块A使用clk_fast
运行,模块B重配置时使用clk_slow
。
约束:
create_clock -name clk_fast -period 5 [get_ports clk_fast] -add
create_clock -name clk_slow -period 20 [get_ports clk_slow] -add
set_clock_groups -physically_exclusive -group clk_fast -group clk_slow
解释:
场景:测试时钟TestClk
与系统时钟SysClk
分时复用同一端口。
约束:
create_clock -name TestClk -period 50 [get_ports clk] -add
create_clock -name SysClk -period 10 [get_ports clk] -add
set_clock_groups -physically_exclusive -group TestClk -group SysClk
解释:
set_case_analysis
强制选择模式,但需额外约束且无法动态切换 。场景:主时钟clk_main
分频生成clk_div
,需约束两者为异步。
错误示范:
create_clock -name clk_main -period 10 [get_ports clk_in]
create_generated_clock -name clk_div [get_pins div/Q] -source clk_main -divide_by 2
set_clock_groups -asynchronous -group clk_main # 未包含clk_div,约束不生效!
正确约束:
set_clock_groups -asynchronous -group {clk_main clk_div} -group clk_ext
解释:
set_clock_groups
不会自动继承到生成时钟 。clk_div
,工具仍会分析clk_main
与clk_div
的同步路径。单组覆盖性:同一时钟不可分属多个互斥组,否则工具报错。
示例错误:
set_clock_groups -asynchronous -group clkA -group clkB
set_clock_groups -logically_exclusive -group clkA -group clkC # clkA重复约束!
set_clock_groups -asynchronous -group {clkA clkB} -group clkC
set_clock_groups -logically_exclusive -group clkD -group clkE
# 错误:clk1与clk2异步,但被置于同一组
set_clock_groups -asynchronous -group {clk1 clk2} -group clk3
set_clock_groups -asynchronous -group clk1 -group {clk2 clk3} # clk2与clk3需同步
约束类型 | 优先级 | 覆盖范围 | 典型应用 |
---|---|---|---|
set_clock_groups |
高 | 全局禁用组间所有路径 | 多时钟域交互、复杂时钟拓扑 |
set_false_path |
中 | 特定起点/终点的路径 | 局部路径例外(如复位信号) |
set_case_analysis |
低 | 基于逻辑条件的路径使能 | 模式选择、测试信号固定 |
工具行为示例:
若同时存在以下约束:
set_clock_groups -asynchronous -group clkA -group clkB
set_false_path -from clkA -to clkC
工具会优先执行set_clock_groups
,忽略clkA
与clkB
间路径,但clkA
与clkC
的路径仍受set_false_path
约束 。
-physically_exclusive
时,工具跳过串扰(crosstalk)分析,而-logically_exclusive
仅跳过时序分析 。set_clock_groups -physically_exclusive -group clk1 -group clk2 # 禁用时序和串扰分析
set_clock_groups -logically_exclusive -group clk3 -group clk4 # 仅禁用时序分析
set_clock_groups
vs set_false_path
维度 | set_clock_groups |
set_false_path |
---|---|---|
约束效率 | 一次性约束所有组间路径 | 需手动指定起点/终点 |
维护成本 | 时钟拓扑变化时仅需修改组定义 | 路径增减需重新约束 |
适用场景 | 多时钟交互、全局时钟域隔离 | 局部路径例外(如跨模块信号) |
选择建议:
set_clock_groups
。set_false_path
局部禁用 。set_case_analysis
对比方法 | 优势 | 劣势 |
---|---|---|
-physically_exclusive |
无需外部条件,自动全局禁用路径 | 无法动态切换时钟组 |
set_case_analysis |
支持动态模式切换(如Test vs Normal) | 需额外约束信号状态,增加复杂度 |
典型选择:
-physically_exclusive
。set_case_analysis
。-asynchronous
-logically_exclusive
-physically_exclusive
-Exclusive
,Vivado区分逻辑/物理互斥 。-exclusive
等价于逻辑互斥 。report_clock_interaction
检查组间路径是否禁用。report_cdc
验证跨时钟域约束完整性 。