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

Subversion Repositories turbo8051

[/] [turbo8051/] [trunk/] [rtl/] [gmac/] [ctrl/] [eth_parser.v] - Blame information for rev 76

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 36 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 36 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
// ------------------------------------------------------------------------
47
// Description      : 
48
//   This module instantiates the Eth/Arp/IP/TCP/UDP Packet Parser
49
//
50
// ------------------------------------------------------------------------
51
module  g_eth_parser (
52
                    s_reset_n,
53
                    app_clk,
54
 
55
               // Configuration
56
                    cfg_filters,
57
                    cfg_mac_sa,
58
                    cfg_ip_sa,
59
 
60
               // Input Control Information
61
                    eop,
62
                    dval,
63
                    data,
64
 
65
                // output status 
66
                    pkt_done,
67
                    pkt_len,
68
                    pkt_status,
69
                    pkt_drop_ind,
70
                    pkt_drop_reason
71
               );
72
 
73
//------------------------------
74
// Global Input signal
75
//------------------------------                    
76
input               s_reset_n; // Active low reset signal
77
input               app_clk  ; // Application clock
78
 
79
//------------------------------
80
// Configuration
81
//------------------------------
82
input [31:0]        cfg_filters; // Filter rules
83
                                 // [0] - filtering enabled
84
                                 // [1] - allow local mac-da only
85
                                 // [2] - allow local mac-da only + IP4 local ip-da
86
                                 // [3] - allow local mac-da only + IP4 local ip-da + TCP
87
                                 // [4] - allow local mac-da only + IP4 local ip-da + UDP
88
                                 // [5] - allow local mac-da only + IP4 local ip-da + ICMP
89
                                 // [6] - allow local mac-da only + ARP
90
 
91
input [47:0]        cfg_mac_sa;      // 48 bit mac DA
92
input [31:0]        cfg_ip_sa;   // 32 bit IP DA
93
 
94
//---------------------------
95
// Input Control Information
96
//---------------------------
97
input               eop;
98
input               dval;
99
input [7:0]         data;
100
 
101
//-----------------------------             
102
// output status 
103
//-----------------------------
104
output   [11:0]     pkt_len;     // Packet Length
105
output              pkt_done;    // Packet Processing done indication
106 50 dinesha
output   [15:0]     pkt_status;  // packet processing status
107 36 dinesha
                                 // [1:0] - MAC-DA
108
                                 //         2'b00  - Broadcast frame
109
                                 //         2'b01  - Multicast frame
110
                                 //         2'b10  - unicast frame, other than local DA
111
                                 //         2'b11  - unicast local DA frame
112
                                 // [3:2] - MAC-SA
113
                                 //         2'b00  - Broadcast frame
114
                                 //         2'b01  - Multicast frame
115
                                 //         2'b10  - unicast frame, other than local DA
116
                                 //         2'b11  - unicast local DA frame
117
                                 // [6:4] - 3'b000 - Unknown Ethernet frame
118
                                 //         3'b001 - IP4 Frame
119
                                 //         3'b010 - IP4 Frame + TCP
120
                                 //         3'b011 - IP4 Frame + UDP
121
                                 //         3'b100 - IP4 Frame + ICMP
122
                                 //         3'b101 - ARP frame
123
output          pkt_drop_ind;    // Packet Drop Inidcation
124
 
125
output [7:0]    pkt_drop_reason; // Reason for Frame Drop
126
                                 // [0] - Non Local DA
127
                                 // [1] - Local DA == Remote SA
128
                                 // [2] - Non Local IP-DA
129
                                 // [3] - Local IP-DA == Remote IP-SA
130
                                 // [4] - Not Valid IP4/TCP/UDP/ARP/ICMP Frame
131
                                 // [5] - L2 Check sum error
132
                                 // [6] - L3 Check Sum Error
133
                                 // [7] - L4 Check Sum Error
134
 
135
reg [11:0]      bcnt           ; // Byte counter
136
reg [11:0]      pkt_len        ; // packet length
137
reg             pkt_done       ; // packet complete indication + Packet Status Valid
138 50 dinesha
reg             pkt_drop_ind   ;
139 36 dinesha
 
140 50 dinesha
 
141 61 dinesha
always @(negedge s_reset_n  or posedge app_clk) begin
142 36 dinesha
   if(s_reset_n == 1'b0) begin
143 50 dinesha
      bcnt         <= 0;
144
      pkt_len      <= 0;
145
      pkt_done     <= 0;
146
      pkt_drop_ind <= 0;
147 36 dinesha
   end
148
   else begin
149
      if(dval) begin
150
         if(eop) begin
151
            bcnt <= 0;
152
            pkt_len  <= bcnt +1;
153
            pkt_done <= 1;
154
         end else begin
155
            bcnt <= bcnt +1;
156
            pkt_done <= 0;
157
         end
158
      end else begin
159
         pkt_done <= 0;
160
      end
161
   end
162
end
163
 
164
reg        mac_da_bc     ; // frame da is broad cast
165
reg        mac_da_mc     ; // frame da is multicast
166
reg        mac_da_match  ; // frame da match to local address
167
reg        mac_sa_bc     ; // frame sa is broadcast
168
reg        mac_sa_mc     ; // frame sa is multicast
169
reg        mac_sa_match  ; // frame sa match to local address
170
reg        ipv4f         ; // frame is ipv4 
171
reg        arpf          ; // frame is arp
172
reg        tcpf          ; // frame is tcp
173
reg        udpf          ; // frame is udp
174
reg        ip_sa_match   ; // ip4 sa matches to local IP Address 
175
reg        ip_da_match   ; // ip4 da matches to local IP Address
176 50 dinesha
reg[15:0]  pkt_status    ; // Packet Status
177 36 dinesha
 
178 61 dinesha
always @(negedge s_reset_n or posedge app_clk) begin
179 36 dinesha
   if(s_reset_n == 1'b0) begin
180
      mac_da_bc     <= 0;
181
      mac_da_mc     <= 0;
182
      mac_da_match  <= 0;
183
      mac_sa_bc     <= 0;
184
      mac_sa_mc     <= 0;
185
      mac_sa_match  <= 0;
186
      ipv4f         <= 0;
187
      arpf          <= 0;
188
      tcpf          <= 0;
189
      udpf          <= 0;
190
      ip_sa_match   <= 0;
191
      ip_da_match   <= 0;
192
      pkt_status    <= 0;
193
   end
194
   else begin
195
      if(dval) begin
196
           if(!eop) begin
197
         // DA Analysis
198
              // Broadcast Frame   
199
              mac_da_bc      <=  (bcnt == 0) ? (data == 8'hff)             :
200
                                 (bcnt == 1) ? (data == 8'hff) & mac_da_bc :
201
                                 (bcnt == 2) ? (data == 8'hff) & mac_da_bc :
202
                                 (bcnt == 3) ? (data == 8'hff) & mac_da_bc :
203
                                 (bcnt == 4) ? (data == 8'hff) & mac_da_bc :
204
                                 (bcnt == 5) ? (data == 8'hff) & mac_da_bc : mac_da_bc;
205
              // multicast frame
206
              mac_da_mc       <= (bcnt == 0) ? (data[7] == 1'b1)  : mac_da_mc & !mac_da_bc;
207
 
208
              // local unicast frame
209
              mac_da_match    <= (bcnt == 0) ? (cfg_mac_sa[7:0]   == data) :
210
                                 (bcnt == 1) ? (cfg_mac_sa[15:8]  == data) & mac_da_match :
211
                                 (bcnt == 2) ? (cfg_mac_sa[23:16] == data) & mac_da_match :
212
                                 (bcnt == 3) ? (cfg_mac_sa[31:24] == data) & mac_da_match :
213
                                 (bcnt == 4) ? (cfg_mac_sa[39:32] == data) & mac_da_match :
214
                                 (bcnt == 5) ? (cfg_mac_sa[47:40] == data) & mac_da_match :
215
                                 mac_da_match;
216
 
217
 
218
            // SA Analysis
219
              mac_sa_bc      <=  (bcnt == 6)  ? (data == 8'hff)             :
220
                                 (bcnt == 7)  ? (data == 8'hff) & mac_sa_bc :
221
                                 (bcnt == 8)  ? (data == 8'hff) & mac_sa_bc :
222
                                 (bcnt == 9)  ? (data == 8'hff) & mac_sa_bc :
223
                                 (bcnt == 10) ? (data == 8'hff) & mac_sa_bc :
224
                                 (bcnt == 11) ? (data == 8'hff) & mac_sa_bc : mac_sa_bc;
225
 
226
              mac_sa_mc      <= (bcnt == 6)  ? (data[7] == 1'b1)  : mac_sa_mc & !mac_sa_bc;
227
 
228
              mac_sa_match   <= (bcnt == 6)  ? (cfg_mac_sa[7:0]   == data) :
229
                                (bcnt == 7)  ? (cfg_mac_sa[15:8]  == data) & mac_sa_match :
230
                                (bcnt == 8)  ? (cfg_mac_sa[23:16] == data) & mac_sa_match :
231
                                (bcnt == 9)  ? (cfg_mac_sa[31:24] == data) & mac_sa_match :
232
                                (bcnt == 10) ? (cfg_mac_sa[39:32] == data) & mac_sa_match :
233
                                (bcnt == 11) ? (cfg_mac_sa[47:40] == data) & mac_sa_match :
234
                                mac_sa_match;
235
 
236
             // L3 Protocol Analysis
237
              ipv4f          <= (bcnt == 12) ? (data == 8'h08) :
238
                             (bcnt == 13) ? (data == 8'h00) & ipv4f : ipv4f;
239
 
240
              arpf           <= (bcnt == 12) ? (data == 8'h08) :
241
                            (bcnt == 13) ? (data == 8'h06) & arpf : arpf;
242
             // L4 Protocol Analysis
243
              tcpf           <= (bcnt == 23) ? (data == 8'h06) & ipv4f: tcpf;
244
              udpf           <= (bcnt == 23) ? (data == 8'h11) & ipv4f: udpf;
245
             // IP DA and SA Match
246
              ip_sa_match     <= (bcnt == 26) ? (data == cfg_ip_sa[7:0])   & ipv4f:
247
                                 (bcnt == 27) ? (data == cfg_ip_sa[15:8])  & ipv4f & ip_sa_match:
248
                                 (bcnt == 28) ? (data == cfg_ip_sa[23:16]) & ipv4f & ip_sa_match:
249
                                 (bcnt == 29) ? (data == cfg_ip_sa[31:24]) & ipv4f & ip_sa_match:
250
                                 ip_sa_match;
251
              ip_da_match     <= (bcnt == 26) ? (data == cfg_ip_sa[7:0])   & ipv4f:
252
                                 (bcnt == 27) ? (data == cfg_ip_sa[15:8])  & ipv4f & ip_da_match:
253
                                 (bcnt == 28) ? (data == cfg_ip_sa[23:16]) & ipv4f & ip_da_match:
254
                                 (bcnt == 29) ? (data == cfg_ip_sa[31:24]) & ipv4f & ip_da_match:
255
                                 ip_da_match;
256
 
257
           end else begin // on EOP
258
 
259
            if(&mac_da_match) begin
260
               pkt_status[1:0] <= 2'b11; // Local DA
261
            end else if(mac_da_bc) begin
262
               pkt_status[1:0] <= 2'b00;  // Broadcast frame
263
            end else if(mac_da_mc) begin
264
               pkt_status[1:0] <= 2'b01; // Multicase frame
265
            end else
266
               pkt_status[1:0] <= 2'b10; // Unknown Unicast frame
267
 
268
            if(&mac_sa_match) begin
269
               pkt_status[3:2] <= 2'b11; // Local DA
270
            end else if(mac_sa_bc) begin
271
               pkt_status[3:2] <= 2'b00;  // Broadcast frame
272
            end else if(mac_sa_mc) begin
273
               pkt_status[3:2] <= 2'b01; // Multicast frame
274
            end else
275
               pkt_status[3:2] <= 2'b10; // Unknown Unicast frame
276
 
277
            if(tcpf) begin
278
               pkt_status[6:4] <= 3'b010; // IP4 Frame + TCP
279
            end else if(udpf) begin
280
               pkt_status[6:4] <= 3'b011; // IP4 Frame + UDP
281
            end else if(arpf) begin
282
               pkt_status[6:4] <= 3'b101; // ARP frame
283
            end else
284
               pkt_status[6:4] <= 2'b00; // UnKnown Ethernet frame
285
 
286
            mac_da_match  <= 0;
287
            mac_sa_match  <= 0;
288
            mac_sa_bc     <= 0;
289
            mac_sa_mc     <= 0;
290
            mac_da_bc     <= 0;
291
            mac_da_mc     <= 0;
292 61 dinesha
            tcpf          <= 0;
293
            udpf          <= 0;
294
            arpf          <= 0;
295
            ipv4f         <= 0;
296 36 dinesha
         end
297
      end
298
   end
299
end
300
 
301
 
302
endmodule

powered by: WebSVN 2.1.0

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