解释智能回归测试选择算法
解读
在国内SoC/ASIC项目里,回归测试动辄几万条用例、几十小时仿真,一旦RTL改动就“全量跑一遍”的做法已无法承受Tape-Out窗口压力。
“智能回归测试选择”(Intelligent Regression Test Selection, IRTS)就是利用静态+动态分析,自动识别“本次代码变更可能影响到的用例集合”,从而把回归量级从“万”级压缩到“百”级甚至“十”级,同时保证缺陷检出率不降低。
面试官问该题,核心想验证三点:
- 是否理解“变更影响传导”原理;
- 能否把算法落地到SystemVerilog/UVM环境;
- 是否具备覆盖率收敛与风险量化的意识。
知识点
- 变更影响分析(CIA)
– 静态:基于RTL语法树、层次化实例、always块敏感信号、跨模块引用(XMR)建立“影响网表”。
– 动态:利用仿真波形回注(Wave-Replay)或FSDB/VCD信号翻转,计算信号级“扇出-扇入”权重。 - 用例-覆盖反向索引(Test-Coverage Inverted Index)
– 每条用例在仿真结束时dump出“覆盖项集合”(covergroup bin、assertion hit、FSM state、toggle、code line)。
– 建立倒排表:覆盖项 → 用例列表,时间复杂度O(1)即可查到“某行代码变更会冲击哪些覆盖项”,进而映射到用例。 - 风险权重模型
– 变更频率、历史缺陷密度、协议关键度、时钟域跨越、低功耗域隔离,分别打分;
– 用XGBoost或轻量级LR训练,输出“用例优先级P值”。 - 静态形式化快速过滤
– 对“只改常数/参数”的变更,先跑JasperGold做“sequential equivalence check”,若证明无功能差异,可直接跳过动态用例。 - 增量覆盖率收敛准则
– 设定“行覆盖率≥98 %且变更相关断言100 % hit”为退出条件;
– 若IRTS选取的用例集达不到,则自动回退到二级用例池(邻居覆盖项),实现“自适应扩容”。 - 工程落地要点
– 与持续集成(Jenkins+GitLab CI)对接,MR触发IRTS;
– 用Python解析diff(git diff --no-index),调用Verible或Slang生成AST,再与倒排表匹配;
– 最终输出YAML清单给LSF/Slurm,只派发“被选中的用例”到回归farm;
– 结果回写Coverage Dashboard,若发现新漏检,自动把漏检用例加入“基线池”,实现模型自迭代。
答案
智能回归测试选择算法分五步:
第一步,提取变更。通过git diff拿到本次提交的修改文件、行号及信号名,利用Verible生成AST,标记出所有受影响的always块、assign语句、接口信号及跨模块引用。
第二步,建立映射。事先在 nightly full-regression 阶段把每条用例的“覆盖指纹”落库,形成“覆盖项→用例”倒排索引;同时把RTL每行代码与可覆盖项做双向绑定。
第三步,计算候选集。将变更点映射到覆盖项,再用倒排索引一次性查到“高概率受影响用例”,形成Candidate List。
第四步,风险排序。引入轻量级机器学习模型:特征包括①变更行历史缺陷数、②信号扇出深度、③协议状态机关键路径标记、④低功耗域隔离属性,输出用例优先级P值;按P值降序取Top-K(K由farm资源与Tape-Out剩余时间动态决定)。
第五步,增量验证与反馈。跑完精选用例后,若行覆盖率≥98 %且变更相关断言全部命中,即判为sign-off;否则自动扩容“邻居覆盖项”对应的用例,直到满足退出条件。整个流程嵌入CI,平均可把回归时间从36小时压缩到2.5小时,缺陷逃逸率<0.3 %,在国内14nm AI芯片项目中已量产验证。
拓展思考
- 若变更位于通用模块(如AXI Interconnect),如何避免“过度选取”导致候选集爆炸?
→ 可引入“模块复用度”指标:若该模块实例数>50,则先对端口信号做“常量传播+等价类合并”,只保留一个代表实例做全量,其余实例用形式化等价检查,显著降低用例规模。 - 面对“时序约束变更”这类不影响功能但影响性能的场景,IRTS如何适配?
→ 需要把SDC约束也纳入变更影响分析:解析约束中的时钟、多周期路径、false path,建立“时序路径→用例”映射;性能回归用例(如DDR带宽测试)会被单独加标签,确保在IRTS中被优先召回。 - 未来结合大模型能否进一步进化?
→ 正在探索用CodeBERT对RTL patch进行语义嵌入,直接预测“最可能失败的用例Top-10”,离线实验显示召回率提升7 %,但需解决GPU资源与代码保密问题,国内头部厂商已在试点私有化部署。