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

Subversion Repositories sgmii

[/] [sgmii/] [trunk/] [sim/] [BFMs/] [SGMII_altera/] [testbench/] [model/] [ethmon_32.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: ethmon_32.v,v $
7
// $Source: /ipbu/cvs/sio/projects/TriSpeedEthernet/src/testbench/models/verilog/ethernet_model/mon/ethmon_32.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
// Ethernet Traffic Monitor/Decoder for 32 bit MAC Atlantic client interface
19
// Instantiated in top_ethmonitor32 (top_ethmon32.v)
20
//
21
// 
22
// ALTERA Confidential and Proprietary
23
// Copyright 2006 (c) Altera Corporation
24
// All rights reserved
25
//
26
// -------------------------------------------------------------------------
27
// -------------------------------------------------------------------------
28
 
29
`timescale 1 ns / 10 ps  // timescale for following modules
30
 
31
 
32
module ethmonitor_32 (
33
 
34
   reset,
35
   tx_clk,
36
   txd,
37
   tx_dv,
38
   tx_er,
39
   dst,
40
   src,
41
   prmble_len,
42
   pquant,
43
   vlan_ctl,
44
   len,
45
   frmtype,
46
   payload,
47
   payload_vld,
48
   is_vlan,
49
   is_stack_vlan,
50
   is_pause,
51
   crc_err,
52
   prmbl_err,
53
   len_err,
54
   payload_err,
55
   frame_err,
56
   pause_op_err,
57
   pause_dst_err,
58
   mac_err,
59
   end_err,
60
   jumbo_en,
61
   data_only,
62
   frm_rcvd);
63
 
64
parameter ENABLE_SHIFT16 = 1'b 0;
65
 
66
input   reset; //  active high
67
input   tx_clk;
68
input   [7:0] txd;
69
input   tx_dv;
70
input   tx_er;
71
output   [47:0] dst; //  destination address
72
output   [47:0] src; //  source address
73
output   [13:0] prmble_len; //  length of preamble
74
output   [15:0] pquant; //  Pause Quanta value
75
output   [15:0] vlan_ctl; //  VLAN control info
76
output   [15:0] len; //  Length of payload
77
output   [15:0] frmtype; //  if non-null: type field instead length
78
output   [7:0] payload;
79
output   payload_vld;
80
output   is_vlan;
81
output   is_stack_vlan;
82
output   is_pause;
83
output   crc_err;
84
output   prmbl_err;
85
output   len_err;
86
output   payload_err;
87
output   frame_err;
88
output   pause_op_err;
89
output   pause_dst_err;
90
output   mac_err;
91
output   end_err;
92
input   jumbo_en;
93
input   data_only;
94
output   frm_rcvd;
95
//  GMII transmit interface: To be connected to MAC TX
96
wire    [47:0] dst;
97
reg     [47:0] src;
98
wire    [13:0] prmble_len;
99
reg     [15:0] pquant;
100
reg     [15:0] vlan_ctl;
101
wire    [15:0] len;
102
wire    [15:0] frmtype;
103
reg     [7:0] payload;
104
//  Indicators
105
reg     payload_vld;
106
wire    is_vlan;
107
wire    is_stack_vlan;
108
wire    is_pause;
109
reg     crc_err;
110
reg     prmbl_err;
111
reg     len_err;
112
reg     payload_err;
113
reg     frame_err;
114
reg     pause_op_err;
115
reg     pause_dst_err;
116
reg     mac_err;
117
//  Control
118
reg     end_err;
119
reg     frm_rcvd;
120
reg     [13:0] iprmble_len; //  length of preamble
121
reg     [15:0] ifrmtype;
122
reg     [15:0] ilen;
123
reg     [47:0] idst;
124
reg     iis_vlan;
125
reg     iis_stack_vlan;
126
reg     iis_pause;
127
//  internal
128
 
129
// TYPE state_typ:
130
parameter state_typ_s_idle = 0;
131
parameter state_typ_s_prmbl = 1;
132
parameter state_typ_s_dst = 2;
133
parameter state_typ_s_src = 3;
134
parameter state_typ_s_typelen = 4;
135
parameter state_typ_s_pause = 5;
136
parameter state_typ_s_tag = 6;
137
parameter state_typ_s_len = 7;
138
parameter state_typ_s_data = 8;
139
parameter state_typ_s_pad = 9;
140
parameter state_typ_s_crc = 10;
141
parameter state_typ_s_abort = 11;
142
parameter state_typ_s_utype = 12;
143
parameter state_typ_s_Dword32Aligned = 13;
144
 
145
 
146
reg     [3:0] state;
147
reg     [3:0] last_state;
148
reg     last_tx_dv; //  follows tx_dv with one cycle delay
149
reg     [31:0] crc32;
150
reg     [31:0] count;
151
reg     [31:0] poscnt; //  position in frame starts at first dst byte
152
reg     [7:0] datacnt; //  counter to verify payload
153
reg     [7:0] datainc; //  counter increment
154
wire    tx_sof; //  start of frame indicator for 1 clk cycle with 1st byte
155
reg     tx_dst; //  start of frame indicator for 1 clk cycle with 1st byte
156
//  connect permanent port signals
157
//  ------------------------------
158
reg     [31:0]  process_3_crctmp;
159
reg     [3:0]  V2V_process_3_i;
160
integer  process_8_ix;
161
integer  process_9_ix;
162
reg      process_9_ln;
163
integer  process_12_ix;
164
integer  process_10_ix;
165
integer  process_11_hi;
166
integer  process_11_lo;
167
reg     [31:0]  process_11_cnttmp;
168
integer  process_11_i;
169
integer  process_11_flen;
170
 
171
assign prmble_len = iprmble_len;
172
assign frmtype = ifrmtype;
173
assign len = ilen;
174
assign dst = idst;
175
assign is_vlan = iis_vlan;
176
assign is_stack_vlan = iis_stack_vlan;
177
assign is_pause = iis_pause;
178
//  generate tx start pulse
179
//  ----------------------
180
assign tx_sof = ~last_tx_dv & tx_dv; //  pulse with first byte 0 to 1 change
181
//  generate pulse start of destination address
182
//  --------------------
183
always @(last_state or state)
184
   begin : process_1
185
   if (last_state != state_typ_s_dst & state == state_typ_s_dst)
186
      begin
187
      tx_dst <= 1'b 1;
188
      end
189
   else
190
      begin
191
      tx_dst <= 1'b 0;
192
      end
193
   end
194
//  ------------------------------------------
195
//  capture tx_er indicator
196
//  ------------------------------------------
197
always @(posedge tx_clk or posedge reset)
198
   begin : process_2
199
   if (reset == 1'b 1)
200
      begin
201
      mac_err <= 1'b 0;
202
      last_tx_dv <= 1'b 0;
203
      end
204
   else
205
      begin
206
      if (tx_sof == 1'b 1)
207
         begin
208
         mac_err <= 1'b 0;  //  reset indicator at start of new receive
209
         end
210
      else if (tx_er == 1'b 1 )
211
         begin
212
         mac_err <= 1'b 1;  //  capture one or many
213
         end
214
      last_tx_dv <= tx_dv;
215
      end
216
   end
217
//  ----------------------------------------------
218
//  CRC calculation over all bytes except preamble
219
//  ----------------------------------------------
220
always @(posedge tx_clk or posedge reset)
221
   begin : process_3
222
   if (reset == 1'b 1)
223
      begin
224
      crc32 <= {32{1'b 1}};
225
      crc_err <= 1'b 0;
226
      end
227
   else
228
      begin
229
//  need it ahead
230
      if (tx_dst == 1'b 1 | state != state_typ_s_idle &
231
    state != state_typ_s_prmbl & state != state_typ_s_utype |
232
    state == state_typ_s_utype & tx_dv == 1'b 1)
233
         begin
234
//  push all inclusive CRC bytes
235
//  preset CRC or load current value
236
         if (tx_dst == 1'b 1)
237
            begin
238
//  first data, preset CRC
239
            process_3_crctmp = {32{1'b 1}};
240
            end
241
         else
242
            begin
243
            process_3_crctmp = crc32;
244
            end
245
//  calculate next step
246
 
247
         for (V2V_process_3_i = 0; V2V_process_3_i <= 7; V2V_process_3_i = V2V_process_3_i + 1)
248
            begin
249
            if ((txd[V2V_process_3_i] ^ process_3_crctmp[31]) == 1'b 1)
250
               begin
251
               process_3_crctmp = (process_3_crctmp << 1);  //  shift in a 0, will be xor'ed to 1 by the polynom
252
               process_3_crctmp = process_3_crctmp ^ 32'h 04C11DB7;
253
               end
254
            else
255
               begin
256
               process_3_crctmp = (process_3_crctmp << 1);  //  shift in a 0
257
               end
258
            end
259
//  process all bits we have here
260
         crc32 <= process_3_crctmp; //  remember current value
261
//  check if CRC is valid
262
         if (process_3_crctmp == 32'h C704DD7B)
263
            begin
264
            crc_err <= 1'b 0;
265
            end
266
         else
267
            begin
268
            crc_err <= 1'b 1;
269
            end
270
         end
271
      end
272
   end
273
//  ----------------------------------------------
274
//  Extract RX Payload on payload bus and check payload errors:
275
//  * first byte is counter initialization
276
//  * second byte is counter increment
277
//  * data begins from 3rd byte on 
278
//  ----------------------------------------------
279
always @(posedge tx_clk or posedge reset)
280
   begin : process_4
281
   if (reset == 1'b 1)
282
      begin
283
      payload <= {8{1'b 0}};
284
      payload_vld <= 1'b 0;
285
      payload_err <= 1'b 0;
286
      datacnt <= 0;
287
      end
288
   else
289
      begin
290
      if (state == state_typ_s_typelen)
291
         begin
292
         payload_err <= 1'b 0;  //  reset as a frame of length 0 will not get into S_DATA.
293
         end
294
      if (state == state_typ_s_data)
295
         begin
296
         payload <= txd;
297
         payload_vld <= 1'b 1;
298
         if (count == 0)
299
            begin
300
            datacnt <= ({1'b 0, txd});  //  load counter
301
            payload_err <= 1'b 0;
302
            end
303
         else if (count == 1 )
304
            begin
305
            datainc <= ({1'b 0, txd});  //  load increment
306
//  verify payload contents
307
            end
308
         else
309
            begin
310
            datacnt <= (datacnt + datainc) % 256;
311
            if (datacnt != ({1'b 0, txd}))
312
               begin
313
               payload_err <= 1'b 1;
314
               end
315
            end
316
         end
317
      else
318
         begin
319
         payload <= {8{1'b 0}};
320
         payload_vld <= 1'b 0;
321
         end
322
      end
323
   end
324
//  ----------------------------------------------
325
//  Position Counter: Starts with first octet of destination address
326
//  ----------------------------------------------
327
always @(posedge tx_clk or posedge reset)
328
   begin : process_5
329
   if (reset == 1'b 1)
330
      begin
331
      poscnt <= 0;
332
      end
333
   else
334
      begin
335
      if (tx_dst == 1'b 1)
336
         begin
337
//  reset at start of DST 
338
         poscnt <= 1;
339
         end
340
      else
341
         begin
342
         if (poscnt < 65535)
343
            begin
344
            poscnt <= poscnt + 1'b 1;
345
            end
346
         end
347
      end
348
   end
349
//  ----------------------------------------------
350
//  End of Frame:
351
//  change from non-idle to idle indicates something was received
352
//  if dv is still asserted this is an end error
353
//  ----------------------------------------------
354
always @(posedge tx_clk or posedge reset)
355
   begin : process_6
356
   if (reset == 1'b 1)
357
      begin
358
      frm_rcvd <= 1'b 0;
359
      end_err <= 1'b 0;
360
      end
361
   else
362
      begin
363
      if (last_state != state_typ_s_idle & state == state_typ_s_idle)
364
         begin
365
         frm_rcvd <= 1'b 1;
366
         end
367
      else
368
         begin
369
         frm_rcvd <= 1'b 0;
370
         end
371
      if (tx_sof == 1'b 1)
372
         begin
373
         end_err <= 1'b 0;
374
         end
375
      else if (last_state != state_typ_s_idle & state == state_typ_s_idle &
376
    tx_dv == 1'b 1 )
377
         begin
378
         end_err <= 1'b 1;  //  dv still asserted even after nothing more expected
379
         end
380
      end
381
   end
382
//  ----------------------------------------------
383
//  Preamble check
384
//  ----------------------------------------------
385
always @(posedge tx_clk or posedge reset)
386
   begin : process_7
387
   if (reset == 1'b 1)
388
      begin
389
      prmbl_err <= 1'b 0;
390
      iprmble_len <= 0;
391
      end
392
   else
393
      begin
394
      if (tx_sof == 1'b 1)
395
         begin
396
         if (txd != 8'h 55)
397
            begin
398
            prmbl_err <= 1'b 1;
399
            end
400
         else
401
            begin
402
            prmbl_err <= 1'b 0; //  reset usually
403
            end
404
         if (data_only == 1'b 1)
405
            begin
406
            iprmble_len <= 0;
407
            end
408
         else
409
            begin
410
            iprmble_len <= 1;
411
            end
412
         end
413
      else if (state == state_typ_s_prmbl )
414
         begin
415
         if (txd != 8'h 55 & txd != 8'h D5)
416
            begin
417
            prmbl_err <= 1'b 1;
418
            end
419
         iprmble_len <= iprmble_len + 1'b 1;
420
         end
421
      end
422
   end
423
//  ----------------------------------------------
424
//  Extract Source and Destination addresses
425
//  ----------------------------------------------
426
always @(posedge tx_clk or posedge reset)
427
   begin : process_8
428
   if (reset == 1'b 1)
429
      begin
430
      idst <= {48{1'b 0}};
431
      src <= {48{1'b 0}};
432
      end
433
   else
434
      begin
435
      process_8_ix = count * 8;
436
 
437
      if (tx_sof == 1'b 1 & data_only == 1'b 1 & state == state_typ_s_Dword32Aligned & ENABLE_SHIFT16 == 1'b1)
438
         begin
439
             case (count)
440
             1'b 0 : ;
441
             1'b 1 : ;
442
             default:;
443
             endcase
444
          end
445
      if (tx_sof == 1'b 0 & data_only == 1'b 1 & ENABLE_SHIFT16 == 1'b1 & state == state_typ_s_dst)
446
         begin
447
         case (count)
448
         1'b 0:
449
            begin
450
            idst[7:0] <= txd[7:0];
451
            end
452
         1'b 1:
453
            begin
454
            idst[15:8] <= txd[7:0];
455
            end
456
         2'b 10:
457
            begin
458
            idst[23:16] <= txd[7:0];
459
            end
460
         2'b 11:
461
            begin
462
            idst[31:24] <= txd[7:0];
463
            end
464
         3'b 100:
465
            begin
466
            idst[39:32] <= txd[7:0];
467
            end
468
         3'b 101:
469
            begin
470
            idst[47:40] <= txd[7:0];
471
            end
472
         default:
473
            ;
474
         endcase         end
475
 
476
 
477
      if (tx_sof == 1'b 1 & data_only == 1'b 1 & ENABLE_SHIFT16 == 1'b0 | state == state_typ_s_dst)
478
         begin
479
         case (count)
480
         1'b 0:
481
            begin
482
            idst[7:0] <= txd[7:0];
483
            end
484
         1'b 1:
485
            begin
486
            idst[15:8] <= txd[7:0];
487
            end
488
         2'b 10:
489
            begin
490
            idst[23:16] <= txd[7:0];
491
            end
492
         2'b 11:
493
            begin
494
            idst[31:24] <= txd[7:0];
495
            end
496
         3'b 100:
497
            begin
498
            idst[39:32] <= txd[7:0];
499
            end
500
         3'b 101:
501
            begin
502
            idst[47:40] <= txd[7:0];
503
            end
504
         default:
505
            ;
506
         endcase         end
507
      if (state == state_typ_s_src)
508
         begin
509
        case (count)
510
         1'b 0:
511
            begin
512
            src[7:0] <= txd[7:0];
513
            end
514
         1'b 1:
515
            begin
516
            src[15:8] <= txd[7:0];
517
            end
518
         2'b 10:
519
            begin
520
            src[23:16] <= txd[7:0];
521
            end
522
         2'b 11:
523
            begin
524
            src[31:24] <= txd[7:0];
525
            end
526
         3'b 100:
527
            begin
528
            src[39:32] <= txd[7:0];
529
            end
530
         3'b 101:
531
            begin
532
            src[47:40] <= txd[7:0];
533
            end
534
         default:
535
         ;
536
         endcase
537
       end
538
      end
539
   end
540
 
541
//  ----------------------------------------------
542
//  Extract Length/Type field and VLAN Tag identifier
543
//  ----------------------------------------------
544
 
545
always @(posedge tx_clk or posedge reset)
546
   begin : process_12
547
   if (reset == 1'b 1)
548
      begin
549
      ilen <= {16{1'b 0}};
550
      ifrmtype <= {16{1'b 0}};
551
      vlan_ctl <= {16{1'b 0}};
552
      iis_vlan <= 1'b 0;
553
      len_err <= 1'b 0;
554
      iis_stack_vlan <= 1'b0;
555
      end
556
   else
557
      begin
558
      process_12_ix = 4'b 1000 - count * 8;
559
// if( tx_sof_d = '1' ) then              -- clear all on start of every frame
560
// 
561
//     ilen     <= (others => '0');
562
//     ifrmtype <= (others => '0');
563
//     vlan_ctl <= (others => '0');
564
//     iis_vlan  <= '0';
565
//     
566
// end if;
567
      if (state == state_typ_s_typelen)
568
         begin
569
//  if in type/len set both
570
        case (count)
571
         1'b 0:
572
            begin
573
            ifrmtype[15:8] <= txd;
574
            ilen[15:8] <= txd;
575
            end
576
         1'b 1:
577
            begin
578
            ifrmtype[7:0] <= txd;
579
            ilen[7:0] <= txd;
580
            end
581
         default:
582
            ;
583
         endcase
584
         vlan_ctl <= {16{1'b 0}};   //  clear at start of new frame (at SOF it is too early)
585
         iis_vlan <= 1'b 0;
586
         len_err <= 1'b 0;
587
         end
588
 
589
         if(state==state_typ_s_typelen)
590
         begin
591
 
592
                iis_stack_vlan <= 1'b0 ;
593
 
594
         end
595
         else if (last_state == state_typ_s_len & state == state_typ_s_tag)
596
         begin
597
 
598
                iis_stack_vlan <= 1'b1 ;
599
 
600
         end
601
 
602
      else if (state == state_typ_s_len )
603
         begin
604
//  in len again, set len independently
605
         case (count)
606
         1'b 0:
607
            begin
608
            ifrmtype[15:8] <= txd;
609
            ilen[15:8] <= txd;
610
            end
611
         1'b 1:
612
            begin
613
            ifrmtype[7:0] <= txd;
614
            ilen[7:0] <= txd;
615
            end
616
         default:
617
            ;
618
         endcase
619
         end
620
      else if (state == state_typ_s_tag )
621
         begin
622
         iis_vlan <= 1'b 1;
623
        case (count)
624
         1'b 0:
625
            begin
626
            vlan_ctl[15:8] <= txd;  // ilen(ix+7 downto ix)     <= txd;
627
            end
628
         1'b 1:
629
            begin
630
            vlan_ctl[7:0] <= txd;
631
            end
632
         default:
633
            ;
634
         endcase         end
635
//  verify length at end of frame for normal frames (length 46... max and not a type)
636
      if (last_state == state_typ_s_crc & state == state_typ_s_idle &
637
    iis_pause == 1'b 0 & (iis_vlan == 1'b 0 &
638
    ilen > 45 | iis_vlan == 1'b 1 &
639
    ilen > 41))
640
         begin
641
//  verify integrity of length field 
642
         if (tx_dv == 1'b 1 |
643
             iis_stack_vlan == 1'b 1 & ilen != poscnt - 5'b 11010 |
644
             (iis_vlan == 1'b 1 & iis_stack_vlan == 1'b 0) & ilen != poscnt - 5'b 10110 |
645
             iis_vlan == 1'b 0 & ilen != poscnt - 5'b 10010)
646
            begin
647
            len_err <= 1'b 1;
648
            end
649
         else
650
            begin
651
            len_err <= 1'b 0;
652
            end
653
         end
654
      end
655
   end
656
//  ----------------------------------------------
657
//  Extract Pause frame indication,
658
//                opcode error,
659
//                destination address error,
660
//                and Pause Quanta
661
//  ----------------------------------------------
662
always @(posedge tx_clk or posedge reset)
663
   begin : process_13
664
   if (reset == 1'b 1)
665
      begin
666
      pquant <= {16{1'b 0}};
667
      iis_pause <= 1'b 0;
668
      pause_op_err <= 1'b 0;
669
      pause_dst_err <= 1'b 0;
670
      end
671
   else
672
      begin
673
      if (tx_sof == 1'b 1)
674
         begin
675
         iis_pause <= 1'b 0;    //  clear at start of frame
676
         pause_op_err <= 1'b 0;
677
         pause_dst_err <= 1'b 0;
678
         end
679
      if (state == state_typ_s_pause)
680
         begin
681
         iis_pause <= 1'b 1;
682
         //if (count >= 2)
683
            //begin
684
//  pick octets after opcode
685
        case (count)
686
            2'b 11:
687
               begin
688
               pquant[15:8] <= txd;
689
               end
690
            1'b 0:
691
               begin
692
               pquant[7:0] <= txd;
693
               end
694
            default:
695
               ;
696
            endcase
697
            //end
698
        if (count == 0 & txd != 8'h 00 |
699
    count == 1 & txd != 8'h 01 )
700
            begin
701
            pause_op_err <= 1'b 1;
702
            end
703
         if (idst != 48'h 010000c28001)
704
            begin
705
//  01-80-c2-00-00-01 is standard !
706
            pause_dst_err <= 1'b 1;
707
            end
708
         end
709
      end
710
   end
711
//  ----------------------------------------------
712
//  Monitor State Machine
713
//  ----------------------------------------------
714
always @(posedge tx_clk or posedge reset)
715
   begin : process_11
716
   if (reset == 1'b 1)
717
      begin
718
      state <= state_typ_s_idle;
719
      last_state <= state_typ_s_idle;
720
      count <= 0;
721
      frame_err <= 1'b 0;   //  state machine abort indicator
722
      end
723
   else
724
      begin
725
//  remember last state and increment internal counter
726
      last_state <= state;
727
      if (count < 65535)
728
         begin
729
         process_11_cnttmp = count + 1'b 1;
730
         end
731
      else
732
         begin
733
         process_11_cnttmp = count;
734
         end
735
//  Abort detection: If enable goes low in middle of frame
736
      if (state != state_typ_s_idle & state != state_typ_s_abort &
737
    state != state_typ_s_utype & tx_dv == 1'b 0)
738
         begin
739
         state <= state_typ_s_abort;
740
         end
741
      else
742
         begin
743
         case (state)
744
         state_typ_s_abort:
745
            begin
746
            if (tx_dv == 1'b 1)
747
               begin
748
               if (last_tx_dv == 1'b 0 & data_only == 1'b 1)
749
                  begin
750
//  only 1 clock cycle inbetween
751
                  if (ENABLE_SHIFT16 == 1'b0)
752
                  state <= state_typ_s_dst;
753
                  else
754
                    state <= state_typ_s_Dword32Aligned;
755
 
756
                  process_11_cnttmp = 1'b 1;
757
                  frame_err <= 1'b 0;
758
                  end
759
               else
760
                  begin
761
                  state <= state_typ_s_abort;   //  wait til tx stops transmission
762
                  end
763
               end
764
            else
765
               begin
766
               state <= state_typ_s_idle;
767
               end
768
            frame_err <= 1'b 1;
769
            end
770
         state_typ_s_idle:
771
            begin
772
            if (tx_sof == 1'b 1)
773
               begin
774
//  we miss the very first !
775
               process_11_cnttmp = 1'b 1;   //  therefore need to count to 1 immediately
776
               frame_err <= 1'b 0;
777
               if (data_only == 1'b 1)
778
                  begin
779
//  no preamble checking ?
780
                  if (ENABLE_SHIFT16 == 1'b0)
781
                  state <= state_typ_s_dst;
782
                  else
783
                    state <= state_typ_s_Dword32Aligned;
784
                  end
785
               else
786
                  begin
787
                  state <= state_typ_s_prmbl;
788
                  end
789
               end
790
            else
791
               begin
792
               process_11_cnttmp = 1'b 0;   //  keep it to zero always 
793
               end
794
            end
795
         state_typ_s_prmbl:
796
            begin
797
            if (txd == 8'h D5)
798
               begin
799
               state <= state_typ_s_dst;
800
               process_11_cnttmp = 1'b 0;
801
               end
802
            end
803
 
804
         state_typ_s_Dword32Aligned:
805
           begin
806
           if (count == 1)
807
              begin
808
              state <= state_typ_s_dst;
809
              process_11_cnttmp = 1'b 0;
810
              end
811
           end
812
 
813
         state_typ_s_dst:
814
            begin
815
            if (count == 5)
816
               begin
817
               state <= state_typ_s_src;
818
               process_11_cnttmp = 1'b 0;
819
               end
820
            end
821
         state_typ_s_src:
822
            begin
823
            if (count == 5)
824
               begin
825
               state <= state_typ_s_typelen;
826
               process_11_cnttmp = 1'b 0;
827
               end
828
            end
829
         state_typ_s_typelen:
830
            begin
831
            if (count != 0)
832
               begin
833
//  second half of 2-octet field
834
               process_11_cnttmp = 1'b 0;
835
               process_11_flen = ({1'b 0, ilen[15:8], txd});    //  need it NOW
836
               if (jumbo_en == 1'b 1 & process_11_flen <= 9000 |
837
    process_11_flen <= 1500)
838
                  begin
839
//  ok normal user frame. check if data or 0 length
840
                  if (process_11_flen != 0)
841
                     begin
842
                     state <= state_typ_s_data;
843
//  no data, PAD or finished
844
                     end
845
                  else
846
                     begin
847
                     if (data_only == 1'b 1)
848
                        begin
849
                        state <= state_typ_s_idle;  //  Ok, we are done dont expect anything more
850
                        end
851
                     else
852
                        begin
853
                        state <= state_typ_s_pad;   //  zero-length frame needs padding
854
                        end
855
                     end
856
//  not normal frame
857
                  end
858
               else
859
                  begin
860
                  if (process_11_flen == 16'h 8808)
861
                     begin
862
                     state <= state_typ_s_pause;
863
                     end
864
                  else if (process_11_flen == 16'h 8100 )
865
                     begin
866
                     state <= state_typ_s_tag;
867
                     end
868
                  else
869
                     begin
870
                     state <= state_typ_s_utype;    //  S_ABORT;    -- unknown type
871
                     end
872
                  end
873
               end
874
            end
875
         state_typ_s_pause:
876
            begin
877
            if (count >= 3)
878
               begin
879
//  need to overread opcode
880
               state <= state_typ_s_pad;
881
               process_11_cnttmp = 1'b 0;
882
               end
883
            end
884
         state_typ_s_tag:
885
            begin
886
            if (count >= 1)
887
               begin
888
               state <= state_typ_s_len;
889
               process_11_cnttmp = 1'b 0;
890
               end
891
            end
892
         state_typ_s_len:
893
            begin
894
            if (count >= 1)
895
               begin
896
//  Length after VLAN TAG
897
               process_11_cnttmp = 1'b 0;
898
               process_11_flen = ({1'b 0, ilen[15:8], txd});    //  need it NOW
899
 
900
               if ( process_11_flen == 16'h8100)
901
               begin
902
 
903
                state <= state_typ_s_tag;
904
 
905
               end
906
               else if (process_11_flen != 0 & (jumbo_en == 1'b 1 &
907
    process_11_flen > 9000 | jumbo_en == 1'b 0 &
908
    process_11_flen > 1500))
909
                  begin
910
                  state <= state_typ_s_utype;
911
                  end
912
               else if (process_11_flen != 0 )
913
                  begin
914
                  state <= state_typ_s_data;
915
//  no data, PAD or finished
916
                  end
917
               else
918
                  begin
919
                  if (data_only == 1'b 1)
920
                     begin
921
                     state <= state_typ_s_idle; //  Ok, we are done dont expect CRC
922
                     end
923
                  else
924
                     begin
925
                     state <= state_typ_s_pad;
926
                     end
927
                  end
928
               end
929
            end
930
         state_typ_s_data:
931
            begin
932
            if (count >= ilen - 1'b 1)
933
               begin
934
               process_11_cnttmp = 1'b 0;
935
               if (data_only == 1'b 1)
936
                  begin
937
//  no PAD and no CRC ?
938
                  state <= state_typ_s_idle;
939
                  end
940
               else if (poscnt < 6'b 111100 - 1'b 1 )
941
                  begin
942
//  expect padding ?
943
                  state <= state_typ_s_pad;
944
                  end
945
               else
946
                  begin
947
                  state <= state_typ_s_crc;
948
                  end
949
               end
950
            end
951
         state_typ_s_pad:
952
            begin
953
            if (poscnt >= 6'b 111100 - 1'b 1)
954
               begin
955
               state <= state_typ_s_crc;
956
               process_11_cnttmp = 1'b 0;
957
               end
958
            end
959
         state_typ_s_crc:
960
            begin
961
            if (count >= 3)
962
               begin
963
               state <= state_typ_s_idle;
964
               process_11_cnttmp = 1'b 0;
965
               end
966
            end
967
         state_typ_s_utype:
968
            begin
969
            if (tx_dv == 1'b 0)
970
               begin
971
//  unknown type... wait for end of frame
972
               state <= state_typ_s_idle;
973
               process_11_cnttmp = 1'b 0;
974
               end
975
            end
976
         endcase
977
         end
978
//  abort                    
979
//  load the counter with the new value                   
980
      count <= process_11_cnttmp;
981
      end
982
   end
983
 
984
//  port signals internally reused
985
 
986
endmodule // module ethmonitor_32
987
 

powered by: WebSVN 2.1.0

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