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

Subversion Repositories turbo8051

[/] [turbo8051/] [trunk/] [rtl/] [gmac/] [mac/] [g_rx_fsm.v] - Blame information for rev 76

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

Line No. Rev Author Line
1 70 dinesha
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  Tubo 8051 cores MAC Interface Module                        ////
4
////                                                              ////
5
////  This file is part of the Turbo 8051 cores project           ////
6
////  http://www.opencores.org/cores/turbo8051/                   ////
7
////                                                              ////
8
////  Description                                                 ////
9
////  Turbo 8051 definitions.                                     ////
10
////                                                              ////
11
////  To Do:                                                      ////
12
////    nothing                                                   ////
13
////                                                              ////
14
////  Author(s):                                                  ////
15
////      - Dinesh Annayya, dinesha@opencores.org                 ////
16
////                                                              ////
17 76 dinesha
////  Revision : Mar 2, 2011                                      //// 
18
////                                                              ////
19 70 dinesha
//////////////////////////////////////////////////////////////////////
20
////                                                              ////
21
//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
22
////                                                              ////
23
//// This source file may be used and distributed without         ////
24
//// restriction provided that this copyright statement is not    ////
25
//// removed from the file and that any derivative work contains  ////
26
//// the original copyright notice and the associated disclaimer. ////
27
////                                                              ////
28
//// This source file is free software; you can redistribute it   ////
29
//// and/or modify it under the terms of the GNU Lesser General   ////
30
//// Public License as published by the Free Software Foundation; ////
31
//// either version 2.1 of the License, or (at your option) any   ////
32
//// later version.                                               ////
33
////                                                              ////
34
//// This source is distributed in the hope that it will be       ////
35
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
36
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
37
//// PURPOSE.  See the GNU Lesser General Public License for more ////
38
//// details.                                                     ////
39
////                                                              ////
40
//// You should have received a copy of the GNU Lesser General    ////
41
//// Public License along with this source; if not, download it   ////
42
//// from http://www.opencores.org/lgpl.shtml                     ////
43
////                                                              ////
44
//////////////////////////////////////////////////////////////////////
45
/***************************************************************
46
 Description:
47
 
48
 rx_fsm.v: This verilog file is the receive state machine for the MAC
49
 block. It receives nibbles from rmii block. It assembles
50
 double words from bytes. Generates writes to Receive FIFO
51
 Removes padding and generates appropriate signals to the
52
 CRC and Address Filtering block. It also generates the necessary
53
 signals to generate status for every frame.
54
 
55
 ***************************************************************/
56
/************** MODULE DECLARATION ****************************/
57
module g_rx_fsm(
58
                // Status information to Applications
59
                rx_sts_vld,
60
                rx_sts_bytes_rcvd,
61
                rx_sts_large_pkt,
62
                rx_sts_lengthfield_err,
63
                rx_sts_crc_err,
64
                rx_sts_runt_pkt_rcvd,
65
                rx_sts_rx_overrun,
66
                rx_sts_frm_length_err,
67
                rx_sts_len_mismatch,
68
                // Data Signals to Fifo Management Block
69
                clr_rx_error_from_rx_fsm,
70
                rx2ap_rx_fsm_wrt,
71
                rx2ap_rx_fsm_dt,
72
                // Fifo Control Signal to Fifo Management Block
73
                rx2ap_commit_write,
74
                rx2ap_rewind_write,
75
                // To address filtering block
76
                //commit
77
                commit_write_done,
78
 
79
                // Global Signals 
80
                reset_n,
81
                phy_rx_clk,
82
                // Signals from Mii/Rmii block for Receive data 
83
                mi2rx_strt_rcv,
84
                mi2rx_rcv_vld,
85
                mi2rx_rx_byte,
86
                mi2rx_end_rcv,
87
                mi2rx_extend,
88
                mi2rx_frame_err,
89
                mi2rx_end_frame,
90
                // Rx fifo management signal to indicate overrun
91
                rx_fifo_full,
92
                ap2rx_rx_fifo_err,
93
                // Signal from CRC check block
94
                rc2rx_crc_ok,
95
                // Signals from Config Management Block
96
                cf2rx_max_pkt_sz,
97
                cf2rx_rx_ch_en,
98
                cf2rx_strp_pad_en,
99
                cf2rx_snd_crc,
100
                cf2rx_rcv_runt_pkt_en,
101
                cf2rx_gigabit_xfr,
102
      //A200 change Port added for crs based flow control
103
      phy_crs
104
 
105
                );
106
 
107
 
108
parameter MIN_FRM_SIZE = 6'h2e        ;
109
  /******* INPUT & OUTPUT DECLARATIONS *************************/
110
  output        rx_sts_vld;                    // Receive status is available for the application
111
  output [15:0] rx_sts_bytes_rcvd;
112
  output        rx_sts_large_pkt;
113
  output        rx_sts_lengthfield_err;
114
  output        rx_sts_crc_err;
115
  output        rx_sts_runt_pkt_rcvd;
116
  output        rx_sts_rx_overrun;
117
  output        rx_sts_frm_length_err;
118
  output        rx_sts_len_mismatch;
119
 
120
  output        rx2ap_rx_fsm_wrt;              // Receive Fifo Write
121
  output [8:0]   rx2ap_rx_fsm_dt;               // This is 32 bit assembled receive data 
122
                                               // with EOP and valid bytes information in it.
123
  output        rx2ap_commit_write;            // This is to RX fifo MGMT to indicate 
124
                                               // that the current packet 
125
                                               // has to be sent to application
126
  output        rx2ap_rewind_write;            // This indicates the previous packet 
127
                                               // in the FIFO has a error
128
                                               // Ignore the packet and restart from the
129
                                               // end of previous packet
130
  output    clr_rx_error_from_rx_fsm;
131
  output    commit_write_done;
132
 
133
  input         reset_n;                               // reset from mac application interface
134
  input         phy_rx_clk;                    // Reference clock used for RX 
135
 
136
  input         mi2rx_strt_rcv;                // Receive data from the PHY
137
  input         mi2rx_rcv_vld;                 // Received nibble is valid
138
  input [7:0]    mi2rx_rx_byte;                 // Rx nibble from the RMII/MII block
139
  input         mi2rx_end_rcv;                 // This is provided by the RMII/MII 
140
                                               // block to indicate
141
                                               // end of receieve
142
  input         mi2rx_frame_err;
143
  input         mi2rx_end_frame;
144
  input         rx_fifo_full;
145
  input         ap2rx_rx_fifo_err;             // Receive error generated by the 
146
                                               // RX FIFO MGMT block
147
 
148
  input         rc2rx_crc_ok;                  // CRC of the receiving packet is OK. 
149
                                               // Generated by CRC block
150
 
151
  input [15:0]  cf2rx_max_pkt_sz;              // max packet size
152
 
153
  input         cf2rx_rx_ch_en;                // Receive Enabled
154
  input         cf2rx_strp_pad_en;             // Do not Append padding after the data
155
  input         cf2rx_snd_crc;                 // Append CRC to the data 
156
                                               // ( This automatically means padding
157
                                               // will be enabled)
158
  input         cf2rx_rcv_runt_pkt_en;         // Receive needs to receive
159
  input         cf2rx_gigabit_xfr;
160
  input         mi2rx_extend;
161
 
162
  //A200 change Port added for crs based flow control
163
  input  phy_crs;
164
 
165
 
166
  /******* WIRE & REG DECLARATION FOR INPUT AND OUTPUTS ********/
167
  reg           rx2ap_commit_write;
168
  reg           rx2ap_rewind_write;
169
  reg [8:0]      rx2ap_rx_fsm_dt;
170
  reg           rx2ap_rx_fsm_wrt;
171
  wire [31:0]    rx_sts_dt;
172
  reg [31:0]     rx_sts;
173
 
174
  /*** REG & WIRE DECLARATIONS FOR LOCAL SIGNALS ***************/
175
  reg           commit_write;
176
  reg           rewind_write;
177
  wire          look_at_length_field;
178
  reg           send_crc;
179
  reg           rcv_pad_data;
180
  reg           first_dword;
181
  wire [15:0]    inc_rcv_byte_count;
182
  reg [15:0]     rcv_byte_count;
183
  reg           reset_tmp_count;
184
  reg           ld_length_byte_1,ld_length_byte_2;
185
  reg           set_crc_error;
186
  reg           set_byte_allgn_error;
187
  reg           rx_sts_vld,e_rx_sts_vld;
188
  reg           padding_needed;
189
  reg           dec_data_len;
190
  reg           dec_pad_len;
191
  reg           gen_eop;
192
  reg           set_frm_lngth_error;
193
  reg           set_incomplete_frm;
194
  reg           byte_boundary;
195
  reg           error;
196
  reg           error_seen;
197
  reg           commit_write_done;
198
  reg           check_padding;
199
  reg           check_padding_in;
200
  reg [2:0]      padding_len_reg;
201
  reg [15:0]     rcv_length_reg;
202
  reg [15:0]     length_counter;
203
 
204
  reg [18:0]     rx_fsm_cur_st;
205
  reg [18:0]     rx_fsm_nxt_st;
206
  reg           crc_stat_reg;
207
  reg           rx_runt_pkt_reg;
208
  reg           large_pkt_reg;
209
  reg           rx_fifo_overrun_reg;
210
  reg           frm_length_err_reg;
211
  reg [2:0]      crc_count;
212
  reg           inc_shift_counter;
213
  reg           send_data_to_fifo;
214
  wire          send_runt_packet;
215
  reg [2:0]      shift_counter;
216
  reg [2:0]      bytes_to_fifo;
217
  reg [7:0]      buf_latch4,buf_latch3,buf_latch2,buf_latch1,buf_latch0;
218
  wire          ld_buf,ld_buf1,ld_buf2,ld_buf3,ld_buf4;
219
  reg           lengthfield_error;
220
  reg           lengthfield_err_reg;
221
  reg           addr_stat_chk;
222
  reg           clr_rx_error_from_rx_fsm;
223
 
224
  wire [15:0]    adj_rcv_length_reg;
225
  wire [15:0]    adj_rcv_byte_count;
226
  wire [15:0]    adj_cf2rx_max_pkt_sz;
227
  reg            set_tag1_flag, set_tag2_flag;
228
 
229
  parameter     rx_fsm_idle_st=               19'b0000000000000000000,
230
                rx_fsm_chkdestad_nib1_st =    19'b0000000000000000001,
231
                rx_fsm_lk4srcad_nib1_st =     19'b0000000000000000010,
232
                rx_fsm_lk4len_byte1_st =      19'b0000000000000000100,
233
                rx_fsm_lk4len_byte2_st =      19'b0000000000000001000,
234
                rx_fsm_getdt_nib1_st =        19'b0000000000000010000,
235
                rx_fsm_getpaddt_nib1_st =     19'b0000000000000100000,
236
                rx_fsm_updstat_st =           19'b0000000000001000000,
237
                rx_fsm_chkval_st =            19'b0000000000010000000,
238
                rx_fsm_extend_st =            19'b0000000100000000000;
239
 
240
  /***************** WIRE ASSIGNMENTS *************************/
241
  wire [6:0]     dec_pad_length;
242
  wire [15:0]    inc_length_counter;
243
  wire          rx_overrun_error;
244
  wire          commit_condition;
245
 
246
//COMMIT_WRITE CONDITION
247
assign commit_condition = ((inc_rcv_byte_count[14:0] == 15'd65)&& !commit_write_done );
248
 
249
 
250
 
251
  /******** SEQUENTIAL LOGIC **********************************/
252
  half_dup_dble_reg U_dble_reg1 (
253
                        //outputs
254
                        .sync_out_pulse(rx_ch_en),
255
                        //inputs
256
                        .in_pulse(cf2rx_rx_ch_en),
257
                        .dest_clk(phy_rx_clk),
258
                        .reset_n(reset_n)
259
                        );
260
 
261
  // ap2rx_rx_fifo_err signal is generated in rx_clk domain
262
  assign        rx_overrun_error = ap2rx_rx_fifo_err;
263
 
264
  reg           rx_sts_vld_delayed;
265
  always @(posedge phy_rx_clk
266
           or negedge reset_n)
267
    begin
268
      if(!reset_n)
269
        begin
270
          rx_sts <= 32'b0;
271
          rx_sts_vld <= 1'b0;
272
          rx_sts_vld_delayed <= 1'b0;
273
        end
274
      else
275
        begin
276
          rx_sts_vld <= rx_sts_vld_delayed;
277
          rx_sts_vld_delayed <= e_rx_sts_vld;
278
          if (e_rx_sts_vld)
279
            rx_sts <= rx_sts_dt;
280
        end
281
    end
282
 
283
  always @(posedge phy_rx_clk
284
           or negedge reset_n)
285
    begin
286
      if(!reset_n)
287
        begin
288
          rx_fsm_cur_st <= rx_fsm_idle_st;
289
          check_padding <= 1'b0;
290
        end
291
      else
292
        begin
293
          rx_fsm_cur_st <= rx_fsm_nxt_st;
294
          check_padding <= check_padding_in;
295
        end
296
    end
297
  reg first_byte_seen;
298
 
299
 
300
  always @(posedge phy_rx_clk
301
           or negedge reset_n)
302
      if(!reset_n)
303
        first_byte_seen <= 1'b0;
304
      else if(mi2rx_strt_rcv)
305
        first_byte_seen <= 1'b1;
306
      else if(mi2rx_rcv_vld)
307
        first_byte_seen <= 1'b0;
308
 
309
 
310
 
311
// adjust rcv_length reg for packet sizes < 64 bytes
312
assign adj_rcv_length_reg =   (rcv_length_reg < 8'h2E) ? 8'h2E : rcv_length_reg;
313
 
314
// subtr 18 bytes (sa + da + fcs + t/l)
315
assign adj_rcv_byte_count = rcv_byte_count - 8'd18;
316
 
317
// configured max packet size should be 16'd1518.
318
assign adj_cf2rx_max_pkt_sz = cf2rx_max_pkt_sz;
319
 
320
 
321
 
322
  // Following state machine is to receive nibbles from the RMII/MII
323
  // block and packetize them to 32 bits with information of EOP and 
324
  // valid bytes. It also discards packets which are less than minimum
325
  // frame size. It performs Address validity and Data validity.
326
  always @(rx_fsm_cur_st or mi2rx_strt_rcv or rx_ch_en or cf2rx_strp_pad_en
327
           or cf2rx_snd_crc or look_at_length_field
328
           or mi2rx_rcv_vld or first_dword or rc2rx_crc_ok
329
           or mi2rx_end_rcv or mi2rx_rx_byte or mi2rx_extend
330
           or inc_length_counter or rcv_length_reg or commit_write_done
331
           or crc_count or shift_counter or bytes_to_fifo
332
            or cf2rx_rcv_runt_pkt_en
333
           or inc_rcv_byte_count or send_runt_packet
334
           or rcv_byte_count or first_dword
335
           or commit_condition or rx_fifo_full or ap2rx_rx_fifo_err )
336
    begin
337
      rx_fsm_nxt_st = rx_fsm_cur_st;
338
      set_tag1_flag = 1'b0;
339
      set_tag2_flag = 1'b0;
340
      reset_tmp_count = 1'b0;
341
      ld_length_byte_1 = 1'b0;
342
      ld_length_byte_2 = 1'b0;
343
      dec_data_len = 1'b0;
344
      dec_pad_len = 1'b0;
345
      commit_write = 1'b0;
346
      rewind_write = 1'b0;
347
      e_rx_sts_vld = 1'b0;
348
      set_crc_error = 1'b0;
349
      check_padding_in = 1'b0;
350
      set_byte_allgn_error = 1'b0;
351
      set_incomplete_frm = 1'b0;
352
      set_frm_lngth_error = 1'b0;
353
      gen_eop = 1'b0;
354
      error = 1'b0;
355
      byte_boundary= 1'b0;
356
      send_crc = 1'b0;
357
      rcv_pad_data = 1'b0;
358
      inc_shift_counter = 1'b0;
359
      send_data_to_fifo = 1'b0;
360
      lengthfield_error = 1'b0;
361
      addr_stat_chk = 1'b0;
362
      clr_rx_error_from_rx_fsm = 1'b0;
363
 
364
 
365
      case(rx_fsm_cur_st)
366
        rx_fsm_idle_st:
367
          // Waiting for packet from mii block
368
          // Continues accepting data only if
369
          // receive has been enabled
370
          begin
371
            if(ap2rx_rx_fifo_err)
372
                begin
373
                   clr_rx_error_from_rx_fsm = 1'b1;
374
                   rx_fsm_nxt_st = rx_fsm_idle_st;
375
                end
376
            else if (rx_fifo_full)
377
              rx_fsm_nxt_st = rx_fsm_idle_st;
378
            else if(mi2rx_strt_rcv && rx_ch_en )
379
              rx_fsm_nxt_st = rx_fsm_chkdestad_nib1_st;
380
            else
381
              rx_fsm_nxt_st = rx_fsm_idle_st;
382
          end
383
 
384
        rx_fsm_chkdestad_nib1_st:
385
          begin
386
            // collecting the nibbles of destination
387
            // address
388
            if(ap2rx_rx_fifo_err)
389
              begin
390
                rewind_write = 1'b1;
391
                rx_fsm_nxt_st = rx_fsm_idle_st;
392
              end
393
            else if(mi2rx_end_rcv)
394
              begin
395
                if(cf2rx_rcv_runt_pkt_en)
396
                  begin
397
                    rx_fsm_nxt_st = rx_fsm_chkval_st;
398
                    commit_write = 1'b1;
399
                  end
400
                else
401
                  begin
402
                    rx_fsm_nxt_st = rx_fsm_idle_st;
403
                    if (rcv_byte_count[2:0] > 5)
404
                      rewind_write = 1'b1;
405
                  end
406
              end // if (mi2rx_end_rcv)
407
 
408
            else if(mi2rx_rcv_vld && inc_rcv_byte_count[14:0] == 15'd6)
409
              begin
410
                       rx_fsm_nxt_st = rx_fsm_lk4srcad_nib1_st;
411
              end
412
            else
413
              begin
414
                rx_fsm_nxt_st = rx_fsm_chkdestad_nib1_st;
415
              end
416
          end
417
 
418
        rx_fsm_lk4srcad_nib1_st:
419
          // collecting nibbles of source address
420
          // in case of termination of packet
421
          // or carrier sense error then generate eop
422
          // and generate status
423
          begin
424
            if(ap2rx_rx_fifo_err )
425
              begin
426
                rewind_write = 1;
427
                rx_fsm_nxt_st = rx_fsm_idle_st;
428
              end // else: !if(mi2rx_end_rcv)
429
            else if(mi2rx_end_rcv)
430
              begin
431
                if(cf2rx_rcv_runt_pkt_en)
432
                  begin
433
                    rx_fsm_nxt_st = rx_fsm_chkval_st;
434
                    commit_write = 1'b1;
435
                  end
436
                else
437
                  begin
438
                    rx_fsm_nxt_st = rx_fsm_idle_st;
439
                    rewind_write = 1'b1;
440
                  end
441
              end
442
            else if(mi2rx_rcv_vld && inc_rcv_byte_count[14:0] == 15'd12)
443
              begin
444
                  rx_fsm_nxt_st = rx_fsm_lk4len_byte1_st;
445
              end
446
            else
447
              begin
448
                rx_fsm_nxt_st = rx_fsm_lk4srcad_nib1_st;
449
              end
450
          end
451
 
452
        rx_fsm_lk4len_byte1_st:
453
          // this state collects the odd nibbles of the length 
454
          // field. 
455
          begin
456
            if(ap2rx_rx_fifo_err)
457
              begin
458
                rewind_write = 1;
459
                rx_fsm_nxt_st = rx_fsm_idle_st;
460
              end // else: !if(mi2rx_end_rcv)
461
            else if(mi2rx_end_rcv)
462
              begin
463
                if(cf2rx_rcv_runt_pkt_en)
464
                  begin
465
                    rx_fsm_nxt_st = rx_fsm_chkval_st;
466
                    commit_write = 1'b1;
467
                  end
468
                else
469
                  begin
470
                    rx_fsm_nxt_st = rx_fsm_idle_st;
471
                    rewind_write = 1'b1;
472
                  end
473
              end
474
            else if(mi2rx_rcv_vld)
475
              begin
476
                ld_length_byte_1 = 1'b1;
477
                rx_fsm_nxt_st = rx_fsm_lk4len_byte2_st;
478
              end
479
            else
480
              rx_fsm_nxt_st = rx_fsm_lk4len_byte1_st;
481
          end
482
 
483
        rx_fsm_lk4len_byte2_st:
484
          // This state generates the even nibbles of the length
485
          // field
486
        begin
487
           if(ap2rx_rx_fifo_err )
488
           begin
489
              rewind_write = 1;
490
              rx_fsm_nxt_st = rx_fsm_idle_st;
491
           end // else: !if(mi2rx_end_rcv)
492
           else if(mi2rx_end_rcv)
493
           begin
494
              if(cf2rx_rcv_runt_pkt_en)
495
              begin
496
                 rx_fsm_nxt_st = rx_fsm_chkval_st;
497
                 commit_write = 1'b1;
498
              end
499
              else
500
              begin
501
                 rx_fsm_nxt_st = rx_fsm_idle_st;
502
                 rewind_write = 1'b1;
503
              end
504
           end
505
           else if(mi2rx_rcv_vld )
506
           begin
507
              ld_length_byte_2 = 1'b1;
508
              check_padding_in = 1'b1;
509
              rx_fsm_nxt_st = rx_fsm_getdt_nib1_st;
510
           end
511
           else
512
                rx_fsm_nxt_st = rx_fsm_lk4len_byte2_st;
513
        end // rx_fsm_lk4len_byte2_st
514
 
515
        rx_fsm_getdt_nib1_st: //state number 7
516
          // This state collects the nibbles of the receive data
517
          // This state makes a determination to remove padding
518
          // only if strip padding is enabled and the length field
519
          // detected is less than 64
520
          begin
521
            if  (commit_condition)
522
              commit_write = 1'b1;
523
 
524
            if((ap2rx_rx_fifo_err) && !commit_write_done)
525
              begin
526
                rewind_write = 1;
527
                rx_fsm_nxt_st = rx_fsm_idle_st;
528
              end // else: !if(mi2rx_end_rcv)
529
            else if (ap2rx_rx_fifo_err)
530
              begin
531
                rx_fsm_nxt_st = rx_fsm_updstat_st;
532
              end
533
            else if(mi2rx_end_rcv)
534
              begin
535
                if(cf2rx_rcv_runt_pkt_en && !(commit_write_done | commit_condition))
536
                  begin
537
                    commit_write = 1'b1;
538
                    rx_fsm_nxt_st = rx_fsm_chkval_st;
539
                  end
540
                else if(!(commit_write_done | commit_condition) && !cf2rx_rcv_runt_pkt_en)
541
                  begin
542
                    rewind_write = 1'b1;
543
                    rx_fsm_nxt_st = rx_fsm_idle_st;
544
                  end
545
                else
546
                  rx_fsm_nxt_st = rx_fsm_chkval_st;
547
              end
548
            else if(mi2rx_rcv_vld && (inc_length_counter == rcv_length_reg) &&
549
                    look_at_length_field)
550
              begin
551
                dec_data_len = 1'b1;
552
                rx_fsm_nxt_st = rx_fsm_getpaddt_nib1_st;
553
              end
554
            else if(mi2rx_rcv_vld && look_at_length_field)
555
              begin
556
                dec_data_len = 1'b1;
557
                rx_fsm_nxt_st = rx_fsm_getdt_nib1_st;
558
              end
559
            else
560
              rx_fsm_nxt_st = rx_fsm_getdt_nib1_st;
561
          end
562
 
563
        rx_fsm_getpaddt_nib1_st:
564
          // This state handles the padded data in case of less than 64
565
          // byte packets This handles the odd nibbles
566
          begin
567
            if(ap2rx_rx_fifo_err)
568
              begin
569
                if(rcv_byte_count[14:0] <= 15'd64) // mfilardo
570
                //if(inc_rcv_byte_count[14:0] <= 15'd64)
571
                  begin
572
                    rewind_write = 1'b1;
573
                    rx_fsm_nxt_st = rx_fsm_idle_st;
574
                  end
575
                else
576
                  rx_fsm_nxt_st = rx_fsm_updstat_st;
577
              end
578
            else if(mi2rx_end_rcv)
579
              begin
580
                //if(inc_rcv_byte_count[14:0] == 15'd64)
581
                if(rcv_byte_count[14:0] == 15'd64) // mfilardo
582
                  lengthfield_error = 0;
583
                else
584
                  lengthfield_error = 1;
585
 
586
                  rx_fsm_nxt_st = rx_fsm_extend_st;
587
              end
588
            else if(mi2rx_rcv_vld)
589
              begin
590
                if(cf2rx_strp_pad_en)
591
                  rcv_pad_data = 1'b1;
592
              end
593
            else
594
              rx_fsm_nxt_st = rx_fsm_getpaddt_nib1_st;
595
          end // case: rx_fsm_getpaddt_nib1_st
596
 
597
 
598
        rx_fsm_extend_st:
599
          //This state handles the first extend conditon in the
600
          //cf2rx_gigabit_xfr
601
          //transfer
602
          begin
603
            if (mi2rx_extend)
604
              begin
605
                  rx_fsm_nxt_st = rx_fsm_extend_st;
606
              end
607
            else
608
              begin
609
                commit_write = 1'b1;
610
                rx_fsm_nxt_st = rx_fsm_chkval_st;
611
              end
612
          end
613
        rx_fsm_chkval_st:
614
          // This packet generates the validity of the packet
615
          // This is reached either on clean or error type
616
          // completion of packet.
617
          begin
618
            if(ap2rx_rx_fifo_err)
619
              begin
620
                rx_fsm_nxt_st = rx_fsm_updstat_st;
621
              end
622
            else if(cf2rx_rcv_runt_pkt_en && first_dword)
623
              begin
624
                rx_fsm_nxt_st = rx_fsm_chkval_st;
625
                case(rcv_byte_count[2:0])
626
                  3'd1:
627
                    begin
628
                      if(shift_counter == 3'd4)
629
                        begin
630
                          if(bytes_to_fifo == rcv_byte_count[2:0])
631
                            begin
632
                              gen_eop = 1'b1;
633
                              rx_fsm_nxt_st = rx_fsm_updstat_st;
634
                            end // if (bytes_to_fifo == rcv_nibble_count[3:1])
635
                          else
636
                            send_data_to_fifo = 1'b1;
637
                        end // if (shift_counter == 3'd4)
638
                      else
639
                        inc_shift_counter = 1;
640
                    end // case: 3'd1
641
 
642
                  3'd2:
643
                    begin
644
                      if(shift_counter == 3'd3)
645
                        begin
646
                          if(bytes_to_fifo == rcv_byte_count[2:0])
647
                            begin
648
                              gen_eop = 1'b1;
649
                              rx_fsm_nxt_st = rx_fsm_updstat_st;
650
                            end // if (bytes_to_fifo == rcv_nibble_count[3:1])
651
                          else
652
                            send_data_to_fifo = 1'b1;
653
                        end // if (shift_counter == 3'd3)
654
                      else
655
                        inc_shift_counter = 1;
656
                    end // case: 3'd2
657
 
658
                  3'd3:
659
                    begin
660
                      if(shift_counter == 3'd2)
661
                        begin
662
                          if(bytes_to_fifo == rcv_byte_count[2:0])
663
                            begin
664
                              gen_eop = 1'b1;
665
                              rx_fsm_nxt_st = rx_fsm_updstat_st;
666
                            end
667
                          else
668
                            send_data_to_fifo = 1'b1;
669
                        end // if (shift_counter == 3'd2)
670
                      else
671
                        inc_shift_counter = 1;
672
                    end // case: 3'd3
673
 
674
                  3'd4:
675
                    begin
676
                      if(shift_counter == 3'd1)
677
                        begin
678
                          if(bytes_to_fifo == rcv_byte_count[2:0])
679
                            begin
680
                              gen_eop = 1'b1;
681
                              rx_fsm_nxt_st = rx_fsm_updstat_st;
682
                            end // if (bytes_to_fifo == rcv_nibble_count[3:1])
683
                          else
684
                            send_data_to_fifo = 1'b1;
685
                        end
686
                      else
687
                        inc_shift_counter = 1;
688
                    end // case: 3'd4
689
                  default:
690
                    begin
691
                      rx_fsm_nxt_st = rx_fsm_idle_st;
692
                      gen_eop = 1'b0;
693
                    end
694
                endcase // case(rcv_nibble_count[3
695
              end // if (cf2rx_rcv_runt_pkt_en && first_dword)
696
            else if(((cf2rx_snd_crc || send_runt_packet || look_at_length_field)
697
                     && crc_count == 3'd4))
698
              begin
699
                gen_eop = 1'b1;
700
                rx_fsm_nxt_st = rx_fsm_updstat_st;
701
              end
702
            else if(send_runt_packet || look_at_length_field)
703
              begin
704
                send_crc = 1'b1;
705
                rx_fsm_nxt_st = rx_fsm_chkval_st;
706
              end
707
            else if(!cf2rx_snd_crc)
708
              begin
709
                gen_eop = 1'b1;
710
                rx_fsm_nxt_st = rx_fsm_updstat_st;
711
              end
712
            else
713
              begin
714
                send_crc = 1'b1;
715
                rx_fsm_nxt_st = rx_fsm_chkval_st;
716
              end
717
          end // case: rx_fsm_chkval_st
718
 
719
        rx_fsm_updstat_st:
720
          // This state updates the status to the application
721
          // This allows the application to determine the validity
722
          // of the packet so that it can take the necessary action
723
          begin
724
            e_rx_sts_vld = 1'b1;
725
            rx_fsm_nxt_st = rx_fsm_idle_st;
726
          end
727
 
728
        default:
729
          begin
730
            rx_fsm_nxt_st = rx_fsm_idle_st;
731
          end
732
      endcase // casex(rx_fsm_cur_st)
733
    end // always @ (rx_fsm_cur_st or mi2rx_strt_rcv or rx_ch_en or cf2rx_strp_pad_en...
734
 
735
  always @(inc_rcv_byte_count)
736
    begin
737
      if(inc_rcv_byte_count[14:0] < 15'd6)
738
        first_dword = 1'b1;
739
      else
740
        first_dword = 1'b0;
741
    end // always @ (inc_rcv_nibble_count or...
742
 
743
 
744
  always @(posedge phy_rx_clk
745
           or negedge reset_n)
746
    begin
747
      if(!reset_n)
748
        crc_count <= 3'b000;
749
      else if(mi2rx_strt_rcv)
750
        crc_count <= 3'b000;
751
      else if(send_crc)
752
        crc_count <= crc_count + 1;
753
    end // always @ (posedge phy_rx_clk...
754
 
755
  // These signals are used as intermediate flags to determine
756
  // whether to commit pointer or not to commit pointers
757
  // to the  application
758
  // error_seen helps in tracking errors which could occurs in between
759
  // packet transfer
760
  always @(posedge phy_rx_clk
761
           or negedge reset_n)
762
    begin
763
      if(!reset_n)
764
        begin
765
          commit_write_done <= 1'b1;
766
          error_seen <= 1'b0;
767
        end
768
      else if(mi2rx_strt_rcv)
769
        begin
770
          commit_write_done <= 1'b0;
771
          error_seen <= 1'b0;
772
        end
773
      else
774
        begin
775
          if(commit_write)
776
            commit_write_done <= 1'b1;
777
          if(error)
778
            error_seen <= 1'b1;
779
        end
780
    end // always @ (posedge phy_rx_clk...
781
 
782
  assign look_at_length_field = cf2rx_strp_pad_en &&
783
                                (rcv_length_reg < MIN_FRM_SIZE) && (|rcv_length_reg);
784
  assign send_runt_packet = cf2rx_rcv_runt_pkt_en &&
785
         (rcv_byte_count[15:8] == 8'd0 && rcv_byte_count[7:0] < 8'd64);
786
 
787
 
788
 
789
 
790
  assign inc_rcv_byte_count = rcv_byte_count + 16'h1;
791
 
792
  always @(posedge phy_rx_clk
793
           or negedge reset_n)
794
    begin
795
      if(!reset_n)
796
        rcv_byte_count <= 16'h0000;
797
      else if(mi2rx_strt_rcv)
798
        rcv_byte_count <= 16'h0000;
799
      else if(mi2rx_rcv_vld)
800
        rcv_byte_count <= inc_rcv_byte_count;
801
    end // always @ (posedge phy_rx_clk...
802
 
803
  // This signal is asserted wheneven there is no valid transfer on the
804
  // line. Valid transfer is only between mi2rx_strt_rcv and
805
  // mi2rx_end_rcv. In case
806
  // of rewind write transfer becomes invalid. Such data should not be
807
  // written in to the fifo
808
  reg dt_xfr_invalid;
809
  always @(posedge phy_rx_clk
810
           or negedge reset_n)
811
    begin
812
      if(!reset_n)
813
        dt_xfr_invalid <= 1;
814
      else if(rewind_write || ap2rx_rx_fifo_err)
815
        dt_xfr_invalid <= 1;
816
      else if(mi2rx_strt_rcv)
817
        dt_xfr_invalid <= 0;
818
    end
819
  // This is the mux to gather nibbles to two octets for the length field
820
  // of the register
821
  assign inc_length_counter = length_counter + 16'h1;
822
  always @(posedge phy_rx_clk
823
           or negedge reset_n)
824
    begin
825
      if(!reset_n)
826
        begin
827
          rcv_length_reg <= 16'b0;
828
          length_counter <= 16'b0;
829
        end // if (reset_n)
830
      else if (rx_ch_en)
831
        begin
832
          if(mi2rx_strt_rcv)
833
            begin
834
              length_counter <= 16'b0;
835
              rcv_length_reg <= 16'b0;
836
            end
837
          else if(dec_data_len )
838
            length_counter <= inc_length_counter;
839
          else
840
            begin
841
              if(ld_length_byte_1)
842
                begin
843
                  rcv_length_reg[15:8] <= mi2rx_rx_byte;
844
                end
845
            else if(ld_length_byte_2)
846
              begin
847
                rcv_length_reg[7:0] <= mi2rx_rx_byte;
848
              end
849
            end // else: !if(dec_data_len)
850
        end // else: !if(!reset_n)
851
    end // always @ (posedge phy_rx_clk...
852
 
853
  // This signal helps in making sure that when packets are received the
854
  // channel is enabled else ignore the complete packet until next start
855
  // of packet
856
  reg enable_channel;
857
  always @(posedge phy_rx_clk
858
           or negedge reset_n)
859
    begin
860
      if(!reset_n)
861
        enable_channel <= 0;
862
      else if(gen_eop)
863
        enable_channel <= 0;
864
      else if(mi2rx_strt_rcv && rx_ch_en)
865
        enable_channel <= 1;
866
    end
867
 
868
  // This is the decremented padding length register
869
  // Once it reaches zero CRC should follow
870
  assign dec_pad_length = padding_len_reg - 7'h1;
871
  always @(posedge phy_rx_clk
872
           or negedge reset_n)
873
    begin
874
      if(!reset_n)
875
        begin
876
          padding_needed <= 1'b0;
877
          padding_len_reg <= 6'b0;
878
        end
879
      else if(mi2rx_strt_rcv)
880
        begin
881
          padding_needed <= 1'b0;
882
          padding_len_reg <= 6'b0;
883
        end
884
      else if(look_at_length_field &&
885
              check_padding)
886
        begin
887
          padding_len_reg <= MIN_FRM_SIZE - rcv_length_reg[5:0];
888
          padding_needed <= 1'b1;
889
        end
890
      else if(dec_pad_len)
891
        begin
892
          padding_len_reg <= dec_pad_len;
893
          padding_needed <= padding_needed;
894
        end
895
    end // always @ (posedge phy_rx_clk...
896
 
897
  /*********************************************************
898
   Status Generation for Receive packets
899
   Statuses in this case are checked at end of receive packets
900
   and are registered and provided inthe next state along with
901
   rx_sts_valid bit asserted
902
   *********************************************************/
903
 
904
  reg[14:0] fifo_byte_count;
905
  wire [14:0] inc_fifo_byte_count;
906
  wire [14:0] dec_fifo_byte_count;
907
  assign      inc_fifo_byte_count = fifo_byte_count + 15'h1;
908
  assign      dec_fifo_byte_count = fifo_byte_count - 15'h1;
909
 
910
  always @(posedge phy_rx_clk or negedge reset_n)
911
    begin
912
      if(!reset_n)
913
        fifo_byte_count <= 15'd0;
914
      else if(rewind_write || mi2rx_strt_rcv)
915
        fifo_byte_count <= 15'd0;
916
      else if(rx2ap_rx_fsm_wrt)
917
        fifo_byte_count <= inc_fifo_byte_count;
918
    end
919
 
920
  reg        length_sz_mismatch;
921
 
922
  assign rx_sts_dt[31:16] = (e_rx_sts_vld && ap2rx_rx_fifo_err) ?
923
                            {dec_fifo_byte_count + 16'h1} : {fifo_byte_count + 16'h1};
924
  assign rx_sts_dt[15:13] = 3'd0;
925
  assign rx_sts_dt[12] = length_sz_mismatch;
926
  assign rx_sts_dt[11] = 1'b0;
927
  assign rx_sts_dt[10] = large_pkt_reg;
928
  assign rx_sts_dt[7] = lengthfield_err_reg;
929
  assign rx_sts_dt[6] = crc_stat_reg;
930
  assign rx_sts_dt[5] = rx_runt_pkt_reg;
931
  assign rx_sts_dt[4] = rx_fifo_overrun_reg;
932
  assign rx_sts_dt[2] = frm_length_err_reg;
933
  assign rx_sts_dt[1:0] = 2'd0;
934
 
935
  wire        rx_sts_large_pkt;
936
  wire [15:0] rx_sts_bytes_rcvd;
937
  wire        rx_sts_lengthfield_err;
938
  wire        rx_sts_crc_err;
939
  wire        rx_sts_runt_pkt_rcvd;
940
  wire        rx_sts_rx_overrun;
941
  wire        rx_sts_frm_length_err;
942
  wire        rx_sts_len_mismatch;
943
 
944
  assign      rx_sts_bytes_rcvd = rx_sts[31:16];
945
  assign      rx_sts_len_mismatch = rx_sts[12];
946
  assign      rx_sts_large_pkt = rx_sts[10];
947
  assign      rx_sts_lengthfield_err = rx_sts[7];
948
  assign      rx_sts_crc_err = rx_sts[6];
949
  assign      rx_sts_runt_pkt_rcvd = rx_sts[5];
950
  assign      rx_sts_rx_overrun = rx_sts[4];
951
  assign      rx_sts_frm_length_err = rx_sts[2];
952
 
953
 
954
  always @(posedge phy_rx_clk
955
           or negedge reset_n)
956
    begin
957
      if(!reset_n)
958
        begin
959
          crc_stat_reg <= 1'b0;
960
          frm_length_err_reg <= 1'b0;
961
          lengthfield_err_reg <= 1'b0;
962
          rx_fifo_overrun_reg <= 1'b0;
963
          rx_runt_pkt_reg <= 1'b0;
964
          large_pkt_reg <= 1'b0;
965
          length_sz_mismatch <= 1'b0;
966
        end
967
      else if(mi2rx_strt_rcv)
968
        begin
969
          crc_stat_reg <= 1'b0;
970
          frm_length_err_reg <= 1'b0;
971
          lengthfield_err_reg <= 1'b0;
972
          rx_fifo_overrun_reg <= 1'b0;
973
          rx_runt_pkt_reg <= 1'b0;
974
          large_pkt_reg <= 1'b0;
975
          length_sz_mismatch <= 1'b0;
976
        end
977
      else
978
        begin
979
          if(rx_overrun_error)
980
            rx_fifo_overrun_reg <= 1'b1;
981
 
982
          if(lengthfield_error)
983
            lengthfield_err_reg <= 1'b1;
984
 
985
          if(mi2rx_end_rcv && mi2rx_frame_err)
986
            frm_length_err_reg <= 1'b1;
987
 
988
          if(mi2rx_end_rcv)
989
            begin
990
              if(!rc2rx_crc_ok)
991
                crc_stat_reg <= 1'b1;
992
              if(rcv_byte_count[14:0] < 15'd64)
993
                rx_runt_pkt_reg <= 1'b1;
994
              if(rcv_byte_count[14:0] > adj_cf2rx_max_pkt_sz)
995
                large_pkt_reg <= 1'b1;
996
              if( (adj_rcv_byte_count[15:0] != adj_rcv_length_reg) && (adj_rcv_length_reg <= 16'd1500) )
997
                length_sz_mismatch <= 1'b1;
998
            end // if (mi2rx_end_rcv)
999
        end // else: !if(mi2rx_strt_rcv)
1000
    end // always @ (posedge phy_rx_clk...
1001
 
1002
  /***************************************************/
1003
  //
1004
  // Additions for Byte operation 
1005
  //
1006
  /***************************************************/
1007
  always @(posedge phy_rx_clk or
1008
           negedge reset_n)
1009
    begin
1010
      if(!reset_n)
1011
        shift_counter <= 3'd0;
1012
      else if(mi2rx_strt_rcv)
1013
        shift_counter <= 3'd0;
1014
      else if(inc_shift_counter)
1015
        shift_counter <= shift_counter + 1;
1016
    end // always @ (posedge phy_rx_clk or...
1017
 
1018
  always @(posedge phy_rx_clk or
1019
           negedge reset_n)
1020
    begin
1021
      if(!reset_n)
1022
        bytes_to_fifo <= 3'd0;
1023
      else if(mi2rx_strt_rcv)
1024
        bytes_to_fifo <= 3'd1;
1025
      else if(send_data_to_fifo)
1026
        bytes_to_fifo <= bytes_to_fifo + 1;
1027
    end // always @ (posedge phy_rx_clk or...
1028
 
1029
  wire[8:0] e_rx_fsm_dt;
1030
  wire      e_rx_fsm_wrt;
1031
  assign    e_rx_fsm_dt[7:0] = buf_latch4;
1032
//  assign    e_rx_fsm_dt[8] = (rx_fifo_full) ? 1'b1 :gen_eop;
1033
  assign    e_rx_fsm_dt[8] = gen_eop;
1034
 
1035
  always @(posedge phy_rx_clk or
1036
           negedge reset_n)
1037
    begin
1038
      if(!reset_n)
1039
        begin
1040
          rx2ap_rx_fsm_dt <= 9'd0;
1041
          rx2ap_rx_fsm_wrt <= 1'b0;
1042
          rx2ap_commit_write <= 1'b0;
1043
          rx2ap_rewind_write <= 1'b0;
1044
        end
1045
      else
1046
        begin
1047
          rx2ap_rx_fsm_wrt <= e_rx_fsm_wrt && (!ap2rx_rx_fifo_err);
1048
          rx2ap_rx_fsm_dt <= e_rx_fsm_dt;
1049
          rx2ap_commit_write <= commit_write;
1050
          rx2ap_rewind_write <= rewind_write;
1051
        end
1052
    end // always @ (posedge phy_rx_clk or...
1053
 
1054
  assign e_rx_fsm_wrt = ((enable_channel &&
1055
                          mi2rx_rcv_vld && !first_dword) ||
1056
                         (enable_channel &&
1057
                          (gen_eop || send_crc)) ||
1058
                         (enable_channel && send_data_to_fifo)) && !rcv_pad_data
1059
                        && !dt_xfr_invalid && !rewind_write;
1060
  assign ld_buf = enable_channel && !rcv_pad_data && (|rcv_byte_count == 1) &&
1061
         (mi2rx_rcv_vld) || send_crc || inc_shift_counter || send_data_to_fifo;
1062
 
1063
  assign ld_buf4 = ld_buf ;
1064
  assign ld_buf3 = ld_buf ;
1065
  assign ld_buf2 = ld_buf ;
1066
  assign ld_buf1 = ld_buf ;
1067
  always @(posedge phy_rx_clk
1068
           or negedge reset_n)
1069
    begin
1070
      if(!reset_n)
1071
        begin
1072
          buf_latch4 <= 8'b0;
1073
          buf_latch3 <= 8'b0;
1074
          buf_latch2 <= 8'b0;
1075
          buf_latch1 <= 8'b0;
1076
          buf_latch0 <= 8'b0;
1077
        end
1078
      else
1079
        begin
1080
          if(ld_buf4)
1081
            buf_latch4 <= buf_latch3;
1082
 
1083
          if(ld_buf3)
1084
            buf_latch3 <= buf_latch2;
1085
 
1086
          if(ld_buf2)
1087
            buf_latch2 <= buf_latch1;
1088
 
1089
          if(ld_buf1)
1090
            buf_latch1 <= buf_latch0;
1091
 
1092
          if (rx_ch_en)
1093
            begin
1094
              if(mi2rx_strt_rcv)
1095
                begin
1096
                  buf_latch0 <= 8'b0;
1097
                end
1098
              else
1099
                begin
1100
                  if(mi2rx_rcv_vld && !rcv_pad_data)
1101
                    begin
1102
                      buf_latch0 <= mi2rx_rx_byte;
1103
                    end
1104
                end // else: !if(mi2rx_strt_rcv)
1105
            end // if (rx_ch_en)
1106
        end // else: !if(!reset_n)
1107
    end // always @ (posedge phy_rx_clk...
1108
 
1109 76 dinesha
endmodule

powered by: WebSVN 2.1.0

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