OpenCores
URL https://opencores.org/ocsvn/ethmac10g/ethmac10g/trunk

Subversion Repositories ethmac10g

[/] [ethmac10g/] [tags/] [V10/] [bench/] [rxtest.v] - Blame information for rev 74

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 39 fisher5090
/*-------------------------------------------------------------------------------
2
-- $Revision: 1.1.1.1 $ $Date: 2006-05-31 05:59:46 $
3
-- Title      : Demo testbench
4
-- Project    : 10 Gigabit Ethernet MAC
5
-------------------------------------------------------------------------------
6
-- File       : demo_tb.v
7
-------------------------------------------------------------------------------
8
-- Description: This testbench will exercise the ports of the MAC core to
9
--              demonstrate the functionality.
10
-------------------------------------------------------------------------------
11
-- Copyright (c) 2001 Xilinx Inc.
12
-------------------------------------------------------------------------------
13
--
14
-- This testbench performs the following operations on the MAC core:
15
--  - The clock divide register is set for MIIM operation.   */
16
/*  - The clientXGMII port is wired as a loopback, so that transmitted frames
17
--    are then injected into the receiver.
18
--  - Four frames are pushed into the receiver. The first is a minimum
19
--    length frame, the second is slightly longer, the third has an error
20
--    asserted and the fourth is less than minimum length and is padded
21
--    up to the minimum.
22
--  - These frames are then looped back and sent out by the transmitter.
23
--  */
24
 
25
`timescale 1ps / 1ps
26
 
27
 
28
module frame_typ;
29
   // This module abstracts the frame data for simpler manipulation
30
   reg [31:0] data [0:31];
31
   reg [ 3:0] ctrl [0:31];
32
   reg [31:0] crc;
33
   reg               underrun;
34
 
35
`define FRAME_TYP [32*32+32*4+32+1:1]
36
 
37
   reg `FRAME_TYP bits;
38
 
39
   function `FRAME_TYP tobits;
40
      input dummy;
41
      begin
42
         bits = {data[ 0], data[ 1], data[ 2], data[ 3], data[ 4],
43
                 data[ 5], data[ 6], data[ 7], data[ 8], data[ 9],
44
                 data[10], data[11], data[12], data[13], data[14],
45
                 data[15], data[16], data[17], data[18], data[19],
46
                 data[20], data[21], data[22], data[23], data[24],
47
                 data[25], data[26], data[27], data[28], data[29],
48
                 data[30], data[31], ctrl[ 0], ctrl[ 1], ctrl[ 2],
49
                 ctrl[ 3], ctrl[ 4], ctrl[ 5], ctrl[ 6], ctrl[ 7],
50
                 ctrl[ 8], ctrl[ 9], ctrl[10], ctrl[11], ctrl[12],
51
                 ctrl[13], ctrl[14], ctrl[15], ctrl[16], ctrl[17],
52
                 ctrl[18], ctrl[19], ctrl[20], ctrl[21], ctrl[22],
53
                 ctrl[23], ctrl[24], ctrl[25], ctrl[26], ctrl[27],
54
                 ctrl[28], ctrl[29], ctrl[30], ctrl[31], crc, underrun};
55
         tobits = bits;
56
      end
57
   endfunction // tobits
58
 
59
   task frombits;
60
      input `FRAME_TYP frame;
61
      begin
62
         bits = frame;
63
         {data[ 0], data[ 1], data[ 2], data[ 3], data[ 4], data[ 5],
64
          data[ 6], data[ 7], data[ 8], data[ 9], data[10], data[11],
65
          data[12], data[13], data[14], data[15], data[16], data[17],
66
          data[18], data[19], data[20], data[21], data[22], data[23],
67
          data[24], data[25], data[26], data[27], data[28], data[29],
68
          data[30], data[31], ctrl[ 0], ctrl[ 1], ctrl[ 2], ctrl[ 3],
69
          ctrl[ 4], ctrl[ 5], ctrl[ 6], ctrl[ 7], ctrl[ 8], ctrl[ 9],
70
          ctrl[10], ctrl[11], ctrl[12], ctrl[13], ctrl[14], ctrl[15],
71
          ctrl[16], ctrl[17], ctrl[18], ctrl[19], ctrl[20], ctrl[21],
72
          ctrl[22], ctrl[23], ctrl[24], ctrl[25], ctrl[26], ctrl[27],
73
          ctrl[28], ctrl[29], ctrl[30], ctrl[31], crc, underrun} = bits;
74
      end
75
   endtask // frombits
76
 
77
endmodule // frame_typ
78
 
79
 
80
// Address of management configuration register
81
`define CONFIG_MANAGEMENT 9'b101000000
82
// Address of flow control configuration register
83
`define CONFIG_FLOW_CTRL  9'b011000000
84
// addresses of statistics registers
85
`define STATS_TX_OK       9'b000100000
86
`define STATS_TX_UNDERRUN 9'b000100011
87
`define STATS_RX_OK       9'b000000000
88
`define STATS_RX_FCS_ERR  9'b000000001
89
`define MIN_FRAME_DATA_BYTES 60
90
 
91
 
92
module testbench;
93
 
94
   // Frame data....
95
   frame_typ frame0();
96
   frame_typ frame1();
97
   frame_typ frame2();
98
   frame_typ frame3();
99
 
100
   frame_typ tx_stimulus_working_frame();
101
   frame_typ tx_monitor_working_frame();
102
   frame_typ rx_stimulus_working_frame();
103
   frame_typ rx_monitor_working_frame();
104
 
105
  // Store the frame data etc....
106
   initial
107
     begin
108
        // Frame 0...
109
        frame0.data[0]  = 32'h04030201;
110
        frame0.data[1]  = 32'h02020605;
111
        frame0.data[2]  = 32'h06050403;
112
        frame0.data[3]  = 32'h55AA2E00;
113
        frame0.data[4]  = 32'hAA55AA55;
114
        frame0.data[5]  = 32'h55AA55AA;
115
        frame0.data[6]  = 32'hAA55AA55;
116
        frame0.data[7]  = 32'h55AA55AA;
117
        frame0.data[8]  = 32'hAA55AA55;
118
        frame0.data[9]  = 32'h55AA55AA;
119
        frame0.data[10] = 32'hAA55AA55;
120
        frame0.data[11] = 32'h55AA55AA;
121
        frame0.data[12] = 32'hAA55AA55;
122
        frame0.data[13] = 32'h55AA55AA;
123
        frame0.data[14] = 32'hAA55AA55;
124
        frame0.data[15] = 32'h00000000;
125
        frame0.data[16] = 32'h00000000;
126
        frame0.data[17] = 32'h00000000;
127
        frame0.data[18] = 32'h00000000;
128
        frame0.data[19] = 32'h00000000;
129
        frame0.data[20] = 32'h00000000;
130
        frame0.data[21] = 32'h00000000;
131
        frame0.data[22] = 32'h00000000;
132
        frame0.data[23] = 32'h00000000;
133
        frame0.data[24] = 32'h00000000;
134
        frame0.data[25] = 32'h00000000;
135
        frame0.data[26] = 32'h00000000;
136
        frame0.data[27] = 32'h00000000;
137
        frame0.data[28] = 32'h00000000;
138
        frame0.data[29] = 32'h00000000;
139
        frame0.data[30] = 32'h00000000;
140
        frame0.data[31] = 32'h00000000;
141
        frame0.ctrl[0]  = 4'b1111;
142
        frame0.ctrl[1]  = 4'b1111;
143
        frame0.ctrl[2]  = 4'b1111;
144
        frame0.ctrl[3]  = 4'b1111;
145
        frame0.ctrl[4]  = 4'b1111;
146
        frame0.ctrl[5]  = 4'b1111;
147
        frame0.ctrl[6]  = 4'b1111;
148
        frame0.ctrl[7]  = 4'b1111;
149
        frame0.ctrl[8]  = 4'b1111;
150
        frame0.ctrl[9]  = 4'b1111;
151
        frame0.ctrl[10] = 4'b1111;
152
        frame0.ctrl[11] = 4'b1111;
153
        frame0.ctrl[12] = 4'b1111;
154
        frame0.ctrl[13] = 4'b1111;
155
        frame0.ctrl[14] = 4'b1111;
156
        frame0.ctrl[15] = 4'b0000;
157
        frame0.ctrl[16] = 4'b0000;
158
        frame0.ctrl[17] = 4'b0000;
159
        frame0.ctrl[18] = 4'b0000;
160
        frame0.ctrl[19] = 4'b0000;
161
        frame0.ctrl[20] = 4'b0000;
162
        frame0.ctrl[21] = 4'b0000;
163
        frame0.ctrl[22] = 4'b0000;
164
        frame0.ctrl[23] = 4'b0000;
165
        frame0.ctrl[24] = 4'b0000;
166
        frame0.ctrl[25] = 4'b0000;
167
        frame0.ctrl[26] = 4'b0000;
168
        frame0.ctrl[27] = 4'b0000;
169
        frame0.ctrl[28] = 4'b0000;
170
        frame0.ctrl[29] = 4'b0000;
171
        frame0.ctrl[30] = 4'b0000;
172
        frame0.ctrl[31] = 4'b0000;
173
 
174
        frame0.crc = 32'h0D4820F6;
175
 
176
        frame0.underrun = 1'b0;
177
 
178
        // Frame 1
179
        frame1.data[0]  = 32'h03040506;
180
        frame1.data[1]  = 32'h05060102;
181
        frame1.data[2]  = 32'h02020304;
182
        frame1.data[3]  = 32'hEE110080;
183
        frame1.data[4]  = 32'h11EE11EE;
184
        frame1.data[5]  = 32'hEE11EE11;
185
        frame1.data[6]  = 32'h11EE11EE;
186
        frame1.data[7]  = 32'hEE11EE11;
187
        frame1.data[8]  = 32'h11EE11EE;
188
        frame1.data[9]  = 32'hEE11EE11;
189
        frame1.data[10] = 32'h11EE11EE;
190
        frame1.data[11] = 32'hEE11EE11;
191
        frame1.data[12] = 32'h11EE11EE;
192
        frame1.data[13] = 32'hEE11EE11;
193
        frame1.data[14] = 32'h11EE11EE;
194
        frame1.data[15] = 32'hEE11EE11;
195
        frame1.data[16] = 32'h11EE11EE;
196
        frame1.data[17] = 32'hEE11EE11;
197
        frame1.data[18] = 32'h11EE11EE;
198
        frame1.data[19] = 32'hEE11EE11;
199
        frame1.data[20] = 32'h11EE11EE;
200
        frame1.data[21] = 32'h0000EE11;
201
        frame1.data[22] = 32'h00000000;
202
        frame1.data[23] = 32'h00000000;
203
        frame1.data[24] = 32'h00000000;
204
        frame1.data[25] = 32'h00000000;
205
        frame1.data[26] = 32'h00000000;
206
        frame1.data[27] = 32'h00000000;
207
        frame1.data[28] = 32'h00000000;
208
        frame1.data[29] = 32'h00000000;
209
        frame1.data[30] = 32'h00000000;
210
        frame1.data[31] = 32'h00000000;
211
 
212
        frame1.ctrl[0]  = 4'b1111;
213
        frame1.ctrl[1]  = 4'b1111;
214
        frame1.ctrl[2]  = 4'b1111;
215
        frame1.ctrl[3]  = 4'b1111;
216
        frame1.ctrl[4]  = 4'b1111;
217
        frame1.ctrl[5]  = 4'b1111;
218
        frame1.ctrl[6]  = 4'b1111;
219
        frame1.ctrl[7]  = 4'b1111;
220
        frame1.ctrl[8]  = 4'b1111;
221
        frame1.ctrl[9]  = 4'b1111;
222
        frame1.ctrl[10] = 4'b1111;
223
        frame1.ctrl[11] = 4'b1111;
224
        frame1.ctrl[12] = 4'b1111;
225
        frame1.ctrl[13] = 4'b1111;
226
        frame1.ctrl[14] = 4'b1111;
227
        frame1.ctrl[15] = 4'b1111;
228
        frame1.ctrl[16] = 4'b1111;
229
        frame1.ctrl[17] = 4'b1111;
230
        frame1.ctrl[18] = 4'b1111;
231
        frame1.ctrl[19] = 4'b1111;
232
        frame1.ctrl[20] = 4'b1111;
233
        frame1.ctrl[21] = 4'b0011;
234
        frame1.ctrl[22] = 4'b0000;
235
        frame1.ctrl[23] = 4'b0000;
236
        frame1.ctrl[24] = 4'b0000;
237
        frame1.ctrl[25] = 4'b0000;
238
        frame1.ctrl[26] = 4'b0000;
239
        frame1.ctrl[27] = 4'b0000;
240
        frame1.ctrl[28] = 4'b0000;
241
        frame1.ctrl[29] = 4'b0000;
242
        frame1.ctrl[30] = 4'b0000;
243
        frame1.ctrl[31] = 4'b0000;
244
 
245
        frame1.crc = 32'hDE13388C;
246
 
247
        frame1.underrun = 1'b0;
248
 
249
        // Frame 2
250
        frame2.data[0]  = 32'h04030201;
251
        frame2.data[1]  = 32'h02020605;
252
        frame2.data[2]  = 32'h06050403;
253
        frame2.data[3]  = 32'h55AA2E80;
254
        frame2.data[4]  = 32'hAA55AA55;
255
        frame2.data[5]  = 32'h55AA55AA;
256
        frame2.data[6]  = 32'hAA55AA55;
257
        frame2.data[7]  = 32'h55AA55AA;
258
        frame2.data[8]  = 32'hAA55AA55;
259
        frame2.data[9]  = 32'h55AA55AA;
260
        frame2.data[10] = 32'hAA55AA55;
261
        frame2.data[11] = 32'h55AA55AA;
262
        frame2.data[12] = 32'hAA55AA55;
263
        frame2.data[13] = 32'h55AA55AA;
264
        frame2.data[14] = 32'hAA55AA55;
265
        frame2.data[15] = 32'h55AA55AA;
266
        frame2.data[16] = 32'hAA55AA55;
267
        frame2.data[17] = 32'h55AA55AA;
268
        frame2.data[18] = 32'hAA55AA55;
269
        frame2.data[19] = 32'h55AA55AA;
270
        frame2.data[20] = 32'h00000000;
271
        frame2.data[21] = 32'h00000000;
272
        frame2.data[22] = 32'h00000000;
273
        frame2.data[23] = 32'h00000000;
274
        frame2.data[24] = 32'h00000000;
275
        frame2.data[25] = 32'h00000000;
276
        frame2.data[26] = 32'h00000000;
277
        frame2.data[27] = 32'h00000000;
278
        frame2.data[28] = 32'h00000000;
279
        frame2.data[29] = 32'h00000000;
280
        frame2.data[30] = 32'h00000000;
281
        frame2.data[31] = 32'h00000000;
282
 
283
        frame2.ctrl[0] = 4'b1111;
284
        frame2.ctrl[1] = 4'b1111;
285
        frame2.ctrl[2] = 4'b1111;
286
        frame2.ctrl[3] = 4'b1111;
287
        frame2.ctrl[4] = 4'b1111;
288
        frame2.ctrl[5] = 4'b1111;
289
        frame2.ctrl[6] = 4'b1111;
290
        frame2.ctrl[7] = 4'b1111;
291
        frame2.ctrl[8] = 4'b1111;
292
        frame2.ctrl[9] = 4'b1111;
293
        frame2.ctrl[10] = 4'b1111;
294
        frame2.ctrl[11] = 4'b1111;
295
        frame2.ctrl[12] = 4'b1111;
296
        frame2.ctrl[13] = 4'b1111;
297
        frame2.ctrl[14] = 4'b1111;
298
        frame2.ctrl[15] = 4'b1111;
299
        frame2.ctrl[16] = 4'b1111;
300
        frame2.ctrl[17] = 4'b1111;
301
        frame2.ctrl[18] = 4'b1111;
302
        frame2.ctrl[19] = 4'b1111;
303
        frame2.ctrl[20] = 4'b0000;
304
        frame2.ctrl[21] = 4'b0000;
305
        frame2.ctrl[22] = 4'b0000;
306
        frame2.ctrl[23] = 4'b0000;
307
        frame2.ctrl[24] = 4'b0000;
308
        frame2.ctrl[25] = 4'b0000;
309
        frame2.ctrl[26] = 4'b0000;
310
        frame2.ctrl[27] = 4'b0000;
311
        frame2.ctrl[28] = 4'b0000;
312
        frame2.ctrl[29] = 4'b0000;
313
        frame2.ctrl[30] = 4'b0000;
314
        frame2.ctrl[31] = 4'b0000;
315
 
316
        frame2.crc = 32'h20C6B69D;
317
 
318
        frame2.underrun = 1'b1;
319
 
320
        // Frame 3
321
        frame3.data[0]  = 32'h03040506;
322
        frame3.data[1]  = 32'h05060102;
323
        frame3.data[2]  = 32'h02020304;
324
        frame3.data[3]  = 32'hEE111500;
325
        frame3.data[4]  = 32'h11EE11EE;
326
        frame3.data[5]  = 32'hEE11EE11;
327
        frame3.data[6]  = 64'h11EE11EE;
328
        frame3.data[7]  = 32'hEE11EE11;
329
        frame3.data[8]  = 32'h00EE11EE;
330
        frame3.data[9]  = 32'h00000000;
331
        frame3.data[10] = 32'h00000000;
332
        frame3.data[11] = 32'h00000000;
333
        frame3.data[12] = 32'h00000000;
334
        frame3.data[13] = 32'h00000000;
335
        frame3.data[14] = 32'h00000000;
336
        frame3.data[15] = 32'h00000000;
337
        frame3.data[16] = 32'h00000000;
338
        frame3.data[17] = 32'h00000000;
339
        frame3.data[18] = 32'h00000000;
340
        frame3.data[19] = 32'h00000000;
341
        frame3.data[20] = 32'h00000000;
342
        frame3.data[21] = 32'h00000000;
343
        frame3.data[22] = 32'h00000000;
344
        frame3.data[23] = 32'h00000000;
345
        frame3.data[24] = 32'h00000000;
346
        frame3.data[25] = 32'h00000000;
347
        frame3.data[26] = 32'h00000000;
348
        frame3.data[27] = 32'h00000000;
349
        frame3.data[28] = 32'h00000000;
350
        frame3.data[29] = 32'h00000000;
351
        frame3.data[30] = 32'h00000000;
352
        frame3.data[31] = 32'h00000000;
353
 
354
        frame3.ctrl[0]  = 4'b1111;
355
        frame3.ctrl[1]  = 4'b1111;
356
        frame3.ctrl[2]  = 4'b1111;
357
        frame3.ctrl[3]  = 4'b1111;
358
        frame3.ctrl[4]  = 4'b1111;
359
        frame3.ctrl[5]  = 4'b1111;
360
        frame3.ctrl[6]  = 4'b1111;
361
        frame3.ctrl[7]  = 4'b1111;
362
        frame3.ctrl[8]  = 4'b0111;
363
        frame3.ctrl[9]  = 4'b0000;
364
        frame3.ctrl[10] = 4'b0000;
365
        frame3.ctrl[11] = 4'b0000;
366
        frame3.ctrl[12] = 4'b0000;
367
        frame3.ctrl[13] = 4'b0000;
368
        frame3.ctrl[14] = 4'b0000;
369
        frame3.ctrl[15] = 4'b0000;
370
        frame3.ctrl[16] = 4'b0000;
371
        frame3.ctrl[17] = 4'b0000;
372
        frame3.ctrl[18] = 4'b0000;
373
        frame3.ctrl[19] = 4'b0000;
374
        frame3.ctrl[20] = 4'b0000;
375
        frame3.ctrl[21] = 4'b0000;
376
        frame3.ctrl[22] = 4'b0000;
377
        frame3.ctrl[23] = 4'b0000;
378
        frame3.ctrl[24] = 4'b0000;
379
        frame3.ctrl[25] = 4'b0000;
380
        frame3.ctrl[26] = 4'b0000;
381
        frame3.ctrl[27] = 4'b0000;
382
        frame3.ctrl[28] = 4'b0000;
383
        frame3.ctrl[29] = 4'b0000;
384
        frame3.ctrl[30] = 4'b0000;
385
        frame3.ctrl[31] = 4'b0000;
386
 
387
        frame3.crc = 32'h6B734A56;
388
 
389
        frame3.underrun = 1'b0;
390
     end  // initial
391
 
392
  // DUT signals
393
  reg reset;
394
 
395
  //Client transmitter signals
396
  //client receiver signals
397
 
398
  wire [63:0] rx_data;
399
  wire [7:0] rx_data_valid;
400
  wire rx_good_frame;
401
  wire rx_bad_frame;
402
  wire rx_clk;
403
  wire [28:0] rx_statistics_vector;
404
  wire rx_statistics_valid;
405
  wire [64:0] configuration_vector;
406
  reg  xgmii_rx_clk;
407
  reg  [31:0] xgmii_rxd;
408
  reg  [3:0]  xgmii_rxc;
409
 
410
   reg   rx_monitor_finished;
411
   wire  simulation_finished;
412
 
413
 
414
  /*---------------------------------------------------------------------------
415
  -- wire up Device Under Test
416
  ---------------------------------------------------------------------------*/
417
        rxReceiveEngine uut (
418
                .rxclk_in(xgmii_rx_clk),
419
                .reset_in(reset),
420
                .rxd_in(xgmii_rxd),
421
                .rxc_in(xgmii_rxc),
422
                .rxStatRegPlus(rxStatRegPlus),
423
                .cfgRxRegData_in(configuration_vector),
424
                .rx_data(rx_data),
425
                .rx_data_valid(rx_data_valid),
426
                .rx_good_frame(rx_good_frame),
427
                .rx_bad_frame(rx_bad_frame),
428
                .rxCfgofRS(rxCfgofRS),
429
                .rxTxLinkFault(rxTxLinkFault)
430
//              .fcTxPauseData(), 
431
//              .fcTxPauseValid()
432
        );
433
 
434
   assign configuration_vector = {1'b0, 64'h058f010203040506};
435
 
436
 /*---------------------------------------------------------------------------
437
  -- Clock drivers
438
  ---------------------------------------------------------------------------*/
439
   initial
440
     begin
441
        xgmii_rx_clk <= 0;
442
        #1000;
443
        forever
444
          begin
445
             #3200;
446
             xgmii_rx_clk <= 1;
447
             #3200;
448
             xgmii_rx_clk <= 0;
449
          end
450
     end // initial begin
451
 
452
 
453
 
454
 
455
   /* RX Stimulus process - insert frames into the PHY side of the
456
    * receiver
457
    */
458
 
459
   task rx_stimulus_send_column;
460
      input [31:0] d;
461
      input [ 3:0] c;
462
      begin
463
         @(posedge xgmii_rx_clk or negedge xgmii_rx_clk);
464
         #1600;
465
         xgmii_rxd <= d;
466
         xgmii_rxc <= c;
467
      end
468
   endtask // rx_stimulus_send_column
469
 
470
   task rx_stimulus_send_idle;
471
      begin
472
         rx_stimulus_send_column(32'h07070707,4'b1111);
473
      end
474
   endtask // rx_stimulus_send_idle
475
 
476
   task rx_stimulus_send_frame;
477
      input `FRAME_TYP frame;
478
      integer column_index, lane_index, byte_count, I, J;
479
      reg [31:0] scratch_column_data, current_column_data;
480
      reg [ 3:0] scratch_column_ctrl, current_column_ctrl;
481
      reg [ 7:0] code_temp;
482
      begin
483
         rx_stimulus_working_frame.frombits(frame);
484
         column_index = 0;
485
         lane_index = 0;
486
         byte_count = 0;
487
         // send preamble
488
         rx_stimulus_send_column(32'h555555FB, 4'b0001);
489
         rx_stimulus_send_column(32'hD5555555, 4'b0000);
490
         // send complete columns
491
//                      for(I=0; I<16;I=I+1) begin
492
//       column_index = 0;
493
         while (rx_stimulus_working_frame.ctrl[column_index] === 4'b1111)
494
           begin
495
              rx_stimulus_send_column(rx_stimulus_working_frame.data[column_index],
496
                                      4'b0000);
497
              column_index = column_index + 1;
498
              byte_count = byte_count + 4;
499
           end
500
//                      end  
501
         current_column_data = rx_stimulus_working_frame.data[column_index];//data which is not 64 bits
502
         current_column_ctrl = rx_stimulus_working_frame.ctrl[column_index];
503
         while (current_column_ctrl[lane_index]) //send out data which is not 64 bits
504
           begin
505
              for (J = 0; J < 8; J = J + 1)
506
                scratch_column_data[lane_index*8+J] =
507
                       current_column_data[lane_index*8+J];
508
              scratch_column_ctrl[lane_index] = 0;
509
              lane_index = lane_index + 1;
510
              byte_count = byte_count + 1;
511
           end
512
         // send any padding required
513
         while (byte_count < `MIN_FRAME_DATA_BYTES)
514
           begin
515
              if (lane_index == 4)
516
                begin
517
                   rx_stimulus_send_column(scratch_column_data,
518
                                           scratch_column_ctrl);
519
                   lane_index = 0;
520
                end
521
              for (J = 0; J < 8; J = J + 1)
522
                scratch_column_data[lane_index*8+J] = 0;
523
              scratch_column_ctrl[lane_index] = 0;
524
              lane_index = lane_index + 1;
525
              byte_count = byte_count + 1;
526
           end // while (byte_count < `MIN_FRAME_DATA_BYTES)
527
         // send the CRC
528
         for (I = 3; I >= 0; I = I - 1)
529
           begin
530
              if (lane_index == 4)
531
                begin
532
                   rx_stimulus_send_column(scratch_column_data,
533
                                           scratch_column_ctrl);
534
                   lane_index = 0;
535
                end
536
              for (J = 0; J < 8; J = J + 1)
537
                scratch_column_data[lane_index*8+J] =
538
                       rx_stimulus_working_frame.crc[I*8+J];
539
              scratch_column_ctrl = 0;
540
              lane_index = lane_index + 1;
541
           end // for (I = 3; I >= 0; I = I - 1)
542
         // send the terminate/error column
543
         if (lane_index == 4)
544
           begin
545
              rx_stimulus_send_column(scratch_column_data,
546
                                      scratch_column_ctrl);
547
              lane_index = 0;
548
           end
549
         // send an /E/ if underrun, /T/ if not
550
         code_temp = rx_stimulus_working_frame.underrun ? 8'hFE : 8'hFD;
551
         for (J = 0; J < 8; J = J + 1)
552
           scratch_column_data[lane_index*8+J] = code_temp[J];
553
         scratch_column_ctrl[lane_index] = 1;
554
 
555
         lane_index = lane_index + 1;
556
         while (lane_index < 4)
557
           begin
558
              code_temp = 8'h07;
559
              for (J = 0; J < 8; J = J + 1)
560
                scratch_column_data[lane_index*8+J] = code_temp[J];
561
              scratch_column_ctrl[lane_index] = 1;
562
              lane_index = lane_index + 1;
563
           end
564
         rx_stimulus_send_column(scratch_column_data,
565
                                 scratch_column_ctrl);
566
         $display("Receiver: frame inserted into PHY interface");
567
      end
568
   endtask // rx_stimulus_send_frame
569
 
570
   initial
571
     begin : p_rx_stimulus
572
        integer I;
573
                  rx_stimulus_send_idle;
574
        rx_stimulus_send_idle;
575
        for (I = 0; I < 100; I = I + 1)
576
          rx_stimulus_send_idle;
577
        rx_stimulus_send_frame(frame0.tobits(0));
578
        rx_stimulus_send_idle;
579
        rx_stimulus_send_idle;
580
        rx_stimulus_send_idle;
581
        rx_stimulus_send_frame(frame1.tobits(0));
582
        rx_stimulus_send_idle;
583
        rx_stimulus_send_idle;
584
        rx_stimulus_send_idle;
585
        rx_stimulus_send_frame(frame2.tobits(0));
586
        rx_stimulus_send_idle;
587
        rx_stimulus_send_idle;
588
        rx_stimulus_send_frame(frame3.tobits(0));
589
        while (1)
590
          rx_stimulus_send_idle;
591
     end // block: p_rx_stimulus
592
 
593
 
594
   /* rx monitor - checks that the receiver extracts the information
595
    * inserted into the PHY interface
596
    */
597
   task wait_on_rx_clk;
598
      begin
599
         @(posedge rx_clk);
600
         #6399;
601
      end
602
   endtask // wait_on_rx_clk
603
 
604
   task rx_monitor_check_frame;
605
      input `FRAME_TYP frame;
606
      integer column_count, I, J;
607
      reg [31:0] current_column_data;
608
      reg good_frame_flagged;
609
      reg bad_frame_flagged;
610
      begin
611
         rx_monitor_working_frame.frombits(frame);
612
         column_count = 0;
613
         // wait for the first real column of data
614
         while (rx_data_valid === 8'b00000000)
615
           wait_on_rx_clk;
616
         // frame has started, get columns of frame
617
         while (rx_data_valid !== 8'b00000000)
618
           begin
619
              // only check contents of good frames
620
              if (!rx_monitor_working_frame.underrun)
621
                begin
622
                   if (rx_data_valid !== { rx_monitor_working_frame.ctrl[column_count+1],
623
                                           rx_monitor_working_frame.ctrl[column_count] })
624
                     $display("ERROR: Receiver fail: RX_DATA_VALID incorrect");
625
                   current_column_data = rx_monitor_working_frame.data[column_count];
626
                   for (I = 0; I < 4; I = I + 1)
627
                     if (rx_data_valid[I])
628
                       for (J = 0; J < 8; J = J + 1)
629
                         if (rx_data[I*8+J] !== current_column_data[I*8+J])
630
                           $display("ERROR: Receiver fail : RX_DATA incorrect");
631
                   current_column_data = rx_monitor_working_frame.data[column_count+1];
632
                   for (I = 4; I < 8; I = I + 1)
633
                     if (rx_data_valid[I])
634
                       for (J = 0; J < 8; J = J + 1)
635
                         if (rx_data[I*8+J] !== current_column_data[(I-4)*8+J])
636
                           $display("ERROR: Receiver fail : RX_DATA incorrect");
637
                end // if (!rx_monitor_working_frame.underrun)
638
 
639
              good_frame_flagged = rx_good_frame;
640
              bad_frame_flagged = rx_bad_frame;
641
              column_count = column_count + 2;
642
              wait_on_rx_clk;
643
           end // while (RX_DATA_VALID != 8'b00000000)
644
         // check whether the frame has been flagged at the right time
645
         while (!good_frame_flagged && !bad_frame_flagged)
646
           begin
647
              good_frame_flagged = rx_good_frame;
648
              bad_frame_flagged = rx_bad_frame;
649
              if (rx_data_valid !== 8'b00000000)
650
                $display("ERROR: Receiver fail: New frame received before good/bad flag from previous frame");
651
              wait_on_rx_clk;
652
           end
653
         if (rx_monitor_working_frame.underrun)
654
           begin
655
              if (good_frame_flagged)
656
                $display("ERROR: Receive Fail: bad frame flagged as good");
657
           end
658
         else
659
           begin
660
              if (bad_frame_flagged)
661
                $display("ERROR: Receive Fail: good frame flagged as bad");
662
           end
663
         $display("Receiver: Frame extracted from client interface");
664
      end
665
   endtask // rx_monitor_check_frame
666
 
667
   /*---------------------------------------------------------------------------
668
  -- RX Monitor process. This process checks the data coming out of the
669
   receiver
670
  -- to make sure that it matches that inserted into the transmitter.
671
  ---------------------------------------------------------------------------*/
672
  initial
673
    begin : p_rx_monitor
674
       rx_monitor_finished = 0;
675
 
676
       // first, get synced up with the RX clock
677
       @(negedge reset)
678
         wait_on_rx_clk;
679
 
680
       rx_monitor_check_frame(frame0.tobits(0));
681
       rx_monitor_check_frame(frame1.tobits(0));
682
       rx_monitor_check_frame(frame2.tobits(0));
683
       rx_monitor_check_frame(frame3.tobits(0));
684
       rx_monitor_finished = 1;
685
    end // block: p_rx_monitor
686
 
687
 
688
 
689
 
690
   // reset process
691
   initial
692
     begin
693
        $display("Resetting the core...");
694
        reset <= 1;
695
        #200000;
696
        reset <= 0;
697
     end
698
 
699
   // Simulation control
700
   assign simulation_finished = rx_monitor_finished;
701
 
702
   initial
703
     begin
704
        fork: sim_in_progress
705
          @(posedge simulation_finished) disable sim_in_progress;
706
           #10000000                     disable sim_in_progress;
707
        join
708
        if (simulation_finished)
709
          $display("** failure: Simulation Stopped");
710
        else
711
          $display("** failure: Testbench timed out");
712
        $stop;
713
     end // initial begin
714
 
715
endmodule
716
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.