设为首页 加入收藏

TOP

FPGA设计千兆以太网MAC(3)——数据缓存及位宽转换模块设计与验证(三)
2019-08-24 00:06:49 】 浏览:188
Tags:FPGA 设计 千兆 以太网 MAC 数据 转换 模块 验证
n
80 @(posedge eth_tx_clk) 81 if(dout_vld)begin 82 if(dout_sop)begin 83 dout_buf[0] = dout; 84 j = 1; 85 end 86 else if(dout_eop)begin 87 dout_buf[j] = dout; 88 j = j+1; 89 packet_check; 90 end 91 else begin 92 dout_buf[j] = dout; 93 j = j+1; 94 end 95 end 96 end 97 end 98 99 /***********************************score board******************************************/ 100 integer fid; 101 initial begin 102 fid = $fopen("test.txt"); 103 $fdisplay(fid," Start testing \n"); 104 #SIM_TIM; 105 if(err_flag) 106 $fdisplay(fid,"Check is failed\n"); 107 else 108 $fdisplay(fid,"Check is successful\n"); 109 $fdisplay(fid," Testing is finished \n"); 110 $fclose(fid); 111 $stop; 112 end 113 114 /***********************************子任务******************************************/ 115 //包生成子任务 116 task packet_gen; 117 input [16-1:0] length; 118 input [2-1:0] invalid_byte; 119 integer i; 120 begin 121 len[gen_time] = length; 122 mod[gen_time] = invalid_byte; 123 124 for(i = 1;i<=length;i=i+1)begin 125 if(rdy == 1)begin 126 din_vld = 1; 127 if(i==1) 128 din_sop = 1; 129 else if(i == length)begin 130 din_eop = 1; 131 din_mod = invalid_byte; 132 end 133 else begin 134 din_sop = 0; 135 din_eop = 0; 136 din_mod = 0; 137 end 138 din = i ; 139 end 140 141 else begin 142 din_sop = din_sop; 143 din_eop = din_eop; 144 din_vld = 0; 145 din_mod = din_mod; 146 din = din; 147 i = i - 1; 148 end 149 150 #(USER_CLK_CYC*1); 151 end 152 packet_initial; 153 gen_time = gen_time + 1; 154 end 155 endtask 156 157 task packet_initial; 158 begin 159 din_sop = 0; 160 din_eop = 0; 161 din_vld = 0; 162 din = 0; 163 din_mod = 0; 164 end 165 endtask 166 167 //包检测子任务 168 task packet_check; 169 integer k; 170 integer num,packet_len; 171 begin 172 num = 1; 173 $fdisplay(fid,"%dth:Packet checking...\n",chk_time); 174 packet_len = 4*len[chk_time]-mod[chk_time]; 175 if(j != packet_len)begin 176 $fdisplay(fid,"Length of the packet is wrong.\n"); 177 err_flag = 1; 178 disable packet_check; 179 end 180 181 for(k=0;k<packet_len;k=k+1)begin 182 if(k%4 == 3)begin 183 if(dout_buf[k] != num)begin 184 $fdisplay(fid,"Data of the packet is wrong!\n"); 185 err_flag = 1; 186 end 187 num = num+1; 188 end 189 else if(dout_buf[k] != 0)begin 190 $fdisplay(fid,"Data of the packet is wrong,it should be zero!\n"); 191 err_flag = 1; 192 end 193 end 194 chk_time = chk_time + 1; 195 end 196 endtask 197 198 endmodule tx_buffer_tb

  可见主要是task编写及文件读写操作帮了大忙,如果都用眼睛看波形来验证设计正确性,真的是要搞到眼瞎。为保证测试完备性,测试包生成task可通过输入接口产生不同长度和无效字节数的递增数据包。testbench中每检测到输出包尾指示信号eop即调用packet_check task对数值进行检测。本文的testbench结构较具通用性,可以用来验证任意对数据包进行处理的逻辑单元。

  之前Modelsim独立仿真带有IP核的Vivado工程时经常报错,只好使用Vivado自带的仿真工具。一直很头痛这个问题,这次终于有了进展!首先按照常规流程使用Vivado调用Modelsim进行行为仿真,启动后会在工程目录下产生些有用的文件,帮助我们脱离Vivado进行独立仿真。

  在新建Modelsim工程时,在红框内选择Vivado工程中<project>.sim -> sim_1 -> behav下的modelsim.ini文件。之后添加文件包括:待测试设计文件、testbench以及IP核可综合文件。第三个文件在<project>.srcs -> sources_1 -> ip -> <ip_name> -> synth下。

  现在可以顺利启动仿真了。我们来看下仿真结果:

  文件中信息打印情况:

  从波形和打印信息的结果来看,基本可以证明数据缓存及位宽转换模块逻辑功能无误。为充分验证要进一步给出覆盖率较高的测试数据集,后期通过编写do文

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇基于FPGA的DDS设计(一) 下一篇FPGA驱动VGA显示静态图片

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目