描述回归测试失败分析自动化方法
解读
回归测试在芯片验证周期中每天甚至每小时都在跑,一次回归往往包含几千到几万条用例,失败条目动辄上百。面试官问“自动化方法”,不是让你简单回答“看log、提bug”,而是想看你是否能把“失败→定位→归类→提单→追踪”这一整条链路做成无人值守的闭环,同时能在国内普遍使用的GitLab-CI/Jenkins+JIRA+ELK(或自研平台)环境里落地。考察重点有三:
- 能否把“ noisy failure”与“ real design bug”快速分离,减少工程师熬夜筛log;
- 能否把重复性工作脚本化,让平台自动开单、自动复测、自动更新状态;
- 能否给出可维护、可扩展的架构,支持后续新协议、新用例无缝接入。
知识点
- 回归失败根因分类矩阵:
– 环境类(seed不稳定、timescale、race、UVM objection挂死、mem model冲突);
– 用例类(constraint冲突、随机约束退化、reference model版本错配);
– RTL功能类(新commit引入逻辑bug、跨时钟域、协议违例);
– 工具/脚本类(VCS/Questa版本升级、license抢占、LSF节点异常);
– 功耗/性能类(UPF2.0→2.1升级导致低功耗场景fail,perf counter阈值漂移)。 - 日志结构化:把仿真器原始log解析成JSON,关键字段统一命名(testname、seed、commit_id、simulator_exit_code、TREND_DIFF、UVM_ERROR_COUNT、Assertion_FAIL、Coverage_DROP、CPU_TIME、POWER_ESTIMATE)。
- 自动diff算法:
– 文本diff:基于simv.log与golden.log的“折叠上下文”算法,屏蔽timestamp、seed、路径差异;
– 波形diff:基于fsdb/sqlite的signal hash,自动提取fail cycle前后1000ns的关键接口信号,生成“信号变更指纹”;
– 覆盖率diff:对比line/FSM/assertion覆盖率,用“覆盖率回归阈值”过滤噪声。 - 知识库/模型:
– 规则引擎:维护200+条正则→根因映射,如“%Error:.multiple drivers.”→“RTL bus conflict”;
– 机器学习:用LightGBM训练二分类模型,特征为log关键词TF-IDF、exit_code、覆盖率跌幅、历史同fail pattern,输出“bug概率”;
– 聚类:对当日全部fail log做MinHash LSH,自动合并同类项,减少JIRA ticket 70%。 - 自动开单与复测:
– 若模型置信度>0.85且聚类中心为新,则调用JIRA REST API自动创建ticket,summary格式“[REG][TOP][MD5] short desc”,attachment自动上传diff_wave.png、reproduce_script.sh;
– 触发bisect:利用GitLab CI的“retry failed only”pipeline,自动回退到最近pass commit,二分定位肇事commit;
– 复测策略:对environment类失败自动换3颗seed重跑,若全pass则标记“flaky”并关闭ticket。 - 通知与度量:
– 企业微信/飞书群机器人每日08:30推送“回归体检报告”:总用例、失败数、自动闭环率、平均定位时长(MTTI);
– 建立“回归健康度”KPI:自动闭环率>90%、MTTI<30min、reopen率<3%,纳入部门OKR。 - 国内落地注意:
– 服务器资源紧张时,优先把“波形diff”任务 offload到夜间低优先级LSF队列;
– 若公司禁用外网,则把LightGBM模型部署在本地GPU服务器,训练数据脱敏后内部流转;
– 与后端版图组对齐:若失败由“时钟树insertion delay”引起,需自动把ticket抄送到后端项目群。
答案
我设计的回归失败分析自动化框架叫RFA(Regression Failure Analyzer),已在当前项目上线,日处理1.2万条用例,平均定位时长从2小时降到18分钟,整体闭环率92%。核心流程分四层:
- 数据采集层:
– 每轮回归结束后,Jenkins调用统一parser把simv.log、vsif、fsdb、coverage.xml、commit_id、tool版本等信息打成tar包,上传到NAS;
– 使用自研Python包“log2json”把非结构化log解析成标准JSON,字段统一,方便下游处理。 - 智能分析层:
– 规则引擎先跑一遍,5分钟完成80%的“已知病”识别;
– 未知失败送入LightGBM模型,输出bug概率;同时用LSH聚类,把相似失败合并;
– 对高概率bug自动截取fail cycle波形,生成diff图片,调用Verdi CLI实现“零GUI”波形对比。 - 决策执行层:
– 若模型置信度>0.85且聚类中心首次出现,自动创建JIRA ticket,assign给最近一次修改相关module的工程师;
– 触发GitLab CI的bisect job,30分钟内给出肇事commit;
– 对环境类失败自动换seed复测,3次pass即标记为flaky并关闭。 - 度量反馈层:
– 每日推送“回归体检报告”到飞书群;
– 把自动闭环率、MTTI、reopen率写进部门OKR;
– 每月复盘模型bad case,持续迭代关键词库和训练集。
通过RFA,我们在0.13um DFT项目流片前最后一轮回归中,用一晚自动筛掉112个环境噪声,真实bug仅9个,全部在24小时内定位并修复,最终一次流片成功。
拓展思考
- 大芯片时代,回归用例将突破十万级,日志量达TB级,可考虑把波形diff搬到GPU加速,或用“时序数据库+OLAP”做秒级查询。
- 形式验证工具(VC Formal)本身也会失败,如何把formal的“cex”失败也纳入同一套自动化框架,是未来融合方向。
- 国内不少公司开始用国产EDA,日志格式不开放,可提前在parser层做插件化抽象,保证切换工具时“零修改”下游算法。
- 自动开单虽爽,但容易“spam”,可引入“工程师反馈闭环”:若人工把ticket标为“无效”,模型自动降权该pattern,实现在线学习。