解释验证架构设计中的权衡考虑
解读
面试官抛出此题,并非想听“UVM八大组件怎么连”,而是考察候选人能否在“资源、进度、质量”三角约束下,把验证架构做成“可交付、可维护、可复用”的工程产品。国内芯片项目普遍“流片窗口硬、人力紧张、需求迭代快”,因此权衡必须落地到“谁来写、怎么跑、多久出结果、后期谁接盘”四个现实维度。答得越贴近国内真实痛点(如外包协同、夜班回归、FPGA 板子借不到、EMV 模型加密等),越能体现“资深”二字。
知识点
- 验证目标分层:feature 完备性、覆盖率收敛、性能指标、功耗场景、协议合规、安全特性。
- 架构四要素:激励(Stimulus)、检查(Check)、覆盖率(Coverage)、调试(Debug)。
- 国内常见约束:
– 人力:正式员工 vs 外包 vs 实习生的代码能力差异大;
– 时间:RTL 冻结日期由代工厂 MPW 日历倒推,几乎不可滑;
– 算力:On-premise 机房机时有限,云算力需走采购审批;
– 复用:下一颗芯片是“小改款”,架构必须可横向扩展;
– 交付:客户(整机厂)要签《验证报告》才能付款,形式验证结果必须可溯源。 - 权衡维度:
A. 抽象层级——TLM vs RTL vs Gate,越高跑越快,越低越真实;
B. 激励策略——Directed vs Constrained-Random vs Formal;
C. 检查策略——Assertion-Based vs Scoreboard vs E2E Reference Model;
D. 覆盖率闭环——功能覆盖、代码覆盖、断言覆盖、时序覆盖、功耗场景覆盖;
E. 性能-资源曲线——仿真速度 vs 内存占用 vs 编译时间;
F. 可调试性——波形大小、打印粒度、UVM_ERROR 定位到 RTL 行号;
G. 维护成本——脚本语言(Perl/Python/Make)、版本管理(Git LFS 大文件)、CI 平台(Jenkins/GitLab CI)。
答案
“验证架构的权衡,我把它总结成‘三砍三保’原则,全部对齐国内项目节奏。
第一,砍‘过度随机’,保‘快速收敛’。
国内项目普遍 6~8 个月流片,如果把全部精力放在写超级复杂的随机约束,很可能 RTL 一改,约束全废。我的做法是:先用 2 周时间做‘特性-用例’映射表,把客户协议合规项、性能指标、安全边界列成 120 条可量化 feature;对每条 feature 评估发生概率,高于 5 % 的用 directed+轻度随机,低于 5 % 的用 formal 做穷举。这样仿真轮次减少 40 %,夜班回归 8 小时就能跑完,保证 MPW 前两周完成 coverage > 95 %。
第二,砍‘单一大平台’,保‘模块化复用’。
很多团队一上来就写‘全能 env’,结果下一颗芯片接口从 AXI 换成 AHB,平台直接报废。我的架构拆成三层:
- Agent 层——只封装接口协议,代码量 < 2 k 行,通过 UVM 的 uvm_agent_param_utils 参数化数据位宽;
- Scenario 层——用 uvm_sequence_library 做激励组合,支持‘拖拽式’复用;
- SoC 层——只例化 Agent 和 Scenario,不写新代码。
这样‘小改款’项目只需重写 10 % 文件,人力从 5 人月降到 1.5 人月,外包同事也能快速接手。
第三,砍‘波形大海捞针’,保‘可调试索引’。
国内夜班调试只有 1~2 人在岗,如果靠肉眼看波形,通宵都定位不完。我在架构里预埋三处‘钩子’:
- 关键路径断言用 SVA cover 生成‘一行一特征’数据库,失败直接打印 UTF-8 中文错误码,方便外包同事看懂;
- Scoreboard 把 mismatch 信息写成 JSON,CI 自动上传 GitLab,次日早会大家直接看 Dashboard;
- 对超 4 G 的波形,采用‘分段 dump+基于时间戳的裁剪’,把失败前后 2 ms 切片,跑后立刻压缩上传 NAS,节省 70 % 磁盘空间。
通过这三砍三保,我上个项目在 RTL 冻结后 3 周就完成 sign-off,形式验证 152 条安全断言全部 PROVED,最终一次流片成功,客户整机厂提前 1 个月量产,公司现金流提前回笼 2 千万。”
拓展思考
- 当芯片进入 3 nm 后,物理效应(如电压降、温度反偏)开始反向影响功能,验证架构是否需要把 Power-Intent(UPF)和 Thermal-Model 也纳入参考层?如何权衡仿真速度与精度?
- 国内 RISC-V 生态火热,但指令集可扩展,验证架构如何设计“插件式”ISA 形式验证框架,让客户自定义指令也能在 1 周内完成等价性证明?
- 面对“Chiplet”多 die 场景,验证平台需要跨 die 协议(如 BoW、UCIe)建模,抽象层级上升到系统级,如何与封装团队协同,把 Package-Parity-Error 注入到验证激励而不拖累整体回归速度?