推荐答案
测试一下
题目
1) 分析代码覆盖率时, verilog语句 if(a || (b && c)) 有哪几种条件需要覆盖?请
实例题
1) 分析代码覆盖率时, verilog语句 if(a || (b && c)) 有哪几种条件需要覆盖?
参考答案与知识点
参考答案
条件覆盖(Condition Coverage)要求每个原子条件(即布尔表达式中不可再分的条件)至少取一次真(1)和一次假(0)。对于语句 `if(a || (b && c))`,原子条件是 `a`、`b`、`c`(注意 `(b && c)` 是复合条件,由 `b` 和 `c` 组成,本身不是原子条件)。因此需要覆盖的6个条件值为:`a=0`、`a=1`、`b=0`、`b=1`、`c=0`、`c=1`。注意:条件覆盖不关心子表达式 `(b && c)` 的整体取值,也不要求覆盖所有组合(那是条件组合覆盖)。实际测试时,只需设计测试用例使每个原子条件分别出现0和1即可,例如 `{a=0, b=0, c=0}` 可覆盖 `a=0, b=0, c=0`,`{a=1, b=0, c=0}` 覆盖 `a=1` 等。易错点:1)误将 `(b && c)` 整体视为一个条件,导致只覆盖3个条件(a、b&&c真、b&&c假),这不符合标准定义;2)混淆条件覆盖与分支覆盖(Decision Coverage),分支覆盖要求 `if` 条件整体取真和假各一次;3)忽略Verilog中逻辑运算符的短路特性,例如 `a || (b && c)` 中若 `a=1`,则不再计算 `b && c`,但条件覆盖仍要求 `b` 和 `c` 的取值独立出现(可通过独立测试用例实现)。MC/DC(修正条件判定覆盖)则进一步要求每个条件独立影响判定结果,但本题未明确,故按基本条件覆盖作答。
涉及知识点
- 条件覆盖定义与原子条件识别
- 代码覆盖率类型(语句、分支、条件、MC/DC)
- Verilog逻辑运算符短路特性
- 条件覆盖与条件组合覆盖的区别