3 module simple_gemac_wrapper_tb;
4 `include "eth_tasks_f36.v"
7 initial #1000 reset = 0;
11 always #50 eth_clk = ~eth_clk;
14 always #173 wb_clk = ~wb_clk;
17 always #77 sys_clk = ~ sys_clk;
19 wire GMII_RX_DV, GMII_RX_ER, GMII_TX_EN, GMII_TX_ER, GMII_GTX_CLK;
20 wire [7:0] GMII_RXD, GMII_TXD;
22 wire rx_valid, rx_error, rx_ack;
23 wire tx_ack, tx_valid, tx_error;
25 wire [7:0] rx_data, tx_data;
27 reg [15:0] pause_time;
30 wire GMII_RX_CLK = GMII_GTX_CLK;
32 reg [7:0] FORCE_DAT_ERR = 0;
36 assign GMII_RX_DV = GMII_TX_EN;
37 assign GMII_RX_ER = GMII_TX_ER | FORCE_ERR;
38 assign GMII_RXD = GMII_TXD ^ FORCE_DAT_ERR;
44 reg wb_stb=0, wb_cyc=0, wb_we=0;
47 reg [35:0] tx_f36_data=0;
48 reg tx_f36_src_rdy = 0;
52 wire rx_f36_dst_rdy = 1;
54 simple_gemac_wrapper simple_gemac_wrapper
55 (.clk125(eth_clk), .reset(reset),
56 .GMII_GTX_CLK(GMII_GTX_CLK), .GMII_TX_EN(GMII_TX_EN),
57 .GMII_TX_ER(GMII_TX_ER), .GMII_TXD(GMII_TXD),
58 .GMII_RX_CLK(GMII_RX_CLK), .GMII_RX_DV(GMII_RX_DV),
59 .GMII_RX_ER(GMII_RX_ER), .GMII_RXD(GMII_RXD),
60 .pause_req(pause_req), .pause_time(pause_time),
62 .sys_clk(sys_clk), .rx_f36_data(rx_f36_data), .rx_f36_src_rdy(rx_f36_src_rdy), .rx_f36_dst_rdy(rx_f36_dst_rdy),
63 .tx_f36_data(tx_f36_data), .tx_f36_src_rdy(tx_f36_src_rdy), .tx_f36_dst_rdy(tx_f36_dst_rdy),
65 .wb_clk(wb_clk), .wb_rst(wb_rst), .wb_stb(wb_stb), .wb_cyc(wb_cyc), .wb_ack(wb_ack), .wb_we(wb_we),
66 .wb_adr(wb_adr), .wb_dat_i(wb_dat_i), .wb_dat_o(wb_dat_o),
71 initial $dumpfile("simple_gemac_wrapper_tb.vcd");
72 initial $dumpvars(0,simple_gemac_wrapper_tb);
75 reg [7:0] pkt_rom[0:65535];
79 for (i=0;i<65536;i=i+1)
87 WishboneWR(0,6'b111101);
88 WishboneWR(4,16'hA0B0);
89 WishboneWR(8,32'hC0D0_A1B1);
90 WishboneWR(12,16'h0000);
91 WishboneWR(16,32'h0000_0000);
94 SendFlowCtrl(16'h0007); // Send flow control
98 SendFlowCtrl(16'h0009); // Increase flow control before it expires
101 SendFlowCtrl(16'h0000); // Cancel flow control before it expires
106 SendPacket_to_fifo36(32'hA0B0C0D0,10); // This packet gets dropped by the filters
110 SendPacket_to_fifo36(32'hAABBCCDD,100); // This packet gets dropped by the filters
114 SendPacketFromFile_f36(60,0,0); // The rest are valid packets
118 SendPacketFromFile_f36(61,0,0);
121 SendPacketFromFile_f36(62,0,0);
124 SendPacketFromFile_f36(63,0,0);
127 SendPacketFromFile_f36(64,0,0);
130 SendPacketFromFile_f36(59,0,0);
133 SendPacketFromFile_f36(58,0,0);
136 SendPacketFromFile_f36(100,0,0);
139 SendPacketFromFile_f36(200,150,30); // waiting 14 empties the fifo, 15 underruns
142 SendPacketFromFile_f36(100,0,30);
152 FORCE_DAT_ERR <= 8'h10;
154 FORCE_DAT_ERR <= 8'h00;
157 // Force an RX_ER error (i.e. link loss)
167 // Cause receive fifo to fill, causing an RX overrun
173 repeat (30) // Repeat of 14 fills the shortfifo, but works. 15 overflows
178 // Tests: Send and recv flow control, send and receive good packets, RX CRC err, RX_ER, RX overrun, TX underrun
179 // Still need to test: CRC errors on Pause Frames, MDIO, wishbone
197 endtask // WishboneWR
199 always @(posedge clk)
200 if(rx_ll_src_rdy2 & rx_ll_dst_rdy2)
202 if(rx_ll_sof2 & ~rx_ll_eof2)
203 $display("RX-PKT-START %d",$time);
204 $display("RX-PKT SOF %d EOF %d ERR%d DAT %x",rx_ll_sof2,rx_ll_eof2,rx_ll_error2,rx_ll_data2);
205 if(rx_ll_eof2 & ~rx_ll_sof2)
206 $display("RX-PKT-END %d",$time);
209 endmodule // simple_gemac_wrapper_tb