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

Subversion Repositories sgmii

[/] [sgmii/] [trunk/] [sim/] [BFMs/] [SGMII_altera/] [testbench/] [sgmii/] [sgmii_tb.v] - Blame information for rev 9

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

Line No. Rev Author Line
1 9 jefflieu
// -------------------------------------------------------------------------
2
// -------------------------------------------------------------------------
3
//
4
// Revision Control Information
5
//
6
// $RCSfile: tb_pcs_pma_powerdown.v,v $
7
// $Source: /ipbu/cvs/sio/projects/TriSpeedEthernet/src/testbench/PCS/verilog/tb_pcs_pma_powerdown.v,v $
8
//
9
// $Revision: #1 $
10
// $Date: 2011/11/10 $
11
// Check in by : $Author: max $
12
// Author      : SKNg/TTChong
13
//
14
// Project     : Triple Speed Ethernet - 1000 Base-X PCS / SGMII
15
//
16
// Description : (Simulation only)
17
//
18
// Testbench with PCS under test implemented with Altera Transceivers
19
//
20
// 
21
// ALTERA Confidential and Proprietary
22
// Copyright 2007 (c) Altera Corporation
23
// All rights reserved
24
//
25
// -------------------------------------------------------------------------
26
// -------------------------------------------------------------------------
27
 
28
 
29
`timescale 1 ns / 10 ps
30
 
31
 
32
module tb ;
33
 
34
//  Core Settings
35
//  WARNING: DO NOT MODIFY THESE PARAMETERS
36
//  -------------------------------
37
        parameter PHY_IDENTIFIER=32'h00000000;
38
        parameter DEV_VERSION=16'h0b01;
39
        parameter ENABLE_SGMII=1;
40
        parameter SYNCHRONIZER_DEPTH=3;
41
        parameter DEVICE_FAMILY="CYCLONEIVGX";
42
        parameter EXPORT_PWRDN=1;
43
        parameter TRANSCEIVER_OPTION=0;
44
        parameter ENABLE_ALT_RECONFIG=1;
45
        parameter STARTING_CHANNEL_NUMBER=0;
46
 
47
        parameter MAX_CHANNELS=0;
48
 
49
 
50
 
51
//  Simulation Settings (Testbench)
52
//  -------------------------------
53
 
54
parameter TB_TXFRAMES = 5 ; //  number of frames to send in Txs path
55
parameter TB_TXIPG = 12 ; //  Inter Packet Gap used by RX generator
56
parameter TB_LENSTART = 100 ; //  length to start (incremented each new frame by TB_LENSTEP)
57
parameter TB_LENSTEP = 1 ; //  steps the length should increase with each frame
58
parameter TB_LENMAX = 1500 ; //  max. payload length for generation
59
parameter TB_MACLENMAX = 1518; //  max. frame length configuration of MAC
60
parameter TB_PHYERR = 1'b0; //  Generate PHY Error
61
parameter TB_CHAR_ERR = 0; //  Insert 10b Character Error
62
parameter TB_CHAR_ERR_NUM = 6; //  Number of Consecutive Character Error
63
parameter TB_ENA_AUTONEG = 1'b 0 ; //  Enable Auto-Negotiation
64
parameter TB_PCS_LINK_TIMER = 512 ; //  Link Timer
65
parameter TB_PARTNER_LINK_TIMER = 128 ; //  Link Timer
66
parameter TB_TX_ERR = 1'b 0 ; //  Enable GMII Error
67
parameter TB_PARTNER_PS1 = 1'b 1 ; //  Pause Support Encoding
68
parameter TB_PARTNER_PS2 = 1'b 0 ; //  Pause Support Encoding
69
parameter TB_PARTNER_RF1 = 1'b 0 ; //  Remote Fault Encoding
70
parameter TB_PARTNER_RF2 = 1'b 0 ; //  Remote Fault Encoding
71
parameter TB_PCS_PS1 = 1'b 1 ; //  Pause Support Encoding
72
parameter TB_PCS_PS2 = 1'b 0 ; //  Pause Support Encoding
73
parameter TB_PCS_RF1 = 1'b 0 ; //  Remote Fault Encoding
74
parameter TB_PCS_RF2 = 1'b 0 ; //  Remote Fault Encoding
75
parameter TB_ISOLATE = 1'b 0 ; //  Remote Fault Encoding
76
parameter TB_SGMII_ENA = 1'b 0 ; //  Enable SGMII Interface
77
parameter TB_SGMII_AUTO_CONF = 1'b 0 ; //  Enable SGMII Auto-Configuration
78
parameter TB_SGMII_1000 = 1'b 1 ; //  Enable SGMII Gigabit
79
parameter TB_SGMII_100 = 1'b 0 ; //  Enable SGMII 100Mbps
80
parameter TB_SGMII_10 = 1'b 0 ; //  Enable SGMII 10Mbps
81
parameter TB_SGMII_HD = 1'b 0 ; // Enable SGMII Half-Duplex Operation
82
 
83
 
84
 
85
 
86
reg     reset;
87
reg     reset_model = 1'b0;
88
 
89
//  PCS Status
90
//  ----------
91
 
92
wire    led_crs;                //  Carrier Sense
93
wire    led_link;               //  Valid Link
94
wire    hd_ena;                 //  Half-Duplex
95
wire    led_col;                //  Collision
96
wire    led_an;                 //  Auto-Negotiation Status
97
wire    led_char_err;           //  Character Error
98
wire    led_disp_err;           //  Disparity Error
99
wire    set_10;                 //  10Mbps Mode
100
wire    set_100;                //  100Mbps Mode
101
wire    set_1000;               //  1000Mbps Mode
102
 
103
wire    pcs_pwrdn_out;          //  Powerdown Control from pcs         
104
wire    gxb_pwrdn_in;           //  Powerdown Contril to GXB block  
105
 
106
// Reconfig
107
 
108
wire reconfig_clk;
109
wire reconfig_busy;
110
wire [3:0]       reconfig_togxb;
111
 
112
// Receive Recovered Clock
113
 
114
wire rx_recovclkout;
115
 
116
 
117
//  TBI Interface
118
//  -------------
119
 
120
wire    gmii_crs;               //  Carrier Sense           
121
wire    rx_sync;                //  Receiver Synchronized
122
wire    an_restart_rst;         //  Reset Autonegotiation Command        
123
 
124
//  GMII Receive
125
//  ------------
126
 
127
wire    gmii_rx_dv;              //  Enable
128
wire    [7:0] gmii_rx_d;         //  Data
129
wire    gmii_rx_err;             //  Error 
130
 
131
//  MII Receive
132
//  -----------
133
 
134
wire    mii_rx_dv;               //  Enable
135
wire    [3:0] mii_rx_d;          //  Data
136
wire    mii_rx_err;              //  Error 
137
 
138
//  Partner GMII Transmit
139
//  ---------------------
140
 
141
wire    part_gmii_txen;         //  Enable
142
wire    [7:0] part_gmii_txd;    //  Data
143
wire    part_gmii_txerr;        //  Error
144
 
145
//  Partner GMII Receive
146
//  --------------------
147
 
148
wire    part_gmii_rxdv;         //  Enable
149
wire    [7:0] part_gmii_rxd;    //  Data
150
wire    part_gmii_rxerr;        //  Error 
151
 
152
//  GMII Transmit
153
//  -------------
154
 
155
wire    gmii_tx_en;              //  Enable
156
wire    [7:0] gmii_tx_d;         //  Data
157
wire    gmii_tx_err;             //  Error
158
 
159
//  MII Transmit
160
//  ------------
161
 
162
wire    mii_tx_en;               //  Enable
163
wire    mii_txen_tmp;           //  Enable
164
wire    [7:0] mii_txd;          //  Data
165
wire    [3:0] mii_tx_d;          //  Data
166
wire    mii_tx_err;              //  Error
167
wire    mii_txerr_tmp;          //  Error  
168
 
169
//  Clocks
170
//  ------
171
 
172
reg     ref_clk;                //  Reference Clock
173
wire    rx_clk;                 //  GMII / MII Receive Clock 
174
wire    tx_clk;                 //  GMII / MII Transmit Clock       
175
wire    rx_clk_sig;             //  GMII / MII Receive Clock 
176
wire    tx_clk_sig;             //  GMII / MII Transmit Clock 
177
wire    rx_clkena;              //  GMII / MII Receive Clock Enable
178
wire    tx_clkena;              //  GMII / MII Transmit Clock Enable
179
reg     rx_en1;
180
reg     rx_en2;
181
reg     tx_en1;
182
reg     tx_en2;
183
 
184
//  Autonegotiaition Signals
185
//  ------------------------
186
 
187
wire    an_enable;              //  Enable Autonegotiation
188
wire    an_restart;             //  Restart Autonegotiation        
189
wire    [15:0] an_ability;      //  Autonegotiation Ability Register
190
wire    an_done;                //  Autonegotiation Done
191
wire    an_ack;                 //  Acknowledge Indication
192
wire    [20:1] an_link_timer;   //  Link Timer Maximum Value
193
wire    page_receive;           //  Page Receive Indication
194
wire    [15:0] lp_ability;      //  Link Partner Ability Register
195
reg     [15:0] lp_ability_reg;  //  Link Partner Ability Register
196
wire    lp_ability_ena;         //  Link Partner Ability Valid
197
wire    [31:0] link_timer_reg;  //  Link Timer Value         
198
 
199
//  Model Configuration
200
//  -------------------
201
 
202
wire    [47:0] mac_dst;         //  Destination Address
203
wire    [47:0] mac_scr;         //  Source Address
204
wire    mac_reverse;            //  Reverse MAC Address
205
wire    [4:0] prmble_len;       //  Preamble Length
206
wire    [15:0] pquant;          //  Pause Quanta
207
wire    [15:0] vlan_ctl;        //  VLAN control info
208
wire    [15:0] frmtype;         //  if non-null: type field instead length      
209
wire    [7:0] cntstart;         //  payload data counter start (first byte of payload)
210
wire    [7:0] cntstep;          //  payload counter step (2nd byte in paylaod)
211
wire    [15:0] ipg_len;         //  inter packet gap (delay after CRC)                
212
wire    payload_err;            //  generate payload pattern error (last payload byte is wrong)
213
wire    prmbl_err;              //  Insert Preamble Error
214
wire    crc_err;                //  Insert CRC Error
215
wire    vlan_en;                //  Generate VLAN Frame
216
wire    pause_gen;              //  Generate Pause Frame
217
wire    pad_en;                 //  Pad Short Frames
218
wire    phy_err;                //  Insert GMII Error
219
wire    end_err;                //  keep rx_dv high one cycle after end of frame
220
wire    data_only;              //  if set omits preamble, padding, CRC
221
reg     [15:0] tx_len;          //  Length of payload
222
integer tx_len_tmp;
223
 
224
//  Register Interface
225
//  ------------------
226
 
227
reg     reg_clk;                        //  25MHz Host Interface Clock
228
reg     reg_rd;                         //  Register Read Strobe
229
reg     reg_wr;                         //  Register Write Strobe
230
reg     [4:0] reg_addr;                 //  Register Address
231
reg     [15:0] reg_data_in;             //  Write Data for Host Bus
232
wire    [15:0] reg_data_out;            //  Read Data to Host Bus
233
wire    reg_busy;                       //  Interface Busy
234
reg     reg_busy_reg;                   //  Interface Busy
235
 
236
//  Simulation Control
237
//  ------------------
238
 
239
reg     frm_gen_ena_gmii;       //  Enable Frame Genaration
240
reg     frm_gen_ena_mii;        //  Enable Frame Genaration
241
wire    frm_gen_done;           //  Frame Generation Done
242
wire    tx_sop_gmii;            //  Start of Generated Frame 
243
wire    tx_sop_mii;             //  Start of Generated Frame 
244
wire    frm_rcv_gmii;           //  Frame Receive
245
wire    frm_rcv_mii;            //  Frame Receive
246
wire    rx_crc_err_gmii;        //  CRC Error
247
wire    rx_crc_err_mii;         //  CRC Error
248
wire    rx_preamble_err;        //  Preamble Error
249
wire    rx_data_err;            //  Data Error
250
wire    rx_payload_vld;         //  Payload Valid
251
wire    rx_payload_vld_gmii;    //  Payload Valid
252
wire    rx_payload_vld_mii;     //  Payload Valid
253
integer end_cnt;                //  End of Simulation Pause
254
wire    [47:0] rx_dst;          //  Received Destination MAC address
255
wire    [47:0] rx_src;          //  Received Source MAC address
256
wire    [47:0] rx_dst_gmii;     //  Received Destination MAC address
257
wire    [47:0] rx_src_gmii;     //  Received Source MAC address
258
wire    [47:0] rx_dst_mii;      //  Received Destination MAC address
259
wire    [47:0] rx_src_mii;      //  Received Source MAC address
260
wire    rx_frm_err_mii;         //  Errored Frame Indication
261
wire    rx_frm_err_gmii;        //  Errored Frame Indication
262
reg     sim_start;              //  when to start simulation
263
 
264
//  Event Counters
265
//  --------------
266
 
267
integer tx_frm_cnt;             //  Number of Transmitted Frames
268
integer tx_gmii_err_cnt;        //  Number of GMII Error
269
integer rx_frm_cnt;             //  Number of Received Frames
270
integer rx_crc_err_cnt;         //  Number of CRC Error
271
integer rx_pbl_err_cnt;         //  Number of Premable Error
272
integer rx_dst_err_cnt;         //  Number of MAC Destination Address Error
273
integer rx_src_err_cnt;         //  Number of MAC Source Address Error
274
integer rx_gmii_err_cnt;        //  Number of GMII Error
275
 
276
//  Simulation Control
277
//  ------------------
278
 
279
parameter stm_typ_idle = 0;
280
parameter stm_typ_read_ver = 1;
281
parameter stm_typ_wr_scratch = 2;
282
parameter stm_typ_rd_scratch = 3;
283
parameter stm_typ_read_phy_control = 4;
284
parameter stm_typ_read_sync_status = 5;
285
parameter stm_typ_prog_ability = 6;
286
parameter stm_typ_prog_timer_1 = 7;
287
parameter stm_typ_prog_timer_2 = 8;
288
parameter stm_typ_autoneg_enable = 9;
289
parameter stm_typ_start_autoneg = 10;
290
parameter stm_typ_wait_autoneg = 11;
291
parameter stm_typ_read_autoneg_expansion = 12;
292
parameter stm_typ_read_autoneg_status = 13;
293
parameter stm_typ_read_part_ability = 14;
294
parameter stm_typ_wait_link = 15;
295
parameter stm_typ_sim = 16;
296
parameter stm_typ_stop_tbi = 17;
297
parameter stm_typ_start_tbi = 18;
298
parameter stm_typ_read_status = 19;
299
parameter stm_typ_read_status_2 = 20;
300
parameter stm_typ_ena_sw_reset = 21;
301
parameter stm_typ_read_sw_reset = 22;
302
parameter stm_typ_ena_isolate = 23;
303
parameter stm_typ_disable_isolate = 24;
304
parameter stm_typ_end_sim = 25;
305
parameter stm_typ_autoneg_disable = 26;
306
parameter stm_typ_if_control = 27;
307
 
308
reg     [4:0] state;
309
reg     [4:0] nextstate;
310
wire    gnd;
311
wire    vcc;
312
wire    mdio_wire;
313
 
314
 
315
 
316
// register write/read test
317
//
318
 
319
reg [15:0] readback_scratch;
320
 
321
integer register_test;
322
 
323
assign gxb_pwrdn_in = 1'b 0;
324
assign reconfig_clk = ref_clk;
325
assign reconfig_busy = 1'b0;
326
assign reconfig_togxb = "0010";
327
 
328
 
329
assign gnd = 1'b 0;
330
assign vcc = 1'b 1;
331
 
332
//  Reset Control and start simulation
333
//  ----------------------------------
334
 
335
initial
336
begin
337
 
338
        $display("\n - ---------------------------------------------------------------------------------------- -") ;
339
        $display("\n -- Testbench for 1000Base-X PCS with SGMII + PMA --") ;
340
        $display(" --    (c) ALTERA CORPORATION 2007  --") ;
341
        $display("\n - ---------------------------------------------------------------------------------------- -\n") ;
342
 
343
 
344
        reset       <=1'b0 ;
345
        sim_start   <=1'b0 ;
346
        #(50)
347
        reset       <=1'b1 ;
348
        #(2000) ;
349
        reset<=1'b0 ;
350
        #(3000) ;
351
        sim_start   <=1'b1 ;
352
 
353
end
354
 
355
 
356
// Clock generation for Gigabit and 10/100 operations
357
always @(posedge reset or posedge rx_clk)
358
   begin
359
           if (reset == 1'b1) begin
360
           rx_en1 <= 1'b0;
361
           rx_en2 <= 1'b0;
362
           end
363
           else begin
364
                    rx_en1 <= rx_clkena;
365
                        rx_en2 <= rx_en1;
366
           end
367
   end
368
 
369
always @(posedge reset or posedge tx_clk)
370
   begin
371
           if (reset == 1'b1) begin
372
           tx_en1 <= 1'b0;
373
           tx_en2 <= 1'b0;
374
           end
375
           else begin
376
                    tx_en1 <= tx_clkena;
377
                        tx_en2 <= tx_en1;
378
           end
379
   end
380
 
381
// For testbench purposes, the clock enable of the 125MHz clock is used to mimic the 2.5/25MHz clock with a short duty cycle . 
382
assign rx_clk_sig = (ENABLE_SGMII == 0)|(rx_en1 == 1'b1 && rx_en2 == 1'b1) ? rx_clk : rx_clkena;
383
assign tx_clk_sig = (ENABLE_SGMII == 0)|(tx_en1 == 1'b1 && tx_en2 == 1'b1) ? tx_clk : tx_clkena;
384
 
385
 
386
        sgmii dut (
387
         .gmii_rx_d(gmii_rx_d),
388
         .gmii_rx_dv(gmii_rx_dv),
389
         .gmii_rx_err(gmii_rx_err),
390
         .gmii_tx_d(gmii_tx_d),
391
         .gmii_tx_en(gmii_tx_en),
392
         .gmii_tx_err(gmii_tx_err),
393
         .tx_clk(tx_clk),
394
         .rx_clk(rx_clk),
395
         .mii_rx_d(mii_rx_d),
396
         .mii_rx_dv(mii_rx_dv),
397
         .mii_rx_err(mii_rx_err),
398
         .mii_tx_d(mii_tx_d),
399
         .mii_tx_en(mii_tx_en),
400
         .mii_tx_err(mii_tx_err),
401
         .mii_col(),
402
         .mii_crs(),
403
         .set_10(),
404
         .set_100(set_100),
405
         .set_1000(),
406
         .hd_ena(hd_ena),
407
         .reset_tx_clk(reset),
408
         .reset_rx_clk(reset),
409
         .led_col(),
410
         .led_crs(led_crs),
411
         .led_an(led_an),
412
         .tx_clkena(tx_clkena),
413
         .rx_clkena(rx_clkena),
414
         .rx_recovclkout(rx_recovclkout),
415
         .address(reg_addr),
416
         .readdata(reg_data_out),
417
         .read(reg_rd),
418
         .writedata(reg_data_in),
419
         .write(reg_wr),
420
         .waitrequest(reg_busy),
421
         .clk(reg_clk),
422
         .reset(reset),
423
         .txp(txp),
424
         .rxp(rxp),
425
         .ref_clk(ref_clk),
426
         .gxb_pwrdn_in(gxb_pwrdn_in),
427
         .pcs_pwrdn_out(pcs_pwrdn_out),
428
         .reconfig_clk(reconfig_clk),
429
         .reconfig_togxb(reconfig_togxb),
430
         .reconfig_fromgxb(reconfig_fromgxb),
431
         .reconfig_busy(reconfig_busy),
432
         .led_char_err(led_char_err),
433
         .led_link(led_link),
434
         .led_disp_err(led_disp_err),
435
         .gxb_cal_blk_clk(ref_clk)
436
        );
437
 
438
 
439
assign rxp = txp;
440
assign mii_tx_d = mii_txd[3:0] ;
441
 
442
//  Clocks
443
//  ------
444
 
445
always
446
   begin : process_2
447
   ref_clk <= 1'b 1;
448
   #(4);
449
   ref_clk <= 1'b 0;
450
   #(4);
451
   end
452
 
453
always
454
   begin : process_3
455
   reg_clk <= 1'b 1;
456
   #(20);
457
   reg_clk <= 1'b 0;
458
   #(20);
459
   end
460
 
461
always @(posedge reset or posedge reg_clk)
462
   begin : process_5
463
 
464
   if (reset==1'b1)
465
   begin
466
 
467
        reg_wr <= #(2)1'b 0;
468
        reg_rd <= #(2)1'b 0;
469
        reg_addr <= #(2) {5{1'b 0}};
470
        reg_data_in <= #(2)  {16{1'b 0}};
471
 
472
   end
473
 
474
   else if (nextstate == stm_typ_read_ver)
475
      begin
476
      reg_addr  <= 5'b 10001;
477
      reg_rd  <= 1'b 1;
478
      reg_wr <= 1'b 0;
479
      reg_data_in   <= 16'h 0000;
480
      end
481
   else if (nextstate == stm_typ_if_control )
482
      begin
483
      reg_addr  <= 5'b 10100;
484
      reg_rd    <= 1'b 0;
485
      reg_wr    <= 1'b 1;
486
 
487
       if (TB_SGMII_ENA==1'b1)
488
       begin
489
 
490
        reg_data_in[0] <= 1'b1;
491
 
492
       end
493
       else
494
       begin
495
 
496
        reg_data_in[0] <= 1'b0;
497
 
498
       end
499
 
500
       if (TB_SGMII_AUTO_CONF==1'b1)
501
       begin
502
 
503
        reg_data_in[1] <= 1'b1;
504
 
505
       end
506
       else
507
       begin
508
 
509
        reg_data_in[1] <= 1'b0;
510
 
511
       end
512
 
513
       if (TB_SGMII_AUTO_CONF==1'b1)
514
       begin
515
 
516
        reg_data_in[3:2] <= 2'b00;
517
 
518
       end
519
       else if (TB_SGMII_1000==1'b1)
520
       begin
521
 
522
        reg_data_in[3:2] <= 2'b10;
523
 
524
       end
525
       else if (TB_SGMII_100==1'b1)
526
       begin
527
 
528
        reg_data_in[3:2] <= 2'b01;
529
 
530
       end
531
       else
532
       begin
533
 
534
        reg_data_in[3:2] <= 2'b00;
535
 
536
       end
537
 
538
       if (TB_SGMII_HD==1'b1)
539
       begin
540
 
541
                reg_data_in[4] <= 1'b1;
542
 
543
       end
544
       else
545
       begin
546
 
547
                reg_data_in[4] <= 1'b0;
548
 
549
       end
550
 
551
      reg_data_in[15:5]   <= 0;
552
      end
553
   else if (nextstate == stm_typ_wr_scratch )
554
      begin
555
      reg_addr  <= 5'b 10000;
556
      reg_rd  <= 1'b 0;
557
      reg_wr <= 1'b 1;
558
      reg_data_in   <= 16'h AAAA;
559
      end
560
   else if (nextstate == stm_typ_rd_scratch )
561
      begin
562
      reg_addr  <= 5'b 10000;
563
      reg_rd  <= 1'b 1;
564
      reg_wr <= 1'b 0;
565
      reg_data_in   <= 16'h 0;
566
      end
567
   else if (nextstate == stm_typ_read_sync_status | nextstate == stm_typ_read_status |
568
      nextstate == stm_typ_read_status_2 )
569
      begin
570
      reg_addr  <= 5'b 00001;
571
      reg_rd  <= 1'b 1;
572
      reg_wr <= 1'b 0;
573
      reg_data_in   <= 16'h 0;
574
      end
575
   else if (nextstate == stm_typ_read_phy_control )
576
      begin
577
      reg_addr  <= 5'b 00000;
578
      reg_rd  <= 1'b 1;
579
      reg_wr <= 1'b 0;
580
      reg_data_in   <= 16'h 0;
581
      end
582
   else if (nextstate == stm_typ_prog_ability )
583
      begin
584
      reg_addr     <= 5'b 00100;
585
      reg_rd     <= 1'b 0;
586
      reg_wr    <= 1'b 1;
587
      reg_data_in[4:0] <= {5{1'b 0}};
588
      reg_data_in[5]   <= 1'b 1;
589
      reg_data_in[6]   <= 1'b 0;
590
      if (TB_PCS_PS1)
591
         begin
592
         reg_data_in[7] <= 1'b 1;
593
         end
594
      else
595
         begin
596
         reg_data_in[7] <= 1'b 0;
597
         end
598
      if (TB_PCS_PS2)
599
         begin
600
         reg_data_in[8] <= 1'b 1;
601
         end
602
      else
603
         begin
604
         reg_data_in[8] <= 1'b 0;
605
         end
606
      reg_data_in[11:9] <= {3{1'b 0}};
607
      if (TB_PCS_RF1)
608
         begin
609
         reg_data_in[12] <= 1'b 1;
610
         end
611
      else
612
         begin
613
         reg_data_in[12] <= 1'b 0;
614
         end
615
      if (TB_PCS_RF2)
616
         begin
617
         reg_data_in[13] <= 1'b 1;
618
         end
619
      else
620
         begin
621
         reg_data_in[13] <= 1'b 0;
622
         end
623
      reg_data_in[15:14] <= {2{1'b 0}};
624
      end
625
   else if (nextstate == stm_typ_prog_timer_1 )
626
      begin
627
      reg_addr <= 5'b 10010;
628
      reg_rd <= 1'b 0;
629
      reg_wr <= 1'b 1;
630
      reg_data_in <= link_timer_reg[15:0];
631
      end
632
   else if (nextstate == stm_typ_prog_timer_2 )
633
      begin
634
      reg_addr  <= 5'b 10011;
635
      reg_rd  <= 1'b 0;
636
      reg_wr <= 1'b 1;
637
      reg_data_in   <= link_timer_reg[31:16];
638
      end
639
   else if (nextstate == stm_typ_autoneg_enable )
640
      begin
641
      reg_addr  <= 5'b 00000;
642
      reg_rd  <= 1'b 0;
643
      reg_wr <= 1'b 1;
644
      reg_data_in   <= 16'b 0001000000100000;
645
      end
646
   else if (nextstate == stm_typ_autoneg_disable )
647
      begin
648
      reg_addr  <= 5'b 00000;
649
      reg_rd  <= 1'b 0;
650
      reg_wr <= 1'b 1;
651
      reg_data_in   <= 16'b 000001000100000;
652
      end
653
   else if (nextstate == stm_typ_start_autoneg )
654
      begin
655
      reg_addr  <= 5'b 00000;
656
      reg_rd  <= 1'b 0;
657
      reg_wr <= 1'b 1;
658
      reg_data_in   <= 16'b 001001000100000;
659
      end
660
   else if (nextstate == stm_typ_read_part_ability )
661
      begin
662
      reg_addr  <= 5'b 00101;
663
      reg_rd  <= 1'b 1;
664
      reg_wr <= 1'b 0;
665
      reg_data_in   <= 16'h 0;
666
      end
667
   else if (nextstate == stm_typ_read_autoneg_status )
668
      begin
669
      reg_addr  <= 5'b 00001;
670
      reg_rd  <= 1'b 1;
671
      reg_wr <= 1'b 0;
672
      reg_data_in   <= 16'h 0;
673
      end
674
   else if (nextstate == stm_typ_read_autoneg_expansion )
675
      begin
676
      reg_addr  <= 5'b 00110;
677
      reg_rd  <= 1'b 1;
678
      reg_wr <= 1'b 0;
679
      reg_data_in   <= 16'h 0;
680
      end
681
   else if (nextstate == stm_typ_ena_sw_reset )
682
      begin
683
      reg_addr  <= 5'b 00000;
684
      reg_rd  <= 1'b 0;
685
      reg_wr <= 1'b 1;
686
      reg_data_in   <= 16'h 0;
687
      end
688
   else if (nextstate == stm_typ_read_sw_reset )
689
      begin
690
      reg_addr  <= 5'b 00000;
691
      reg_rd  <= 1'b 1;
692
      reg_wr <= 1'b 0;
693
      reg_data_in   <= 16'h 0;
694
      end
695
   else if (nextstate == stm_typ_ena_isolate )
696
      begin
697
      reg_addr  <= 5'b 00000;
698
      reg_rd  <= 1'b 0;
699
      reg_wr <= 1'b 1;
700
      reg_data_in   <= 16'h 0;
701
      end
702
   else if (nextstate == stm_typ_disable_isolate )
703
      begin
704
      reg_addr  <= 5'b 00000;
705
      reg_rd  <= 1'b 0;
706
      reg_wr <= 1'b 1;
707
      reg_data_in   <= 16'h 0;
708
      end
709
   else
710
      begin
711
      reg_addr  <= 5'b 00000;
712
      reg_rd  <= 1'b 0;
713
      reg_wr <= 1'b 0;
714
      reg_data_in   <= 16'h 0;
715
      end
716
   end
717
 
718
 
719
always @(led_link)
720
   begin : process_11
721
   if (led_link == 1'b 1)
722
   begin
723
 
724
        $display("  - Link Acquired\n:") ;
725
 
726
   end
727
   else if (led_link == 1'b 0 & $time>10)
728
   begin
729
 
730
        $display("  - Link Lost\n:") ;
731
 
732
   end
733
 
734
end
735
 
736
//  Ethernet Frame Generator Configuration
737
//  --------------------------------------
738
 
739
assign mac_dst          = 48'h AABBCCDDEEFF;
740
assign mac_scr          = 48'h 112233445566;
741
assign prmble_len       = 5'b 01000;
742
assign pquant           = 16'h 0000;
743
assign vlan_ctl         = 16'h 0000;
744
assign frmtype          = 16'h 0000;
745
assign cntstart         = 2'b 10;
746
assign cntstep          = 1'b 1;
747
assign ipg_len          = TB_TXIPG;
748
assign payload_err      = 1'b 0;
749
assign prmbl_err        = 1'b 0;
750
assign crc_err          = 1'b 0;
751
assign vlan_en          = 1'b 0;
752
assign pause_gen        = 1'b 0;
753
assign pad_en           = 1'b 1;
754
assign phy_err          = tx_frm_cnt % 10 == 5 & TB_TX_ERR ? 1'b 1 : 1'b 0;
755
assign end_err          = 1'b 0;
756
assign data_only        = 1'b 0;
757
assign mac_reverse      = 1'b 0;
758
 
759
assign mii_tx_en  = (led_link==1'b1) ? mii_txen_tmp  : 1'b0 ;
760
assign mii_tx_err = (led_link==1'b1) ? mii_txerr_tmp : 1'b0 ;
761
 
762
ethgenerator2 #(4) U_FRM_GEN2 (
763
 
764
          .reset(reset),
765
          .rx_clk(tx_clk_sig),
766
          .rxd(mii_txd),
767
          .rx_dv(mii_txen_tmp),
768
          .rx_er(mii_txerr_tmp),
769
          .sop(tx_sop_mii),
770
          .eop(),
771
          .ethernet_speed(1'b0),
772
          .carrier_sense(1'b0),
773
          .false_carrier(1'b0),
774
          .carrier_extend(1'b0),
775
          .carrier_extend_error(1'b0),
776
          .mii_mode(1'b1),
777
          .rgmii_mode(1'b0),
778
          .mac_reverse(mac_reverse),
779
          .dst(mac_dst),
780
          .src(mac_scr),
781
          .prmble_len(prmble_len),
782
          .pquant(pquant),
783
          .vlan_ctl(vlan_ctl),
784
          .len(tx_len),
785
          .frmtype(frmtype),
786
          .cntstart(cntstart),
787
          .cntstep(cntstep),
788
          .ipg_len(ipg_len),
789
          .payload_err(payload_err),
790
          .prmbl_err(prmbl_err),
791
          .crc_err(crc_err),
792
          .vlan_en(1'b0),
793
          .stack_vlan(1'b0),
794
          .pause_gen(pause_gen),
795
          .pad_en(pad_en),
796
          .phy_err(phy_err),
797
          .end_err(end_err),
798
          .data_only(data_only),
799
          .start(frm_gen_ena_mii),
800
          .done(frm_gen_done_mii));
801
 
802
ethgenerator #(4) U_FRM_GEN (
803
 
804
          .reset(reset),
805
          .rx_clk(tx_clk_sig),
806
          .rxd(gmii_tx_d),
807
          .enable(1'b1),
808
          .carrier_sense(1'b0),
809
          .false_carrier(1'b0),
810
          .carrier_extend(1'b0),
811
          .carrier_extend_error(1'b0),
812
          .rx_dv(gmii_tx_en),
813
          .rx_er(gmii_tx_err),
814
          .sop(tx_sop_gmii),
815
          .eop(),
816
          .mac_reverse(mac_reverse),
817
          .dst(mac_dst),
818
          .src(mac_scr),
819
          .prmble_len(prmble_len),
820
          .pquant(pquant),
821
          .vlan_ctl(vlan_ctl),
822
          .len(tx_len),
823
          .frmtype(frmtype),
824
          .cntstart(cntstart),
825
          .cntstep(cntstep),
826
          .ipg_len(ipg_len),
827
          .payload_err(payload_err),
828
          .prmbl_err(prmbl_err),
829
          .crc_err(crc_err),
830
          .vlan_en(1'b0),
831
          .pause_gen(pause_gen),
832
          .pad_en(pad_en),
833
          .phy_err(phy_err),
834
          .end_err(end_err),
835
          .data_only(data_only),
836
          .stack_vlan(1'b0),
837
          .runt_gen(1'b 0),
838
          .long_pause(1'b 0),
839
          .start(frm_gen_ena_gmii),
840
          .done(frm_gen_done_gmii));
841
 
842
always @(posedge reset or posedge tx_clk_sig)
843
   begin : process_13
844
   if (reset == 1'b 1)
845
      begin
846
      frm_gen_ena_gmii <= 1'b 0;
847
      frm_gen_ena_mii  <= 1'b 0;
848
      end
849
   else
850
      begin
851
 
852
        if ((TB_SGMII_ENA==1'b0)|(TB_SGMII_ENA==1'b1 & TB_SGMII_1000==1'b1))
853
        begin
854
 
855
                frm_gen_ena_mii <= 1'b 0;
856
 
857
                if (tx_frm_cnt >= TB_TXFRAMES)
858
                begin
859
                        frm_gen_ena_gmii <= 1'b 0;
860
                end
861
                else if (state == stm_typ_sim & (tx_frm_cnt < TB_TXFRAMES) )
862
                begin
863
                        frm_gen_ena_gmii <= #200 1'b 1;
864
                end
865
 
866
        end
867
        else
868
        begin
869
 
870
                frm_gen_ena_gmii <= 1'b 0;
871
 
872
                if (tx_frm_cnt >= TB_TXFRAMES)
873
                begin
874
                        frm_gen_ena_mii <= 1'b 0;
875
                end
876
                else if (state == stm_typ_sim & (tx_frm_cnt < TB_TXFRAMES) )
877
                begin
878
                        frm_gen_ena_mii <= #20 1'b 1;
879
                end
880
 
881
        end
882
 
883
      end
884
   end
885
 
886
//  Frame Length
887
//  ------------
888
 
889
//  Ethernet Generator Enable / Disable
890
//  -----------------------------------
891
 
892
always @(posedge reset or posedge tx_clk_sig)
893
   begin : process_14
894
   if (reset == 1'b 1)
895
      begin
896
      tx_len     <= TB_LENSTART;
897
      tx_len_tmp = 0 ;
898
      end
899
   else
900
      begin
901
 
902
      tx_len_tmp = tx_len + TB_LENSTEP ;
903
 
904
      if (tx_sop_gmii == 1'b 1 | tx_sop_mii == 1'b1)
905
         begin
906
         if (tx_len_tmp <= 46)
907
            begin
908
            tx_len <= TB_LENMAX;
909
            end
910
         else if (tx_len_tmp >= TB_MACLENMAX)
911
            begin
912
            tx_len <= TB_LENSTART;
913
            end
914
         else
915
            begin
916
            tx_len <= tx_len_tmp;
917
            end
918
         end
919
      end
920
   end
921
 
922
//  Transmit Frame Counter                     
923
//  ----------------------             
924
 
925
always @(posedge reset or posedge tx_clk_sig)
926
   begin : process_15
927
   if (reset == 1'b 1)
928
      begin
929
      tx_frm_cnt <= 0;
930
      end
931
   else
932
      begin
933
      if (tx_sop_gmii == 1'b 1 | tx_sop_mii == 1'b1)
934
         begin
935
         tx_frm_cnt <= tx_frm_cnt + 1'b 1;
936
         end
937
      end
938
   end
939
 
940
always @(posedge reset or posedge tx_clk_sig)
941
   begin : process_16
942
   if (reset == 1'b 1)
943
      begin
944
      tx_gmii_err_cnt <= 0;
945
      end
946
   else
947
      begin
948
      if ((tx_sop_gmii == 1'b 1 | tx_sop_mii == 1'b1) & phy_err == 1'b 1)
949
         begin
950
         tx_gmii_err_cnt <= tx_gmii_err_cnt + 1'b 1;
951
         end
952
      end
953
   end
954
 
955
//  Receive Model
956
//  -------------
957
 
958
ethmonitor2 U_MON2 (
959
 
960
          .reset(reset),
961
          .tx_clk(rx_clk_sig),
962
          .txd({4'b0, mii_rx_d}),
963
          .tx_dv(mii_rx_dv),
964
          .tx_er(mii_rx_err),
965
          .tx_sop(1'b 0),
966
          .tx_eop(1'b 0),
967
          .ethernet_speed(1'b0),
968
          .mii_mode(1'b1),
969
          .rgmii_mode(1'b0),
970
          .dst(rx_dst_mii),
971
          .src(rx_src_mii),
972
          .prmble_len(),
973
          .pquant(),
974
          .vlan_ctl(),
975
          .len(),
976
          .frmtype(),
977
          .payload(),
978
          .payload_vld(rx_payload_vld_mii),
979
          .is_vlan(),
980
          .is_pause(),
981
          .crc_err(rx_crc_err_mii),
982
          .prmbl_err(rx_preamble_err),
983
          .len_err(),
984
          .payload_err(rx_data_err),
985
          .frame_err(),
986
          .pause_op_err(),
987
          .pause_dst_err(),
988
          .mac_err(rx_frm_err_gmii),
989
          .end_err(),
990
          .jumbo_en(1'b 1),
991
          .data_only(1'b 0),
992
          .is_stack_vlan(),
993
          .frm_rcvd(frm_rcv_mii));
994
 
995
ethmonitor U_MON (
996
 
997
          .reset(reset),
998
          .tx_clk(rx_clk_sig),
999
          .txd(gmii_rx_d),
1000
          .tx_dv(gmii_rx_dv),
1001
          .tx_er(gmii_rx_err),
1002
          .tx_sop(1'b 0),
1003
          .tx_eop(1'b 0),
1004
          .dst(rx_dst_gmii),
1005
          .src(rx_src_gmii),
1006
          .prmble_len(),
1007
          .pquant(),
1008
          .vlan_ctl(),
1009
          .len(),
1010
          .frmtype(),
1011
          .payload(),
1012
          .payload_vld(rx_payload_vld_gmii),
1013
          .is_vlan(),
1014
          .is_pause(),
1015
          .crc_err(rx_crc_err_gmii),
1016
          .prmbl_err(rx_preamble_err),
1017
          .len_err(),
1018
          .payload_err(rx_data_err),
1019
          .frame_err(),
1020
          .pause_op_err(),
1021
          .pause_dst_err(),
1022
          .mac_err(rx_frm_err_mii),
1023
          .end_err(),
1024
          .jumbo_en(1'b 1),
1025
          .data_only(1'b 0),
1026
          .is_stack_vlan(),
1027
          .frm_rcvd(frm_rcv_gmii));
1028
 
1029
assign rx_dst         = ((TB_SGMII_ENA==1'b0) | (TB_SGMII_ENA==1'b1 & TB_SGMII_1000==1'b1)) ? rx_dst_gmii         : rx_dst_mii ;
1030
assign rx_src         = ((TB_SGMII_ENA==1'b0) | (TB_SGMII_ENA==1'b1 & TB_SGMII_1000==1'b1)) ? rx_src_gmii         : rx_src_mii ;
1031
assign rx_payload_vld = ((TB_SGMII_ENA==1'b0) | (TB_SGMII_ENA==1'b1 & TB_SGMII_1000==1'b1)) ? rx_payload_vld_gmii : rx_payload_vld_mii ;
1032
 
1033
always @(posedge reset or posedge rx_clk_sig)
1034
   begin : process_17
1035
   if (reset == 1'b 1)
1036
      begin
1037
      rx_frm_cnt      <= 0;
1038
      rx_crc_err_cnt  <= 0;
1039
      rx_pbl_err_cnt  <= 0;
1040
      rx_gmii_err_cnt <= 0;
1041
      rx_src_err_cnt  <= 0;
1042
      rx_dst_err_cnt  <= 0;
1043
      end
1044
   else
1045
      begin
1046
 
1047
   //  Number of Frames Received
1048
   //  -------------------------
1049
 
1050
      if ((frm_rcv_gmii == 1'b 1 | frm_rcv_mii == 1'b 1)&tx_frm_cnt>0)
1051
         begin
1052
         rx_frm_cnt <= rx_frm_cnt + 1'b 1;
1053
         end
1054
 
1055
   //  Number of CRC Errors
1056
   //  --------------------
1057
 
1058
      if (TB_SGMII_1000==1'b1 | (TB_SGMII_ENA==1'b0))
1059
      begin
1060
 
1061
                if (frm_rcv_gmii == 1'b 1 & rx_crc_err_gmii == 1'b 1 & rx_frm_err_gmii == 1'b 0)
1062
                begin
1063
                        rx_crc_err_cnt <= rx_crc_err_cnt + 1'b 1;
1064
 
1065
                        $display(" - GMII Rx: CRC Error on Frame\n:") ;
1066
 
1067
                end
1068
 
1069
      end
1070
      else
1071
      begin
1072
 
1073
                if (frm_rcv_mii == 1'b 1 & rx_crc_err_mii == 1'b 1 & rx_frm_err_mii == 1'b 0 & rx_frm_cnt>0)
1074
                begin
1075
                        rx_crc_err_cnt <= rx_crc_err_cnt + 1'b 1;
1076
 
1077
                        $display(" - MII Rx: CRC Error on Frame\n:") ;
1078
 
1079
                end
1080
 
1081
      end
1082
 
1083
   //  Number of GMII Errors
1084
   //  ---------------------
1085
 
1086
      if ((frm_rcv_gmii == 1'b 1 | frm_rcv_mii == 1'b 1) & (rx_frm_err_mii == 1'b 1 | rx_frm_err_gmii == 1'b1) & rx_frm_cnt>0)
1087
         begin
1088
         rx_gmii_err_cnt <= rx_gmii_err_cnt + 1'b 1;
1089
 
1090
         $display(" - MII / GMII Rx: GMII Error on Frame\n:") ;
1091
 
1092
         end
1093
 
1094
   //  Number of Preamble Errors
1095
   //  -------------------------
1096
 
1097
      if (rx_preamble_err == 1'b 1)
1098
         begin
1099
         rx_pbl_err_cnt <= rx_pbl_err_cnt + 1'b 1;
1100
 
1101
         $display(" - MII / GMII Rx: Preamble Error on Frame\n:") ;
1102
 
1103
         end
1104
 
1105
   //  Number of Source MAC Address Errors
1106
   //  -----------------------------------
1107
 
1108
      if ((frm_rcv_gmii == 1'b 1 | frm_rcv_mii == 1'b 1) & rx_src != mac_scr & (rx_frm_err_mii == 1'b0 & rx_frm_err_gmii==1'b0) &
1109
           TB_SGMII_10==1'b0 & tx_frm_cnt>0)
1110
         begin
1111
         rx_src_err_cnt <= rx_src_err_cnt + 1'b 1;
1112
 
1113
         $display(" - MII / GMII Rx: Wrong Source MAC Address on Frame\n:") ;
1114
 
1115
         end
1116
 
1117
   //  Number of Source MAC Address Errors
1118
   //  -----------------------------------
1119
 
1120
      if ((frm_rcv_gmii == 1'b 1 | frm_rcv_mii == 1'b 1) & rx_dst != mac_dst & (rx_frm_err_mii == 1'b 0 & rx_frm_err_gmii == 1'b0) &
1121
           TB_SGMII_10==1'b0 & tx_frm_cnt>0)
1122
         begin
1123
         rx_dst_err_cnt <= rx_dst_err_cnt + 1'b 1;
1124
 
1125
         $display(" - MII / GMII Rx: Wrong Destination MAC Address on Frame\n:") ;
1126
 
1127
         end
1128
 
1129
   //  Data Error
1130
   //  ----------
1131
 
1132
      if (rx_data_err == 1'b 1 & rx_payload_vld == 1'b 1)
1133
         begin
1134
 
1135
                $display(" - GMII Rx: Data Error on Frame\n:") ;
1136
 
1137
         end
1138
 
1139
      end
1140
   end
1141
 
1142
//  Simulation Control
1143
//  ------------------
1144
 
1145
always@(posedge reset or posedge reg_clk)
1146
begin
1147
 
1148
        if (reset==1'b1)
1149
        begin
1150
 
1151
                reg_busy_reg <= 1'b0 ;
1152
 
1153
        end
1154
        else
1155
 
1156
                reg_busy_reg <= reg_busy ;
1157
 
1158
        end
1159
 
1160
always @(posedge reset or posedge reg_clk)
1161
   begin : process_18
1162
   if (reset == 1'b 1)
1163
      begin
1164
      state <= stm_typ_idle;
1165
      end
1166
   else
1167
      begin
1168
      state <= nextstate;
1169
      end
1170
   end
1171
 
1172
always @(state or sim_start or reg_busy_reg or reg_busy or an_done or led_link or rx_frm_cnt or end_cnt or led_an)
1173
   begin : process_19
1174
   case (state)
1175
   stm_typ_idle:
1176
      begin
1177
      if (sim_start==1'b1)
1178
      begin
1179
      nextstate <= stm_typ_read_ver;
1180
      end
1181
      else
1182
       begin
1183
         nextstate   <= stm_typ_idle ;
1184
      end
1185
      end
1186
   stm_typ_read_ver:
1187
      begin
1188
      if (reg_busy == 1'b 0 && reg_busy_reg == 1'b1)
1189
         begin
1190
         nextstate <= stm_typ_wr_scratch;
1191
         end
1192
      else
1193
         begin
1194
         nextstate <= stm_typ_read_ver;
1195
         end
1196
      end
1197
   stm_typ_wr_scratch:
1198
      begin
1199
      if (reg_busy == 1'b 0 && reg_busy_reg == 1'b1)
1200
         begin
1201
         nextstate <= stm_typ_rd_scratch;
1202
         end
1203
      else
1204
         begin
1205
         nextstate <= stm_typ_wr_scratch;
1206
         end
1207
      end
1208
   stm_typ_rd_scratch:
1209
      begin
1210
      if (reg_busy == 1'b 0 && reg_busy_reg == 1'b1)
1211
         begin
1212
         nextstate <= stm_typ_if_control;
1213
         end
1214
      else
1215
         begin
1216
         nextstate <= stm_typ_rd_scratch;
1217
         end
1218
      end
1219
   stm_typ_if_control:
1220
      begin
1221
      if (reg_busy == 1'b 0 && reg_busy_reg == 1'b1)
1222
         begin
1223
 
1224
                nextstate <= stm_typ_wait_link;
1225
 
1226
         end
1227
      else
1228
         begin
1229
         nextstate <= stm_typ_if_control;
1230
         end
1231
      end
1232
   stm_typ_wait_link:
1233
      begin
1234
      if (led_link == 1'b 1)
1235
         begin
1236
         nextstate <= stm_typ_read_phy_control;
1237
         end
1238
      else
1239
         begin
1240
         nextstate <= stm_typ_wait_link;
1241
         end
1242
      end
1243
   stm_typ_read_phy_control:
1244
      begin
1245
      if (reg_busy == 1'b 0 && reg_busy_reg == 1'b1)
1246
         begin
1247
         nextstate <= stm_typ_read_sync_status;
1248
         end
1249
      else
1250
         begin
1251
         nextstate <= stm_typ_read_phy_control;
1252
         end
1253
      end
1254
   stm_typ_read_sync_status:
1255
      begin
1256
      if (reg_busy == 1'b 0 && reg_busy_reg == 1'b1)
1257
         begin
1258
         if (TB_ENA_AUTONEG)
1259
            begin
1260
            nextstate <= stm_typ_prog_ability;
1261
            end
1262
         else
1263
            begin
1264
            nextstate <= stm_typ_autoneg_disable;
1265
            end
1266
         end
1267
      else
1268
         begin
1269
         nextstate <= stm_typ_read_sync_status;
1270
         end
1271
      end
1272
   stm_typ_autoneg_disable:
1273
      begin
1274
      if (reg_busy == 1'b 0 && reg_busy_reg == 1'b1)
1275
         begin
1276
         nextstate <= stm_typ_sim;
1277
         end
1278
      else
1279
         begin
1280
         nextstate <= stm_typ_autoneg_disable;
1281
         end
1282
      end
1283
   stm_typ_prog_ability:
1284
      begin
1285
      if (reg_busy == 1'b 0 && reg_busy_reg == 1'b1)
1286
         begin
1287
         nextstate <= stm_typ_prog_timer_1;
1288
         end
1289
      else
1290
         begin
1291
         nextstate <= stm_typ_prog_ability;
1292
         end
1293
      end
1294
   stm_typ_prog_timer_1:
1295
      begin
1296
      if (reg_busy == 1'b 0 && reg_busy_reg == 1'b1)
1297
         begin
1298
         nextstate <= stm_typ_prog_timer_2;
1299
         end
1300
      else
1301
         begin
1302
         nextstate <= stm_typ_prog_timer_1;
1303
         end
1304
      end
1305
   stm_typ_prog_timer_2:
1306
      begin
1307
      if (reg_busy == 1'b 0 && reg_busy_reg == 1'b1)
1308
         begin
1309
         nextstate <= stm_typ_autoneg_enable;
1310
         end
1311
      else
1312
         begin
1313
         nextstate <= stm_typ_prog_timer_2;
1314
         end
1315
      end
1316
   stm_typ_autoneg_enable:
1317
      begin
1318
      if (reg_busy == 1'b 0 && reg_busy_reg == 1'b1)
1319
         begin
1320
         nextstate <= stm_typ_start_autoneg;
1321
         end
1322
      else
1323
         begin
1324
         nextstate <= stm_typ_autoneg_enable;
1325
         end
1326
      end
1327
   stm_typ_start_autoneg:
1328
      begin
1329
      if (reg_busy == 1'b 0 && reg_busy_reg == 1'b1)
1330
         begin
1331
         nextstate <= stm_typ_wait_autoneg;
1332
         end
1333
      else
1334
         begin
1335
         nextstate <= stm_typ_start_autoneg;
1336
         end
1337
      end
1338
   stm_typ_wait_autoneg:
1339
      begin
1340
      if (an_done == 1'b 1 & led_an==1'b1)
1341
         begin
1342
         nextstate <= stm_typ_read_autoneg_expansion;
1343
         end
1344
      else
1345
         begin
1346
         nextstate <= stm_typ_wait_autoneg;
1347
         end
1348
      end
1349
   stm_typ_read_autoneg_expansion:
1350
      begin
1351
      if (reg_busy == 1'b 0 && reg_busy_reg == 1'b1)
1352
         begin
1353
         nextstate <= stm_typ_read_autoneg_status;
1354
         end
1355
      else
1356
         begin
1357
         nextstate <= stm_typ_read_autoneg_expansion;
1358
         end
1359
      end
1360
   stm_typ_read_autoneg_status:
1361
      begin
1362
      if (reg_busy == 1'b 0 && reg_busy_reg == 1'b1)
1363
         begin
1364
         nextstate <= stm_typ_read_part_ability;
1365
         end
1366
      else
1367
         begin
1368
         nextstate <= stm_typ_read_autoneg_status;
1369
         end
1370
      end
1371
   stm_typ_read_part_ability:
1372
      begin
1373
      if (reg_busy == 1'b 0 && reg_busy_reg == 1'b1)
1374
         begin
1375
         nextstate <= stm_typ_sim;
1376
         end
1377
      else
1378
         begin
1379
         nextstate <= stm_typ_read_part_ability;
1380
         end
1381
      end
1382
   stm_typ_sim:
1383
      begin
1384
      if (rx_frm_cnt == TB_TXFRAMES)
1385
         begin
1386
 
1387
                nextstate <= stm_typ_end_sim;
1388
 
1389
         end
1390
      else
1391
         begin
1392
         nextstate <= stm_typ_sim;
1393
         end
1394
      end
1395
   stm_typ_stop_tbi:
1396
      begin
1397
      if (end_cnt > 500)
1398
         begin
1399
         nextstate <= stm_typ_ena_sw_reset;
1400
         end
1401
      else
1402
         begin
1403
         nextstate <= stm_typ_stop_tbi;
1404
         end
1405
      end
1406
 
1407
   stm_typ_ena_sw_reset:
1408
      begin
1409
      if (reg_busy == 1'b 0 && reg_busy_reg == 1'b1)
1410
         begin
1411
         nextstate <= stm_typ_read_sw_reset;
1412
         end
1413
      else
1414
         begin
1415
         nextstate <= stm_typ_ena_sw_reset;
1416
         end
1417
      end
1418
   stm_typ_read_sw_reset:
1419
      begin
1420
      if (reg_busy == 1'b 0 && reg_busy_reg == 1'b1)
1421
         begin
1422
         nextstate <= stm_typ_start_tbi;
1423
         end
1424
      else
1425
         begin
1426
         nextstate <= stm_typ_read_sw_reset;
1427
         end
1428
      end
1429
   stm_typ_start_tbi:
1430
      begin
1431
      nextstate <= stm_typ_read_status;
1432
      end
1433
   stm_typ_read_status:
1434
      begin
1435
      if (reg_busy == 1'b 0 && reg_busy_reg == 1'b1)
1436
         begin
1437
         nextstate <= stm_typ_read_status_2;
1438
         end
1439
      else
1440
         begin
1441
         nextstate <= stm_typ_read_status;
1442
         end
1443
      end
1444
   stm_typ_read_status_2:
1445
      begin
1446
      if (reg_busy == 1'b 0 && reg_busy_reg == 1'b1)
1447
         begin
1448
         if (TB_ISOLATE==1'b1)
1449
            begin
1450
            nextstate <= stm_typ_read_status;
1451
            end
1452
         else
1453
            begin
1454
            nextstate <= stm_typ_end_sim;
1455
            end
1456
         end
1457
      else
1458
         begin
1459
         nextstate <= stm_typ_read_status_2;
1460
         end
1461
      end
1462
 
1463
   stm_typ_disable_isolate:
1464
      begin
1465
      if (reg_busy == 1'b 0 && reg_busy_reg == 1'b1)
1466
         begin
1467
         nextstate <= stm_typ_end_sim;
1468
         end
1469
      else
1470
         begin
1471
         nextstate <= stm_typ_disable_isolate;
1472
         end
1473
      end
1474
   stm_typ_end_sim:
1475
      begin
1476
      nextstate <= stm_typ_end_sim;
1477
      end
1478
   endcase
1479
   end
1480
 
1481
//  Simulation Status
1482
//  -----------------
1483
 
1484
always @(negedge reg_clk)
1485
   begin : process_20
1486
      if (state == stm_typ_read_ver & reg_busy == 1'b 0 && reg_busy_reg == 1'b1)
1487
      begin
1488
 
1489
    $display(" - Altera Design Version : %0d.%0d ", reg_data_out[15:8], reg_data_out[7:0] ) ;
1490
 
1491
      end
1492
      else if (state == stm_typ_rd_scratch & reg_busy == 1'b 0 && reg_busy_reg == 1'b1 )
1493
      begin
1494
        readback_scratch <= reg_data_out;
1495
        $display("   - Read Scratch Register : 0x%h", reg_data_out, "\n") ;
1496
 
1497
      end
1498
      else if ((state == stm_typ_read_sync_status | state == stm_typ_read_status | state == stm_typ_read_status_2) & reg_busy == 1'b 0 && reg_busy_reg == 1'b1 )
1499
      begin
1500
 
1501
        $display("   - Check Link Status : \n") ;
1502
 
1503
        if (reg_data_out[2] == 1'b 1)
1504
        begin
1505
 
1506
                $display("              Link Acquired\n") ;
1507
 
1508
        end
1509
        else
1510
        begin
1511
 
1512
                $display("              Link not Acquired\n") ;
1513
 
1514
        end
1515
     end
1516
     else if (state == stm_typ_read_sw_reset & reg_busy == 1'b 0 && reg_busy_reg == 1'b1 )
1517
     begin
1518
 
1519
        $display("   - Check if Self-Clearing MDIO Reset Bit is Cleared : \n") ;
1520
 
1521
        if (reg_data_out[15] == 1'b 1)
1522
        begin
1523
 
1524
                $display("              Reset Command bit not Cleared\n") ;
1525
 
1526
        end
1527
        else
1528
        begin
1529
 
1530
                $display("              Reset Command bit Correctly Cleared\n") ;
1531
 
1532
        end
1533
     end
1534
     else if (state == stm_typ_read_phy_control & reg_busy == 1'b 0 && reg_busy_reg == 1'b1 )
1535
     begin
1536
 
1537
        $display("   - Checking PCS Capabilies (MDIO Control Register):0x%h", reg_data_out)  ;
1538
 
1539
        if (reg_data_out[6] == 1'b 1 & reg_data_out[13] == 1'b 0)
1540
        begin
1541
 
1542
                $display("              Speed: 1000Mbps\n") ;
1543
 
1544
        end
1545
        else
1546
        begin
1547
 
1548
                $display("              Speed: ERROR\n") ;
1549
 
1550
        end
1551
 
1552
        if (reg_data_out[7] == 1'b 0)
1553
        begin
1554
 
1555
                $display("              Colision Test: Not Supported\n") ;
1556
 
1557
        end
1558
        else
1559
        begin
1560
 
1561
                $display("              Colision Test: ERROR\n") ;
1562
 
1563
        end
1564
     end
1565
     else if (state == stm_typ_read_autoneg_expansion & reg_busy == 1'b 0 && reg_busy_reg == 1'b1 )
1566
     begin
1567
 
1568
        if (reg_data_out[2] == 1'b 1)
1569
        begin
1570
 
1571
                $display("              Page(s) Received from Link Partner\n") ;
1572
 
1573
        end
1574
        else
1575
        begin
1576
 
1577
                $display("              Page NOT Received from Link Partner\n") ;
1578
 
1579
        end
1580
     end
1581
     else if (state == stm_typ_read_autoneg_status & reg_busy == 1'b 0 && reg_busy_reg == 1'b1 )
1582
     begin
1583
 
1584
        if (reg_data_out[5] == 1'b 1)
1585
        begin
1586
 
1587
                $display("              Auto-Negotiation Completed\n") ;
1588
 
1589
        end
1590
        else
1591
        begin
1592
 
1593
                $display("              Auto-Negotiation Not Completed\n") ;
1594
 
1595
        end
1596
     end
1597
     else if (state == stm_typ_read_part_ability & reg_busy == 1'b 0 && reg_busy_reg == 1'b1 )
1598
     begin
1599
 
1600
        $display("   - Advertised Link Partner Ability:\n") ;
1601
 
1602
        if (TB_SGMII_ENA==1'b0)
1603
        begin
1604
 
1605
                if (reg_data_out[15] == 1'b 1)
1606
                begin
1607
 
1608
                        $display("              Link Partner Supports Next Page\n") ;
1609
 
1610
                end
1611
                else
1612
                begin
1613
 
1614
                        $display("              Link Partner does not Support Next Page\n") ;
1615
 
1616
                end
1617
 
1618
                if (reg_data_out[8:7] == 2'b 11)
1619
                begin
1620
 
1621
                        $display("              Link Partner Advertises Symetric and Asymetric Pause Support\n") ;
1622
 
1623
                end
1624
                else if (reg_data_out[8:7] == 2'b 10 )
1625
                begin
1626
 
1627
                        $display("              Link Partner Advertises Asymetric Towards Link Partner Support\n") ;
1628
 
1629
                end
1630
                else if (reg_data_out[8:7] == 2'b 01 )
1631
                begin
1632
 
1633
                        $display("              Link Partner Advertises Symetric Pause Support\n") ;
1634
 
1635
                end
1636
                else
1637
                begin
1638
 
1639
                        $display("              Link Partner Advertises no Support Pause\n") ;
1640
 
1641
                end
1642
 
1643
                if (reg_data_out[13:12] == 2'b 00)
1644
                begin
1645
 
1646
                        $display("              Link Partner Advertises no Remote Fault\n") ;
1647
 
1648
                end
1649
                else
1650
                begin
1651
 
1652
                        $display("              Link Partner Advertises a Remote Fault\n") ;
1653
 
1654
                end
1655
 
1656
                if (reg_data_out[6] == 1'b 1)
1657
                begin
1658
 
1659
                        $display("              Link Partner Supports Half Duplex Operation\n") ;
1660
 
1661
                end
1662
                else
1663
                begin
1664
 
1665
                        $display("              Link Partner does not Support Half Duplex Operation\n") ;
1666
 
1667
                end
1668
 
1669
                if (reg_data_out[5] == 1'b 1)
1670
                begin
1671
 
1672
                        $display("              Link Partner Supports Full Duplex Operation\n") ;
1673
 
1674
                end
1675
                else
1676
                begin
1677
 
1678
                        $display("              Link Partner does not Support Full Duplex Operation\n") ;
1679
 
1680
                end
1681
 
1682
        end
1683
        else
1684
        begin
1685
 
1686
                if (reg_data_out[11:10] == 2'b 00)
1687
                begin
1688
 
1689
                        $display("              Link Partner Supports 10Mbps Operation\n") ;
1690
 
1691
                end
1692
                else if (reg_data_out[11:10] == 2'b 01)
1693
                begin
1694
 
1695
                        $display("              Link Partner Supports 100Mbps Operation\n") ;
1696
 
1697
                end
1698
                else
1699
                begin
1700
 
1701
                        $display("              Link Partner Supports Gigabit Operation\n") ;
1702
 
1703
                end
1704
 
1705
                if (reg_data_out[12] == 1'b 0)
1706
                begin
1707
 
1708
                        $display("              Link Partner Supports Full Duplex Operation\n") ;
1709
 
1710
                end
1711
                else
1712
                begin
1713
 
1714
                        $display("              Link Partner does not Support Full Duplex Operation\n") ;
1715
 
1716
                end
1717
 
1718
        end
1719
 
1720
      end
1721
 
1722
   end
1723
 
1724
always @(state)
1725
   begin : process_21
1726
   if (state == stm_typ_wr_scratch)
1727
   begin
1728
 
1729
        $display("   - write Scratch Register : 0xaaaa") ;
1730
 
1731
   end
1732
   else if (state == stm_typ_prog_ability )
1733
   begin
1734
 
1735
        $display("   - Set Core Ability\n") ;
1736
 
1737
   end
1738
   else if (state == stm_typ_autoneg_enable )
1739
   begin
1740
 
1741
        $display("   - Enable Auto Negotiation\n") ;
1742
 
1743
   end
1744
   else if (state == stm_typ_prog_timer_1 )
1745
   begin
1746
 
1747
        $display("   - Programming Link Timer\n") ;
1748
 
1749
   end
1750
   else if (state == stm_typ_start_autoneg )
1751
   begin
1752
 
1753
        $display("   - Start Auto-Negotiation\n") ;
1754
 
1755
   end
1756
   else if (state == stm_typ_read_part_ability )
1757
   begin
1758
 
1759
        $display("   - Read Partner Ability\n") ;
1760
 
1761
   end
1762
   else if (state == stm_typ_read_autoneg_status )
1763
   begin
1764
 
1765
        $display("   - Read Auto-Negotiation Results\n") ;
1766
 
1767
   end
1768
   else if (state == stm_typ_read_autoneg_expansion )
1769
   begin
1770
 
1771
        $display("   - Read Auto-Negotiation Expansion Register\n") ;
1772
 
1773
   end
1774
   else if (state == stm_typ_ena_sw_reset )
1775
   begin
1776
 
1777
        $display(" -- ---------------------------------------------------------- --\n") ;
1778
        $display("   Test Self Clearing MDIO Reset Command bit\n") ;
1779
 
1780
   end
1781
   else if (state == stm_typ_ena_isolate )
1782
   begin
1783
 
1784
        $display(" -- ---------------------------------------------------------- --\n") ;
1785
        $display("   Enable PHY Isolation\n") ;
1786
 
1787
   end
1788
   else if (state == stm_typ_disable_isolate )
1789
   begin
1790
 
1791
        $display("   Disable PHY Isolation\n") ;
1792
        $display(" -- ---------------------------------------------------------- --\n") ;
1793
 
1794
   end
1795
   else if (state == stm_typ_sim )
1796
   begin
1797
 
1798
        $display(" -- ---------------------------------------------------------- --\n") ;
1799
        $display("    Start Simulation\n") ;
1800
 
1801
   end
1802
   else if (state == stm_typ_start_tbi )
1803
   begin
1804
 
1805
        $display("   Checking Latch Low Link MDIO bit\n") ;
1806
 
1807
   end
1808
 
1809
end
1810
 
1811
//  -----------------------
1812
//  register test status
1813
//  -----------------------
1814
 
1815
 
1816
always @(posedge reset or state or nextstate)
1817
 
1818
   begin
1819
 
1820
       if (reset == 1'b 1)
1821
          begin
1822
          register_test <= 0;
1823
          end
1824
       else
1825
          begin
1826
              if (nextstate == stm_typ_end_sim & state == stm_typ_sim)
1827
                begin
1828
                    // expected scratch register readback is 0xaaaa
1829
                    //
1830
                    if (readback_scratch != 16'haaaa)
1831
                      begin
1832
                         $display("\n      Register test failed on SCRATCH register") ;
1833
                         register_test <= 1;
1834
                      end
1835
 
1836
               end
1837
          end
1838
   end
1839
 
1840
 
1841
//  End of Simulation
1842
//  -----------------
1843
 
1844
always @(posedge reset or posedge rx_clk_sig)
1845
   begin : process_22
1846
   if (reset == 1'b 1)
1847
      begin
1848
      end_cnt <= 0;
1849
      end
1850
   else
1851
      begin
1852
      if (state == stm_typ_stop_tbi)
1853
         begin
1854
         if (end_cnt == 50)
1855
            begin
1856
 
1857
                $display("\n    End of Simulation\n") ;
1858
                $display(" -- ---------------------------------------------------------- --\n") ;
1859
 
1860
            end_cnt <= end_cnt + 1'b 1;
1861
            end
1862
         else
1863
            begin
1864
            end_cnt <= end_cnt + 1'b 1;
1865
            end
1866
         end
1867
      else if (state == stm_typ_end_sim )
1868
         begin
1869
         if (end_cnt == 300)
1870
            begin
1871
 
1872
                $display(" -- ---------------------------------------------------------- --\n") ;
1873
                $display("   Simulation Results:\n") ;
1874
                $display("        - Transmitted Frames: ", tx_frm_cnt) ;
1875
                $display("        - Received Frames: ", rx_frm_cnt) ;
1876
                $display("        - CRC Errors: ", rx_crc_err_cnt) ;
1877
                $display("        - Preamble Errors: ", rx_pbl_err_cnt) ;
1878
                $display("        - MII / GMII Error Received: ", rx_gmii_err_cnt) ;
1879
                $display("        - MII / GMII Error Transmitted: ", tx_gmii_err_cnt) ;
1880
                $display("        - Header Errors (Wrong Source MAC Address): ", rx_src_err_cnt) ;
1881
                $display("        - Header Errors (Wrong Destination MAC Address): ", rx_dst_err_cnt, "\n") ;
1882
 
1883
                end_cnt <= end_cnt + 1'b 1;
1884
            end
1885
         else if (end_cnt == 500 )
1886
            begin
1887
 
1888
                if ((rx_frm_cnt        == tx_frm_cnt) &
1889
                    (rx_crc_err_cnt    == 0) &
1890
                    (rx_pbl_err_cnt    == 0) &
1891
                    (rx_gmii_err_cnt   == tx_gmii_err_cnt) &
1892
                    (register_test     == 0) &
1893
                    (rx_src_err_cnt    == 0) &
1894
                    (rx_dst_err_cnt    == 0) &
1895
                    (tx_frm_cnt           == TB_TXFRAMES) )
1896
 
1897
                begin
1898
 
1899
                        $display("\n -- Loopback Simulation Ended with no Error") ;
1900
 
1901
                end
1902
                else
1903
                begin
1904
 
1905
                        $display("\n -- Loopback Simulation Ended with Error !") ;
1906
 
1907
                end
1908
 
1909
 
1910
                $display("\n- ---------------------------------------------------------------------------------------- -") ;
1911
            $display("End of simulation");
1912
            $stop;
1913
            end
1914
         else
1915
            begin
1916
            end_cnt <= end_cnt + 1'b 1;
1917
            end
1918
         end
1919
      else
1920
         begin
1921
         end_cnt <= 0;
1922
         end
1923
      end
1924
   end
1925
 
1926
endmodule // module tb

powered by: WebSVN 2.1.0

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