前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[十九]Cracking Digital VLSI Verification Interview

[十九]Cracking Digital VLSI Verification Interview

作者头像
空白的贝塔
发布2020-07-01 16:25:24
1.7K0
发布2020-07-01 16:25:24
举报
文章被收录于专栏:摸鱼范式摸鱼范式

[361] 什么是covergroups和bins?

覆盖点(coverpoint)是用于指定需要收集覆盖率的目标。Covergroup可以具有多个覆盖点以覆盖不同的表达式或变量。每个覆盖点还包括一组bin,这些bin是该覆盖点不同采样值。bin可以由用户定义,也可以缺省自动创建。在下面的示例中,有两个变量a和b,covergroup有两个coverpoint,他们会检查a和b的值。Coverpoint cp_a是用户定义的,bins values_a检测a是否覆盖到特定的值。Coverpoint cp_b是自动的,bin是自动生成的,会检测b是否覆盖到所有的可能性

代码语言:javascript
复制
bit [2:0] a;
bit [3:0] b;

covergroup cg @(posedge clk);
    cp_a coverpoint a {
        bins values_a = { [0,1,3,5,7 };
    }
    cp_b coverpoint b;
endgroup
[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

lowbins[]创建了四个bin,对应检查是否覆盖到0,1,2,3,med_bins创建里一个仓,检查是否覆盖到4-12之间的值。因此,一共创建了5个仓

[363] ignore bins 和 illegal bins的区别是什么?

ignore_bins用于指定与覆盖点关联的一组值或者翻转行为,这些值或者翻转行为可以明确从覆盖范围中排除。例如,以下将忽略变量a的所有采样值7和8。

代码语言:javascript
复制
coverpoint a {
    ignore_bins ignore_vals = {7,8};
}

illegal_bins用于指定与覆盖点关联的一组值或者翻转行为,这些值或者翻转行为被标记为非法。例如,以下会将所有1、2、3采样值标记为非法。

代码语言:javascript
复制
covergroup cg3;
    coverpoint b {
        illegal_bins bad_vals = {1,2,3};
    }
endgroup

当采样到illegal_bins时,仿真会报错,并且illegal_bins的优先级高于其他bin,即使其他bin和illegal_bins的范围有重叠,也会导致报错。

[364] 如何编译一个coverpoint来覆盖一个翻转行为?

翻转覆盖率指定为“ value1 => value2”,其中value1和value2是在两个连续采样点上的表达式的采样值。例如,在coverpoint之下,在clk的三个连续正边缘中寻找变量v_a的值4、5和6的翻转行为。

代码语言:javascript
复制
covergroup cg @(posedge clk);
    coverpoint v_a {
        bins sa = (4 => 5 => 6),
    }
endgroup
[365] 下面的语句覆盖了什么样的翻转行为?
代码语言:javascript
复制
coverpoint my_variable {
    bins trans_bin[] = ( a,b,c => x, y);
}

a=>x, a=>y, b=>x, b=>y, c=>x, c=>y

[366] 下面的bin覆盖了哪些范围?
代码语言:javascript
复制
covergroup test_cg @(posedge clk);
    coverpoint var_a {
        bin hit_bin = { 3[*4]};
    }
endgroup

[* N]指的是连续的重复操作。因此,上面的bin覆盖的是连续4次采样都是3的翻转覆盖率

[367] 什么是wildcard bins?

wildcard bins可以让bin在定义时使用x、z和?作为0或者1的通配符。下面的例子中,并不关心低两位是多少,只要高两位为11就在覆盖范围内。

代码语言:javascript
复制
coverpoint a[3:0] {
    wildcard bins bin_12_to_15 = { 4'b11?? };
}
[368] 什么是cross coverage?何时使用它?

coverage可以指定两个或多个coverpoint或变量之间的cross coverage。cross coverage使用cross进行指定的。交叉覆盖率的仓数,等于交叉目标仓数的乘积,因为要覆盖到两者的所有可能组合。

代码语言:javascript
复制
bit [31:0] a_var;
bit [3:0] b_var;
covergroup cov3 @(posedge clk);
    cp_a: coverpoint a_var {
        bins yy[] = { [0:9] };
    }
    cp_b: coverpoint b_var;
    cc_a_b : cross cp_b, cp_a;
endgroup

cp_a有10个bin,cp_b有16个bin,因此cc_a_b有160个bin。

交叉覆盖率通常用于不同功能或者事件同时发生的情况,去验证这些事件是否同时发生了。

[369] 下面的交叉覆盖率有多少个bin?
代码语言:javascript
复制
bit[1:0] cmd;
bit[3:0] sub_cmd;

covergroup abc_cg @(posedge clk);
    a_cp: coverpoint cmd;
    cmd_x_sub: cross cmd, sub_cmd;
endgroup

cmd和sub_cmd都是二值变量,a_cp有4个bin,sub_cmd默认有16个bin,因此,交叉覆盖率具有64个bin。

[370] 下面的覆盖率代码有什么错误?
代码语言:javascript
复制
int var_a;
covergroup test_cg @(posedge clk);
    cp_a: coverpoint var_a {
        bins low = {0,1};
        bins other[] = default;
    }
endgroup

代码对int类型进行覆盖率收集,low的bin数为2,而通过default所创建的数量为

2^{32}-2

个,数量十分巨大,这会导致仿真器崩溃或者仿真速度下降。应该尽量避免使用default或者不要使用default。

[371] covergroup有几种采样方式?

有两种采样方式

  • 定义covergroup时指定时钟事件,下面是一个例子
代码语言:javascript
复制
covergroup transaction_cg @(posedge clk)
    coverpoint req_type;
endgroup
  • 显式地调用sample()方法
代码语言:javascript
复制
class packet;
    byte[4] dest_addr;
    byte[4] src_addr;
    
    covergroup pkt_cg;
        coverpoint dest_addr;
    endgroup
    
    function new();
        pkt_cg =new();
    endfunction;
endclass

module test;
    initial begin
        packet pkt =new();
        pkt.pkt_cg.sample();
    end 
endmodule
[372] 如何给covergroup传递参数,何时用它?

像定义方法一样,covergroup也可以通过类似的语法进行参数传递,主要使用ref,以便随时检测信号的变化。当我们要对多个信号进行相同类型的覆盖率组定义时,我们可以通过定义参数传递的方法改变采样的信号,而覆盖率的定义只需要进行一次即可。下面是一个例子。

代码语言:javascript
复制
module test;
    covergroup xy_cg ( ref int x , ref int y, input string name);
        cp_x: coverpoint x;
        cp_y: coverpoint y;
        cc_x_y: cross cp_x, cp_y;
    endgroup
    
    initial begin 
        xy_cg xy_cg_mod1 = new( top.mod1.x, top.mod1.y, "mod1_cvg");
        xy_cg xy_cg_mod2 = new( top.mod2.x, top.mod2.y, "mod2_cvg");
    end 
    
endmodule
[373] covergroup可以引用DUT中的层次信号吗?

可以

[374] 能够对不同covergroup的coverpoint进行交叉覆盖率定义吗?

不可以,只能对当前covergroup的coverpoint定义交叉覆盖率

[375] per_instance和per_type的区别是什么?如何使用覆盖率选项控制它们?

Covergroup可以实例化多次。如果一个covergroup有多个实例,则默认情况下,SystemVerilog的coverage报告是所有实例的累计coverage。这就是默认的per_type。但是,可以在covergroup中设置一个per_instance选项,那么SystemVerilog将分别报告该Covergroup的每个实例的coverage。

代码语言:javascript
复制
covergroup test_cg @(posedge clk)
    option.per_instance =1;
    coverpoint var_a;
    //and other coverpoints
endgroup

断言

[376] 什么是断言?在验证中使用断言的好处是什么?

断言是根据规范对设计属性的property,用于验证设计的行为。如果在仿真中检查的property未按照规范运行,则断言失败。类似地,如果禁止在设计中发生的行为,而在仿真期间发生了,则断言也会失败。

使用断言的好处有:

  • 断言在错误发生是会立刻捕获,改善了检测错误的能力
  • 断言在设计中能够提供更好的可观察性,因此有助于更轻松地调试
  • 断言既可以用于动态仿真,也可以用于设计的形式验证
  • 断言还可以用于提供对输入激励的功能覆盖,并确保设计属性确实进行了验证。
[377] 有多少种断言?

systemvrilog中有两种断言,立即断言和并发断言

[378] 立即断言和并发断言的区别是什么?

立即断言使用表达式进行评估,并且像在过程块中的语句一样执行。,执行后会立即进行评估。立即断言仅用于动态仿真中。以下是一个简单的立即断言的示例,该断言检查“a和b是否始终相等”:

代码语言:javascript
复制
always_comb begin a_eq_b:
    assert (a==b) else  $error ("A not equal b");
end

并发断言根据所涉及变量的采样值在时钟沿评估测试表达式。它们与其他设计模块同时执行。它们可以放置在模块或接口中。并发断言可以与动态仿真以及静态(形式)验证一起使用。以下是一个并发断言的简单示例,该断言检查“如果c在一个时钟周期内为高,则在下一个周期,a和b的值相等”:

代码语言:javascript
复制
ap_a_eq_b : assert  property((@posedge clk) c |=> (a == b));
[379] 简单立即断言和延迟立即断言之间有什么区别?

延迟断言是立即断言的一种特殊类型。简单立即断言立即求值,而无需等待其组合表达式中的变量稳定下来。因此,当组合表达式逐渐趋于稳定时,简单立即断言很容易出现小故障。这可能导致断言多次触发,其中一些断言可能是错误的。为了避免这种情况,定义了延迟断言,仅在时间戳结束时,组合表达式中的变量稳定下来后,才评估这些断言。这意味着将在时间戳的reactive区域中对它们进行评估。

[380] 与使用过程式SystemVerilog代码编写检查程序相比,使用SVA(SystemVerilog断言)编写checker有什么优势?

最好使用SVA而非程序代码编写某些类型的checker。SVA具备sequence和property规范的丰富构造,这比使用过程代码或编写基于类的检查器更容易。另一个额外的好处是,相同的断言也可以在静态检查工具(如形式验证工具)中使用,也可以用于提供功能覆盖率。

下面是一些推荐使用SVA的例子:

  • 检查内部设计结构,例如FIFO的上溢或下溢。
  • 使用设计中的嵌入式断言可以更轻松地检查模块之间的内部信号和接口
  • 使用时间表达式也可以轻松开发标准接口协议(如PCIE,AMBA,以太网等)的checker。
  • 仲裁,资源匮乏,协议死锁等检查是很多设计中形式验证的检查内容,因此编写断言将有助于它们在静态和动态仿真中同时使用。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • [362] 下面的例子中coverpiont cp_a创建了多少个bin?
  • [363] ignore bins 和 illegal bins的区别是什么?
  • [364] 如何编译一个coverpoint来覆盖一个翻转行为?
  • [365] 下面的语句覆盖了什么样的翻转行为?
  • [366] 下面的bin覆盖了哪些范围?
  • [367] 什么是wildcard bins?
  • [368] 什么是cross coverage?何时使用它?
  • [369] 下面的交叉覆盖率有多少个bin?
  • [370] 下面的覆盖率代码有什么错误?
  • [371] covergroup有几种采样方式?
  • [372] 如何给covergroup传递参数,何时用它?
  • [373] covergroup可以引用DUT中的层次信号吗?
  • [374] 能够对不同covergroup的coverpoint进行交叉覆盖率定义吗?
  • [375] per_instance和per_type的区别是什么?如何使用覆盖率选项控制它们?
  • 断言
    • [376] 什么是断言?在验证中使用断言的好处是什么?
      • [377] 有多少种断言?
        • [378] 立即断言和并发断言的区别是什么?
          • [379] 简单立即断言和延迟立即断言之间有什么区别?
            • [380] 与使用过程式SystemVerilog代码编写检查程序相比,使用SVA(SystemVerilog断言)编写checker有什么优势?
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档