FPGA 原型验证专题 18:原型约束体系——SDC/XDC、管脚、跨片时序预算与 generated clock/例外约束
更新时间:2026-09-12。本文是「ASIC FPGA 原型验证系统」专题 06~25 深体系列分册,对应阶段 4(Vivado 综合 P&R)的约束输入。下游见 19 原型频率与时序收敛 TDM 降频/关键路径。
这一篇在链路里的位置
阶段 4 的输入是"Compiler 逻辑网表 + SDC 时序约束 + 管脚约束 + dont_touch"。约束是网表与具体板子/具体 FPGA 型号之间的桥梁:同一份网表,约束不同会得到不同频率结论。约束由 Compiler 派生(时钟域、跨片)与原型团队补齐(物理管脚、板级时钟)共同构成。
本文要回答的问题
- 一张原型工程需要哪几类约束(时钟、IO、物理、例外、保留),各自由谁提供?
- 主时钟/generated clock/虚拟时钟在多片+TDM+MMCM 场景怎么定义?
- 跨片 TDM 带来的时钟域如何约束?跨片路径是同步还是异步,set_clock_groups 怎么切?
- false path / multicycle 用在哪些原型特有场景(静态配置、跨片聚合、复位)?滥用有什么风险?
- 管脚/Bank/IO 标准、电平、板级时钟、跨片 SerDes 参考时钟如何约束?
- dont_touch/mark_debug 在 XDC/属性层怎么落,才能既保观测又不误锁优化?
- 多片工程的约束一致性、约束版本与网表版本如何绑定?
一、约束来源分工:谁提供什么
阶段 4 的输入是「Compiler 逻辑网表 + 完整约束」。同一份网表在不同约束下会得到不同的频率结论,所以约束不是附属品而是结论成立的前提。两类来源:
| 约束类别 | 提供方 | 内容 |
|---|---|---|
| 时钟域清单与时钟关系 | Compiler 自动派生(来自 RTL 时钟分析与 07 面向原型的 RTL 交付规范 层次/黑盒/电源域) | 主时钟逻辑起点、CDC 边界、generated clock 关系 |
| 跨片 TDM 约束 | Compiler 派生(分区结果,12 多 FPGA 分区算法 割集/容量/图划分/13 跨 FPGA 互联与 TDM SerDes/跨片同步/降频) | TDM 发送/接收时钟、wrapper 内部多周期、跨片口约束 |
| dont_touch/keep/mark_debug | Compiler 派生(14 可观测性插桩 dont_touch/probe/可见性预算) | 观测点、层次保留、黑盒边界 |
| 板级主时钟频率/管脚/Bank | 原型团队补齐 | 晶振管脚与频率、下载/SerDes 参考时钟、板级延迟 |
| 物理约束(Pblock 等) | 原型团队按收敛需要 | 区域约束、位置约束 |
| 例外约束(评审后) | 双方会签 | false path/multicycle |
交接形式:Compiler 输出机器生成的 auto_*.xdc(禁止手改,每次构建重生),原型团队维护 board_*.xdc 与 manual_*.xdc,三者分层加载、版本都进 manifest(20 比特流烧录与四方版本一致 manifest/门禁)。
二、时钟约束
- create_clock:落在板级晶振输入管脚(原型团队)和时钟进入 FPGA 逻辑的主时钟点上;名字、周期、波形必须与时钟清单一致;
- MMCM/PLL 输出时钟:用
create_generated_clock -source [get_pins ...MMCM/CLKIN]挂在输出脚上,工具自动按配置参数派生频率/相位——不要手写周期数字,否则改 MMCM 参数后约束静默失真; - TDM 时钟(13 跨 FPGA 互联与 TDM SerDes/跨片同步/降频):TDM 发送侧时钟多为主时钟的倍频或相位移位时钟(高速 SerDes 还涉及收发器的 TXUSRCLK/RXUSRCLK 与恢复时钟),恢复时钟(CDR)要约束为 generated clock 或单独主时钟并声明与对端发送时钟的频率关系;静态/动态 TDM 下割边信号的「逻辑时钟周期」与物理 TDM 时钟周期不同,wrapper 内部用 multicycle 表达(见下节),割边信号的等效频率换算写进 info_table 而不是伪造一个慢时钟;
- 虚拟时钟:用于没有进 FPGA 的外部参考(如对端板卡输入的理想时钟)做 IO 预算;
- 时钟清单(07 面向原型的 RTL 交付规范 层次/黑盒/电源域)中每个时钟都必须在 XDC 中找到对应,
check_timing的 unclocked/unconstrained clocks 必须清零。
三、时钟域关系:CDC 例外的边界
ASIC RTL 中的 CDC 在 RTL 签核阶段已由 CDC 工具审过(07 面向原型的 RTL 交付规范 层次/黑盒/电源域 交付时钟域表)。到原型侧的原则是:
- 真异步域之间用
set_clock_groups -asynchronous切断,例如板载时钟 vs 恢复时钟、独立晶振域;这不是为了「让时序过」,而是这些路径上本来就有两级同步器(setup/hold 与亚稳态); - 同步分频/倍频域之间不切 group,让工具按相位关系检查,必要时用 multicycle;
- 同一片内从 ASIC 同步器继承来的路径:保持检查,不能因为「反正是原型」就一刀切 false path——原型也要验证同步器真的在工作;
- 跨片路径(13 跨 FPGA 互联与 TDM SerDes/跨片同步/降频):经 TDM 寄存器打拍后,片内时序只到 wrapper 边界;两片时钟同源训练完成时可按同步关系给有限预算,非同源则声明异步并依赖接收侧弹性缓冲。
错误的时钟关系会同时造成假违例(逼工具过度优化、拖慢收敛)和漏报(真 setup 问题被 group 切掉)。
四、IO 与物理约束
- 管脚封装约束(
set_property PACKAGE_PIN)、电平标准(LVCMOS/LVDS/HSTL…)、Bank VCCO、上下拉与驱动强度,按板级原理图维护,多片平台每片一份; - 板级延迟:
set_input_delay/set_output_delay -clock ... -max/-min,板级走线、收发器固定延迟、对端 setup/hold 预算;跨片 SerDes 链路按器件手册给参考时钟抖动和通道损耗预算; - SerDes 参考时钟(MGTREFCLK)位置和频率有硬件限制(特定管脚、专用缓冲),约束与实际硬件不符会在实现后期才报错;
- 物理约束(Pblock)只在收敛需要时局部使用(19 原型频率与时序收敛 TDM 降频/关键路径),初始版本让工具自由布局。
五、时序例外:正当场景与滥用风险
原型工程中正当的例外只有有限几类,且每条必须在 manual_*.xdc 注释中写明理由和会签人:
| 例外 | 正当场景 | 滥用风险 |
|---|---|---|
set_false_path | 上电配置/静态模式选择(运行中永不变)、异步复位释放到同步器之外的路径、跨片 wrapper 内部训练/静态配置口 | 把真 CDC 同步路径切掉导致亚稳漏检;把收敛不了的路径一 false 了之 |
set_multicycle_path | TDM wrapper 内部 N 拍一次的锁存、同频启动沿错开的数据路径、使能控制的慢路径 | setup 放宽后 hold 关系没配套(默认沿变化会要求多打一拍资源) |
set_clock_groups | 真异步域、非同源跨片 | 同源恢复时钟误切,掩盖跨片漂移问题 |
set_disable_timing | 仅黑盒内部、专用原语要求 | 几乎不该出现在用户约束中 |
复位路径是重灾区:异步复位的释放路径在带复位同步器时可 false,复位有效沿到普通寄存器一般不可 false(取决于库单元模型)。每条例外都要能回答「ASIC 侧这条路径怎么签的」,原型例外集合应是 ASIC 例外集合的子集加 TDM 增量,而不是收敛压力下的自由发挥。约束评审与 RTL 评审同级。
六、保留与观测约束的厂商侧落点
Compiler 语义 → XDC/属性的落点(14 可观测性插桩 dont_touch/probe/可见性预算 详述语义):
dont_touch实例/网线:set_property DONT_TOUCH TRUE [get_cells ...]/[get_nets ...],综合与实现两阶段都要保(综合属性 + XDC 双保险);- 观测点:
mark_debug(综合前标记,进 .ltx 供 ILA 自动识别)或直接连入 trace IP probe 端口; - 时钟类网线:
set_property CLOCK_DEDICATED_ROUTE FALSE只能在有明确理由时用于局部时钟,正常时钟必须走专用时钟布线; - 层次保留:
KEEP_HIERARCHY与网表导出的层次锚点对齐(16 GateID 与逻辑网表模型 cell/net/ID 分配)。
误锁的代价:dont_touch 范围过大会把本该复制的高扇出网锁死、把本该 retiming 的流水线锁死,频率明显下降——保留清单按「观测必需 + 边界必需」最小化,定期随插桩清单一起瘦身。
七、多片一致性与约束质量门禁
多片工程的约束纪律:
- 公共约束单源:时钟命名、例外模板由 Compiler 按片生成,禁止各片手工漂移;板级参数按片参数化(同一模板,不同管脚表);
- 每次构建跑约束质量门禁:
check_timing(无 unconstrained/internal-only clock)、约束 lint(无悬空对象、无重复/冲突例外)、例外覆盖率审计(每条 false path 必须命中真实路径,0 命中的僵尸约束删除——它往往意味着网表已变而约束没跟着改); - CDC 交叉核对:约束里的 clock groups 与 RTL CDC 报告的域边界自动 diff,新增/消失的域必须解释;
- 约束与网表版本同进 manifest,改约束即新版本构建(20 比特流烧录与四方版本一致 manifest/门禁),严禁「比特流不动、XDC 现场改」。
八、约束是频率可信度的前提
阶段 6/7 引用原型产生的任何频率/活动结论(24 活动覆盖率与性能调试闭环 热点/瓶颈/回放/25 真实激励驱动 ASIC 签核 SAIF 反标/边界),前提条件清单包括:时钟完整无遗漏、例外全部评审在册、跨片关系与 TDM 比率参数化记录、约束版本与比特流/info_table 同源。约束造假(过度 false path、虚构时钟)能让任何频率数字「达标」,但板子会在真实负载下以亚稳态和间歇性挂死把账讨回来——时序报告的质量上限就是约束集的质量。
九、约束评审与回归:把约束当成需要 QA 的设计资产
约束不像 RTL 那样有波形可看,它的错误是「静悄悄的」——一条写错的 false path 不会立刻让仿真失败,却可能让一颗本该报错的路径蒙混过关,直到上板甚至交付后才以偶发故障现身。正因如此,成熟原型团队会把约束当作和 RTL 同级、需要评审与回归的设计资产,而不是实现工程师的私人配置。
先做静态的约束健康检查。 工具普遍提供约束审计命令(如时序摘要里的 unconstrained paths、no input delay/no output delay 告警、report_exceptions 的覆盖/忽略情况、report_clock_interaction 的时钟关系矩阵)。门禁上至少要查四类问题:一是有没有未约束的内部路径或端口,一个忘了建时钟的 MMCM 输出会让整片逻辑「裸奔」却报告通过;二是时序例外是否被更宽泛的例外覆盖而失效(被 ignored/removed 的例外往往意味着作者以为豁免了、实际没有,或反之);三是例外端点是否存在(拼错的层级名在某些流程里只是静默不生效);四是有没有「豁免一切」式的危险写法,如对所有输入、所有异步时钟一刀切。把这些检查脚本化、在每次构建末尾自动产出并比对,是约束回归的底座。
再做跨构建的差异回归。 原型每改一次分区、升一次工具版本,时钟拓扑和路径都可能变。应固化一份「约束差异对比」:这一版相比上一版,新增/消失了哪些时钟、哪些路径第一次变成 unconstrained、哪些例外的命中路径集合发生了变化。很多经典事故都发生在「重构后某模块换了时钟,旧 false path 不再命中,新出现的真 CDC 路径没人管」之时。让工具报告例外实际命中的路径列表并做版本 diff,能在评审时直接看到「这条豁免现在到底罩住了谁」。
评审时追问的不是语法,而是意图与证据。 每一条非平凡例外都应附带三件东西:为什么这条路径不满足单周期假设(多周期的使能电路长什么样、异步的是哪两个域)、对应的设计侧安全机制在哪里(同步器实例、异步 FIFO、握手),以及谁在什么时候批准。评审重点抓两类典型坏味道:一是「为了过 timing 而 false path」——正确顺序永远是先确认电路安全或改设计收敛,再用约束表达事实,约束是描述不是手段;二是例外范围过大,正确做法是精确到具体起点/终点或时钟对,避免顺手豁免同域内的其他违规路径。
把 CDC 检查单列一道关。 时序约束门禁之外,应跑专用 CDC 结构检查(识别跨域信号有无同步器、多位跨域是否经握手/FIFO、异步复位释放是否同步、同步器有无被综合优化),因为 STA 对真正的异步路径本来就给不出有意义的建立保持判定,单看时序报告全绿毫无意义。CDC 工具报告的每一条违例要么修设计、要么在评审确认后按已知风险签字豁免并登记。约束 QA、CDC QA、时序收敛三者合起来,才构成「这份比特流的频率与跨域是可信的」完整证据——这正是本篇标题里「频率可信度前提」的落地方式。
十、频率可信度如何贯穿下游:一个数字的旅行
本篇反复强调「约束是频率可信度的前提」,这一节把这句话落到数据流上,看一个声称的原型频率,在经过综合实现、激励运行、活动回映到最终 ASIC 分析的整条链路中,每一站需要什么证据、又可能在哪里被污染。
在实现站,可信的不是工具顶部那个绿色的「Timing Met」,而是一组可追溯的事实:时钟是怎么定义和生成的、所有跨域是否被正确识别并由同步电路兜底、例外是否经评审、报告覆盖的路径集合是否完整(有没有 unconstrained 端点稀释了结论)、是在什么利用率和什么 corner/电压温度假设下收敛的。如果约束缺失,工具可能把大量本应分析的路径排除在检查之外,此时 WNS 为正只代表「被检查到的那部分过了」,这是频率数字最常见的注水点。因此阶段 4 交付给阶段 5 的不只是一个比特流,还应附带一份频率/时序证据包:各时钟的目标与达成频率、跨域清单及签字、剩余违例与 waiver 台账。
在运行站,频率可信度要和「实际怎么跑的」对账。原型可能为了多路时分复用(TDM)降频、为配合 co-model 停钟、或在重插桩版本里因拥塞跑到更低频率;采集到的性能数据若直接按标称频率折算周期,就会系统性失真。所以每个 build 的头部必须记录:每个域真实综合频率、TDM 倍率、哪些区间处于停钟/单步模式、插桩等级。脱离这些上下文,「原型上测出 XXX Mbps」这类结论无法被下游正确解释——性能数字必须回到「逻辑周期数」这个与频率解耦的中间量,才能跨 build、跨频率复用。
在回映与签核站,频率的角色更微妙:如收官篇所述,FPGA 频率这个物理量本身绝不迁移给 ASIC,真正迁移的是每个逻辑周期发生了多少次翻转这类活动概率。但要把「物理时间里的翻转次数」正确折算成「每个逻辑周期的活动率」,分母用的逻辑周期数必须来自可信的时钟与 TDM 定义——这恰恰回溯到阶段 4 的约束。若时钟约束错了、停钟区间没从分母里扣除、TDM 时槽表对不上,活动率 α 就会偏差,而 α 是 P=αCV²f 里唯一来自原型的输入,误差会直接灌进 ASIC 功耗结论。一个频率/时钟定义上的小错,就这样在链路末端被放大成签核级数字的硬伤。
这也解释了为什么本系列要为约束单独立一册、并把它放在「上板运行」之前:约束不是实现阶段的局部事务,而是一条证据链的第一环。下游每一站都默认「上游对时钟和时间的定义是诚实且自洽的」,一旦第一环松动,后面的性能测量、活动统计、功耗签核看似各有工具背书,实则建立在错误的时间基准上。工程上的应对是把时钟/频率元数据随 build 一路携带、站站对账(实现报告→运行头→采集头→回映折算参数→签核可信度报告),并在每个交接面做版本与数值的门禁。理解了「一个频率数字的旅行」,就理解了阶段 4 在整个 06~25 链路里的真实权重:它交付的不是收敛本身,而是让后续所有以「周期/时间」为单位的结论得以成立的时间基准信用。
十一、约束实操清单:从接手一个原型工程到敢说「时序可信」
理论讲完,这一节给出一份可照做的实操清单,按接手原型工程的时间顺序组织,目标是让你在放行一次构建之前,能有依据地说出「这份比特流在我检查过的时钟和跨域上是可信的」。
第一步,重建时钟拓扑图,不相信任何口头假设。 从顶层端口和时钟原语出发,列出所有外部输入时钟(频率、来源晶振、引脚电平)、所有 MMCM/PLL 及其派生时钟(频率、相位、驱动哪些模块)、所有门控和分频使能、所有外部器件随路时钟。用工具的时钟报告核对,画出域与域之间的关系表:同步(同周期或已知倍数相位)、异步(无固定关系)、不可达。这张图是后续一切约束和 CDC 判定的基准,且必须随 RTL 演进更新——大量约束事故的根源是「图是去年的,时钟早改了」。
第二步,检查时钟约束的完备性与真实性。 逐条核对:每个输入时钟都有 create_clock,周期波形与原理图晶振一致(不是抄来的旧值);派生时钟要么由工具自动推导且在报告中可见,要么显式约束并核对推导结果;没有任何工作时钟处于「未约束」状态(报告里的 unconstrained clock/path 必须清零或逐条解释)。特别检查被 TDM 复用或经过额外分频的时钟:它们的实际工作频率与标称频率不同,下游活动折算要用实际值,约束也要反映这个现实。对只用于配置的慢速 JTAG 时钟,也要明确它与功能域的异步关系,而不是放任不管。
第三步,审查全部时序例外,逐条要证据。 导出例外列表,对每条 false path、multicycle、clock group 追问四件事:它对应哪个真实的电路事实(使能节拍、异步域、静态配置)?设计侧的安全机制在哪(同步器实例、异步 FIFO、握手)?范围是否最小(精确到时钟对或端口,而不是整网豁免)?是否仍被工具实际命中(没有被更宽的例外覆盖)?凡是回答不了的,先删例外重新跑时序——让真实违例暴露出来,远好于留一块豁免黑幕。对「为了过报告」的例外一律打回,要求改设计(加流水、降频、拆路径)后再谈。
第四步,用独立 CDC 工具做结构检查。 列出全部跨域信号,核对单 bit 有两级同步、脉冲跨域有握手或 toggle 同步、多 bit 走了 FIFO/握手机制、异步复位经同步释放、同步器没被综合复制或优化。CDC 报告的每条违例要么修、要么评审签字进 waiver 台账并写明残余风险。同时检查复位树:有没有异步复位未经同步释放导致的复位撤销亚稳窗口,多片复位是否能做到顺序确定。
第五步,核对物理与接口约束。 引脚、电平标准、驱动强度与板级原理图一致;与外部芯片的接口延迟(input/output delay)按器件手册填写;高速收发器参考时钟和线速率正确。原型适配中引入的调试接口、TDM 逻辑、替换存储的端口也要确认纳入了约束,而不是作为「反正只是原型」的附加物裸露在时序分析之外——采集和 TDM 路径违例同样会污染功能和测量结果。
第六步,留证据、定门禁、可重跑。 把上述报告(时钟摘要、时序摘要、unconstrained 清单、例外命中表、CDC 报告、waiver 台账)随 build 归档,并把检查脚本化接入构建流程:未约束路径非零、新增未评审 CDC、例外命中集合相对上版异常变化,都直接让构建失败。最后形成一句话放行结论:在哪些时钟、什么频率、哪些已签字的跨域假设下,这份比特流时序可信;哪些角落仍是估算或已知风险。时序可信从来不是工具给的绿色对勾,而是工程师用这六步检查换来的、可向阶段 5~7 下游负责的判断。
十二、多芯片、多工艺角与降级运行:约束系统的边界情形
主线流程假设单芯片、单频点、理想工况,但真实原型项目里约束系统还要回答几类边界情形;处理不好,时序报告的绿色对勾同样会失真。这一节把这些边角问题集中讲透。
多芯片协同的时钟关系。 多片 FPGA 之间用随路时钟或收发器传数据时,约束不能只描述片内:要明确跨片接口两侧时钟的同源关系(是否来自同一时钟发生器/同一参考时钟)、板级走线延迟(用 set_input_delay/set_output_delay 或端口延迟近似)、以及收发器恢复时钟与本地时钟的异步边界。即便片间走的是带弹性缓冲和握手的异步协议,也应在约束中把这对时钟声明为异步并确认设计侧有同步/缓冲机制——不能因为「信号出了芯片」就让它从时序分析里彻底消失。多片共同时钟分配器的配置(分频比、相位)应与片内约束交叉核对,一张跨片时钟拓扑图要能同时解释每颗芯片的约束文件。
多角多模(MMMC)思维在原型上的简化版本。 ASIC 签核要在多个工艺、电压、温度角下分析;FPGA 原型虽没有工艺角选择(出厂器件已定),但仍要考虑慢速档器件、不同工作温度和电压下的余量,尤其计划把同一比特流用于不同速度等级器件或降频运行时。稳妥做法是以最慢速度等级和保守工作条件做收敛目标,并保留明确余量,而不是在最快器件上刚好压线;要在多档器件上发布时,对每档分别构建和分析,禁止「最快档过了就假设慢档也行」。
降级运行与动态频率变化。 为降功耗或适配负载而动态改变时钟频率(如重配 MMCM、切换时钟源)时,静态时序分析天然只分析固定频率关系。约束上必须覆盖所有可能的时钟配置(每个可能频率都建时钟或用模式分析),切换过程本身(时钟可能出现毛刺或停顿)要靠安全的切换电路(专用时钟多路器/切换原语、握手、切换期间屏蔽逻辑或复位)保证,设计文档要说明哪些分析结论只对稳态频率成立、切换瞬态由什么机制保护。调试阶段临时降频排查问题时,也要意识到「降频后通过」只说明速度问题被缓解,不代表违例路径被修复。
伪路径和多周期路径的误用重灾区。 复位网络(异步复位本身不需要建立时间,但复位释放需要同步处理,不能整网 false path 了事)、静态配置寄存器(上电写一次再不变化的可视为多周期/伪路径,但要确认写配置时功能逻辑确已停止)、TDM 时槽之间的多路选择(看似慢、实际选择逻辑仍在快时钟内,滥豁免会掩盖真正的选择器路径违例)。对这些场景的通用纪律不变:先讲清电路为什么不适用单周期检查,再写最小范围的例外,并在评审里留下设计依据。
最后是约束文件本身的组织。 建议按层次拆分为:板级物理约束(引脚、电平,随板卡版本管理)、时钟与时序约束(随设计时钟拓扑管理)、IP 自带约束(由 IP 生成、不手改)、原型适配专用例外(TDM、调试桥、跨片接口,单独文件并加显著注释)。模块化组织让「这块板子换那块板子」「ASIC 原型约束与功能约束分离」成为可能,也让评审能按责任域分工。约束的长期可维护性和它的正确性同等重要——一份谁也不敢改、注释缺失的约束文件,最终一定会在某次重构中悄悄失效。
知识脉络

与系列及现有篇目的衔接
- 网表来源:15 编译器逻辑综合 工艺无关网表/两级综合;跨片时钟:13 跨 FPGA 互联与 TDM SerDes/跨片同步/降频
- 下游:19 原型频率与时序收敛 TDM 降频/关键路径、20 比特流烧录与四方版本一致 manifest/门禁
- 现有约束基础:05 XDC 约束入门、05 约束实战、39 时序例外、16 高阶时序收敛
总结
一句话总结:约束是网表与具体板卡/型号之间的桥梁,同一份网表在不同约束下会得到不同频率结论,因此约束集是阶段 6/7 一切数据结论成立的前提;来源上分两层——Compiler 从 RTL 时钟分析、分区结果和插桩清单机器派生时钟关系、TDM 约束、dont_touch/mark_debug(auto XDC 禁手改、每次重生),原型团队补齐晶振管脚频率、Bank/VCCO、板级 IO 延迟、SerDes 参考时钟和必要的 Pblock,例外约束双方会签;时钟约束上主时钟落晶振、MMCM 输出用 generated clock 自动派生而非手写周期,TDM 的快慢时钟差异用 wrapper 内 multicycle 表达并把等效频率折算写进 info_table 而不伪造时钟,恢复时钟与对端时钟的同源/异步关系必须如实声明;CDC 处理的原则是真异步域才 set_clock_groups、同步分频域保持检查、ASIC 同步器路径在原型上也不切,跨片路径只检查到 wrapper 边界;时序例外只有静态配置、异步复位释放、TDM 内部、真异步等有限正当场景,每条注释理由+会签人,原型例外应是 ASIC 例外的子集加 TDM 增量,禁止为收敛造假;保留约束以 DONT_TOUCH/mark_debug/KEEP_HIERARCHY 在厂商侧双保险落地,但范围最小化以免锁住扇出复制和 retiming;多片约束公共单源、按片参数化,每次构建用 check_timing、约束 lint、僵尸例外审计(0 命中即删)和与 CDC 报告的域边界 diff 做质量门禁,约束改即新版本构建;约束造假可以让任何频率数字达标,真实负载会以亚稳态和间歇挂死讨债——时序报告的质量上限就是约束集的质量。