Merged r9433:9527 from features/gr-usrp2 into trunk. Adds usrp2 and gr-usrp2 top...
[debian/gnuradio] / usrp2 / fpga / eth / demo / verilog / tb_demo.v
1 `timescale 1ns / 1ns\r
2 \r
3 module tb_demo;\r
4 \r
5   //-------------------- Instantiate Xilinx glbl module ----------------------\r
6   // - this is needed to get ModelSim to work because e.g. I/O buffer models\r
7   //   refer directly to glbl.GTS and similar signals\r
8 \r
9   wire GSR;\r
10   wire GTS;\r
11   xlnx_glbl glbl( .GSR( GSR ), .GTS( GTS ) );\r
12 \r
13   reg  VLOG_ExitSignal = 0;\r
14   reg  Done = 0;\r
15   reg  Error = 0;\r
16 \r
17   //-------------------------------------------------------------------------\r
18 \r
19   reg        Reset_n;\r
20   reg        Clk_100M;\r
21   reg        Clk_125M;\r
22 \r
23   wire       RS232_TXD;\r
24   wire       RS232_RXD;\r
25 \r
26   wire       USB_TXD;\r
27   wire       USB_RXD;\r
28 \r
29   //--- 10/100/1000BASE-T Ethernet PHY (MII/GMII)\r
30   wire       PHY_RESET_n;\r
31 \r
32   wire       PHY_RXC;\r
33   wire [7:0] PHY_RXD;\r
34   wire       PHY_RXDV;\r
35   wire       PHY_RXER;\r
36 \r
37   wire       PHY_GTX_CLK; // GMII only\r
38   wire       PHY_TXC;\r
39   wire [7:0] PHY_TXD;\r
40   wire       PHY_TXEN;\r
41   wire       PHY_TXER;\r
42 \r
43   wire       PHY_COL = 0;\r
44   wire       PHY_CRS = 0;\r
45 \r
46   wire       PHY_MDC;\r
47   wire       PHY_MDIO;\r
48 \r
49   wire [1:4] LED;\r
50 \r
51   reg [1:4]  Button = 4'b0000;\r
52 \r
53   //-------------------------------------------------------------------------\r
54   // Local declarations\r
55   //-------------------------------------------------------------------------\r
56 \r
57   //-------------------------------------------------------------------------\r
58   // Instantiation of sub-modules\r
59   //-------------------------------------------------------------------------\r
60 \r
61   //--- DUT\r
62 \r
63   demo demo(\r
64     .Reset_n ( Reset_n  ),\r
65     .Clk_100M( Clk_100M ),\r
66     .Clk_125M( Clk_125M ),\r
67 \r
68     .RS232_TXD( RS232_TXD ),\r
69     .RS232_RXD( RS232_RXD ),\r
70 \r
71     .USB_TXD( USB_TXD ),\r
72     .USB_RXD( USB_RXD ),\r
73 \r
74     //--- 10/100/1000BASE-T Ethernet PHY (MII/GMII)\r
75     .PHY_RESET_n( PHY_RESET_n ),\r
76 \r
77     .PHY_RXC ( PHY_RXC  ),\r
78     .PHY_RXD ( PHY_RXD  ),\r
79     .PHY_RXDV( PHY_RXDV ),\r
80     .PHY_RXER( PHY_RXER ),\r
81 \r
82     .PHY_GTX_CLK( PHY_GTX_CLK ), // GMII only\r
83     .PHY_TXC    ( PHY_TXC  ),\r
84     .PHY_TXD    ( PHY_TXD  ),\r
85     .PHY_TXEN   ( PHY_TXEN ),\r
86     .PHY_TXER   ( PHY_TXER ),\r
87 \r
88     .PHY_COL( PHY_COL ),\r
89     .PHY_CRS( PHY_CRS ),\r
90 \r
91     .PHY_MDC ( PHY_MDC  ),\r
92     .PHY_MDIO( PHY_MDIO ),\r
93 \r
94     // Misc. I/Os\r
95     .LED   ( LED    ),\r
96     .Button( Button )\r
97   );\r
98 \r
99   //-------------------------------------------------------------------------\r
100   // MII/GMII Ethernet PHY model\r
101 \r
102   reg [2:0]  Speed = 3'b000;\r
103 \r
104   Phy_sim U_Phy_sim(\r
105     .Gtx_clk( PHY_GTX_CLK ),\r
106     .Rx_clk ( PHY_RXC  ),\r
107     .Tx_clk ( PHY_TXC  ),\r
108     .Tx_er  ( PHY_TXER ),\r
109     .Tx_en  ( PHY_TXEN ),\r
110     .Txd    ( PHY_TXD  ),\r
111     .Rx_er  ( PHY_RXER ),\r
112     .Rx_dv  ( PHY_RXDV ),\r
113     .Rxd    ( PHY_RXD  ),\r
114     .Crs    ( PHY_CRS  ),\r
115     .Col    ( PHY_COL  ),\r
116     .Speed  ( Speed    ),\r
117     .Done   ( Done     )\r
118   );\r
119 \r
120   //-------------------------------------------------------------------------\r
121   // Generate all clocks & reset\r
122   //-------------------------------------------------------------------------\r
123 \r
124   // Core master clock (100 MHz)\r
125   initial \r
126     begin\r
127       #10;\r
128       while ( !Done )\r
129         begin\r
130           #5 Clk_100M = 0;\r
131           #5 Clk_100M = 1;\r
132         end\r
133     end\r
134 \r
135   // GMII master clock (125 MHz)\r
136   initial \r
137     begin\r
138       #10;\r
139       while ( !Done )\r
140         begin\r
141           #4 Clk_125M = 0;\r
142           #4 Clk_125M = 1;\r
143         end\r
144     end\r
145 \r
146   initial\r
147     begin\r
148       Reset_n = 0;\r
149 \r
150       #103;\r
151       Reset_n = 1;\r
152     end\r
153 \r
154   //--- Emulate UART Transmitter --------------------------------------------\r
155 \r
156   parameter    PRESCALER_16X = 3;\r
157   integer      Prescaler;\r
158   integer      TxLen = 0;\r
159   reg [2:0]    TxState;\r
160   integer      TxBit;\r
161   reg [1023:0] TxMsg;\r
162   reg          TXD;\r
163   reg          TxDone;\r
164 \r
165   always @( negedge Reset_n or posedge Clk_100M )\r
166     if ( ~Reset_n )\r
167       begin\r
168         Prescaler <= 0;\r
169         TxState   = 0;\r
170         TXD       = 1;\r
171         TxBit     = 0;\r
172         TxDone    <= 0;\r
173       end\r
174     else\r
175       begin\r
176         TxDone <= 0;\r
177 \r
178         if ( Prescaler == ((PRESCALER_16X + 1)*16 -1) )\r
179           Prescaler <= 0;\r
180         else\r
181           Prescaler <= Prescaler + 1;\r
182 \r
183         if ( Prescaler==0 )\r
184           begin\r
185             casez ( TxState )\r
186               0: // IDLE\r
187                 begin\r
188                   if ( TxLen != 0 )\r
189                     begin // Send start bit!\r
190                       TxBit = (TxLen-1)*8;\r
191                       TxLen = TxLen - 1;\r
192                       TXD = 0;\r
193                       TxState = 1;\r
194                     end\r
195                 end\r
196 \r
197               1: // Send next data bit\r
198                 begin\r
199                   // Send next data bit\r
200                   TXD = TxMsg[ TxBit ];\r
201                   TxBit = TxBit + 1;\r
202                   if ( (TxBit % 8)==0 )\r
203                     // Next send two stop bits\r
204                     TxState = 2;\r
205                 end\r
206 \r
207               2: // First of two stop bits\r
208                 begin\r
209                   TXD = 1;\r
210                   TxState = 3;\r
211                 end\r
212 \r
213               3: // Second of two stop bits\r
214                 begin\r
215                   TXD = 1;\r
216                   TxState = 0;\r
217                   if ( TxLen == 0 )\r
218                     // Done with transmission!\r
219                     TxDone <= 1;\r
220                 end\r
221             endcase\r
222           end\r
223       end\r
224 \r
225   assign RS232_RXD = TXD;\r
226   assign USB_RXD = 1;\r
227 \r
228   //--- Send commands to the DUT --------------------------------------------\r
229 \r
230   initial\r
231     begin\r
232       #10;\r
233       while ( ~Reset_n ) #10;\r
234 \r
235       // Wait a couple of clock edges before continuing to allow\r
236       // internal logic to get out of reset\r
237       repeat ( 5 )\r
238         @( posedge Clk_100M );\r
239 \r
240       // Wait for the "READY" message to complete transmission\r
241       #60000;\r
242 \r
243       // Select 100 Mbps\r
244       Speed = 3'b010;\r
245       TxMsg = "W 0022 0002 ";\r
246       TxLen = 12;\r
247       while ( ~TxDone )\r
248         @( posedge Clk_100M );\r
249 \r
250       #50000;\r
251 \r
252       TxMsg = "W 8000 8003 ";\r
253       TxLen = 12;\r
254       while ( ~TxDone )\r
255         @( posedge Clk_100M );\r
256 \r
257       #50000;\r
258 \r
259       TxMsg = "W 8001 0011 ";\r
260       TxLen = 12;\r
261       while ( ~TxDone )\r
262         @( posedge Clk_100M );\r
263 \r
264       #50000;\r
265 \r
266       TxMsg = "W 8002 1234 ";\r
267       TxLen = 12;\r
268       while ( ~TxDone )\r
269         @( posedge Clk_100M );\r
270 \r
271       #50000;\r
272 \r
273       TxMsg = "W 8003 5678 ";\r
274       TxLen = 12;\r
275       while ( ~TxDone )\r
276         @( posedge Clk_100M );\r
277 \r
278       #50000;\r
279 \r
280       TxMsg = "W 8004 9ABC ";\r
281       TxLen = 12;\r
282       while ( ~TxDone )\r
283         @( posedge Clk_100M );\r
284 \r
285       #50000;\r
286 \r
287       TxMsg = "W 8005 DEF0 ";\r
288       TxLen = 12;\r
289       while ( ~TxDone )\r
290         @( posedge Clk_100M );\r
291 \r
292       #50000;\r
293 \r
294       TxMsg = "W 8006 C5C0 ";\r
295       TxLen = 12;\r
296       while ( ~TxDone )\r
297         @( posedge Clk_100M );\r
298 \r
299       #50000;\r
300 \r
301       TxMsg = "W 8007 BABE ";\r
302       TxLen = 12;\r
303       while ( ~TxDone )\r
304         @( posedge Clk_100M );\r
305 \r
306       #50000;\r
307 \r
308       TxMsg = "R 8006 ";\r
309       TxLen = 7;\r
310       while ( ~TxDone )\r
311         @( posedge Clk_100M );\r
312 \r
313       #50000;\r
314 \r
315       // Enable PG!\r
316       TxMsg = "W 1000 0001 ";\r
317       TxLen = 12;\r
318       while ( ~TxDone )\r
319         @( posedge Clk_100M );\r
320 \r
321       #50000;\r
322 \r
323       // Read back that PG has been enabled!\r
324       TxMsg = "R 1000 ";\r
325       TxLen = 7;\r
326       while ( ~TxDone )\r
327         @( posedge Clk_100M );\r
328 \r
329       #50000;\r
330 \r
331       #50000;\r
332 \r
333       Done = 1; #10;\r
334 \r
335       $stop;\r
336     end\r
337 \r
338   //--- Directly accesses a register on the internal Wishbone bus, bypassing the UART interface\r
339 \r
340   task WrReg;\r
341     input [15:0] Reg;\r
342     input [15:0] Data;\r
343 \r
344     begin\r
345     end\r
346   endtask\r
347 \r
348 endmodule\r