其他分享
首页 > 其他分享> > 代码覆盖率和功能覆盖率之间的区别

代码覆盖率和功能覆盖率之间的区别

作者:互联网

代码覆盖率

代码覆盖率直接来自设计代码。它不是用户指定的。代码覆盖的优点之一是它自动评估设计的源码在仿真/回归期间被执行的程度,从而识别设计源码中在仿真期间未被执行的结构。与功能覆盖率不同,代码覆盖率的主要好处之一是创建结构覆盖模型是一个自动过程。因此,将代码覆盖率集成到现有的仿真流程中很容易,并且不需要更改当前的设计或验证方法:

– 分析是否涵盖了设计结构(即行、变量翻转、assign、分支路径、表达式、状态、状态转换等)

– 但不分析设计的意图:

  • 如果用户指定的busGnt = busReq && (idle || !(reset))

  • 而不是真正的意图busGnt = busReq && (idle && !(reset)) 代码覆盖率并不会捕获这个错误。因此,我们既需要一个健壮的TestBench来找出功能性错误,又需要一种客观地评价TestBench健壮程度的方法。

行覆盖率

行覆盖率是一种代码覆盖率指标,用于识别在仿真过程中执行了哪些代码行。行覆盖率报告具有与代码的每一行相关联的统计,指出该行已执行的总次数。行代码执行次数统计不仅可用于识别从未执行过的代码行,而且在工程师认为需要最小行执行阈值才能实现充分测试时也很有用。

行覆盖率分析通常会发现,由于缺少输入激励,激活一行代码所需的情况并未发生。或者,行覆盖率分析可能会显示代码的数据和控制流阻止它是由于代码中的错误,或在某些 IP 配置下当前不需要的死代码。对于未使用或死代码,可以选择在覆盖率记录和报告步骤中排除或过滤此代码,这样就可以只关注相关代码。

语句(表达式)覆盖率

语句覆盖率是一种代码覆盖率指标,用于识别代码中的哪些语句在仿真期间已被执行。一般来说,语句覆盖率比行覆盖率更有用,因为一条语句可能跨越多行代码,或者多条语句可能出现在单行代码中。

用于语句覆盖率分析的报告将具有与代码的每一行相关联的计数,指示语句已执行的总次数。此语句执行计数值不仅可用于识别从未执行过的代码行,而且在工程师认为需要最小语句执行阈值才能实现充分测试时也很有用。

100% 的语句覆盖率意味着 100% 的行覆盖率。但相反的情况并非如此:一行可能包含多个语句,而一个测试可能无法成功执行所有语句。

条件(分支/决策/路径)覆盖率

条件覆盖率(也称为决策覆盖率)是一种代码覆盖率指标,它报告在控制结构(例如 if、case、while、repeat、forever、for 和 loop 语句)中测试的布尔表达式是否被评估为 true 和 false 。

有限状态机覆盖率

今天的代码覆盖率工具可以识别 RTL 源代码中的有限状态机。因此,这使得自动提取 FSM 代码覆盖率成为可能,例如,进入状态机的每个状态的次数以及 FSM 从一个状态转换到其每个相邻状态的次数。

请注意,代码覆盖率工具不知道哪些状态转换是有效的。它将报告所有未被覆盖的状态转换。必须清除这些未发现的状态转换中,哪些是不关心的。

功能覆盖率

功能覆盖率是检测我们是否已经覆盖了设计规范要求的功能。我们是否涵盖了设计规范要求的所有功能?例如,可能有 100% 的代码覆盖率,但功能覆盖率可能只有 50%。仅涵盖 RTL 代码的结构(代码覆盖率)并不能保证我们在功能上涵盖了 RTL 实际打算设计的内容。在这种情况下,显然不能自动创建功能覆盖矩阵。我们必须仔细研究设计规范并使用“covergroup”、“coverpoint”、“bins”等手动创建功能覆盖矩阵。

所以,如何创建功能覆盖率:

– 用户指定:识别需要进行功能覆盖率检测的设计规范中的功能。这是一个必须根据设计规范手动实现的过程。

– 基于设计规范(正如我们已经看到的断言的“cover”)。

– 检测设计意图的覆盖率。

– 面向控制的覆盖率:

  • 是否执行了读取周期支持的所有可能协议(例如burst、non-burst)?

  • 翻转覆盖率

  • 交叉覆盖率

– 面向数据的覆盖率:

  • 我们是否在所有粒度级别(奇数字节、偶数字节、字、四字、完整缓存行等)访问了缓存行(catch lines,即最小缓存单位)?

 

标签:语句,功能,区别,覆盖率,代码,设计规范,执行
来源: https://www.cnblogs.com/fuqiangblog/p/16648455.html