覆盖率优化与验证收敛策略覆盖率数据收集完了数字不达标怎么办本文是覆盖率系列的第二篇聚焦优化与收敛——覆盖率未达标分析、.el 豁免文件管理、FSM 深度解读、CDV 三阶段验证法以及实战案例。本系列共两篇① 理论与实战篇 ② 优化收敛策略篇本文一、覆盖率未达标时的分析与优化1.1 定位未覆盖点在 Verdi 中直接点击红色未覆盖行或低覆盖率信号/状态思考为何测试激励没有触发这些代码。1.2 常见原因与解决方案原因解决方案激励不足优化随机约束增加多样性或针对边界场景编写定向测试用例环境配置/约束冲突检查验证环境确保约束条件正确且无冲突设计/代码冗余与设计工程师确认后对冗余代码进行豁免Waive1.3 覆盖率豁免操作对于确认无需覆盖的代码在 Verdi 中右键点击该行 → 选择Exclude进行豁免。关键注意豁免操作必须File → Save Exclusions保存到.el文件后才生效。下次打开数据库时可通过-elfile waivers.el加载。1.4 合理豁免的场景模块复用同一模块多次例化且功能相同只需分析其中一个实例厂商 IP第三方提供的库模型可 exclude不可达代码由于参数配置导致不可能执行的分支二、直接用例与随机用例的协同策略2.1 核心定义直接用例随机用例定义激励序列仿真前已完全确定激励由随机生成器在约束下动态产生目标精准验证已知功能和关键路径高效探索庞大验证空间冲击边角情况可控性极强完全确定、可重复体现在约束规则上而非具体数值覆盖率贡献单次通过后重复仿真价值有限更换种子即可自动提升覆盖率2.2 实战策略三阶段验证法冒烟测试阶段— 用少量直接用例验证基本功能复位、标准操作、已知边界随机探索阶段— 大量随机用例覆盖功能空间推动覆盖率收敛查漏补缺阶段— 针对覆盖率报告中的盲区编写定向用例直接用例如同精确制导导弹目标明确攻克已知堡垒随机用例如同智能侦察集群在规则下大规模探索发现未知雷区。两者相辅相成。三、状态机覆盖率深度解读3.1 FSM 覆盖率报告核心结构一份典型的 FSM 覆盖率报告包含综合覆盖率分数— 宏观指标必须深入细节状态列表— 所有状态及是否被进入过√ 已覆盖 / × 未覆盖状态转移矩阵— 所有转换路径及是否被测试这是报告的精髓一个拥有 N 个状态的 FSM理论上最多有 N×(N-1) 种转换需要测试。3.2 分步解读流程第一步定位未覆盖项— 寻找所有被标记为 Uncovered 的状态和转移路径第二步分析原因原因类型示例激励不足需构造特定错误场景才能进入 ERROR 状态设计冗余/不可达3-bit 编码共 8 种但只定义了 5 个有效状态环境约束限制配置寄存器被约束在固定值阻止了某些路径第三步关联其他覆盖率— 未覆盖状态通常对应case语句中未执行的分支交叉验证可精确定位 RTL 位置3.3 FSM 覆盖率提升策略策略说明优化随机约束引导随机生成器产生能触发特定状态转移的数据包/控制信号编写定向测试针对随机激励难以覆盖的极端边角情况审查与豁免确认冗余/不可达逻辑后豁免但必须谨慎并留文档四、.el 豁免文件管理4.1 创建豁免文件两种方式GUI 操作Verdi 中右键 Exclude → Save Exclusions 保存为.el文件手动编写直接编辑.el文件指定豁免行4.2 加载豁免文件有两种加载方式方式一仿真后查看时加载Verdiverdi-cov-covdirsimv.vdb-elfilewaivers.el方式二编译/仿真阶段直接排除推荐用于固定豁免项vcs-full64\-cmlinecondfsmtglbranch\-cm_excl_filecoverage_exclusions.el\-cm_dir./cov_db/simv.vdb\其他编译选项.el文件示例// 排除调试代码 EXCLUDE LINE counter counter.sv 13 // 排除不可达条件 EXCLUDE COND counter counter.sv 13 // 排除默认分支 EXCLUDE BRANCH counter counter.sv 16选择建议固定且确认的豁免项建议用-cm_excl_file在编译时就排除这样生成的.vdb数据更干净临时调试的豁免项用 Verdi GUI 操作后保存。4.3 关键注意事项要点说明版本更新RTL 代码修改后 checksum 变化.el 文件中的条目会出现异常图标需逐一处理Save As处理完豁免条目后千万不要直接覆盖原文件必须 Save As 新文件批量操作使用urg -dump full_exclusions导出所有豁免绕过 checksum-excl_bypass_checks选项仅对行覆盖率有效核心原则豁免前务必与设计工程师确认逻辑是否真的无需覆盖4.4 覆盖率分析完整工作流速查阶段核心操作产出所用工具环境设置加载环境变量、配置工具激活的环境shell编译仿真运行测试用例、-cm收集数据.vdb数据库VCS/simv数据合并urg合并多测试 vdbmerged.vdbURG报告解读Verdi/DVE 分析未覆盖区域漏洞列表Verdi/DVE优化迭代改约束/写定向测试/合理豁免更高覆盖率全链路这个5阶段闭环就是 CDVCoverage-Driven Verification的核心——覆盖率驱动验证每轮迭代都从报告解读开始直到所有关键指标达标。五、实战案例4-bit 逻辑运算单元以一个 4-bit 逻辑运算单元logic_op的验证为例12 个测试用例的回归结果指标结果是否达标DUT 行覆盖率97.06%✅ 达标DUT 条件覆盖率88.46%⚠️ 接近目标已知 RTL bug 导致部分路径不可达DUT 分支覆盖率93.33%✅ 达标DUT 翻转覆盖率19.87%❌ 但 4-bit 设计此值属正常分析结论2 个失败测试xnor、mode_switch均因同一已知 RTL bug。通过覆盖率分析成功定位验证盲点指导了后续测试优化。CDV 三阶段实操复盘阶段用例数LineBranchConditionToggle关键操作冒烟测试4 个直接用例60%55%50%8%复位、ADD、SUB、基本边界随机探索6 个随机用例95%→97%85%→93%75%→85%15%→19%随机 opcodeaddr种子轮换查漏补缺2 个定向用例97.06%93.33%88.46%19.87%针对 xnor/mode_switch 写定向测试可以看到随机探索阶段是覆盖率跃升的关键Line/Branch/Condition 都有 10~20% 的跳跃而查漏补缺阶段精准补盲Condition 从 85% 提升到 88.46%差值看似不大但覆盖的是最难触发的角落路径。六、总结覆盖率优化与收敛的五大要点代码覆盖率是底线— 低覆盖率一定意味着验证不充分功能覆盖率是深度— 100% 代码覆盖不等于没有 bug需要功能覆盖补盲断言覆盖率是保障— 协议检查和属性约束的触发情况豁免必须谨慎— 每一条 exclude 都需要设计工程师确认和文档记录三阶段验证法— 冒烟 → 随机探索 → 查漏补缺直接用例和随机用例协同覆盖率不是终点而是验证收敛的度量工具。结合代码覆盖率、功能覆盖率和断言覆盖率构建多维度验证度量体系才能真正为流片加上最后一道安全锁。参考资料Synopsys VCS User Guide — Coverage Metrics -cm_excl_fileSynopsys Verdi User Guide — Coverage Exclusion Manager《Writing Testbenches using SystemVerilog》— Janick Bergeron
覆盖率优化与验证收敛策略
覆盖率优化与验证收敛策略覆盖率数据收集完了数字不达标怎么办本文是覆盖率系列的第二篇聚焦优化与收敛——覆盖率未达标分析、.el 豁免文件管理、FSM 深度解读、CDV 三阶段验证法以及实战案例。本系列共两篇① 理论与实战篇 ② 优化收敛策略篇本文一、覆盖率未达标时的分析与优化1.1 定位未覆盖点在 Verdi 中直接点击红色未覆盖行或低覆盖率信号/状态思考为何测试激励没有触发这些代码。1.2 常见原因与解决方案原因解决方案激励不足优化随机约束增加多样性或针对边界场景编写定向测试用例环境配置/约束冲突检查验证环境确保约束条件正确且无冲突设计/代码冗余与设计工程师确认后对冗余代码进行豁免Waive1.3 覆盖率豁免操作对于确认无需覆盖的代码在 Verdi 中右键点击该行 → 选择Exclude进行豁免。关键注意豁免操作必须File → Save Exclusions保存到.el文件后才生效。下次打开数据库时可通过-elfile waivers.el加载。1.4 合理豁免的场景模块复用同一模块多次例化且功能相同只需分析其中一个实例厂商 IP第三方提供的库模型可 exclude不可达代码由于参数配置导致不可能执行的分支二、直接用例与随机用例的协同策略2.1 核心定义直接用例随机用例定义激励序列仿真前已完全确定激励由随机生成器在约束下动态产生目标精准验证已知功能和关键路径高效探索庞大验证空间冲击边角情况可控性极强完全确定、可重复体现在约束规则上而非具体数值覆盖率贡献单次通过后重复仿真价值有限更换种子即可自动提升覆盖率2.2 实战策略三阶段验证法冒烟测试阶段— 用少量直接用例验证基本功能复位、标准操作、已知边界随机探索阶段— 大量随机用例覆盖功能空间推动覆盖率收敛查漏补缺阶段— 针对覆盖率报告中的盲区编写定向用例直接用例如同精确制导导弹目标明确攻克已知堡垒随机用例如同智能侦察集群在规则下大规模探索发现未知雷区。两者相辅相成。三、状态机覆盖率深度解读3.1 FSM 覆盖率报告核心结构一份典型的 FSM 覆盖率报告包含综合覆盖率分数— 宏观指标必须深入细节状态列表— 所有状态及是否被进入过√ 已覆盖 / × 未覆盖状态转移矩阵— 所有转换路径及是否被测试这是报告的精髓一个拥有 N 个状态的 FSM理论上最多有 N×(N-1) 种转换需要测试。3.2 分步解读流程第一步定位未覆盖项— 寻找所有被标记为 Uncovered 的状态和转移路径第二步分析原因原因类型示例激励不足需构造特定错误场景才能进入 ERROR 状态设计冗余/不可达3-bit 编码共 8 种但只定义了 5 个有效状态环境约束限制配置寄存器被约束在固定值阻止了某些路径第三步关联其他覆盖率— 未覆盖状态通常对应case语句中未执行的分支交叉验证可精确定位 RTL 位置3.3 FSM 覆盖率提升策略策略说明优化随机约束引导随机生成器产生能触发特定状态转移的数据包/控制信号编写定向测试针对随机激励难以覆盖的极端边角情况审查与豁免确认冗余/不可达逻辑后豁免但必须谨慎并留文档四、.el 豁免文件管理4.1 创建豁免文件两种方式GUI 操作Verdi 中右键 Exclude → Save Exclusions 保存为.el文件手动编写直接编辑.el文件指定豁免行4.2 加载豁免文件有两种加载方式方式一仿真后查看时加载Verdiverdi-cov-covdirsimv.vdb-elfilewaivers.el方式二编译/仿真阶段直接排除推荐用于固定豁免项vcs-full64\-cmlinecondfsmtglbranch\-cm_excl_filecoverage_exclusions.el\-cm_dir./cov_db/simv.vdb\其他编译选项.el文件示例// 排除调试代码 EXCLUDE LINE counter counter.sv 13 // 排除不可达条件 EXCLUDE COND counter counter.sv 13 // 排除默认分支 EXCLUDE BRANCH counter counter.sv 16选择建议固定且确认的豁免项建议用-cm_excl_file在编译时就排除这样生成的.vdb数据更干净临时调试的豁免项用 Verdi GUI 操作后保存。4.3 关键注意事项要点说明版本更新RTL 代码修改后 checksum 变化.el 文件中的条目会出现异常图标需逐一处理Save As处理完豁免条目后千万不要直接覆盖原文件必须 Save As 新文件批量操作使用urg -dump full_exclusions导出所有豁免绕过 checksum-excl_bypass_checks选项仅对行覆盖率有效核心原则豁免前务必与设计工程师确认逻辑是否真的无需覆盖4.4 覆盖率分析完整工作流速查阶段核心操作产出所用工具环境设置加载环境变量、配置工具激活的环境shell编译仿真运行测试用例、-cm收集数据.vdb数据库VCS/simv数据合并urg合并多测试 vdbmerged.vdbURG报告解读Verdi/DVE 分析未覆盖区域漏洞列表Verdi/DVE优化迭代改约束/写定向测试/合理豁免更高覆盖率全链路这个5阶段闭环就是 CDVCoverage-Driven Verification的核心——覆盖率驱动验证每轮迭代都从报告解读开始直到所有关键指标达标。五、实战案例4-bit 逻辑运算单元以一个 4-bit 逻辑运算单元logic_op的验证为例12 个测试用例的回归结果指标结果是否达标DUT 行覆盖率97.06%✅ 达标DUT 条件覆盖率88.46%⚠️ 接近目标已知 RTL bug 导致部分路径不可达DUT 分支覆盖率93.33%✅ 达标DUT 翻转覆盖率19.87%❌ 但 4-bit 设计此值属正常分析结论2 个失败测试xnor、mode_switch均因同一已知 RTL bug。通过覆盖率分析成功定位验证盲点指导了后续测试优化。CDV 三阶段实操复盘阶段用例数LineBranchConditionToggle关键操作冒烟测试4 个直接用例60%55%50%8%复位、ADD、SUB、基本边界随机探索6 个随机用例95%→97%85%→93%75%→85%15%→19%随机 opcodeaddr种子轮换查漏补缺2 个定向用例97.06%93.33%88.46%19.87%针对 xnor/mode_switch 写定向测试可以看到随机探索阶段是覆盖率跃升的关键Line/Branch/Condition 都有 10~20% 的跳跃而查漏补缺阶段精准补盲Condition 从 85% 提升到 88.46%差值看似不大但覆盖的是最难触发的角落路径。六、总结覆盖率优化与收敛的五大要点代码覆盖率是底线— 低覆盖率一定意味着验证不充分功能覆盖率是深度— 100% 代码覆盖不等于没有 bug需要功能覆盖补盲断言覆盖率是保障— 协议检查和属性约束的触发情况豁免必须谨慎— 每一条 exclude 都需要设计工程师确认和文档记录三阶段验证法— 冒烟 → 随机探索 → 查漏补缺直接用例和随机用例协同覆盖率不是终点而是验证收敛的度量工具。结合代码覆盖率、功能覆盖率和断言覆盖率构建多维度验证度量体系才能真正为流片加上最后一道安全锁。参考资料Synopsys VCS User Guide — Coverage Metrics -cm_excl_fileSynopsys Verdi User Guide — Coverage Exclusion Manager《Writing Testbenches using SystemVerilog》— Janick Bergeron