VCS代码覆盖率实战:从编译到分析的完整流程解析

张开发
2026/5/4 21:39:24 15 分钟阅读
VCS代码覆盖率实战:从编译到分析的完整流程解析
1. VCS代码覆盖率基础概念第一次接触代码覆盖率时我也被各种术语搞得晕头转向。简单来说代码覆盖率就像给代码做体检它能告诉我们哪些代码被执行过哪些还处于亚健康状态。在芯片验证领域VCS作为主流的仿真工具提供了完整的覆盖率解决方案。常见的五种覆盖率类型就像体检的不同项目行覆盖率最基础的检查项统计每行代码是否被执行分支覆盖率检查所有if-else/case分支是否都被覆盖状态机覆盖率验证状态机所有可能的状态和转移条件覆盖率检查复杂逻辑表达式的所有组合情况翻转覆盖率监测信号0/1跳变是否充分在实际项目中我们团队曾遇到过状态机覆盖率不足导致的bug。一个简单的UART控制器状态机由于缺少对异常状态的测试最终在流片后出现了死锁问题。这个教训让我深刻体会到覆盖率分析的重要性。2. 编译阶段的覆盖率配置2.1 关键编译参数解析要让VCS收集覆盖率数据首先需要在编译时开启对应选项。下面这个Makefile片段是我在多个项目中验证过的稳定配置CM -cm linecondfsmbranchtgl CM_NAME -cm_name simv CM_DIR -cm_dir ./covdir.vdb vcs -full64 -debug_accall -timescale1ns/1ps \ -fsdb -sverilog \ ${DFILES} \ ${CM} \ ${CM_NAME} \ ${CM_DIR}这里有几个容易踩坑的点-debug_accall必须开启否则无法收集调试信息时间单位建议用1ns/1ps组合避免后续波形查看时的精度问题-cm参数支持用加号连接多种覆盖率类型2.2 模块级覆盖率控制大型项目中我们可能只需要关注特定模块的覆盖率。这时可以用-cm_hier配合配置文件# cm_hier.cfg内容 tree top.u_dut module module_A这个配置只统计top.u_dut路径下和module_A模块的覆盖率。我在最近的一个GPU验证项目中通过这种方式将覆盖率分析时间缩短了40%。3. 仿真阶段的覆盖率收集3.1 基础仿真命令编译完成后仿真阶段需要保持相同的覆盖率配置./simv -l run.log \ ${CM} \ ${CM_NAME} \ ${CM_DIR}建议始终添加-l参数记录log我们团队曾因为没保存log导致无法追溯覆盖率未达标的具体原因。3.2 回归测试的覆盖率合并当有多个测试用例时可以用urg工具合并覆盖率数据urg -full64 -dbname merged.vdb \ -dir test1/simv.vdb test2/simv.vdb合并后的报告会显示总体覆盖率百分比各模块覆盖率详情未覆盖的代码列表4. 覆盖率报告分析实战4.1 DVE图形化分析使用dve查看覆盖率是最直观的方式dve -full64 -covdir merged.vdb在图形界面中左侧是覆盖率摘要中间显示代码和覆盖状态右键可以查看覆盖细节我习惯先看状态机覆盖率因为状态机的遗漏往往意味着重大风险。4.2 Verdi的高级技巧新版本验证环境更推荐使用Verdiverdi -cov -covdir merged.vdb Verdi的优势在于支持与波形联调可以交叉探测(cross-probe)提供更美观的报告导出5. 覆盖率提升方法论5.1 典型问题排查流程当覆盖率卡在某个阈值时我的排查步骤是先检查行覆盖率补全基础用例再分析分支覆盖率添加边界条件最后处理条件覆盖率构造特殊场景5.2 状态机覆盖率的提升案例以SPI控制器的状态机为例初始覆盖率只有75%。通过以下步骤提升到100%列出所有未覆盖的状态转移设计特定激励序列添加异常状态恢复测试这个过程中VCS的覆盖率报告帮我们发现了3个设计规格书中未明确的边缘情况。6. 工程实践中的经验分享在最近的一个AI芯片项目中我们建立了这样的覆盖率流程每日回归收集覆盖率每周分析增长趋势冻结阶段重点攻关低覆盖率模块一个实用技巧是将覆盖率数据与CI系统集成设置质量门禁。我们团队规定新代码提交必须附带覆盖率提升的测试用例这个措施让项目后期的验证效率提高了30%。对于大型芯片项目建议采用分层覆盖率策略先保证模块级覆盖率再追求系统级覆盖率。我们曾在一个多核处理器项目上通过这种方法节省了约200小时的仿真时间。

更多文章