【System Verilog】功能覆盖率

一、基本类型:

  1. 使用方式:covergroup定义在class、program、module中,需要实例化
  2. 基本组成:
    1. covergroup:覆盖组,可以包含一个或多个覆盖点,可以有入参,端口类型只能为input或者ref
    2. coverpoint:覆盖点,可以为整型变量也可以是表达式,包括一组容器;用{}围起来,大括号末尾不需要带分号
    3. bins:容器,定义特定值的跳变顺序;声明语句,用{}围起来,以分号分隔不同仓
      1. 如果未定义bin,则会按照对应的规则自动生成一组容器
        • 枚举类型:每个枚举成员产生一个容器
        • 其他类型:自动生成N个容器,N=min(所有可能值的数目,auto_bin_max)
      2. bins:自定义结构覆盖点容器
        • bins adrbin1 = {[0:3]};1个bin, 相当于覆盖了(addr == 0 ||addr == 1 ||addr == 2 ||addr == 3 ||),只要覆盖了0~3其中的一个,这个coverpoint覆盖率就是100%
        • bins adrbin2[]={[4:5]};4、5分别创建一个bins,只有4和5全部覆盖,这个coverpoint的覆盖率才是100%
        • bins adr[] = {[31:$]};对于一个8bit addr变量,意味着显式地收集{[31:255]}
        • ignore_bins:用于忽略指定的值或跳变的顺序,不对其进行覆盖检查
        • illegal_bins:用于指定一组值或跳变顺序,为非法
        • bins之间可以使用逻辑操作符&&和||
      3. 枚举类型创建仓
        typedef enum {INIT,DECODE,IDLE} fsmstate_e;
        fsmstate_e pstate;
        covergroup cg_fsm;
            coverpoint pstate;
        endgroup
        
  3. 类型:
    1. 条件覆盖率: iff
      covergroup CoverPort
          coverpoint port iff (!bud_if.reset); //当reset==1时不收集覆盖率数据
      endgroup
    2. 翻转覆盖率:=>,支持多重、任意长度的序列定义和序列转移
      1. value1=>value2
      2. value1=>value2=>value3
      3. rang_list1=>rang_list2(如:1,2=>3,4)
    3. 交叉覆盖率:cross,两个或以上的coverpoint或变量之间的cross。若想使用表达式、层次化的名字或对象中的变量,需先对coverpoint里的表达式使用标号,然后将标号用在cross语句里
      1. 隐式定义coverpoint:变量的cross
        class Transaction;
            rand bit[3:0]kind;
            rand bit[2:0]port;
        endcalss
        
        Transaction tr;
        
        covergroup CovPort;
            kind: coverpoint tr.kind;
            port: coverpoint tr.port;
            cross kind,port;
        endgroup
      2. 显示定义coverpoint:表达式的cross
        covergroup CovPortKind;
            port: coverpoint tr.port
                  {bins port[]={[0:$]}};
            kind: coverpoint tr.kind
                  {bins zero={0};
                   bins lo={[1:3]};
                   bins hi[]={[8:$]};
                   bins misc=default;
                  };
            cross kind,port;
        endgroup
    4. 指定覆盖仓:
      1. binsof(x):可用于指定仓,可以使用&&和||
        class Transaction;  
            rand bit a, b;  
        endclass  
          
        covergroup CrossBinNames {  
            a: coverpoint tr.a {  
                bins a0 = {0};  
                bins a1 = {1};  
                option.weight = 0; // 不用计算此点的覆盖率  
            }  
          
            b: coverpoint tr.b {  
                bins b0 = {0};  
                bins b1 = {1};  
                option.weight = 0; // 不用计算此点的覆盖率  
            }  
          
            ab: cross a, b {  
                bins a0b0 = binsof(a.a0) && binsof(b.b0);  
                bins a1b0 = binsof(a.a1) && binsof(b.b0);  
                bins a0b1 = binsof(a.a0) && binsof(b.b1);  
            }  
        }  
        endgroup
      2. binsof(x)intersect{y}:表示x或x的bins取值和y取交集后的取值,x可以是coverpoint、变量、或者coverpoint的bin;y是一个值,一个值的范围或者是一个开放的取值范围
      3. !binsof(x)intersect{y}:表示x或x的bins取值和y不交集的取值,x可以是coverpoint、变量、或者coverpoint的bin;y是一个值,一个值的范围或者是一个开放的取值范围
        class Transaction;  
            rand bit a, b;  
        endclass  
          
        covergroup CrossBinsofIntersect {  
            a: coverpoint tr.a {  
                option.weight = 0; // 不计算此点的覆盖率  
            }  
            b: coverpoint tr.b {  
                option.weight = 0; // 不计算此点的覆盖率  
            }  
            ab: cross a, b {  
                bins a0b0 = binsof(a) intersect {0} && binsof(b) intersect {0}; // a和b均为0的交集  
                bins a1b0 = binsof(a) intersect {1} && binsof(b) intersect {0}; // a为1,b为0的交集  
                bins b1   = binsof(b) intersect {1}; // 仅b为1的交集(a可以是任意值)  
            }  
        }  
        endgroup

二、语法: 

  1. 序列重复:
    1. trans_item[*n]:连续重复n次
      (0=>1=>1=>1=>2)等价于(0=>1[*3]=>2)
      1[*3:5] //对1进行3/4/5次重复
    2. trans_item[->n]:非连续重复n次
  2. 开放取值范围:
    1. [ $ : value ] => The set of values less than or equal to value
    2. [ value : $ ] => The set of values greater or equal to value
  3. 通配符:使用wildcard关键字创建多个状态或翻转,表达式中的x,z或?都会被当成0/1的通配符
    bit[2:0] port;
    covergroup CoverPort;
        coverpoint port{
            wildcard bins even={3'b?? 0};
            wildcard bins even={3'b?? 1};
        }
    endgroup
  4. 覆盖率选项:(covergroup内调用)
    选项说明适用范围
    option.weight=number计算覆盖率时所在covergroup或coverpoint或cross的权重。常用于在不关心的coverpoint种的weight设置为0all
    option.at_least=number表示每个bin最少被采样多少次才算入命中all
    option.goal=number覆盖率目标all
    option.auto_bin_max=number自动产生bins的最大数量all
    option.cross_num_print_missing=number打印所有仓,number为最大报告仓数covergroup
    option.per_instance=boolean1表示例化多份时,每一个实例一个覆盖率;0表示覆盖率合并covergroup
    option.comment=string注释,若一个covergroup例化多份,可在例化时通过参数传入不同的commentcovergroup
  5. 常用函数和方法:(covergroup外,实例化调用)
    covergroup方法作用
    sample()采样
    start()开始覆盖率的收集
    stop()关闭覆盖率的收集
    get_coverage()

    获取所有覆盖率组的覆盖率,返回一个从0到100的实数(该方法可带参数)

    get_inst_coverage()获取单个实例的覆盖率,需要用option指定(该方法可带参数)
    $set_coverage_db_name ( name )设置的覆盖率数据库文件名,在仿真结束后,用于保存覆盖率信息
    $load_coverage_db ( name )从给定的文件名加载所有覆盖率组类型积累的覆盖率信息
    set_inst_name(string)设置covergroup的名称
### 回答1: Vivado是Xilinx公司推出的一款基于FPGA器件的设计开发工具,其中包含System Verilog语言支持。System Verilog是一种基于Verilog的高级硬件描述语言,是IEEE标准的一部分。System Verilog支持面向对象编程思想和高级验证方法,可以大大提高设计的开发效率和可靠性。 在Vivado中使用System Verilog,可以在设计中使用高级特性,如多态和继承等,以更好地组织和维护设计代码。此外,System Verilog还提供了一系列高级验证函数和类,可以有效地进行设计验证和测试。 Vivado系统还提供了一套完整的开发工具和设计流程,可以帮助开发人员快速完成设计和仿真,以及进行综合和实现。总之,Vivado System Verilog提供了强大的设计和验证功能,是FPGA设计中无可替代的一部分。 ### 回答2: Vivado System Verilog 是一种硬件描述语言,可以用于设计和验证数字电路和系统。它是在 SystemVerilog 标准的基础上开发的,广泛应用于 FPGA 和 ASIC 的设计和仿真。Vivado 是一种集成开发环境 (IDE),可用于创建、调试和部署设计。Vivado System Verilog 的特点是具备高层次建模能力和强大的验证功能,包括时序仿真、行为仿真、代码覆盖率、函数覆盖率、分支覆盖率等。Vivado System Verilog 还支持多种验证方法,如模糊测试、约束随机测试、函数测试等,方便用户进行全面的验证和测试。在 FPGA 和 ASIC 的设计中,Vivado System Verilog 可以帮助设计师编写高效且可靠的代码,提高设计的质量和性能。 ### 回答3: Vivado System Verilog是一种硬件描述语言(HDL),它用于设计数字逻辑电路和系统。它是Vivado开发环境中支持的一种编程语言,它集成了Verilog和System Verilog功能,具有更丰富的特性和更高的灵活性。 Vivado System Verilog可以在设计数字逻辑电路时实现更高级的功能和操作。例如,它提供了许多新的操作符和关键字,例如逻辑循环(logic loop)和连续赋值(continuous assignment),这可以简化代码的编写。此外,它还拥有更好且更可靠的类型系统,例如枚举、结构体和联合体等。这些类型可用于定义信号和端口,以及描述具体的结构和组织。 在Vivado System Verilog中,可以使用逻辑门、寄存器、时序逻辑、状态机和FPGA的高级功能等来进行电路设计。该语言还支持仿真和验证,可以使用Testbench测试电路以确保其正确性。 此外,使用一些高级技术,如异步复位、分层次设计(hierarchical design)、断言(assertions)和SystemVerilog任务(SystemVerilog Tasks),可以更好地进行电路设计,这些技术都是在Vivado System Verilog中实现的。 总之,Vivado System Verilog是一个用于数字逻辑设计的高级编程语言,提供了更好的功能和更高的灵活性。它可以让开发者更好地设计和测试电路,从而更加优化电路逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值