路科验证官网:路科验证 - 专注于数字芯片验证的系统思想和前沿工程领域
EETOP路科首页: EETOP - 路科验证 - IC验证培训
****路科首页:**** - 路科验证 - IC验证培训
分享给微电子相关专业新生:微电子新生入坑指南
在上一期的Lab5中,我们将验证平台更为规范化。今天的Lab6的学习目标是:
-
实现功能覆盖率从而可以决定仿真何时结束。
在lab5中我们还遗留了一个问题:究竟发送多少数据包才能测试到所有输入端口和输出端口的连接? 根据我们已有的随机激励代码并不能解决这个问题。你需要引入功能覆盖率(functional coverage)。
在这次的lab中,你将会给scoreboard类中添加功能覆盖组件。这个功能覆盖率可以来衡量你的testbench的测试进度,并且当你的testbench在完全检查到了所有输入端和输出端的连接后终止仿真。
任务一.在scoreboard类中创建一个covergroup
在SV中引入功能覆盖率要做的的第一件事:就是定义coverage group。在coverage group中,coverage bins,update event,timing 和coverage goal 都应该被定义。
应该给每一个输入端和输出端都创建coverage bins。然后,cross 所有输入端和输出端的coverage bins。
1.用编辑器打开Scoreboard.sv文件。
2.添加两个新的类属性。
bit[3:0] sa,da; //functional coverage properties
3.在这两个属性的声明之后,声明一个对cover group(router_cov)的定义。
4.在这个cover group内部
。根据sa和da来创建coverpoint groups。
。在两个取样group上来创建 cross bins(这个cross coverage是我们在寻找的real 覆盖率信息。)
任务二. 修改new()来构建coverage对象
1.在new()的结构体中,构造router_cov。当完成后,covergroup的定义应跟以下一样。
任务三:为了覆盖率修改check()
1.在方法check()中,添加一个新的真实变量 coverage_result(这个数据类型一定是real,因为功能覆盖率的结果是作为真实意义(real values)返回的。)。将会在这个变量中存储跑出的功能覆盖率 (%)。
2.在pkt2send和pkt2Cmp的比较成功之后,设置类变量sa和da来衡量在pkt2send对象中的值。
3.接着,调用router_cov.sample()来触发功能覆盖率bin的更新。
4.调用$get_coverage()来重新获取更新后的功能覆盖率的值,并将他们存储在coverage_result中去。
5.修改$display()中的语句,使其可以打印覆盖率(%)。
6.将if语句修改为:if 覆盖率到达了100%作为event flag来触发DONE的发生。
7.保存和关闭scoreboard.sv文件。
至此,所有Lab都已经完成啦。扫描二维码关注路桑的公众号,即可查看所有要用到的代码。
不多说了,完结撒花!!