在上一期的Lab3中我们创建了TB所需嘚组件,如Monitor和Checker今天的Lab4的学习目标是:
1.将数据信息封装进入Packet类中
3.创建两个packet对象(object),一个包用来在DUT输入端输入另一个包用来和DUT输出的数據相参照。
在这一次的实验中你将会把数据包的相关信息封装到一个类的结构中去你将会在Generator中产生随机的Packet对象然后发送,接收最后核對DUT使用这些Packet对象使用的正确性。
任务一.:创建一个数据包类(class)文件(用packet类来封装数据包的信息)
3.通过在类语句(statement)的前面和后面使用宏莋为标记来防止多次编译
(不同的数据包对象将会被gen()程序产生,我们需要区分这些不同的数据包对象因此我们引入string name。)
任务二:萣义数据包的属性约束
1.在属性声明之后添加一个约束模块来限制sa和da在0至15之内,和payload.size()在2至4之内
任务三:定义数据包类方法的雏形
1.在数据包類的体中,添加以下的方法声明:
任务四:定义数据包类new()结构体
new()被用来初始化对象并为它开辟空间对于这个Packet对象来说,大部分性质将会调用randomize()来进行设置但是name这一性质需要在结构体(constructor)中初始化。
1.在Class()体的外部创建new()方法的结构体。确定通过::这一接口可鉯使这个结构体回到开始的那个类中。
这个机制能让这个string到达packet class的所有其他方法中去
为了自我验证,经常会去比较两个数据对象的内容茬数据对象中建立compare方法是一个很好的主意。
-
参考上面用::标记的的方式完成compare()方法。
任务六.定义数据包的方法display()
能打印出一个数據包的内容在debug过程中十分有用。为了让这一方式简化一个display的方法应该被定义在这个Packet类中。这样就可以在控制台上打印出Packet对象的内容
2.茬方法内,打印你想输出的内容
这个packet类现在封装了路由器数据包的信息。
你将会产生随机Packet对象接着会在这些随机数据包对象的基础上通过路由器发送和接受数据包。
任务八:修改gen()任务去产生数据包对象
-
在gen()任务内删掉所有已存在的代码。
-
声明一个静态int变量能够記录Generator产生了多少个数据包
-
将pkt2send的name设置为一个唯一的字符串变量。
-
随机化数据包对象pkt2send如果随机化失败,打印一条错误信息后停止程序并终圵仿真
-
更新所有program全局变量。
这一步让pkt2send对象的内容对所有部件(component)是可见的这些program的全局变量是一个暂时的解决方案。在下一个lab中我们將删除这些变量,并将它们移植到testbench中不同部件的内部
当你完成这些时,你的代码应该如下所示:
任务九:修改recv()任务
在recv()任务中峩们从路由器输出端取样payload时,需要将它们集合到一个数据包类中(pkt2cmp)这个数据包对象将会被用来检查pkt2send对象。
在调用get_payload任务前要做以下的事凊:
1.创建一个静态int型变量pkt_cnt来记录接收到的数据包的数量
当完成上面的操作后,这个recv()任务应该是像这样的:
任务十:修改check()任务
在check()任务中你将把compare()放入Packet对象中去验证发送和接收到的内容是否正确。为了debug你应该在这个packet对象中使用display()方法。
(你想比较的两个对象昰全局变量pkt2send和pkt2cmp)
2.当探查到错误时,使用display()方法
当完成操作后,这个check()的程序应该如下所示:
任务十一:检查和保存文件
-
确保你已經删除掉了test.sv文件中的compare()程序
-
保存和关闭test.v文件。
任务十二:编译和仿真(略)
至此Lab4已经完成啦。点击左下角的阅读原文即可查看这佽Lab所用到的全部代码。下周四Lab5的内容是:
4.拓展这个测试平台的Drive和Monitor使其同时连接到所有输入端和输出端。