4. 多时钟时序路径分类
在多时钟 SoC 中,静态时序分析(STA)工具并不会对所有跨时钟路径一视同仁。Synopsys PrimeTime 在建立时钟关系后,会依据两个时钟的周期、相位与来源,把每条时序路径归入不同的时钟域关系类别。分类结果直接决定工具是否执行建立/保持检查、以哪个时钟沿作为发射沿和捕获沿、以及是否需要用户显式声明 set_clock_groups 或 set_false_path。理解这四类路径,是读懂时序报告和正确约束时钟关系的前提。
四类时钟域路径的判定依据
判定一条路径属于哪一类,核心看两个时钟的周期关系和相位关系。周期相同且相位对齐(相位差为 0 或周期的整数倍)为同频同相;周期相同但存在固定相位偏移为同频异相;周期不同但同源、存在确定的最小公倍数关系为异频(有理同步);周期之间没有确定整数比、或来自不同晶振/PLL 且未声明关系,则为异步时钟域。
需要强调的是,异步并不等于“不检查”。默认情况下,若两个时钟之间没有声明任何关系,PrimeTime 仍会尝试寻找公共周期并做检查,只是这种检查往往没有物理意义,容易产生大量虚假违例。因此异步路径必须由设计者显式处理。
建立/保持检查在各类路径中的适用性
对于同频同相路径,发射沿和捕获沿是同一个时钟沿,建立检查要求在 1 个时钟周期内数据稳定到达,保持检查要求数据在捕获沿之后仍保持 T_hold 时间。这是最常规的检查,工具无需额外配置。
对于同频异相路径,相位偏移 Δφ 会同时压缩建立窗口和保持窗口。若 Δφ 为正(捕获时钟滞后),建立窗口变为 T−Δφ,保持窗口变为 Δφ;若 Δφ 为负,则相反。工具会自动根据 create_clock -waveform 中定义的上升沿位置计算实际窗口,因此相位定义必须准确。
对于异频路径,工具会计算两个时钟周期的最小公倍数,在 LCM 窗口内展开所有可能的发射沿/捕获沿组合,取最紧的一对做建立检查、最松的一对做保持检查。例如 100MHz(10ns)与 75MHz(13.333ns)的 LCM 为 40ns,即 4 个快周期对 3 个慢周期,工具会在这 40ns 内枚举沿对。
对于异步路径,由于不存在确定的相位关系,任何建立/保持检查都只是工具在某个假设公共周期下的数学结果,不代表真实硬件行为。正确做法是用 set_clock_groups -asynchronous 将两个时钟域隔离,或对具体跨域路径设置 set_false_path,再由同步器(两级触发器、异步 FIFO 等)在功能层面处理亚稳态。
实操:用约束区分四类路径
下面给出一个典型的多时钟约束片段,展示如何为四类路径分别声明关系。假设 clk_a 为 100MHz,clk_b 为 100MHz 但相位偏移 2ns,clk_c 为 75MHz,clk_d 为独立 50MHz 异步时钟。
create_clock -name clk_a -period 10.0 [get_ports clk_a]
create_clock -name clk_b -period 10.0 -waveform {2.0 7.0} [get_ports clk_b]
create_clock -name clk_c -period 13.333 [get_ports clk_c]
create_clock -name clk_d -period 20.0 [get_ports clk_d]
# 同频同相:clk_a 与自身,无需声明
# 同频异相:clk_a 与 clk_b 保持默认检查,工具按波形计算
# 异频:clk_a 与 clk_c 保持默认检查,工具展开 LCM
# 异步:clk_d 与其余时钟隔离
set_clock_groups -asynchronous \
-group {clk_a clk_b clk_c} \
-group {clk_d}
执行 report_timing 时,可通过 -clock_from 和 -clock_to 指定时钟对,观察工具实际选取的发射沿和捕获沿。若异步路径未被隔离,报告中会出现大量以 clk_d 为捕获时钟的违例,且违例量随公共周期假设变化,这正是需要识别并处理的信号。
report_clock -skew 查看各时钟的相位与周期,再用 report_timing -delay_type max 观察建立检查选取的沿。若两个时钟的周期比无法化为小整数比,基本可判定为异步。分类判定的决策顺序
实际工程中建议按固定顺序判定:第一步比较两个时钟的周期是否相等;第二步若周期相等,比较相位是否对齐;第三步若周期不等,检查周期比是否为有理数(即能否表示为两个小整数之比);第四步若无法表示为有理数或来源独立,则归为异步。这个顺序可以避免把异频误判为异步,也能防止把同频异相误当作同频同相而漏掉相位约束。
掌握这四类路径的判定与检查适用性后,面对任何跨时钟路径都能快速判断:该路径是否需要检查、检查窗口如何计算、约束应如何声明。这是多时钟 SoC 时序验证中最基础也最关键的一步。