前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【日更计划126】数字IC基础题

【日更计划126】数字IC基础题

作者头像
空白的贝塔
发布2021-07-16 11:08:40
5000
发布2021-07-16 11:08:40
举报
文章被收录于专栏:摸鱼范式摸鱼范式

上期答案

[356] 代码覆盖率与功能覆盖率的区别是什么?
  • 代码覆盖率:代码覆盖率是一种度量,用于度量给定测试case对设计代码(HDL模型)进行测试的程度。启用后,模仿真器会自动提取代码覆盖率。
  • 功能覆盖率:功能覆盖率是用户定义的度量标准,用于度量已执行了多少spec(如测试计划中的功能所列举的)。它可以用来衡量对于spec的测试充分性。它是用户定义的,不会自动生成。它也不依赖于设计代码,因为它是根据spec实现的
[357] 代码覆盖率有哪几种?
  • Statement/Line coverage:用于衡量在仿真测试期间测试了多少条语句(行)。一般行覆盖率的目标是100%。在下面的代码中,有4行或语句将在Statement/Line coverage中进行收集。
代码语言:javascript
复制
always @ (posedge clk) begin
    if( A > B) begin //Line 1 
        Result = A - B; //Line 2
    end else begin //Line 3 
        Result = A + B; //Line 4
    end
end
  • Block coverage:在begin-end或if else或case语句之间或while循环或for循环之间的一组语句称为块。块覆盖率衡量的是在仿真过程中是否覆盖了这些类型的块码。块覆盖范围看起来类似于语句覆盖范围,不同之处在于块覆盖率包含了一组语句。在下面的的示例代码中,有三个代码块
代码语言:javascript
复制
always @ (posedge clk) begin //always block
    if( A > B) begin // if block
        Result = A - B;
    end else begin // else block
        Result = A + B;
    end
end

Branch/Decision coverage:分支覆盖率评估HDL代码中的条件,例如if-else,case语句和三元运算符(?:)语句,并检测是否同时包含真假情况。在上面的示例中,只有一个分支(if A> B),分支覆盖率会检查是否真假两个分支都被触发了。

Conditional Coverage and Expression coverage:条件覆盖率会检查HDL中的所有布尔表达式,并计算该表达式为真或假的次数。表达式覆盖率检查语句的右侧,统计所有可能组成的真值表的覆盖程度。以下是包含3个布尔变量的表达式,它们决定了Result变量为true或false

代码语言:javascript
复制
Result = (A && B) || (C)

针对A,B和C的所有可能情况,如下创建真值表。条件覆盖率可以衡量此真值表的所有行是否都被覆盖。

  • Toggle coverage:翻转覆盖率可衡量仿真运行期间设计中信号和端口的翻转率。这有助于识别哪些信号一直没有翻转。
  • FSM coverage:状态机覆盖衡量仿真期间是否所有状态机的状态都被覆盖到。
[358] 如果功能覆盖率接近100%而代码覆盖率不足60%,说明了什么?

仿真器会基于testcase提取代码覆盖率,而功能覆盖率则是用户定义的指标。低代码覆盖率表明并非设计代码的所有部分都经过了测试。高功能覆盖率表明,用户从测试计划中捕获的所有功能都得到了测试。如果覆盖率指标显示低代码覆盖率和高功能覆盖率,原因可能是:

  1. 可能有许多设计代码未按照spec用于实现的功能。(无效的代码)
  2. 用户定义的功能覆盖率量中存在一些错误。测试计划未捕获所有设计功能/场景/边界,或者缺少功能覆盖率监视器。代码覆盖率中未覆盖的设计代码可能会映射到这些功能上。
  3. 在实现功能覆盖率监视器时可能存在潜在的错误,导致它们收集了错误的覆盖率。因此,在验证项目中,对用户定义的功能覆盖率指标及其实现进行适当的检查很重要。
[359] 如果代码覆盖率接近100%而功能覆盖率不足60%,说明了什么?
  1. 没有按照spec在设计中实现了所有功能。因此,设计代码无法实现所有功能
  2. 在功能覆盖率监视器中可能存在潜在的错误,即使设计代码实现了功能,也无法覆盖它们。
  3. 功能正确,但是由于发送的激励不正确,对应的功能覆盖率无法收集。
[360] 覆盖组可以在类内部定义和使用吗??

是的,可以在类内部定义覆盖组。这对于基于测试平台结构(例如事务,序列,检查器,监视器等)实现功能覆盖率非常有用。

本期题目

[361] 什么是covergroups和bins?
[362] 下面的例子中coverpiont cp_a创建了多少个bin?
代码语言:javascript
复制
bit[3:0] var_a; 

covergroup test_cg @(posedge clk); 
    cp_a : coverpoint var_a { 
        bins low_bins[] = {[0:3]}; 
        bins med_bins = {[4:12]}; 
    }
endgroup
[363] ignore bins 和 illegal bins的区别是什么?
[364] 如何用一个coverpoint来覆盖一个翻转行为?
[365] 下面的语句覆盖了什么样的翻转行为?
代码语言:javascript
复制
coverpoint my_variable { 
    bins trans_bin[] = ( a,b,c => x, y);
}

正确答案将在下一期公布,或者到下面的文章获取答案

面试攻略

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 摸鱼范式 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 上期答案
  • 本期题目
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档