-
一、实验内容及目标
1、实验内容:
- 自学《SystemVerilog Testbench Lab Guide》pdf文档,理解掌握相关内容;
- 构造一个从路由器输出端进行取样的监视器(Monitor)。
- 构造一个可以验证路由器输出的比较器(Checker)。
- 运行Driver和Monitor程序,检验Checker能否正确比数。
- 编译(Complie)和仿真(Simulate)这个SV程序。
2、实验目标:
- 拓展la2中的测试平台。
- 用新的测试平台来编译和仿真设计文件。
- 理解每行代码的功能。
- 通过观察波形验证测试代码的功能是否完整。
-
二、实验过程或步骤
任务1:将solution/lab2下的文件拷贝到lab3下
任务2:创建顶层测试环境(Top-Level Test Environment)
- 编辑已存在的test.sv文件。
- 给pkt2cmp_payload[$]序列添加一个全局声明(global-declaration),位宽为8bit(logic[7:0])。
这个序列将会被用来存储来自于DUT的取样数据。
任务3:实现一个监视器(Monitor)
- 声明一个recv() 任务task。
- 在recv()体中调用get_payload()来获取有效负载。
- 声明get_payload()任务。
- 在get_payload()中,删除掉pkt2cmp_payload[$]的内容。
- 继续在get_payload()之中,等待输出端frame信号的下降沿。
- 通过在路由器的输出端口取样来继续完善get_payload()。
- 保持循环直到frame信号被检测到。
- 在循环中,至少8个时钟周期内聚合起一个字节(8bit)的数据。接着将每一个8位数据存储到pkt2cmp_payload[$]序列中去。
- 如果payload没有连成一个byte,就打印错误信息并终止仿真。
任务4:实现比较器(Checker)
这一步是为了发展一个比较器从而去检查路由器的输出。
- 创建一个compare()函数,它可以返回一个bit的值并且可以进行数据比较。
- 在compare()中,比较payload[$]队列(用来参考的数据)和pkt2cmp_payload[$] 队列取样的数据)中存储的数据来验证接收到的payload是否正确。
- 如果payload[$]序列和pkt2cmp_payload[$]队列的长度不匹配的话,设置描述该错误的语句,并返回0值结束该子程序。
- 如果在payload[$]队列和pkt2cmp_payload[$]队列的数据不匹配,设置描述该错误的语句,并返回0值和结束该子程序。(你可以用“==”来直接比较两个序列)。
- 如果在payload[$]队列和pkt2cmp_payload[$]队列中的数据是完全一致的,设置描述比较成功的语句,并返回1值和结束该子程序。
- 创建check()任务。
- 在check()体中,声明一个string(字符串)变量和一个计数器。
- 在check()体内,调用compare