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

Subversion Repositories turbo8051

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

Go to most recent revision | 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
//////////////////////////////////////////////////////////////////////
18
////                                                              ////
19
//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
20
////                                                              ////
21
//// This source file may be used and distributed without         ////
22
//// restriction provided that this copyright statement is not    ////
23
//// removed from the file and that any derivative work contains  ////
24
//// the original copyright notice and the associated disclaimer. ////
25
////                                                              ////
26
//// This source file is free software; you can redistribute it   ////
27
//// and/or modify it under the terms of the GNU Lesser General   ////
28
//// Public License as published by the Free Software Foundation; ////
29
//// either version 2.1 of the License, or (at your option) any   ////
30
//// later version.                                               ////
31
////                                                              ////
32
//// This source is distributed in the hope that it will be       ////
33
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
34
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
35
//// PURPOSE.  See the GNU Lesser General Public License for more ////
36
//// details.                                                     ////
37
////                                                              ////
38
//// You should have received a copy of the GNU Lesser General    ////
39
//// Public License along with this source; if not, download it   ////
40
//// from http://www.opencores.org/lgpl.shtml                     ////
41
////                                                              ////
42
//////////////////////////////////////////////////////////////////////
43
 
44
// ------------------------------------------------------------------------
45
// Description      : 
46
//   This module instantiates the Eth/Arp/IP/TCP/UDP Packet Parser
47
//
48
// ------------------------------------------------------------------------
49
module  g_eth_parser (
50
                    s_reset_n,
51
                    app_clk,
52
 
53
               // Configuration
54
                    cfg_filters,
55
                    cfg_mac_sa,
56
                    cfg_ip_sa,
57
 
58
               // Input Control Information
59
                    eop,
60
                    dval,
61
                    data,
62
 
63
                // output status 
64
                    pkt_done,
65
                    pkt_len,
66
                    pkt_status,
67
                    pkt_drop_ind,
68
                    pkt_drop_reason
69
               );
70
 
71
//------------------------------
72
// Global Input signal
73
//------------------------------                    
74
input               s_reset_n; // Active low reset signal
75
input               app_clk  ; // Application clock
76
 
77
//------------------------------
78
// Configuration
79
//------------------------------
80
input [31:0]        cfg_filters; // Filter rules
81
                                 // [0] - filtering enabled
82
                                 // [1] - allow local mac-da only
83
                                 // [2] - allow local mac-da only + IP4 local ip-da
84
                                 // [3] - allow local mac-da only + IP4 local ip-da + TCP
85
                                 // [4] - allow local mac-da only + IP4 local ip-da + UDP
86
                                 // [5] - allow local mac-da only + IP4 local ip-da + ICMP
87
                                 // [6] - allow local mac-da only + ARP
88
 
89
input [47:0]        cfg_mac_sa;      // 48 bit mac DA
90
input [31:0]        cfg_ip_sa;   // 32 bit IP DA
91
 
92
//---------------------------
93
// Input Control Information
94
//---------------------------
95
input               eop;
96
input               dval;
97
input [7:0]         data;
98
 
99
//-----------------------------             
100
// output status 
101
//-----------------------------
102
output   [11:0]     pkt_len;     // Packet Length
103
output              pkt_done;    // Packet Processing done indication
104 50 dinesha
output   [15:0]     pkt_status;  // packet processing status
105 36 dinesha
                                 // [1:0] - MAC-DA
106
                                 //         2'b00  - Broadcast frame
107
                                 //         2'b01  - Multicast frame
108
                                 //         2'b10  - unicast frame, other than local DA
109
                                 //         2'b11  - unicast local DA frame
110
                                 // [3:2] - MAC-SA
111
                                 //         2'b00  - Broadcast frame
112
                                 //         2'b01  - Multicast frame
113
                                 //         2'b10  - unicast frame, other than local DA
114
                                 //         2'b11  - unicast local DA frame
115
                                 // [6:4] - 3'b000 - Unknown Ethernet frame
116
                                 //         3'b001 - IP4 Frame
117
                                 //         3'b010 - IP4 Frame + TCP
118
                                 //         3'b011 - IP4 Frame + UDP
119
                                 //         3'b100 - IP4 Frame + ICMP
120
                                 //         3'b101 - ARP frame
121
output          pkt_drop_ind;    // Packet Drop Inidcation
122
 
123
output [7:0]    pkt_drop_reason; // Reason for Frame Drop
124
                                 // [0] - Non Local DA
125
                                 // [1] - Local DA == Remote SA
126
                                 // [2] - Non Local IP-DA
127
                                 // [3] - Local IP-DA == Remote IP-SA
128
                                 // [4] - Not Valid IP4/TCP/UDP/ARP/ICMP Frame
129
                                 // [5] - L2 Check sum error
130
                                 // [6] - L3 Check Sum Error
131
                                 // [7] - L4 Check Sum Error
132
 
133
reg [11:0]      bcnt           ; // Byte counter
134
reg [11:0]      pkt_len        ; // packet length
135
reg             pkt_done       ; // packet complete indication + Packet Status Valid
136 50 dinesha
reg             pkt_drop_ind   ;
137 36 dinesha
 
138 50 dinesha
 
139 61 dinesha
always @(negedge s_reset_n  or posedge app_clk) begin
140 36 dinesha
   if(s_reset_n == 1'b0) begin
141 50 dinesha
      bcnt         <= 0;
142
      pkt_len      <= 0;
143
      pkt_done     <= 0;
144
      pkt_drop_ind <= 0;
145 36 dinesha
   end
146
   else begin
147
      if(dval) begin
148
         if(eop) begin
149
            bcnt <= 0;
150
            pkt_len  <= bcnt +1;
151
            pkt_done <= 1;
152
         end else begin
153
            bcnt <= bcnt +1;
154
            pkt_done <= 0;
155
         end
156
      end else begin
157
         pkt_done <= 0;
158
      end
159
   end
160
end
161
 
162
reg        mac_da_bc     ; // frame da is broad cast
163
reg        mac_da_mc     ; // frame da is multicast
164
reg        mac_da_match  ; // frame da match to local address
165
reg        mac_sa_bc     ; // frame sa is broadcast
166
reg        mac_sa_mc     ; // frame sa is multicast
167
reg        mac_sa_match  ; // frame sa match to local address
168
reg        ipv4f         ; // frame is ipv4 
169
reg        arpf          ; // frame is arp
170
reg        tcpf          ; // frame is tcp
171
reg        udpf          ; // frame is udp
172
reg        ip_sa_match   ; // ip4 sa matches to local IP Address 
173
reg        ip_da_match   ; // ip4 da matches to local IP Address
174 50 dinesha
reg[15:0]  pkt_status    ; // Packet Status
175 36 dinesha
 
176 61 dinesha
always @(negedge s_reset_n or posedge app_clk) begin
177 36 dinesha
   if(s_reset_n == 1'b0) begin
178
      mac_da_bc     <= 0;
179
      mac_da_mc     <= 0;
180
      mac_da_match  <= 0;
181
      mac_sa_bc     <= 0;
182
      mac_sa_mc     <= 0;
183
      mac_sa_match  <= 0;
184
      ipv4f         <= 0;
185
      arpf          <= 0;
186
      tcpf          <= 0;
187
      udpf          <= 0;
188
      ip_sa_match   <= 0;
189
      ip_da_match   <= 0;
190
      pkt_status    <= 0;
191
   end
192
   else begin
193
      if(dval) begin
194
           if(!eop) begin
195
         // DA Analysis
196
              // Broadcast Frame   
197
              mac_da_bc      <=  (bcnt == 0) ? (data == 8'hff)             :
198
                                 (bcnt == 1) ? (data == 8'hff) & mac_da_bc :
199
                                 (bcnt == 2) ? (data == 8'hff) & mac_da_bc :
200
                                 (bcnt == 3) ? (data == 8'hff) & mac_da_bc :
201
                                 (bcnt == 4) ? (data == 8'hff) & mac_da_bc :
202
                                 (bcnt == 5) ? (data == 8'hff) & mac_da_bc : mac_da_bc;
203
              // multicast frame
204
              mac_da_mc       <= (bcnt == 0) ? (data[7] == 1'b1)  : mac_da_mc & !mac_da_bc;
205
 
206
              // local unicast frame
207
              mac_da_match    <= (bcnt == 0) ? (cfg_mac_sa[7:0]   == data) :
208
                                 (bcnt == 1) ? (cfg_mac_sa[15:8]  == data) & mac_da_match :
209
                                 (bcnt == 2) ? (cfg_mac_sa[23:16] == data) & mac_da_match :
210
                                 (bcnt == 3) ? (cfg_mac_sa[31:24] == data) & mac_da_match :
211
                                 (bcnt == 4) ? (cfg_mac_sa[39:32] == data) & mac_da_match :
212
                                 (bcnt == 5) ? (cfg_mac_sa[47:40] == data) & mac_da_match :
213
                                 mac_da_match;
214
 
215
 
216
            // SA Analysis
217
              mac_sa_bc      <=  (bcnt == 6)  ? (data == 8'hff)             :
218
                                 (bcnt == 7)  ? (data == 8'hff) & mac_sa_bc :
219
                                 (bcnt == 8)  ? (data == 8'hff) & mac_sa_bc :
220
                                 (bcnt == 9)  ? (data == 8'hff) & mac_sa_bc :
221
                                 (bcnt == 10) ? (data == 8'hff) & mac_sa_bc :
222
                                 (bcnt == 11) ? (data == 8'hff) & mac_sa_bc : mac_sa_bc;
223
 
224
              mac_sa_mc      <= (bcnt == 6)  ? (data[7] == 1'b1)  : mac_sa_mc & !mac_sa_bc;
225
 
226
              mac_sa_match   <= (bcnt == 6)  ? (cfg_mac_sa[7:0]   == data) :
227
                                (bcnt == 7)  ? (cfg_mac_sa[15:8]  == data) & mac_sa_match :
228
                                (bcnt == 8)  ? (cfg_mac_sa[23:16] == data) & mac_sa_match :
229
                                (bcnt == 9)  ? (cfg_mac_sa[31:24] == data) & mac_sa_match :
230
                                (bcnt == 10) ? (cfg_mac_sa[39:32] == data) & mac_sa_match :
231
                                (bcnt == 11) ? (cfg_mac_sa[47:40] == data) & mac_sa_match :
232
                                mac_sa_match;
233
 
234
             // L3 Protocol Analysis
235
              ipv4f          <= (bcnt == 12) ? (data == 8'h08) :
236
                             (bcnt == 13) ? (data == 8'h00) & ipv4f : ipv4f;
237
 
238
              arpf           <= (bcnt == 12) ? (data == 8'h08) :
239
                            (bcnt == 13) ? (data == 8'h06) & arpf : arpf;
240
             // L4 Protocol Analysis
241
              tcpf           <= (bcnt == 23) ? (data == 8'h06) & ipv4f: tcpf;
242
              udpf           <= (bcnt == 23) ? (data == 8'h11) & ipv4f: udpf;
243
             // IP DA and SA Match
244
              ip_sa_match     <= (bcnt == 26) ? (data == cfg_ip_sa[7:0])   & ipv4f:
245
                                 (bcnt == 27) ? (data == cfg_ip_sa[15:8])  & ipv4f & ip_sa_match:
246
                                 (bcnt == 28) ? (data == cfg_ip_sa[23:16]) & ipv4f & ip_sa_match:
247
                                 (bcnt == 29) ? (data == cfg_ip_sa[31:24]) & ipv4f & ip_sa_match:
248
                                 ip_sa_match;
249
              ip_da_match     <= (bcnt == 26) ? (data == cfg_ip_sa[7:0])   & ipv4f:
250
                                 (bcnt == 27) ? (data == cfg_ip_sa[15:8])  & ipv4f & ip_da_match:
251
                                 (bcnt == 28) ? (data == cfg_ip_sa[23:16]) & ipv4f & ip_da_match:
252
                                 (bcnt == 29) ? (data == cfg_ip_sa[31:24]) & ipv4f & ip_da_match:
253
                                 ip_da_match;
254
 
255
           end else begin // on EOP
256
 
257
            if(&mac_da_match) begin
258
               pkt_status[1:0] <= 2'b11; // Local DA
259
            end else if(mac_da_bc) begin
260
               pkt_status[1:0] <= 2'b00;  // Broadcast frame
261
            end else if(mac_da_mc) begin
262
               pkt_status[1:0] <= 2'b01; // Multicase frame
263
            end else
264
               pkt_status[1:0] <= 2'b10; // Unknown Unicast frame
265
 
266
            if(&mac_sa_match) begin
267
               pkt_status[3:2] <= 2'b11; // Local DA
268
            end else if(mac_sa_bc) begin
269
               pkt_status[3:2] <= 2'b00;  // Broadcast frame
270
            end else if(mac_sa_mc) begin
271
               pkt_status[3:2] <= 2'b01; // Multicast frame
272
            end else
273
               pkt_status[3:2] <= 2'b10; // Unknown Unicast frame
274
 
275
            if(tcpf) begin
276
               pkt_status[6:4] <= 3'b010; // IP4 Frame + TCP
277
            end else if(udpf) begin
278
               pkt_status[6:4] <= 3'b011; // IP4 Frame + UDP
279
            end else if(arpf) begin
280
               pkt_status[6:4] <= 3'b101; // ARP frame
281
            end else
282
               pkt_status[6:4] <= 2'b00; // UnKnown Ethernet frame
283
 
284
            mac_da_match  <= 0;
285
            mac_sa_match  <= 0;
286
            mac_sa_bc     <= 0;
287
            mac_sa_mc     <= 0;
288
            mac_da_bc     <= 0;
289
            mac_da_mc     <= 0;
290 61 dinesha
            tcpf          <= 0;
291
            udpf          <= 0;
292
            arpf          <= 0;
293
            ipv4f         <= 0;
294 36 dinesha
         end
295
      end
296
   end
297
end
298
 
299
 
300
endmodule

powered by: WebSVN 2.1.0

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