PrimeTime 时钟/约束缺失:no clock 与 unconstrained 路径速查
更新时间:2026-10-22。FAQ 速查页,属于 EDA 工具排错系列。PrimeTime(简称 PT,Synopsys 的静态时序分析与签收工具,交互壳是
pt_shell)只做一件事:在给定约束下计算每条时序路径的余量。约束缺失时它不会像综合工具那样「优化歪了」,而是更阴——路径直接不计时序,签收报告上一片虚假的绿灯。综合侧的同款问题见 Design Compiler 时钟约束缺失,那篇的五层覆盖模型在本篇同样适用,差别在于 PT 读的是门级网表,对象名、时钟传播方式和 case 分析状态都会让从 DC 继承来的 SDC 静默走样。本篇以 PT 真实告警口径为锚逐条排查;约束对象在网表里找不到的姊妹问题见 Design Compiler 路径/文件不存在。
本文要回答的问题
check_timing报一堆no clock/unconstrained internal endpoints,按什么顺序补?report_clocks是空的,SDC 明明写了,为什么没生效?- generated clock 告警「源点没有时钟」,
-source到底该指哪个 pin? - 综合时约束是齐的,进了 PrimeTime 为什么时钟被 case analysis 掐断?
- IO 约束、异步复位、跨时钟域路径在签收阶段漏配,报告上分别长什么样?
一、报错原文与现象
PrimeTime 的时钟/约束缺失主要在两个时点暴露:SDC 加载瞬间和 check_timing 时。典型输出有三种形态。
形态一,check_timing 直接点名未覆盖对象:
pt_shell> check_timing
Information: Updating timing graph...
Warning: There are 324 register clock pins with no clock. (CLKN-88)
Warning: There are 6 unconstrained internal endpoints. (UCO-217)
Warning: Generated clock 'CLK_DIV2' source pin does not have a clock. (CLKN-146)
Information: Use 'report_clocks' to review all clock definitions.形态二,时钟清单为空,时序报告却不报错,只报「没有受约束的路径」:
pt_shell> report_clocks
Clock Period Waveform
--------------------------------------------------------------------------------
Warning: No clocks are defined. (CLKN-12)
pt_shell> report_constraint -all_violators
Information: No constrained paths. (UCO-305)形态三,SDC 语句执行了但 collection 为空,或者输入延迟整组漏配:
Warning: An sdc collection for '-source' evaluated to an empty collection. (UITE-379)
Warning: Port 'data_in[*]' has no input delay specified. (UCO-105)
Warning: Generated clock ignored: master clock not found at source pin 'u_pll/clk_out'. (CLKN-501)判读口径:CLKN 类是时钟网络检查(Clock Network),管的是「时钟定义与传播」;UCO 类是无约束对象检查(Unconstrained Objects),管的是「端点有没有被任何时序检查罩住」。两类告警的 ID 后数字随版本不同会有差异,排查时以检查项名称(no clock、unconstrained internal endpoints)为准,不要背数字。最危险的是形态二:PT 不认为这是错误,没有时钟的路径 WNS/TNS 全是 0,签收单看起来全绿——所以「跑一次 check_timing」必须是签收脚本里不可跳过的一步。
二、报错 → 原因 → 处置速查表
| 报错/现象 | 最可能原因 | 一条命令确认 | 处置 |
|---|---|---|---|
No clocks are defined (CLKN-12) | SDC 根本没 source,或在 read_verilog 之前加载 | report_clocks 为空 | 读完网表与 SPEF 后再 source top.pt.sdc |
| register clock pins with no clock | create_clock 漏配或端口名网表化后对不上 | get_ports clk 看返回是否空集 | 补主时钟;对象名按网表层次改对 |
| generated clock source pin has no clock | -source 指到了 master 时钟传不到的 pin | report_clocks -sources / all_fanin 追时钟 | 源点改到 master 时钟扇出内的引脚 |
| Generated clock ignored, master clock not found | 派生时钟先于主时钟加载,或主时钟名写错 | get_clocks <master> 是否空集 | 调整 SDC 顺序,时钟定义集中在最前 |
| unconstrained internal endpoints | 端口无 input/output delay,或虚拟时钟漏建 | report_port -verbose | 补 set_input_delay/set_output_delay,参照外部时钟时建虚拟时钟 |
| 跨域路径成片违例且修不动 | 缺 set_clock_groups -asynchronous | report_clock_groups | 按域分组,结论与 CDC 报告对齐 |
| 时钟被莫名截断、部分分支 no clock | set_case_analysis 把时钟 MUX 选到了常量侧 | report_case_analysis | 签收场景配正确的 sel 常量,或删掉误加的约束 |
| 异步复位路径占满违例榜 | 复位未设 false path | report_disable_timing -exceptions 旁证 | set_false_path -from [get_ports rst_n] |
| 约束写了但没生效 | SDC 静默失效:空集合 + 仅告警 | sizeof_collection 检查 | 脚本对关键 collection 做非空断言 |
三、逐条排查展开
第零步:先摸现状,用数字建立进度度量。 别一上来改 SDC,三条命令看清缺失面:
report_clocks
check_timing -verbose
report_constraint -all_violatorsreport_clocks 列出全部已定义时钟及周期、波形、属性;check_timing -verbose 按检查项给出计数;report_constraint -all_violators 列出违例最严重的端点。补一条约束就重跑一次,看着告警数字往下掉——比逐路径肉眼核对可靠得多。补约束期间还可以用 report_analysis_coverage 看有多少时序弧处于 untimed/无约束状态,它从另一个口径交叉验证约束覆盖率。
根因一:主时钟漏配,或 SDC 压根没加载。 最基础的形态:
create_clock -name SYS_CLK -period 10.0 [get_ports clk]PT 场景下最高频的事故不是忘了写,而是加载顺序错:在 read_verilog 之前 source SDC,get_ports 全部空集,所有时钟定义静默作废,最后就是 CLKN-12。正确顺序是读入网表、(签收阶段)读入 SPEF 寄生参数之后,再 source SDC。第二个高频错法是对象名对不上:DC 阶段对象是 RTL 端口,PT 阶段是门级网表层次,综合后层次名可能被摊平或加前缀,get_ports clk 返回空集时 PT 只给一条 UITE 告警。养成习惯:每条时钟定义后立刻 report_clocks 眼见为实,关键 collection 在脚本里用 sizeof_collection 断言非空。
根因二:generated clock 的源点指错。 分频器、PLL、时钟 MUX 出来的时钟不会自动继承主时钟,必须显式声明,完整推导规则见 SDC 生成时钟推导:
create_generated_clock -name CLK_DIV2 \
-source [get_pins u_div/CLK] -divide_by 2 \
[get_pins u_div/Q]-source 是这类告警的命门:它必须指向 master 时钟传播路径上的引脚(通常是分频单元的时钟输入脚),而不是分频器的数据脚或更上游的端口——指到 master 时钟扇出之外,就是 CLKN-146「源点没有时钟」。另外两个常见错法:只写输出引脚忘写 -divide_by/-edges,以及在 SDC 里派生时钟排在主时钟之前导致 CLKN-501。排查时用 report_clocks -sources 核对每条 generated clock 挂在哪个 master 上,再用 all_fanin -clock 从源点反推主时钟是否真的到达。
根因三:IO 边界裸奔,端点没有任何时序检查。 端口到第一级寄存器、末级寄存器到端口的路径,需要 IO 延迟约束才被计时:
set_input_delay -clock SYS_CLK -max 2.0 [get_ports {data_in[*]}]
set_input_delay -clock SYS_CLK -min 0.2 [get_ports {data_in[*]}]
set_output_delay -clock SYS_CLK -max 1.5 [get_ports {data_out[*]}]症状是 unconstrained internal endpoints 的数量与端口规模成正比。两个签收阶段特有的坑:一是参照时钟在芯片内部不存在(板级上游器件提供节拍),必须先建不带任何对象的虚拟时钟 create_clock -name VCLK -period 10.0 再挂 delay;二是只配 -max 不配 -min,setup 侧有人管、hold 侧裸奔。report_port -verbose 一次看清每个端口两侧约束是否齐全。
根因四:异步域与复位没摘出时序检查。 两个独立晶振/跨芯片的时钟域之间本不该互查时序,不声明的话 PT 按最坏相位差计算,制造一批永远修不掉的违例:
set_clock_groups -asynchronous \
-group [get_clocks SYS_CLK] \
-group [get_clocks USB_CLK]注意 -asynchronous(物理上互不相干)与 -logically_exclusive(MUX 切换、同一时刻只走一路)不可混用,域间声明要与 CDC 约束生成流程 的结论同一份来源。异步复位路径则用 set_false_path -from [get_ports rst_n] 摘出,例外约束的审计方法见 虚假路径审计方法——每一条 false path 都要能写出「为什么永远不会被采样」的理由,写不出就不配。
根因五(PT 特有):case analysis 把时钟掐断。 签收要按功能场景(mode)逐个分析,脚本里大量使用 set_case_analysis 1 [get_pins u_clk_mux/sel] 固定 MUX 选择端。常量一旦配错,整条时钟分支被判定不可达,下游寄存器成片 no clock——这类问题综合阶段不存在,是 PT 网表签收的专属事故。排查先跑 report_case_analysis 逐个核对固定值,再查 report_disable_timing 是否有脚本或工具自动加的断弧把时钟树切开。
签收前还有一个隐含前提:传播时钟。 PT 默认把时钟当理想时钟处理;布局布线后签收必须执行 set_propagated_clock [all_clocks],让时钟延迟沿时钟树实际计算,否则报告里延迟和偏斜全是 0,约束再齐也是假签收。
四、排查决策树
整张图按「先看时钟在不在清单,再看缺在哪一层」分流:清单为空先治加载,主时钟缺补定义,派生时钟缺修源点,时钟齐了端口还裸奔补 IO,最后处理域间与复位例外。
读图主线:report_clocks 的输出替你选路——空清单是加载事故,不必怀疑 SDC 内容,先治 source 顺序;清单有时钟再按「主时钟 → 派生时钟 → IO 边界 → 域间例外」自下而上补,这与综合侧的五层覆盖完全同构。每修一步回到 check_timing 看数字,最后用 report_constraint -all_violators 与 report_analysis_coverage 双口径复核:前者确认无违例端点,后者确认没有路径仍处于 untimed 状态。
五、预防与纪律
- SDC 一份源、多工具复用:时钟与例外约束只在一个文件里维护,DC 与 PT 同源加载,靠条件判断或
suppress_message处理工具差异,禁止两版 SDC 各自漂移;SDC 生命周期管理见 SDC 约束生命周期。 - 签收脚本固化顺序:读网表 → 读 SPEF → source SDC →
set_propagated_clock→check_timing,任何 CLKN/UCO 告警非零即中止流程,不进入出报告阶段。 - 空集合即失败:关键
get_ports/get_pins/get_clocks后做sizeof_collection非空断言,把 UITE 类静默告警升级为脚本错误。 - 例外约束逐条写理由并定期审计:false path / multicycle path 数量只减不增,签收前用 SDC 约束 lint 跑一遍完备性检查。
- mode 场景表驱动:每个签收场景的 case analysis 值列成对照表,切换场景时整组替换,避免手工改 sel 值掐断时钟分支。
这一篇在知识体系里的位置
本篇是 EDA 排错速查簇中「签收侧约束完备性」节点的 FAQ 页:与综合侧的 Design Compiler 时钟约束缺失 共享五层覆盖模型,差别聚焦在门级网表带来的对象名漂移、SDC 加载顺序、case analysis 截断与传播时钟四个 PT 专属事故面;约束对象定位失败的通用机理见 Design Compiler 路径/文件不存在。目录总览见 EDA 工具链。
一句话总结
PrimeTime 时钟/约束缺失按 report_clocks 选路、五层覆盖补约束:清单为空先治「网表之后再 source SDC」的加载顺序,主时钟补 create_clock,派生时钟把 create_generated_clock 的 -source 修到 master 时钟扇出引脚,IO 边界用 set_input_delay/set_output_delay 加虚拟时钟且 max/min 成对,域间用 set_clock_groups -asynchronous、复位用 set_false_path,PT 还要核对 report_case_analysis 没掐断时钟并执行 set_propagated_clock;签收纪律是 check_timing 告警非零即中止、空集合断言失败、例外约束逐条审计。