1. 多时钟SoC时序验证概览

现代SoC几乎不可能只跑一个时钟。CPU簇、GPU、DDR控制器、USB、PCIe、音频子系统各自工作在不同频率,甚至同一模块内部还存在分频、倍频和门控时钟。当这些时钟域之间需要传递数据时,时序验证的对象就不再是单条路径的建立/保持时间,而是跨时钟域信号在异步采样条件下的稳定性。本节先建立整体认知:多时钟域到底带来了什么、时序验证要回答哪些问题、Synopsys工具链在签核流程中各自承担什么角色。

一、多时钟域的本质:不是频率不同,而是相位关系不确定

判断两个时钟是否属于同一时钟域,关键不在于频率是否相等,而在于它们的相位关系是否可预测。若两个时钟来自同一PLL且分频比固定,相位差恒定,属于同步时钟,仍可用静态时序分析(STA)按确定关系检查;若来自不同晶振或不同PLL,相位差随时间漂移,属于异步时钟,STA无法给出有意义的建立/保持结论,必须改用同步器结构来保证可靠性。

因此多时钟SoC时序验证的第一件事是时钟定义与关系声明。在SDC约束中,用create_clock定义主时钟,用create_generated_clock描述分频/倍频时钟,再用set_clock_groups -asynchronous或set_false_path显式声明异步关系。若漏掉这些声明,STA会把异步路径当作同步路径分析,产生大量虚假违例;反之,若把真实同步路径误设为false path,则会掩盖真实问题。这是多时钟验证中最常见、也最危险的约束错误。

二、时序验证要回答的三类问题

多时钟SoC的时序签核可以归纳为三个层次:

  • 同步路径时序:同一时钟域或相位确定的时钟之间,检查建立时间、保持时间、恢复/移除时间是否满足,由PrimeTime完成。
  • 跨时钟域可靠性:异步边界上的信号是否经过两级触发器同步、是否使用了握手或异步FIFO、格雷码是否只翻转一位,由SpyGlass CDC等工具做结构检查。
  • 时钟树质量:时钟偏斜、插入延迟、门控时钟的使能时序是否安全,由PrimeTime和物理实现阶段共同保证。

这三类问题分别对应不同的工具和不同的检查方法,不能互相替代。STA通过不代表CDC安全,CDC通过也不代表时钟树没有偏斜问题。

三、Synopsys工具链在签核中的角色

Synopsys在多时钟SoC时序验证中的主力工具包括:PrimeTime负责门级STA签核,支持多场景(multi-scenario)分析,可同时检查不同电压、温度、时钟配置下的时序;PrimeTime SI在STA基础上加入串扰引起的延迟变化;SpyGlass CDC/RDC在RTL阶段检查跨时钟域结构和复位域交叉问题;PrimeTime PX用于功耗与时钟活动关联分析;IC Compiler II在物理实现中完成时钟树综合(CTS),其时钟树质量直接决定STA能否收敛。

典型签核流程是:RTL阶段用SpyGlass CDC做结构检查,综合后用PrimeTime做初步STA,物理实现CTS后再用PrimeTime做带SPEF的签核级STA,最后用PrimeTime SI确认串扰影响。每一步的约束文件(SDC)必须保持一致,否则前后结果无法对比。

四、一个典型的多时钟场景

假设一个SoC包含三个时钟:clk_cpu为800MHz,clk_ddr为400MHz,clk_usb为48MHz。CPU与DDR之间通过同步FIFO通信,DDR与USB之间通过异步FIFO通信。约束文件需要声明:

create_clock -name clk_cpu -period 1.25 [get_ports clk_cpu]
create_clock -name clk_ddr -period 2.50 [get_ports clk_ddr]
create_clock -name clk_usb -period 20.83 [get_ports clk_usb]

# CPU与DDR同源,相位确定,保留同步分析
# DDR与USB异步,声明异步关系
set_clock_groups -asynchronous \
  -group {clk_ddr} -group {clk_usb}

注意这里没有把clk_cpu和clk_ddr设为异步,因为它们来自同一PLL且分频比固定,相位关系确定。如果错误地把它们设为异步,STA会跳过CPU到DDR的同步路径检查,可能漏掉真实的建立时间违例。

五、验证流程的整体视图

下图展示了从RTL到签核的多时钟时序验证数据流:左侧是设计阶段,右侧是约束与工具,中间是各阶段的核心检查对象。CDC检查在RTL阶段拦截结构问题,STA在综合后和CTS后分别做时序检查,最终由PrimeTime SI完成带串扰的签核。

多时钟SoC时序验证数据流 RTL设计 多时钟域结构 综合网表 门级 + 约束 物理实现 CTS + 布局布线 签核 SPEF + 最终约束 CDC结构检查 同步器 / 握手 / FIFO 初步STA 建立/保持/恢复/移除 CTS后STA 时钟偏斜 + 插入延迟 签核级STA + SI 串扰 / 多场景 SpyGlass CDC RTL结构检查 PrimeTime 门级STA IC Compiler II CTS / 时钟树 PrimeTime SI 串扰签核 SDC约束文件:时钟定义 + 时钟组 + 例外路径(贯穿全流程) 设计阶段 检查对象 工具

六、初学者最容易踩的三个坑

第一,时钟定义不完整。只定义了主时钟,忘记用create_generated_clock描述分频时钟,导致STA把分频时钟的路径当作无时钟路径忽略。正确做法是每个生成时钟都显式声明,并指定-source和-divide_by。

第二,异步关系声明过度。为了快速消除违例,把大量路径设为false path或asynchronous clock group。这会让STA跳过真实需要检查的路径,签核结果不可信。正确做法是只对确认异步的时钟对声明异步关系,同步路径必须保留分析。

第三,忽略CDC检查。认为STA通过就万事大吉,但STA对异步路径本身不做建立/保持检查,异步边界上的亚稳态问题只能靠CDC结构检查发现。RTL阶段跑一次SpyGlass CDC,成本远低于流片后发现跨时钟域数据丢失。

多时钟SoC时序验证的核心逻辑是:先分清哪些时钟对是同步的、哪些是异步的,同步的交给PrimeTime做STA,异步的交给SpyGlass CDC做结构检查,最后用PrimeTime SI确认串扰影响。约束文件是贯穿全流程的基准,任何阶段修改SDC都必须重新跑对应阶段的检查。