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

Subversion Repositories sgmii

[/] [sgmii/] [trunk/] [sim/] [BFMs/] [SGMII_altera/] [testbench/] [model/] [ethgen.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: ethgen.v,v $
7
// $Source: /ipbu/cvs/sio/projects/TriSpeedEthernet/src/testbench/models/verilog/ethernet_model/gen/ethgen.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 - 10/100/1000 MAC
15
//
16
// Description : (Simulation only)
17
//
18
// GMII Interface Ethernet Traffic Generator
19
// Ethernet Traffic Generator for 8 bit MAC Atlantic client interface
20
// 
21
// ALTERA Confidential and Proprietary
22
// Copyright 2006 (c) Altera Corporation
23
// All rights reserved
24
//
25
// -------------------------------------------------------------------------
26
// -------------------------------------------------------------------------
27
 
28
`timescale 1 ns / 10 ps
29
//`include "common_header.verilog" 
30
 
31
module ethgenerator (
32
 
33
   reset,
34
   rx_clk,
35
   enable,
36
   rxd,
37
   rx_dv,
38
   rx_er,
39
   sop,
40
   eop,
41
   mac_reverse,
42
   dst,
43
   src,
44
   prmble_len,
45
   pquant,
46
   vlan_ctl,
47
   len,
48
   frmtype,
49
   cntstart,
50
   cntstep,
51
   ipg_len,
52
   payload_err,
53
   prmbl_err,
54
   crc_err,
55
   vlan_en,
56
   stack_vlan,
57
   pause_gen,
58
   pad_en,
59
   phy_err,
60
   end_err,
61
   data_only,
62
   runt_gen,
63
   long_pause,
64
   carrier_sense,
65
   false_carrier,
66
   carrier_extend,
67
   carrier_extend_error,
68
   start,
69
   done);
70
 
71
parameter thold = 1'b 1;
72
parameter ENABLE_SHIFT16 = 1'b 0;
73
 
74
 
75
input   reset; //  active high
76
input   rx_clk;
77
input   enable;
78
output   [7:0] rxd;
79
output   rx_dv;
80
output   rx_er;
81
output   sop; //  pulse with first character
82
output   eop; //  pulse with last  character
83
input   mac_reverse; //  1: dst/src are sent MSB first
84
input   [47:0] dst; //  destination address
85
input   [47:0] src; //  source address
86
input   [4:0] prmble_len; //  length of preamble
87
input   [15:0] pquant; //  Pause Quanta value
88
input   [15:0] vlan_ctl; //  VLAN control info
89
input   [15:0] len; //  Length of payload
90
input   [15:0] frmtype; //  if non-null: type field instead length
91
input   [7:0] cntstart; //  payload data counter start (first byte of payload)
92
input   [7:0] cntstep; //  payload counter step (2nd byte in paylaod)
93
input   [15:0] ipg_len; //  inter packet gap (delay after CRC)  
94
input   payload_err; //  generate payload pattern error (last payload byte is wrong)
95
input   prmbl_err;
96
input   crc_err;
97
input   vlan_en;
98
input   stack_vlan;
99
input   pause_gen;
100
input   pad_en;
101
input   phy_err;
102
input   end_err; //  keep rx_dv high one cycle after end of frame
103
input   data_only; //  if set omits preamble, padding, CRC
104
input   runt_gen;
105
input   long_pause;
106
input   carrier_sense;
107
input   false_carrier;
108
input   carrier_extend;
109
input   carrier_extend_error;
110
input   start;
111
output   done;
112
//  GMII receive interface: To be connected to MAC RX
113
wire     [7:0] rxd;
114
wire     rx_dv;
115
//  Additional FIFO controls for FIFO test scenarios
116
wire     rx_er;
117
wire     sop;
118
//  Frame Contents definitions
119
wire     eop;
120
wire     done;
121
reg     imac_reverse; //  1: dst/src are sent MSB first
122
reg     [47:0] idst; //  destination address
123
reg     [47:0] isrc; //  source address
124
reg     [4:0] iprmble_len; //  length of preamble
125
reg     [15:0] ipquant; //  Pause Quanta value
126
reg     [15:0] ivlan_ctl; //  VLAN control info
127
reg     [15:0] ilen; //  Length of payload
128
reg     [15:0] ifrmtype; //  if non-null: type field instead length
129
reg     [7:0] icntstart; //  payload data counter start (first byte of payload)
130
reg     [7:0] icntstep; //  payload counter step (2nd byte in paylaod)
131
reg     [15:0] iipg_len; //  inter packet gap
132
reg     ipayload_err;
133
reg     iprmbl_err;
134
reg     icrc_err;
135
reg     ivlan_en;
136
reg     istack_en;
137
reg     ipause_gen;
138
reg     ipad_en;
139
reg     iphy_err;
140
reg     iend_err;
141
reg     idata_only;
142
reg     icarrier_sense;
143
reg     ifalse_carrier;
144
reg     icarrier_extend;
145
reg     icarrier_extend_error;
146
wire     enable_int;
147
reg     dval_temp;
148
reg     [7:0] dout_temp;
149
reg     sop_temp;
150
reg     eop_temp;
151
reg     derror_temp;
152
reg     enable_reg;
153
reg     done_temp;
154
wire rx_clk_gen;
155
 
156
parameter LATENCY = 0;
157
//  internal
158
 
159
// TYPE state_typ:
160
parameter state_typ_s_idle = 0;
161
parameter state_typ_s_prmbl = 1;
162
parameter state_typ_s_sfd = 2;
163
parameter state_typ_s_dst = 3;
164
parameter state_typ_s_src = 4;
165
parameter state_typ_s_pause = 5;
166
parameter state_typ_s_tag = 6;
167
parameter state_typ_s_len = 7;
168
parameter state_typ_s_data = 8;
169
parameter state_typ_s_pad = 9;
170
parameter state_typ_s_crc = 10;
171
parameter state_typ_s_enderr = 11;
172
parameter state_typ_s_ipg = 12;
173
parameter state_typ_s_stack = 13;
174
parameter state_typ_s_Dword32Aligned = 14;
175
parameter state_typ_s_false_carrier = 15;
176
parameter state_typ_s_carrier_extend = 16;
177
parameter state_typ_s_carrier_extend_error = 17;
178
parameter state_typ_s_carrier_sense = 18;
179
 
180
reg     [4:0] state;
181
reg     [4:0] last_state;
182
reg     [4:0] last_state_dly; //  delayed one again
183
reg     [31:0] crc32;
184
reg     [31:0] count;
185
reg     [31:0] poscnt; //  position in frame starts at first dst byte
186
reg     [7:0] datacnt;
187
reg     [7:0] rxdata; //  next data to put on the line
188
reg     sop_int;
189
//  -----------------------------------
190
//  capture command when start asserted
191
//  -----------------------------------
192
reg     [31:0]  process_2_crctmp;
193
reg     [3:0]  V2V_process_2_i;
194
integer  process_7_hi;
195
integer  process_7_lo;
196
reg     [31:0]  process_7_cnttmp;
197
integer  V2V_process_7_i;
198
 
199
// Different latency different reg value
200
reg enable_latency1;
201
reg enable_latency2;
202
reg enable_latency3;
203
reg enable_latency4;
204
reg enable_latency5;
205
reg enable_latency6;
206
reg enable_latency7;
207
reg enable_latency8;
208
 
209
initial
210
   begin
211
      enable_reg <= 1'b 0;
212
   end
213
 
214
 always @(posedge rx_clk or posedge reset)
215
   begin
216
     if (reset == 1'b 1)
217
                  begin
218
       enable_reg <= 1'b 0;
219
                  end
220
     else
221
                  begin
222
       enable_reg <= enable;
223
    end
224
   end
225
 
226
 always @(posedge rx_clk or posedge reset)
227
   begin
228
    if (reset == 1'b 1)
229
                begin
230
        enable_latency1 <= 1'b 0;
231
        enable_latency2 <= 1'b 0;
232
        enable_latency3 <= 1'b 0;
233
        enable_latency4 <= 1'b 0;
234
        enable_latency5 <= 1'b 0;
235
        enable_latency6 <= 1'b 0;
236
        enable_latency7 <= 1'b 0;
237
        enable_latency8 <= 1'b 0;
238
                end
239
    else
240
                begin
241
        enable_latency1 <= enable_reg;
242
        enable_latency2 <= enable_latency1;
243
        enable_latency3 <= enable_latency2;
244
        enable_latency4 <= enable_latency3;
245
        enable_latency5 <= enable_latency4;
246
        enable_latency6 <= enable_latency5;
247
        enable_latency7 <= enable_latency6;
248
        enable_latency8 <= enable_latency7;
249
        end
250
    end
251
 
252
     assign enable_int = (LATENCY == 0)?enable_reg & enable:
253
                         (LATENCY == 1)?enable_latency1 & enable_reg:
254
                         (LATENCY == 2)?enable_latency2 & enable_latency1:
255
                         (LATENCY == 3)?enable_latency3 & enable_latency2:
256
                         (LATENCY == 4)?enable_latency4 & enable_latency3:
257
                         (LATENCY == 5)?enable_latency5 & enable_latency4:
258
                         (LATENCY == 6)?enable_latency6 & enable_latency5:
259
                         (LATENCY == 7)?enable_latency7 & enable_latency6:
260
                         (enable_latency8 & enable_latency7);
261
     assign rxd      = dout_temp;
262
     assign rx_dv    = (LATENCY == 0)?dval_temp & enable:
263
                       (LATENCY == 1)?dval_temp & enable_reg:
264
                       (LATENCY == 2)?dval_temp & enable_latency1:
265
                       (LATENCY == 3)?dval_temp & enable_latency2:
266
                       (LATENCY == 4)?dval_temp & enable_latency3:
267
                       (LATENCY == 5)?dval_temp & enable_latency4:
268
                       (LATENCY == 6)?dval_temp & enable_latency5:
269
                       (LATENCY == 7)?dval_temp & enable_latency6:
270
                       dval_temp & enable_latency7;
271
     assign rx_er    = derror_temp;
272
     assign sop      = sop_temp;
273
     assign eop      = eop_temp;
274
     assign done     = done_temp;
275
     assign rx_clk_gen = rx_clk & enable_int;
276
 
277
always @(posedge rx_clk_gen or posedge reset)
278
   begin : process_1
279
   if (reset == 1'b 1)
280
      begin
281
      imac_reverse <= 1'b 0;    //  1: dst/src are sent MSB first
282
      idst <= {48{1'b 0}};  //  destination address
283
      isrc <= {48{1'b 0}};  //  source address
284
      iprmble_len <= 5'h8;  //  length of preamble
285
      ipquant <= {16{1'b 0}};   //  Pause Quanta value
286
      ivlan_ctl <= {16{1'b 0}}; //  VLAN control info
287
      ilen <= {16{1'b 0}};  //  Length of payload
288
      ifrmtype <= {16{1'b 0}};  //  if non-null: type field instead length
289
      icntstart <= 0;   //  payload data counter start (first byte of payload)
290
      icntstep <= 0;    //  payload counter step (2nd byte in paylaod)
291
      iipg_len <= 0;
292
      ipayload_err <= 1'b 0;
293
      iprmbl_err <= 1'b 0;
294
      icrc_err <= 1'b 0;
295
      ivlan_en <= 1'b 0;
296
      istack_en <= 1'b0;
297
      ipause_gen <= 1'b 0;
298
      ipad_en <= 1'b 0;
299
      iphy_err <= 1'b 0;
300
      iend_err <= 1'b 0;
301
      idata_only <= 1'b 0;
302
      icarrier_sense<= 1'b 0;
303
      ifalse_carrier<= 1'b 0;
304
      icarrier_extend<= 1'b 0;
305
      icarrier_extend_error<= 1'b 0;
306
 
307
      end
308
   else
309
      begin
310
 
311
      if (start == 1'b 1 & state == state_typ_s_idle )
312
      begin
313
 
314
        imac_reverse <= mac_reverse;    //  1: dst/src are sent MSB first
315
         idst <= dst;   //  destination address
316
        isrc <= src;    //  source address
317
        iprmble_len <= prmble_len;  //  length of preamble
318
        ipquant <= pquant;  //  Pause Quanta value
319
        ivlan_ctl <= vlan_ctl;  //  VLAN control info
320
        ilen <= len;    //  Length of payload
321
        ifrmtype <= frmtype;    //  if non-null: type field instead length
322
        icntstart <= cntstart;  //  payload data counter start (first byte of payload)
323
        icntstep <= cntstep;    //  payload counter step (2nd byte in paylaod)
324
        iipg_len <= ipg_len;
325
        ipayload_err <= payload_err;
326
        iprmbl_err <= prmbl_err;
327
        icrc_err <= crc_err;
328
        ivlan_en <= vlan_en;
329
        istack_en <= stack_vlan;
330
        ipause_gen <= pause_gen;
331
        ipad_en <= pad_en;
332
        iphy_err <= phy_err;
333
         iend_err <= end_err;
334
        idata_only <= data_only;
335
        icarrier_sense <=carrier_sense;
336
        ifalse_carrier <= false_carrier;
337
        icarrier_extend <= carrier_extend;
338
        icarrier_extend_error <= carrier_extend_error;
339
 
340
      end
341
   end
342
end
343
//  ----------------------------------------------
344
//  CRC calculation over all bytes except preamble
345
//  ----------------------------------------------
346
always @(negedge rx_clk_gen or posedge reset)
347
   begin : process_2
348
   if (reset == 1'b 1)
349
      begin
350
      crc32 <= {32{1'b 1}};
351
      end
352
   else
353
      begin
354
//  need it ahead
355
      if (last_state == state_typ_s_sfd)
356
         begin
357
         crc32 <= {32{1'b 1}};  //  RESET CRC at start of DST
358
         end
359
      else if (state != state_typ_s_idle & state != state_typ_s_prmbl &
360
    last_state != state_typ_s_crc )
361
         begin
362
         process_2_crctmp = crc32;
363
 
364
         for (V2V_process_2_i = 0; V2V_process_2_i <= 7; V2V_process_2_i = V2V_process_2_i + 1)
365
            begin
366
            if ((rxdata[V2V_process_2_i] ^ process_2_crctmp[31]) == 1'b 1)
367
               begin
368
               process_2_crctmp = (process_2_crctmp << 1);  //  shift in a 0, will be xor'ed to 1 by the polynom
369
               process_2_crctmp = process_2_crctmp ^ 32'h 04C11DB7;
370
               end
371
            else
372
               begin
373
               process_2_crctmp = (process_2_crctmp << 1);  //  shift in a 0
374
               end
375
            end
376
//  process all bits we have here
377
         crc32 <= process_2_crctmp;
378
         end
379
      end
380
   end
381
//  ----------------------------------------------
382
//  Push RX Data on GMII and 
383
//  produce PHY error if requested during SRC address transmission
384
//  ----------------------------------------------
385
initial
386
   begin
387
      dout_temp <= {8{1'b 0}};
388
      dval_temp <= 1'b 0;
389
      derror_temp <= 1'b 0;
390
   end
391
 
392
always @(posedge rx_clk_gen or posedge reset)
393
   begin : process_3
394
   if (reset == 1'b 1)
395
      begin
396
      dout_temp <= {8{1'b 0}};
397
      dval_temp <= 1'b 0;
398
      derror_temp <= 1'b 0;
399
      end
400
   else
401
      begin
402
      if (last_state == state_typ_s_idle | last_state == state_typ_s_ipg)
403
         begin
404
         dout_temp <= #(thold) {8{1'b 0}};
405
         dval_temp <= #(thold) 1'b 0;
406
//  Data and DV 
407
                 end
408
      else if (last_state == state_typ_s_false_carrier | last_state == state_typ_s_carrier_sense | last_state == state_typ_s_carrier_extend | last_state == state_typ_s_carrier_extend_error )
409
         begin
410
             dout_temp <= #(thold) rxdata;
411
             dval_temp <= #(thold) 1'b 0;
412
             derror_temp <= #(thold) 1'b 1;
413
         end
414
//  Data and DV 
415
      else
416
         begin
417
         dout_temp <= #(thold) rxdata;
418
         dval_temp <= #(thold) 1'b 1;
419
//  PHY error in SRC field
420
         if (data_only == 1'b 0 & last_state == state_typ_s_src & count == 2 & iphy_err == 1'b 1)
421
            begin
422
            derror_temp <= #(thold) 1'b 1;
423
            end
424
 
425
         else if (data_only == 1'b 1 & iphy_err == 1'b 1 &
426
    (last_state != state_typ_s_idle & state == state_typ_s_idle |
427
    last_state != state_typ_s_ipg & state == state_typ_s_ipg) )
428
            begin
429
            if (~(last_state == state_typ_s_ipg & state == state_typ_s_idle))
430
               begin
431
//  if from ipg to idle, eop has been pulsed already
432
               derror_temp <= #(thold) 1'b 1;
433
               end
434
            end
435
 
436
         else
437
            begin
438
            derror_temp <= #(thold) 1'b 0;
439
            end
440
         end
441
      end
442
   end
443
//  ----------------------------------------------
444
//  SOP and EOP generation (helper for FIFO testing)
445
//  ----------------------------------------------
446
always @(posedge rx_clk_gen or posedge reset)
447
   begin : process_4
448
   if (reset == 1'b 1)
449
      begin
450
      sop_temp <= 1'b 0;
451
      sop_int <= 1'b 0;
452
      eop_temp <= 1'b 0;
453
      end
454
   else
455
      begin
456
      if (last_state == state_typ_s_idle & state != state_typ_s_idle)
457
         begin
458
         sop_int <= 1'b 1;
459
         end
460
      else
461
         begin
462
         sop_int <= 1'b 0;
463
         end
464
      if (last_state != state_typ_s_idle & state == state_typ_s_idle |
465
          last_state != state_typ_s_ipg & state == state_typ_s_ipg)
466
         begin
467
         if (~ ((last_state == state_typ_s_ipg & state == state_typ_s_idle)|
468
                (last_state == state_typ_s_false_carrier & state == state_typ_s_idle)|
469
                (last_state == state_typ_s_carrier_sense & state == state_typ_s_idle))
470
            )
471
            begin
472
//  if from ipg to idle, eop has been pulsed already
473
            eop_temp <= #(thold) 1'b 1;
474
            end
475
         end
476
      else
477
         begin
478
         eop_temp <= #(thold) 1'b 0;
479
         end
480
      sop_temp <= #(thold) sop_int;  //  need 1 delay
481
      end
482
   end
483
//  ----------------------------------------------
484
//  Position Counter: Starts with first octet of destination address
485
//  ----------------------------------------------
486
always @(posedge rx_clk_gen or posedge reset)
487
   begin : process_5
488
   if (reset == 1'b 1)
489
      begin
490
      poscnt <= 0;
491
      end
492
   else
493
      begin
494
      if (state == state_typ_s_sfd | state == state_typ_s_idle &
495
    start == 1'b 1)
496
         begin
497
//  in the data_only case necessary
498
         poscnt <= 0;   //  is 1 with the first byte sent (prmbl or DST)
499
         end
500
      else
501
         begin
502
         if (poscnt < 65535)
503
            begin
504
            poscnt <= poscnt + 1'b 1;
505
            end
506
         end
507
      end
508
   end
509
//  ----------------------------------------------
510
//  Done indication
511
//  ----------------------------------------------
512
always @(posedge rx_clk_gen or posedge reset)
513
   begin : process_6
514
   if (reset == 1'b 1)
515
      begin
516
      done_temp <= 1'b 1;
517
      end
518
   else
519
      begin
520
      if (state == state_typ_s_idle)
521
         begin
522
         done_temp <= ~start;
523
         end
524
      else
525
         begin
526
         done_temp <= 1'b 0;
527
         end
528
      end
529
   end
530
//  ----------------------------------------------
531
//  Generator State Machine
532
//  ----------------------------------------------
533
initial
534
   begin
535
      rxdata <= {8{1'b 0}};
536
   end
537
 
538
always @(posedge rx_clk_gen or posedge reset)
539
   begin : process_7
540
   if (reset == 1'b 1)
541
      begin
542
      state <= state_typ_s_idle;
543
      last_state <= state_typ_s_idle;
544
      rxdata <= {8{1'b 0}};
545
      count <= 0;
546
      end
547
   else
548
      begin
549
//  remember last state and increment internal counter
550
      last_state <= state;
551
      last_state_dly <= last_state; //  for viewing only
552
      if (count < 65535)
553
         begin
554
         process_7_cnttmp = count + 1'b 1;
555
         end
556
      else
557
         begin
558
         process_7_cnttmp = count;
559
         end
560
      case (state)
561
      state_typ_s_idle:
562
         begin
563
         if (start == 1'b 1)
564
            begin
565
            if (data_only == 1'b 1)
566
               begin
567
//  data only then skip preamble
568
               if (ENABLE_SHIFT16 == 1'b0)
569
               state <= state_typ_s_dst;
570
               else
571
                                state <= state_typ_s_Dword32Aligned;
572
 
573
               process_7_cnttmp = 1'b 0;
574
               end
575
            else
576
               begin
577
 
578
                 if (iprmble_len==5'h0)
579
                 begin
580
 
581
                        state <= state_typ_s_sfd;
582
 
583
                 end
584
                 else
585
                 begin
586
 
587
                        state <= state_typ_s_prmbl;
588
                        process_7_cnttmp = 1'b 1;
589
                 end
590
               end
591
            end
592
         rxdata <= {8{1'b 0}};
593
         end
594
      state_typ_s_prmbl:
595
         begin
596
         if (iprmble_len <= process_7_cnttmp)
597
            begin
598
//  one earlier
599
            state <= state_typ_s_sfd;
600
            end
601
         rxdata <= 8'h 55;
602
         end
603
      state_typ_s_sfd:
604
         begin
605
         state <= state_typ_s_dst;
606
         process_7_cnttmp = 1'b 0;
607
         if (iprmbl_err == 1'b 1)
608
            begin
609
            rxdata <= 8'h F5;   //  preamble error
610
            end
611
         else
612
            begin
613
            rxdata <= 8'h D5;
614
            end
615
         end
616
 
617
 
618
     state_typ_s_Dword32Aligned:
619
        begin
620
        if (count == 1)
621
           begin
622
           state <= state_typ_s_dst;
623
           process_7_cnttmp = 1'b 0;
624
           end
625
        case (count)
626
            1'b 0:
627
               begin
628
               rxdata[7:0] <= 8'h 00;
629
               end
630
            1'b 1:
631
               begin
632
               rxdata[7:0] <= 8'h 00;
633
               end
634
            default:
635
               ;
636
        endcase
637
        end
638
 
639
 
640
      state_typ_s_dst:
641
         begin
642
         if (count == 5)
643
            begin
644
            state <= state_typ_s_src;
645
            process_7_cnttmp = 1'b 0;
646
            end
647
         if (mac_reverse == 1'b 1)
648
            begin
649
            process_7_hi = 6'b 101111 - count * 8;
650
            process_7_lo = 6'b 101000 - count * 8;
651
            end
652
         else
653
            begin
654
            process_7_hi = count * 8 + 3'b 111;
655
            process_7_lo = count * 8;
656
            end
657
                  case (count)
658
         1'b 0:
659
            begin
660
            rxdata[7:0] <= idst[7:0];
661
            end
662
         1'b 1:
663
            begin
664
            rxdata[7:0] <= idst[15:8];
665
            end
666
         2'b 10:
667
            begin
668
            rxdata[7:0] <= idst[23:16];
669
            end
670
         2'b 11:
671
            begin
672
            rxdata[7:0] <= idst[31:24];
673
            end
674
         3'b 100:
675
            begin
676
            rxdata[7:0] <= idst[39:32];
677
            end
678
         3'b 101:
679
            begin
680
            rxdata[7:0] <= idst[47:40];
681
            end
682
         default:
683
            ;
684
         endcase
685
         end
686
      state_typ_s_src:
687
         begin
688
 
689
           if (runt_gen==1'b1)
690
           begin
691
 
692
                if (count == 5)
693
                begin
694
 
695
                        if (ipause_gen == 1'b 1)
696
                        begin
697
                                state <= state_typ_s_pause;
698
                        end
699
                        else if (ivlan_en == 1'b 1 )
700
                        begin
701
                                state <= state_typ_s_tag;   //  VLAN follows
702
                        end
703
                        else
704
                        begin
705
                                state <= state_typ_s_len;   //  normal frame
706
                        end
707
 
708
                        process_7_cnttmp = 1'b 0;
709
                end
710
 
711
            end
712
            else
713
            begin
714
 
715
                if (count == 5)
716
                begin
717
 
718
                        if (ipause_gen == 1'b 1)
719
                        begin
720
                                state <= state_typ_s_pause;
721
                        end
722
                        else if (ivlan_en == 1'b 1 )
723
                        begin
724
                                state <= state_typ_s_tag;   //  VLAN follows
725
                        end
726
                        else
727
                        begin
728
                                state <= state_typ_s_len;   //  normal frame
729
                        end
730
 
731
                        process_7_cnttmp = 1'b 0;
732
                end
733
 
734
             end
735
 
736
         if (mac_reverse == 1'b 1)
737
            begin
738
            process_7_hi = 6'b 101111 - count * 8;
739
            process_7_lo = 6'b 101000 - count * 8;
740
            end
741
         else
742
            begin
743
            process_7_hi = count * 8 + 3'b 111;
744
            process_7_lo = count * 8;
745
            end
746
        case (count)
747
         1'b 0:
748
            begin
749
            rxdata[7:0] <= isrc[7:0];
750
            end
751
         1'b 1:
752
            begin
753
            rxdata[7:0] <= isrc[15:8];
754
            end
755
         2'b 10:
756
            begin
757
            rxdata[7:0] <= isrc[23:16];
758
            end
759
         2'b 11:
760
            begin
761
            rxdata[7:0] <= isrc[31:24];
762
            end
763
         3'b 100:
764
            begin
765
            rxdata[7:0] <= isrc[39:32];
766
            end
767
         3'b 101:
768
            begin
769
            rxdata[7:0] <= isrc[47:40];
770
            end
771
         default:
772
            ;
773
         endcase         end
774
      state_typ_s_pause:
775
         begin
776
         if (count == 0)
777
            begin
778
            rxdata <= 8'h 88;
779
            end
780
         else if (count == 1 )
781
            begin
782
            rxdata <= 8'h 08;
783
            end
784
         else if (count == 2 )
785
            begin
786
            rxdata <= 8'h 00;
787
            end
788
         else if (count == 3 )
789
            begin
790
            rxdata <= 8'h 01;
791
            end
792
         else if (count == 4 )
793
            begin
794
            rxdata <= pquant[15:8];
795
            end
796
         else if (count == 5 )
797
            begin
798
            rxdata <= pquant[7:0];
799
            if (ipad_en == 1'b 1)
800
               begin
801
               state <= state_typ_s_pad;
802
               end
803
            else
804
               begin
805
               state <= state_typ_s_crc;    //  error non-padded pause frame
806
               end
807
            process_7_cnttmp = 1'b 0;
808
            end
809
         end
810
      state_typ_s_tag:
811
         begin
812
         if (count == 0)
813
            begin
814
            rxdata <= 8'h 81;
815
            end
816
         else if (count == 1 )
817
            begin
818
            rxdata <= 8'h 00;
819
            end
820
         else if (count == 2 )
821
            begin
822
            rxdata <= ivlan_ctl[15:8];
823
            end
824
         else if (count == 3 )
825
            begin
826
 
827
                if (istack_en==1'b0)
828
                begin
829
 
830
                        rxdata <= ivlan_ctl[7:0];
831
                        state  <= state_typ_s_len;
832
                        process_7_cnttmp = 1'b 0;
833
                end
834
                else
835
                begin
836
 
837
                        rxdata <= ivlan_ctl[7:0];
838
                        state  <= state_typ_s_stack;
839
                        process_7_cnttmp = 1'b 0;
840
 
841
                end
842
 
843
            end
844
         end
845
      state_typ_s_stack:
846
         begin
847
         if (count == 0)
848
            begin
849
            rxdata <= 8'h 81;
850
            end
851
         else if (count == 1 )
852
            begin
853
            rxdata <= 8'h 00;
854
            end
855
         else if (count == 2 )
856
            begin
857
            rxdata <= ivlan_ctl[15:8];
858
            end
859
         else if (count == 3 )
860
            begin
861
 
862
                rxdata <= ivlan_ctl[7:0];
863
                state  <= state_typ_s_len;
864
                process_7_cnttmp = 1'b 0;
865
 
866
            end
867
         end
868
      state_typ_s_len:
869
         begin
870
         if (count == 0)
871
            begin
872
            if (frmtype != 0)
873
               begin
874
               rxdata <= frmtype[15:8];
875
               end
876
            else
877
               begin
878
               rxdata <= ilen[15:8];    //  MSB
879
               end
880
            end
881
         else if (count == 1 )
882
            begin
883
            if (frmtype != 0)
884
               begin
885
               rxdata <= frmtype[7:0];
886
               end
887
            else
888
               begin
889
               rxdata <= ilen[7:0]; //  LSB
890
               end
891
//  if zero length frame go directly to pad
892
            if (ilen == 0)
893
               begin
894
               if (idata_only == 1'b 1 & iend_err == 1'b 1)
895
                  begin
896
                  state <= state_typ_s_enderr;
897
                  end
898
               else if (idata_only == 1'b 1 )
899
                  begin
900
                  state <= state_typ_s_idle;    //  stop immediately
901
                  end
902
               else if (ipad_en == 1'b 1 )
903
                  begin
904
                  state <= state_typ_s_pad;
905
                  end
906
               else
907
                  begin
908
                  state <= state_typ_s_crc;
909
                  end
910
               end
911
            else
912
               begin
913
               state <= state_typ_s_data;
914
               end
915
            process_7_cnttmp = 1'b 0;
916
            end
917
         end
918
      state_typ_s_data:
919
         begin
920
         if (count == 0)
921
            begin
922
            rxdata <= icntstart;    //  first the init
923
            datacnt <= icntstart;
924
            end
925
         else if (count == 1 )
926
            begin
927
            rxdata <= icntstep; //  then the step
928
            end
929
         else
930
            begin
931
            rxdata <= datacnt;  //  then data
932
            datacnt <= (datacnt + icntstep) % 256;
933
            end
934
//  check end of payload
935
         if (count >= ilen - 1'b 1)
936
            begin
937
            if (idata_only == 1'b 1)
938
               begin
939
               if (iend_err == 1'b 1)
940
                  begin
941
                  state <= state_typ_s_enderr;
942
                  end
943
               else if (iipg_len != 0 )
944
                  begin
945
                  state <= state_typ_s_ipg;
946
                  process_7_cnttmp = 1'b 0;
947
                  end
948
               else
949
                  begin
950
                  state <= state_typ_s_idle;
951
                  end
952
               end
953
            else if (poscnt < 6'b 111100 - 1'b 1 & ipad_en ==
954
    1'b 1 )
955
               begin
956
//  need to pad ?
957
               state <= state_typ_s_pad;
958
               end
959
            else
960
               begin
961
               state <= state_typ_s_crc;
962
               process_7_cnttmp = 1'b 0;
963
               end
964
//  modify last data byte if payload error was requested
965
            if (ipayload_err == 1'b 1)
966
               begin
967
               rxdata <= rxdata;    //  just keep the old value signals error
968
               end
969
            end
970
         end
971
      state_typ_s_pad:
972
         begin
973
         rxdata <= {8{1'b 0}};  //  PAD BYTE
974
         if (poscnt >= 6'b 111100 - 1'b 1 & long_pause==1'b0)
975
            begin
976
            state <= state_typ_s_crc;
977
            process_7_cnttmp = 1'b 0;
978
            end
979
         else if (poscnt >= 6'b 111111 - 1'b 1 & long_pause==1'b1)
980
            begin
981
            state <= state_typ_s_crc;
982
            process_7_cnttmp = 1'b 0;
983
            end
984
         end
985
      state_typ_s_crc:
986
         begin
987
         process_7_hi = 5'b 11111 - count * 8;
988
//  send CRC inverted, MSB of most significant byte first
989
 
990
        if (icrc_err == 1'b 0)
991
        begin
992
 
993
                for (V2V_process_7_i = 0; V2V_process_7_i <= 7; V2V_process_7_i = V2V_process_7_i + 1)
994
                begin
995
                        rxdata[V2V_process_7_i] <= crc32[process_7_hi - V2V_process_7_i] ^ 1'b 1;   //  first LSB is CRC MSB
996
                end
997
 
998
         end
999
         else if (count==2 & icrc_err == 1'b 1)
1000
         begin
1001
 
1002
 
1003
                for (V2V_process_7_i = 0; V2V_process_7_i <= 7; V2V_process_7_i = V2V_process_7_i + 1)
1004
                begin
1005
                        rxdata[V2V_process_7_i] <= !(crc32[process_7_hi - V2V_process_7_i] ^ 1'b 1);    //  first LSB is CRC MSB
1006
                end
1007
 
1008
         end
1009
         else
1010
         begin
1011
 
1012
                for (V2V_process_7_i = 0; V2V_process_7_i <= 7; V2V_process_7_i = V2V_process_7_i + 1)
1013
                begin
1014
                        rxdata[V2V_process_7_i] <= crc32[process_7_hi - V2V_process_7_i] ^ 1'b 1;   //  first LSB is CRC MSB
1015
                end
1016
 
1017
         end
1018
 
1019
         if (count == 3)
1020
            begin
1021
            if (iend_err == 1'b 1)
1022
               begin
1023
               state <= state_typ_s_enderr;
1024
               end
1025
            else if (iipg_len > 0 )
1026
               begin
1027
               state <= state_typ_s_ipg;
1028
               process_7_cnttmp = 1'b 1;
1029
               end
1030
            else
1031
               begin
1032
               state <= state_typ_s_idle;
1033
               end
1034
            end
1035
         end
1036
      state_typ_s_enderr:
1037
         begin
1038
         if (iipg_len == 0)
1039
            begin
1040
//  delay dv going low by one cycle
1041
            state <= state_typ_s_idle;
1042
            end
1043
         else
1044
            begin
1045
            state <= state_typ_s_ipg;
1046
            process_7_cnttmp = 1'b 1;
1047
            end
1048
         end
1049
      state_typ_s_ipg:
1050
         begin
1051
         if (count >= iipg_len)
1052
            begin
1053
//  wait after last
1054
            if (ifalse_carrier == 1'b 1)
1055
               begin
1056
               state <= state_typ_s_false_carrier;
1057
               end
1058
 
1059
            else if (icarrier_sense == 1'b 1)
1060
               begin
1061
               state <= state_typ_s_carrier_sense;
1062
               end
1063
            else
1064
               begin
1065
               state <= state_typ_s_idle;
1066
               end
1067
            end
1068
         end
1069
 
1070
 
1071
 
1072
 
1073
//simualte carrier extension
1074
      state_typ_s_carrier_extend:
1075
         begin
1076
         rxdata <= 8'h 0F;
1077
         if (iipg_len > 0)
1078
            begin
1079
            state <= state_typ_s_ipg;
1080
            end
1081
         else
1082
                    begin
1083
            state <= state_typ_s_idle;
1084
            end
1085
         end
1086
 
1087
//simualte carrier extension with error
1088
      state_typ_s_carrier_extend_error:
1089
        begin
1090
        rxdata <= 8'h 1F;
1091
        if (iipg_len > 0)
1092
           begin
1093
           state <= state_typ_s_ipg;
1094
           end
1095
        else
1096
           begin
1097
            state <= state_typ_s_idle;
1098
            end
1099
         end
1100
 
1101
//simualte false carrier
1102
      state_typ_s_false_carrier:
1103
         begin
1104
            rxdata <= 8'h 0E;
1105
            state <= state_typ_s_idle;
1106
         end
1107
 
1108
//simualte carrier sense
1109
      state_typ_s_carrier_sense:
1110
         begin
1111
            rxdata <= 8'h FF;
1112
            state <= state_typ_s_idle;
1113
         end
1114
 
1115
 
1116
 
1117
      endcase
1118
      count <= process_7_cnttmp;    //  load the counter with the new value                   
1119
      end
1120
   end
1121
 
1122
//  local copied (registered) commands 
1123
 
1124
 
1125
 
1126
 
1127
endmodule // module ethgenerator
1128
 

powered by: WebSVN 2.1.0

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