解释异构系统中的时钟域交叉验证
解读
“异构系统”在国产SoC语境里通常指“多die合封”或“多协议子系统拼接”的场景:CPU子系统跑在3 GHz同步网表,NPU用1.2 GHz衍生时钟,PCIe Gen5 PHY自带 recovered clock,DDR5控制器用差频800 MHz,再加上片间Chiplet通过BoW或UCIe走异步握手。面试官想听你如何把“CDC(Clock Domain Crossing)”从单die的模块级检查,扩展到多die、多协议、多电压、多温漂的异构场景,并给出可落地的验证方案。重点不在背CDC定义,而在“如何穷尽跨die、跨协议、跨电源域的边界场景,并给出sign-off证据”。
知识点
-
异构CDC分类
a. 单die内同步-异步端口:常见UVM-SV环境用$past+assert_handshake覆盖。
b. 多die间异步通道:需建模片间skew、lane-to-lane skew、refclk ppm漂移,国内主流用Verilog-AMS + SystemVerilog real建模,跑VCS-XA或X-Propagation。
c. 协议嵌入式CDC:PCIe/SRIO的elastic buffer、DDR的FIFO-WR/RD、UCIe的credit-return,协议本身已定义handshake,但需验证在±300 ppm、电压droop 10 %、温度-40~125 ℃下是否仍满足MTBF>1e9 h。 -
验证方法学
a. 静态形式:SpyGlass/VC-LP做structural CDC,重点检查“跨die路径是否被误报为单die”,需在sgdc里把die-to-die path设成async_interface,并加set_case_analysis区分power domain。
b. 动态仿真:
– 在UVM环境里例化uvm_clk_gen衍生出至少9个相位(0/45/90 … 315),用+plusargs随机拉偏±10 %周期,跑满100 k seeds,收集覆盖率toggle + fsm + assertion。
– 对多die通道,用SystemVerilogbind把jitter模型插到PHY接口,跑$random_dist_normal(0,50 ps),检查FIFO空满是否触发协议重传。
c. 硬件加速:
– 国内流片前必做Palladium或Zebu全芯片emulation,把温度/电压传感器I2C回读脚本连到emulator,闭环调节core voltage ±5 %,跑Linux+AI benchmark 72 h,用VCD压缩后回注SVA,确认无metastable事件。
d. 混合sign-off:
– 形式工具跑“穷举序列深度=20”证明握手信号在任意相位差下不丢数据;
– 动态跑“ppm drift + jitter + power gating”三维组合,用JasperGold覆盖“不可能”场景,最终给出MTBF报告,满足GB/T 34985(国内等效JESD47)可靠性要求。 -
国内项目痛点
– 多die合封缺少统一handshake协议,常见把AXI-Stream包通过异步FIFO转UCIe,但FIFO深度按单die经验设成8,结果Chiplet高温下读写指针撞车,流片失败。验证阶段必须用SystemVerilog-Real建模温度系数,把FIFO深度做成可配,跑corner后反标到RTL。
– 工艺厂(SMIC 14 nm、TSMC 12 nm)给的.lib里未含跨die的set_timing_derate,需验证团队自己写set_max_transition 0.8*Vdd约束,否则STA sign-off乐观,功能仿真却偶发亚稳态。
答案
“在异构系统里,时钟域交叉验证的核心是‘跨die、跨协议、跨环境’三维收敛。我的做法是三步:
第一步,用SpyGlass把结构CDC分三类——单die同步口、多die异步通道、协议嵌入式FIFO,对每类写专属sgdc,防止跨die路径被误报。
第二步,在UVM环境里用uvm_clk_gen随机拉偏±10 %周期,并绑定jitter模型到PHY接口,跑100 k seeds,收集toggle+fsm+assertion覆盖率;同时用JasperGold做形式验证,序列深度20,证明握手信号在任意相位差下不丢数。
第三步,把全芯片网表放到Palladium,跑Linux+AI benchmark 72 h,闭环调节电压±5 %、温度-40~125 ℃,用SVA回注检查metastable事件,最终给出MTBF>1e9 h的报告,满足GB/T 34985 sign-off要求。
在上一代XX芯片中,我用这套流程发现Chiplet异步FIFO深度不足,反标后把深度从8提到16,避免了一次流片失败。”
拓展思考
-
如果工艺厂只提供typical库,如何验证跨die路径在ss/ff下的亚稳态裕量?
提示:用PrimeTime抽取setup/hold slack,在SVA里用$setuphold动态检查,把ss/ff的derate系数写成+define+DERATE=1.3,跑emulation时反标回仿真。 -
低功耗场景下,电源域关闭再打开后,异步FIFO指针可能“冻住”,如何确保恢复后不丢数?
提示:在UVM里加power_gating_seq,用force把retention register值随机corrupt,检查FIFO空满标志是否自恢复,同时用形式工具证明pwr_ack到fifo_rst的时序关系。