updated wiki url
[debian/gnuradio] / usrp2 / fpga / simple_gemac / simple_gemac_wrapper_tb.v
1
2
3 module simple_gemac_wrapper_tb;
4 `include "eth_tasks_f36.v"
5      
6    reg reset   = 1;
7    initial #1000 reset = 0;
8    wire wb_rst  = reset;
9
10    reg eth_clk     = 0;
11    always #50 eth_clk = ~eth_clk;
12
13    reg wb_clk   = 0;
14    always #173 wb_clk = ~wb_clk;
15
16    reg sys_clk  = 0;
17    always #77 sys_clk = ~ sys_clk;
18    
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;
21
22    wire rx_valid, rx_error, rx_ack;
23    wire tx_ack, tx_valid, tx_error;
24    
25    wire [7:0] rx_data, tx_data;
26    
27    reg [15:0] pause_time;
28    reg pause_req      = 0;
29
30    wire GMII_RX_CLK   = GMII_GTX_CLK;
31
32    reg [7:0] FORCE_DAT_ERR = 0;
33    reg FORCE_ERR = 0;
34    
35    // Loopback
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;
39
40
41    wire [31:0] wb_dat_o;
42    reg [31:0]  wb_dat_i;
43    reg [7:0]   wb_adr;
44    reg         wb_stb=0, wb_cyc=0, wb_we=0;
45    wire        wb_ack;
46
47    reg [35:0]  tx_f36_data=0;
48    reg         tx_f36_src_rdy = 0;
49    wire        tx_f36_dst_rdy;
50    wire        rx_f36_data;
51    wire        rx_f36_src_rdy;
52    wire        rx_f36_dst_rdy = 1;
53    
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),
61
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),
64
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),
67
68       .mdio(), .mdc(),
69       .debug() );
70    
71    initial $dumpfile("simple_gemac_wrapper_tb.vcd");
72    initial $dumpvars(0,simple_gemac_wrapper_tb);
73
74    integer i; 
75    reg [7:0] pkt_rom[0:65535];
76    reg [1023:0] ROMFile;
77    
78    initial
79      for (i=0;i<65536;i=i+1)
80        pkt_rom[i] <= 8'h0;
81
82    initial
83      begin
84         @(negedge reset);
85         repeat (10)
86           @(posedge wb_clk);
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);
92         
93         @(posedge eth_clk);
94         SendFlowCtrl(16'h0007);  // Send flow control
95         @(posedge eth_clk);
96         #30000;
97         @(posedge eth_clk);
98         SendFlowCtrl(16'h0009);  // Increase flow control before it expires
99         #10000;
100         @(posedge eth_clk);
101         SendFlowCtrl(16'h0000);  // Cancel flow control before it expires
102         @(posedge eth_clk); 
103
104         repeat (1000)
105           @(posedge sys_clk);
106         SendPacket_to_fifo36(32'hA0B0C0D0,10);    // This packet gets dropped by the filters
107         repeat (1000)
108           @(posedge sys_clk);
109
110         SendPacket_to_fifo36(32'hAABBCCDD,100);    // This packet gets dropped by the filters
111         repeat (10)
112           @(posedge sys_clk);
113 /*
114         SendPacketFromFile_f36(60,0,0);  // The rest are valid packets
115         repeat (10)
116           @(posedge clk);
117
118         SendPacketFromFile_f36(61,0,0);
119         repeat (10)
120           @(posedge clk);
121         SendPacketFromFile_f36(62,0,0);
122         repeat (10)
123           @(posedge clk);
124         SendPacketFromFile_f36(63,0,0);
125         repeat (1)
126           @(posedge clk);
127         SendPacketFromFile_f36(64,0,0);
128         repeat (10)
129           @(posedge clk);
130         SendPacketFromFile_f36(59,0,0);
131         repeat (1)
132           @(posedge clk);
133         SendPacketFromFile_f36(58,0,0);
134         repeat (1)
135           @(posedge clk);
136         SendPacketFromFile_f36(100,0,0);
137         repeat (1)
138           @(posedge clk);
139         SendPacketFromFile_f36(200,150,30);  // waiting 14 empties the fifo, 15 underruns
140         repeat (1)
141           @(posedge clk);
142         SendPacketFromFile_f36(100,0,30);
143  */
144         #100000 $finish;
145      end
146
147    // Force a CRC error
148     initial
149      begin
150         #90000;
151         @(posedge eth_clk);
152         FORCE_DAT_ERR <= 8'h10;
153         @(posedge eth_clk);
154         FORCE_DAT_ERR <= 8'h00;
155      end
156
157    // Force an RX_ER error (i.e. link loss)
158    initial
159      begin
160         #116000;
161         @(posedge eth_clk);
162         FORCE_ERR <= 1;
163         @(posedge eth_clk);
164         FORCE_ERR <= 0;
165      end
166 /*
167    // Cause receive fifo to fill, causing an RX overrun
168    initial
169      begin
170         #126000;
171         @(posedge clk);
172         rx_ll_dst_rdy2 <= 0;
173         repeat (30)          // Repeat of 14 fills the shortfifo, but works.  15 overflows
174           @(posedge clk);
175         rx_ll_dst_rdy2 <= 1;
176      end
177   */
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
180
181    task WishboneWR;
182       input [7:0] adr;
183       input [31:0] value;
184       begin
185          wb_adr   <= adr;
186          wb_dat_i <= value;
187          wb_stb   <= 1;
188          wb_cyc   <= 1;
189          wb_we    <= 1;
190          while (~wb_ack)
191            @(posedge wb_clk);
192          @(posedge wb_clk);
193          wb_stb <= 0;
194          wb_cyc <= 0;
195          wb_we  <= 0;
196       end
197    endtask // WishboneWR
198    /*
199    always @(posedge clk)
200      if(rx_ll_src_rdy2 & rx_ll_dst_rdy2)
201        begin
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);
207        end
208    */
209 endmodule // simple_gemac_wrapper_tb