| ||
在上一期的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都已经完成啦。点击左下角的阅读原文,即可查看所有要用到的代码。
稍微总结一下,从开始决定翻译要这个SV Lab给大家,到现在全部更完过了快两个月。在这两个月中,西安也从炎炎酷暑变成了秋风萧瑟,但是小编还是一只小菜鸟,说来真是非常惭愧。
刚开始觉得这是路科验证的为数不多的入门系列连载,也是对这个系列充满了期待。然而第一期的有认真准备的先导篇还是扑街了,也为后面的惨淡定下了基调。于是小编的封面和排版也逐渐变得将就,甚至有想过中断去更新一些其它的文章。还好,最终还是把这些都更新完成了,也因此知道了坚持一件反馈度不高的事情后面的艰辛。
而路桑的UVM书在这里已经更新了一年多,平均每周两三篇的量,而且里面的内容也都是很系统性的原创并且难度会高很多。此外路桑又开始准备一套系统而完整的芯片验证课程体系,也每周在西电一上就是四个多小时。不由得越来越佩服路桑的专业和坚持,也希望努力终有回报,路科验证会越来越好。
不多说了,完结撒花!!