• UVM 覆盖率


    代码覆盖率

    Statement/Line coverage

    用于衡量在仿真测试期间测试了多少条语句(行)

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    Block coverage

    在begin-end或if else或case语句之间或while循环或for循环之间的一组语句称为块。 块覆盖率衡量的是在仿真过程中是否覆盖了这些类型的块码。 块覆盖范围看起来类似于语句覆盖范围,不同之处在于块覆盖率包含了一组语句

    在下面的的示例代码中,有三个代码块

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    Branch/Decision coverage

    conditional Coverage and Expression coverage

    件覆盖率会检查HDL中的所有布尔表达式,并计算该表达式为真或假的次数。表达式覆盖率检查语句的右侧,统计所有可能组成的真值表的覆盖程度

    以下是包含3个布尔变量的表达式,它们决定了Result变量为true或false
    Result = (A && B) || ©

    在这里插入图片描述

    Toggle coverage

    翻转覆盖率可衡量仿真运行期间设计中信号和端口的翻转率。 这有助于识别哪些信号一直没有翻转

    FSM coverage

    状态机覆盖衡量仿真期间是否所有状态机的状态都被覆盖到


    covergroups coverpoint bins

    • 覆盖点(coverpoint)是用于指定需要收集覆盖率的目标
    • Covergroup可以具有多个覆盖点以覆盖不同的表达式或变量
    • 每个覆盖点还包括一组bin,这些bin是该覆盖点不同采样值
    bit [2:0] a; 
    bit [3:0] b; 
    
    covergroup cg @(posedge clk); 
        cp_a coverpoint a {       //  覆盖点1
            bins values_a = { [0,1,3,5,7 };   // 覆盖点bin1,变量目标值
        } 
        cp_b coverpoint b;  //  覆盖点2,自动生成bin,会检测b是否覆盖到所有的可能性
    endgroup
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    下面的例子中coverpiont cp_a创建了多少个bin?

    // 一共创建了5个仓
    
    bit[3:0] var_a; 
    
    covergroup test_cg @(posedge clk); 
        cp_a : coverpoint var_a { 
            bins low_bins[] = {[0:3]};  // lowbins[]创建了四个bin,对应检查是否覆盖到0,1,2,3
            bins med_bins = {[4:12]}; // med_bins创建里一个仓,检查是否覆盖到4-12之间的值
        }
    endgroup
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    ignore bins 和 illegal bins

    ignore_bins用于指定与覆盖点关联的一组值或者翻转行为,这些值或者翻转行为可以明确从覆盖范围中排除

    // 以下将忽略变量a的所有采样值7和8
    
    coverpoint a { 
        ignore_bins ignore_vals = {7,8};
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    illegal_bins用于指定与覆盖点关联的一组值或者翻转行为,这些值或者翻转行为被标记为非法

    // 以下会将所有1、2、3采样值标记为非法
    
    covergroup cg3; 
        coverpoint b { 
            illegal_bins bad_vals = {1,2,3};
        } 
    endgroup
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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


  • 相关阅读:
    Github每日精选(第73期):Go 的 JSON 解析器gjson
    PoC免写攻略
    金山云:基于 JuiceFS 的 Elasticsearch 温冷热数据管理实践
    【sql】笔记大屏展示数据查询
    fba海运是什么意思?FBA海运费用怎么算?
    针对Office宏病毒的高级检测
    CANOpen之PDO传输
    Python常用标准库(pickle序列化和JSON序列化)
    朝夕光年「红砖」搭建平台架构设计和应用落地
    Allegro如何用list文件抓取器件操作指导
  • 原文地址:https://blog.csdn.net/qq_40456702/article/details/126713868