Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / design / sys / iop / niu / rtl / fflp_merge_func.v
CommitLineData
86530b38
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: fflp_merge_func.v
4// Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved
5// 4150 Network Circle, Santa Clara, California 95054, U.S.A.
6//
7// * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
8//
9// This program is free software; you can redistribute it and/or modify
10// it under the terms of the GNU General Public License as published by
11// the Free Software Foundation; version 2 of the License.
12//
13// This program is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16// GNU General Public License for more details.
17//
18// You should have received a copy of the GNU General Public License
19// along with this program; if not, write to the Free Software
20// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21//
22// For the avoidance of doubt, and except that if any non-GPL license
23// choice is available it will apply instead, Sun elects to use only
24// the General Public License version 2 (GPLv2) at this time for any
25// software where a choice of GPL license versions is made
26// available with the language indicating that GPLv2 or any later version
27// may be used, or where a choice of which version of the GPL is applied is
28// otherwise unspecified.
29//
30// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
31// CA 95054 USA or visit www.sun.com if you need additional information or
32// have any questions.
33//
34// ========== Copyright Header End ============================================
35/**********************************************************************/
36/*project name: N2 */
37/*module name: fflp_merge_func */
38/*description: Merge function to create forward decision to ZCP */
39/* */
40/*parent module in: fflp_fcram_top */
41/*child modules in: */
42/*interface modules: */
43/*author name: Jeanne Cai */
44/*date created: 04-08-04 */
45/* */
46/* Copyright (c) 2004, Sun Microsystems, Inc. */
47/* Sun Proprietary and Confidential */
48/* */
49/*modifications: */
50/* */
51/* */
52
53
54module fflp_merge_func (
55 cclk,
56 reset,
57 fwd_sched,
58 fc_fifo_dout,
59 fc_din_reg_dout_r,
60 ecc_check_err_r,
61 ecc_corr_err_r,
62 fio_no_fatal_err,
63 srch_burst_done_2,
64 srch_fio_wait_6,
65 srch_fio_rd_en_4,
66 fcram_sm_state,
67 fflp_config_reg_wen_pulse_sync,
68 debug_training_vector,
69 pio_debug_data_sel,
70
71 merg_bus_0_hash_v1,
72 merg_bus_0_rdc_tbl_num,
73 merg_bus_1_fc_lookup,
74 zcp_wr,
75 fflp_zcp_data,
76 fc_err_status,
77 fflp_debug_port
78
79 );
80
81input cclk;
82input reset;
83input fwd_sched;
84input[512:0] fc_fifo_dout;
85input[71:0] fc_din_reg_dout_r;
86input ecc_check_err_r;
87input ecc_corr_err_r;
88input fio_no_fatal_err;
89input srch_burst_done_2;
90input srch_fio_wait_6;
91input srch_fio_rd_en_4;
92input[4:0] fcram_sm_state;
93input fflp_config_reg_wen_pulse_sync;
94input[31:0] debug_training_vector;
95input[2:0] pio_debug_data_sel;
96
97output[19:0] merg_bus_0_hash_v1;
98output[2:0] merg_bus_0_rdc_tbl_num;
99output merg_bus_1_fc_lookup;
100output zcp_wr;
101output[215:0] fflp_zcp_data;
102output[33:0] fc_err_status;
103output[31:0] fflp_debug_port;
104
105wire zcp_wr;
106wire[215:0] fflp_zcp_data;
107
108wire[512:0] merg_bus;
109wire[512:0] merg_bus_1;
110wire[512:0] merg_bus_2;
111wire[512:0] merg_bus_3;
112
113wire[19:0] merg_bus_hash_v1;
114wire[15:0] merg_bus_hash_v2;
115wire[383:0] merg_bus_flow_key;
116wire[114:0] merg_bus_fwd_info;
117
118wire[63:0] merg_bus_flow_key_row0;
119wire[63:0] merg_bus_flow_key_row1;
120wire[63:0] merg_bus_flow_key_row2;
121wire[63:0] merg_bus_flow_key_row3;
122wire[63:0] merg_bus_flow_key_row4;
123wire[63:0] merg_bus_flow_key_row5;
124
125wire[1:0] merg_bus_fkey_port;
126wire[7:0] merg_bus_fkey_protocol;
127wire[15:0] merg_bus_fkey_ly4_1;
128wire[15:0] merg_bus_fkey_ly4_0;
129
130wire[11:0] merg_bus_fkey_vid;
131wire[47:0] merg_bus_fkey_mac_da;
132wire[3:0] merg_bus_fkey_vlan_valid;
133
134wire[2:0] merg_bus_rdc_tbl_num;
135wire merg_bus_cam_match;
136wire merg_bus_drop_pkt;
137wire[1:0] merg_bus_ether_type;
138wire[1:0] merg_bus_l4_protocol;
139wire merg_bus_badip;
140wire merg_bus_noport;
141wire merg_bus_llcnsap;
142wire merg_bus_vlan;
143wire[4:0] merg_bus_class;
144wire merg_bus_ph_match;
145wire merg_bus_promis;
146
147wire[3:0] merg_bus_ip_hdr_len; //for v4 only. v6 has fixed 40 bytes
148wire[15:0] merg_bus_ip_pkt_len; //for both v4, v6.
149wire[3:0] merg_bus_tcp_hdr_len;
150wire merg_bus_tcp_push_bit;
151wire[31:0] merg_bus_tcp_seq_num;
152wire[3:0] merg_bus_pkt_id;
153wire[4:0] merg_bus_rdc_tbl_offset;
154wire[1:0] merg_bus_valid_tres;
155wire merg_bus_valid_zcopy;
156wire[9:0] merg_bus_valid_cam_haddr;
157wire merg_bus_am_parity_err;
158wire merg_bus_fc_lookup;
159wire[1:0] merg_bus_mac_port;
160wire[11:0] merg_bus_zcopy_id;
161
162wire sub0_fmt;
163wire sub0_ext;
164wire sub0_valid;
165wire[47:0] sub0_mac_da;
166wire[11:0] sub0_vid;
167wire[4:0] sub0_rdc_offset;
168wire[15:0] sub0_hash_v2;
169wire[39:0] sub0_usr_info;
170
171wire sub0_mac_da_comp0;
172wire sub0_mac_da_comp1;
173wire sub0_mac_da_comp2;
174wire sub0_mac_da_comp3;
175wire sub0_vlan_match;
176
177wire sub0_hash_v2_match;
178wire sub0_v4_ext_match;
179wire sub0_v6_ext_match;
180wire sub0_ip_version_match;
181wire sub0_is_opt_match;
182wire sub0_opt_match;
183wire v4_comp_reg_en0;
184
185wire sub0_v4_ext_match_r;
186wire sub4_v4_ext_match_r;
187wire sub0_v6_ext_match_r;
188wire sub0_opt_match_r;
189wire sub0_mac_da_comp0_r;
190wire sub0_mac_da_comp1_r;
191wire sub0_mac_da_comp2_r;
192wire sub0_mac_da_comp3_r;
193wire sub0_vlan_match_r;
194
195wire sub0_mac_da_match;
196wire[31:0] sub1_v4_src_addr;
197wire[31:0] sub1_v4_dest_addr;
198wire[63:0] sub1_v6_src_addr_u;
199
200wire sub1_fmt;
201wire sub1_ext;
202wire sub1_valid;
203wire[15:0] sub1_hash_v2;
204
205wire sub1_v4_src_addr_comp0;
206wire sub1_v4_src_addr_comp1;
207wire sub1_v4_dest_addr_comp0;
208wire sub1_v4_dest_addr_comp1;
209
210wire sub1_v6_src_addr_u_comp0;
211wire sub1_v6_src_addr_u_comp1;
212wire sub1_v6_src_addr_u_comp2;
213wire sub1_v6_src_addr_u_comp3;
214
215wire sub1_hash_v2_match;
216wire sub1_ip_version_match;
217wire sub1_is_opt_match;
218wire sub1_opt_match;
219wire v4_comp_reg_en1;
220
221wire sub0_mac_da_match_r;
222wire sub1_v4_src_addr_comp0_r;
223wire sub1_v4_src_addr_comp1_r;
224wire sub1_v4_dest_addr_comp0_r;
225wire sub1_v4_dest_addr_comp1_r;
226wire sub1_v6_src_addr_u_comp0_r;
227wire sub1_v6_src_addr_u_comp1_r;
228wire sub1_v6_src_addr_u_comp2_r;
229wire sub1_v6_src_addr_u_comp3_r;
230wire sub1_opt_match_r;
231
232wire sub1_v4_src_addr_match;
233wire sub1_v4_dest_addr_match;
234wire sub1_v6_src_addr_u_match;
235
236wire[15:0] sub2_ly4_0;
237wire[15:0] sub2_ly4_1;
238wire[7:0] sub2_protocol;
239wire[1:0] sub2_port;
240
241wire[63:0] sub2_v6_src_addr_l;
242
243wire sub2_fmt;
244wire sub2_ext;
245wire sub2_valid;
246wire[15:0] sub2_hash_v2;
247
248wire sub2_ly4_0_match;
249wire sub2_ly4_1_match;
250wire sub2_protocol_match;
251wire sub2_port_match;
252
253wire sub2_v6_src_addr_l_comp0;
254wire sub2_v6_src_addr_l_comp1;
255wire sub2_v6_src_addr_l_comp2;
256wire sub2_v6_src_addr_l_comp3;
257
258wire sub2_hash_v2_match;
259wire sub2_ip_version_match;
260wire sub2_is_opt_match;
261wire sub2_opt_match;
262wire v4_comp_reg_en2;
263wire v6_comp_reg_en2;
264
265wire sub1_v4_src_addr_match_r;
266wire sub1_v4_dest_addr_match_r;
267wire sub1_v6_src_addr_u_match_r;
268
269wire sub2_ly4_0_match_r;
270wire sub2_ly4_1_match_r;
271wire sub2_protocol_match_r;
272wire sub2_port_match_r;
273
274wire sub2_v6_src_addr_l_comp0_r;
275wire sub2_v6_src_addr_l_comp1_r;
276wire sub2_v6_src_addr_l_comp2_r;
277wire sub2_v6_src_addr_l_comp3_r;
278wire sub2_opt_match_r;
279
280wire sub2_v6_src_addr_l_match;
281wire sub3_v4_ext_match_tmp;
282wire sub3_v4_ext_match_all;
283wire sub7_v4_ext_match_all;
284
285wire[4:0] sub3_rdc_offset;
286wire sub3_zcopy_valid;
287wire[11:0] sub3_zcopy_id;
288wire[39:0] sub3_usr_info;
289
290wire[63:0] sub3_v6_dst_addr_u;
291
292wire sub3_fmt;
293wire sub3_ext;
294wire sub3_valid;
295wire[15:0] sub3_hash_v2;
296
297wire sub3_v6_dst_addr_u_comp0;
298wire sub3_v6_dst_addr_u_comp1;
299wire sub3_v6_dst_addr_u_comp2;
300wire sub3_v6_dst_addr_u_comp3;
301
302wire sub3_hash_v2_match;
303wire sub3_ip_version_match;
304wire sub3_is_opt_match;
305wire sub3_opt_match;
306
307wire sub2_v6_src_addr_l_match_r;
308wire sub3_v6_dst_addr_u_comp0_r;
309wire sub3_v6_dst_addr_u_comp1_r;
310wire sub3_v6_dst_addr_u_comp2_r;
311wire sub3_v6_dst_addr_u_comp3_r;
312wire sub3_v4_ext_match_all_r;
313//wire sub7_v4_ext_match_all_r;
314wire sub3_opt_match_r;
315
316wire sub3_v6_dst_addr_u_match;
317
318wire[63:0] sub4_v6_dst_addr_l;
319wire sub4_fmt;
320wire sub4_ext;
321wire sub4_valid;
322wire[15:0] sub4_hash_v2;
323
324wire sub4_v6_dst_addr_l_comp0;
325wire sub4_v6_dst_addr_l_comp1;
326wire sub4_v6_dst_addr_l_comp2;
327wire sub4_v6_dst_addr_l_comp3;
328
329wire sub4_hash_v2_match;
330wire sub4_ip_version_match;
331wire sub4_is_opt_match;
332wire sub4_opt_match;
333
334wire sub3_v6_dst_addr_u_match_r;
335wire sub4_v6_dst_addr_l_comp0_r;
336wire sub4_v6_dst_addr_l_comp1_r;
337wire sub4_v6_dst_addr_l_comp2_r;
338wire sub4_v6_dst_addr_l_comp3_r;
339wire sub4_opt_match_r;
340
341wire sub4_v6_dst_addr_l_match;
342
343wire sub5_fmt;
344wire sub5_ext;
345wire sub5_valid;
346wire[15:0] sub5_hash_v2;
347
348wire sub5_hash_v2_match;
349wire sub5_ip_version_match;
350wire sub5_is_opt_match;
351wire sub5_opt_match;
352
353wire sub4_v6_dst_addr_l_match_r;
354wire sub5_opt_match_r;
355
356wire sub6_v6_ext_match_all;
357wire sub6_fmt;
358wire sub6_ext;
359wire sub6_valid;
360wire[15:0] sub6_hash_v2;
361
362wire sub6_hash_v2_match;
363wire sub6_ip_version_match;
364wire sub6_is_opt_match;
365wire sub6_opt_match;
366
367wire sub6_v6_ext_match_all_r;
368wire sub6_opt_match_r;
369
370wire sub7_fmt;
371wire sub7_ext;
372wire sub7_valid;
373wire[15:0] sub7_hash_v2;
374
375wire sub7_hash_v2_match;
376wire sub7_ip_version_match;
377wire sub7_is_opt_match;
378wire sub7_opt_match;
379wire sub7_opt_match_r;
380
381wire exect_match;
382wire[2:0] ext_sub_addr;
383wire ext_info_reg_en;
384
385wire exect_match_r;
386wire[2:0] ext_sub_addr_r;
387wire ext_zcopy_valid_r;
388wire[11:0] ext_zcopy_id_r;
389wire[4:0] ext_rdc_offset_r;
390wire[39:0] ext_usr_info_r;
391
392wire opt_match;
393wire[7:0] opt_match_array;
394
395wire sub4_opt_match4;
396wire sub4_opt_match4_r;
397wire sub7_opt_no_match1;
398wire sub7_opt_no_match2;
399wire sub7_opt_no_match3;
400wire sub7_opt_no_match4;
401wire sub7_opt_no_match5;
402wire sub7_opt_no_match6;
403wire sub7_opt_no_match7;
404wire opt_info_reg_en;
405
406reg[2:0] opt_sub_addr;
407reg[2:0] sub_area_addr;
408
409wire[4:0] opt_rdc_offset_r;
410wire[39:0] opt_usr_info_r;
411
412wire opt_match_v;
413wire exect_match_v;
414wire fram_hash_match;
415wire[2:0] fram_sub_addr;
416wire fram_zcopy_valid;
417wire[11:0] fram_zcopy_id;
418wire[4:0] fram_rdc_offset;
419wire[39:0] fram_usr_info;
420
421wire fwd_l2_class;
422wire[4:0] fwd_rdc_offset;
423wire[11:0] fwd_zcopy_id;
424wire[1:0] fwd_l4_protocol;
425wire[19:0] fwd_hash_v1;
426wire[15:0] fwd_hash_v2;
427
428wire merg_bus_fc_lookup_r;
429wire fwd_l2_class_r;
430wire[4:0] merg_bus_rdc_tbl_offset_r;
431wire merg_bus_valid_tres_bit0_r;
432wire[4:0] merg_bus_hash_v1_lsb_r;
433wire merg_bus_valid_zcopy_r;
434wire[11:0] merg_bus_zcopy_id_r;
435wire[2:0] merg_bus_rdc_tbl_num_r;
436wire[4:0] fwd_rdc_offset_r;
437
438wire[7:0] byte0, byte1, byte2, byte3, byte4;
439wire[7:0] byte5, byte6, byte7, byte8, byte9;
440wire[7:0] byte10, byte11, byte12, byte13, byte14;
441wire[7:0] byte15, byte16, byte17, byte18, byte19;
442wire[7:0] byte20, byte21, byte22, byte23, byte24;
443wire[7:0] byte25, byte26;
444
445wire[7:0] byte0_r, byte1_r, byte3_r, byte4_r;
446wire[7:0] byte6_r, byte7_r, byte8_r, byte9_r;
447wire[7:0] byte10_r, byte11_r, byte12_r, byte13_r, byte14_r;
448wire[7:0] byte15_r, byte16_r, byte17_r, byte18_r;
449wire[7:0] byte20_r, byte21_r, byte22_r, byte23_r, byte24_r;
450wire[7:0] byte25_r, byte26_r;
451
452wire[19:0] merg_bus_0_hash_v1;
453wire[2:0] merg_bus_0_rdc_tbl_num;
454wire merg_bus_1_fc_lookup;
455
456wire merge_func_cyc0;
457wire merge_func_cyc1;
458wire merge_func_cyc2;
459wire merge_func_cyc3;
460wire merge_func_cyc4;
461wire merge_func_cyc5;
462wire merge_func_cyc6;
463wire merge_func_cyc7;
464
465wire pre_zcp_wr;
466wire pre_zcp_wr1;
467wire pre_zcp_wr2;
468wire zcp_wr_p;
469
470wire[7:0] ecc_syndrome;
471wire[7:0] ecc_syndrome_r;
472
473wire fflp_hdw_err;
474wire merge_func_cyc;
475wire ecc_uncor_err_en;
476wire ecc_uncor_err_in;
477wire ecc_uncor_err;
478wire ecc_check_err_all;
479wire err_cnt_reg_en;
480wire[3:0] err_cnt_in;
481wire is_ecc_uncor_en; //the first err is uncorr_err
482wire is_ecc_uncor_in;
483wire is_ecc_uncor_r;
484wire ecc_err;
485wire multi_err;
486wire[19:0] err_hash_v1;
487wire ecc_addr_reg_en;
488wire[7:0] sub_addr_array;
489wire[33:0] fc_err_status_in;
490wire[3:0] err_cnt;
491wire[2:0] ecc_sub_addr;
492wire[33:0] fc_err_status;
493
494wire[6:0] merg_bus_cntl_data;
495wire[31:0] debug_port_data_in;
496wire[31:0] fflp_debug_port;
497wire[2:0] debug_data_sel;
498
499wire[71:0] fc_din_reg_dout_r1;
500wire ecc_check_err_r1;
501wire ecc_corr_err_r1;
502
503assign fc_din_reg_dout_r1 = (merg_bus_fc_lookup & fio_no_fatal_err) ? fc_din_reg_dout_r : 72'b0;
504assign ecc_check_err_r1 = (merg_bus_fc_lookup & fio_no_fatal_err) ? ecc_check_err_r : 1'b0;
505assign ecc_corr_err_r1 = (merg_bus_fc_lookup & fio_no_fatal_err) ? ecc_corr_err_r : 1'b0;
506
507
508dffre #(513) merg_bus_reg (cclk, reset, fwd_sched, fc_fifo_dout, merg_bus);
509dffre #(513) merg_bus_1_reg (cclk, reset, srch_burst_done_2, merg_bus, merg_bus_1);
510dffre #(513) merg_bus_2_reg (cclk, reset, srch_fio_wait_6, merg_bus_1, merg_bus_2);
511dffre #(513) merg_bus_3_reg (cclk, reset, srch_fio_rd_en_4, merg_bus_2, merg_bus_3);
512
513assign merg_bus_0_hash_v1 = merg_bus[19:0];
514assign merg_bus_0_rdc_tbl_num = merg_bus[400:398];
515
516assign merg_bus_1_fc_lookup = merg_bus_1[498];
517
518assign merg_bus_hash_v1 = merg_bus_3[19:0];
519assign merg_bus_hash_v2 = merg_bus_3[35:20];
520assign merg_bus_flow_key = {merg_bus_3[397:36], 22'b0};
521assign merg_bus_fwd_info = merg_bus_3[512:398];
522
523assign merg_bus_flow_key_row0 = merg_bus_flow_key[63:0];
524assign merg_bus_flow_key_row1 = merg_bus_flow_key[127:64]; //IP dest addr
525assign merg_bus_flow_key_row2 = merg_bus_flow_key[191:128];
526assign merg_bus_flow_key_row3 = merg_bus_flow_key[255:192]; //IP source addr
527assign merg_bus_flow_key_row4 = merg_bus_flow_key[319:256];
528assign merg_bus_flow_key_row5 = merg_bus_flow_key[383:320];
529
530assign merg_bus_fkey_port = merg_bus_flow_key_row0[23:22];
531assign merg_bus_fkey_protocol = merg_bus_flow_key_row0[31:24];
532assign merg_bus_fkey_ly4_1 = merg_bus_flow_key_row0[47:32];
533assign merg_bus_fkey_ly4_0 = merg_bus_flow_key_row0[63:48];
534
535assign merg_bus_fkey_vid = merg_bus_flow_key_row5[11:0];
536assign merg_bus_fkey_mac_da = merg_bus_flow_key_row5[59:12];
537assign merg_bus_fkey_vlan_valid = merg_bus_flow_key_row5[63:60];
538
539assign merg_bus_rdc_tbl_num = merg_bus_fwd_info[2:0];
540assign merg_bus_cam_match = merg_bus_fwd_info[3];
541assign merg_bus_drop_pkt = merg_bus_fwd_info[4];
542assign merg_bus_ether_type = merg_bus_fwd_info[6:5];
543assign merg_bus_l4_protocol = merg_bus_fwd_info[8:7];
544assign merg_bus_badip = merg_bus_fwd_info[9];
545assign merg_bus_noport = merg_bus_fwd_info[10];
546assign merg_bus_llcnsap = merg_bus_fwd_info[11];
547assign merg_bus_vlan = merg_bus_fwd_info[12];
548assign merg_bus_class = merg_bus_fwd_info[17:13];
549assign merg_bus_ph_match = merg_bus_fwd_info[18];
550assign merg_bus_promis = merg_bus_fwd_info[19];
551
552assign merg_bus_ip_hdr_len = merg_bus_fwd_info[23:20];
553assign merg_bus_ip_pkt_len = merg_bus_fwd_info[39:24];
554assign merg_bus_tcp_hdr_len = merg_bus_fwd_info[43:40];
555assign merg_bus_tcp_push_bit = merg_bus_fwd_info[44];
556assign merg_bus_tcp_seq_num = merg_bus_fwd_info[76:45];
557assign merg_bus_pkt_id = merg_bus_fwd_info[80:77];
558assign merg_bus_rdc_tbl_offset = merg_bus_fwd_info[85:81];
559assign merg_bus_valid_tres = merg_bus_fwd_info[87:86];
560assign merg_bus_valid_zcopy = merg_bus_fwd_info[88];
561assign merg_bus_valid_cam_haddr = merg_bus_fwd_info[98:89];
562assign merg_bus_am_parity_err = merg_bus_fwd_info[99];
563assign merg_bus_fc_lookup = merg_bus_fwd_info[100];
564assign merg_bus_mac_port = merg_bus_fwd_info[102:101];
565assign merg_bus_zcopy_id = merg_bus_fwd_info[114:103];
566
567/**********************************/
568//Merge and Compare Function
569/**********************************/
570
571/**************/
572//subarea0
573/**************/
574assign sub0_fmt = fc_din_reg_dout_r1[63];
575assign sub0_ext = fc_din_reg_dout_r1[62];
576assign sub0_valid = fc_din_reg_dout_r1[61];
577assign sub0_mac_da = fc_din_reg_dout_r1[59:12];
578assign sub0_vid = fc_din_reg_dout_r1[11:0];
579
580assign sub0_rdc_offset = fc_din_reg_dout_r1[60:56];
581assign sub0_hash_v2 = fc_din_reg_dout_r1[55:40];
582assign sub0_usr_info = fc_din_reg_dout_r1[39:0];
583
584/*******************************************************/
585
586assign sub0_mac_da_comp0 = (sub0_mac_da[11:0] == merg_bus_fkey_mac_da[11:0]);
587assign sub0_mac_da_comp1 = (sub0_mac_da[23:12] == merg_bus_fkey_mac_da[23:12]);
588assign sub0_mac_da_comp2 = (sub0_mac_da[35:24] == merg_bus_fkey_mac_da[35:24]);
589assign sub0_mac_da_comp3 = (sub0_mac_da[47:36] == merg_bus_fkey_mac_da[47:36]);
590assign sub0_vlan_match = (sub0_vid == merg_bus_fkey_vid) | (merg_bus_fkey_vlan_valid == 4'b0000);
591
592assign sub0_hash_v2_match = (sub0_hash_v2 == merg_bus_hash_v2);
593
594/*******************************************************/
595
596assign sub0_v4_ext_match = sub0_valid & merg_bus_ether_type[0] & (!sub0_fmt) & sub0_ext;
597assign sub0_v6_ext_match = sub0_valid & merg_bus_ether_type[1] & sub0_fmt & sub0_ext;
598
599assign sub0_ip_version_match = (merg_bus_ether_type[0] & (!sub0_fmt) | merg_bus_ether_type[1] & sub0_fmt);
600assign sub0_is_opt_match = sub0_valid & (!sub0_ext) & sub0_ip_version_match;
601assign sub0_opt_match = sub0_hash_v2_match & sub0_is_opt_match;
602
603assign v4_comp_reg_en0 = merge_func_cyc0 | (merge_func_cyc4 & !sub0_v6_ext_match_r);
604
605/*******************************************************/
606
607dffre #(1) sub0_v4_ext_match_reg (cclk, reset, merge_func_cyc0, sub0_v4_ext_match, sub0_v4_ext_match_r);
608dffre #(1) sub0_v6_ext_match_reg (cclk, reset, merge_func_cyc0, sub0_v6_ext_match, sub0_v6_ext_match_r);
609dffre #(1) sub0_opt_match_reg (cclk, reset, merge_func_cyc0, sub0_opt_match, sub0_opt_match_r);
610
611dffre #(1) sub0_mac_da_comp0_reg (cclk, reset, v4_comp_reg_en0, sub0_mac_da_comp0, sub0_mac_da_comp0_r);
612dffre #(1) sub0_mac_da_comp1_reg (cclk, reset, v4_comp_reg_en0, sub0_mac_da_comp1, sub0_mac_da_comp1_r);
613dffre #(1) sub0_mac_da_comp2_reg (cclk, reset, v4_comp_reg_en0, sub0_mac_da_comp2, sub0_mac_da_comp2_r);
614dffre #(1) sub0_mac_da_comp3_reg (cclk, reset, v4_comp_reg_en0, sub0_mac_da_comp3, sub0_mac_da_comp3_r);
615dffre #(1) sub0_vlan_match_reg (cclk, reset, v4_comp_reg_en0, sub0_vlan_match, sub0_vlan_match_r);
616
617dffre #(1) sub4_v4_ext_match_reg (cclk, reset, merge_func_cyc4, sub0_v4_ext_match, sub4_v4_ext_match_r);
618
619/**************/
620//subarea1
621/**************/
622assign sub0_mac_da_match = sub0_mac_da_comp0_r & sub0_mac_da_comp1_r & sub0_mac_da_comp2_r & sub0_mac_da_comp3_r;
623
624assign sub1_v4_src_addr = fc_din_reg_dout_r1[63:32];
625assign sub1_v4_dest_addr = fc_din_reg_dout_r1[31:0];
626
627assign sub1_v6_src_addr_u = fc_din_reg_dout_r1[63:0];
628
629assign sub1_fmt = fc_din_reg_dout_r1[63];
630assign sub1_ext = fc_din_reg_dout_r1[62];
631assign sub1_valid = fc_din_reg_dout_r1[61];
632assign sub1_hash_v2 = fc_din_reg_dout_r1[55:40];
633
634/********************************************************/
635
636assign sub1_v4_src_addr_comp0 = (sub1_v4_src_addr[15:0] == merg_bus_flow_key_row3[15:0]);
637assign sub1_v4_src_addr_comp1 = (sub1_v4_src_addr[31:16] == merg_bus_flow_key_row3[31:16]);
638assign sub1_v4_dest_addr_comp0 = (sub1_v4_dest_addr[15:0] == merg_bus_flow_key_row1[15:0]);
639assign sub1_v4_dest_addr_comp1 = (sub1_v4_dest_addr[31:16] == merg_bus_flow_key_row1[31:16]);
640
641assign sub1_v6_src_addr_u_comp0 = (sub1_v6_src_addr_u[15:0] == merg_bus_flow_key_row4[15:0]);
642assign sub1_v6_src_addr_u_comp1 = (sub1_v6_src_addr_u[31:16] == merg_bus_flow_key_row4[31:16]);
643assign sub1_v6_src_addr_u_comp2 = (sub1_v6_src_addr_u[47:32] == merg_bus_flow_key_row4[47:32]);
644assign sub1_v6_src_addr_u_comp3 = (sub1_v6_src_addr_u[63:48] == merg_bus_flow_key_row4[63:48]);
645
646assign sub1_hash_v2_match = (sub1_hash_v2 == merg_bus_hash_v2);
647
648/*******************************************************/
649
650assign sub1_ip_version_match = (merg_bus_ether_type[0] & (!sub1_fmt) | merg_bus_ether_type[1] & sub1_fmt);
651assign sub1_is_opt_match = sub1_valid & (!sub1_ext) & sub1_ip_version_match;
652assign sub1_opt_match = sub1_hash_v2_match & sub1_is_opt_match;
653
654assign v4_comp_reg_en1 = merge_func_cyc1 | (merge_func_cyc5 & !sub0_v6_ext_match_r);
655
656/*******************************************************/
657
658dffre #(1) sub0_mac_da_match_reg (cclk, reset, v4_comp_reg_en1, sub0_mac_da_match, sub0_mac_da_match_r);
659
660dffre #(1) sub1_v4_src_addr_comp0_reg (cclk, reset, v4_comp_reg_en1, sub1_v4_src_addr_comp0, sub1_v4_src_addr_comp0_r);
661dffre #(1) sub1_v4_src_addr_comp1_reg (cclk, reset, v4_comp_reg_en1, sub1_v4_src_addr_comp1, sub1_v4_src_addr_comp1_r);
662dffre #(1) sub1_v4_dest_addr_comp0_reg (cclk, reset, v4_comp_reg_en1, sub1_v4_dest_addr_comp0, sub1_v4_dest_addr_comp0_r);
663dffre #(1) sub1_v4_dest_addr_comp1_reg (cclk, reset, v4_comp_reg_en1, sub1_v4_dest_addr_comp1, sub1_v4_dest_addr_comp1_r);
664
665dffre #(1) sub1_v6_src_addr_u_comp0_reg (cclk, reset, merge_func_cyc1, sub1_v6_src_addr_u_comp0,sub1_v6_src_addr_u_comp0_r);
666dffre #(1) sub1_v6_src_addr_u_comp1_reg (cclk, reset, merge_func_cyc1, sub1_v6_src_addr_u_comp1,sub1_v6_src_addr_u_comp1_r);
667dffre #(1) sub1_v6_src_addr_u_comp2_reg (cclk, reset, merge_func_cyc1, sub1_v6_src_addr_u_comp2,sub1_v6_src_addr_u_comp2_r);
668dffre #(1) sub1_v6_src_addr_u_comp3_reg (cclk, reset, merge_func_cyc1, sub1_v6_src_addr_u_comp3,sub1_v6_src_addr_u_comp3_r);
669
670dffre #(1) sub1_opt_match_reg (cclk, reset, merge_func_cyc1, sub1_opt_match, sub1_opt_match_r);
671
672/**************/
673//subarea2
674/**************/
675assign sub1_v4_src_addr_match = sub1_v4_src_addr_comp0_r & sub1_v4_src_addr_comp1_r;
676assign sub1_v4_dest_addr_match = sub1_v4_dest_addr_comp0_r & sub1_v4_dest_addr_comp1_r;
677assign sub1_v6_src_addr_u_match = sub1_v6_src_addr_u_comp0_r & sub1_v6_src_addr_u_comp1_r &
678 sub1_v6_src_addr_u_comp2_r & sub1_v6_src_addr_u_comp3_r;
679
680/******************************************************/
681
682assign sub2_ly4_0 = fc_din_reg_dout_r1[63:48];
683assign sub2_ly4_1 = fc_din_reg_dout_r1[47:32];
684assign sub2_protocol = fc_din_reg_dout_r1[31:24];
685assign sub2_port = fc_din_reg_dout_r1[23:22];
686
687assign sub2_v6_src_addr_l = fc_din_reg_dout_r1[63:0];
688
689assign sub2_fmt = fc_din_reg_dout_r1[63];
690assign sub2_ext = fc_din_reg_dout_r1[62];
691assign sub2_valid = fc_din_reg_dout_r1[61];
692assign sub2_hash_v2 = fc_din_reg_dout_r1[55:40];
693
694/*******************************************************/
695assign sub2_ly4_0_match = (sub2_ly4_0 == merg_bus_fkey_ly4_0);
696assign sub2_ly4_1_match = (sub2_ly4_1 == merg_bus_fkey_ly4_1);
697assign sub2_protocol_match = (sub2_protocol == merg_bus_fkey_protocol);
698assign sub2_port_match = (sub2_port == merg_bus_fkey_port);
699
700assign sub2_v6_src_addr_l_comp0 = (sub2_v6_src_addr_l[15:0] == merg_bus_flow_key_row3[15:0]);
701assign sub2_v6_src_addr_l_comp1 = (sub2_v6_src_addr_l[31:16] == merg_bus_flow_key_row3[31:16]);
702assign sub2_v6_src_addr_l_comp2 = (sub2_v6_src_addr_l[47:32] == merg_bus_flow_key_row3[47:32]);
703assign sub2_v6_src_addr_l_comp3 = (sub2_v6_src_addr_l[63:48] == merg_bus_flow_key_row3[63:48]);
704
705assign sub2_hash_v2_match = (sub2_hash_v2 == merg_bus_hash_v2);
706
707/*******************************************************/
708
709assign sub2_ip_version_match = (merg_bus_ether_type[0] & (!sub2_fmt) | merg_bus_ether_type[1] & sub2_fmt);
710assign sub2_is_opt_match = sub2_valid & (!sub2_ext) & sub2_ip_version_match;
711assign sub2_opt_match = sub2_hash_v2_match & sub2_is_opt_match;
712
713assign v4_comp_reg_en2 = merge_func_cyc2 | (merge_func_cyc6 & !sub0_v6_ext_match_r) ;
714assign v6_comp_reg_en2 = merge_func_cyc2 | merge_func_cyc5 | merge_func_cyc6;
715
716/*******************************************************/
717
718
719dffre #(1) sub1_v4_src_addr_match_reg (cclk, reset, v4_comp_reg_en2, sub1_v4_src_addr_match, sub1_v4_src_addr_match_r);
720dffre #(1) sub1_v4_dest_addr_match_reg (cclk, reset, v4_comp_reg_en2, sub1_v4_dest_addr_match, sub1_v4_dest_addr_match_r);
721
722dffre #(1) sub1_v6_src_addr_u_match_reg (cclk, reset, merge_func_cyc2, sub1_v6_src_addr_u_match,sub1_v6_src_addr_u_match_r);
723
724dffre #(1) sub2_ly4_0_match_reg (cclk, reset, v6_comp_reg_en2, sub2_ly4_0_match, sub2_ly4_0_match_r);
725dffre #(1) sub2_ly4_1_match_reg (cclk, reset, v6_comp_reg_en2, sub2_ly4_1_match, sub2_ly4_1_match_r);
726dffre #(1) sub2_protocol_match_reg (cclk, reset, v6_comp_reg_en2, sub2_protocol_match, sub2_protocol_match_r);
727dffre #(1) sub2_port_match_reg (cclk, reset, v6_comp_reg_en2, sub2_port_match, sub2_port_match_r);
728
729dffre #(1) sub2_v6_src_addr_l_comp0_reg (cclk, reset, merge_func_cyc2, sub2_v6_src_addr_l_comp0,sub2_v6_src_addr_l_comp0_r);
730dffre #(1) sub2_v6_src_addr_l_comp1_reg (cclk, reset, merge_func_cyc2, sub2_v6_src_addr_l_comp1,sub2_v6_src_addr_l_comp1_r);
731dffre #(1) sub2_v6_src_addr_l_comp2_reg (cclk, reset, merge_func_cyc2, sub2_v6_src_addr_l_comp2,sub2_v6_src_addr_l_comp2_r);
732dffre #(1) sub2_v6_src_addr_l_comp3_reg (cclk, reset, merge_func_cyc2, sub2_v6_src_addr_l_comp3,sub2_v6_src_addr_l_comp3_r);
733
734dffre #(1) sub2_opt_match_reg (cclk, reset, merge_func_cyc2, sub2_opt_match, sub2_opt_match_r);
735
736
737/**************/
738//subarea3
739/**************/
740assign sub2_v6_src_addr_l_match = sub2_v6_src_addr_l_comp0_r & sub2_v6_src_addr_l_comp1_r &
741 sub2_v6_src_addr_l_comp2_r & sub2_v6_src_addr_l_comp3_r;
742
743assign sub3_v4_ext_match_tmp = sub0_vlan_match_r & sub0_mac_da_match_r &
744 sub1_v4_src_addr_match_r & sub1_v4_dest_addr_match_r &
745 sub2_ly4_0_match_r & sub2_ly4_1_match_r &
746 sub2_protocol_match_r & sub2_port_match_r;
747
748assign sub3_v4_ext_match_all = sub3_v4_ext_match_tmp & sub0_v4_ext_match_r;
749assign sub7_v4_ext_match_all = sub3_v4_ext_match_tmp & sub4_v4_ext_match_r;
750
751/*****************************************************/
752
753assign sub3_rdc_offset = fc_din_reg_dout_r1[60:56];
754assign sub3_zcopy_valid = fc_din_reg_dout_r1[55];
755assign sub3_zcopy_id = fc_din_reg_dout_r1[51:40];
756assign sub3_usr_info = fc_din_reg_dout_r1[39:0];
757
758assign sub3_v6_dst_addr_u = fc_din_reg_dout_r1[63:0];
759
760assign sub3_fmt = fc_din_reg_dout_r1[63];
761assign sub3_ext = fc_din_reg_dout_r1[62];
762assign sub3_valid = fc_din_reg_dout_r1[61];
763assign sub3_hash_v2 = fc_din_reg_dout_r1[55:40];
764
765/*****************************************************/
766
767assign sub3_v6_dst_addr_u_comp0 = (sub3_v6_dst_addr_u[15:0] == merg_bus_flow_key_row2[15:0]);
768assign sub3_v6_dst_addr_u_comp1 = (sub3_v6_dst_addr_u[31:16] == merg_bus_flow_key_row2[31:16]);
769assign sub3_v6_dst_addr_u_comp2 = (sub3_v6_dst_addr_u[47:32] == merg_bus_flow_key_row2[47:32]);
770assign sub3_v6_dst_addr_u_comp3 = (sub3_v6_dst_addr_u[63:48] == merg_bus_flow_key_row2[63:48]);
771
772assign sub3_hash_v2_match = (sub3_hash_v2 == merg_bus_hash_v2);
773
774/*******************************************************/
775
776assign sub3_ip_version_match = (merg_bus_ether_type[0] & (!sub3_fmt) | merg_bus_ether_type[1] & sub3_fmt);
777assign sub3_is_opt_match = sub3_valid & (!sub3_ext) & sub3_ip_version_match;
778assign sub3_opt_match = sub3_hash_v2_match & sub3_is_opt_match;
779
780/******************************************************/
781
782dffre #(1) sub2_v6_src_addr_l_match_reg (cclk, reset, merge_func_cyc3, sub2_v6_src_addr_l_match,sub2_v6_src_addr_l_match_r);
783
784dffre #(1) sub3_v6_dst_addr_u_comp0_reg (cclk, reset, merge_func_cyc3, sub3_v6_dst_addr_u_comp0,sub3_v6_dst_addr_u_comp0_r);
785dffre #(1) sub3_v6_dst_addr_u_comp1_reg (cclk, reset, merge_func_cyc3, sub3_v6_dst_addr_u_comp1,sub3_v6_dst_addr_u_comp1_r);
786dffre #(1) sub3_v6_dst_addr_u_comp2_reg (cclk, reset, merge_func_cyc3, sub3_v6_dst_addr_u_comp2,sub3_v6_dst_addr_u_comp2_r);
787dffre #(1) sub3_v6_dst_addr_u_comp3_reg (cclk, reset, merge_func_cyc3, sub3_v6_dst_addr_u_comp3,sub3_v6_dst_addr_u_comp3_r);
788
789dffre #(1) sub3_v4_ext_match_all_reg (cclk, reset, merge_func_cyc3, sub3_v4_ext_match_all, sub3_v4_ext_match_all_r);
790//dffre #(1) sub7_v4_ext_match_all_reg (cclk, reset, merge_func_cyc7, sub3_v4_ext_match_all, sub7_v4_ext_match_all_r);
791dffre #(1) sub3_opt_match_reg (cclk, reset, merge_func_cyc3, sub3_opt_match, sub3_opt_match_r);
792
793/**************/
794//subarea4
795/**************/
796assign sub3_v6_dst_addr_u_match = sub3_v6_dst_addr_u_comp0_r & sub3_v6_dst_addr_u_comp1_r &
797 sub3_v6_dst_addr_u_comp2_r & sub3_v6_dst_addr_u_comp3_r;
798
799/*****************************************************/
800
801assign sub4_v6_dst_addr_l = fc_din_reg_dout_r1[63:0];
802
803assign sub4_fmt = fc_din_reg_dout_r1[63];
804assign sub4_ext = fc_din_reg_dout_r1[62];
805assign sub4_valid = fc_din_reg_dout_r1[61];
806assign sub4_hash_v2 = fc_din_reg_dout_r1[55:40];
807
808/*****************************************************/
809
810assign sub4_v6_dst_addr_l_comp0 = (sub4_v6_dst_addr_l[15:0] == merg_bus_flow_key_row1[15:0]);
811assign sub4_v6_dst_addr_l_comp1 = (sub4_v6_dst_addr_l[31:16] == merg_bus_flow_key_row1[31:16]);
812assign sub4_v6_dst_addr_l_comp2 = (sub4_v6_dst_addr_l[47:32] == merg_bus_flow_key_row1[47:32]);
813assign sub4_v6_dst_addr_l_comp3 = (sub4_v6_dst_addr_l[63:48] == merg_bus_flow_key_row1[63:48]);
814
815assign sub4_hash_v2_match = (sub4_hash_v2 == merg_bus_hash_v2);
816
817/*******************************************************/
818
819assign sub4_ip_version_match = (merg_bus_ether_type[0] & (!sub4_fmt) | merg_bus_ether_type[1] & sub4_fmt);
820assign sub4_is_opt_match = sub4_valid & (!sub4_ext) & sub4_ip_version_match;
821assign sub4_opt_match = sub4_hash_v2_match & sub4_is_opt_match;
822
823/******************************************************/
824
825dffre #(1) sub3_v6_dst_addr_u_match_reg (cclk, reset, merge_func_cyc4, sub3_v6_dst_addr_u_match,sub3_v6_dst_addr_u_match_r);
826
827dffre #(1) sub4_v6_dst_addr_l_comp0_reg (cclk, reset, merge_func_cyc4, sub4_v6_dst_addr_l_comp0,sub4_v6_dst_addr_l_comp0_r);
828dffre #(1) sub4_v6_dst_addr_l_comp1_reg (cclk, reset, merge_func_cyc4, sub4_v6_dst_addr_l_comp1,sub4_v6_dst_addr_l_comp1_r);
829dffre #(1) sub4_v6_dst_addr_l_comp2_reg (cclk, reset, merge_func_cyc4, sub4_v6_dst_addr_l_comp2,sub4_v6_dst_addr_l_comp2_r);
830dffre #(1) sub4_v6_dst_addr_l_comp3_reg (cclk, reset, merge_func_cyc4, sub4_v6_dst_addr_l_comp3,sub4_v6_dst_addr_l_comp3_r);
831
832dffre #(1) sub4_opt_match_reg (cclk, reset, merge_func_cyc4, sub4_opt_match, sub4_opt_match_r);
833
834/**************/
835//subarea5
836/**************/
837assign sub4_v6_dst_addr_l_match = sub4_v6_dst_addr_l_comp0_r & sub4_v6_dst_addr_l_comp1_r &
838 sub4_v6_dst_addr_l_comp2_r & sub4_v6_dst_addr_l_comp3_r;
839
840
841/*****************************************************/
842
843assign sub5_fmt = fc_din_reg_dout_r1[63];
844assign sub5_ext = fc_din_reg_dout_r1[62];
845assign sub5_valid = fc_din_reg_dout_r1[61];
846assign sub5_hash_v2 = fc_din_reg_dout_r1[55:40];
847
848/*****************************************************/
849
850assign sub5_hash_v2_match = (sub5_hash_v2 == merg_bus_hash_v2);
851assign sub5_ip_version_match = (merg_bus_ether_type[0] & (!sub5_fmt) | merg_bus_ether_type[1] & sub5_fmt);
852assign sub5_is_opt_match = sub5_valid & (!sub5_ext) & sub5_ip_version_match;
853assign sub5_opt_match = sub5_hash_v2_match & sub5_is_opt_match;
854
855/******************************************************/
856
857dffre #(1) sub4_v6_dst_addr_l_match_reg (cclk, reset, merge_func_cyc5, sub4_v6_dst_addr_l_match,sub4_v6_dst_addr_l_match_r);
858
859dffre #(1) sub5_opt_match_reg (cclk, reset, merge_func_cyc5, sub5_opt_match, sub5_opt_match_r);
860
861
862/**************/
863//subarea6
864/**************/
865assign sub6_v6_ext_match_all = sub0_v6_ext_match_r & sub0_vlan_match_r & sub0_mac_da_match_r &
866 sub1_v6_src_addr_u_match_r & sub2_v6_src_addr_l_match_r &
867 sub3_v6_dst_addr_u_match_r & sub4_v6_dst_addr_l_match_r &
868 sub2_ly4_0_match_r & sub2_ly4_1_match_r &
869 sub2_protocol_match_r & sub2_port_match_r;
870
871/*****************************************************/
872
873assign sub6_fmt = fc_din_reg_dout_r1[63];
874assign sub6_ext = fc_din_reg_dout_r1[62];
875assign sub6_valid = fc_din_reg_dout_r1[61];
876assign sub6_hash_v2 = fc_din_reg_dout_r1[55:40];
877
878/*****************************************************/
879
880assign sub6_hash_v2_match = (sub6_hash_v2 == merg_bus_hash_v2);
881assign sub6_ip_version_match = (merg_bus_ether_type[0] & (!sub6_fmt) | merg_bus_ether_type[1] & sub6_fmt);
882assign sub6_is_opt_match = sub6_valid & (!sub6_ext) & sub6_ip_version_match;
883assign sub6_opt_match = sub6_hash_v2_match & sub6_is_opt_match;
884
885/******************************************************/
886
887dffre #(1) sub6_v6_ext_match_all_reg (cclk, reset, merge_func_cyc6, sub6_v6_ext_match_all, sub6_v6_ext_match_all_r);
888dffre #(1) sub6_opt_match_reg (cclk, reset, merge_func_cyc6, sub6_opt_match, sub6_opt_match_r);
889
890/**************/
891//subarea7
892/**************/
893assign sub7_fmt = fc_din_reg_dout_r1[63];
894assign sub7_ext = fc_din_reg_dout_r1[62];
895assign sub7_valid = fc_din_reg_dout_r1[61];
896assign sub7_hash_v2 = fc_din_reg_dout_r1[55:40];
897
898/*****************************************************/
899
900assign sub7_hash_v2_match = (sub7_hash_v2 == merg_bus_hash_v2);
901assign sub7_ip_version_match = (merg_bus_ether_type[0] & (!sub7_fmt) | merg_bus_ether_type[1] & sub7_fmt);
902assign sub7_is_opt_match = sub7_valid & (!sub7_ext) & sub7_ip_version_match;
903assign sub7_opt_match = sub7_hash_v2_match & sub7_is_opt_match;
904
905/******************************************************/
906
907dffre #(1) sub7_opt_match_reg (cclk, reset, merge_func_cyc7, sub7_opt_match, sub7_opt_match_r);
908
909/*******************/
910//Exect Match
911/*******************/
912assign exect_match = sub3_v4_ext_match_all_r | sub6_v6_ext_match_all_r | sub7_v4_ext_match_all;
913assign ext_sub_addr = (sub3_v4_ext_match_all_r | sub6_v6_ext_match_all_r) ? 3'b000 : 3'b100;
914assign ext_info_reg_en = (merge_func_cyc3 |
915 (merge_func_cyc6 & !sub3_v4_ext_match_all_r) |
916 (merge_func_cyc7 & !(sub3_v4_ext_match_all_r | sub6_v6_ext_match_all_r)));
917
918dffre #(1) exect_match_reg (cclk, reset, merge_func_cyc7, exect_match, exect_match_r);
919dffre #(3) ext_sub_addr_reg (cclk, reset, merge_func_cyc7, ext_sub_addr, ext_sub_addr_r);
920dffre #(1) ext_zcopy_valid_reg (cclk, reset, ext_info_reg_en, sub3_zcopy_valid, ext_zcopy_valid_r);
921dffre #(12) ext_zcopy_id_reg (cclk, reset, ext_info_reg_en, sub3_zcopy_id, ext_zcopy_id_r);
922dffre #(5) ext_rdc_offset_reg (cclk, reset, ext_info_reg_en, sub3_rdc_offset, ext_rdc_offset_r);
923dffre #(40) ext_usr_info_reg (cclk, reset, ext_info_reg_en, sub3_usr_info, ext_usr_info_r);
924
925
926/*******************/
927//Optimistic Match
928/*******************/
929assign opt_match = sub4_opt_match_r | sub5_opt_match_r | sub6_opt_match_r | sub7_opt_match_r |
930 sub4_opt_match4_r;
931assign opt_match_array = {sub7_opt_match_r, sub6_opt_match_r, sub5_opt_match_r, sub4_opt_match_r,
932 sub3_opt_match_r, sub2_opt_match_r, sub1_opt_match_r, sub0_opt_match_r};
933
934assign sub4_opt_match4 = sub0_opt_match_r | sub1_opt_match_r | sub2_opt_match_r | sub3_opt_match_r;
935assign sub7_opt_no_match1 = !sub0_opt_match_r;
936assign sub7_opt_no_match2 = !(sub0_opt_match_r | sub1_opt_match_r);
937assign sub7_opt_no_match3 = !(sub0_opt_match_r | sub1_opt_match_r | sub2_opt_match_r);
938assign sub7_opt_no_match4 = !(sub0_opt_match_r | sub1_opt_match_r | sub2_opt_match_r | sub3_opt_match_r);
939assign sub7_opt_no_match5 = !(sub4_opt_match4_r | sub4_opt_match_r);
940assign sub7_opt_no_match6 = !(sub4_opt_match4_r | sub4_opt_match_r | sub5_opt_match_r);
941assign sub7_opt_no_match7 = !(sub4_opt_match4_r | sub4_opt_match_r | sub5_opt_match_r | sub6_opt_match_r);
942
943assign opt_info_reg_en = (merge_func_cyc7 & sub7_opt_no_match7) |
944 (merge_func_cyc6 & sub7_opt_no_match6) |
945 (merge_func_cyc5 & sub7_opt_no_match5) |
946 (merge_func_cyc4 & sub7_opt_no_match4) |
947 (merge_func_cyc3 & sub7_opt_no_match3) |
948 (merge_func_cyc2 & sub7_opt_no_match2) |
949 (merge_func_cyc1 & sub7_opt_no_match1) |
950 merge_func_cyc0;
951
952always @(opt_match_array)
953begin
954
955casex (opt_match_array)
956// 0in < case -full -parallel -message "0in ERROR: case check in fflp_merge_func"
957
9588'bxxxxxxx1: opt_sub_addr = 3'b000;
9598'bxxxxxx10: opt_sub_addr = 3'b001;
9608'bxxxxx100: opt_sub_addr = 3'b010;
9618'bxxxx1000: opt_sub_addr = 3'b011;
9628'bxxx10000: opt_sub_addr = 3'b100;
9638'bxx100000: opt_sub_addr = 3'b101;
9648'bx1000000: opt_sub_addr = 3'b110;
9658'b10000000: opt_sub_addr = 3'b111;
966default: opt_sub_addr = 3'b000;
967
968endcase
969
970end
971
972dffre #(1) sub4_opt_match4_reg (cclk, reset, merge_func_cyc4, sub4_opt_match4, sub4_opt_match4_r);
973dffre #(5) opt_rdc_offset_reg (cclk, reset, opt_info_reg_en, sub0_rdc_offset, opt_rdc_offset_r);
974dffre #(40) opt_usr_info_reg (cclk, reset, opt_info_reg_en, sub0_usr_info, opt_usr_info_r);
975
976
977/***********************************************/
978//Merge Matches, one cycle after merge_func_cyc7
979/***********************************************/
980assign opt_match_v = opt_match & merg_bus_fc_lookup_r & !ecc_uncor_err;
981assign exect_match_v = exect_match_r & merg_bus_fc_lookup_r & !ecc_uncor_err;
982
983assign fram_hash_match = opt_match_v | exect_match_v;
984assign fram_sub_addr = exect_match_v ? ext_sub_addr_r : opt_match_v ? opt_sub_addr : 3'b0;
985assign fram_zcopy_valid = exect_match_v ? ext_zcopy_valid_r : 1'b0;
986assign fram_zcopy_id = exect_match_v ? ext_zcopy_id_r : 12'b0;
987assign fram_rdc_offset = exect_match_v ? ext_rdc_offset_r : opt_match_v ? opt_rdc_offset_r : 5'b0;
988assign fram_usr_info = exect_match_v ? ext_usr_info_r : opt_match_v ? opt_usr_info_r : 40'b0;
989
990
991assign fwd_l2_class = !(merg_bus_class[2] | merg_bus_class[3]) | merg_bus_class[4];
992
993assign fwd_rdc_offset = (fwd_l2_class_r | merg_bus_valid_tres_bit0_r) ? merg_bus_rdc_tbl_offset_r[4:0] :
994 ecc_uncor_err ? 5'b0 :
995 fram_hash_match ? fram_rdc_offset[4:0] :
996 merg_bus_hash_v1_lsb_r[4:0];
997
998assign fwd_zcopy_id = merg_bus_fc_lookup_r ? fram_zcopy_id :
999 merg_bus_valid_zcopy_r ? merg_bus_zcopy_id_r : 12'b0;
1000
1001assign fwd_l4_protocol = (|merg_bus_ether_type) ? merg_bus_l4_protocol : 2'b00; //at merge_func_cyc7
1002assign fwd_hash_v1 = (|merg_bus_ether_type) ? merg_bus_hash_v1[19:0] : 20'b0; //at merge_func_cyc7
1003assign fwd_hash_v2 = (|merg_bus_ether_type) ? merg_bus_hash_v2 : 16'b0; //at merge_func_cyc7
1004
1005assign fflp_hdw_err = merg_bus_am_parity_err | (!fio_no_fatal_err) |
1006 ecc_uncor_err | ecc_check_err_r1; //at merge_func_cyc7
1007
1008dffre #(1) merg_bus_fc_lookup_r_reg (cclk, reset, merge_func_cyc7, merg_bus_fc_lookup, merg_bus_fc_lookup_r);
1009dffre #(1) fwd_l2_class_r_reg (cclk, reset, merge_func_cyc7, fwd_l2_class, fwd_l2_class_r);
1010dffre #(5) merg_bus_rdc_offset_r_reg (cclk, reset, merge_func_cyc7, merg_bus_rdc_tbl_offset, merg_bus_rdc_tbl_offset_r);
1011dffre #(1) merg_bus_valid_tres_r_reg (cclk, reset, merge_func_cyc7, merg_bus_valid_tres[0], merg_bus_valid_tres_bit0_r);
1012dffre #(5) merg_bus_hash_v1_r_reg (cclk, reset, merge_func_cyc7, merg_bus_hash_v1[4:0], merg_bus_hash_v1_lsb_r);
1013dffre #(1) merg_bus_valid_zcopy_r_reg (cclk, reset, merge_func_cyc7, merg_bus_valid_zcopy, merg_bus_valid_zcopy_r);
1014dffre #(12) merg_bus_zcopy_id_r_reg (cclk, reset, merge_func_cyc7, merg_bus_zcopy_id, merg_bus_zcopy_id_r);
1015
1016/*******************/
1017//Forward Decision
1018/*******************/
1019assign byte0 = {merg_bus_mac_port, merg_bus_ph_match, merg_bus_class};
1020assign byte1 = {merg_bus_vlan, merg_bus_llcnsap, merg_bus_noport, merg_bus_badip,
1021 merg_bus_cam_match, merg_bus_valid_tres, merg_bus_valid_zcopy};
1022
1023assign byte2 = {merg_bus_rdc_tbl_num_r, fwd_rdc_offset_r};
1024
1025assign byte3 = merg_bus_valid_cam_haddr[7:0];
1026assign byte4 = {2'b0, fram_hash_match, exect_match_v, fram_zcopy_valid, fram_sub_addr};
1027
1028assign byte5 = 8'b0; //reserved for zcp to use
1029
1030assign byte6 = {merg_bus_promis, fflp_hdw_err, merg_bus_drop_pkt, merg_bus_tcp_push_bit, fwd_zcopy_id[11:8]};
1031assign byte7 = fwd_zcopy_id[7:0];
1032
1033assign byte8 = fwd_hash_v2[15:8];
1034assign byte9 = fwd_hash_v2[7:0];
1035assign byte10 = {4'b0, fwd_hash_v1[19:16]};
1036assign byte11 = fwd_hash_v1[15:8];
1037assign byte12 = fwd_hash_v1[7:0];
1038
1039assign byte13 = fram_usr_info[39:32];
1040assign byte14 = fram_usr_info[31:24];
1041assign byte15 = fram_usr_info[23:16];
1042assign byte16 = fram_usr_info[15:8];
1043assign byte17 = fram_usr_info[7:0];
1044
1045assign byte18 = {1'b0, merg_bus_ether_type[1], merg_bus_pkt_id, fwd_l4_protocol};
1046assign byte19 = 8'b0;
1047assign byte20 = merg_bus_ip_pkt_len[15:8];
1048assign byte21 = merg_bus_ip_pkt_len[7:0];
1049assign byte22 = {merg_bus_ip_hdr_len, merg_bus_tcp_hdr_len};
1050assign byte23 = merg_bus_tcp_seq_num[31:24];
1051assign byte24 = merg_bus_tcp_seq_num[23:16];
1052assign byte25 = merg_bus_tcp_seq_num[15:8];
1053assign byte26 = merg_bus_tcp_seq_num[7:0];
1054
1055dffre #(8) byte0_reg (cclk, reset, merge_func_cyc7, byte0, byte0_r);
1056dffre #(8) byte1_reg (cclk, reset, merge_func_cyc7, byte1, byte1_r);
1057
1058dffre #(5) rdc_offset_reg(cclk, reset, pre_zcp_wr, fwd_rdc_offset, fwd_rdc_offset_r);
1059dffre #(3) rdc_num_reg (cclk, reset, merge_func_cyc7, merg_bus_rdc_tbl_num, merg_bus_rdc_tbl_num_r);
1060
1061dffre #(8) byte3_reg (cclk, reset, merge_func_cyc7, byte3, byte3_r);
1062dffre #(8) byte4_reg (cclk, reset, pre_zcp_wr, byte4, byte4_r);
1063
1064dffre #(4) byte6_reg_h (cclk, reset, merge_func_cyc7, byte6[7:4], byte6_r[7:4]);
1065dffre #(4) byte6_reg_l (cclk, reset, pre_zcp_wr, byte6[3:0], byte6_r[3:0]);
1066
1067dffre #(8) byte7_reg (cclk, reset, pre_zcp_wr, byte7, byte7_r);
1068dffre #(8) byte8_reg (cclk, reset, merge_func_cyc7, byte8, byte8_r);
1069dffre #(8) byte9_reg (cclk, reset, merge_func_cyc7, byte9, byte9_r);
1070dffre #(8) byte10_reg (cclk, reset, merge_func_cyc7, byte10, byte10_r);
1071dffre #(8) byte11_reg (cclk, reset, merge_func_cyc7, byte11, byte11_r);
1072dffre #(8) byte12_reg (cclk, reset, merge_func_cyc7, byte12, byte12_r);
1073dffre #(8) byte13_reg (cclk, reset, pre_zcp_wr, byte13, byte13_r);
1074dffre #(8) byte14_reg (cclk, reset, pre_zcp_wr, byte14, byte14_r);
1075dffre #(8) byte15_reg (cclk, reset, pre_zcp_wr, byte15, byte15_r);
1076dffre #(8) byte16_reg (cclk, reset, pre_zcp_wr, byte16, byte16_r);
1077dffre #(8) byte17_reg (cclk, reset, pre_zcp_wr, byte17, byte17_r);
1078dffre #(8) byte18_reg (cclk, reset, merge_func_cyc7, byte18, byte18_r);
1079
1080dffre #(8) byte20_reg (cclk, reset, merge_func_cyc7, byte20, byte20_r);
1081dffre #(8) byte21_reg (cclk, reset, merge_func_cyc7, byte21, byte21_r);
1082dffre #(8) byte22_reg (cclk, reset, merge_func_cyc7, byte22, byte22_r);
1083dffre #(8) byte23_reg (cclk, reset, merge_func_cyc7, byte23, byte23_r);
1084dffre #(8) byte24_reg (cclk, reset, merge_func_cyc7, byte24, byte24_r);
1085dffre #(8) byte25_reg (cclk, reset, merge_func_cyc7, byte25, byte25_r);
1086dffre #(8) byte26_reg (cclk, reset, merge_func_cyc7, byte26, byte26_r);
1087
1088assign fflp_zcp_data = {byte0_r, byte1_r, byte2, byte3_r, byte4_r,
1089 byte5, byte6_r, byte7_r, byte8_r, byte9_r,
1090 byte10_r, byte11_r, byte12_r, byte13_r, byte14_r,
1091 byte15_r, byte16_r, byte17_r, byte18_r, byte19,
1092 byte20_r, byte21_r, byte22_r, byte23_r, byte24_r,
1093 byte25_r, byte26_r};
1094
1095dffr #(1) merge_func_cyc0_reg (cclk, reset, srch_fio_rd_en_4, merge_func_cyc0);
1096dffr #(1) merge_func_cyc1_reg (cclk, reset, merge_func_cyc0, merge_func_cyc1);
1097dffr #(1) merge_func_cyc2_reg (cclk, reset, merge_func_cyc1, merge_func_cyc2);
1098dffr #(1) merge_func_cyc3_reg (cclk, reset, merge_func_cyc2, merge_func_cyc3);
1099dffr #(1) merge_func_cyc4_reg (cclk, reset, merge_func_cyc3, merge_func_cyc4);
1100dffr #(1) merge_func_cyc5_reg (cclk, reset, merge_func_cyc4, merge_func_cyc5);
1101dffr #(1) merge_func_cyc6_reg (cclk, reset, merge_func_cyc5, merge_func_cyc6);
1102dffr #(1) merge_func_cyc7_reg (cclk, reset, merge_func_cyc6, merge_func_cyc7);
1103
1104dffr #(1) pre_zcp_wr_reg (cclk, reset, merge_func_cyc7, pre_zcp_wr);
1105dffr #(1) pre_zcp_wr1_reg (cclk, reset, pre_zcp_wr, pre_zcp_wr1);
1106dffr #(1) pre_zcp_wr2_reg (cclk, reset, pre_zcp_wr1, pre_zcp_wr2);
1107dffr #(1) zcp_wr_reg (cclk, reset, zcp_wr_p, zcp_wr);
1108
1109assign zcp_wr_p = pre_zcp_wr | pre_zcp_wr1 | pre_zcp_wr2;
1110
1111
1112/***************************/
1113//FCRAM Error handling
1114/***************************/
1115assign merge_func_cyc = (merge_func_cyc0 | merge_func_cyc1 | merge_func_cyc2 | merge_func_cyc3 |
1116 merge_func_cyc4 | merge_func_cyc5 | merge_func_cyc6 | merge_func_cyc7);
1117assign ecc_uncor_err_en = merge_func_cyc & ecc_check_err_r1 | pre_zcp_wr;
1118assign ecc_uncor_err_in = merge_func_cyc & ecc_check_err_r1 ? 1'b1 : 1'b0;
1119
1120assign ecc_check_err_all= ecc_check_err_r1 | ecc_corr_err_r1;
1121assign err_cnt_reg_en = merge_func_cyc & ecc_check_err_all | pre_zcp_wr;
1122assign err_cnt_in = merge_func_cyc0 & ecc_check_err_all ? 4'd1 :
1123 merge_func_cyc & ecc_check_err_all ? (err_cnt + 4'd1) :
1124 4'd0;
1125assign ecc_err = |err_cnt;
1126assign multi_err = |err_cnt[3:1];
1127assign err_hash_v1 = {byte10_r[3:0], byte11_r[7:0], byte12_r[7:0]};
1128assign sub_addr_array = {merge_func_cyc7, merge_func_cyc6, merge_func_cyc5, merge_func_cyc4,
1129 merge_func_cyc3, merge_func_cyc2, merge_func_cyc1, merge_func_cyc0};
1130assign ecc_addr_reg_en = merge_func_cyc & ecc_check_err_all & (err_cnt == 4'b0) | pre_zcp_wr;
1131
1132assign is_ecc_uncor_en = merge_func_cyc0 & ecc_check_err_all | merge_func_cyc & ecc_check_err_all & (err_cnt == 4'b0) | pre_zcp_wr;
1133assign is_ecc_uncor_in = merge_func_cyc0 & ecc_check_err_all | merge_func_cyc & ecc_check_err_all & (err_cnt == 4'b0) ? ecc_check_err_r1 : 1'b0;
1134
1135assign ecc_syndrome = fc_din_reg_dout_r1[71:64];
1136
1137always @(sub_addr_array)
1138begin
1139
1140casex (sub_addr_array)
1141
11428'bxxxxxxx1: sub_area_addr = 3'b000;
11438'bxxxxxx10: sub_area_addr = 3'b001;
11448'bxxxxx100: sub_area_addr = 3'b010;
11458'bxxxx1000: sub_area_addr = 3'b011;
11468'bxxx10000: sub_area_addr = 3'b100;
11478'bxx100000: sub_area_addr = 3'b101;
11488'bx1000000: sub_area_addr = 3'b110;
11498'b10000000: sub_area_addr = 3'b111;
1150default: sub_area_addr = 3'b000;
1151
1152endcase
1153
1154end
1155
1156assign fc_err_status_in = {ecc_err, is_ecc_uncor_r, multi_err, err_hash_v1, ecc_sub_addr, ecc_syndrome_r}; //34bits
1157
1158dffre #(1) ecc_uncor_err_reg (cclk, reset, ecc_uncor_err_en, ecc_uncor_err_in, ecc_uncor_err);
1159dffre #(4) err_cnt_reg (cclk, reset, err_cnt_reg_en, err_cnt_in, err_cnt);
1160dffre #(3) ecc_sub_addr_reg (cclk, reset, ecc_addr_reg_en, sub_area_addr, ecc_sub_addr);
1161dffre #(8) ecc_ecc_syndrome_reg(cclk, reset, ecc_addr_reg_en, ecc_syndrome, ecc_syndrome_r);
1162dffre #(1) is_ecc_uncor_reg (cclk, reset, is_ecc_uncor_en, is_ecc_uncor_in, is_ecc_uncor_r);
1163dffre #(34) fc_err_status_reg (cclk, reset, pre_zcp_wr, fc_err_status_in, fc_err_status);
1164
1165
1166/*************************/
1167//Debug port data
1168/*************************/
1169assign merg_bus_cntl_data = {merge_func_cyc7, merg_bus_fc_lookup, merg_bus_rdc_tbl_offset[4:0]};
1170assign debug_port_data_in = (debug_data_sel == 3'b000) ? {byte0_r, byte1_r, byte2, byte3_r} :
1171 (debug_data_sel == 3'b001) ? {byte4_r, byte6_r, byte7_r, byte8_r} :
1172 (debug_data_sel == 3'b010) ? {byte9_r, byte10_r, byte11_r, byte12_r} :
1173 (debug_data_sel == 3'b011) ? {byte18_r, byte20_r, byte21_r, byte22_r} :
1174 (debug_data_sel == 3'b100) ? fc_din_reg_dout_r1[63:32] :
1175 (debug_data_sel == 3'b101) ? {fc_din_reg_dout_r1[31:12], merg_bus_cntl_data[6:0], fcram_sm_state[4:0]} :
1176 (debug_data_sel == 3'b110) ? debug_training_vector :
1177 ~fflp_debug_port;
1178
1179dffre #(3) debug_data_sel_reg (cclk, reset, fflp_config_reg_wen_pulse_sync, pio_debug_data_sel, debug_data_sel);
1180dffr #(32) fflp_debug_port_reg (cclk, reset, debug_port_data_in, fflp_debug_port);
1181
1182endmodule
1183
1184