SV-路科-V0实验-lab6功能覆盖率

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


学习目标

实现功能覆盖率,从而决定仿真何时结束
在lab5中我们发送了2000次数据,但仍然有一个问题,2000次是否有必要?需要发送多少次数据包才能测试到所有的输入输出端口?因此在本次实验中我们引入功能覆盖率(function coverage)。
lab6中,需要在Scoreboard类中添加功能覆盖率组件。功能覆盖率可以用来衡量tb的测试进度,并且当tb检查到所有的输入输出端口后停止仿真。
在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

任务一:在scoreboard类中创建一个covergroup

首先定义功能覆盖组cover group,覆盖值coverage bins,采样事件update event,和覆盖目标coverage goal。应该给每个输入端和输出端都创建coverage bins。然后,cross 所有输入端和输出端的coverage bins。
1.在Soreboard中添加两个新的类属性变量
bit [3:0] sa,da;
2.在这之后声明一个对cover group(router_cov)的定义
3.在cover group中,根据sa和da来创建coverpoint groups。在两个取样group上创建 cross bins(这个cross coverage是我们在寻找的真正的覆盖率信息)。
4.在new()函数中对覆盖组router_cov创建对象new。
在这里插入图片描述

任务二:修改check()

1.在check()中添加real类型变量coverage_result(这个数据类型必须是实数,因为覆盖率的结果返回的是实数),功能覆盖率将保存在这个变量中。
2.在比较完pkt2send和pkt2cmp两个对象后,立即将sa,da设置为pkt2send里变量的值
3.然后使用router_cov.sample()去触功能覆盖率采样
4.调用$get_coverage()去检索更新的功能覆盖率的值,并保存在coverage_result内
5.修改display语句,将功能覆盖率也打印出来
6.修改条件语句,如果功能覆盖率达到100%也会触发事件DONE。
在这里插入图片描述

在这里插入图片描述

编译仿真

编译

covergroup-endgroup块,少了结束语句
在这里插入图片描述
在这里插入图片描述

仿真

打印语句多了一个%
在这里插入图片描述

不能调用系统函数直接赋值,需要用到赋值语句在这里插入图片描述
在这里插入图片描述

发送1523个数据包使覆盖率达到100%。
在这里插入图片描述

查看覆盖率

在这里插入图片描述
在这里插入图片描述
使用一下仿真命令,并多次仿真,保存覆盖率数据,进行合并数据库
vsim -novopt -i -classdebug -solvefailbebug -coverstore D:/ICsoftware/V0/v0_lab6/my_lab6/data -sv_seed random work.router_test_top
在这里插入图片描述

  • --coverstore COVERAGE_STORAGE_PATH这个命令是将生成的覆盖率数据存储到自定义的路径内,注意路径不要包含中文,路径不是反斜杠
    第一次
    在这里插入图片描述
    第二次
    在这里插入图片描述
    第三次
    在这里插入图片描述
    合并数据
    vcover merge -out merged_coverage.ucdb D:/ICsoftware/V0/v0_lab6/my_lab6/data
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    使用html生成覆盖率报告,Tool->Coverage Report -> HTML
    在这里插入图片描述

Tip

实数的打印格式%f,还可以对显示位数进行限制,如%3.2f,小数点前保留三位,小数点后面保留两位

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SV(SystemVerilog)中,覆盖率(coverage)是用来衡量验证测试的有效性的一种度量指标。它可以帮助验证工程师确定测试是否充分覆盖了设计中的各个功能或语句。 通常情况下,覆盖率是基于特定的覆盖模型来定义的,这个模型描述了设计中需要被覆盖的特定条件或情况。在SV中,你可以使用通配符(wildcard)来进行覆盖率的定义和匹配。 在覆盖模型中,通配符可以用来表示一组可能的取值。例如,你可以使用通配符'?'来匹配一个比特位的任意取值,使用'*'来匹配多个比特位的任意取值。这样,你可以定义一个通配符模式,来捕捉多个情况的覆盖。 下面是一个示例,展示了如何在SV中使用通配符来定义覆盖率: ```systemverilog // 定义一个覆盖模型 covergroup my_covergroup; coverpoint signal_a with wildcard @(posedge clk) { bins wildcard_bin = {1'b?}; } endgroup // 实例化覆盖模型 my_covergroup cg = new(); // 触发覆盖率采样 always @(posedge clk) begin cg.sample(signal_a); end ``` 在上面的示例中,我们定义了一个名为`my_covergroup`的覆盖模型,并在其中使用了通配符`?`来匹配`signal_a`信号的任意取值。当信号`signal_a`在时钟上升沿触发时,我们通过调用`cg.sample(signal_a)`来采样覆盖率。 通过这种方式,你可以灵活地定义和匹配覆盖率条件,以评估测试的覆盖程度是否满足需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值