组合逻辑/门控时钟,BUFG
1. 场景描述
同一个晶体振荡器驱动的不同扇出,仅经过时钟缓冲器(相位差固定)
这句话描述的典型场景是:
-
一个 100 MHz 晶体振荡器(OSC)输出一路时钟。
-
该时钟进入芯片后,不是直接驱动成千上万个寄存器,而是先经过时钟缓冲器(例如 FPGA 的 BUFG、ASIC 中的 clock buffer)。
-
缓冲器通常有多个输出(或者用多个缓冲器并行驱动),这些输出分别去到芯片内不同区域的寄存器、时钟管理单元、输出引脚等——这就是“不同的扇出”。
如下图所示:
text
┌──> BUFG ──> 扇出 A(逻辑区域A)
OSC ──>┤
└──> BUFG ──> 扇出 B(逻辑区域B)
或者更常见的是一个 BUFG 驱动一根全局时钟网络,由其末端的各级 buffer 形成扇出。
2. “仅经过时钟缓冲器”意味着什么
这句话强调的是:扇出路径中不含有带来未知、可变延迟的元件。具体来说:
-
没有 PLL/DCM:不会进行分频、倍频、相移操作。如果有 PLL,那只要定义了生成时钟,它产生的时钟仍然是同步的,但这句话特指不经过这些动态调整单元。
-
没有组合逻辑:不在时钟路径上插入与门、或门、LUT 等。组合逻辑的延迟会随工艺、电压、温度变化,且可能造成不同扇出间延迟差异不可控。
-
只有简单的缓冲器:时钟缓冲器是专为时钟设计的,它的传播延迟是固定的、可测量的,并且在芯片设计中被尽力做到平衡(low skew)。
BUFG 是最典型的例子:
-
在 Xilinx FPGA 中,输入时钟先经过 IBUFG(输入全局缓冲),再进入 BUFG(全局时钟缓冲),然后驱动全局时钟网络。
-
BUFG 的延迟是确定的,从输入到输出网络各点的 skew(偏差)也被芯片设计和时序模型保证在一个很小的范围内。
3. 为什么说“相位差固定”
因为时钟缓冲器的延迟是固定的,而且整个时钟树是设计成平衡的,所以:
-
到达扇出 A 的时钟沿,与到达扇出 B 的时钟沿之间的时间差(相位差)是由物理布局和走线决定的常量。
-
这个常量不会随着时间、温度、电压的变化而改变(变化量在模型内,工具已覆盖最差情况)。
-
既然是固定的,我们就可以算出两个扇出时钟域之间最悲观的建立/保持时间。
关键结论:即使这两个扇出在 SDC 中被定义成了两个不同的时钟(例如 CLK_A 和 CLK_B),因为它们源自同一晶振且路径延迟固定,它们仍然是同步时钟。STA 工具能够、也应该对它们之间的跨域路径进行正常的建立/保持检查。
4. 与 BUFG 的深度关联
BUFG 就是实现“相位差固定”的硬件基础:
-
BUFG 将输入时钟引入一个低偏斜、高驱动能力的全局时钟分配网络。
-
芯片厂家会为 BUFG 提供精确的时序模型,其中包含:
-
从输入 pin 到 BUFG 输出的延迟(Tbufg)。
-
从 BUFG 输出到不同叶结点(寄存器时钟端)的延迟差异(clock skew,通常在几十皮秒内)。
-
-
STA 工具根据这些模型,即可计算出
CLK_A和CLK_B的边沿何时到达各自的寄存器。
举例:
-
在 Xilinx Vivado 中,如果你通过不同的 BUFG 驱动两个区域,但没有指明它们是由同一个主时钟生成,软件可能会把它们当成两个独立的主时钟(从而默认异步,产生大量误报)。
-
正确的约束应该是:在源头定义一个主时钟,然后用
create_generated_clock分别在 BUFG 的输出(或需要分析的节点)上声明这些时钟,并指定同源。这样工具就知道它们存在固定的相位关系。
5. 与异步时钟的对比
| 同步(同晶振+BUFG) | 异步(两个独立晶振) | |
|---|---|---|
| 来源 | 同一个物理振荡器 | 两个独立的振荡器 |
| 路径 | 仅通过缓冲器,延迟固定 | 各有独立时钟树,相位关系完全未知 |
| 相位 | 固定相位差(静态 skew) | 无固定关系,随时间漂移 |
| STA 能否分析 | 可以,路径是有效时序路径 | 不能,必须屏蔽掉 |
| 约束 | 无需异步分组,工具自动或通过生成时钟关联 | 必须用 set_clock_groups -asynchronous |
6. 实践约束中的注意点
即使硬件上使用了同一个晶振和 BUFG,如果约束不当,仍可能被工具“误判”为异步:
错误做法:
tcl
# 直接定义两个主时钟,源点在两个不同的 BUFG 输出端 create_clock -name CLK_A -period 10 [get_pins BUFG_A/O] create_clock -name CLK_B -period 10 [get_pins BUFG_B/O]
这种情况下,工具认为 CLK_A 和 CLK_B 是两个独立的主时钟,彼此没有关系,默认异步,它们之间的路径不会被分析。
正确做法:
tcl
# 只在真正的根节点定义一个主时钟
create_clock -name CLK_SRC -period 10 [get_ports osc_clk]
# 如果后续需要给不同分支命名,使用生成时钟并指明 master
create_generated_clock -name CLK_A -master CLK_SRC \
-divide_by 1 [get_pins BUFG_A/O]
create_generated_clock -name CLK_B -master CLK_SRC \
-divide_by 1 [get_pins BUFG_B/O]
这样工具就知道它们同源且相位差固定,会正常进行时序检查。
总结
“同一个晶体振荡器驱动的不同扇出,仅经过时钟缓冲器”这句话的本质是:
时钟路径上无动态的、不可知的延迟源,只有一个固定延迟的分配网络(如 BUFG)。因此,扇出之间的相位差是一个常数,它们是完全的同步时钟,必须参与正常的 STA 建立/保持检查。
这也就是为什么在 STA 约束中,我们要正确地追溯时钟根源,通过主时钟+生成时钟的方式构建时钟树,而不是草率地定义多个独立主时钟。
1. “正确约束为生成时钟”的含义
原文是:
经过组合逻辑或时钟门控产生的时钟,但正确约束为生成时钟
这里指的是:当时钟路径上穿过了一个与门、或门、LUT 等组合逻辑,只要我们用 create_generated_clock 显式地定义了它的输出为生成时钟,并指明了它的源主时钟,STA 工具就会认为这个新时钟与源时钟是同步的。
例:一个典型的门控时钟
text
CLK_SRC ──┬── BUFG ──┬── AND ──> GATED_CLK
│ │
│ └── EN (使能信号)
│
└── 直接去其他逻辑
在 EDA 中约束:
tcl
create_clock -name CLK_SRC -period 10 [get_ports clk]
create_generated_clock -name GATED_CLK -master CLK_SRC \
-divide_by 1 -combinational [get_pins AND_gate/Z]
这样 GATED_CLK 就会被认为是同步于 CLK_SRC 的时钟,它们之间的跨域路径会被正常分析。
2. 组合逻辑的延迟并非“不可控”,而是“可建模”的
你的担心源于:组合逻辑延迟受工艺、电压、温度影响,会变化,似乎“不可控”。但 STA 中的“可控”是指 “延迟可以被时序模型描述,最差值可计算”,这与“固定不变”是不同的概念。
-
时钟缓冲器:延迟也是组合逻辑,只不过芯片厂把它的延迟模型做得极精确,skew 很小。但它仍然随 PVT 变化,STA 用 max/min delay 覆盖。
-
普通组合逻辑:工具会从标准单元库提取该门在最差情况下的延迟(例如在 slow corner 下 200 ps,在 fast corner 下 50 ps)。那么对于
GATED_CLK的边沿,它相对于源时钟的延迟就是 该门的传播延迟。 -
STA 在做建立/保持检查时,会同时考虑数据路径和时钟路径的逻辑延迟,并分别用最悲观的 corner 组合(例如时钟用最快延迟,数据用最慢延迟,做保持检查)。
结论:只要这个组合逻辑的延迟可以被标准单元库的模型覆盖,并且你在约束中正确地创建了生成时钟,工具就能计算出 GATED_CLK 的边沿相对于源时钟的最悲观相位偏移,于是它们之间的时序是可分析的——所以它们是同步的。
3. 那为什么“仅经过时钟缓冲器”被单独强调?
在前面的语境中,这句话是用来区分一种纯物理同源的场景,说明即使路径简单,也必须正确约束。它并不是说“只有经过缓冲器才是同步”,而是强调:即使如此简单的路径,如果你不把它约束为生成时钟,工具也可能误判为异步。
“仅经过时钟缓冲器”的完整逻辑是:
-
它没有经过分频、倍频等改变频率的东西(改变频率也没关系,只要来自同一个根时钟仍同步)。
-
它的延迟来源非常单纯,就是缓冲器,所以相位差极度可控、skew 极小。
-
因此,它毫无疑问是同步的,并且 STA 检查的精度很高。
而“经过组合逻辑”的时钟,虽然延迟的变化范围可能比专用缓冲器大,但依然在可建模范围内,所以只要用生成时钟正确声明,仍然是同步的,只是你需要在设计上更谨慎(后文会讲风险)。
4. 需要警惕的设计风险(与异步无关,但与时钟质量有关)
STA 有能力分析组合逻辑产生的时钟,不代表这类时钟是好的设计实践。主要风险在于:
-
毛刺:组合逻辑的输出可能在输入变化时产生毛刺,如果这个输出用作时钟,会触发寄存器误动作。这是功能问题,STA 不检查。
-
延迟失配导致过大约束违规:如果门延迟过大,可能在该同步域内部就出现建立/保持违规。
-
时钟树不平衡:如果
GATED_CLK没有经过专用的全局时钟网络,其到达不同寄存器的 skew 会很大,STA 虽然能分析,但可能发现违例。
因此,现代设计推荐用专用的时钟门控单元(Integrated Clock Gate, ICG),它内部是锁存器+与门,能消除使能变化时的毛刺,且延迟模型被芯片厂精确描述。这在 STA 中仍然是通过 create_generated_clock 约束,仍然是同步的。
5. 与异步时钟的根本区别——再次明确
我们回到最开始的准则:
-
同步时钟:边沿之间的时间差可以通过已知模型计算出最差值。
-
异步时钟:边沿之间的时间差不存在一个已知的、不随时间漂移的界限(两个独立晶振的相位在无限时间内遍历所有可能)。
对于“组合逻辑产生的时钟”:
-
门延迟可能随 PVT 变化,但这种变化是在固定的范围内,并且会被 STA 的 corner 分析所覆盖。只要晶体振荡器本身是同一个,两者的频率和相位漂移是完全绑定的,扩展周期依然存在。因此它属于同步时钟。
总结
“经过组合逻辑或时钟门控产生的时钟,但正确约束为生成时钟”这句话的意思是:
只要我们将这个新时钟通过 create_generated_clock 明确绑定到它的源主时钟上,STA 工具就可以利用标准单元库的延迟模型,计算出它与源时钟及其他衍生时钟之间的边沿关系,从而进行有效的时序分析。因此它依然是同步时钟,必须参与 STA 收敛,而不能当作异步屏蔽掉。
你感觉的“延时不可控”是针对绝对确定性而言,但 STA 的哲学是 “在最坏情况下计算可保证的条件”,所以这种可变延迟是可接受的、可建模的,不影响“同步”这一属性。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)