// ========== Copyright Header Begin ========================================== // // OpenSPARC T2 Processor File: ip_util.vr // Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved // 4150 Network Circle, Santa Clara, California 95054, U.S.A. // // * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; version 2 of the License. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // For the avoidance of doubt, and except that if any non-GPL license // choice is available it will apply instead, Sun elects to use only // the General Public License version 2 (GPLv2) at this time for any // software where a choice of GPL license versions is made // available with the language indicating that GPLv2 or any later version // may be used, or where a choice of which version of the GPL is applied is // otherwise unspecified. // // Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, // CA 95054 USA or visit www.sun.com if you need additional information or // have any questions. // // ========== Copyright Header End ============================================ #include #include "fflp_memory_map.vri" #include "niu_mem.vrh" #include "niu_mem.vrh" #include "niu_rx_descp.vrh" #include "pcg_defines.vri" #include "pcg_types.vri" //#include "pcg_classes.vrh" #include "pack_db.vrh" //#include "pack_db_tasks.vrh" #include "flow_db.vrh" #include "flow_db_tasks.vrh" #include "pg_top_pp.vrh" //#include "pcg_lib.vrh" #include "pc_top_pp.vrh" #include "cMesg.vrh" #include "mbox_class.vrh" #include "get_mbox_id.vrh" #include "xmac_util.vrh" #include "bmac_util.vrh" #include "pcs_util.vrh" #include "xpcs_util.vrh" #include "ip_ingress_classes.vrh" // KH #include "ip_ingress_db.vrh" // KH /* class ip_util { //--- Shared variables for all sub-classes bit vlan_parity_error = 1'b0; static bit mem_mode; //0 - intmem, 1 - extmem static bit ip_ib_path, ip_ht_path; integer index; static string in_pkt_type; static string out_pkt_type; setup_cam_ram_fcram_class setup_ip_db_cl; // KH bit tuple_type = 0; // =0(5tuple), =1(4tuple) bit [11:0] tcam_disc = 12'h0; bit [11:0] tcam_tsel = 12'hfff; bit [11:0] tcam_ipaddr = 12'h0; task new() { if (get_plus_arg (CHECK, "NO_FFLP_DATABASE")) { be_msg_fflp.print(e_mesg_info, *, "ip_util::new()", "Skipping FFLP setup_ip_db_cl.\n"); } else { be_msg_fflp.print(e_mesg_info, *, "ip_util::new()", "NEW setup_ip_db_cl.\n"); setup_ip_db_cl = new(); // KH } } } */ //================================================ //====== FFLP CAM, ZBTRAM, related =============== //================================================ /* extern hdl_task dump_cam_file(integer dump_file_num); extern hdl_task dump_asdata(integer dump_file_num); extern hdl_task force_cam_file(integer force_dump_file_num); extern hdl_task force_asdata(integer force_dump_file_num); */ extern hdl_task force_vlan_tbl_entry (bit [15:0]mem_addr,bit [8:0] mem_ar_data); //extern hdl_task force_vlan_tbl_entry_nep (bit [11:0]mem_addr,bit [17:0] mem_ar_data); #ifndef NO_EXT_CAM_RAM extern hdl_task init_memory(bit [20:0] addr, bit [143:0] data); extern hdl_task force_cam_entry(integer tuple_type, bit [31:0] cam_addr, bit [199:0] cam_key, bit [199:0] cam_lmask); extern hdl_task force_asdata_entry(bit [31:0] cam_addr,bit [11:0] as_data_chksum,bit [31:0] as_adata0,bit [31:0] as_adata1,bit [31:0] as_adata2); #endif //class setup_cam_ram_fcram_class extends ip_util { class setup_cam_ram_fcram_class { event init_master_test_done; bit [2:0] zcp_rdc_tbl_prog_mode; bit [4:0] zcp_dma_chnl; integer zcp_rdc_tbl_index; integer tcam_entries; bit [4:0] rd_zcp_dma_chnl; bit neptune_mode = 1'b0; bit [1:0] vlan_parity_error = 2'b00; static bit mem_mode; //0 - intmem, 1 - extmem static bit ip_ib_path, ip_ht_path; integer index; static string in_pkt_type; static string out_pkt_type; // setup_cam_ram_fcram_class setup_ip_db_cl; // KH bit tuple_type = 0; // =0(5tuple), =1(4tuple) bit [11:0] tcam_disc = 12'h0; bit [11:0] tcam_tsel = 12'hfff; bit [11:0] tcam_ipaddr = 12'h0; bit [11:0] how_flow_iport = 12'h0; bit [11:0] how_flow_da_addr = 12'h0; bit [11:0] how_flow_vlan = 12'h0; bit [11:0] how_flow_ipsrc = 12'h0; bit [11:0] how_flow_ipdst = 12'h0; bit [11:0] how_flow_pid = 12'h0; bit [23:0] how_flow_l40 = 24'h0; bit [23:0] how_flow_l41 = 24'h0; integer i; integer pkt_cnt; bit [2:0] l2_rdc_tbl_num [256]; bit [199:0] shadow_cam_key [256]; bit [199:0] shadow_cam_lmask [256]; bit [63:0] shadow_adata [256]; bit [63:0] shadow_fflp_how_tcam_key_cls_C; bit [63:0] shadow_fflp_how_tcam_key_cls_D; bit [63:0] shadow_fflp_how_tcam_key_cls_E; bit [63:0] shadow_fflp_how_tcam_key_cls_F; bit [39:0] fflp_reg_addr[8]; integer random_value32; integer random_value5; integer random_value6; integer random_value7; integer random_value8; integer random_value10; integer random_value11; bit [4:0] shadow_zcp_table [256]; bit EXT_LOOKUP[8]; Mesg be_msg_fflp; ip_db_cl ip_db[]; // KH setup_ip_db_class setup_ip_db_cl; // KH task new (); task setup_cam_ram(); task setup_fcram(); task program_fcram(); function bit [11:0] as_data_chksum_val(bit [31:0] as_adata1, bit [31:0] as_adata2); function bit vcam_parity_bit (bit [7:0] data); task setup_ffl_registers(); task program_vlan_table(); function bit tcam_lookup (integer pkt_num,Cpkt_info packet_info); function bit [4:0] program_zcp_rdc_tbl (bit user_program, integer rdc_tbl_index, bit [2:0] prog_mode, bit [4:0] dma_chnl); function bit [2:0] get_l2_rdc_tbl_num (integer i); // function bit verify_vlan_tbl_parity (bit [11:0] hdr_vlan_id, // bit [17:0] ip_db_vt_vlan, // bit [17:0] rtl_vt_vlan); function bit [199:0] get_cam_lmask (integer cam_index, bit tuple_type, bit [19:0] cam_lmask_fields); task program_cam_ram_fcram(); function bit [3:0] calculate_asdata_parity (integer i, bit [63:0] adata); function Cpkt_info construct_flow (integer pkt_num, bit [1:0] tcp_flag, (flow_desc flow_in = null)); local function bit [199:0] generate_pkt_cam_key(bit [2:0] predicted_l2_rdc_tbl_num, Cpkt_info packet_info); local function bit [1:0] verify_vlan_tbl_parity (bit [11:0] hdr_vlan_id, bit [17:0] ip_db_vt_vlan, bit [17:0] rtl_vt_vlan); local function bit [2:0] predict_l2_rdc_tbl_num (integer pkt_num, Cpkt_info packet_info); local function bit [7:0] select_tcam_match_rdc (integer index, integer pkt_num, bit [2:0] predicted_l2_rdc_tbl_num, bit [63:0] matched_as_data, Cpkt_info packet_info); local function bit [3:0] calculate_parity (integer i,integer pkt_num,bit [63:0] matched_as_data); local function bit [12:0] predict_zcp_dma_chnl_offset (integer pkt_num, bit [2:0] mac_port, Cpkt_info packet_info); function bit [383:0] generate_flow_key (integer pkt_num, //bit [2:0] predicted_l2_rdc_tbl_num, //bit [63:0] matched_as_data, Cpkt_info packet_info); function bit [31:0] calculate_H1 (//integer index, integer pkt_num, bit [2:0] predicted_l2_rdc_tbl_num, //bit [63:0] matched_as_data, Cpkt_info packet_info); local function bit ecc_err (integer pkt_num, bit [199:0] packet_cam_key, bit [63:0] matched_as_data, Cpkt_info packet_info); local function bit check_ecc (bit [64:0] tcam_adata, bit [7:0] syndrome); task prog_vlan_table(integer index, bit parity0, bit vpr1, bit [2:0] vlan_tbln1, bit vpr0, bit [2:0] vlan_tbln0, (bit parity1 = 1'b0, bit vpr3 = 1'b0, bit [2:0] vlan_tbln3 = 3'h0, bit vpr2 = 1'b0, bit [2:0] vlan_tbln2 = 3'h0)); function bit [17:0] get_vlan_entry (integer index); function bit [7:0] calculate_ecc_syndrome (bit [64:0] din); task gen_pio_trans(bit [9:0] pio_trans_mode); function bit [199:0] get_tcam_key(integer index); function bit [63:0] get_assoc_data(integer index); } task setup_cam_ram_fcram_class :: new() { void = randomize(); be_msg_fflp = new; random_value5 = random(); random_value6 = random(); random_value7 = random(); random_value11 = random(); random_value32 = random(); #ifdef NEPTUNE neptune_mode = 1'b1; #endif EXT_LOOKUP[0] = 1'b0; EXT_LOOKUP[1] = 1'b0; EXT_LOOKUP[2] = 1'b0; EXT_LOOKUP[3] = 1'b0; EXT_LOOKUP[4] = 1'b0; EXT_LOOKUP[5] = 1'b0; EXT_LOOKUP[6] = 1'b0; EXT_LOOKUP[7] = 1'b0; // fflp_reg_addr[0] = FFLP_ADDRESS_RANGE + FFLP_CONFIG; fflp_reg_addr[0] = FFLP_ADDRESS_RANGE+FFLP_CAM_KEY_REG0; fflp_reg_addr[1] = FFLP_ADDRESS_RANGE+FFLP_CAM_KEY_REG1; fflp_reg_addr[2] = FFLP_ADDRESS_RANGE+FFLP_CAM_KEY_REG2; fflp_reg_addr[3] = FFLP_ADDRESS_RANGE+FFLP_CAM_KEY_REG3; fflp_reg_addr[4] = FFLP_ADDRESS_RANGE+FFLP_CAM_KEY_MASK_REG0; fflp_reg_addr[5] = FFLP_ADDRESS_RANGE+FFLP_CAM_KEY_MASK_REG1; fflp_reg_addr[6] = FFLP_ADDRESS_RANGE+FFLP_CAM_KEY_MASK_REG2; fflp_reg_addr[7] = FFLP_ADDRESS_RANGE+FFLP_CAM_KEY_MASK_REG3; if (get_plus_arg (CHECK, "NO_FFLP_DATABASE")) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::new()", "Skipping FFLP setup_ip_db_cl.\n"); } else { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::new()", "NEW setup_ip_db_cl.\n"); setup_ip_db_cl = new(); // KH } if (get_plus_arg (CHECK, "RXMAC_PKTCNT=")) { pkt_cnt = get_plus_arg (NUM, "RXMAC_PKTCNT="); if (get_plus_arg (CHECK, "TCAM_PARTIAL_PROG")) { if (pkt_cnt <= IP_DB_ENTRIES) { tcam_entries = pkt_cnt; } else { tcam_entries = IP_DB_ENTRIES; } } else { tcam_entries = IP_DB_ENTRIES; } } else { pkt_cnt = 256; tcam_entries = IP_DB_ENTRIES; } } task setup_cam_ram_fcram_class :: program_cam_ram_fcram() { integer stat; bit [39:0] addr; bit [63:0] wr_data; bit [63:0] rd_data = 64'h0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_cam_ram_fcram()", "Calling init_mac_reg task to setup MAC Host Info and MAC HTable.\n"); setup_ip_db_cl.init_mac_reg(); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_cam_ram_fcram()", "Calling prog_prog_class7_4 task to setup programmable classes 7-4.\n"); setup_ip_db_cl.prog_prog_class7_4(); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_cam_ram_fcram()", "Calling prog_prog_class3_2 task to setup programmable classes 3-2.\n"); setup_ip_db_cl.prog_prog_class3_2(); // be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_cam_ram_fcram()", // "Calling setup_fflp_arp_rarp_class task.\n"); // setup_ip_db_cl.setup_fflp_arp_rarp_class(); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_cam_ram_fcram()", "Calling setup_cam_ram task to setup CAM RAM.\n"); setup_cam_ram(); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_cam_ram_fcram()", "Calling setup_fcram task to setup FCRAM.\n"); setup_fcram(); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@ Perform last wr/rd pio transaction to make sure all @@ //@@ the PIOs for init/setup/programming are done before @@ //@@ sending packets. @@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ addr = FFLP_ADDRESS_RANGE + FFLP_DBG_TRAIN_VCT; wr_data = 32'h1234_abcd; gen_pio_drv.pio_wr(addr, wr_data); while (rd_data[31:0] != 32'h1234_abcd) { gen_pio_drv.pio_rd(addr, rd_data, stat); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_cam_ram_fcram()", "INITIALIZATION OF THE BLOCKS IS DONE FOR FFLP MASTER TEST.\n"); } repeat (200) @(posedge CLOCK); trigger (ON,init_master_test_done); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_cam_ram_fcram()", "READ DATA FROM FFLP_DBG_TRAIN_VCT = %h.\n",rd_data[31:0]); } task setup_cam_ram_fcram_class :: setup_cam_ram() { integer i; bit nop = 1'b0; bit [31:0] ip_dst_addr; bit [31:0] ip_src_addr; bit [127:0] ipv6_addr; bit [127:0] ipv6_dst_addr; bit [127:0] ipv6_src_addr; bit [15:0] src_tcp_udp_port; bit [15:0] dst_tcp_udp_port; bit [31:0] spi; bit [7:0] tos; bit [4:0] pkt_class; bit [7:0] pkt_protocol; bit [7:0] pkt_next_hdr; bit [31:0] cam_addr = 32'h0; bit age; bit curw_use; bit [6:0] curw1; bit [6:0] curw2; bit [14:0] backlog; bit skip_bmc; bit drop_pkt; bit zero_backlog_action; bit path; bit [1:0] path_encode; bit [1:0] lmask_sel; bit do_cs; bit [7:0] qp1; bit [7:0] qp0; bit spawn; bit lb_trigger; bit lb_map; bit [1:0] mode; bit [15:0] trans_tbl_index; bit [15:0] lb_grp_ptr_cam_index; bit [31:0] as_adata0; bit [31:0] as_adata1; bit [31:0] as_adata2; bit [11:0] as_data_chksum; bit [63:0] adata; bit [199:0] cam_key; bit [199:0] cam_lmask; bit [31:0] bmc_badd; bit [127:0] bmc_edata = 128'h0; bit [127:0] bmc_odata = 128'h0; bit [20:0] ext_mem_addr; bit [143:0] ext_mem_data; bit compare = 1'b0; bit [5:0] dst_addr_prefix_index; bit [47:0] l2_addr; bit [2:0] mac_port; bit [7:0] mac_addr_index; bit [7:0] default_qp; bit mode_bit; bit local_cpu; bit ph_bit; bit m_bit; bit [39:0] addr; bit [63:0] wr_data; integer dump_file_num = 0; integer force_dump_file_num = 0; integer vlan_entry_count = 0; integer kk = 0; integer base_addr; shadow bit[47:0] mac_addr; bit [63:0] rd_data; bit [31:0] data; bit [15:0] syndrome; bit [3:0] asdata_parity_value; bit [11:0] zfid; bit v4_ecc_ck; bit asdata_disc; bit [1:0] tres; bit [4:0] asdata_offset; bit [2:0] asdata_rdctbl; bit zfvld; bit asdata_age; bit [199:0] mask_value, cam_value; bit [19:0] cam_lmask_fields; bit [39:0] address; bit [4:0] port0_dmc_default_dma; bit [4:0] port1_dmc_default_dma; bit [4:0] port2_dmc_default_dma; bit [4:0] port3_dmc_default_dma; bit user_program = 1'b0; bit [31:0] h1_initial_value_reg = 32'h0; bit [31:0] shtol_h1_poly_reg = 32'h0; bit [32:0] H1_CRC_32C_POLY_tmp = 33'h0; bit [129:0] adata_cam_key = 130'h0; bit [7:0] ecc_syndrome_l = 8'h0; bit [7:0] ecc_syndrome_h = 8'h0; bit pkt_ipv4 = 1'b0; //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@ Program TCAM(how to)key Registers (FZC_FFLP+0x20030)(count 12 step 8) //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (get_plus_arg (CHECK, "TCAM_DISC_12HEX=")) { tcam_disc = get_plus_arg( HNUM, "TCAM_DISC_12HEX="); } else if (get_plus_arg (CHECK, "HOW_TCAM_ALL_DISCARD")) { tcam_disc = 12'hfff; } else if (get_plus_arg (CHECK, "HOW_TCAM_RANDOM_DISCARD")) { tcam_disc = random_value5%12'hfff; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "IP_UTIL INFO: Random TCAM_DISC bits = %h.\n",tcam_disc); } else { tcam_disc = 12'h0; // select all no discard } if (get_plus_arg (CHECK, "TCAM_TSEL_12HEX=")) { tcam_tsel = get_plus_arg( HNUM, "TCAM_TSEL_12HEX="); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "SETUP_CAM_RAM INFO: RUNTIME ARGS FOR TCAM_TSEL = %h.\n",tcam_tsel); } else if (get_plus_arg (CHECK, "HOW_TCAM_RANDOM_NOLOOKUP")) { tcam_tsel = random_value6%12'hfff; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "IP_UTIL INFO: Random TCAM_TSEL bits = %h.\n",tcam_tsel); } else if (get_plus_arg (CHECK, "HOW_TCAM_ALL_NOLOOKUP")) { tcam_tsel = 12'h0; } else { tcam_tsel = 12'hfff; // select all tcam lookup required } if (get_plus_arg (CHECK, "TCAM_IPADDR_12HEX=")) { tcam_ipaddr = get_plus_arg( HNUM, "TCAM_IPADDR_12HEX="); } else if (get_plus_arg (CHECK, "4TUPLE_IPSRC")) { tcam_ipaddr = 12'hfff; // Select all ip_src_addr } else if (get_plus_arg (CHECK, "4TUPLE_IPDST")) { tcam_ipaddr = 12'h0; // Select all ip_dst_addr } else if (get_plus_arg (CHECK, "4TUPLE_RANDOM_IPDST_IPDST")) { tcam_ipaddr = random_value7%12'hfff; // Select all random } else { tcam_ipaddr = 12'h0; // Select all ip_dst_addr } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "Performing PIO Transactions to TCAM KEY how to Registers.\n"); addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_4; wr_data = {60'h0,tcam_disc[0],tcam_tsel[0],1'b0,tcam_ipaddr[0]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_5; wr_data = {60'h0,tcam_disc[1],tcam_tsel[1],1'b0,tcam_ipaddr[1]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_6; wr_data = {60'h0,tcam_disc[2],tcam_tsel[2],1'b0,tcam_ipaddr[2]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_7; wr_data = {60'h0,tcam_disc[3],tcam_tsel[3],1'b0,tcam_ipaddr[3]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_8; wr_data = {60'h0,tcam_disc[4],tcam_tsel[4],1'b0,tcam_ipaddr[4]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_9; wr_data = {60'h0,tcam_disc[5],tcam_tsel[5],1'b0,tcam_ipaddr[5]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); // gen_pio_drv.pio_rd(addr, rd_data); // be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", // "IP_UTIL INFO: READ VALUE FROM FFLP_HOW_TCAM_KEY_CLS_9 REG IS %h.\n",rd_data); addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_A; wr_data = {60'h0,tcam_disc[6],tcam_tsel[6],1'b0,tcam_ipaddr[6]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_B; wr_data = {60'h0,tcam_disc[7],tcam_tsel[7],1'b0,tcam_ipaddr[7]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_C; wr_data = {60'h0,tcam_disc[8],tcam_tsel[8],1'b0,tcam_ipaddr[8]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_D; wr_data = {60'h0,tcam_disc[9],tcam_tsel[9],1'b0,tcam_ipaddr[9]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_E; wr_data = {60'h0,tcam_disc[10],tcam_tsel[10],1'b0,tcam_ipaddr[10]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_F; wr_data = {60'h0,tcam_disc[11],tcam_tsel[11],1'b0,tcam_ipaddr[11]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@ Program Initial HASH value //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (get_plus_arg (CHECK, "HASH1_INITIAL_VALUE=")) { h1_initial_value_reg = get_plus_arg( HNUM, "HASH1_INITIAL_VALUE="); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "IP_UTIL INFO: Writing HASH1_INITIAL_VALUE = %h to FFLP_FLOW_H1POLY reg.\n",h1_initial_value_reg); } else if (get_plus_arg (CHECK, "RANDOM_HASH1_INITIAL_VALUE")) { h1_initial_value_reg = random_value32%32'hffff_ffff; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "IP_UTIL INFO: Writing RANDOM_HASH1_INITIAL_VALUE = %h to FFLP_FLOW_H1POLY reg.\n",h1_initial_value_reg); } else // use default DEFAULT_HASH1_INITIAL_VALUE { h1_initial_value_reg = DEFAULT_HASH1_INITIAL_VALUE; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "IP_UTIL INFO: Writing DEFAULT_HASH1_INITIAL_VALUE = %h to FFLP_FLOW_H1POLY reg.\n",h1_initial_value_reg); } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "IP_UTIL INFO: PROGRAMMING FFLP_FLOW_H1POLY WITH CALCULATED VALUE = %h.\n", h1_initial_value_reg); wr_data = {32'h0, h1_initial_value_reg}; addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_H1POLY; fflp_util.fflp_pio_wrapper(addr, wr_data); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@ Program FLOW KEY(how to flow)Registers (FZC_FFLP+0x20030)(count 12 step 8) //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (get_plus_arg (CHECK, "HOW_FLOW_IPORT_12HEX=")) { how_flow_iport = get_plus_arg( HNUM, "HOW_FLOW_IPORT_12HEX="); } else if (get_plus_arg (CHECK, "HOW_FLOW_RANDOM_IPORT")) { how_flow_iport = random_value5%12'hfff; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "IP_UTIL INFO: Random HOW FLOW IPORT bits = %h.\n",how_flow_iport); } else { how_flow_iport = 12'hfff; // consider all 12 input ports } if (get_plus_arg (CHECK, "HOW_FLOW_DA_12HEX=")) { how_flow_da_addr = get_plus_arg( HNUM, "HOW_FLOW_DA_12HEX="); } else if (get_plus_arg (CHECK, "HOW_FLOW_RANDOM_DA")) { how_flow_da_addr = random_value5%12'hfff; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "IP_UTIL INFO: Random HOW FLOW DA ADDR bits = %h.\n",how_flow_da_addr); } else { how_flow_da_addr = 12'hfff; // consider all L2 DA addresses } if (get_plus_arg (CHECK, "HOW_FLOW_VLAN_12HEX=")) { how_flow_vlan = get_plus_arg( HNUM, "HOW_FLOW_VLAN_12HEX="); } else if (get_plus_arg (CHECK, "HOW_FLOW_RANDOM_VLAN")) { how_flow_vlan = random_value5%12'hfff; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "IP_UTIL INFO: Random HOW FLOW VLAN bits = %h.\n",how_flow_vlan); } else { how_flow_vlan = 12'hfff; // consider all vlan packets } if (get_plus_arg (CHECK, "HOW_FLOW_IPSRC_12HEX=")) { how_flow_ipsrc = get_plus_arg( HNUM, "HOW_FLOW_IPSRC_12HEX="); } else if (get_plus_arg (CHECK, "HOW_FLOW_RANDOM_IPSRC")) { how_flow_ipsrc = random_value5%12'hfff; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "IP_UTIL INFO: Random HOW FLOW IPSRC bits = %h.\n",how_flow_ipsrc); } else { how_flow_ipsrc = 12'hfff; // consider all vlan packets } if (get_plus_arg (CHECK, "HOW_FLOW_IPDST_12HEX=")) { how_flow_ipdst = get_plus_arg( HNUM, "HOW_FLOW_IPDST_12HEX="); } else if (get_plus_arg (CHECK, "HOW_FLOW_RANDOM_IPDST")) { how_flow_ipdst = random_value5%12'hfff; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "IP_UTL INFO: Random HOW FLOW IPDST bits = %h.\n",how_flow_ipdst); } else { how_flow_ipdst = 12'hfff; // consider all vlan packets } if (get_plus_arg (CHECK, "HOW_FLOW_PID_12HEX=")) { how_flow_pid = get_plus_arg( HNUM, "HOW_FLOW_PID_12HEX="); } else if (get_plus_arg (CHECK, "HOW_FLOW_RANDOM_PROTOCOL")) { how_flow_pid = random_value5%12'hfff; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "IP_UTIL INFO: Random HOW FLOW PROTOCOL bits = %h.\n",how_flow_pid); } else { how_flow_pid = 12'hfff; // consider all vlan packets } if (get_plus_arg (CHECK, "HOW_FLOW_L40_24HEX=")) { how_flow_l40 = get_plus_arg( HNUM, "HOW_FLOW_L40_24HEX="); } else if (get_plus_arg (CHECK, "HOW_FLOW_RANDOM_L40")) { how_flow_l40 = random_value5%24'hff_fff; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "IP_UTIL INFO: Random HOW FLOW L4_0 bits = %h.\n",how_flow_l40); } else if (get_plus_arg (CHECK, "HOW_FLOW_L40_B1_B2")) { how_flow_l40 = 24'haa_aaaa; } else if (get_plus_arg (CHECK, "HOW_FLOW_L40_B5_B6")) { how_flow_l40 = 24'hff_ffff; } else { how_flow_l40 = 24'h0a_0a00; // consider bytes 1 & 2 of L4 for L40 } if (get_plus_arg (CHECK, "HOW_FLOW_L41_24HEX=")) { how_flow_l41 = get_plus_arg( HNUM, "HOW_FLOW_L41_24HEX="); } else if (get_plus_arg (CHECK, "HOW_FLOW_RANDOM_L41")) { how_flow_l41 = random_value5%24'hff_fff; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "IP_UTIL INFO: Random HOW FLOW L4_1 bits = %h.\n",how_flow_l41); } else if (get_plus_arg (CHECK, "HOW_FLOW_L41_B3_B4")) { how_flow_l41 = 24'haa_aaaa; } else if (get_plus_arg (CHECK, "HOW_FLOW_L41_B7_B8")) { how_flow_l41 = 24'hff_ffff; } else { how_flow_l41 = 24'h0a_0a00; // consider bytes 3 & 4 of L4 for L41 } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "Performing PIO Transactions to FLOW KEY how Registers.\n"); addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_4; wr_data = {54'h0, how_flow_iport[0], how_flow_da_addr[0], how_flow_vlan[0], how_flow_ipsrc[0], how_flow_ipdst[0], how_flow_pid[0], how_flow_l40[1:0], how_flow_l41[1:0]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_5; wr_data = {54'h0, how_flow_iport[1], how_flow_da_addr[1], how_flow_vlan[1], how_flow_ipsrc[1], how_flow_ipdst[1], how_flow_pid[1], how_flow_l40[3:2], how_flow_l41[3:2]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_6; wr_data = {54'h0, how_flow_iport[2], how_flow_da_addr[2], how_flow_vlan[2], how_flow_ipsrc[2], how_flow_ipdst[2], how_flow_pid[2], how_flow_l40[5:4], how_flow_l41[5:4]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_7; wr_data = {54'h0, how_flow_iport[3], how_flow_da_addr[3], how_flow_vlan[3], how_flow_ipsrc[3], how_flow_ipdst[3], how_flow_pid[3], how_flow_l40[7:6], how_flow_l41[7:6]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_8; wr_data = {54'h0, how_flow_iport[4], how_flow_da_addr[4], how_flow_vlan[4], how_flow_ipsrc[4], how_flow_ipdst[4], how_flow_pid[4], how_flow_l40[9:8], how_flow_l41[9:8]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_9; wr_data = {54'h0, how_flow_iport[5], how_flow_da_addr[5], how_flow_vlan[5], how_flow_ipsrc[5], how_flow_ipdst[5], how_flow_pid[5], how_flow_l40[11:10], how_flow_l41[11:10]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_A; wr_data = {54'h0, how_flow_iport[6], how_flow_da_addr[6], how_flow_vlan[6], how_flow_ipsrc[6], how_flow_ipdst[6], how_flow_pid[6], how_flow_l40[13:12], how_flow_l41[13:12]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_B; wr_data = {54'h0, how_flow_iport[7], how_flow_da_addr[7], how_flow_vlan[7], how_flow_ipsrc[7], how_flow_ipdst[7], how_flow_pid[7], how_flow_l40[15:14], how_flow_l41[15:14]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_C; wr_data = {54'h0, how_flow_iport[8], how_flow_da_addr[8], how_flow_vlan[8], how_flow_ipsrc[8], how_flow_ipdst[8], how_flow_pid[8], how_flow_l40[17:16], how_flow_l41[17:16]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_D; wr_data = {54'h0, how_flow_iport[9], how_flow_da_addr[9], how_flow_vlan[9], how_flow_ipsrc[9], how_flow_ipdst[9], how_flow_pid[9], how_flow_l40[19:18], how_flow_l41[19:18]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_E; wr_data = {54'h0, how_flow_iport[10], how_flow_da_addr[10], how_flow_vlan[10], how_flow_ipsrc[10], how_flow_ipdst[10], how_flow_pid[10], how_flow_l40[21:20], how_flow_l41[21:20]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_F; wr_data = {54'h0, how_flow_iport[11], how_flow_da_addr[11], how_flow_vlan[11], how_flow_ipsrc[11], how_flow_ipdst[11], how_flow_pid[11], how_flow_l40[23:22], how_flow_l41[23:22]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@ Program FLOW PARTITION SELECT REGISTERS //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@ Program VLAN TABLE (4096 Entries) //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (get_plus_arg (CHECK, "DONT_PROGRAM_VLAN_TBL")) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "IP_UTIL INFO: Skip programming VLAN Table.\n"); } else { program_vlan_table(); } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@ Program ZCP RDC TABLE //@ Tables 0-7 (32 entries per table) //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@ Program RDMC Deafault DMA Channel per port Registers @@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (get_plus_arg (CHECK, "PORT0_ZCP_DEFAULT_DMA=")) { port0_dmc_default_dma = get_plus_arg (NUM, "PORT0_ZCP_DEFAULT_DMA="); } else { port0_dmc_default_dma = 5'h4; } if (get_plus_arg (CHECK, "PORT1_ZCP_DEFAULT_DMA=")) { port1_dmc_default_dma = get_plus_arg (NUM, "PORT1_ZCP_DEFAULT_DMA="); } else { port1_dmc_default_dma = 5'h5; } if (get_plus_arg (CHECK, "PORT2_ZCP_DEFAULT_DMA=")) { port2_dmc_default_dma = get_plus_arg (NUM, "PORT2_ZCP_DEFAULT_DMA="); } else { port2_dmc_default_dma = 5'h6; } if (get_plus_arg (CHECK, "PORT3_ZCP_DEFAULT_DMA=")) { port3_dmc_default_dma = get_plus_arg (NUM, "PORT3_ZCP_DEFAULT_DMA="); } else { port3_dmc_default_dma = 5'h7; } address = RDC_DEF_PT0_RDC; wr_data = {59'h0,port0_dmc_default_dma}; // gen_pio_drv.pio_wr(address,wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); address = RDC_DEF_PT1_RDC; wr_data = {59'h0,port1_dmc_default_dma}; // gen_pio_drv.pio_wr(address,wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); address = RDC_DEF_PT2_RDC; wr_data = {59'h0,port2_dmc_default_dma}; // gen_pio_drv.pio_wr(address,wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); address = RDC_DEF_PT3_RDC; wr_data = {59'h0,port3_dmc_default_dma}; // gen_pio_drv.pio_wr(address,wr_data); fflp_util.fflp_pio_wrapper(addr, wr_data); /* gen_pio_drv.pio_rd(RDC_DEF_PT0_RDC, rd_data); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "IP_UTIL INFO: READ VALUE FOR DEFAULT REG. RDC_DEF_PT0_RDC IS %h.\n",rd_data); gen_pio_drv.pio_rd(RDC_DEF_PT1_RDC, rd_data); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "IP_UTIL INFO: READ VALUE FOR DEFAULT REG. RDC_DEF_PT1_RDC IS %h.\n",rd_data); gen_pio_drv.pio_rd(RDC_DEF_PT2_RDC, rd_data); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "IP_UTIL INFO: READ VALUE FOR DEFAULT REG. RDC_DEF_PT2_RDC IS %h.\n",rd_data); gen_pio_drv.pio_rd(RDC_DEF_PT3_RDC, rd_data); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "IP_UTIL INFO: READ VALUE FOR DEFAULT REG. RDC_DEF_PT3_RDC IS %h.\n",rd_data); */ if (get_plus_arg (CHECK, "USER_PROGRAM_ZCP_RDC_TBL")) { user_program = 1'b1; } else { user_program = 1'b0; } if (get_plus_arg (CHECK, "ZCP_RDC_TBL_PROG_MODE=")) { zcp_rdc_tbl_prog_mode = get_plus_arg (HNUM, "ZCP_RDC_TBL_PROG_MODE="); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "IP_UTIL INFO: DETECTED RUN_ARGS FOR ZCP_RDC_TBL_PROG_MODE = %h.\n",zcp_rdc_tbl_prog_mode); } else { zcp_rdc_tbl_prog_mode = 3'b101; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "IP_UTIL INFO: USING DEFAULT VALUE OF ZCP_RDC_TBL_PROG_MODE = %h.\n",zcp_rdc_tbl_prog_mode); } if (get_plus_arg (CHECK, "ZCP_RDC_TBL_INDEX=")) { zcp_rdc_tbl_index = get_plus_arg (NUM, "ZCP_RDC_TBL_INDEX="); } else { zcp_rdc_tbl_index = 0; } if (get_plus_arg (CHECK, "ZCP_DMA_CHNL=")) { zcp_dma_chnl = get_plus_arg (HNUM, "ZCP_DMA_CHNL="); } else { zcp_dma_chnl = 5'b0000; } rd_zcp_dma_chnl = program_zcp_rdc_tbl (user_program,zcp_rdc_tbl_index, zcp_rdc_tbl_prog_mode,zcp_dma_chnl); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@ Initialize CAM (256 Entries) //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (get_plus_arg (CHECK, "INIT_CAM_RAM")) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "Performing PIO Transactions to intialize CAM.\n"); fflp_util.init_cam_entries(); } else { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::setup_cam_ram()", "Skip Initializing CAM_RAM..\n"); } if (get_plus_arg (CHECK, "DONT_PROGRAM_CAM_RAM")) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::new()", "No CAM Match Mode, Skip Programming CAM_RAM in FFLP.\n"); } else { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::new()", "Programming CAM_RAM in FFLP.\n"); // for (i=0;i= 255) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: NO TCAM MATCH FOR CAM_KEY = %h IN NEPTUNE MODE for pkt_num = %d.\n",packet_cam_key,pkt_num); end_of_tcam = 1'b1; packet_info.tcamm_index = 0; packet_info.zc_flow_id = 12'h0; } else { i=i+1; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: INCREMENTING TCAM INDEX FOR CAM_KEY = %h IN NEPTUNE MODE for pkt_num = %d.\n", packet_cam_key,pkt_num); } } else { if (i >= 127) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: NO TCAM MATCH FOR CAM_KEY = %h IN N2 MODE for pkt_num = %d.\n",packet_cam_key,pkt_num); end_of_tcam = 1'b1; packet_info.tcamm_index = 0; packet_info.zc_flow_id = 12'h0; } else { i=i+1; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: INCREMENTING TCAM INDEX FOR CAM_KEY = %h IN N2 MODE for pkt_num = %d.\n", packet_cam_key,pkt_num); } } // else } // else } // while (!tcam_match && !end_of_tcam) //@@@@@@ Select RDC TBL NUM based on MAC/VLAN/TCAM RDC numbers @@@@@@ if (tcam_match) { packet_info.tres = matched_as_data [11:10]; packet_info.tzfvld = matched_as_data [1]; packet_info.tcamhit = tcam_match; /************************************************************** ATTN: NEED TO KNOW WHAT TO DO AT THIS POINT WHEN THE DISCARD BIT IS SET IN AS_DATA - Should we still select the correct rdc/offset/dma for ZCP? ***************************************************************/ if (packet_info.flow.frame.frame_type =?= 5'bx0x1x) { // ECC Enabled for TCAM/AS_DATA if (matched_as_data[13] === 1'b1 && (packet_frame_class === CL_TCP || packet_frame_class === CL_UDP || packet_frame_class === CL_TCP_FRAG || packet_frame_class === CL_UDP_FRAG || packet_frame_class === CL_IP_SEC_AH || packet_frame_class === CL_IP_SEC_ESP)) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR INDEX %d, PKT_NUM = %d IS IPV4 ASSUMED ECC FOR AS_DATA.\n",i,pkt_num); ecc_failure_detected = ecc_err (pkt_num,packet_cam_key,matched_as_data, packet_info); if (!ecc_failure_detected) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR INDEX %d, ECC PASSED FOR CAM_KEY = %h for pkt_num = %d.\n", i, packet_cam_key,pkt_num); packet_info.asdata_disc = matched_as_data[12]; // check disc bit predict_rdc_tbl_offset = select_tcam_match_rdc (i, pkt_num, predicted_l2_rdc_tbl_num, matched_as_data, packet_info); } else { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR INDEX %d, ECC FAILED FOR CAM_KEY = %h for pkt_num = %d.\n", i, packet_cam_key,pkt_num); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR PKT_NUM %d, L2_RDC = %h is selected.\n",pkt_num,predicted_l2_rdc_tbl_num); predict_rdc_tbl_offset = predicted_l2_rdc_tbl_num; packet_info.fflp_hw_err = 1'b1; } } else // Even Parity Enabled for AS_DATA { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR INDEX %d, PKT_NUM = %d IS IPV4 ASSUMED PARITY FOR AS_DATA.\n",i,pkt_num); parity_failure_detected = calculate_parity (i, pkt_num,matched_as_data); if (parity_failure_detected === 4'b000) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR INDEX %d, PARITY PASSED FOR CAM_KEY = %h for pkt_num = %d.\n", i, packet_cam_key,pkt_num); packet_info.asdata_disc = matched_as_data[12]; // check disc bit predict_rdc_tbl_offset = select_tcam_match_rdc (i, pkt_num, predicted_l2_rdc_tbl_num, matched_as_data, packet_info); } else { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR INDEX %d, PARITY FAILED FOR CAM_KEY = %h for pkt_num = %d.\n", i, packet_cam_key,pkt_num); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR PKT_NUM %d, L2_RDC = %h is selected.\n",pkt_num,predicted_l2_rdc_tbl_num); predict_rdc_tbl_offset = predicted_l2_rdc_tbl_num; packet_info.fflp_hw_err = 1'b1; } } } // if (packet_info.flow.frame.frame_type =?= 5'bx0x1x) else if (packet_info.flow.frame.frame_type =?= 5'bx1x1x) { parity_failure_detected = calculate_parity (i, pkt_num,matched_as_data); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR INDEX %d, PKT_NUM = %d IS IPV6 ASSUMED PARITY ONLY FOR AS_DATA.\n",i,pkt_num); if (parity_failure_detected === 4'b000) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR INDEX %d, PARITY PASSED FOR CAM_KEY = %h for pkt_num = %d.\n", i, packet_cam_key,pkt_num); packet_info.asdata_disc = matched_as_data[12]; // check disc bit predict_rdc_tbl_offset = select_tcam_match_rdc (i, pkt_num, predicted_l2_rdc_tbl_num, matched_as_data, packet_info); } else { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR INDEX %d, PARITY FAILED FOR CAM_KEY = %h for pkt_num = %d.\n", i, packet_cam_key,pkt_num); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR PKT_NUM %d, L2_RDC = %h is selected.\n",pkt_num,predicted_l2_rdc_tbl_num); predict_rdc_tbl_offset = predicted_l2_rdc_tbl_num; packet_info.fflp_hw_err = 1'b1; } } } // if (tcam_match) else { packet_info.tcamm_index = 0; packet_info.zc_flow_id = 12'h0; packet_info.tres = 2'b00; packet_info.tzfvld = 1'b0; packet_info.tcamhit = tcam_match; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: NO TCAM MATCH FOR PKT_NUM %d, L2_RDC = %h is selected.\n",pkt_num,predict_rdc_tbl_offset); if (packet_frame_class === CL_TCP || packet_frame_class === CL_UDP || packet_frame_class === CL_TCP_FRAG || packet_frame_class === CL_UDP_FRAG || packet_frame_class === CL_IP_SEC_AH || packet_frame_class === CL_IP_SEC_ESP || packet_frame_class === CL_TCP_IP_V6 || packet_frame_class === CL_UDP_IP_V6 || packet_frame_class === CL_IP_V6_SEC_AH || packet_frame_class === CL_IP_V6_SEC_ESP) { generated_flow_key = generate_flow_key (pkt_num,packet_info); packet_info.flow_key = generated_flow_key; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR PKT_NUM %d FLOW_KEY = %h.\n",pkt_num,packet_info.flow_key ); //@@ Check to see if external lookup is required @@ // rd_addr = (FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_PARTITION_SEL) + (predicted_l2_rdc_tbl_num*8); // gen_pio_drv.pio_rd(rd_addr, rd_data); // if (rd_data[16] === 1'b1) if (fflp_util.ext_lookup[predicted_l2_rdc_tbl_num] === 1'b1) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR PKT_NUM %d PERFORMING EXTERNAL LOOKUP.\n",pkt_num); } else { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR PKT_NUM %d L3 CLASS, CALCULATE H1 FOR OFFSET, NO EXTERNAL LOOKUP IS REQUIRED.\n",pkt_num); calculated_H1 = calculate_H1 (pkt_num, predicted_l2_rdc_tbl_num, packet_info); predict_rdc_tbl_offset = {calculated_H1[4:0],predicted_l2_rdc_tbl_num}; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR PKT_NUM %d L3 CLASS, OFFSET IS H1 = %h AND RDC IS FROM L2 = %h.\n", pkt_num,calculated_H1[4:0],predicted_l2_rdc_tbl_num); } } else { predict_rdc_tbl_offset = {5'h0,predicted_l2_rdc_tbl_num}; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR PKT_NUM %d NOT A L3 CLASS, OFFSET IS SET TO 0 AND RDC IS FROM L2 = %h.\n", pkt_num,predicted_l2_rdc_tbl_num); } } } // if (do_tcam_lookup) else { packet_info.tcamm_index = 0; packet_info.zc_flow_id = 12'h0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: NO TCAM LOOKUP FOR PKT_NUM %d, L2_RDC = %h is selected.\n",pkt_num,predict_rdc_tbl_offset); if (packet_frame_class === CL_TCP || packet_frame_class === CL_UDP || packet_frame_class === CL_TCP_FRAG || packet_frame_class === CL_UDP_FRAG || packet_frame_class === CL_IP_SEC_AH || packet_frame_class === CL_IP_SEC_ESP || packet_frame_class === CL_TCP_IP_V6 || packet_frame_class === CL_UDP_IP_V6 || packet_frame_class === CL_IP_V6_SEC_AH || packet_frame_class === CL_IP_V6_SEC_ESP) { generated_flow_key = generate_flow_key (pkt_num,packet_info); packet_info.flow_key = generated_flow_key; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR PKT_NUM %d FLOW_KEY = %h.\n",pkt_num,packet_info.flow_key ); //@@ Check to see if external lookup is required @@ // rd_addr = (FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_PARTITION_SEL) + (predicted_l2_rdc_tbl_num*8); // gen_pio_drv.pio_rd(rd_addr, rd_data); // if (rd_data[16] === 1'b1) if (fflp_util.ext_lookup[predicted_l2_rdc_tbl_num] === 1'b1) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR PKT_NUM %d PERFORMING EXTERNAL LOOKUP.\n",pkt_num); } else { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR PKT_NUM %d L3 CLASS, CALCULATE H1 FOR OFFSET, NO EXTERNAL LOOKUP IS REQUIRED.\n",pkt_num); calculated_H1 = calculate_H1 (pkt_num, predicted_l2_rdc_tbl_num, packet_info); predict_rdc_tbl_offset = {calculated_H1[4:0],predicted_l2_rdc_tbl_num}; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR PKT_NUM %d L3 CLASS, OFFSET IS H1 = %h AND RDC IS FROM L2 = %h.\n", pkt_num,calculated_H1[4:0],predicted_l2_rdc_tbl_num); } } else { predict_rdc_tbl_offset = {5'h0,predicted_l2_rdc_tbl_num}; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR PKT_NUM %d NOT A L3 CLASS, OFFSET IS SET TO 0 AND RDC IS FROM L2 = %h.\n", pkt_num,predicted_l2_rdc_tbl_num); } } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@ Predict dma channel from ZCP's rdc table based on the predicted @@ //@@ rdc_tbl num & offset (predict_rdc_tbl_offset) from FFLP @@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (crc_err) { if (mac_port === 3'b000) { // rd_addr = RDC_DEF_PT0_RDC; // gen_pio_drv.pio_rd(rd_addr,rd_data); rd_data = fflp_util.rdc_def_pt0_rdc; predict_zcp_dma_chnl_offset = {8'h0,rd_data[4:0]}; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR PKT_NUM %d,P0 DEFAULT PREDICTED_DMA_CHNL = %h.\n",pkt_num,predict_zcp_dma_chnl_offset); } else if (mac_port === 3'b001) { // rd_addr = RDC_DEF_PT1_RDC; // gen_pio_drv.pio_rd(rd_addr,rd_data); rd_data = fflp_util.rdc_def_pt1_rdc; predict_zcp_dma_chnl_offset = {8'h0,rd_data[4:0]}; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR PKT_NUM %d,P1 DEFAULT PREDICTED_DMA_CHNL = %h.\n",pkt_num,predict_zcp_dma_chnl_offset); } else if (mac_port === 3'b010) { // rd_addr = RDC_DEF_PT2_RDC; // gen_pio_drv.pio_rd(rd_addr,rd_data); rd_data = fflp_util.rdc_def_pt2_rdc; predict_zcp_dma_chnl_offset = {8'h0,rd_data[4:0]}; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR PKT_NUM %d,P2 DEFAULT PREDICTED_DMA_CHNL = %h.\n",pkt_num,predict_zcp_dma_chnl_offset); } else if (mac_port === 3'b100) { // rd_addr = RDC_DEF_PT3_RDC; // gen_pio_drv.pio_rd(rd_addr,rd_data); rd_data = fflp_util.rdc_def_pt3_rdc; predict_zcp_dma_chnl_offset = {8'h0,rd_data[4:0]}; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR PKT_NUM %d,P3 DEFAULT PREDICTED_DMA_CHNL = %h.\n",pkt_num,predict_zcp_dma_chnl_offset); } else { predict_zcp_dma_chnl_offset = 13'hx; be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR PKT_NUM %d, MAC PORT_NUM = %d is not defined.\n",pkt_num,mac_port); } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@ Calculate the default DMA Channel Value (location 0 of the //@@ RDC Tbl Num which is pointing to in ZCP Table. //@@ NOTE: Since Control FIFO does not contain info. about default //@@ RDC from RDMC per port deafult RDC values, then here the //@@ RDC_TBL_NUM + 0 (offset is 0) is used to get the ZCP's //@@ location 0 DMA channel value. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ zcp_rdc_tbl_shadow_index = ((predict_rdc_tbl_offset[2:0] * 16) + 0); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: CRC ERR: FOR PKT_NUM %d, FOR ZCP_RDC_TBL_SHADOW_INDEX = %d.\n",pkt_num,zcp_rdc_tbl_shadow_index); rd_data[4:0] = shadow_zcp_table [zcp_rdc_tbl_shadow_index]; packet_info.default_dma_num = rd_data[4:0]; } else if (chksum_err) // Choose the entry 0 0f the sub-zcp rdc tabl { zcp_rdc_tbl_shadow_index = ((predict_rdc_tbl_offset[2:0] * 16) + 0); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: CHKSUM_ERR: FOR PKT_NUM %d, FOR ZCP_RDC_TBL_SHADOW_INDEX = %d.\n",pkt_num,zcp_rdc_tbl_shadow_index); rd_data[4:0] = shadow_zcp_table [zcp_rdc_tbl_shadow_index]; //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@ Calculate the default DMA Channel Value (location 0 of the //@@ RDC Tbl Num which is pointing to in ZCP Table. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ packet_info.default_dma_num = rd_data[4:0]; predict_zcp_dma_chnl_offset = {predict_rdc_tbl_offset,rd_data[4:0]}; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: CHKSUM_ERR: FOR PKT_NUM %d, FOR SHADOW ZCP_RDC_TBL INDEX = %h, READ ZCP RDC_TBL DMA_CHNL_OFFSET = %h.\n", pkt_num,zcp_rdc_tbl_shadow_index,predict_zcp_dma_chnl_offset); } else { // rd_addr = ZCP_RDC_TBL + ((predict_rdc_tbl_offset[2:0] * 16 * 8) + (predict_rdc_tbl_offset[6:3] * 8)); // gen_pio_drv.pio_rd(rd_addr,rd_data); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@ Calculate the default DMA Channel Value (location 0 of the //@@ RDC Tbl Num which is pointing to in ZCP Table. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ zcp_rdc_tbl_shadow_index = (predict_rdc_tbl_offset[2:0] * 16 + 0); default_dma_channel = shadow_zcp_table [zcp_rdc_tbl_shadow_index]; packet_info.default_dma_num = default_dma_channel; zcp_rdc_tbl_shadow_index = (predict_rdc_tbl_offset[2:0] * 16) + (predict_rdc_tbl_offset[6:3]); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR PKT_NUM %d, FOR ZCP_RDC_TBL_SHADOW_INDEX = %d.\n",pkt_num,zcp_rdc_tbl_shadow_index); rd_data[4:0] = shadow_zcp_table [zcp_rdc_tbl_shadow_index]; predict_zcp_dma_chnl_offset = {predict_rdc_tbl_offset,rd_data[4:0]}; // be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", // "IP_UTIL INFO: FOR PKT_NUM %d, AT ZCP_RDC_TBL_ADDR = %h, READ ZCP RDC_TBL DMA_CHNL_OFFSET = %h.\n", // pkt_num,rd_addr,predict_zcp_dma_chnl_offset); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_zcp_dma_chnl_offset()", "IP_UTIL INFO: FOR PKT_NUM %d, FOR SHADOW ZCP_RDC_TBL INDEX = %h, READ ZCP RDC_TBL DMA_CHNL_OFFSET = %h.\n", pkt_num,zcp_rdc_tbl_shadow_index,predict_zcp_dma_chnl_offset); } packet_info.hash_index = 3'b000; packet_info.hzfvld = 1'b0; packet_info.hash_exact_match = 1'b0; packet_info.hash_hit = 1'b0; packet_info.tt_succeed = 1'b0; packet_info.tt_err = 1'b0; packet_info.hash_value2 = 16'h0; packet_info.hash_value1 = 20'h0; packet_info.user_data = 40'h0; packet_info.tt_hdr_len = 16'h0; packet_info.tcp_payload_len = 16'h0; packet_info.HoQ = 16'h0; packet_info.first_byte_offset = 24'h0; packet_info.win_buf_offset = 5'h0; packet_info.dmaw_type_1 = 2'h0; packet_info.reach_buf_end = 1'b0; } function bit setup_cam_ram_fcram_class:: tcam_lookup (integer pkt_num, Cpkt_info packet_info) { bit [63:0] shadow_how_tcam_key_reg; bit [63:0] how_to_tcam_key; bit [39:0] rd_addr; bit read_how_tcam_reg = 1'b0; case (packet_info.packet_class) { 2:{ read_how_tcam_reg = 1'b0; packet_info.class_matched = 1'b1; } 3:{ read_how_tcam_reg = 1'b0; packet_info.class_matched = 1'b1; } 4:{ rd_addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_4; read_how_tcam_reg = 1'b1; packet_info.class_matched = 1'b1; shadow_how_tcam_key_reg = fflp_util.fflp_how_tcam_key_cls_4; } 5:{ rd_addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_5; read_how_tcam_reg = 1'b1; packet_info.class_matched = 1'b1; shadow_how_tcam_key_reg = fflp_util.fflp_how_tcam_key_cls_5; } 6:{ rd_addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_6; read_how_tcam_reg = 1'b1; shadow_how_tcam_key_reg = fflp_util.fflp_how_tcam_key_cls_6; packet_info.class_matched = 1'b1; } 7:{ rd_addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_7; read_how_tcam_reg = 1'b1; shadow_how_tcam_key_reg = fflp_util.fflp_how_tcam_key_cls_7; packet_info.class_matched = 1'b1; } 8:{ rd_addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_8; read_how_tcam_reg = 1'b1; shadow_how_tcam_key_reg = fflp_util.fflp_how_tcam_key_cls_8; packet_info.class_matched = 1'b1; } 9:{ rd_addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_9; read_how_tcam_reg = 1'b1; shadow_how_tcam_key_reg = fflp_util.fflp_how_tcam_key_cls_9; packet_info.class_matched = 1'b1; } 10:{ rd_addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_A; read_how_tcam_reg = 1'b1; shadow_how_tcam_key_reg = fflp_util.fflp_how_tcam_key_cls_A; packet_info.class_matched = 1'b1; } 11:{ rd_addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_B; read_how_tcam_reg = 1'b1; shadow_how_tcam_key_reg = fflp_util.fflp_how_tcam_key_cls_B; packet_info.class_matched = 1'b1; } 12:{ rd_addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_C; read_how_tcam_reg = 1'b1; shadow_how_tcam_key_reg = fflp_util.fflp_how_tcam_key_cls_C; packet_info.class_matched = 1'b1; } 13:{ rd_addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_D; read_how_tcam_reg = 1'b1; shadow_how_tcam_key_reg = fflp_util.fflp_how_tcam_key_cls_D; packet_info.class_matched = 1'b1; } 14:{ rd_addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_E; read_how_tcam_reg = 1'b1; shadow_how_tcam_key_reg = fflp_util.fflp_how_tcam_key_cls_E; packet_info.class_matched = 1'b1; } 15:{ rd_addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_F; read_how_tcam_reg = 1'b1; shadow_how_tcam_key_reg = fflp_util.fflp_how_tcam_key_cls_F; packet_info.class_matched = 1'b1; } 16:{ read_how_tcam_reg = 1'b0; packet_info.class_matched = 1'b1; } 17:{ read_how_tcam_reg = 1'b0; packet_info.class_matched = 1'b1; } default:{ packet_info.class_matched = 1'b0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::tcam_lookup()", "IP_UTIL INFO: FPR PKT_NUM = %d, PACKET_CLASS = %d IS NOT ONE OF THE 16 EXPECTED CLASSES.\n", pkt_num,packet_info.packet_class); } } if (read_how_tcam_reg) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::tcam_lookup()", "IP_UTIL INFO: FPR PKT_NUM = %d, PACKET_CLASS = %d SHADOW_HOW_TCAM_KEY_REG = %h.\n", pkt_num,packet_info.packet_class,shadow_how_tcam_key_reg); // gen_pio_drv.pio_rd(rd_addr, how_to_tcam_key); how_to_tcam_key = shadow_how_tcam_key_reg ; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::tcam_lookup()", "IP_UTIL INFO: FPR PKT_NUM = %d, PACKET_CLASS = %d PIO HOW_TCAM_KEY_REG = %h.\n", pkt_num,packet_info.packet_class,how_to_tcam_key); if (how_to_tcam_key[2] === 1'b1) { tcam_lookup = 1'b1; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::tcam_lookup()", "IP_UTIL INFO: FPR PKT_NUM = %d, PACKET_CLASS = %d TCAM LOOKUP IS EXPECTED.\n", pkt_num,packet_info.packet_class); } else { tcam_lookup = 1'b0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::tcam_lookup()", "IP_UTIL INFO: FPR PKT_NUM = %d,1 PACKET_CLASS = %d TCAM LOOKUP IS NOT EXPECTED.\n", pkt_num,packet_info.packet_class); } } else { if ((packet_info.packet_class === 2) || (packet_info.packet_class === 3) || (packet_info.packet_class === 16) || (packet_info.packet_class === 17)) { tcam_lookup = 1'b1; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::tcam_lookup()", "IP_UTIL INFO: FPR PKT_NUM = %d, FOR PACKET_CLASS = %d GO AHEAD DO CAM LOOKUP.\n", pkt_num,packet_info.packet_class); } else { tcam_lookup = 1'b0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::tcam_lookup()", "IP_UTIL INFO: FPR PKT_NUM = %d,2 PACKET_CLASS = %d TCAM LOOKUP IS NOT EXPECTED.\n", pkt_num,packet_info.packet_class); } } } function bit [3:0] setup_cam_ram_fcram_class:: calculate_parity (integer i, integer pkt_num, bit [63:0] matched_as_data) { integer j; integer B0_even_parity_cnt = 0; integer B1_even_parity_cnt = 0; integer B2_even_parity_cnt = 0; integer B3_even_parity_cnt = 0; for (j=1;j<8;j++) { if (matched_as_data[j] === 1'b1) { B0_even_parity_cnt = B0_even_parity_cnt + 1; } } for (j=8;j<16;j++) { if (matched_as_data[j] === 1'b1) { B1_even_parity_cnt = B1_even_parity_cnt + 1; } } for (j=16;j<24;j++) { if (matched_as_data[j] === 1'b1) { B2_even_parity_cnt = B2_even_parity_cnt + 1; } } for (j=24;j<26;j++) { if (matched_as_data[j] === 1'b1) { B3_even_parity_cnt = B3_even_parity_cnt + 1; } } if (B0_even_parity_cnt === 0 || B0_even_parity_cnt === 2 || B0_even_parity_cnt === 4 || B0_even_parity_cnt === 6 || B0_even_parity_cnt === 8) { if (matched_as_data[26] !== 1'b0) { calculate_parity[0] = 1'b1; be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::calculate_parity()", "IP_UTIL INFO: FOR TCAM_INDEX = %d, PKT_NUM %d, EVEN PARITY FAILED FOR B0 OF AS_DATA = %h.\n", i,pkt_num,matched_as_data); } else { calculate_parity[0] = 1'b0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_parity()", "IP_UTIL INFO: FOR TCAM_INDEX = %d, PKT_NUM %d, EVEN PARITY PASSED FOR B0 OF AS_DATA = %h.\n", i,pkt_num,matched_as_data); } } else if (B0_even_parity_cnt === 1 || B0_even_parity_cnt === 3 || B0_even_parity_cnt === 5 || B0_even_parity_cnt === 7) { if (matched_as_data[26] !== 1'b1) { calculate_parity[0] = 1'b1; be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::calculate_parity()", "IP_UTIL INFO: FOR TCAM_INDEX = %d, PKT_NUM %d, EVEN PARITY FAILED FOR B0 OF AS_DATA = %h.\n", i,pkt_num,matched_as_data); } else { calculate_parity[0] = 1'b0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_parity()", "IP_UTIL INFO: FOR TCAM_INDEX = %d, PKT_NUM %d, EVEN PARITY PASSED FOR B0 OF AS_DATA = %h.\n", i,pkt_num,matched_as_data); } } else { be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::calculate_parity()", "IP_UTIL INFO: FOR TCAM_INDEX = %d, PKT_NUM %d, B0_even_parity_cnt = %d is not expected.\n", i,pkt_num,B0_even_parity_cnt); } if (B1_even_parity_cnt === 0 || B1_even_parity_cnt === 2 || B1_even_parity_cnt === 4 || B1_even_parity_cnt === 6 || B1_even_parity_cnt === 8) { if (matched_as_data[27] !== 1'b0) { calculate_parity[1] = 1'b1; be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::calculate_parity()", "IP_UTIL INFO: FOR TCAM_INDEX = %d, PKT_NUM %d, EVEN PARITY FAILED FOR B1 OF AS_DATA = %h.\n", i,pkt_num,matched_as_data); } else { calculate_parity[1] = 1'b0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_parity()", "IP_UTIL INFO: FOR TCAM_INDEX = %d, PKT_NUM %d, EVEN PARITY PASSED FOR B1 OF AS_DATA = %h.\n", i,pkt_num,matched_as_data); } } else if (B1_even_parity_cnt === 1 || B1_even_parity_cnt === 3 || B1_even_parity_cnt === 5 || B1_even_parity_cnt === 7) { if (matched_as_data[27] !== 1'b1) { calculate_parity[1] = 1'b1; be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::calculate_parity()", "IP_UTIL INFO: FOR TCAM_INDEX = %d, PKT_NUM %d, EVEN PARITY FAILED FOR B1 OF AS_DATA = %h.\n", i,pkt_num,matched_as_data); } else { calculate_parity[1] = 1'b0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_parity()", "IP_UTIL INFO: FOR TCAM_INDEX = %d, PKT_NUM %d, EVEN PARITY PASSED FOR B1 OF AS_DATA = %h.\n", i,pkt_num,matched_as_data); } } else { be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::calculate_parity()", "IP_UTIL INFO: FOR TCAM_INDEX = %d, PKT_NUM %d, B1_even_parity_cnt = %d is not expected.\n", i,pkt_num,B1_even_parity_cnt); } if (B2_even_parity_cnt === 0 || B2_even_parity_cnt === 2 || B2_even_parity_cnt === 4 || B2_even_parity_cnt === 6 || B2_even_parity_cnt === 8) { if (matched_as_data[28] !== 1'b0) { calculate_parity[2] = 1'b1; be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::calculate_parity()", "IP_UTIL INFO: FOR TCAM_INDEX = %d, PKT_NUM %d,E EVEN PARITY FAILED FOR B2 OF AS_DATA = %h.\n", i,pkt_num,matched_as_data); } else { calculate_parity[2] = 1'b0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_parity()", "IP_UTIL INFO: FOR TCAM_INDEX = %d, PKT_NUM %d, EVEN PARITY PASSED FOR B2 OF AS_DATA = %h.\n", i,pkt_num,matched_as_data); } } else if (B2_even_parity_cnt === 1 || B2_even_parity_cnt === 3 || B2_even_parity_cnt === 5 || B2_even_parity_cnt === 7) { if (matched_as_data[28] !== 1'b1) { calculate_parity[2] = 1'b1; be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::calculate_parity()", "IP_UTIL INFO: FOR TCAM_INDEX = %d, PKT_NUM %d,O EVEN PARITY FAILED FOR B2 OF AS_DATA = %h.\n", i,pkt_num,matched_as_data); } else { calculate_parity[2] = 1'b0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_parity()", "IP_UTIL INFO: FOR TCAM_INDEX = %d, PKT_NUM %d, EVEN PARITY PASSED FOR B2 OF AS_DATA = %h.\n", i,pkt_num,matched_as_data); } } else { be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::calculate_parity()", "IP_UTIL INFO: FOR TCAM_INDEX = %d, PKT_NUM %d, B2_even_parity_cnt = %d is not expected.\n", i,pkt_num,B2_even_parity_cnt); } if (B3_even_parity_cnt === 0 || B3_even_parity_cnt === 2) { if (matched_as_data[29] !== 1'b0) { calculate_parity[3] = 1'b1; be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::calculate_parity()", "IP_UTIL INFO: FOR TCAM_INDEX = %d, PKT_NUM %d, EVEN PARITY FAILED FOR B3 OF AS_DATA = %h.\n", i,pkt_num,matched_as_data); } else { calculate_parity[3] = 1'b0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_parity()", "IP_UTIL INFO: FOR TCAM_INDEX = %d, PKT_NUM %d, EVEN PARITY PASSED FOR B3 OF AS_DATA = %h.\n", i,pkt_num,matched_as_data); } } else if (B3_even_parity_cnt === 1) { if (matched_as_data[29] !== 1'b1) { calculate_parity[3] = 1'b1; be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::calculate_parity()", "IP_UTIL INFO: FOR TCAM_INDEX = %d, PKT_NUM %d, EVEN PARITY FAILED FOR B3 OF AS_DATA = %h.\n", i,pkt_num,matched_as_data); } else { calculate_parity[3] = 1'b0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_parity()", "IP_UTIL INFO: FOR TCAM_INDEX = %d, PKT_NUM %d, EVEN PARITY PASSED FOR B3 OF AS_DATA = %h.\n", i,pkt_num,matched_as_data); } } else { be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::calculate_parity()", "IP_UTIL INFO: FOR TCAM_INDEX = %d, PKT_NUM %d, B3_even_parity_cnt = %d is not expected.\n", i,pkt_num,B3_even_parity_cnt); } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_parity()", "IP_UTIL INFO: FOR TCAM_INDEX = %d, PKT_NUM %d, CALCULTED PARITY IS %h.\n",i,pkt_num,calculate_parity); } function bit [7:0] setup_cam_ram_fcram_class:: select_tcam_match_rdc (integer index, integer pkt_num, bit [2:0] predicted_l2_rdc_tbl_num, bit [63:0] matched_as_data, Cpkt_info packet_info) { integer packet_frame_class; bit [39:0] rd_addr; bit [63:0] rd_data; bit [383:0] generated_flow_key = 384'h0; bit [31:0] calculated_H1 = 32'h0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::select_tcam_match_rdc()", "IP_UTIL INFO: PKT_NUM %d & INDEX = %d, FOR TCAM MATCH L2_RDC_TBL_NUM = %h.\n",pkt_num,index,matched_as_data[9:7]); packet_frame_class = packet_info.flow.frame.frame_class; // if (matched_as_data[12] === 1'b1) // { // be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::select_tcam_match_rdc()", // "IP_UTIL INFO: FOR PKT_NUM %d & INDEX = %d, DISCARD BIT IS SET IN AS_DATA.\n",pkt_num,index); // select_tcam_match_rdc = 7'hxx; // } // else // { if (matched_as_data[11:10] === 2'b00) { // NOTE: Need to add SCTP class type to below as well if (packet_frame_class === CL_TCP || packet_frame_class === CL_UDP || packet_frame_class === CL_TCP_FRAG || packet_frame_class === CL_UDP_FRAG || packet_frame_class === CL_IP_SEC_AH || packet_frame_class === CL_IP_SEC_ESP || packet_frame_class === CL_TCP_IP_V6 || packet_frame_class === CL_UDP_IP_V6 || packet_frame_class === CL_IP_V6_SEC_AH || packet_frame_class === CL_IP_V6_SEC_ESP) { generated_flow_key = generate_flow_key (pkt_num,packet_info); packet_info.flow_key = generated_flow_key; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::select_tcam_match_rdc()", "IP_UTIL INFO: FOR PKT_NUM %d FLOW_KEY = %h.\n",pkt_num,packet_info.flow_key ); //@@ Check to see if external lookup is required @@ // rd_addr = (FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_PARTITION_SEL) + (predicted_l2_rdc_tbl_num*8); // gen_pio_drv.pio_rd(rd_addr, rd_data); rd_data = fflp_util.ext_lookup[predicted_l2_rdc_tbl_num]; if (rd_data[16] === 1'b1) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::select_tcam_match_rdc()", "IP_UTIL INFO: FOR PKT_NUM %d PERFORMING EXTERNAL LOOKUP.\n",pkt_num); } else { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::select_tcam_match_rdc()", "IP_UTIL INFO: FOR PKT_NUM %d L3 CLASS, CALCULATE H1, NO EXTERNAL LOOKUP IS REQUIRED.\n",pkt_num); calculated_H1 = calculate_H1 (pkt_num, predicted_l2_rdc_tbl_num, packet_info); } select_tcam_match_rdc = {calculated_H1[4:0],predicted_l2_rdc_tbl_num}; } else { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::select_tcam_match_rdc()", "IP_UTIL INFO: PKT_NUM %d & INDEX = %d, FOR TCAM MATCH L2_RDC_TBL_NUM = %h IS SELECTED WITH FLOW.\n",pkt_num,index); select_tcam_match_rdc = {5'h0,predicted_l2_rdc_tbl_num}; } } else if (matched_as_data[11:10] === 2'b01) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::select_tcam_match_rdc()", "IP_UTIL INFO: PKT_NUM %d & INDEX = %d, FOR TCAM MATCH USE L2_RDC_TBL_NUM = %h & AS_DATA OFFSET = %h WITH NO LFOW.\n", pkt_num,index,predicted_l2_rdc_tbl_num,matched_as_data[6:2]); select_tcam_match_rdc = {matched_as_data[6:2],predicted_l2_rdc_tbl_num}; } else if (matched_as_data[11:10] === 2'b10) { if (packet_frame_class === CL_TCP || packet_frame_class === CL_UDP || packet_frame_class === CL_TCP_FRAG || packet_frame_class === CL_UDP_FRAG || packet_frame_class === CL_IP_SEC_AH || packet_frame_class === CL_IP_SEC_ESP || packet_frame_class === CL_TCP_IP_V6 || packet_frame_class === CL_UDP_IP_V6 || packet_frame_class === CL_IP_V6_SEC_AH || packet_frame_class === CL_IP_V6_SEC_ESP) { generated_flow_key = generate_flow_key (pkt_num,packet_info); packet_info.flow_key = generated_flow_key; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::select_tcam_match_rdc()", "IP_UTIL INFO: FOR PKT_NUM %d FLOW_KEY = %h.\n",pkt_num,packet_info.flow_key ); //@@ Check to see if external lookup is required @@ // rd_addr = (FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_PARTITION_SEL) + (predicted_l2_rdc_tbl_num*8); // gen_pio_drv.pio_rd(rd_addr, rd_data); rd_data = fflp_util.ext_lookup[predicted_l2_rdc_tbl_num]; if (rd_data[16] === 1'b1) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::select_tcam_match_rdc()", "IP_UTIL INFO: FOR PKT_NUM %d PERFORMING EXTERNAL LOOKUP.\n",pkt_num); } else { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::select_tcam_match_rdc()", "IP_UTIL INFO: FOR PKT_NUM %d L3 CLASS, CALCULATE H1 FOR OFFSET, NO EXTERNAL LOOKUP IS REQUIRED.\n",pkt_num); calculated_H1 = calculate_H1 (pkt_num, predicted_l2_rdc_tbl_num, packet_info); } select_tcam_match_rdc = {calculated_H1[4:0],matched_as_data[9:7]}; } else { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::select_tcam_match_rdc()", "IP_UTIL INFO: PKT_NUM %d & INDEX = %d, FOR TCAM MATCH AS_DATA RDC_TBL_NUM = %h IS SELECTED WITH NO FLOW.\n",pkt_num,index); select_tcam_match_rdc = {5'h0,matched_as_data[9:7]}; } } else if (matched_as_data[11:10] === 2'b11) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::select_tcam_match_rdc()", "IP_UTIL INFO: PKT_NUM %d & INDEX = %d, FOR TCAM MATCH USE AS_DATA RDC_TBL_NUM = %h & AS_DATA OFFSET = %h WITH NO LFOW.\n", pkt_num,index,predicted_l2_rdc_tbl_num,matched_as_data[6:2]); select_tcam_match_rdc = {matched_as_data[6:2],matched_as_data[9:7]}; } // } } function bit [2:0] setup_cam_ram_fcram_class:: predict_l2_rdc_tbl_num (integer pkt_num, Cpkt_info packet_info) { integer iport; bit mac_da_matched = 1'b0; bit [2:0] matched_vlan_rdctblnum = 3'b000; bit matched_vlan_vpr = 1'b0; bit [2:0] matched_mac_rdctblnum = 3'b000; bit matched_mac_mpr = 1'b0; bit [4:0] packet_frame_type = 5'h0; bit [2:0] packet_mac_port = 3'b000; bit [11:0] packet_tci = 12'h0; bit vlan_parity0 = 1'bx; bit vlan_parity1 = 1'bx; bit [2:0] vlan_rdctblnum0 = 3'b000; bit vlan_vpr0 = 1'b0; bit [2:0] vlan_rdctblnum1 = 3'b000; bit vlan_vpr1 = 1'b0; bit [2:0] vlan_rdctblnum2 = 3'b000; bit vlan_vpr2 = 1'b0; bit [2:0] vlan_rdctblnum3 = 3'b000; bit vlan_vpr3 = 1'b0; bit [39:0] addr; bit [63:0] rd_data; bit [17:0] ip_db_vt_vlan; //bit [1:0] vlan_parity_error = 2'b00; bit [47:0] pkt_ipdst_addr; iport = packet_info.mac_prt; pkt_ipdst_addr = packet_info.flow.dst_node.l2_addr; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "IP_UTIL INFO: IPORT = %d for PKT_NUM = %d.\n",iport,pkt_num); case(iport) { 0: { if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[0].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[0].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[0].ip_mac.mac_mpr; mac_da_matched = 1'b1; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "IP_UTIL INFO: IPORT = %d for PKT_NUM = %d, 0 MATCHED_MAC_RDCTBLNUM = %h.\n",iport,pkt_num,matched_mac_rdctblnum); } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[1].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[1].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[1].ip_mac.mac_mpr; mac_da_matched = 1'b1; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "IP_UTIL INFO: IPORT = %d for PKT_NUM = %d, 1 MATCHED_MAC_RDCTBLNUM = %h.\n",iport,pkt_num,matched_mac_rdctblnum); } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[2].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[2].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[2].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[3].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[3].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[3].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[4].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[4].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[4].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[5].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[5].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[5].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[6].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[6].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[6].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[7].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[7].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[7].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[8].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[8].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[8].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[9].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[9].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[9].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[10].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[10].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[10].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[11].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[11].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[11].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[12].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[12].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[12].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[13].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[13].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[13].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[14].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[14].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[14].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[15].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[15].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[15].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "IP_UTIL INFO: Port0 for DA = %h no Match is expected for PKT_NUM = %d\n",pkt_ipdst_addr,pkt_num); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "IP_UTIL INFO: Port0 for DA = %h Packet expected to be dropped for PKT_NUM = %d\n",pkt_ipdst_addr,pkt_num); } } 1: { if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[16].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[16].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[16].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[17].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[17].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[17].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[18].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[18].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[18].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[19].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[19].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[19].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[20].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[20].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[20].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[21].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[21].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[21].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[22].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[22].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[22].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[23].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[23].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[23].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[24].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[24].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[24].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[25].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[25].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[25].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[26].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[26].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[26].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[27].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[27].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[27].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[28].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[28].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[28].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[29].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[29].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[29].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[30].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[30].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[30].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[31].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[31].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[31].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "IP_UTIL INFO: Port1 for DA = %h no Match is expected for PKT_NUM = %d\n",pkt_ipdst_addr,pkt_num); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "IP_UTIL INFO: Port1 for DA = %h Packet expected to be dropped for PKT_NUM = %d\n",pkt_ipdst_addr,pkt_num); } } 2: { if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[32].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[32].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[32].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[33].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[33].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[33].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[34].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[34].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[34].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[35].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[35].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[35].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[36].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[36].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[36].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[37].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[37].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[37].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[38].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[38].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[38].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[39].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[39].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[39].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "IP_UTIL INFO: Port2 for DA = %h no Match is expected for PKT_NUM = %d\n",pkt_ipdst_addr,pkt_num); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "IP_UTIL INFO: Port2 for DA = %h Packet expected to be dropped for PKT_NUM = %d\n",pkt_ipdst_addr,pkt_num); } } 3: { if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[40].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[40].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[40].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[41].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[41].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[41].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[42].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[42].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[42].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[43].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[43].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[43].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[44].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[44].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[44].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[45].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[45].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[45].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[46].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[46].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[46].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else if (pkt_ipdst_addr === setup_ip_db_cl.ip_db[47].ip_mac.mac_da) { matched_mac_rdctblnum = setup_ip_db_cl.ip_db[47].ip_mac.mac_rdctblnum; matched_mac_mpr = setup_ip_db_cl.ip_db[47].ip_mac.mac_mpr; mac_da_matched = 1'b1; } else { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "IP_UTIL INFO: Port3 for DA = %h no Match is expected for PKT_NUM = %d\n",pkt_ipdst_addr,pkt_num); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "IP_UTIL INFO: Port3 for DA = %h Packet expected to be dropped for PKT_NUM = %d\n",pkt_ipdst_addr,pkt_num); mac_da_matched = 1'b0; } } } // case(iport) packet_info.maccheck = mac_da_matched; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "IP_UTIL INFO: FOR PKT_NUM = %d MATCHED_MAC_RDCTBLNUM = %h.\n",pkt_num,matched_mac_rdctblnum); //@@@@ Find out the rdc_tbl_num based on VLAN if the packet is tagged @@@@ packet_frame_type = packet_info.flow.frame.frame_type; //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@ Predict the vlan rdc_tbl_num & mpr @@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (mac_da_matched && packet_frame_type[2]) { packet_tci = packet_info.flow.src_node.tci; //@@@@@@ Get the vlan tables value from ip_db Vlan Table @@@@@@ vlan_parity0 = setup_ip_db_cl.ip_db[packet_tci[11:0]].ip_vlan.parity0; vlan_parity1 = setup_ip_db_cl.ip_db[packet_tci[11:0]].ip_vlan.parity1; vlan_rdctblnum0 = setup_ip_db_cl.ip_db[packet_tci[11:0]].ip_vlan.rdctblnum0; vlan_vpr0 = setup_ip_db_cl.ip_db[packet_tci[11:0]].ip_vlan.vpr0; vlan_rdctblnum1 = setup_ip_db_cl.ip_db[packet_tci[11:0]].ip_vlan.rdctblnum1; vlan_vpr1 = setup_ip_db_cl.ip_db[packet_tci[11:0]].ip_vlan.vpr1; vlan_rdctblnum2 = setup_ip_db_cl.ip_db[packet_tci[11:0]].ip_vlan.rdctblnum2; vlan_vpr2 = setup_ip_db_cl.ip_db[packet_tci[11:0]].ip_vlan.vpr2; vlan_rdctblnum3 = setup_ip_db_cl.ip_db[packet_tci[11:0]].ip_vlan.rdctblnum3; vlan_vpr3 = setup_ip_db_cl.ip_db[packet_tci[11:0]].ip_vlan.vpr3; ip_db_vt_vlan = {vlan_parity1,vlan_parity0, vlan_vpr3,vlan_rdctblnum3,vlan_vpr2,vlan_rdctblnum2, vlan_vpr1,vlan_rdctblnum1,vlan_vpr0,vlan_rdctblnum0}; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "FOR IP_DB[%d], vlan_rdctblnum0 = %h, vlan_vpr0 = %h.\n",packet_tci[11:0],vlan_rdctblnum0,vlan_vpr0); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "FOR IP_DB[%d], vlan_rdctblnum1 = %h, vlan_vpr1 = %h.\n",packet_tci[11:0],vlan_rdctblnum1,vlan_vpr1); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "FOR IP_DB[%d], KH VLAN_PARITY = %h.\n",packet_tci[11:0],{vlan_parity1,vlan_parity0}); //@@@@@@ Get the vlan tables value from RTL Vlan Table @@@@@@ addr = {FFLP_VLAN_TBL_ADDRESS_RANGE + 8*packet_tci[11:0]}; // gen_pio_drv.pio_rd(addr, rd_data); rd_data = {46'h0,ip_db_vt_vlan}; // read from ip_db instead of pio_rd be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "FOR IP_DB[%d], SHADOW VLAN_ENTRY READ = %h VLAN_ADDR = %h.\n",packet_tci[11:0],rd_data,addr); vlan_parity_error = verify_vlan_tbl_parity (packet_tci[11:0], ip_db_vt_vlan, rd_data[17:0]); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "FOR VLAN ID %h AND VLAN_REG_ADDR = %h, RTL_VLAN_ENTRY = %h.\n", packet_tci[11:0],{FFLP_VLAN_TBL_ADDRESS_RANGE + 8*packet_tci[11:0]},rd_data[17:0]); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "FOR IP_DB[%d], PACKET_FRAME_TYPE = %h, PACKET_MAC_PORT = %d.\n",packet_tci[11:0],packet_frame_type,iport); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "FOR VLAN ID %h, vlan_parity_error = %h.\n",packet_tci[11:0],vlan_parity_error); case (vlan_parity_error) { 2'b00: { case (iport) { 0: { matched_vlan_rdctblnum = vlan_rdctblnum0; matched_vlan_vpr = vlan_vpr0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "FOR IP_DB[%d], iport = %h, matched_vlan_rdctblnum = %h, matched_vlan_vpr = %h.\n", packet_tci[11:0],iport,matched_vlan_rdctblnum,matched_vlan_vpr); } 1: { matched_vlan_rdctblnum = vlan_rdctblnum1; matched_vlan_vpr = vlan_vpr1; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "FOR IP_DB[%d], iport = %h, matched_vlan_rdctblnum = %h, matched_vlan_vpr = %h.\n", packet_tci[11:0],iport,matched_vlan_rdctblnum,matched_vlan_vpr); } 2: { matched_vlan_rdctblnum = vlan_rdctblnum2; matched_vlan_vpr = vlan_vpr2; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "FOR IP_DB[%d], iport = %h, matched_vlan_rdctblnum = %h, matched_vlan_vpr = %h.\n", packet_tci[11:0],iport,matched_vlan_rdctblnum,matched_vlan_vpr); } 3: { matched_vlan_rdctblnum = vlan_rdctblnum3; matched_vlan_vpr = vlan_vpr3; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "FOR IP_DB[%d], iport = %h, matched_vlan_rdctblnum = %h, matched_vlan_vpr = %h.\n", packet_tci[11:0],iport,matched_vlan_rdctblnum,matched_vlan_vpr); } default: { } } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "FOR IP_DB[%d], MATCHED_MAC_MPR = %h, MATCHED_VLAN_MPR = %h.\n",packet_tci[11:0],matched_mac_mpr,matched_vlan_vpr); case ({matched_mac_mpr,matched_vlan_vpr}) { {1'b0,1'b0}: {predict_l2_rdc_tbl_num = matched_mac_rdctblnum; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "MAC RDCTBLNUM %h was predicted as L2RDCTBLNUM for packet %d.\n",predict_l2_rdc_tbl_num,pkt_num); } {1'b0,1'b1}: {predict_l2_rdc_tbl_num = matched_vlan_rdctblnum; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "VLAN RDCTBLNUM %h was predicted as L2RDCTBLNUM for packet %d.\n",predict_l2_rdc_tbl_num,pkt_num); } {1'b1,1'b0}: {predict_l2_rdc_tbl_num = matched_mac_rdctblnum; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "MAC RDCTBLNUM %h was predicted as L2RDCTBLNUM for packet %d.\n",predict_l2_rdc_tbl_num,pkt_num); } {1'b1,1'b1}: {predict_l2_rdc_tbl_num = matched_vlan_rdctblnum; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "VLAN RDCTBLNUM %h was predicted as L2RDCTBLNUM for packet %d.\n",predict_l2_rdc_tbl_num,pkt_num); } } } 2'b01: { be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "IP_UTIL[%d]: FOR VLAN ID %h, VLAN PARITY mis-compare reported for LSB.\n",packet_tci[11:0],packet_tci[11:0]); be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "IP_UTIL[%d]: FOR VLAN ID %h, because of VLAN PARITY using MAC_RDC_NUM = %h.\n", packet_tci[11:0],packet_tci[11:0],matched_mac_rdctblnum); predict_l2_rdc_tbl_num = matched_mac_rdctblnum; packet_info.fflp_hw_err = 1'b1; } 2'b10: { be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "IP_UTIL[%d]: FOR VLAN ID %h, VLAN PARITY mis-compare reported for MSB.\n",packet_tci[11:0],packet_tci[11:0]); be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "IP_UTIL[%d]: FOR VLAN ID %h, because of VLAN PARITY using MAC_RDC_NUM = %h.\n", packet_tci[11:0],packet_tci[11:0],matched_mac_rdctblnum); predict_l2_rdc_tbl_num = matched_mac_rdctblnum; packet_info.fflp_hw_err = 1'b1; } 2'b11: { be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "IP_UTIL[%d]: FOR VLAN ID %h, VLAN PARITY mis-compare reported for LSB & MSB.\n",packet_tci[11:0],packet_tci[11:0]); be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "IP_UTIL[%d]: FOR VLAN ID %h, because of VLAN PARITY using MAC_RDC_NUM = %h.\n", packet_tci[11:0],packet_tci[11:0],matched_mac_rdctblnum); predict_l2_rdc_tbl_num = matched_mac_rdctblnum; packet_info.fflp_hw_err = 1'b1; } } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "IP_UTIL INFO: FOR PKT_NUM = %d TAG PKT PREDICT_L2_RDC_TBL_NUM = %h.\n",pkt_num,predict_l2_rdc_tbl_num); } // if (packet_frame_type[2]) else // Not a VLAN packet { predict_l2_rdc_tbl_num = matched_mac_rdctblnum; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::predict_l2_rdc_tbl_num()", "IP_UTIL INFO: FOR PKT_NUM = %d NO TAG PKT PREDICT_L2_RDC_TBL_NUM = %h.\n",pkt_num,predict_l2_rdc_tbl_num); } } function bit [199:0] setup_cam_ram_fcram_class:: generate_pkt_cam_key(bit [2:0] predicted_l2_rdc_tbl_num, Cpkt_info packet_info) { bit tuple_type; bit nop; bit [199:0] cam_key; bit [63:0] shadow_fflp_how_tcam_key_cls_C; bit [63:0] shadow_fflp_how_tcam_key_cls_D; bit [63:0] shadow_fflp_how_tcam_key_cls_E; bit [63:0] shadow_fflp_how_tcam_key_cls_F; bit [2:0] mac_port = 3'h0; bit [31:0] ip_dst_addr = 32'h0; bit [31:0] ip_src_addr = 32'h0; bit [127:0] ipv6_addr = 128'h0; bit [127:0] ipv6_dst_addr = 128'h0; bit [127:0] ipv6_src_addr = 128'h0; bit [15:0] src_tcp_udp_port = 16'h0; bit [15:0] dst_tcp_udp_port = 16'h0; bit [7:0] tos = 8'h0; bit [31:0] spi = 32'h0; bit [4:0] pkt_class; bit [7:0] pkt_protocol; bit [7:0] pkt_next_hdr; // nop = setup_ip_db_cl.ip_db[i].ip_cam.nop; if (packet_info.flow.frame.frame_class === CL_TCP_FRAG || packet_info.flow.frame.frame_class === CL_UDP_FRAG || packet_info.flow.frame.frame_class === CL_IP_FRAG) { nop = 1'b1; src_tcp_udp_port = 16'h0; dst_tcp_udp_port = 16'h0; } else { nop = 1'b0; src_tcp_udp_port = packet_info.flow.tup.src_tcp_udp_port; dst_tcp_udp_port = packet_info.flow.tup.dst_tcp_udp_port; } packet_info.noport = nop; if (packet_info.flow.frame.frame_class === CL_TCP || packet_info.flow.frame.frame_class === CL_UDP || packet_info.flow.frame.frame_class === CL_TCP_FRAG || packet_info.flow.frame.frame_class === CL_UDP_FRAG || packet_info.flow.frame.frame_class === CL_IP_SEC_AH || packet_info.flow.frame.frame_class === CL_IP_SEC_ESP || packet_info.flow.frame.frame_class === CL_ARP || packet_info.flow.frame.frame_class === CL_RARP) { tuple_type = 0; // 5tuple be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, TUPLE_TYPE IS IPV4 5-TUPLE.\n"); } else { tuple_type = 1; // 4tuple be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, TUPLE_TYPE IS IPV6 4-TUPLE.\n"); } ip_dst_addr = packet_info.flow.dst_node.ip_addr; ip_src_addr = packet_info.flow.src_node.ip_addr; ipv6_dst_addr = packet_info.flow.dst_node.ipv6_addr; ipv6_src_addr = packet_info.flow.src_node.ipv6_addr; // src_tcp_udp_port = packet_info.flow.tup.src_tcp_udp_port; // dst_tcp_udp_port = packet_info.flow.tup.dst_tcp_udp_port; tos = packet_info.flow.src_node.tos; spi = packet_info.flow.src_node.spi; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, IP_DST_ADDR = %h.\n",ip_dst_addr); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, IP_SRC_ADDR = %h.\n",ip_src_addr); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, SRC_TCP_UDP_PORT = %h.\n",src_tcp_udp_port); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, DST_TCP_UDP_PORT = %h.\n",dst_tcp_udp_port); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, SPI = %h.\n",spi); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, FRAME_CLASS = %d.\n",packet_info.flow.frame.frame_class); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@ Generate the CAM Keys for 256 CAM Entries @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if ((packet_info.flow.frame.frame_type =?= 5'bx0x1x) && (tuple_type === 1'b0)) // 5tuple type { case (packet_info.flow.frame.frame_class) { CL_TCP:{ if (packet_info.prog_class7_4_match) { pkt_class = packet_info.packet_class; } else { pkt_class = CLASS_8; packet_info.packet_class = CLASS_8; } pkt_protocol = PROTOCOL_TCP; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, PKT_NUM = %d PKT_CLASS = %h.\n",packet_info.pkt_num,pkt_class); } CL_TCP_FRAG:{ if (packet_info.prog_class7_4_match) { pkt_class = packet_info.packet_class; } else { //NEW pkt_class = CLASS_0; //NEW packet_info.packet_class = CLASS_0; pkt_class = CLASS_8; packet_info.packet_class = CLASS_8; } pkt_protocol = PROTOCOL_TCP; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, PKT_NUM = %d PKT_CLASS = %h.\n",packet_info.pkt_num,pkt_class); } CL_UDP:{ if (packet_info.prog_class7_4_match) { pkt_class = packet_info.packet_class; } else { pkt_class = CLASS_9; packet_info.packet_class = CLASS_9; } pkt_protocol = PROTOCOL_UDP; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, PKT_NUM = %d PKT_CLASS = %h.\n",packet_info.pkt_num,pkt_class); } CL_UDP_FRAG:{ if (packet_info.prog_class7_4_match) { pkt_class = packet_info.packet_class; } else { //NEW pkt_class = CLASS_0; //NEW packet_info.packet_class = CLASS_0; pkt_class = CLASS_9; packet_info.packet_class = CLASS_9; } pkt_protocol = PROTOCOL_UDP; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, PKT_NUM = %d PKT_CLASS = %h.\n",packet_info.pkt_num,pkt_class); } CL_IP_SEC_AH: { pkt_class = CLASS_10; packet_info.packet_class = CLASS_10; pkt_protocol = PROTOCOL_IPSEC_AH; src_tcp_udp_port = spi[31:16]; dst_tcp_udp_port = spi[15:0]; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, PKT_NUM = %d PKT_CLASS = %h.\n",packet_info.pkt_num,pkt_class); } CL_IP_SEC_ESP: { pkt_class = CLASS_10; packet_info.packet_class = CLASS_10; pkt_protocol = PROTOCOL_IPSEC_ESP; src_tcp_udp_port = spi[31:16]; dst_tcp_udp_port = spi[15:0]; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, PKT_NUM = %d PKT_CLASS = %h.\n",packet_info.pkt_num,pkt_class); } /* CL_SCTP_IP_V4: { pkt_class = CLASS_11; packet_info.packet_class = CLASS_11; pkt_protocol = PROTOCOL_SCTP; } */ CL_ARP: { if (packet_info.prog_class3_2_match) { pkt_class = packet_info.packet_class; } else { pkt_class = CLASS_16; packet_info.packet_class = CLASS_16; } // pkt_class = CLASS_16; pkt_protocol = 8'h0; src_tcp_udp_port = 16'h0; dst_tcp_udp_port = 16'h0; ip_src_addr = 32'h0; ip_dst_addr = 32'h0; } CL_RARP: { if (packet_info.prog_class3_2_match) { pkt_class = packet_info.packet_class; } else { pkt_class = CLASS_17; packet_info.packet_class = CLASS_17; } // pkt_class = CLASS_17; pkt_protocol = 8'h0; src_tcp_udp_port = 16'h0; dst_tcp_udp_port = 16'h0; ip_src_addr = 32'h0; ip_dst_addr = 32'h0; } default: { be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, Unknown 5tuple frame_class %d detected.\n",packet_info.flow.frame.frame_class); } } cam_key = {pkt_class, 3'b000, {2'b00,predicted_l2_rdc_tbl_num}, nop, 74'h0, tos, pkt_protocol, src_tcp_udp_port, dst_tcp_udp_port, ip_src_addr, ip_dst_addr}; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, Generated 5TUPLE CAM KEY pkt_class = %h.\n",pkt_class); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, Generated 5TUPLE CAM KEY l2_rdc_tbl_num = %h.\n",predicted_l2_rdc_tbl_num); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, Generated 5TUPLE CAM KEY nop = %h.\n",nop); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, Generated 5TUPLE CAM KEY tos = %h.\n",tos); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, Generated 5TUPLE CAM KEY pkt_protocol = %h.\n",pkt_protocol); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, Generated 5TUPLE CAM KEY src_tcp_udp_port = %h.\n",src_tcp_udp_port); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, Generated 5TUPLE CAM KEY dst_tcp_udp_port = %h.\n",dst_tcp_udp_port); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, Generated 5TUPLE CAM KEY ip_src_addr = %h.\n",ip_src_addr); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, Generated 5TUPLE CAM KEY ip_dst_addr = %h.\n",ip_dst_addr); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, FOR PKT_NUM = %d Generated 5TUPLE CAM KEY = %h.\n",packet_info.pkt_num,cam_key); } else if ((packet_info.flow.frame.frame_type =?= 5'bx1x1x) && (tuple_type === 1'b1)) // 4tuple type { case (packet_info.flow.frame.frame_class) { CL_TCP_IP_V6:{ if (packet_info.prog_class7_4_match) { pkt_class = packet_info.packet_class; } else { pkt_class = CLASS_12; packet_info.packet_class = CLASS_12; } pkt_next_hdr = PROTOCOL_TCP; //@@@@ READ SHADOW OF addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_C; shadow_fflp_how_tcam_key_cls_C = fflp_util.fflp_how_tcam_key_cls_C; if (shadow_fflp_how_tcam_key_cls_C[0] === 1'b0) { ipv6_addr = ipv6_dst_addr; } else { ipv6_addr = ipv6_src_addr; } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, PKT_NUM = %d PKT_CLASS = %h.\n",packet_info.pkt_num,pkt_class); } CL_UDP_IP_V6:{ if (packet_info.prog_class7_4_match) { pkt_class = packet_info.packet_class; } else { pkt_class = CLASS_13; packet_info.packet_class = CLASS_13; } pkt_next_hdr = PROTOCOL_UDP; //@@@@ READ SHADOW OF addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_D; shadow_fflp_how_tcam_key_cls_D = fflp_util.fflp_how_tcam_key_cls_D; if (shadow_fflp_how_tcam_key_cls_D[0] === 1'b0) { ipv6_addr = ipv6_dst_addr; } else { ipv6_addr = ipv6_src_addr; } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, PKT_NUM = %d PKT_CLASS = %h.\n",packet_info.pkt_num,pkt_class); } CL_IP_V6_SEC_AH: { pkt_class = CLASS_14; packet_info.packet_class = CLASS_14; pkt_next_hdr = PROTOCOL_IPSEC_AH; src_tcp_udp_port = spi[31:16]; dst_tcp_udp_port = spi[15:0]; //@@@@ READ SHADOW OF addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_E; shadow_fflp_how_tcam_key_cls_E = fflp_util.fflp_how_tcam_key_cls_E; if (shadow_fflp_how_tcam_key_cls_E[0] === 1'b0) { ipv6_addr = ipv6_dst_addr; } else { ipv6_addr = ipv6_src_addr; } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, PKT_NUM = %d PKT_CLASS = %h.\n",packet_info.pkt_num,pkt_class); } CL_IP_V6_SEC_ESP: { pkt_class = CLASS_14; packet_info.packet_class = CLASS_14; pkt_next_hdr = PROTOCOL_IPSEC_ESP; src_tcp_udp_port = spi[31:16]; dst_tcp_udp_port = spi[15:0]; //@@@@ READ SHADOW OF addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_E; shadow_fflp_how_tcam_key_cls_E = fflp_util.fflp_how_tcam_key_cls_E; if (shadow_fflp_how_tcam_key_cls_E[0] === 1'b0) { ipv6_addr = ipv6_dst_addr; } else { ipv6_addr = ipv6_src_addr; } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, PKT_NUM = %d PKT_CLASS = %h.\n",packet_info.pkt_num,pkt_class); } /* CL_SCTP_IP_V6: { pkt_class = CLASS_15; packet_info.packet_class = CLASS_15; pkt_next_hdr = PROTOCOL_SCTP; //@@@@ READ SHADOW OF addr = FFLP_ADDRESS_RANGE + FFLP_HOW_TCAM_KEY_CLS_F; shadow_fflp_how_tcam_key_cls_F = fflp_util.fflp_how_tcam_key_cls_F; if (shadow_fflp_how_tcam_key_cls_F[0] === 1'b0) { ipv6_addr = ipv6_dst_addr; } else { ipv6_addr = ipv6_src_addr; } } */ default: { be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, Unknown 4tuple frame_class %d detected.\n",packet_info.flow.frame.frame_class); } } cam_key = {pkt_class, 3'b000, {2'b00,predicted_l2_rdc_tbl_num}, nop, 10'h0, tos, pkt_next_hdr, src_tcp_udp_port, dst_tcp_udp_port, ipv6_addr}; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_pkt_cam_key()", "FOR PACKET_INFO, FOR PKT_NUM = %d Generated 4TUPLE CAM KEY = %h.\n",packet_info.pkt_num,cam_key); } generate_pkt_cam_key = cam_key; } function bit [4:0] setup_cam_ram_fcram_class:: program_zcp_rdc_tbl (bit user_program, integer rdc_tbl_index, bit [2:0] prog_mode, bit [4:0] dma_chnl) // prog_mode = 3'b000 DO NOT PROGRAM and provide the dma_chnl at the given rdc_tbl_index. // prog_mode = 3'b001 use dma_chnl and program only at the given rdc_tbl_index. provide the dma_chnl at the given rdc_tbl_index. // prog_mode = 3'b010 Not used. // prog_mode = 3'b011 program the whole rdc tbl using random dma_chnl values 0-15. // prog_mode = 3'b100 program the whole rdc tbl using pre-defined random dma_chnl values 0-15. // prog_mode = 3'b101 program the whole rdc tbl using dma_chnl values 0-15 (sweep). // prog_mode = 3'b110 program the whole rdc tbl using dma_chnl values 15-0 (sweep. // prog_mode = 3'b111 program the whole rdc tbl using shifted RDC value per sub-block (per 16 entries). { bit [39:0] address; bit [39:0] rd_address; bit [39:0] wr_address; bit [63:0] wr_data; bit [63:0] rd_data; bit [4:0] dma_chnl_value; integer start_dma_chnl_value = 0; bit [4:0] dma_chnl_val[128]; bit [4:0] user_dma_chnl[256]; bit [4:0] port0_dmc_default_dma; bit [4:0] port1_dmc_default_dma; bit [4:0] port2_dmc_default_dma; bit [4:0] port3_dmc_default_dma; integer i,j,n,k; integer fdi = 0; for (i=0;i<256;i++) { user_dma_chnl[i] = 5'h0; } if(user_program) { fdi = fopen("/vobs/neptune/verif/env/niu/rxc_sat/vera/fflp/zcp_rdc_tbl.dat","r",VERBOSE); if (fdi === 0) { be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: In user_program mode could not opem file zcp_rdc_tbl.dat for programing ZCP RDC Tbale.\n"); } else { for (i=0;i<128;i++) { user_dma_chnl[i] = freadb(fdi); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: At index = %d USER_DMA_CHNL_VALUE[%d] = %h.\n", i,i,user_dma_chnl[i]); } for (i=0;i<128;i++) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROGRAMMING ZCP RDC TABLE FOR i = %d.\n",i); wr_address = ZCP_RDC_TBL + (i*8); wr_data = {59'h0,user_dma_chnl[i]}; gen_pio_drv.pio_wr(wr_address,wr_data); shadow_zcp_table [i] = dma_chnl[i]; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO:I = %d IN ZCP RDC_TBL IN USER_MODE, WRITING DMA_CHNL_VALUE[%d] = %h AT ADDRESS = %h.\n", i,i,user_dma_chnl[i],wr_address); if (i === rdc_tbl_index) { repeat(10) @(posedge CLOCK); rd_address = ZCP_RDC_TBL + (rdc_tbl_index*8); gen_pio_drv.pio_rd(rd_address,rd_data); program_zcp_rdc_tbl = rd_data[4:0]; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROG_MODE = %h at address = %h read dma_chnl value = %h.\n",prog_mode,rd_address,program_zcp_rdc_tbl); } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROG_MODE = %h at address = %h wrote dma_chnl value = %h.\n",prog_mode,wr_address,dma_chnl_value); } } } else { if (prog_mode =?= 3'b000) // prog_mode = 3'b0xx DO NOT PROGRAM and provide the dma_chnl at the given rdc_tbl_index. { // address = ZCP_RDC_TBL + (rdc_tbl_index*8); // gen_pio_drv.pio_rd(address,rd_data); // program_zcp_rdc_tbl = rd_data[4:0]; program_zcp_rdc_tbl = shadow_zcp_table [rdc_tbl_index]; // be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", // "IP_UTIL INFO: PROG_MODE = %h at address = %h read dma_chnl value = %h.\n",prog_mode,address,program_zcp_rdc_tbl); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROG_MODE = %h at index = %h shadow read dma_chnl value = %h.\n",prog_mode,rdc_tbl_index,program_zcp_rdc_tbl); } else if (prog_mode === 3'b001) // prog_mode = 3'b001 use dma_chnl and program only at the given rdc_tbl_index. provide the dma_chnl at the given rdc_tbl_index. { address = ZCP_RDC_TBL + (rdc_tbl_index*8); wr_data = {59'h0,dma_chnl}; gen_pio_drv.pio_wr(address,wr_data); shadow_zcp_table [rdc_tbl_index] = dma_chnl; if (get_plus_arg (CHECK, "PIO_RD_ZCP_TABLE")) { repeat(10) @(posedge CLOCK); gen_pio_drv.pio_rd(address,rd_data); program_zcp_rdc_tbl = rd_data[4:0]; } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROG_MODE = %h at address = %h wrote dma_chnl value = %h.\n",prog_mode,address,dma_chnl); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROG_MODE = %h AT INDEX = %d, address = %h wrote to shadow_zcp_table [%d] = %h.\n", prog_mode,rdc_tbl_index,address,rdc_tbl_index,shadow_zcp_table [rdc_tbl_index]); } else if (prog_mode === 3'b011) // prog_mode = 3'b011 program the whole rdc tbl using random dma_chnl values 0-15. { for (i=0;i<128;i++) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROGRAMMING ZCP RDC TABLE FOR i = %d.\n",i); random_value8 = random(); dma_chnl_value = random_value8%5'b10000; wr_address = ZCP_RDC_TBL + (i*8); wr_data = {59'h0,dma_chnl_value}; gen_pio_drv.pio_wr(wr_address,wr_data); shadow_zcp_table [i] = dma_chnl_value; if (get_plus_arg (CHECK, "PIO_RD_ZCP_TABLE")) { if (i === rdc_tbl_index) { repeat(10) @(posedge CLOCK); rd_address = ZCP_RDC_TBL + (rdc_tbl_index*8); gen_pio_drv.pio_rd(rd_address,rd_data); program_zcp_rdc_tbl = rd_data[4:0]; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROG_MODE = %h at address = %h read dma_chnl value = %h.\n",prog_mode,rd_address,program_zcp_rdc_tbl); } } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROG_MODE = %h at address = %h wrote dma_chnl value = %h.\n",prog_mode,wr_address,dma_chnl_value); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROG_MODE = %h AT INDEX = %d, address = %h wrote to shadow_zcp_table[%d] = %h.\n", prog_mode,i,wr_address,i,dma_chnl_value); // if (dma_chnl_value === 5'b00000) // { // dma_chnl_value = 5'b01111; // } // else // { // dma_chnl_value = dma_chnl_value - 1; // } } } else if (prog_mode === 3'b100) // prog_mode = 3'b100 program the whole rdc tbl using pre-defined random dma_chnl values 0-15. { for (i=0;i<128;i++) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROGRAMMING ZCP RDC TABLE FOR i = %d.\n",i); dma_chnl_value = setup_ip_db_cl.pre_def_rand_rdc[i]; wr_address = ZCP_RDC_TBL + (i*8); wr_data = {59'h0,dma_chnl_value}; gen_pio_drv.pio_wr(wr_address,wr_data); shadow_zcp_table [i] = dma_chnl_value; if (get_plus_arg (CHECK, "PIO_RD_ZCP_TABLE")) { if (i === rdc_tbl_index) { repeat(10) @(posedge CLOCK); rd_address = ZCP_RDC_TBL + (rdc_tbl_index*8); gen_pio_drv.pio_rd(rd_address,rd_data); program_zcp_rdc_tbl = rd_data[4:0]; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROG_MODE = %h at address = %h read dma_chnl value = %h.\n",prog_mode,rd_address,program_zcp_rdc_tbl); } } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROG_MODE = %h at address = %h wrote dma_chnl value = %h.\n",prog_mode,wr_address,dma_chnl_value); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROG_MODE = %h AT INDEX = %d, address = %h wrote to shadow_zcp_table[%d] = %h.\n", prog_mode,i,wr_address,i,dma_chnl_value); // if (dma_chnl_value === 5'b00000) // { // dma_chnl_value = 5'b01111; // } // else // { // dma_chnl_value = dma_chnl_value - 1; // } } } else if (prog_mode === 3'b101) // prog_mode = 3'b101 program the whole rdc tbl using dma_chnl values 0-15 (sweep). { dma_chnl_value = 5'b00000; // for (i=0;i<8;i++) // { // for (j=i;j<(16+i);j++) // { // dma_chnl_val[n] = j; // be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", // "IP_UTIL INFO: FOR ZCP RDC TABLE WROTE J = %h TO DMA_CHNL_VAL[%d] = %h.\n",n,dma_chnl_val[n]); // n++; // } // } for (i=0;i<128;i++) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROGRAMMING ZCP RDC TABLE FOR i = %d.\n",i); wr_address = ZCP_RDC_TBL + (i*8); wr_data = {59'h0,dma_chnl_value}; gen_pio_drv.pio_wr(wr_address,wr_data); shadow_zcp_table [i] = dma_chnl_value; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO:I = %d IN ZCP RDC_TBL FOR PROG_MODE = %h WRITING DMA_CHNL_VALUE = %h AT ADDRESS = %h.\n", i,prog_mode,dma_chnl_value,wr_address); if (get_plus_arg (CHECK, "PIO_RD_ZCP_TABLE")) { if (i === rdc_tbl_index) { repeat(10) @(posedge CLOCK); rd_address = ZCP_RDC_TBL + (rdc_tbl_index*8); gen_pio_drv.pio_rd(rd_address,rd_data); program_zcp_rdc_tbl = rd_data[4:0]; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROG_MODE = %h at address = %h read dma_chnl value = %h.\n",prog_mode,rd_address,program_zcp_rdc_tbl); } } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROG_MODE = %h at address = %h wrote dma_chnl value = %h.\n",prog_mode,wr_address,dma_chnl_value); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROG_MODE = %h AT INDEX = %d, address = %h wrote to shadow_zcp_table[%d] = %h.\n", prog_mode,i,wr_address,i,dma_chnl_value); if (dma_chnl_value === 5'b01111) { dma_chnl_value = 5'b00000; } else { dma_chnl_value = dma_chnl_value + 1; } } } else if (prog_mode === 3'b110) // prog_mode = 3'b110 program the whole rdc tbl using dma_chnl values 15-0 (sweep). { dma_chnl_value = 5'b01111; for (i=0;i<128;i++) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROGRAMMING ZCP RDC TABLE FOR i = %d.\n",i); wr_address = ZCP_RDC_TBL + (i*8); wr_data = {59'h0,dma_chnl_value}; gen_pio_drv.pio_wr(wr_address,wr_data); shadow_zcp_table [i] = dma_chnl_value; if (get_plus_arg (CHECK, "PIO_RD_ZCP_TABLE")) { if (i === rdc_tbl_index) { repeat(10) @(posedge CLOCK); rd_address = ZCP_RDC_TBL + (rdc_tbl_index*8); gen_pio_drv.pio_rd(rd_address,rd_data); program_zcp_rdc_tbl = rd_data[4:0]; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROG_MODE = %h at address = %h read dma_chnl value = %h.\n",prog_mode,rd_address,program_zcp_rdc_tbl); } } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROG_MODE = %h at address = %h wrote dma_chnl value = %h.\n",prog_mode,wr_address,dma_chnl_value); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROG_MODE = %h AT INDEX = %d, address = %h wrote to shadow_zcp_table[%d] = %h.\n", prog_mode,i,wr_address,i,dma_chnl_value); if (dma_chnl_value === 5'b00000) { dma_chnl_value = 5'b01111; } else { dma_chnl_value = dma_chnl_value - 1; } } } else if (prog_mode === 3'b111) // prog_mode = 3'b111 program the whole rdc tbl using shifted value in each sub-table0-15. { for (i=0;i<8;i++) { start_dma_chnl_value = i; for (j=0;j<16;j++) { // dma_chnl_value = dma_chnl_value + j; dma_chnl_value = start_dma_chnl_value + j; wr_address = ZCP_RDC_TBL + (((i*16)+j)*8); dma_chnl_value = {1'b0,dma_chnl_value[3:0]}; wr_data = {59'h0,dma_chnl_value}; gen_pio_drv.pio_wr(wr_address,wr_data); shadow_zcp_table [((i*16)+j)] = dma_chnl_value; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROGRAMMING ZCP RDC TABLE FOR i = %d, J = %d, ((i*16)+j) = %d.\n",i,j,((i*16)+j)); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: FOR ((i*16)+j) = %d, DMA_CHNL_VALUE = %h, WR_ADDRESS = %h.\n", ((i*16)+j),dma_chnl_value,wr_address); } } } else { be_msg_fflp.print(e_mesg_error, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: PROG_MODE = %h is ilegal value.\n",prog_mode); } } // else of "user_program" if (get_plus_arg (CHECK, "DUMP_ZCP_TBL_SHADOW")) { for (k=0;k<128;k++) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::program_zcp_rdc_tbl()", "IP_UTIL INFO: ZCP TBL SHADOW READ AT INDEX %d = %h.\n",k,shadow_zcp_table[k]); } } } function bit [383:0] setup_cam_ram_fcram_class:: generate_flow_key (integer pkt_num, //bit [2:0] predicted_l2_rdc_tbl_num, // bit [63:0] matched_as_data, Cpkt_info packet_info) { bit [39:0] rd_addr; bit [63:0] rd_data; bit [63:0] how_to_flow_key; bit [3:0] flow_key_vlan_valid = 4'h0; bit [47:0] flow_key_da_addr = 48'h0; bit [11:0] flow_key_tci = 12'h0; bit [127:0] flow_key_ipsrc_addr = 128'h0; bit [127:0] flow_key_ipdst_addr = 128'h0; bit [15:0] flow_key_L4_0 = 16'h0; bit [15:0] flow_key_L4_1 = 16'h0; bit [7:0] flow_key_protocol = 8'h0; bit [1:0] flow_key_port = 2'h0; bit [63:0] shadow_fflp_how_flow_key = 0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO: PACKET_CLASS = %d.\n",packet_info.packet_class); //@@ Get instruction from HOW_TO_FLOW_KEY register for @@ //@@ how to build flow key @@ case (packet_info.packet_class) { 4:{ rd_addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_4; shadow_fflp_how_flow_key = fflp_util.fflp_how_flow_key_cls_4; } 5:{ rd_addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_5; shadow_fflp_how_flow_key = fflp_util.fflp_how_flow_key_cls_5; } 6:{ rd_addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_6; shadow_fflp_how_flow_key = fflp_util.fflp_how_flow_key_cls_6; } 7:{ rd_addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_7; shadow_fflp_how_flow_key = fflp_util.fflp_how_flow_key_cls_7; } 8:{ rd_addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_8; shadow_fflp_how_flow_key = fflp_util.fflp_how_flow_key_cls_8; } 9:{ rd_addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_9; shadow_fflp_how_flow_key = fflp_util.fflp_how_flow_key_cls_9; } 10:{ rd_addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_A; shadow_fflp_how_flow_key = fflp_util.fflp_how_flow_key_cls_A; } 11:{ rd_addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_B; shadow_fflp_how_flow_key = fflp_util.fflp_how_flow_key_cls_B; } 12:{ rd_addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_C; shadow_fflp_how_flow_key = fflp_util.fflp_how_flow_key_cls_C; } 13:{ rd_addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_D; shadow_fflp_how_flow_key = fflp_util.fflp_how_flow_key_cls_D; } 14:{ rd_addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_E; shadow_fflp_how_flow_key = fflp_util.fflp_how_flow_key_cls_E; } 15:{ rd_addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_HOW_FLOW_KEY_CLS_F; shadow_fflp_how_flow_key = fflp_util.fflp_how_flow_key_cls_F; } default:{ be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO: FOR L2 PACKET_CLASS = %d USE L2 RDC TBL RESULT.\n",packet_info.packet_class); } } //gen_pio_drv.pio_rd(rd_addr, how_to_flow_key); how_to_flow_key = shadow_fflp_how_flow_key; if (packet_info.flow.frame.frame_type[2] === 1'b0) { flow_key_vlan_valid = 4'h0; } else { flow_key_vlan_valid = 4'hf; } if (how_to_flow_key[9] === 1'b1) // MAC PORT { flow_key_port = packet_info.mac_prt; } else { flow_key_port = 2'b00; } if (how_to_flow_key[8] === 1'b1) // DA ADDRESS { flow_key_da_addr = packet_info.flow.dst_node.l2_addr; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO: FOR PKT_NUM %d PACKET_INFO DA MAC_ADDR = %h..\n",pkt_num,packet_info.flow.dst_node.l2_addr); } else { flow_key_da_addr = 48'h0; } if (how_to_flow_key[7] === 1'b1) // VLAN TAG { flow_key_tci = packet_info.flow.src_node.tci[11:0]; } else { flow_key_tci = 12'h0; } if (how_to_flow_key[6] === 1'b1) // IP_SRC ADDR { if (packet_info.flow.frame.frame_type[3] === 1'b0) { flow_key_ipsrc_addr = {96'h0,packet_info.flow.src_node.ip_addr}; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO: FOR PKT_NUM %d PACKET_INFO V4 IPSRC_ADDR = %h..\n",pkt_num,packet_info.flow.src_node.ip_addr); } else { flow_key_ipsrc_addr = {packet_info.flow.src_node.ipv6_addr}; } } else { flow_key_ipsrc_addr = 128'h0; } if (how_to_flow_key[5] === 1'b1) // IP_DST ADDR { if (packet_info.flow.frame.frame_type[3] === 1'b0) { flow_key_ipdst_addr = {96'h0,packet_info.flow.dst_node.ip_addr}; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO: FOR PKT_NUM %d PACKET_INFO V4 IPDST_ADDR = %h..\n",pkt_num,packet_info.flow.dst_node.ip_addr); } else { flow_key_ipdst_addr = {packet_info.flow.dst_node.ipv6_addr}; } } else { flow_key_ipdst_addr = 128'h0; } if (how_to_flow_key[4] === 1'b1) // PROTOCOL/NEXT HEADER { flow_key_protocol = packet_info.protocol; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO:0 FOR PKT_NUM %d FLOW_KEY_PROTOCOL = %h..\n",pkt_num,flow_key_protocol); } else { flow_key_protocol = 8'h0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO:1 FOR PKT_NUM %d FLOW_KEY_PROTOCOL = %h..\n",pkt_num,flow_key_protocol); } case (how_to_flow_key[3:2]) { 2'b00: // not selected { flow_key_L4_0 = 16'h0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO:00 FOR PKT_NUM %d FLOW_KEY_L4_0 = %h..\n",pkt_num,flow_key_L4_0); } 2'b01: // reserved { flow_key_L4_0 = 16'h0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO:01 FOR PKT_NUM %d FLOW_KEY_L4_0 = %h..\n",pkt_num,flow_key_L4_0); } 2'b10: // SRC_PORT (for tcp) { if (packet_info.protocol === PROTOCOL_TCP) { flow_key_L4_0 = packet_info.flow.tup.src_tcp_udp_port; // TCP } else if (packet_info.protocol === PROTOCOL_UDP) { flow_key_L4_0 = packet_info.flow.tup.src_tcp_udp_port; // UDP } else if (packet_info.protocol === PROTOCOL_IPSEC_AH) { } else if (packet_info.protocol === PROTOCOL_IPSEC_ESP) { } else if (packet_info.protocol === PROTOCOL_SCTP) { flow_key_L4_0 = packet_info.flow.tup.src_tcp_udp_port; // SCTP } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO:10 FOR PKT_NUM %d FLOW_KEY_L4_0 = %h..\n",pkt_num,flow_key_L4_0); } 2'b11: // SEQ_NUM (for tcp)/UDP LENGTH { if (packet_info.protocol === PROTOCOL_TCP) { flow_key_L4_0 = packet_info.flow.tx_param.last_seqno[31:16]; // TCP } else if (packet_info.protocol === PROTOCOL_UDP) { //KHKH flow_key_L4_0 = packet_info.flow.tx_param.udp_len; // UDP } else if (packet_info.protocol === PROTOCOL_IPSEC_AH) { } else if (packet_info.protocol === PROTOCOL_IPSEC_ESP) { } else if (packet_info.protocol === PROTOCOL_SCTP) { //KHKH flow_key_L4_0 = packet_info.flow.tx_param.verif_tag[31:16]; // SCTP } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO:11 FOR PKT_NUM %d FLOW_KEY_L4_0 = %h..\n",pkt_num,flow_key_L4_0); } } case (how_to_flow_key[1:0]) { 2'b00: // not selected { flow_key_L4_1 = 16'h0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO:00 FOR PKT_NUM %d FLOW_KEY_L4_1 = %h..\n",pkt_num,flow_key_L4_1); } 2'b01: // reserved { flow_key_L4_1 = 16'h0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO:01 FOR PKT_NUM %d FLOW_KEY_L4_1 = %h..\n",pkt_num,flow_key_L4_1); } 2'b10: // SRC_PORT (for tcp) { if (packet_info.protocol === PROTOCOL_TCP) { flow_key_L4_1 = packet_info.flow.tup.dst_tcp_udp_port; // TCP } else if (packet_info.protocol === PROTOCOL_UDP) { flow_key_L4_1 = packet_info.flow.tup.dst_tcp_udp_port; // UDP } else if (packet_info.protocol === PROTOCOL_IPSEC_AH) { } else if (packet_info.protocol === PROTOCOL_IPSEC_ESP) { } else if (packet_info.protocol === PROTOCOL_SCTP) { flow_key_L4_1 = packet_info.flow.tup.dst_tcp_udp_port; // SCTP } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO:10 FOR PKT_NUM %d FLOW_KEY_L4_1 = %h..\n",pkt_num,flow_key_L4_1); } 2'b11: // SEQ_NUM (for tcp)/UDP LENGTH { if (packet_info.protocol === PROTOCOL_TCP) { flow_key_L4_1 = packet_info.flow.tx_param.last_seqno[31:16]; // TCP } else if (packet_info.protocol === PROTOCOL_UDP) { //KHKH flow_key_L4_1 = packet_info.flow.tx_param.udp_chksum; // UDP } else if (packet_info.protocol === PROTOCOL_IPSEC_AH) { } else if (packet_info.protocol === PROTOCOL_IPSEC_ESP) { } else if (packet_info.protocol === PROTOCOL_SCTP) { //KHKH flow_key_L4_1 = packet_info.flow.tx_param.verif_tag[15:0]; // SCTP } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO:11 FOR PKT_NUM %d FLOW_KEY_L4_1 = %h..\n",pkt_num,flow_key_L4_1); } } generate_flow_key = {flow_key_vlan_valid, flow_key_da_addr, flow_key_tci, flow_key_ipsrc_addr, flow_key_ipdst_addr, flow_key_L4_0, flow_key_L4_1, flow_key_protocol, flow_key_port, 22'h0}; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO: FOR PKT_NUM = %d, FLOW_KEY_VLAN_VALID = %h.\n",pkt_num,flow_key_vlan_valid); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO: FOR PKT_NUM = %d, FLOW_KEY_DA_ADDR = %h.\n",pkt_num,flow_key_da_addr); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO: FOR PKT_NUM = %d, FLOW_KEY_TCI = %h.\n",pkt_num,flow_key_tci); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO: FOR PKT_NUM = %d, FLOW_KEY_IPSRC_ADDR = %h.\n",pkt_num,flow_key_ipsrc_addr); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO: FOR PKT_NUM = %d, FLOW_KEY_IPDST_ADDR = %h.\n",pkt_num,flow_key_ipdst_addr); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO: FOR PKT_NUM = %d, FLOW_KEY_L4_0 = %h.\n",pkt_num,flow_key_L4_0); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO: FOR PKT_NUM = %d, FLOW_KEY_L4_1 = %h.\n",pkt_num,flow_key_L4_1); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO: FOR PKT_NUM = %d, FLOW_KEY_PROTOCOL = %h.\n",pkt_num,flow_key_protocol); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO: FOR PKT_NUM = %d, FLOW_KEY_PORT = %h.\n",pkt_num,flow_key_port); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::generate_flow_key()", "IP_UTIL INFO: FOR PKT_NUM = %d, GENERATED FLOW_KEY = %h.\n",pkt_num,generate_flow_key); } function bit [31:0] setup_cam_ram_fcram_class:: calculate_H1 (//integer index, integer pkt_num, bit [2:0] predicted_l2_rdc_tbl_num, // bit [63:0] matched_as_data, Cpkt_info packet_info) { bit [39:0] rd_addr; bit [63:0] rd_data; bit [63:0] initial_h1_poly_tmp; bit [32:0] initial_h1_poly; bit [383:0] flow_key = 384'h0; bit [32:0] shtol_h1poly = 33'h0; bit [32:0] hash_tmp = 33'h0; bit [63:0] flow_keyb[6]; bit [63:0] flow_keyb_tmp; integer i, j; //@@ Get the Initial H1POLY from H1POLY(FZC_FFLP+0x40060 Regiater @@ //rd_addr = FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_H1POLY; //gen_pio_drv.pio_rd(rd_addr, initial_h1_poly_tmp); initial_h1_poly_tmp = fflp_util.fflp_flow_h1poly; initial_h1_poly = initial_h1_poly_tmp[32:0]; shtol_h1poly = initial_h1_poly_tmp[32:0]; flow_key = packet_info.flow_key; flow_keyb[0] = flow_key[63:0]; flow_keyb[1] = flow_key[127:64]; flow_keyb[2] = flow_key[191:128]; flow_keyb[3] = flow_key[255:192]; flow_keyb[4] = flow_key[319:256]; flow_keyb[5] = flow_key[383:320]; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_H1()", "IP_UTIL INFO: FOR PACKET_NUM = %d INITIAL_H1_POLY = %h.\n",pkt_num,initial_h1_poly); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_H1()", "IP_UTIL INFO: FOR PACKET_NUM = %d SHTOL_H1_POLY = %h.\n",pkt_num,shtol_h1poly); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_H1()", "IP_UTIL INFO: FOR PACKET_NUM = %d FLOW_KEY = %h.\n",pkt_num,flow_key); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_H1()", "IP_UTIL INFO: FOR PACKET_NUM = %d FLOW_KEYB[0] = %h.\n",pkt_num,flow_keyb[0]); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_H1()", "IP_UTIL INFO: FOR PACKET_NUM = %d FLOW_KEYB[1] = %h.\n",pkt_num,flow_keyb[1]); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_H1()", "IP_UTIL INFO: FOR PACKET_NUM = %d FLOW_KEYB[2] = %h.\n",pkt_num,flow_keyb[2]); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_H1()", "IP_UTIL INFO: FOR PACKET_NUM = %d FLOW_KEYB[3] = %h.\n",pkt_num,flow_keyb[3]); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_H1()", "IP_UTIL INFO: FOR PACKET_NUM = %d FLOW_KEYB[4] = %h.\n",pkt_num,flow_keyb[4]); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_H1()", "IP_UTIL INFO: FOR PACKET_NUM = %d FLOW_KEYB[5] = %h.\n",pkt_num,flow_keyb[5]); for (i=0;i<6;i++) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_H1()", "IP_UTIL INFO: FOR PKT_NUM = %d 0 VALUE OF I = %d.\n", pkt_num,i); for (j=63;j>=0;j--) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_H1()", "IP_UTIL INFO: FOR PKT_NUM = %d 0 VALUE OF J = %d.\n", pkt_num,j); if (j === 63) { flow_keyb_tmp = flow_keyb[i]; } else { flow_keyb_tmp = flow_keyb_tmp; } // shtol_h1poly = initial_h1_poly << 1; shtol_h1poly = shtol_h1poly << 1; if (shtol_h1poly[32] ^ flow_keyb_tmp[j]) { be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_H1()", "IP_UTIL INFO: FOR PKT_NUM = %d DOING XOR for I = %d AND J = %d.\n", pkt_num,i,j); shtol_h1poly = {1'b0,(shtol_h1poly[31:0] ^ H1_CRC_32C_POLY)}; } else { shtol_h1poly = {1'b0, shtol_h1poly[31:0]}; } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_H1()", "IP_UTIL INFO: FOR PKT_NUM = %d 1 VALUE OF J = %d.\n", pkt_num,j); } be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_H1()", "IP_UTIL INFO: FOR PKT_NUM = %d 1 VALUE OF I = %d.\n", pkt_num,i); } calculate_H1 = shtol_h1poly[31:0]; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_H1()", "IP_UTIL INFO: FOR PACKET_NUM = %d CALCULATED H1 HASH = %h.\n",pkt_num,calculate_H1); } task setup_cam_ram_fcram_class:: program_fcram() { } function bit setup_cam_ram_fcram_class:: ecc_err (integer pkt_num, bit [199:0] packet_cam_key, bit [63:0] matched_as_data, Cpkt_info packet_info) { bit [129:0] tcam_adata; bit [15:0] syndrome; bit ecc_err_l = 1'b0; bit ecc_err_h = 1'b0; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::ecc_err()", "IP_UTIL INFO: FOR PACKET_NUM = %d TCAM_KEY = %h, MATCHED_AS_DATA = %h.\n",pkt_num,packet_cam_key,matched_as_data); tcam_adata = {matched_as_data[25:1],1'b0,packet_cam_key[103:0]}; syndrome = matched_as_data[41:26]; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::ecc_err()", "IP_UTIL INFO: FOR PACKET_NUM = %d TCAM_ADATA = %h, SYNDROME = %h.\n",pkt_num,tcam_adata,syndrome); ecc_err_l = check_ecc (tcam_adata[64:0],syndrome[7:0]); ecc_err_h = check_ecc (tcam_adata[129:65],syndrome[15:8]); be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::ecc_err()", "IP_UTIL INFO: FOR PACKET_NUM = %d ECC_ERR_L = %h, ECC_ERR_H = %h.\n",pkt_num,ecc_err_l,ecc_err_h); ecc_err = ecc_err_h | ecc_err_l; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::ecc_err()", "IP_UTIL INFO: FOR PACKET_NUM = %d ECC_ERR = %h.\n",pkt_num,ecc_err); //THIS WILL BE A PLACE TO STORE THE ecc_err for the packet in packet_info } function bit setup_cam_ram_fcram_class:: check_ecc (bit [64:0] tcam_adata, bit [7:0] syndrome) { bit [72:0] din; bit [7:0] syn; din = {tcam_adata,syndrome}; syn[7] = din[70] ^ din[67] ^ din[65] ^ din[62] ^ din[60] ^ din[57] ^ din[54] ^ din[51] ^ din[48] ^ din[46] ^ din[44] ^ din[40] ^ din[38] ^ din[36] ^ din[32] ^ din[31] ^ din[27] ^ din[24] ^ din[23] ^ din[19] ^ din[18] ^ din[15] ^ din[13] ^ din[12] ^ din[10] ^ din[9] ^ din[7]; syn[6] = din[70] ^ din[68] ^ din[65] ^ din[62] ^ din[59] ^ din[57] ^ din[55] ^ din[52] ^ din[49] ^ din[47] ^ din[43] ^ din[41] ^ din[39] ^ din[35] ^ din[33] ^ din[30] ^ din[27] ^ din[26] ^ din[22] ^ din[19] ^ din[17] ^ din[15] ^ din[14] ^ din[12] ^ din[10] ^ din[9] ^ din[6]; syn[5] = din[71] ^ din[68] ^ din[65] ^ din[63] ^ din[60] ^ din[58] ^ din[54] ^ din[52] ^ din[49] ^ din[46] ^ din[44] ^ din[42] ^ din[38] ^ din[37] ^ din[34] ^ din[30] ^ din[29] ^ din[25] ^ din[22] ^ din[21] ^ din[20] ^ din[15] ^ din[14] ^ din[12] ^ din[11] ^ din[9] ^ din[8] ^ din[5]; syn[4] = din[71] ^ din[68] ^ din[66] ^ din[63] ^ din[60] ^ din[57] ^ din[56] ^ din[53] ^ din[50] ^ din[47] ^ din[45] ^ din[41] ^ din[39] ^ din[36] ^ din[33] ^ din[31] ^ din[28] ^ din[25] ^ din[24] ^ din[20] ^ din[18] ^ din[16] ^ din[14] ^ din[12] ^ din[11] ^ din[9] ^ din[4]; syn[3] = din[71] ^ din[69] ^ din[66] ^ din[64] ^ din[61] ^ din[58] ^ din[55] ^ din[52] ^ din[50] ^ din[47] ^ din[44] ^ din[42] ^ din[40] ^ din[36] ^ din[35] ^ din[32] ^ din[28] ^ din[26] ^ din[23] ^ din[21] ^ din[19] ^ din[16] ^ din[14] ^ din[13] ^ din[11] ^ din[9] ^ din[8] ^ din[3]; syn[2] = din[72] ^ din[69] ^ din[66] ^ din[63] ^ din[61] ^ din[58] ^ din[55] ^ din[53] ^ din[51] ^ din[48] ^ din[45] ^ din[43] ^ din[39] ^ din[38] ^ din[34] ^ din[31] ^ din[29] ^ din[27] ^ din[23] ^ din[22] ^ din[17] ^ din[16] ^ din[14] ^ din[13] ^ din[11] ^ din[10] ^ din[8] ^ din[2]; syn[1] = din[72] ^ din[69] ^ din[67] ^ din[64] ^ din[62] ^ din[59] ^ din[56] ^ din[53] ^ din[50] ^ din[48] ^ din[46] ^ din[42] ^ din[40] ^ din[37] ^ din[34] ^ din[33] ^ din[30] ^ din[26] ^ din[24] ^ din[20] ^ din[17] ^ din[16] ^ din[15] ^ din[13] ^ din[11] ^ din[10] ^ din[8] ^ din[1]; syn[0] = din[72] ^ din[70] ^ din[67] ^ din[64] ^ din[61] ^ din[59] ^ din[56] ^ din[54] ^ din[51] ^ din[49] ^ din[45] ^ din[43] ^ din[41] ^ din[37] ^ din[35] ^ din[32] ^ din[29] ^ din[28] ^ din[25] ^ din[21] ^ din[18] ^ din[16] ^ din[15] ^ din[13] ^ din[12] ^ din[10] ^ din[8] ^ din[0]; if (syn == 8'b00000000) { check_ecc = 1'b0; } else { check_ecc = 1'b1; } } function bit [7:0] setup_cam_ram_fcram_class:: calculate_ecc_syndrome (bit [64:0] din) { bit [7:0] syn; syn[7] = din[62] ^ din[59] ^ din[57] ^ din[54] ^ din[52] ^ din[49] ^ din[46] ^ din[43] ^ din[40] ^ din[38] ^ din[36] ^ din[32] ^ din[30] ^ din[28] ^ din[24] ^ din[23] ^ din[19] ^ din[16] ^ din[15] ^ din[11] ^ din[10] ^ din[7] ^ din[5] ^ din[4] ^ din[2] ^ din[1]; syn[6] = din[62] ^ din[60] ^ din[57] ^ din[54] ^ din[51] ^ din[49] ^ din[47] ^ din[44] ^ din[41] ^ din[39] ^ din[35] ^ din[33] ^ din[31] ^ din[27] ^ din[25] ^ din[22] ^ din[19] ^ din[18] ^ din[14] ^ din[11] ^ din[9] ^ din[7] ^ din[6] ^ din[4] ^ din[2] ^ din[1]; syn[5] = din[63] ^ din[60] ^ din[57] ^ din[55] ^ din[52] ^ din[50] ^ din[46] ^ din[44] ^ din[41] ^ din[38] ^ din[36] ^ din[34] ^ din[30] ^ din[29] ^ din[26] ^ din[22] ^ din[21] ^ din[17] ^ din[14] ^ din[13] ^ din[12] ^ din[7] ^ din[6] ^ din[4] ^ din[3] ^ din[1] ^ din[0]; syn[4] = din[63] ^ din[60] ^ din[58] ^ din[55] ^ din[52] ^ din[49] ^ din[48] ^ din[45] ^ din[42] ^ din[39] ^ din[37] ^ din[33] ^ din[31] ^ din[28] ^ din[25] ^ din[23] ^ din[20] ^ din[17] ^ din[16] ^ din[12] ^ din[10] ^ din[8] ^ din[6] ^ din[4] ^ din[3] ^ din[1]; syn[3] = din[63] ^ din[61] ^ din[58] ^ din[56] ^ din[53] ^ din[50] ^ din[47] ^ din[44] ^ din[42] ^ din[39] ^ din[36] ^ din[34] ^ din[32] ^ din[28] ^ din[27] ^ din[24] ^ din[20] ^ din[18] ^ din[15] ^ din[13] ^ din[11] ^ din[8] ^ din[6] ^ din[5] ^ din[3] ^ din[1] ^ din[0]; syn[2] = din[64] ^ din[61] ^ din[58] ^ din[55] ^ din[53] ^ din[50] ^ din[47] ^ din[45] ^ din[43] ^ din[40] ^ din[37] ^ din[35] ^ din[31] ^ din[30] ^ din[26] ^ din[23] ^ din[21] ^ din[19] ^ din[15] ^ din[14] ^ din[9] ^ din[8] ^ din[6] ^ din[5] ^ din[3] ^ din[2] ^ din[0]; syn[1] = din[64] ^ din[61] ^ din[59] ^ din[56] ^ din[54] ^ din[51] ^ din[48] ^ din[45] ^ din[42] ^ din[40] ^ din[38] ^ din[34] ^ din[32] ^ din[29] ^ din[26] ^ din[25] ^ din[22] ^ din[18] ^ din[16] ^ din[12] ^ din[9] ^ din[8] ^ din[7] ^ din[5] ^ din[3] ^ din[2] ^ din[0]; syn[0] = din[64] ^ din[62] ^ din[59] ^ din[56] ^ din[53] ^ din[51] ^ din[48] ^ din[46] ^ din[43] ^ din[41] ^ din[37] ^ din[35] ^ din[33] ^ din[29] ^ din[27] ^ din[24] ^ din[21] ^ din[20] ^ din[17] ^ din[13] ^ din[10] ^ din[8] ^ din[7] ^ din[5] ^ din[4] ^ din[2] ^ din[0]; calculate_ecc_syndrome = syn; be_msg_fflp.print(e_mesg_info, *, "setup_cam_ram_fcram_class::calculate_ecc_syndrome()", "CALCULATED_ECC_SYNDROME = %h.\n",syn); }