// ========== Copyright Header Begin ========================================== // // OpenSPARC T2 Processor File: fflp_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 "dmc_memory_map.vri" #include "pio_driver.vrh" #include "fflp_defines.vri" //#include "ncu_stub.vrh" // extern Cncu_stub gen_pio_drv; extern niu_gen_pio gen_pio_drv; #include "cMesg.vrh" extern Mesg be_msg; class fflp_util_class { //@@@@ FFLP Shadow Register Variables @@@@ bit [63:0] fflp_config; bit [63:0] fflp_tcp_cflag_mask; bit [63:0] fflp_fcram_ref_tmr; bit [63:0] fflp_l2_cls_2; bit [63:0] fflp_l2_cls_3; bit [63:0] fflp_l2_cls_4; bit [63:0] fflp_l2_cls_5; bit [63:0] fflp_l2_cls_6; bit [63:0] fflp_l2_cls_7; bit [63:0] fflp_cam_key_reg0; bit [63:0] fflp_cam_key_reg1; bit [63:0] fflp_cam_key_reg2; bit [63:0] fflp_cam_key_reg3; bit [63:0] fflp_cam_key_mask_reg0; bit [63:0] fflp_cam_key_mask_reg1; bit [63:0] fflp_cam_key_mask_reg2; bit [63:0] fflp_cam_key_mask_reg3; bit [63:0] fflp_cam_key_control; bit [63:0] fflp_how_tcam_key_cls_4; bit [63:0] fflp_how_tcam_key_cls_5; bit [63:0] fflp_how_tcam_key_cls_6; bit [63:0] fflp_how_tcam_key_cls_7; bit [63:0] fflp_how_tcam_key_cls_8; bit [63:0] fflp_how_tcam_key_cls_9; bit [63:0] fflp_how_tcam_key_cls_A; bit [63:0] fflp_how_tcam_key_cls_B; bit [63:0] fflp_how_tcam_key_cls_C; bit [63:0] fflp_how_tcam_key_cls_D; bit [63:0] fflp_how_tcam_key_cls_E; bit [63:0] fflp_how_tcam_key_cls_F; bit [63:0] fflp_how_flow_key_cls_4; bit [63:0] fflp_how_flow_key_cls_5; bit [63:0] fflp_how_flow_key_cls_6; bit [63:0] fflp_how_flow_key_cls_7; bit [63:0] fflp_how_flow_key_cls_8; bit [63:0] fflp_how_flow_key_cls_9; bit [63:0] fflp_how_flow_key_cls_A; bit [63:0] fflp_how_flow_key_cls_B; bit [63:0] fflp_how_flow_key_cls_C; bit [63:0] fflp_how_flow_key_cls_D; bit [63:0] fflp_how_flow_key_cls_E; bit [63:0] fflp_how_flow_key_cls_F; bit [63:0] fflp_flow_h1poly; bit ext_lookup [8]; bit [63:0] rdc_def_pt0_rdc; bit [63:0] rdc_def_pt1_rdc; bit [63:0] rdc_def_pt2_rdc; bit [63:0] rdc_def_pt3_rdc; task new( ) ; function bit check_cmd(bit [63:0]cmd, bit [63:0] opt); task fflp_init ( integer iport, bit[63:0] cmd); function bit [199:0] pio_rd_tcam_key (bit [9:0] tcam_index, var bit [199:0] pio_rd_tcam_mask); task pio_wr_tcam_key (bit [9:0] tcam_index, bit [199:0] wr_tcam_key, bit [199:0] wr_tcam_mask); function bit [63:0] pio_rd_tcam_asdata (bit [9:0] tcam_index); task pio_wr_tcam_asdata (bit [9:0] tcam_index, bit [63:0] wr_tcam_asdata); task wait_for_done_bit(); task fflp_pio_wrapper ( bit [39:0] pio_addr, bit [63:0] wr_data); task init_cam_entries(); task pio_cmp_tcam_key (bit [199:0] cmp_tcam_key); function bit [10:0] pio_comp_tcam_key (bit [199:0] cmp_tcam_key); } task fflp_util_class::new( ) { fflp_config = -1; fflp_tcp_cflag_mask = -1; fflp_fcram_ref_tmr = -1; fflp_l2_cls_2 = -1; fflp_l2_cls_3 = -1; fflp_l2_cls_4 = -1; fflp_l2_cls_5 = -1; fflp_l2_cls_6 = -1; fflp_l2_cls_7 = -1; fflp_cam_key_reg0 = -1; fflp_cam_key_reg1 = -1; fflp_cam_key_reg2 = -1; fflp_cam_key_reg3 = -1; fflp_cam_key_mask_reg0 = -1; fflp_cam_key_mask_reg1 = -1; fflp_cam_key_mask_reg2 = -1; fflp_cam_key_mask_reg3 = -1; fflp_cam_key_control = -1; fflp_how_tcam_key_cls_4 = -1; fflp_how_tcam_key_cls_5 = -1; fflp_how_tcam_key_cls_6 = -1; fflp_how_tcam_key_cls_7 = -1; fflp_how_tcam_key_cls_8 = -1; fflp_how_tcam_key_cls_9 = -1; fflp_how_tcam_key_cls_A = -1; fflp_how_tcam_key_cls_B = -1; fflp_how_tcam_key_cls_C = -1; fflp_how_tcam_key_cls_D = -1; fflp_how_tcam_key_cls_E = -1; fflp_how_tcam_key_cls_F = -1; fflp_how_flow_key_cls_4 = -1; fflp_how_flow_key_cls_5 = -1; fflp_how_flow_key_cls_6 = -1; fflp_how_flow_key_cls_7 = -1; fflp_how_flow_key_cls_8 = -1; fflp_how_flow_key_cls_9 = -1; fflp_how_flow_key_cls_A = -1; fflp_how_flow_key_cls_B = -1; fflp_how_flow_key_cls_C = -1; fflp_how_flow_key_cls_D = -1; fflp_how_flow_key_cls_E = -1; fflp_how_flow_key_cls_F = -1; fflp_flow_h1poly = -1; ext_lookup[0] = -1; ext_lookup[1] = -1; ext_lookup[2] = -1; ext_lookup[3] = -1; ext_lookup[4] = -1; ext_lookup[5] = -1; ext_lookup[6] = -1; ext_lookup[7] = -1; rdc_def_pt0_rdc = -1; rdc_def_pt1_rdc = -1; rdc_def_pt2_rdc = -1; rdc_def_pt3_rdc = -1; } task fflp_util_class::fflp_pio_wrapper ( bit [39:0] pio_addr, bit [63:0] wr_data) { case(pio_addr) { FFLP_ADDRESS_RANGE+FFLP_CONFIG: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_CONFIG,wr_data); fflp_config = wr_data; } FFLP_ADDRESS_RANGE+FFLP_TCP_CFLAG_MASK: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_TCP_CFLAG_MASK,wr_data); fflp_tcp_cflag_mask = wr_data; } FFLP_ADDRESS_RANGE+FFLP_FCRAM_REF_TMR: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_FCRAM_REF_TMR,wr_data); fflp_fcram_ref_tmr = wr_data; } FFLP_ADDRESS_RANGE+FFLP_L2_CLS_2: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_L2_CLS_2,wr_data); fflp_l2_cls_2 = wr_data; } FFLP_ADDRESS_RANGE+FFLP_L2_CLS_3: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_L2_CLS_3,wr_data); fflp_l2_cls_3 = wr_data; } FFLP_ADDRESS_RANGE+FFLP_L3_CLS_4: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_L3_CLS_4,wr_data); fflp_l2_cls_4 = wr_data; } FFLP_ADDRESS_RANGE+FFLP_L3_CLS_5: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_L3_CLS_5,wr_data); fflp_l2_cls_5 = wr_data; } FFLP_ADDRESS_RANGE+FFLP_L3_CLS_6: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_L3_CLS_6,wr_data); fflp_l2_cls_6 = wr_data; } FFLP_ADDRESS_RANGE+FFLP_L3_CLS_7: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_L3_CLS_7,wr_data); fflp_l2_cls_7 = wr_data; } FFLP_ADDRESS_RANGE+FFLP_CAM_KEY_REG0: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_CAM_KEY_REG0,wr_data); fflp_cam_key_reg0 = wr_data; } FFLP_ADDRESS_RANGE+FFLP_CAM_KEY_REG1: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_CAM_KEY_REG1,wr_data); fflp_cam_key_reg1 = wr_data; } FFLP_ADDRESS_RANGE+FFLP_CAM_KEY_REG2: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_CAM_KEY_REG2,wr_data); fflp_cam_key_reg2 = wr_data; } FFLP_ADDRESS_RANGE+FFLP_CAM_KEY_REG3: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_CAM_KEY_REG3,wr_data); fflp_cam_key_reg3 = wr_data; } FFLP_ADDRESS_RANGE+FFLP_CAM_KEY_MASK_REG0: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_CAM_KEY_MASK_REG0,wr_data); fflp_cam_key_mask_reg0 = wr_data; } FFLP_ADDRESS_RANGE+FFLP_CAM_KEY_MASK_REG1: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_CAM_KEY_MASK_REG1,wr_data); fflp_cam_key_mask_reg1 = wr_data; } FFLP_ADDRESS_RANGE+FFLP_CAM_KEY_MASK_REG2: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_CAM_KEY_MASK_REG2,wr_data); fflp_cam_key_mask_reg2 = wr_data; } FFLP_ADDRESS_RANGE+FFLP_CAM_KEY_MASK_REG3: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_CAM_KEY_MASK_REG3,wr_data); fflp_cam_key_mask_reg3 = wr_data; } FFLP_ADDRESS_RANGE+FFLP_CAM_CONTROL: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_CAM_CONTROL,wr_data); fflp_cam_key_control = wr_data; } FFLP_ADDRESS_RANGE+FFLP_HOW_TCAM_KEY_CLS_4: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_HOW_TCAM_KEY_CLS_4,wr_data); fflp_how_tcam_key_cls_4 = wr_data; } FFLP_ADDRESS_RANGE+FFLP_HOW_TCAM_KEY_CLS_5: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_HOW_TCAM_KEY_CLS_5,wr_data); fflp_how_tcam_key_cls_5 = wr_data; } FFLP_ADDRESS_RANGE+FFLP_HOW_TCAM_KEY_CLS_6: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_HOW_TCAM_KEY_CLS_6,wr_data); fflp_how_tcam_key_cls_6 = wr_data; } FFLP_ADDRESS_RANGE+FFLP_HOW_TCAM_KEY_CLS_7: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_HOW_TCAM_KEY_CLS_7,wr_data); fflp_how_tcam_key_cls_7 = wr_data; } FFLP_ADDRESS_RANGE+FFLP_HOW_TCAM_KEY_CLS_8: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_HOW_TCAM_KEY_CLS_8,wr_data); fflp_how_tcam_key_cls_8 = wr_data; } FFLP_ADDRESS_RANGE+FFLP_HOW_TCAM_KEY_CLS_9: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_HOW_TCAM_KEY_CLS_9,wr_data); fflp_how_tcam_key_cls_9 = wr_data; } FFLP_ADDRESS_RANGE+FFLP_HOW_TCAM_KEY_CLS_A: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_HOW_TCAM_KEY_CLS_A,wr_data); fflp_how_tcam_key_cls_A = wr_data; } FFLP_ADDRESS_RANGE+FFLP_HOW_TCAM_KEY_CLS_B: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_HOW_TCAM_KEY_CLS_B,wr_data); fflp_how_tcam_key_cls_B = wr_data; } FFLP_ADDRESS_RANGE+FFLP_HOW_TCAM_KEY_CLS_C: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_HOW_TCAM_KEY_CLS_C,wr_data); fflp_how_tcam_key_cls_C = wr_data; } FFLP_ADDRESS_RANGE+FFLP_HOW_TCAM_KEY_CLS_D: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_HOW_TCAM_KEY_CLS_D,wr_data); fflp_how_tcam_key_cls_D = wr_data; } FFLP_ADDRESS_RANGE+FFLP_HOW_TCAM_KEY_CLS_E: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_HOW_TCAM_KEY_CLS_E,wr_data); fflp_how_tcam_key_cls_E = wr_data; } FFLP_ADDRESS_RANGE+FFLP_HOW_TCAM_KEY_CLS_F: { gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_HOW_TCAM_KEY_CLS_F,wr_data); fflp_how_tcam_key_cls_F = wr_data; } FFLP_FLOW_ADDRESS_RANGE+FFLP_HOW_FLOW_KEY_CLS_4: { gen_pio_drv.pio_wr(FFLP_FLOW_ADDRESS_RANGE +FFLP_HOW_FLOW_KEY_CLS_4,wr_data); fflp_how_flow_key_cls_4 = wr_data; } FFLP_FLOW_ADDRESS_RANGE+FFLP_HOW_FLOW_KEY_CLS_5: { gen_pio_drv.pio_wr(FFLP_FLOW_ADDRESS_RANGE +FFLP_HOW_FLOW_KEY_CLS_5,wr_data); fflp_how_flow_key_cls_5 = wr_data; } FFLP_FLOW_ADDRESS_RANGE+FFLP_HOW_FLOW_KEY_CLS_6: { gen_pio_drv.pio_wr(FFLP_FLOW_ADDRESS_RANGE +FFLP_HOW_FLOW_KEY_CLS_6,wr_data); fflp_how_flow_key_cls_6 = wr_data; } FFLP_FLOW_ADDRESS_RANGE+FFLP_HOW_FLOW_KEY_CLS_7: { gen_pio_drv.pio_wr(FFLP_FLOW_ADDRESS_RANGE +FFLP_HOW_FLOW_KEY_CLS_7,wr_data); fflp_how_flow_key_cls_7 = wr_data; } FFLP_FLOW_ADDRESS_RANGE+FFLP_HOW_FLOW_KEY_CLS_8: { gen_pio_drv.pio_wr(FFLP_FLOW_ADDRESS_RANGE +FFLP_HOW_FLOW_KEY_CLS_8,wr_data); fflp_how_flow_key_cls_8 = wr_data; } FFLP_FLOW_ADDRESS_RANGE+FFLP_HOW_FLOW_KEY_CLS_9: { gen_pio_drv.pio_wr(FFLP_FLOW_ADDRESS_RANGE +FFLP_HOW_FLOW_KEY_CLS_9,wr_data); fflp_how_flow_key_cls_9 = wr_data; } FFLP_FLOW_ADDRESS_RANGE+FFLP_HOW_FLOW_KEY_CLS_A: { gen_pio_drv.pio_wr(FFLP_FLOW_ADDRESS_RANGE +FFLP_HOW_FLOW_KEY_CLS_A,wr_data); fflp_how_flow_key_cls_A = wr_data; } FFLP_FLOW_ADDRESS_RANGE+FFLP_HOW_FLOW_KEY_CLS_B: { gen_pio_drv.pio_wr(FFLP_FLOW_ADDRESS_RANGE +FFLP_HOW_FLOW_KEY_CLS_B,wr_data); fflp_how_flow_key_cls_B = wr_data; } FFLP_FLOW_ADDRESS_RANGE+FFLP_HOW_FLOW_KEY_CLS_C: { gen_pio_drv.pio_wr(FFLP_FLOW_ADDRESS_RANGE +FFLP_HOW_FLOW_KEY_CLS_C,wr_data); fflp_how_flow_key_cls_C = wr_data; } FFLP_FLOW_ADDRESS_RANGE+FFLP_HOW_FLOW_KEY_CLS_D: { gen_pio_drv.pio_wr(FFLP_FLOW_ADDRESS_RANGE +FFLP_HOW_FLOW_KEY_CLS_D,wr_data); fflp_how_flow_key_cls_D = wr_data; } FFLP_FLOW_ADDRESS_RANGE+FFLP_HOW_FLOW_KEY_CLS_E: { gen_pio_drv.pio_wr(FFLP_FLOW_ADDRESS_RANGE +FFLP_HOW_FLOW_KEY_CLS_E,wr_data); fflp_how_flow_key_cls_E = wr_data; } FFLP_FLOW_ADDRESS_RANGE+FFLP_HOW_FLOW_KEY_CLS_F: { gen_pio_drv.pio_wr(FFLP_FLOW_ADDRESS_RANGE +FFLP_HOW_FLOW_KEY_CLS_F,wr_data); fflp_how_flow_key_cls_F = wr_data; } FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_H1POLY: { gen_pio_drv.pio_wr(FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_H1POLY,wr_data); fflp_flow_h1poly = wr_data; } FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_PARTITION_SEL: { gen_pio_drv.pio_wr(FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_PARTITION_SEL,wr_data); ext_lookup[0] = wr_data[16]; } FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_PARTITION_SEL + (1*8): { gen_pio_drv.pio_wr(FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_PARTITION_SEL + (1*8),wr_data); ext_lookup[1] = wr_data[16]; } FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_PARTITION_SEL + (2*8): { gen_pio_drv.pio_wr(FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_PARTITION_SEL + (2*8),wr_data); ext_lookup[2] = wr_data[16]; } FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_PARTITION_SEL + (3*8): { gen_pio_drv.pio_wr(FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_PARTITION_SEL + (3*8),wr_data); ext_lookup[3] = wr_data[16]; } FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_PARTITION_SEL + (4*8): { gen_pio_drv.pio_wr(FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_PARTITION_SEL + (4*8),wr_data); ext_lookup[4] = wr_data[16]; } FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_PARTITION_SEL + (5*8): { gen_pio_drv.pio_wr(FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_PARTITION_SEL + (5*8),wr_data); ext_lookup[5] = wr_data[16]; } FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_PARTITION_SEL + (6*8): { gen_pio_drv.pio_wr(FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_PARTITION_SEL + (6*8),wr_data); ext_lookup[6] = wr_data[16]; } FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_PARTITION_SEL + (7*8): { gen_pio_drv.pio_wr(FFLP_FLOW_ADDRESS_RANGE + FFLP_FLOW_PARTITION_SEL + (7*8),wr_data); ext_lookup[7] = wr_data[16]; } RDC_DEF_PT0_RDC: { gen_pio_drv.pio_wr(RDC_DEF_PT0_RDC,wr_data); rdc_def_pt0_rdc = wr_data; } RDC_DEF_PT1_RDC: { gen_pio_drv.pio_wr(RDC_DEF_PT1_RDC,wr_data); rdc_def_pt1_rdc = wr_data; } RDC_DEF_PT2_RDC: { gen_pio_drv.pio_wr(RDC_DEF_PT2_RDC,wr_data); rdc_def_pt2_rdc = wr_data; } RDC_DEF_PT3_RDC: { gen_pio_drv.pio_wr(RDC_DEF_PT3_RDC,wr_data); rdc_def_pt3_rdc = wr_data; } default: { } } } task fflp_util_class::fflp_init ( integer iport, bit[63:0] cmd) { bit [39:0] base_addr; bit [63:0] i, wr_data; bit [39:0] addr; // FFLP_CONFIG printf(" Initializing FFLP_CONFIG REG \n"); wr_data = 64'h0000_0000_0004_3301; // gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_CONFIG,wr_data); gen_pio_drv.pio_wr(FFLP_ADDRESS_RANGE +FFLP_CONFIG,wr_data); be_msg.print(e_mesg_info, "fflp_util_class", "fflp_init", "WROTE %h TO FFLP CONFIG REG.\n",wr_data); // FFLP_L2_CLS_2 printf(" Initializing FFLP_L2_CLS_2 REG \n"); addr = FFLP_ADDRESS_RANGE + FFLP_L2_CLS_2; // gen_pio_drv.pio_wr(addr, 64'h0); gen_pio_drv.pio_wr(addr, 64'h0); // FFLP_L2_CLS_3 printf(" Initializing FFLP_L2_CLS_3 REG \n"); addr = FFLP_ADDRESS_RANGE + FFLP_L2_CLS_3; // gen_pio_drv.pio_wr(addr, 64'h0); gen_pio_drv.pio_wr(addr, 64'h0); // FFLP L3 class4-7 printf(" Initializing FFLP L3 class4-7 REG \n"); for (addr = FFLP_ADDRESS_RANGE + FFLP_L3_CLS_4; addr < FFLP_ADDRESS_RANGE + FFLP_L3_CLS_7 + 32'h8; addr = addr + 32'h8) { // gen_pio_drv.pio_wr(addr, 64'h0); gen_pio_drv.pio_wr(addr, 64'h0); repeat (5) @(posedge CLOCK); } // FFLP CAM KEY 0-3 printf(" Initializing FFLP CAM KEY 0-3 REG \n"); for (addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_REG0; addr < FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_REG3 + 32'h8; addr = addr + 32'h8) { // gen_pio_drv.pio_wr(addr, 64'h0); gen_pio_drv.pio_wr(addr, 64'h0); repeat (5) @(posedge CLOCK); } // FFLP CAM KEY MASK 0-3 printf(" Initializing FFLP CAM KEY MASK 0-3 REG \n"); for (addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_MASK_REG0; addr < FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_MASK_REG3 + 32'h8; addr = addr + 32'h8) { // gen_pio_drv.pio_wr(addr, 64'h0); gen_pio_drv.pio_wr(addr, 64'h0); repeat (5) @(posedge CLOCK); } if ( get_plus_arg(CHECK, "INIT_TCAM_RAM") ) { // FFLP CAM 128-entry printf(" Initializing FFLP CAM 128-entry \n"); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_CONTROL; for (wr_data = 10'd0; wr_data < 10'd128; wr_data = wr_data + 1'd1) { // gen_pio_drv.pio_wr(addr, wr_data); gen_pio_drv.pio_wr(addr, wr_data); printf(" Write data %h to addr %h for CAM 128-entry\n", wr_data, addr); repeat (8) @(posedge CLOCK); } // FFLP CAM associated RAM 128-entry printf(" Initializing FFLP CAM associated RAM 128-entry \n"); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_CONTROL; for (i = 10'd0; i < 10'd128; i = i + 1'd1) { wr_data = i + 64'h10_0000; // gen_pio_drv.pio_wr(addr, wr_data); gen_pio_drv.pio_wr(addr, wr_data); printf(" Write data %h to addr %h for RAM 128-entry\n", wr_data, addr); repeat (8) @(posedge CLOCK); } } // VLAN table if ( get_plus_arg(CHECK, "INIT_VLAN_TBL") ) { printf(" Initializing VLAN Table.\n"); for (i=0;i<4096;i++) { wr_data = 64'h0; addr = FFLP_VLAN_TBL_ADDRESS_RANGE + (i*8); gen_pio_drv.pio_wr(addr, wr_data); // fflp_util.fflp_pio_wrapper(addr, wr_data); NO SUPPORT YET } printf(" VLAN Table Initialized.\n"); } } // end of task fflp_init function bit fflp_util_class :: check_cmd(bit [63:0]cmd, bit [63:0] opt){ if((cmd & opt) > 0) check_cmd=1; else check_cmd=0; } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@ FFLP PIO WRAPPERS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@ TCAM index based read TCAM key @@@@@@@@@@@@@@@@@@@ function bit [199:0] fflp_util_class::pio_rd_tcam_key (bit [9:0] tcam_index, var bit [199:0] pio_rd_tcam_mask) { integer stat; bit [63:0] rd_data; bit [63:0] wr_data; bit [39:0] addr; bit [63:0] rd_data0; bit [63:0] rd_data1; bit [63:0] rd_data2; bit [63:0] rd_data3; bit [63:0] rdm_data0; bit [63:0] rdm_data1; bit [63:0] rdm_data2; bit [63:0] rdm_data3; //**************************************** // CPU checks the done bit before start ** //**************************************** wait_for_done_bit(); //**************************************** // CPU write to command register ********* //**************************************** //printf("KEY_TYPE IS = %d\n", key_type); //printf("L3_L2 = %h, L3_L2 = %d\n", key_size, key_size); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_CONTROL; wr_data = {43'h0,3'b001,8'h00,tcam_index}; gen_pio_drv.pio_wr(addr, wr_data); //**************************************** // CPU checks the done bit before start ** //**************************************** wait_for_done_bit(); //**************************************** // CPU reads "read CAM key registers" **** //**************************************** addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_MASK_REG0; gen_pio_drv.pio_rd(addr, rdm_data0, stat); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_MASK_REG1; gen_pio_drv.pio_rd(addr, rdm_data1, stat); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_MASK_REG2; gen_pio_drv.pio_rd(addr, rdm_data2, stat); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_MASK_REG3; gen_pio_drv.pio_rd(addr, rdm_data3, stat); pio_rd_tcam_mask = {rdm_data0[7:0],rdm_data1,rdm_data2,rdm_data3}; printf("Index = %d, Read_TCAM_Mask Value = %h.\n",tcam_index,pio_rd_tcam_mask); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_REG0; gen_pio_drv.pio_rd(addr, rd_data0, stat); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_REG1; gen_pio_drv.pio_rd(addr, rd_data1, stat); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_REG2; gen_pio_drv.pio_rd(addr, rd_data2, stat); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_REG3; gen_pio_drv.pio_rd(addr, rd_data3, stat); pio_rd_tcam_key = {rd_data0[7:0],rd_data1,rd_data2,rd_data3}; printf("Index = %d, Read_TCAM Value = %h.\n",tcam_index,pio_rd_tcam_key); } //@@@@@@@@@@@@@@@@@ TCAM index based write TCAM key @@@@@@@@@@@@@@@@@@@ task fflp_util_class::pio_wr_tcam_key (bit [9:0] tcam_index, bit [199:0] wr_tcam_key, bit [199:0] wr_tcam_mask) { bit [63:0] wr_data; bit [39:0] addr; //**************************************** // CPU checks the done bit before start ** //**************************************** wait_for_done_bit(); //******************************************** // CPU writes CAM keys to wrt_cam_key regs. ** //******************************************** addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_MASK_REG0; wr_data = {56'h0,wr_tcam_mask[199:192]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_pio_wrapper ( addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_MASK_REG1; wr_data = wr_tcam_mask[191:128]; // gen_pio_drv.pio_wr(addr, wr_data); fflp_pio_wrapper ( addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_MASK_REG2; wr_data = wr_tcam_mask[127:64]; // gen_pio_drv.pio_wr(addr, wr_data); fflp_pio_wrapper ( addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_MASK_REG3; wr_data = wr_tcam_mask[63:0]; // gen_pio_drv.pio_wr(addr, wr_data); fflp_pio_wrapper ( addr, wr_data); printf("Index = %d, Write_TCAM_Mask Value = %h.\n",tcam_index,wr_tcam_mask); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_REG0; wr_data = {56'h0,wr_tcam_key[199:192]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_pio_wrapper ( addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_REG1; wr_data = wr_tcam_key[191:128]; // gen_pio_drv.pio_wr(addr, wr_data); fflp_pio_wrapper ( addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_REG2; wr_data = wr_tcam_key[127:64]; // gen_pio_drv.pio_wr(addr, wr_data); fflp_pio_wrapper ( addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_REG3; wr_data = wr_tcam_key[63:0]; // gen_pio_drv.pio_wr(addr, wr_data); fflp_pio_wrapper ( addr, wr_data); printf("Index = %d, Write_TCAM Value = %h.\n",tcam_index,wr_tcam_key); //**************************************** // CPU write to command register ********* //**************************************** addr = FFLP_ADDRESS_RANGE + FFLP_CAM_CONTROL; wr_data = {43'h0,3'b000,8'h00,tcam_index}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_pio_wrapper ( addr, wr_data); } //@@TASK Version@@@ TCAM Compare based on TCAM key @@@@@@@@@@@@@@@@@@@ task fflp_util_class::pio_cmp_tcam_key (bit [199:0] cmp_tcam_key) { bit [63:0] wr_data; bit [39:0] addr; bit [9:0] tcam_index = 10'h0; //**************************************** // CPU checks the done bit before start ** //**************************************** wait_for_done_bit(); //******************************************** // CPU writes CAM keys to wrt_cam_key regs. ** //******************************************** addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_REG0; wr_data = {56'h0,cmp_tcam_key[199:192]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_pio_wrapper ( addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_REG1; wr_data = cmp_tcam_key[191:128]; // gen_pio_drv.pio_wr(addr, wr_data); fflp_pio_wrapper ( addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_REG2; wr_data = cmp_tcam_key[127:64]; // gen_pio_drv.pio_wr(addr, wr_data); fflp_pio_wrapper ( addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_REG3; wr_data = cmp_tcam_key[63:0]; // gen_pio_drv.pio_wr(addr, wr_data); fflp_pio_wrapper ( addr, wr_data); printf("Index = %d, Compare TCAM Value = %h.\n",cmp_tcam_key); //**************************************** // CPU write to command register ********* //**************************************** addr = FFLP_ADDRESS_RANGE + FFLP_CAM_CONTROL; wr_data = {43'h0,3'b010,8'h00,tcam_index}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_pio_wrapper ( addr, wr_data); } //@@FUNCTION Version@@@@TCAM Compare based on TCAM key @@@@@@@@@@@@@@@@@@@ function bit [10:0] fflp_util_class::pio_comp_tcam_key (bit [199:0] cmp_tcam_key) { bit [63:0] rd_data; bit [63:0] wr_data; bit [39:0] addr; bit [9:0] tcam_index = 10'h0; integer stat; //**************************************** // CPU checks the done bit before start ** //**************************************** wait_for_done_bit(); //******************************************** // CPU writes CAM keys to wrt_cam_key regs. ** //******************************************** addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_REG0; wr_data = {56'h0,cmp_tcam_key[199:192]}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_pio_wrapper ( addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_REG1; wr_data = cmp_tcam_key[191:128]; // gen_pio_drv.pio_wr(addr, wr_data); fflp_pio_wrapper ( addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_REG2; wr_data = cmp_tcam_key[127:64]; // gen_pio_drv.pio_wr(addr, wr_data); fflp_pio_wrapper ( addr, wr_data); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_REG3; wr_data = cmp_tcam_key[63:0]; // gen_pio_drv.pio_wr(addr, wr_data); fflp_pio_wrapper ( addr, wr_data); printf("Index = %d, Compare TCAM Value = %h.\n",cmp_tcam_key); //**************************************** // CPU write to command register ********* //**************************************** addr = FFLP_ADDRESS_RANGE + FFLP_CAM_CONTROL; wr_data = {43'h0,3'b010,8'h00,tcam_index}; // gen_pio_drv.pio_wr(addr, wr_data); fflp_pio_wrapper ( addr, wr_data); //**************************************** // CPU checks the done bit before start ** //**************************************** wait_for_done_bit(); gen_pio_drv.pio_rd(addr, rd_data, stat); pio_comp_tcam_key = {rd_data[16],rd_data[9:0]}; } //@@@@@@@@@@@@@@@@@ TCAM index based read AS_DATA @@@@@@@@@@@@@@@@@@@ function bit [63:0] fflp_util_class::pio_rd_tcam_asdata (bit [9:0] tcam_index) { integer stat; bit [63:0] rd_data; bit [63:0] rd_data1; bit [63:0] wr_data; bit [39:0] addr; //**************************************** // CPU checks the done bit before start ** //**************************************** wait_for_done_bit(); //**************************************** // CPU write to command register ********* //**************************************** //printf("KEY_TYPE IS = %d\n", key_type); //printf("L3_L2 = %h, L3_L2 = %d\n", key_size, key_size); addr = FFLP_ADDRESS_RANGE + FFLP_CAM_CONTROL; wr_data = {43'h0,3'b101,8'h00,tcam_index}; gen_pio_drv.pio_wr(addr, wr_data); //**************************************** // CPU checks the done bit before start ** //**************************************** wait_for_done_bit(); //**************************************** // CPU reads "read CAM key registers" **** //**************************************** addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_REG1; gen_pio_drv.pio_rd(addr, rd_data1, stat); pio_rd_tcam_asdata = rd_data1; printf("Index = %d, Read_TCAM ASDATA Value = %h.\n",tcam_index,pio_rd_tcam_asdata); } //@@@@@@@@@@@@@@@@@ TCAM index based write AS_DATA @@@@@@@@@@@@@@@@@@@ task fflp_util_class::pio_wr_tcam_asdata (bit [9:0] tcam_index, bit [63:0] wr_tcam_asdata) { bit [63:0] wr_data; bit [39:0] addr; //**************************************** // CPU checks the done bit before start ** //**************************************** wait_for_done_bit(); //******************************************** // CPU writes CAM keys to wrt_cam_key regs. ** //******************************************** addr = FFLP_ADDRESS_RANGE + FFLP_CAM_KEY_REG1; wr_data = wr_tcam_asdata; gen_pio_drv.pio_wr(addr, wr_data); printf("Index = %d, Writing TCAM_ASDATA Value = %h.\n",tcam_index,wr_tcam_asdata); //**************************************** // CPU write to command register ********* //**************************************** addr = FFLP_ADDRESS_RANGE + FFLP_CAM_CONTROL; wr_data = {43'h0,3'b100,8'h00,tcam_index}; gen_pio_drv.pio_wr(addr, wr_data); } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@ Wait for cmd completion bit @@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ task fflp_util_class::wait_for_done_bit() { integer stat; bit [63:0] rd_data =0; bit [39:0] addr =0; addr = FFLP_ADDRESS_RANGE + FFLP_CAM_CONTROL; gen_pio_drv.pio_rd(addr, rd_data, stat); while(!rd_data[17]) { gen_pio_drv.pio_rd(addr, rd_data, stat); } repeat(5) @(posedge CLOCK); } task fflp_util_class::init_cam_entries() { integer i; bit [9:0] cam_addr; bit [199:0] cam_key; bit [199:0] cam_lmask; bit [63:0] adata; bit [4:0] hdr_class = 5'b00000; bit [4:0] l2_drc_tbl_num = 5'b00000; bit noport = 1'b0; bit [7:0] tos = 8'h0; bit [7:0] next_hdr = 8'h0; bit [15:0] src_port_num = 16'h0; bit [15:0] dst_port_num = 16'h0; bit [127:0] dst_src_addr = 128'h0; bit [7:0] protocol = 8'h0; bit [31:0] src_addr = 32'h0; bit [31:0] dst_addr = 32'h0; //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@ 1st Packet cam/ram setup CL_TCP @ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ cam_addr = 10'h0_00; cam_key = 200'h0; cam_lmask = 200'hff_ffff_ffff_ffff_ffff_ffff_ffff_ffff_ffff_ffff_ffff_ffff_ffff; if ( get_plus_arg(CHECK, "DO_PIO_TRANS") ) { be_msg.print(e_mesg_info, *, "test_class::init_cam_entries()", "Initializing CAM, Performing PIO Transactions to CAM_RAM.\n"); for (i=0;i