设为首页 加入收藏

TOP

FPGA设计千兆以太网MAC(3)——数据缓存及位宽转换模块设计与验证(二)
2019-08-24 00:06:49 】 浏览:189
Tags:FPGA 设计 千兆 以太网 MAC 数据 转换 模块 验证
egin
124 dout_eop <= 1; 125 end 126 else 127 dout_eop <= 0; 128 end 129 130 131 /******************************FIFO复位逻辑****************************************/ 132 assign rst = !rst_n || rst_flag; 133 134 always @(posedge user_clk or negedge rst_n)begin 135 if(!rst_n)begin 136 rst_flag <= 1; 137 end 138 else if(end_rst_cnt) 139 rst_flag <= 0; 140 end 141 142 always @(posedge user_clk or negedge rst_n) begin 143 if (rst_n==0) begin 144 rst_cnt <= 0; 145 end 146 else if(add_rst_cnt) begin 147 if(end_rst_cnt) 148 rst_cnt <= 0; 149 else 150 rst_cnt <= rst_cnt+1 ; 151 end 152 end 153 assign add_rst_cnt = (rst_flag); 154 assign end_rst_cnt = add_rst_cnt && rst_cnt == (3)-1 ; 155 156 157 158 //FIFO位宽32bit 一帧数据最长1514byte,即379个16bit数据 159 //FIFO深度:379*4 = 1516 需要2048 160 //异步FIFO例化 161 fifo_generator_0 fifo ( 162 .rst(rst), // input wire rst 163 .wr_clk(user_clk), // input wire wr_clk 100MHZ 164 .rd_clk(eth_tx_clk), // input wire rd_clk 125MHZ 165 .din(fifo_din), // input wire [33 : 0] din 166 .wr_en(wr_en), // input wire wr_en 167 .rd_en(rd_en), // input wire rd_en 168 .dout(fifo_dout), // output wire [33 : 0] dout 169 .full(full), // output wire full 170 .empty(empty), // output wire empty 171 .wr_data_count(wr_data_count) // output wire [11 : 0] wr_data_count 172 ); 173 174 endmodule tx_buffer

  接下来是验证部分,也就是本文的重点。以下的testbench包含了最基本的测试思想:发送测试激励给UUT,将UUT输出与黄金参考值进行比较,通过记分牌输出比较结果。

  1 `timescale 1ns / 1ps
  2 
  3 module tx_buffer_tb( );
  4 
  5 parameter USER_CLK_CYC = 10,
  6           ETH_CLK_CYC = 8,
  7           RST_TIM = 3;
  8           
  9 parameter SIM_TIM = 10_000;
 10 
 11 reg user_clk;
 12 reg rst_n;
 13 reg [32-1:0] din;
 14 reg din_vld,din_sop,din_eop;
 15 reg [2-1:0] din_mod;
 16 wire rdy;
 17 reg eth_tx_clk;
 18 wire [8-1:0] dout;
 19 wire dout_sop,dout_eop,dout_vld;
 20 reg [8-1:0] dout_buf [0:1024-1];
 21 reg [16-1:0] len [0:100-1];
 22 reg [2-1:0] mod [0:100-1];
 23 reg err_flag = 0;
 24 
 25 tx_buffer#(.DATA_W(32))//位宽不能改动
 26 dut
 27 (
 28     
 29     //全局信号
 30    .rst_n      (rst_n) ,//保证拉低三个时钟周期,否则FIF可能不会正确复位
 31    .user_clk   (user_clk) ,
 32    .din        (din) ,
 33    .din_vld    (din_vld) ,
 34    .din_sop    (din_sop) ,
 35    .din_eop    (din_eop) ,
 36    .din_mod    (din_mod) ,
 37    .rdy        (rdy) ,
 38    .eth_tx_clk (eth_tx_clk) ,
 39    .dout       (dout) ,
 40    .dout_sop   (dout_sop) ,
 41    .dout_eop   (dout_eop) ,
 42    .dout_vld   (dout_vld) 
 43     );
 44     
 45 /***********************************时钟******************************************/
 46     initial begin
 47         user_clk = 1;
 48         forever #(USER_CLK_CYC/2) user_clk = ~user_clk;
 49     end
 50 
 51     initial begin
 52         eth_tx_clk = 1;
 53         forever #(ETH_CLK_CYC/2) eth_tx_clk = ~eth_tx_clk;
 54     end
 55 /***********************************复位逻辑******************************************/
 56     initial begin
 57         rst_n = 1;
 58         #1;
 59         rst_n = 0;
 60         #(RST_TIM*USER_CLK_CYC);
 61         rst_n = 1;
 62     end
 63     
 64 /***********************************输入激励******************************************/
 65 integer gen_time = 0;
 66     initial begin
 67         #1;
 68         packet_initial;
 69         #(RST_TIM*USER_CLK_CYC);
 70         packet_gen(20,2);
 71         #(USER_CLK_CYC*10);
 72         packet_gen(30,1);
 73     end
 74     
 75 /***********************************输出缓存与检测******************************************/    
 76 integer j = 0;
 77 integer chk_time = 0;
 78     initial begin
 79         forever begi
首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇基于FPGA的DDS设计(一) 下一篇FPGA驱动VGA显示静态图片

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目