2. 覆盖率类型与选择策略
覆盖率不是单一指标,而是一组从不同角度回答“验证是否充分”的度量。在Synopsys工具链中,VCS负责仿真与代码覆盖率采集,Verdi用于覆盖率分析与调试,VC Formal与VC SpyGlass则从形式与静态角度补充断言、FSM和结构覆盖。理解每种覆盖率的“度量对象”和“盲区”,才能在设计验证计划时做出合理选择,而不是盲目追求100%。
代码覆盖率:验证的底线,而非目标
代码覆盖率由VCS在编译和仿真时自动插桩采集,度量的是RTL源码被激励“触碰”的程度,主要包括行覆盖率(Line)、语句覆盖率(Statement)、分支覆盖率(Branch)、条件覆盖率(Condition)和翻转覆盖率(Toggle,常单独讨论)。它不需要任何额外建模,是验证启动阶段最先可用的反馈。
代码覆盖率的适用场景是:确认没有“死代码”或完全未被激励驱动的逻辑;发现复位、异常分支、默认分支等被遗漏的路径。但它的根本局限在于——代码被执行不等于功能被验证。例如一个32位加法器,只要激励覆盖了所有行,代码覆盖率就是100%,但并未证明任意输入组合下结果正确。因此代码覆盖率应作为“必要条件”而非“充分条件”,通常要求分支覆盖率达到95%以上,剩余未覆盖项需逐条给出豁免理由。
功能覆盖率:验证意图的直接表达
功能覆盖率通过SystemVerilog的covergroup/coverpoint/cross建模,度量的是设计规格中关心的场景是否被激励命中。它由验证工程师根据验证计划手工编写,因此直接对应“我们想验证什么”。
典型建模方式如下:
covergroup cg_bus_xact @(posedge clk);
cp_cmd: coverpoint cmd { bins rd = {READ}; bins wr = {WRITE}; }
cp_len: coverpoint len { bins short = {[1:4]}; bins long = {[5:16]}; }
cp_burst: coverpoint burst { bins b1 = {1}; bins b4 = {4}; bins b8 = {8}; }
x_cmd_len: cross cp_cmd, cp_len;
endgroup
功能覆盖率的适用场景是协议交互、状态迁移、数据通路组合、边界与错误注入等“规格驱动”的验证。它的盲区是:只能覆盖建模到的内容,未建模的场景不会被统计。因此功能覆盖率必须与验证计划逐条对应,覆盖率收敛过程本质上就是验证计划执行情况的量化跟踪。
断言覆盖率:把“检查”也纳入度量
断言覆盖率度量的是SVA断言被激活(attempt)和成功/失败的情况。在VCS中通过-assert相关选项开启,在Verdi中可查看断言覆盖率报告。它回答的问题是:我们写的检查是否真的在仿真中被触发过?
断言覆盖率特别适合协议握手、时序约束、互斥条件、请求-应答配对等场景。一个常见陷阱是:断言写了但从未被激活,说明激励没有走到该场景,此时断言覆盖率会暴露这一漏洞。断言覆盖率与功能覆盖率互补——前者关注“检查是否被执行”,后者关注“场景是否被命中”。
FSM覆盖率:状态与迁移的完整视图
FSM覆盖率由VCS自动从RTL中提取状态机结构,统计状态覆盖率(State)、状态迁移覆盖率(Transition)和序列覆盖率(Sequence)。它适用于控制逻辑密集的设计,如仲裁器、协议控制器、DMA调度器等。
FSM覆盖率的价值在于:它能发现“状态可达但迁移未走通”或“迁移存在但从未进入”的问题。例如一个仲裁器有IDLE、GRANT0、GRANT1、WAIT四个状态,若仿真只走了IDLE→GRANT0→IDLE,则GRANT1和WAIT相关迁移未覆盖。此时应补充激励或检查是否存在不可达状态。需注意,FSM覆盖率依赖工具对状态机的识别,编码风格不规范时可能提取失败,需结合代码审查确认。
翻转覆盖率:信号级活动的细粒度度量
翻转覆盖率统计每个信号从0→1和1→0的翻转情况,通常以“已翻转节点/总节点”的比例呈现。它由VCS自动采集,适合发现“信号从未活动”或“只朝一个方向翻转”的问题。
翻转覆盖率在低功耗验证、时钟门控、复位逻辑和总线空闲检测中尤为有用。例如一个使能信号若从未从1翻转到0,说明关闭路径未被验证。但翻转覆盖率对大型设计会产生海量数据,通常只对关键控制信号、时钟、复位和电源管理信号设置重点监控,而非全芯片无差别追求100%。
如何组合选择:按阶段与设计特征决策
覆盖率选择不是“全都要”,而是根据验证阶段和设计特征做组合。模块级验证阶段,代码覆盖率和FSM覆盖率最先可用,用于快速定位未激活逻辑和未走通迁移;子系统验证阶段,功能覆盖率和断言覆盖率成为主力,前者对齐验证计划,后者确保检查被触发;SoC级验证阶段,翻转覆盖率和功能覆盖率共同关注功耗、时钟、复位等跨模块场景。
对于控制逻辑密集的设计,FSM覆盖率优先级应提高;对于数据通路和协议交互,功能覆盖率与断言覆盖率是核心;对于低功耗设计,翻转覆盖率不可省略。一个实用的判断方法是:先问“这个设计最怕什么漏验”,再选择能暴露该风险的覆盖率类型。例如最怕状态机卡死,就重点看FSM迁移覆盖;最怕握手协议违例,就重点看断言覆盖率和功能覆盖率中的cross。
-cm line+cond+fsm+tgl+branch开启,仿真后生成.vdb数据库;功能覆盖率由covergroup在仿真中自动收集;断言覆盖率通过-assert相关选项启用。所有覆盖率结果可在Verdi中通过urg或覆盖率GUI统一查看与合并。总结来说,五种覆盖率各有明确的度量对象和盲区。代码覆盖率回答“代码是否被执行”,功能覆盖率回答“场景是否被命中”,断言覆盖率回答“检查是否被触发”,FSM覆盖率回答“状态迁移是否走通”,翻转覆盖率回答“信号是否活动”。在Synopsys工具链中,它们由VCS统一采集、Verdi统一分析,最终服务于同一个目标:用可量化的证据判断验证是否充分,并在未充分时指出下一步该补什么。