学习目标:
1.拓展lab1中的测试平台,从一个输入端向一个输出端发送数据包。
2,.用心的测试平台编译仿真。
1.队列payload的设置有些问题。$urandom返回的是32bit无符号随机数,但是队列payload定义的是8bit。
任务一:声明全局变量
任务二:创建产生数据包的任务
任务三:创建发送数据的任务
数据的发送一共有三个阶段,分开创建任务,最后在一个任务里调用这三个task
这里数据传送完是valid[sa]拉高。
最后在initial中调用产生数据包和发送数据的任务。
任务四:编译仿真和纠错
编译没有出现较大问题,仿真时出现错误。
重新打开后好了,有点奇怪
波形如下
发送21个数据包
实际上就是执行21次产生和发送数据包的任务,可以使用repeat来实现。为了实现可多次修改的代码,可以将重复次数设置为一个变量。
这里为了简便我试着发送5个数据包,并添加了打印语句
打印结果如下:
打印结果可能有误需要查看波形图进一步检查 :
- 1.发现frame没有在最后一个数据发送前拉高,检查代码或许是.size()少了括号,再次仿真后依旧没有出现frame拉高。
没有指定通道
波形图如下:与打印结果一致
- 2.打印结果可以看到每次发送的数据都会把之前的重复,原因在于队列每次都没有清空,添加payload.delete().
打印结果:
仿真更改种子数观察结果 -sv_seed NUM
1.设置种子数0
vsim -novopt -solvefaildebug -sv_seed 0 work.router_test_top
2.设置种子数随机
vsim -novopt -solvefaildebug -sv_seed random work.router_test_top
1.第一个赋值是将最低位赋值为1-------rtr_io.cb.frame_n <= 1
2.第二个赋值是将所有位赋值为1-------rtr_io.cb.frame_n <= '1
3.第三种赋值方式将指定位赋值为1---------rtr_io.cb.frame_n[sa] <= 1'b1
代码改进:
send_padload::
foreach(payload[index]) begin //使用index索引值的好处在于不需要声明变量
for(int i = 0 ; i < 8 ; i ++) begin
rtr_io.cb.din[sa] <= payload[index][i];
rtr_io.cb.valid_n[sa] <= 1'b0;
rtr_io.cb.frame_n[sa] <= ( i == 7 && index == (payload.size()-1)); //这个赋值语句没看懂
end
end
Question Summary:
1.为什么sa和da是bit类型,而队列payload是logic类型?
2.send()调用以后需要重复10个时钟周期,目的是为了等待数据发送完。那么10个时钟周期是否足够?
3.给队列push_back随机数是32位的无符号数,但是队列定义的是8bit的logic类型。32位放入8位队列会发生什么?
4.addr阶段,为什么frame赋值0是用的是clocking cb索引?(即frame下降沿为什么是在时钟上升沿触发);在循环结尾有一个@(rtr_io.cb)实际上是在等待时钟的上升沿,对应的是addr发送地址,即每次循环都要等待上升沿才能发送地址,1次循环对应的1个上升沿触发1位的地址的发送。