SV-路科-V0实验:lab2-产生并发送数据包

学习目标:

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位的地址的发送。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值