SpyGlass 时钟约束缺失:Clock has not been constrained 速查
更新时间:2026-10-22。FAQ 速查页,属于 EDA 工具排错系列,总入口见 开源 EDA 报错排错中心。SpyGlass(Synopsys 的 RTL 静态检查平台,Lint/CDC/RDC 都按 Goal 组织)做的是结构分析,不做时序计算——它需要的时钟信息不是 PrimeTime 那套 SDC,而是规则约束里的抽象时钟声明。漏了它,
clock_resetGoal 直接点名,CDC Goal 则更阴险:跨时钟域识别不出来,本该报的不同步不报(漏报),或把同步电路成片标成跨域(误报)。规则体系见 RTL 静态检查(Lint):SpyGlass 规则体系与基线门禁;工程起不来、Goal 加载失败的配置问题见 SpyGlass 配置解析失败速查,那是本篇的前置环节。注意与签收侧 SDC 问题区分:PrimeTime 时钟/约束缺失速查 讲的是 STA 的create_clock,两套约束不是一回事。
本文要回答的问题
clock_resetGoal 报Clock has not been constrained、No clock waveform specified,缺的到底是什么文件?- CDC 跑完违例数是 0(明显不对)或者几千条假跨域,为什么说根因往往也是时钟没声明?
- SpyGlass 的
abstract_clock约束写在哪、怎么挂进工程,和 DC/PT 的 SDC 有什么区别? - 时钟经过 mux、分频器、与门(门控)再进寄存器,抽象时钟该怎么补?
- 复位为什么也要声明(
abstract_reset),不声明报告上是什么现象?
一、报告原文与现象
时钟缺失在两类 Goal 里表现完全不同。clock_reset Goal 会直接点名,文案形如(工程名、对象名已占位):
Rule Severity Message
Clock_? Error Clock has not been constrained for the design 'top'.
Wlint Warning No clock waveform specified on port 'clk'.
Clock_? Warning 128 sequential elements have no clock reaching their clock pin.CDC Goal(如 cdc/clock_sync、cdc/setup_cdc 一类)不报错,但结果数字不对:要么跨域违例为 0,要么同一条有效时钟线上的所有寄存器两两配对报跨域,规则号集中在 Ac_unsync01(未同步的异步跨域采样)、Clock_glitch(时钟上有组合逻辑毛刺风险)一类。下面两种形态都指向「工具没认出时钟」:
# 形态 A:明显该报却为 0 —— 跨域根本没被识别
Ac_unsync01 0 violations (设计中有两个独立时钟端口,预期非 0)
# 形态 B:海量假违例 —— 同一时钟被当成无数个独立域
Ac_unsync01 4600 violations (信号在两个同源寄存器间传递也被报)判读口径:违例数异常(0 或海量)先怀疑时钟识别,不要先 waiver。 规则名与消息文本随方法学版本不同会有差异,排查时以本单位 rule 参考手册中的规则语义为准,不要背规则号。确认手段是看该 Goal 的时钟报告(GUI 里在时钟相关报告页,或 spyglass_reports/<goal>/ 下的汇总):工具实际识别到几个时钟、每个时钟的源对象和周期是多少,一目了然。
二、原因速查表
| 报告/现象 | 最可能原因 | 处置 |
|---|---|---|
Clock has not been constrained | 工程没有任何抽象时钟约束 | 补 abstract_clock 主时钟声明 |
No clock waveform specified on port | 时钟端口存在但无波形信息 | 在该端口对象上补周期/边沿声明 |
| CDC 违例为 0,与设计不符 | 时钟未识别,跨域无从配对 | 先补全时钟再重跑 CDC,禁止直接签收 |
| CDC 假违例海量 | 同源时钟被割裂成多域,或 mux 分支未选 | 补 case 分析固定 mux,核对时钟扇出 |
| 约束写了仍报未约束 | 约束文件没挂进工程或没随 Goal 加载 | GUI Constraints 菜单核对,或查工程选项挂接 |
| 分频/PLL 输出下寄存器无时钟 | 派生时钟未声明 | 在分频输出上补抽象时钟或声明派生关系 |
门控时钟后报 Clock_glitch | 与门使能端未被识别为合法 ICG | 补门控约束/换标准 ICG 单元,而非简单 waiver |
| 复位类规则成片异常 | 复位未声明、同步/异步属性未知 | 补 abstract_reset 并标明极性与同步性 |
| 直接喂 DC 的 SDC 不生效 | SpyGlass 默认不按 SDC 语义理解时钟 | 用抽象时钟;SDC 支持随版本而异需单独开启 |
三、逐条排查展开
第一步:先看违例数与时钟报告,别改 RTL。 打开 Goal 的时钟汇总报告:识别到的时钟个数为 0,是「完全没约束」;个数对但缺某几条分支,是「派生/mux 没覆盖」。这一步决定后面所有动作,也是防止在错误方向上 waiver 的关键——CDC 漏报比误报危险得多,0 违例的 CDC 报告必须先证明时钟域识别正确,才有签收价值。CDC 检查的完整口径见 CDC/RDC 检查流程。
第二步:补抽象时钟声明。 SpyGlass 的主流做法是在约束文件(工程习惯常命名为 <top>.sdc,但里面写的是 SpyGlass 约束语义,不是 PrimeTime 的 SDC)中用 abstract_clock 给每个时钟源头一个名字、周期和对象:
# 主时钟:周期 10ns,上升沿 0、下降沿 5(具体语法以本版本手册为准)
abstract_clock -name SYS_CLK -period 10.0 -edge_shift {0.0 5.0} [get_ports clk]
abstract_clock -name USB_CLK -period 16.6 [get_ports usb_clk]
# 时钟 mux:固定选择端,让工具只沿选中分支识别
set_case_analysis 1 [get_pins u_clk_mux/sel]
# 分频时钟:在分频输出上声明(也可按版本支持的派生写法标注倍频关系)
abstract_clock -name CLK_DIV2 -period 20.0 [get_pins u_div/q_out]
# 复位:声明极性与同步/异步属性
abstract_reset -name RST_N -active low -async [get_ports rst_n]要点有三:对象必须能在 RTL 里按名字找到(端口或 pin);周期只需反映「时钟」这一事实,SpyGlass 不做时序裕量计算,给个合理值即可;多个独立时钟要分别声明,CDC 正是靠时钟名之间的配对识别跨域。
第三步:确认约束文件真的挂进了工程。 约束写在文件里但没加载,现象与完全没写一模一样。挂接途径有两种:GUI 的 Constraints 菜单里录入/导入时钟与复位表,保存后随工程生效;或在工程配置里用 set_option 一类选项把约束文件关联进工程(选项名随版本不同,以本版本手册为准)。验证方法是重跑后看日志中约束读取条数,再看时钟报告里出现刚声明的时钟名。工程文件加载链本身有问题时,先按 SpyGlass 配置解析失败速查 修好再谈约束。
第四步:处理 mux、分频与门控三类特殊时钟。 时钟选择 mux 不固定选择端时,工具会把两条输入当成都会到达下游,制造混乱域,用 set_case_analysis 按功能模式固定 sel,多模式则分场景各跑一遍。分频器、PLL 后的时钟不会自动继承,要在输出点补声明。组合门控(与门/或门搭出来的时钟)会触发 Clock_glitch:正确处置是换成带使能的标准 ICG 单元或按方法学补门控约束,把根因留着只做 waiver 等于屏蔽检查。
第五步:补复位约束。 RDC 与 clock_reset Goal 需要知道哪个端口是复位、高有效还是低有效、同步还是异步,否则复位相关规则不触发或把普通控制信号当复位误报。用 abstract_reset 一次标明对象、极性、同步性;多复位域还要声明域间关系,RDC 口径与 CDC 同源。
第六步:分清 SpyGlass 约束与 SDC。 这是跨团队最常见的误解:DC/PT 的 SDC 服务于时序计算,SpyGlass 的抽象时钟服务于结构识别,两者目标不同。部分新版本提供读入 SDC 的选项(经 sdc_option 一类入口或格式转换),但支持程度随版本而异,且 SDC 里的 generated clock、case analysis 未必完整映射;工程主流做法仍是维护一份 SpyGlass 抽象约束,不要假设「STA 的 SDC 交上去就行」。
读这张图抓住「时钟报告替你选路」:红色入口是现象,蓝色是唯一的诊断动作——时钟数为 0 先补主时钟并解决挂接,主时钟在但分支缺则直接处理 mux/分频/门控,最后统一补复位,汇到紫色复核节点。颜色语义为:红=问题现象、蓝=排查动作、橙=修复动作、紫=复跑收尾。没有「识别正确」这个前提,CDC 违例归零没有任何意义。
四、预防与纪律
- 抽象约束随 RTL 同进同出:新增时钟端口、分频器、复位端口的同一个改动里更新约束文件,评审时把「时钟报告截图」当必交物。
- 0 违例必须自证:CDC 报告为 0 时,先附上时钟域识别清单证明跨域已被枚举,否则不接收。
- 不拿 waiver 掩盖未识别:
Clock_glitch、Ac_unsync01大量出现时先查时钟约束,确认识别正确后再谈真实违例的豁免。 - 两份约束各自维护、来源对齐:SpyGlass 抽象约束与 STA 的 SDC 是两份文件,时钟清单(名称、源点、域划分)要与 CDC 约束生成流程 的结论同一份来源,禁止各自漂移。
- 版本升级回归时钟报告:读 SDC 的能力随版本变化,升级后比对识别到的时钟个数与名称,避免静默丢域。
这一篇在知识体系里的位置
本篇是 EDA 排错速查簇中「静态检查侧时钟完备性」节点的 FAQ 页:与签收侧的 PrimeTime 时钟/约束缺失速查 同名不同物——一个补抽象时钟供结构识别,一个补 SDC 供时序计算;工程配置加载失败见 SpyGlass 配置解析失败速查,规则体系与门禁纪律见 RTL 静态检查(Lint):SpyGlass 规则体系与基线门禁,CDC/RDC 的完整检查流程见 CDC/RDC 检查流程。目录总览见 EDA 工具链。
一句话总结
SpyGlass 时钟约束缺失先看 Goal 的时钟汇总报告选路:时钟数为 0 就用 abstract_clock 给每个时钟端口补名称、周期、对象三要素,并经 GUI Constraints 或 set_option 确认约束文件真正加载;主时钟在而分支缺则用 set_case_analysis 固定时钟 mux、在分频输出补声明、组合门控改标准 ICG,再用 abstract_reset 标明复位极性与同步性;牢记 SpyGlass 抽象时钟与 DC/PT 的 SDC 不是一回事、读 SDC 支持随版本而异,CDC 违例为 0 必须先自证时钟域识别正确,禁止拿 waiver 掩盖未识别的时钟域。