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

Subversion Repositories xge_mac

[/] [xge_mac/] [trunk/] [tbench/] [verilog/] [tb_xge_mac.sv] - Blame information for rev 21

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

Line No. Rev Author Line
1 2 antanguay
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  File name "tb_xge_mac.v"                                    ////
4
////                                                              ////
5
////  This file is part of the "10GE MAC" project                 ////
6
////  http://www.opencores.org/cores/xge_mac/                     ////
7
////                                                              ////
8
////  Author(s):                                                  ////
9
////      - A. Tanguay (antanguay@opencores.org)                  ////
10
////                                                              ////
11
//////////////////////////////////////////////////////////////////////
12
////                                                              ////
13
//// Copyright (C) 2008 AUTHORS. All rights reserved.             ////
14
////                                                              ////
15
//// This source file may be used and distributed without         ////
16
//// restriction provided that this copyright statement is not    ////
17
//// removed from the file and that any derivative work contains  ////
18
//// the original copyright notice and the associated disclaimer. ////
19
////                                                              ////
20
//// This source file is free software; you can redistribute it   ////
21
//// and/or modify it under the terms of the GNU Lesser General   ////
22
//// Public License as published by the Free Software Foundation; ////
23
//// either version 2.1 of the License, or (at your option) any   ////
24
//// later version.                                               ////
25
////                                                              ////
26
//// This source is distributed in the hope that it will be       ////
27
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
28
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
29
//// PURPOSE.  See the GNU Lesser General Public License for more ////
30
//// details.                                                     ////
31
////                                                              ////
32
//// You should have received a copy of the GNU Lesser General    ////
33
//// Public License along with this source; if not, download it   ////
34
//// from http://www.opencores.org/lgpl.shtml                     ////
35
////                                                              ////
36
//////////////////////////////////////////////////////////////////////
37
 
38
 
39
`include "timescale.v"
40
`include "defines.v"
41
 
42 14 antanguay
//`define GXB
43
//`define XIL
44 21 antanguay
//`define XIL_V10
45 14 antanguay
 
46 2 antanguay
module tb;
47
 
48
 
49
/*AUTOREG*/
50
 
51
reg [7:0]     tx_buffer[0:10000];
52
integer       tx_length;
53
 
54
reg           clk_156m25;
55 12 antanguay
reg           clk_312m50;
56 2 antanguay
reg           clk_xgmii_rx;
57
reg           clk_xgmii_tx;
58
 
59
reg           reset_156m25_n;
60
reg           reset_xgmii_rx_n;
61
reg           reset_xgmii_tx_n;
62
 
63
reg           pkt_rx_ren;
64
 
65
reg  [63:0]   pkt_tx_data;
66
reg           pkt_tx_val;
67
reg           pkt_tx_sop;
68 6 antanguay
reg           pkt_tx_eop;
69
reg  [2:0]    pkt_tx_mod;
70 2 antanguay
 
71 17 antanguay
integer       tx_count;
72
integer       rx_count;
73
 
74 2 antanguay
/*AUTOWIRE*/
75
// Beginning of automatic wires (for undeclared instantiated-module outputs)
76
wire                    pkt_rx_avail;           // From dut of xge_mac.v
77
wire [63:0]             pkt_rx_data;            // From dut of xge_mac.v
78 6 antanguay
wire                    pkt_rx_eop;             // From dut of xge_mac.v
79 2 antanguay
wire                    pkt_rx_err;             // From dut of xge_mac.v
80 6 antanguay
wire [2:0]              pkt_rx_mod;             // From dut of xge_mac.v
81 2 antanguay
wire                    pkt_rx_sop;             // From dut of xge_mac.v
82
wire                    pkt_rx_val;             // From dut of xge_mac.v
83
wire                    pkt_tx_full;            // From dut of xge_mac.v
84
wire                    wb_ack_o;               // From dut of xge_mac.v
85
wire [31:0]             wb_dat_o;               // From dut of xge_mac.v
86
wire                    wb_int_o;               // From dut of xge_mac.v
87
wire [7:0]              xgmii_txc;              // From dut of xge_mac.v
88
wire [63:0]             xgmii_txd;              // From dut of xge_mac.v
89
// End of automatics
90
 
91
wire  [7:0]   wb_adr_i;
92
wire  [31:0]  wb_dat_i;
93
 
94
wire [7:0]              xgmii_rxc;
95
wire [63:0]             xgmii_rxd;
96
 
97 12 antanguay
wire [3:0]              tx_dataout;
98 2 antanguay
 
99 12 antanguay
wire                    xaui_tx_l0_n;
100
wire                    xaui_tx_l0_p;
101
wire                    xaui_tx_l1_n;
102
wire                    xaui_tx_l1_p;
103
wire                    xaui_tx_l2_n;
104
wire                    xaui_tx_l2_p;
105
wire                    xaui_tx_l3_n;
106
wire                    xaui_tx_l3_p;
107
 
108 2 antanguay
xge_mac dut(/*AUTOINST*/
109
            // Outputs
110
            .pkt_rx_avail               (pkt_rx_avail),
111
            .pkt_rx_data                (pkt_rx_data[63:0]),
112 6 antanguay
            .pkt_rx_eop                 (pkt_rx_eop),
113 2 antanguay
            .pkt_rx_err                 (pkt_rx_err),
114 6 antanguay
            .pkt_rx_mod                 (pkt_rx_mod[2:0]),
115 2 antanguay
            .pkt_rx_sop                 (pkt_rx_sop),
116
            .pkt_rx_val                 (pkt_rx_val),
117
            .pkt_tx_full                (pkt_tx_full),
118
            .wb_ack_o                   (wb_ack_o),
119
            .wb_dat_o                   (wb_dat_o[31:0]),
120
            .wb_int_o                   (wb_int_o),
121
            .xgmii_txc                  (xgmii_txc[7:0]),
122
            .xgmii_txd                  (xgmii_txd[63:0]),
123
            // Inputs
124
            .clk_156m25                 (clk_156m25),
125
            .clk_xgmii_rx               (clk_xgmii_rx),
126
            .clk_xgmii_tx               (clk_xgmii_tx),
127
            .pkt_rx_ren                 (pkt_rx_ren),
128
            .pkt_tx_data                (pkt_tx_data[63:0]),
129 6 antanguay
            .pkt_tx_eop                 (pkt_tx_eop),
130
            .pkt_tx_mod                 (pkt_tx_mod[2:0]),
131 2 antanguay
            .pkt_tx_sop                 (pkt_tx_sop),
132
            .pkt_tx_val                 (pkt_tx_val),
133
            .reset_156m25_n             (reset_156m25_n),
134
            .reset_xgmii_rx_n           (reset_xgmii_rx_n),
135
            .reset_xgmii_tx_n           (reset_xgmii_tx_n),
136
            .wb_adr_i                   (wb_adr_i[7:0]),
137
            .wb_clk_i                   (wb_clk_i),
138
            .wb_cyc_i                   (wb_cyc_i),
139
            .wb_dat_i                   (wb_dat_i[31:0]),
140
            .wb_rst_i                   (wb_rst_i),
141
            .wb_stb_i                   (wb_stb_i),
142
            .wb_we_i                    (wb_we_i),
143
            .xgmii_rxc                  (xgmii_rxc[7:0]),
144
            .xgmii_rxd                  (xgmii_rxd[63:0]));
145
 
146 12 antanguay
`ifdef GXB
147
// Example of transceiver instance
148
gxb gxb(// Outputs
149
        .rx_ctrldetect                  ({xgmii_rxc[7],
150
                                          xgmii_rxc[5],
151
                                          xgmii_rxc[3],
152
                                          xgmii_rxc[1],
153
                                          xgmii_rxc[6],
154
                                          xgmii_rxc[4],
155
                                          xgmii_rxc[2],
156
                                          xgmii_rxc[0]}),
157
        .rx_dataout                     ({xgmii_rxd[63:56],
158
                                          xgmii_rxd[47:40],
159
                                          xgmii_rxd[31:24],
160
                                          xgmii_rxd[15:8],
161
                                          xgmii_rxd[55:48],
162
                                          xgmii_rxd[39:32],
163
                                          xgmii_rxd[23:16],
164
                                          xgmii_rxd[7:0]}),
165
        .tx_dataout                     (tx_dataout[3:0]),
166
        // Inputs
167
        .pll_inclk                      (clk_156m25),
168
        .rx_analogreset                 (~reset_156m25_n),
169
        .rx_cruclk                      ({clk_156m25, clk_156m25, clk_156m25, clk_156m25}),
170
        .rx_datain                      (tx_dataout[3:0]),
171
        .rx_digitalreset                (~reset_156m25_n),
172
        .tx_ctrlenable                  ({xgmii_txc[7],
173
                                          xgmii_txc[5],
174
                                          xgmii_txc[3],
175
                                          xgmii_txc[1],
176
                                          xgmii_txc[6],
177
                                          xgmii_txc[4],
178
                                          xgmii_txc[2],
179
                                          xgmii_txc[0]}),
180
        .tx_datain                      ({xgmii_txd[63:56],
181
                                          xgmii_txd[47:40],
182
                                          xgmii_txd[31:24],
183
                                          xgmii_txd[15:8],
184
                                          xgmii_txd[55:48],
185
                                          xgmii_txd[39:32],
186
                                          xgmii_txd[23:16],
187
                                          xgmii_txd[7:0]}),
188
        .tx_digitalreset                (~reset_156m25_n));
189
`endif
190 2 antanguay
 
191 12 antanguay
`ifdef XIL
192
// Example of transceiver instance
193
xaui_block xaui(// Outputs
194
                .txoutclk               (),
195
                .xgmii_rxd              (xgmii_rxd[63:0]),
196
                .xgmii_rxc              (xgmii_rxc[7:0]),
197
                .xaui_tx_l0_p           (xaui_tx_l0_p),
198
                .xaui_tx_l0_n           (xaui_tx_l0_n),
199
                .xaui_tx_l1_p           (xaui_tx_l1_p),
200
                .xaui_tx_l1_n           (xaui_tx_l1_n),
201
                .xaui_tx_l2_p           (xaui_tx_l2_p),
202
                .xaui_tx_l2_n           (xaui_tx_l2_n),
203
                .xaui_tx_l3_p           (xaui_tx_l3_p),
204
                .xaui_tx_l3_n           (xaui_tx_l3_n),
205
                .txlock                 (),
206
                .align_status           (),
207
                .sync_status            (),
208
                .mgt_tx_ready           (),
209
                .drp_o                  (),
210
                .drp_rdy                (),
211
                .status_vector          (),
212
                // Inputs
213
                .dclk                   (clk_156m25),
214
                .clk156                 (clk_156m25),
215
                .clk312                 (clk_312m50),
216
                .refclk                 (clk_156m25),
217
                .reset                  (~reset_156m25_n),
218
                .reset156               (~reset_156m25_n),
219
                .xgmii_txd              (xgmii_txd[63:0]),
220
                .xgmii_txc              (xgmii_txc[7:0]),
221
                .xaui_rx_l0_p           (xaui_tx_l0_p),
222
                .xaui_rx_l0_n           (xaui_tx_l0_n),
223
                .xaui_rx_l1_p           (xaui_tx_l1_p),
224
                .xaui_rx_l1_n           (xaui_tx_l1_n),
225
                .xaui_rx_l2_p           (xaui_tx_l2_p),
226
                .xaui_rx_l2_n           (xaui_tx_l2_n),
227
                .xaui_rx_l3_p           (xaui_tx_l3_p),
228
                .xaui_rx_l3_n           (xaui_tx_l3_n),
229
                .signal_detect          (4'b1111),
230
                .drp_addr               (7'b0),
231
                .drp_en                 (2'b0),
232
                .drp_i                  (16'b0),
233
                .drp_we                 (2'b0),
234
                .configuration_vector   (7'b0));
235
 
236
glbl glbl();
237
`endif
238
 
239 21 antanguay
`ifdef XIL_V10
240
// Example of transceiver instance
241
xaui_v10_2_block xaui(// Outputs
242
                .txoutclk               (),
243
                .xgmii_rxd              (xgmii_rxd[63:0]),
244
                .xgmii_rxc              (xgmii_rxc[7:0]),
245
                .xaui_tx_l0_p           (xaui_tx_l0_p),
246
                .xaui_tx_l0_n           (xaui_tx_l0_n),
247
                .xaui_tx_l1_p           (xaui_tx_l1_p),
248
                .xaui_tx_l1_n           (xaui_tx_l1_n),
249
                .xaui_tx_l2_p           (xaui_tx_l2_p),
250
                .xaui_tx_l2_n           (xaui_tx_l2_n),
251
                .xaui_tx_l3_p           (xaui_tx_l3_p),
252
                .xaui_tx_l3_n           (xaui_tx_l3_n),
253
                .txlock                 (),
254
                .align_status           (),
255
                .sync_status            (),
256
                .mgt_tx_ready           (),
257
                .drp_o                  (),
258
                .drp_rdy                (),
259
                .status_vector          (),
260
                // Inputs
261
                .dclk                   (clk_156m25),
262
                .clk156                 (clk_156m25),
263
                .refclk                 (clk_156m25),
264
                .reset                  (~reset_156m25_n),
265
                .reset156               (~reset_156m25_n),
266
                .xgmii_txd              (xgmii_txd[63:0]),
267
                .xgmii_txc              (xgmii_txc[7:0]),
268
                .xaui_rx_l0_p           (xaui_tx_l0_p),
269
                .xaui_rx_l0_n           (xaui_tx_l0_n),
270
                .xaui_rx_l1_p           (xaui_tx_l1_p),
271
                .xaui_rx_l1_n           (xaui_tx_l1_n),
272
                .xaui_rx_l2_p           (xaui_tx_l2_p),
273
                .xaui_rx_l2_n           (xaui_tx_l2_n),
274
                .xaui_rx_l3_p           (xaui_tx_l3_p),
275
                .xaui_rx_l3_n           (xaui_tx_l3_n),
276
                .signal_detect          (4'b1111),
277
                .drp_addr               (9'b0),
278
                .drp_en                 (4'b0),
279
                .drp_i                  (16'b0),
280
                .drp_we                 (4'b0),
281
                .configuration_vector   (7'b0));
282
 
283
glbl glbl();
284
`endif
285
 
286 2 antanguay
//---
287
// Unused for this testbench
288
 
289
assign wb_adr_i = 8'b0;
290
assign wb_clk_i = 1'b0;
291
assign wb_cyc_i = 1'b0;
292
assign wb_dat_i = 32'b0;
293
assign wb_rst_i = 1'b1;
294
assign wb_stb_i = 1'b0;
295
assign wb_we_i = 1'b0;
296
 
297
 
298 17 antanguay
initial begin
299
    tx_count = 0;
300
    rx_count = 0;
301
end
302
 
303 2 antanguay
//---
304
// XGMII Loopback
305 12 antanguay
// This test is done with loopback on XGMII or using one of the tranceiver examples
306 2 antanguay
 
307 12 antanguay
`ifndef GXB
308
  `ifndef XIL
309 21 antanguay
    `ifndef XIL_V10
310
      assign xgmii_rxc = xgmii_txc;
311
      assign xgmii_rxd = xgmii_txd;
312
    `endif
313 12 antanguay
  `endif
314
`endif
315 2 antanguay
 
316
//---
317
// Clock generation
318
 
319
initial begin
320
    clk_156m25 = 1'b0;
321
    clk_xgmii_rx = 1'b0;
322
    clk_xgmii_tx = 1'b0;
323
    forever begin
324
        WaitPS(3200);
325
        clk_156m25 = ~clk_156m25;
326
        clk_xgmii_rx = ~clk_xgmii_rx;
327
        clk_xgmii_tx = ~clk_xgmii_tx;
328
    end
329 12 antanguay
end
330 2 antanguay
 
331 12 antanguay
initial begin
332
    clk_312m50 = 1'b0;
333
    forever begin
334
        WaitPS(1600);
335
        clk_312m50 = ~clk_312m50;
336
    end
337
end
338 2 antanguay
 
339
//---
340
// Reset Generation
341
 
342
initial begin
343
    reset_156m25_n = 1'b0;
344
    reset_xgmii_rx_n = 1'b0;
345
    reset_xgmii_tx_n = 1'b0;
346
    WaitNS(20);
347
    reset_156m25_n = 1'b1;
348
    reset_xgmii_rx_n = 1'b1;
349
    reset_xgmii_tx_n = 1'b1;
350
end
351
 
352
 
353
//---
354
// Init signals
355
 
356
initial begin
357
 
358
    for (tx_length = 0; tx_length <= 1000; tx_length = tx_length + 1) begin
359
        tx_buffer[tx_length] = 0;
360
    end
361
 
362
    pkt_rx_ren = 1'b0;
363
 
364
    pkt_tx_data = 64'b0;
365
    pkt_tx_val = 1'b0;
366
    pkt_tx_sop = 1'b0;
367 6 antanguay
    pkt_tx_eop = 1'b0;
368
    pkt_tx_mod = 3'b0;
369 2 antanguay
 
370
end
371
 
372
task WaitNS;
373
  input [31:0] delay;
374
    begin
375
        #(1000*delay);
376
    end
377
endtask
378
 
379
task WaitPS;
380
  input [31:0] delay;
381
    begin
382
        #(delay);
383
    end
384
endtask
385
 
386
 
387
//---
388
// Task to send a single packet
389
 
390
task TxPacket;
391
  integer        i;
392
    begin
393
 
394
        $display("Transmit packet with length: %d", tx_length);
395
 
396
        @(posedge clk_156m25);
397
        WaitNS(1);
398
        pkt_tx_val = 1'b1;
399
 
400
        for (i = 0; i < tx_length; i = i + 8) begin
401
 
402
            pkt_tx_sop = 1'b0;
403 6 antanguay
            pkt_tx_eop = 1'b0;
404
            pkt_tx_mod = 2'b0;
405 2 antanguay
 
406
            if (i == 0) pkt_tx_sop = 1'b1;
407
 
408 6 antanguay
            if (i + 8 >= tx_length) begin
409
                pkt_tx_eop = 1'b1;
410
                pkt_tx_mod = tx_length % 8;
411
            end
412
 
413 12 antanguay
            pkt_tx_data[`LANE7] = tx_buffer[i];
414
            pkt_tx_data[`LANE6] = tx_buffer[i+1];
415
            pkt_tx_data[`LANE5] = tx_buffer[i+2];
416
            pkt_tx_data[`LANE4] = tx_buffer[i+3];
417
            pkt_tx_data[`LANE3] = tx_buffer[i+4];
418
            pkt_tx_data[`LANE2] = tx_buffer[i+5];
419
            pkt_tx_data[`LANE1] = tx_buffer[i+6];
420
            pkt_tx_data[`LANE0] = tx_buffer[i+7];
421 2 antanguay
 
422
            @(posedge clk_156m25);
423
            WaitNS(1);
424
 
425
        end
426
 
427
        pkt_tx_val = 1'b0;
428 6 antanguay
        pkt_tx_eop = 1'b0;
429
        pkt_tx_mod = 3'b0;
430 2 antanguay
 
431 17 antanguay
        tx_count = tx_count + 1;
432
 
433 2 antanguay
    end
434
 
435
endtask
436
 
437
 
438
//---
439
// Task to read a single packet from command file and transmit
440
 
441
task CmdTxPacket;
442
  input [31:0] file;
443
  integer count;
444
  integer data;
445
  integer i;
446
    begin
447
 
448
        count = $fscanf(file, "%2d", tx_length);
449
 
450
        if (count == 1) begin
451
 
452
            for (i = 0; i < tx_length; i = i + 1) begin
453 12 antanguay
 
454 2 antanguay
                count = $fscanf(file, "%2X", data);
455
                if (count) begin
456
                    tx_buffer[i] = data;
457
                end
458
 
459
            end
460
 
461
            TxPacket();
462
 
463
        end
464
    end
465
 
466
endtask
467
 
468
 
469
//---
470
// Task to read commands from file and stop when complete
471
 
472
task ProcessCmdFile;
473
  integer    file_cmd;
474
  integer  count;
475
  reg [8*8-1:0] str;
476
    begin
477
 
478
        file_cmd = $fopen("../../tbench/verilog/packets_tx.txt", "r");
479
        if (!file_cmd) $stop;
480
 
481
        while (!$feof(file_cmd)) begin
482
 
483
            count = $fscanf(file_cmd, "%s", str);
484 16 antanguay
            if (count != 1) continue;
485 2 antanguay
 
486
            $display("CMD %s", str);
487
 
488
            case (str)
489
 
490 12 antanguay
              "SEND_PKT":
491 2 antanguay
                begin
492
                    CmdTxPacket(file_cmd);
493
                end
494
 
495
            endcase
496
 
497
        end
498
 
499
        $fclose(file_cmd);
500
 
501 12 antanguay
        WaitNS(50000);
502 2 antanguay
        $stop;
503
 
504
    end
505
endtask
506
 
507
initial begin
508 12 antanguay
    WaitNS(5000);
509
`ifdef XIL
510
    WaitNS(200000);
511
`endif
512 2 antanguay
    ProcessCmdFile();
513
end
514
 
515
 
516
//---
517
// Task to read a single packet from receive interface and display
518
 
519
task RxPacket;
520
  reg done;
521
    begin
522
 
523
        done = 0;
524
 
525
        pkt_rx_ren <= 1'b1;
526
        @(posedge clk_156m25);
527
 
528
        while (!done) begin
529
 
530
            if (pkt_rx_val) begin
531
 
532
                if (pkt_rx_sop) begin
533
                    $display("\n\n------------------------");
534 17 antanguay
                    $display("Received Packet");
535
                    $display("------------------------");
536 2 antanguay
                end
537
 
538
                $display("%x", pkt_rx_data);
539
 
540
                if (pkt_rx_eop) begin
541
                    done <= 1;
542
                    pkt_rx_ren <= 1'b0;
543
                end
544
 
545
                if (pkt_rx_eop) begin
546
                    $display("------------------------\n\n");
547
                end
548
 
549
            end
550
 
551
            @(posedge clk_156m25);
552
 
553
        end
554
 
555 17 antanguay
        rx_count = rx_count + 1;
556
 
557 2 antanguay
    end
558
endtask
559
 
560
initial begin
561 12 antanguay
 
562 2 antanguay
    forever begin
563
 
564
        if (pkt_rx_avail) begin
565 17 antanguay
 
566 2 antanguay
            RxPacket();
567 17 antanguay
 
568
            if (rx_count == tx_count) begin
569
                $display("All packets received. Sumulation done!!!\n");
570
            end
571
 
572 2 antanguay
        end
573
 
574
        @(posedge clk_156m25);
575
 
576
    end
577
 
578
end
579
 
580
endmodule

powered by: WebSVN 2.1.0

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