1. 下列关于代码覆盖率描述错误的是:
答案:AB
2. 代码覆盖率、条件覆盖率和状态机覆盖率均达到 100%,可以认为设计没有问题。
A:正确
B:错误
答案:B
解析:
覆盖率 2 个大方面:代码覆盖率,功能覆盖率。
代码覆盖率包括:
(1)语句覆盖率
(2)条件覆盖率;
(3)分支覆盖率;
(4)状态机覆盖率;
代码覆盖率 100% 不代表功能没问题。
(1)功能覆盖率高但是代码覆盖率低
分析未覆盖到的代码,推断仿真是否有遗漏的功能点,代码是否为冗余或不可达代码;
(2)功能覆盖率低但是代码覆盖率高
仿真用例没有关注到一些功能点,需要修改测试用例。
代码覆盖率:
白盒覆盖率,一般仿真工具都有这个统计功能。代码覆盖率达到 100% 不代表设计没有问题。
(1)分支覆盖率
针对 if…else、case 等分支语句,看代码中设计的分支是否都被测试到了。
针对 if(条件1),只要条件 1 取 true 和 false 都执行过,则这个分支就完全覆盖了。
(2)语句覆盖率
语句覆盖率上不去时,可以查看未覆盖处的代码是测试用例的疏忽、冗余代码或是保护用途的代码,比如case的default;
(3)翻转覆盖率
包括两态翻转(0/1)和三态翻转(0/1/Z),常用的是两态翻转。对于单比特信号而言,若仿真用例使得该信号从0到1和从1到0的翻转均发生,则认为这里的翻转覆盖率是全面的(100%)。
即使翻转覆盖率达到 100%,分支覆盖率和语句覆盖率也不一定达到 100%。
(4)条件覆盖率与表达式覆盖率
条件覆盖率可以看作是对分支覆盖率的补充。每一个分支条件表达式中,所有条件的覆盖。
比如:
if(a&& b)
statement1;
else
statement2;
测试用例:a=1,b = 1 和 a = 0,b = 1
分支覆盖率 100%,两个分支都覆盖了,但是条件覆盖率不是 100%,有判断条件没有被测试到。
(5)状态机覆盖率
如下状态机实现代码中,需要分析其 FSM 覆盖率的分支有哪几个?
A. curr_st 为 1,next_st 为 2;
B. curr_st 为 2,next_st 为 3;
C. curr_st 为 3,next_st 为 0;
D. curr_st 为 0,next_st 为 1;
答案:ABD
解析:
A.curr_st 为 1,next_st 为 2,有这种跳转,对;
B.curr_st 为 2,next_st 为 3,有这种跳转,对;
C.curr_st 为 3,next_st 为 0,没有这种跳转,错;
D. curr_st 为 0,next_st 为 1,有这种跳转,对;
功能覆盖率
又称黑盒测试覆盖率,只关心功能,不关心具体的代码是如何实现的。如果想要统计功能覆盖率,需要在 SystemVerilog 编写的测试用例中添加覆盖组,仿真器基于它来统计功能覆盖率。