// ========== Copyright Header Begin ==========================================
// OpenSPARC T2 Processor File: bmac_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
// ========== Copyright Header End ============================================
#include <vera_defines.vrh>
#include "mac_defines.vri"
#include "bmac_memory_map.vri"
#include "pio_driver.vrh"
#include "mac_pio_class.vrh"
#include "xpcs_memory_map.vri"
extern mac_pio_cl mac_pio_class;
//extern pio_drv pio_driver_class;
extern bit reset_complete;
function bit check_cmd(bit [63:0]cmd, bit [63:0] opt);
task get_mac_debug_level(var integer mac_debug, var integer mac_quick,var integer mac_verbose );
task bmac_init(integer iport, bit [63:0] cmd);
task bmac_init_sub(integer iport, bit [63:0] cmd);
task tx_bmac_reset(integer iport, bit [39:0] base_addr, integer MAC_INIT_DEBUG);
task rx_bmac_reset(integer iport, bit [39:0] base_addr, integer MAC_INIT_DEBUG);
task init_all_reg(integer iport, bit[63:0] cmd, bit [39:0] base_addr);
task init_essential_reg_only(integer iport, bit[63:0] cmd, bit [39:0] base_addr);
task setup_reg(integer iport, bit[63:0] cmd, bit [39:0] addr, bit [31:0] data,bit [31:0] verify_mask);
task mac_pci_rd(bit [39:0] addr, var bit [31:0] exp_value);
task mac_pci_rd_cmp(bit [39:0] addr, bit [31:0] exp_value, bit [31:0] data_mask);
function bit[39:0] get_mac_reg_base(integer iport);
function bit[(16*12)-1:0] get_bmac_reg_name(integer id);
function bit[32:0] get_bmac_reg_adr(integer id);
function bit[32:0] bmac_reg_addr (integer sel);
function bit[31:0] bmac_reg_mask (integer sel);
function bit[31:0] bmac_reg_default (integer sel);
function integer flen(integer sel);
function integer flen_j(integer sel);
task set_host_info_1(integer mac_id,bit[31:0] ctrl_word);
task wr_ipp_mac_reg(integer mac_id,bit[39:0] addr, bit[31:0]wr_data);
task rd_ipp_mac_reg(integer mac_id,bit[39:0] addr, var bit[31:0]rd_data, bit compare);
task ipp_shadow_rd (bit[39:0] addr, var bit[31:0] rd_data,\
var bit[31:0] data_mask, var bit data_valid);
task rx_pkt_count_check(integer pkt_cnt);
task tx_pkt_count_check(integer pkt_cnt);
local function integer getPortID(bit [39:0] addr) {
task bmac_util_class::new() { }
function bit bmac_util_class :: check_cmd(bit [63:0]cmd, bit [63:0] opt){
if((cmd & opt) > 0) check_cmd=1;
task bmac_util_class::get_mac_debug_level(var integer mac_debug, var integer mac_quick, var integer mac_verbose) {
if( get_plus_arg( CHECK, "MAC_TEST_DEBUG") ) {
mac_debug = get_plus_arg(NUM, "MAC_TEST_DEBUG" );
mac_quick = get_plus_arg( CHECK, "MAC_QUICK_TEST");
mac_verbose = get_plus_arg( CHECK, "MAC_VERBOSE_TEST");
task bmac_util_class::bmac_init(integer iport, bit[63:0] cmd) {
integer mac_debug,mac_quick,mac_verbose;
get_mac_debug_level(mac_debug,mac_quick,mac_verbose);
MAC_INIT_DEBUG = check_cmd(cmd, MI_DEBUG) | mac_debug;
printf("bmac_init:MAC%0d Setting up registers\n", iport);
cmd[0] = 0; // RX_MAC_RESET
cmd[1] = 0; // TX_MAC_RESET
base_addr = get_mac_reg_base(iport);
//programming the PA size as not resetable by SW reset and so gate sims have a problem
setup_reg(iport, cmd, base_addr + MAC_PA_SIZE, 32'h0000_0007, 32'h0000_03ff );
if(check_cmd(cmd, MAC_CONF_1000)) data = 32'h0019;
if(check_cmd(cmd, MAC_CONF_100)) data = 32'h0091;
if(check_cmd(cmd, MAC_CONF_10)) data = 32'h0011;
data[1]=check_cmd(cmd, MAC_LOOPBACK);
//printf("bmac_init:MAC%0d Writing XIF_CONFIG Reg=0x%0h time=%0d\n", iport, data, get_time(LO));
setup_reg(iport, cmd, base_addr + MAC_XIF_CONFIG, data, 32'hffff_ffe6);
bmac_init_sub(iport, RX_MAC_RESET | TX_MAC_RESET | cmd);
setup_reg(iport, cmd, base_addr + BRxMAC_FRM_CNT, 32'h0000_0000, 32'h0000_ffff );
printf("bmac_init:MAC%0d DONE time=%0d\n", iport, get_time(LO));
task bmac_util_class::bmac_init_sub(integer iport, bit[63:0] cmd) {
bit [31:0] data, data1,data2, rx_data, tx_data;
integer mac_debug,mac_quick,mac_verbose;
get_mac_debug_level(mac_debug,mac_quick,mac_verbose);
base_addr = get_mac_reg_base(iport);
MAC_INIT_DEBUG = check_cmd(cmd,MI_DEBUG) | mac_debug;
if( check_cmd(cmd,TX_MAC_RESET) ) tx_bmac_reset(iport,base_addr,MAC_INIT_DEBUG);
if( check_cmd(cmd,RX_MAC_RESET) ) rx_bmac_reset(iport,base_addr,MAC_INIT_DEBUG);
//MAC COUNTERS INITIALIZE
if( check_cmd(cmd,MAC_INIT_ALL_REG) ) {
if (get_plus_arg(CHECK, "ESSENTIAL_PIO_WRITES_ONLY"))
init_essential_reg_only(iport, cmd, base_addr);
init_all_reg(iport, cmd, base_addr);
if( check_cmd(cmd,MAC_CONF_10) | check_cmd(cmd,MAC_CONF_100) | check_cmd(cmd,MAC_CONF_1000) ) {
if( check_cmd(cmd, MAC_SHORT_PKT) ) {
setup_reg(iport, cmd, base_addr + BMAC_MIN, {4'h0,8'h7,10'h40,10'h17}, 32'hffff_ffff);
setup_reg(iport, cmd, base_addr + BMAC_MAX, {2'h0, 14'h0,2'h0,14'h0024}, 32'hffff_ffff);
setup_reg(iport, cmd, base_addr + BMAC_MIN, {4'h0,8'h7,10'h40,10'h20}, 32'hffff_ffff);
if(get_plus_arg(CHECK,"JUMBO_FRAME_EN"))
setup_reg(iport, cmd, base_addr + BMAC_MAX, {2'h0,14'h0,2'h0,14'h3fff}, 32'hffff_ffff);
setup_reg(iport, cmd, base_addr + BMAC_MAX, {2'h0,14'h0,2'h0,14'h05EE}, 32'hffff_ffff);
setup_reg(iport, cmd, base_addr + BMAC_MIN, {4'h0,8'h7,10'h40,10'h20}, 32'hffff_ffff);
if(get_plus_arg(CHECK,"JUMBO_FRAME_EN"))
setup_reg(iport, cmd, base_addr + BMAC_MAX, {2'h0,14'h0,2'h0,14'h3FFF}, 32'hffff_ffff);
setup_reg(iport, cmd, base_addr + BMAC_MAX, {2'h0,14'h0,2'h0,14'h05EE}, 32'hffff_ffff);
setup_reg(iport, cmd, base_addr + TxMAC_CONFIG, data, 32'hffff_ffff);
printf("bmac_init:Waiting for MAC[%0d] Disable to complete ...\n",iport);
//mac_pci_rd(base_addr + TxMAC_CONFIG, data);
// while(data[0] == 1 ) {
// mac_pci_rd(base_addr + TxMAC_CONFIG, data);
data1[9] = get_plus_arg(CHECK, "RX_DROP_PKT_CHECK");
data1[7] = check_cmd(cmd, MAC_ER_CK_EN) ? 0 : 1;
setup_reg(iport, cmd, base_addr + RxMAC_CONFIG, data1,32'hffff_ffff);
//mac_pci_rd(base_addr + RxMAC_CONFIG, data1);
// while(data[0] == 1 ) {
// mac_pci_rd(base_addr + RxMAC_CONFIG, data1);
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
task bmac_util_class::tx_bmac_reset(integer iport, bit[39:0] base_addr, integer MAC_INIT_DEBUG) {
mac_pio_class.bmac_pio_wr(base_addr + BTxMAC_SW_RST, 32'h01);
printf("bmac_init:MAC%0d Writing BTxMAC_SW_RST=1 (%h)\n", iport, base_addr+BTxMAC_SW_RST);
printf("bmac_init:Waiting for TX MAC%0d to reset. time=%0d\n", iport, get_time(LO));
// Wait for Reset on TX Mac to complete
mac_pio_class.mac_pio_rd(base_addr + BTxMAC_SW_RST, tx_data);
mac_pio_class.mac_pio_rd(base_addr + BTxMAC_SW_RST, tx_data);
printf("bmac_init:TX MAC%0d reset complete.\n", iport);
task bmac_util_class::rx_bmac_reset(integer iport, bit[39:0] base_addr, integer MAC_INIT_DEBUG) {
// Assert Reset on RX Mac
mac_pio_class.bmac_pio_wr(base_addr + BRxMAC_SW_RST, 32'h01);
printf("bmac_init:MAC%0d Writing BRxMAC_SW_RST=1 (%h)\n", iport, base_addr+BRxMAC_SW_RST );
printf("bmac_init:Waiting for RX MAC%0d to reset. time=%0d\n", iport, get_time(LO));
// Wait for Reset on RX Mac to complete
mac_pio_class.mac_pio_rd(base_addr + BRxMAC_SW_RST, rx_data);
mac_pio_class.mac_pio_rd(base_addr + BRxMAC_SW_RST, rx_data);
printf("bmac_init:RX MAC%0d reset complete.\n", iport);
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
task bmac_util_class :: init_all_reg(integer iport, bit[63:0] cmd, bit [39:0] base_addr) {
setup_reg(iport, cmd, base_addr + BTxMAC_STAT_MSK, 32'h0000_01ff,32'hffff_ffff);
setup_reg(iport, cmd, base_addr + BRxMAC_STAT_MSK,32'h0000_00ff, 32'hffff_ffff);
setup_reg(iport, cmd, base_addr + BMAC_C_S_MSK, 32'hffff_fff7, 32'hffff_ffff);
setup_reg(iport, cmd, base_addr + MAC_SEND_PAUSE, 32'h0000_1BF0, 32'h000f_ffff );
setup_reg(iport, cmd, base_addr + BMAC_MIN, 32'h0000_0040, 32'h0000_03ff );
if(get_plus_arg(CHECK,"JUMBO_FRAME_EN"))
setup_reg(iport, cmd, base_addr + BMAC_MAX, 32'h2000_3FFF, 32'hffff_ffff );
setup_reg(iport, cmd, base_addr + BMAC_MAX, 32'h2000_05EE, 32'hffff_ffff );
setup_reg(iport, cmd, base_addr + MAC_PA_SIZE, 32'h0000_0007, 32'h0000_03ff );
setup_reg(iport, cmd, base_addr + MAC_CTRL_TYPE, 32'h0000_8808, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_IPG0, 32'h0000_0000, 32'h0000_00ff );
setup_reg(iport, cmd, base_addr + MAC_IPG1, 32'h0000_0008, 32'h0000_00ff );
setup_reg(iport, cmd, base_addr + MAC_IPG2, 32'h0000_0004, 32'h0000_00ff );
setup_reg(iport, cmd, base_addr + MAC_SLOT_TIME, 32'h0000_0040, 32'h0000_03ff );
setup_reg(iport, cmd, base_addr + MAC_JAM_SIZE, 32'h0000_0004, 32'h0000_001f );
setup_reg(iport, cmd, base_addr + MAC_ATTMPT_LMT, 32'h0000_0010, 32'h0000_00ff );
setup_reg(iport, cmd, base_addr + BMAC_COL_CNT, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + BMAC_OA_COL_CNT,32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + BMAC_EX_COL_CNT,32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + BMAC_LT_COL_CNT,32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_DEF_TIMER,32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + BMAC_ADDR0, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + BMAC_ADDR1, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + BMAC_ADDR2, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADDR3, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADDR4, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADDR5, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADDR6, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADDR7, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADDR8, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADDR9, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADDR10, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADDR11, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADDR12, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADDR13, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADDR14, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADDR15, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADDR16, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADDR17, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADDR18, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADDR19, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADDR20, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADDR21, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADDR22, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADDR23, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_FC_ADDR0, 32'h0000_0001, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_FC_ADDR1, 32'h0000_C200, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_FC_ADDR2, 32'h0000_0180, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADD_FILT0, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADD_FILT1, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADD_FILT2, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADD_FILT12_MASK, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADD_FILT00_MASK, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_HASH_TBL0, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_HASH_TBL1, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_HASH_TBL2, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_HASH_TBL3, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_HASH_TBL4, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_HASH_TBL5, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_HASH_TBL6, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_HASH_TBL7, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_HASH_TBL8, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_HASH_TBL9, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_HASH_TBL10, 32'h0000_0000,32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_HASH_TBL11, 32'h0000_0000,32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_HASH_TBL12, 32'h0000_0000,32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_HASH_TBL13, 32'h0000_0000,32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_HASH_TBL14, 32'h0000_0000,32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_HASH_TBL15, 32'h0000_0000,32'h0000_ffff );
setup_reg(iport, cmd, base_addr + BRxMAC_FRM_CNT, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_LEN_ER_CNT, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + BMAC_AL_ER_CNT, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + BMAC_CRC_ER_CNT, 32'h0000_0000, 32'h0000_00ff );
setup_reg(iport, cmd, base_addr + BMAC_CD_VIO_CNT, 32'h0000_0000, 32'h0000_00ff );
////////////////////////////////////////////////////////////////////////////////
// init_essential_reg_only Task
////////////////////////////////////////////////////////////////////////////////
task bmac_util_class :: init_essential_reg_only(integer iport, bit[63:0] cmd, bit [39:0] base_addr) {
setup_reg(iport, cmd, base_addr + BTxMAC_STAT_MSK, 32'h0000_01ff,32'hffff_ffff);
setup_reg(iport, cmd, base_addr + BRxMAC_STAT_MSK,32'h0000_00ff, 32'hffff_ffff);
setup_reg(iport, cmd, base_addr + BMAC_C_S_MSK, 32'hffff_fff7, 32'hffff_ffff);
setup_reg(iport, cmd, base_addr + MAC_SEND_PAUSE, 32'h0000_1BF0, 32'h000f_ffff );
setup_reg(iport, cmd, base_addr + BMAC_MIN, 32'h0000_0040, 32'h0000_03ff );
if(get_plus_arg(CHECK,"JUMBO_FRAME_EN"))
setup_reg(iport, cmd, base_addr + BMAC_MAX, 32'h2000_3FFF, 32'hffff_ffff );
setup_reg(iport, cmd, base_addr + BMAC_MAX, 32'h2000_05EE, 32'hffff_ffff );
setup_reg(iport, cmd, base_addr + MAC_PA_SIZE, 32'h0000_0007, 32'h0000_03ff );
setup_reg(iport, cmd, base_addr + MAC_CTRL_TYPE, 32'h0000_8808, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_IPG0, 32'h0000_0000, 32'h0000_00ff );
setup_reg(iport, cmd, base_addr + MAC_IPG1, 32'h0000_0008, 32'h0000_00ff );
setup_reg(iport, cmd, base_addr + MAC_IPG2, 32'h0000_0004, 32'h0000_00ff );
setup_reg(iport, cmd, base_addr + MAC_SLOT_TIME, 32'h0000_0040, 32'h0000_03ff );
setup_reg(iport, cmd, base_addr + MAC_JAM_SIZE, 32'h0000_0004, 32'h0000_001f );
setup_reg(iport, cmd, base_addr + MAC_ATTMPT_LMT, 32'h0000_0010, 32'h0000_00ff );
setup_reg(iport, cmd, base_addr + BMAC_COL_CNT, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + BMAC_OA_COL_CNT,32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + BMAC_EX_COL_CNT,32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + BMAC_LT_COL_CNT,32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_DEF_TIMER,32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_FC_ADDR0, 32'h0000_0001, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_FC_ADDR1, 32'h0000_C200, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_FC_ADDR2, 32'h0000_0180, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADD_FILT0, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADD_FILT1, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADD_FILT2, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADD_FILT12_MASK, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_ADD_FILT00_MASK, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + BRxMAC_FRM_CNT, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + MAC_LEN_ER_CNT, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + BMAC_AL_ER_CNT, 32'h0000_0000, 32'h0000_ffff );
setup_reg(iport, cmd, base_addr + BMAC_CRC_ER_CNT, 32'h0000_0000, 32'h0000_00ff );
setup_reg(iport, cmd, base_addr + BMAC_CD_VIO_CNT, 32'h0000_0000, 32'h0000_00ff );
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
task bmac_util_class :: setup_reg(integer iport, bit[63:0] cmd, bit [39:0] addr, bit [31:0] data, bit [31:0] verify_mask) {
if(check_cmd(cmd, MI_DEBUG))
printf("bmac_init:MAC%0d Writing %s Reg=0x%0h (%h) time=%0d\n", iport, get_bmac_reg_name(addr[11:0]), data, addr, get_time(LO));
mac_pio_class.bmac_pio_wr(addr, data);
if(check_cmd(cmd,MAC_REG_VERIFY)) { // This is just for basic SANITY testing
mac_pio_class.mac_pio_rd(addr, data2);
if((data & verify_mask) != (data2 & verify_mask))
printf("Error: bmac_init: Register Write Verify: Register %s (%h), Wrote: %h Read: %h Mask: %h\n",
get_bmac_reg_name(addr[11:0]),addr,data,data2,verify_mask);
task bmac_util_class :: set_host_info_1 (integer mac_id,bit[31:0] ctrl_word ) {
base_addr = get_mac_reg_base(mac_id);
if(get_plus_arg( CHECK, "RX_DROP_PKT_CHECK"))
mac_pio_class.bmac_pio_wr(base_addr + RxMAC_CONFIG, 32'h0000_0201);
mac_pio_class.bmac_pio_wr(base_addr + RxMAC_CONFIG, 32'h0000_0001);
mac_pio_class.bmac_pio_wr(base_addr + BMAC_ALTAD_CMPEN, 32'h0000_FFFF);
mac_pio_class.bmac_pio_wr(base_addr + BMAC_HOST_INF1, ctrl_word);
task bmac_util_class :: wr_ipp_mac_reg(integer mac_id, bit[39:0] addr, bit[31:0] wr_data) {
base_addr = get_mac_reg_base(mac_id);
mac_pio_class.bmac_pio_wr(base_addr + addr, wr_data);
task bmac_util_class :: rd_ipp_mac_reg(integer mac_id,bit[39:0] addr, \
var bit[31:0]rd_data, bit compare) {
base_addr = get_mac_reg_base(mac_id);
mac_pio_class.bmac_pio_rd(base_addr + addr, rd_data, compare);
task bmac_util_class :: ipp_shadow_rd (bit[39:0] addr, var bit[31:0] rd_data,\
var bit[31:0] data_mask, var bit data_valid) {
port_id = getPortID(addr);
mac_pio_class.mac_shadow_class[port_id].get_data(addr,rd_data,data_mask,data_valid);
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
task bmac_util_class :: mac_pci_rd(bit [39:0] addr, var bit [31:0] exp_value) {
semaphore_get(WAIT, mac_pio_class.pio_drv_mac.pio_access, 1);
mac_pio_class.pio_drv_mac.address = addr;
mac_pio_class.pio_drv_mac.rd_wr = 1'b1;
mac_pio_class.pio_drv_mac.cfg_access = 1'b0;
//pio_driver.exp_data = exp_value;
//pio_driver.data_mask = 0;
//pio_driver.data_mask = 32'hffff_ffff;
//pio_driver.exp_data_valid = 1'b1;
trigger(ONE_SHOT, mac_pio_class.pio_drv_mac.pio_start);
sync(ALL, mac_pio_class.pio_drv_mac.pio_complete);
exp_value = mac_pio_class.pio_drv_mac.rd_data;
semaphore_put(mac_pio_class.pio_drv_mac.pio_access, 1);
task bmac_util_class :: mac_pci_rd_cmp(bit [39:0] addr, bit [31:0] exp_value, bit [31:0] data_mask) {
semaphore_get(WAIT, mac_pio_class.pio_drv_mac.pio_access, 1);
mac_pio_class.pio_drv_mac.address = addr;
mac_pio_class.pio_drv_mac.rd_wr = 1'b1;
mac_pio_class.pio_drv_mac.cfg_access = 1'b0;
//pio_driver_class.exp_data = exp_value;
//pio_driver_class.data_mask = data_mask;
//pio_driver_class.exp_data_valid = 1'b1;
trigger(ONE_SHOT, mac_pio_class.pio_drv_mac.pio_start);
sync(ALL, mac_pio_class.pio_drv_mac.pio_complete);
if ((pio_driver.rd_data & pio_driver.data_mask) !== (pio_driver.exp_data & pio_driver.data_mask)) {
printf("Error: Register %s (%h) data mismatch: \n",get_bmac_reg_name(addr[11:0]),addr);
printf(" Expected: %h Got: %h Mask: %h\n",pio_driver.exp_data,
pio_driver.rd_data, pio_driver.data_mask);
semaphore_put(mac_pio_class.pio_drv_mac.pio_access, 1);
function bit[39:0] bmac_util_class :: get_mac_reg_base(integer iport) {
0: get_mac_reg_base = MAC0_BASE;
1: get_mac_reg_base = MAC1_BASE;
2: get_mac_reg_base = MAC2_BASE;
3: get_mac_reg_base = MAC3_BASE;
default: error("Error: Invalid PORT (%0d) for get_mac_reg_base task.\n",iport);
function bit[(16*12)-1:0] bmac_util_class :: get_bmac_reg_name(integer id) {
BTxMAC_SW_RST: get_bmac_reg_name = "BTxMAC_SW_RST";
BRxMAC_SW_RST: get_bmac_reg_name = "BRxMAC_SW_RST";
MAC_SEND_PAUSE: get_bmac_reg_name = "MAC_SEND_PAUSE";
BTxMAC_STATUS: get_bmac_reg_name = "BTxMAC_STATUS";
BRxMAC_STATUS: get_bmac_reg_name = "BRxMAC_STATUS";
BMAC_CTRL_STAT: get_bmac_reg_name = "BMAC_CTRL_STAT";
BTxMAC_STAT_MSK: get_bmac_reg_name = "BTxMAC_STAT_MSK";
BRxMAC_STAT_MSK: get_bmac_reg_name = "BRxMAC_STAT_MSK";
BMAC_C_S_MSK: get_bmac_reg_name = "BMAC_C_S_MSK";
TxMAC_CONFIG: get_bmac_reg_name = "TxMAC_CONFIG";
RxMAC_CONFIG: get_bmac_reg_name = "RxMAC_CONFIG";
MAC_CTRL_CONFIG: get_bmac_reg_name = "MAC_CTRL_CONFIG";
MAC_XIF_CONFIG: get_bmac_reg_name = "MAC_XIF_CONFIG";
MAC_IPG0: get_bmac_reg_name = "MAC_IPG0";
MAC_IPG1: get_bmac_reg_name = "MAC_IPG1";
MAC_IPG2: get_bmac_reg_name = "MAC_IPG2";
MAC_SLOT_TIME: get_bmac_reg_name = "MAC_SLOT_TIME";
BMAC_MIN: get_bmac_reg_name = "BMAC_MIN";
BMAC_MAX: get_bmac_reg_name = "BMAC_MAX";
MAC_PA_SIZE: get_bmac_reg_name = "MAC_PA_SIZE";
MAC_JAM_SIZE: get_bmac_reg_name = "MAC_JAM_SIZE";
MAC_ATTMPT_LMT: get_bmac_reg_name = "MAC_ATTMPT_LMT";
MAC_CTRL_TYPE: get_bmac_reg_name = "MAC_CTRL_TYPE";
BMAC_ADDR0: get_bmac_reg_name = "BMAC_ADDR0";
BMAC_ADDR1: get_bmac_reg_name = "BMAC_ADDR1";
BMAC_ADDR2: get_bmac_reg_name = "BMAC_ADDR2";
MAC_ADDR3: get_bmac_reg_name = "MAC_ADDR3";
MAC_ADDR4: get_bmac_reg_name = "MAC_ADDR4";
MAC_ADDR5: get_bmac_reg_name = "MAC_ADDR5";
MAC_ADDR6: get_bmac_reg_name = "MAC_ADDR6";
MAC_ADDR7: get_bmac_reg_name = "MAC_ADDR7";
MAC_ADDR8: get_bmac_reg_name = "MAC_ADDR8";
MAC_ADDR9: get_bmac_reg_name = "MAC_ADDR9";
MAC_ADDR10: get_bmac_reg_name = "MAC_ADDR10";
MAC_ADDR11: get_bmac_reg_name = "MAC_ADDR11";
MAC_ADDR12: get_bmac_reg_name = "MAC_ADDR12";
MAC_ADDR13: get_bmac_reg_name = "MAC_ADDR13";
MAC_ADDR14: get_bmac_reg_name = "MAC_ADDR14";
MAC_ADDR15: get_bmac_reg_name = "MAC_ADDR15";
MAC_ADDR16: get_bmac_reg_name = "MAC_ADDR16";
MAC_ADDR17: get_bmac_reg_name = "MAC_ADDR17";
MAC_ADDR18: get_bmac_reg_name = "MAC_ADDR18";
MAC_ADDR19: get_bmac_reg_name = "MAC_ADDR19";
MAC_ADDR20: get_bmac_reg_name = "MAC_ADDR20";
MAC_ADDR21: get_bmac_reg_name = "MAC_ADDR21";
MAC_ADDR22: get_bmac_reg_name = "MAC_ADDR22";
MAC_ADDR23: get_bmac_reg_name = "MAC_ADDR23";
MAC_ADDR24: get_bmac_reg_name = "MAC_ADDR24";
MAC_ADDR25: get_bmac_reg_name = "MAC_ADDR25";
MAC_ADDR26: get_bmac_reg_name = "MAC_ADDR26";
MAC_ADDR27: get_bmac_reg_name = "MAC_ADDR27";
MAC_ADDR28: get_bmac_reg_name = "MAC_ADDR28";
MAC_ADDR29: get_bmac_reg_name = "MAC_ADDR29";
MAC_ADDR30: get_bmac_reg_name = "MAC_ADDR30";
MAC_ADDR31: get_bmac_reg_name = "MAC_ADDR31";
MAC_ADDR32: get_bmac_reg_name = "MAC_ADDR32";
MAC_ADDR33: get_bmac_reg_name = "MAC_ADDR33";
MAC_ADDR34: get_bmac_reg_name = "MAC_ADDR34";
MAC_ADDR35: get_bmac_reg_name = "MAC_ADDR35";
MAC_ADDR36: get_bmac_reg_name = "MAC_ADDR36";
MAC_ADDR37: get_bmac_reg_name = "MAC_ADDR37";
MAC_ADDR38: get_bmac_reg_name = "MAC_ADDR38";
MAC_ADDR39: get_bmac_reg_name = "MAC_ADDR39";
MAC_ADDR40: get_bmac_reg_name = "MAC_ADDR40";
MAC_ADDR41: get_bmac_reg_name = "MAC_ADDR41";
MAC_ADDR42: get_bmac_reg_name = "MAC_ADDR42";
MAC_ADDR43: get_bmac_reg_name = "MAC_ADDR43";
MAC_ADDR44: get_bmac_reg_name = "MAC_ADDR44";
MAC_FC_ADDR0: get_bmac_reg_name = "MAC_FC_ADDR0";
MAC_FC_ADDR1: get_bmac_reg_name = "MAC_FC_ADDR1";
MAC_FC_ADDR2: get_bmac_reg_name = "MAC_FC_ADDR2";
MAC_ADD_FILT0: get_bmac_reg_name = "MAC_ADD_FILT0";
MAC_ADD_FILT1: get_bmac_reg_name = "MAC_ADD_FILT1";
MAC_ADD_FILT2: get_bmac_reg_name = "MAC_ADD_FILT2";
MAC_ADD_FILT12_MASK: get_bmac_reg_name = "MAC_ADD_FILT12_MASK";
MAC_ADD_FILT00_MASK: get_bmac_reg_name = "MAC_ADD_FILT00_MASK";
MAC_HASH_TBL0: get_bmac_reg_name = "MAC_HASH_TBL0";
MAC_HASH_TBL1: get_bmac_reg_name = "MAC_HASH_TBL1";
MAC_HASH_TBL2: get_bmac_reg_name = "MAC_HASH_TBL2";
MAC_HASH_TBL3: get_bmac_reg_name = "MAC_HASH_TBL3";
MAC_HASH_TBL4: get_bmac_reg_name = "MAC_HASH_TBL4";
MAC_HASH_TBL5: get_bmac_reg_name = "MAC_HASH_TBL5";
MAC_HASH_TBL6: get_bmac_reg_name = "MAC_HASH_TBL6";
MAC_HASH_TBL7: get_bmac_reg_name = "MAC_HASH_TBL7";
MAC_HASH_TBL8: get_bmac_reg_name = "MAC_HASH_TBL8";
MAC_HASH_TBL9: get_bmac_reg_name = "MAC_HASH_TBL9";
MAC_HASH_TBL10: get_bmac_reg_name = "MAC_HASH_TBL10";
MAC_HASH_TBL11: get_bmac_reg_name = "MAC_HASH_TBL11";
MAC_HASH_TBL12: get_bmac_reg_name = "MAC_HASH_TBL12";
MAC_HASH_TBL13: get_bmac_reg_name = "MAC_HASH_TBL13";
MAC_HASH_TBL14: get_bmac_reg_name = "MAC_HASH_TBL14";
MAC_HASH_TBL15: get_bmac_reg_name = "MAC_HASH_TBL15";
BMAC_COL_CNT: get_bmac_reg_name = "BMAC_COL_CNT";
BMAC_OA_COL_CNT: get_bmac_reg_name = "BMAC_OA_COL_CNT";
BMAC_EX_COL_CNT: get_bmac_reg_name = "BMAC_EX_COL_CNT";
BMAC_LT_COL_CNT: get_bmac_reg_name = "BMAC_LT_COL_CNT";
MAC_DEF_TIMER: get_bmac_reg_name = "MAC_DEF_TIMER";
BMAC_PK_ATT_CNT: get_bmac_reg_name = "BMAC_PK_ATT_CNT";
BRxMAC_FRM_CNT: get_bmac_reg_name = "BRxMAC_FRM_CNT";
MAC_LEN_ER_CNT: get_bmac_reg_name = "MAC_LEN_ER_CNT";
BMAC_AL_ER_CNT: get_bmac_reg_name = "BMAC_AL_ER_CNT";
BMAC_CRC_ER_CNT: get_bmac_reg_name = "BMAC_CRC_ER_CNT";
BMAC_CD_VIO_CNT: get_bmac_reg_name = "BMAC_CD_VIO_CNT";
MAC_RND_SEED: get_bmac_reg_name = "MAC_RND_SEED";
BMAC_SM_REG: get_bmac_reg_name = "BMAC_SM_REG";
BMAC_ALTAD_CMPEN: get_bmac_reg_name = "BMAC_ALTAD_CMPEN";
BMAC_HOST_INFO: get_bmac_reg_name = "BMAC_HOST_INFO";
BMAC_HOST_INF1: get_bmac_reg_name = "BMAC_HOST_INF1";
BMAC_HOST_INF2: get_bmac_reg_name = "BMAC_HOST_INF2";
BMAC_HOST_INF3: get_bmac_reg_name = "BMAC_HOST_INF3";
BMAC_HOST_INF4: get_bmac_reg_name = "BMAC_HOST_INF4";
BMAC_HOST_INF5: get_bmac_reg_name = "BMAC_HOST_INF5";
BMAC_HOST_INF6: get_bmac_reg_name = "BMAC_HOST_INF6";
BMAC_HOST_INF7: get_bmac_reg_name = "BMAC_HOST_INF7";
BTxMAC_BYTE_CNT: get_bmac_reg_name = "BTxMAC_BYTE_CNT";
BTxMAC_FRM_CNT: get_bmac_reg_name = "BTxMAC_FRM_CNT";
BRxMAC_BYTE_CNT: get_bmac_reg_name = "BRxMAC_BYTE_CNT";
function bit[32:0] bmac_util_class :: get_bmac_reg_adr(integer id) {
0: get_bmac_reg_adr = BTxMAC_SW_RST;
1: get_bmac_reg_adr = BRxMAC_SW_RST;
2: get_bmac_reg_adr = MAC_SEND_PAUSE;
//3: get_bmac_reg_adr = BTxMAC_STATUS;
//4: get_bmac_reg_adr = BRxMAC_STATUS;
//5: get_bmac_reg_adr = BMAC_CTRL_STAT;
3: get_bmac_reg_adr = BTxMAC_STAT_MSK;
4: get_bmac_reg_adr = BRxMAC_STAT_MSK;
5: get_bmac_reg_adr = BMAC_C_S_MSK;
6: get_bmac_reg_adr = TxMAC_CONFIG;
7: get_bmac_reg_adr = RxMAC_CONFIG;
8: get_bmac_reg_adr = MAC_CTRL_CONFIG;
9: get_bmac_reg_adr = MAC_XIF_CONFIG;
10: get_bmac_reg_adr = MAC_IPG0;
11: get_bmac_reg_adr = MAC_IPG1;
12: get_bmac_reg_adr = MAC_IPG2;
13: get_bmac_reg_adr = MAC_SLOT_TIME;
14: get_bmac_reg_adr = BMAC_MIN;
15: get_bmac_reg_adr = BMAC_MAX;
16: get_bmac_reg_adr = MAC_PA_SIZE;
17: get_bmac_reg_adr = MAC_JAM_SIZE;
18: get_bmac_reg_adr = MAC_ATTMPT_LMT;
19: get_bmac_reg_adr = MAC_CTRL_TYPE;
20: get_bmac_reg_adr = BMAC_ADDR0;
21: get_bmac_reg_adr = BMAC_ADDR1;
22: get_bmac_reg_adr = BMAC_ADDR2;
23: get_bmac_reg_adr = MAC_ADDR3;
24: get_bmac_reg_adr = MAC_ADDR4;
25: get_bmac_reg_adr = MAC_ADDR5;
26: get_bmac_reg_adr = MAC_ADDR6;
27: get_bmac_reg_adr = MAC_ADDR7;
28: get_bmac_reg_adr = MAC_ADDR8;
29: get_bmac_reg_adr = MAC_ADDR9;
30: get_bmac_reg_adr = MAC_ADDR10;
31: get_bmac_reg_adr = MAC_ADDR11;
32: get_bmac_reg_adr = MAC_ADDR12;
33: get_bmac_reg_adr = MAC_ADDR13;
34: get_bmac_reg_adr = MAC_ADDR14;
35: get_bmac_reg_adr = MAC_ADDR15;
36: get_bmac_reg_adr = MAC_ADDR16;
37: get_bmac_reg_adr = MAC_ADDR17;
38: get_bmac_reg_adr = MAC_ADDR18;
39: get_bmac_reg_adr = MAC_ADDR19;
40: get_bmac_reg_adr = MAC_ADDR20;
41: get_bmac_reg_adr = MAC_ADDR21;
42: get_bmac_reg_adr = MAC_ADDR22;
43: get_bmac_reg_adr = MAC_ADDR23;
44: get_bmac_reg_adr = MAC_ADDR24;
45: get_bmac_reg_adr = MAC_ADDR25;
46: get_bmac_reg_adr = MAC_ADDR26;
47: get_bmac_reg_adr = MAC_ADDR27;
48: get_bmac_reg_adr = MAC_ADDR28;
49: get_bmac_reg_adr = MAC_ADDR29;
50: get_bmac_reg_adr = MAC_ADDR30;
51: get_bmac_reg_adr = MAC_ADDR31;
52: get_bmac_reg_adr = MAC_ADDR32;
53: get_bmac_reg_adr = MAC_ADDR33;
54: get_bmac_reg_adr = MAC_ADDR34;
55: get_bmac_reg_adr = MAC_ADDR35;
56: get_bmac_reg_adr = MAC_ADDR36;
57: get_bmac_reg_adr = MAC_ADDR37;
58: get_bmac_reg_adr = MAC_ADDR38;
59: get_bmac_reg_adr = MAC_ADDR39;
60: get_bmac_reg_adr = MAC_ADDR40;
61: get_bmac_reg_adr = MAC_ADDR41;
62: get_bmac_reg_adr = MAC_ADDR42;
63: get_bmac_reg_adr = MAC_ADDR43;
64: get_bmac_reg_adr = MAC_ADDR44;
65: get_bmac_reg_adr = MAC_FC_ADDR0;
66: get_bmac_reg_adr = MAC_FC_ADDR1;
67: get_bmac_reg_adr = MAC_FC_ADDR2;
68: get_bmac_reg_adr = MAC_ADD_FILT0;
69: get_bmac_reg_adr = MAC_ADD_FILT1;
70: get_bmac_reg_adr = MAC_ADD_FILT2;
71: get_bmac_reg_adr = MAC_ADD_FILT12_MASK;
72: get_bmac_reg_adr = MAC_ADD_FILT00_MASK;
73: get_bmac_reg_adr = MAC_HASH_TBL0;
74: get_bmac_reg_adr = MAC_HASH_TBL1;
75: get_bmac_reg_adr = MAC_HASH_TBL2;
76: get_bmac_reg_adr = MAC_HASH_TBL3;
77: get_bmac_reg_adr = MAC_HASH_TBL4;
78: get_bmac_reg_adr = MAC_HASH_TBL5;
79: get_bmac_reg_adr = MAC_HASH_TBL6;
80: get_bmac_reg_adr = MAC_HASH_TBL7;
81: get_bmac_reg_adr = MAC_HASH_TBL8;
82: get_bmac_reg_adr = MAC_HASH_TBL9;
83: get_bmac_reg_adr = MAC_HASH_TBL10;
84: get_bmac_reg_adr = MAC_HASH_TBL11;
85: get_bmac_reg_adr = MAC_HASH_TBL12;
86: get_bmac_reg_adr = MAC_HASH_TBL13;
87: get_bmac_reg_adr = MAC_HASH_TBL14;
88: get_bmac_reg_adr = MAC_HASH_TBL15;
89: get_bmac_reg_adr = BMAC_COL_CNT;
90: get_bmac_reg_adr = BMAC_OA_COL_CNT;
91: get_bmac_reg_adr = BMAC_EX_COL_CNT;
92: get_bmac_reg_adr = BMAC_LT_COL_CNT;
93: get_bmac_reg_adr = MAC_DEF_TIMER;
//97: get_bmac_reg_adr = BMAC_PK_ATT_CNT;
94: get_bmac_reg_adr = BRxMAC_FRM_CNT;
95: get_bmac_reg_adr = MAC_LEN_ER_CNT;
96: get_bmac_reg_adr = BMAC_AL_ER_CNT;
97: get_bmac_reg_adr = BMAC_CRC_ER_CNT;
98: get_bmac_reg_adr = BMAC_CD_VIO_CNT;
99: get_bmac_reg_adr = MAC_RND_SEED;
//104: get_bmac_reg_adr = BMAC_SM_REG;
100: get_bmac_reg_adr = BMAC_ALTAD_CMPEN;
101: get_bmac_reg_adr = BMAC_HOST_INFO;
102: get_bmac_reg_adr = BMAC_HOST_INF1;
103: get_bmac_reg_adr = BMAC_HOST_INF2;
104: get_bmac_reg_adr = BMAC_HOST_INF3;
105: get_bmac_reg_adr = BMAC_HOST_INF4;
106: get_bmac_reg_adr = BMAC_HOST_INF5;
107: get_bmac_reg_adr = BMAC_HOST_INF6;
108: get_bmac_reg_adr = BMAC_HOST_INF7;
109: get_bmac_reg_adr = BTxMAC_BYTE_CNT;
110: get_bmac_reg_adr = BTxMAC_FRM_CNT;
111: get_bmac_reg_adr = BRxMAC_BYTE_CNT;
112: get_bmac_reg_adr = BMAC_SM_REG;
default: error("Error: Invalid register ID (%0d) for get_bmac_reg_adr.\n",id);
function bit[32:0] bmac_util_class :: bmac_reg_addr (integer sel) {
m = (sel-n) / BMAC_TOTAL_REGS;
base_addr = get_mac_reg_base(m);
bmac_reg_addr = base_addr + get_bmac_reg_adr(n);
function bit[31:0] bmac_util_class :: bmac_reg_mask (integer sel) {
0: bmac_reg_mask = BTxMAC_SW_RST_MASK;
1: bmac_reg_mask = BRxMAC_SW_RST_MASK;
2: bmac_reg_mask = MAC_SEND_PAUSE_MASK;
// 3: bmac_reg_mask = BTxMAC_STATUS_MASK;
// 4: bmac_reg_mask = BRxMAC_STATUS_MASK;
//5: bmac_reg_mask = BMAC_CTRL_STAT_MASK;
3: bmac_reg_mask = BTxMAC_STAT_MSK_MASK;
4: bmac_reg_mask = BRxMAC_STAT_MSK_MASK;
5: bmac_reg_mask = BMAC_C_S_MSK_MASK;
6: bmac_reg_mask = TxMAC_CONFIG_MASK;
7: bmac_reg_mask = RxMAC_CONFIG_MASK;
8: bmac_reg_mask = MAC_CTRL_CONFIG_MASK;
9: bmac_reg_mask = MAC_XIF_CONFIG_MASK;
10: bmac_reg_mask = MAC_IPG0_MASK;
11: bmac_reg_mask = MAC_IPG1_MASK;
12: bmac_reg_mask = MAC_IPG2_MASK;
13: bmac_reg_mask = MAC_SLOT_TIME_MASK;
14: bmac_reg_mask = BMAC_MIN_MASK;
15: bmac_reg_mask = BMAC_MAX_MASK;
16: bmac_reg_mask = MAC_PA_SIZE_MASK;
17: bmac_reg_mask = MAC_JAM_SIZE_MASK;
18: bmac_reg_mask = MAC_ATTMPT_LMT_MASK;
19: bmac_reg_mask = MAC_CTRL_TYPE_MASK;
20: bmac_reg_mask = BMAC_ADDR0_MASK;
21: bmac_reg_mask = BMAC_ADDR1_MASK;
22: bmac_reg_mask = BMAC_ADDR2_MASK;
23: bmac_reg_mask = MAC_ADDR3_MASK;
24: bmac_reg_mask = MAC_ADDR4_MASK;
25: bmac_reg_mask = MAC_ADDR5_MASK;
26: bmac_reg_mask = MAC_ADDR6_MASK;
27: bmac_reg_mask = MAC_ADDR7_MASK;
28: bmac_reg_mask = MAC_ADDR8_MASK;
29: bmac_reg_mask = MAC_ADDR9_MASK;
30: bmac_reg_mask = MAC_ADDR10_MASK;
31: bmac_reg_mask = MAC_ADDR11_MASK;
32: bmac_reg_mask = MAC_ADDR12_MASK;
33: bmac_reg_mask = MAC_ADDR13_MASK;
34: bmac_reg_mask = MAC_ADDR14_MASK;
35: bmac_reg_mask = MAC_ADDR15_MASK;
36: bmac_reg_mask = MAC_ADDR16_MASK;
37: bmac_reg_mask = MAC_ADDR17_MASK;
38: bmac_reg_mask = MAC_ADDR18_MASK;
39: bmac_reg_mask = MAC_ADDR19_MASK;
40: bmac_reg_mask = MAC_ADDR20_MASK;
41: bmac_reg_mask = MAC_ADDR21_MASK;
42: bmac_reg_mask = MAC_ADDR22_MASK;
43: bmac_reg_mask = MAC_ADDR23_MASK;
44: bmac_reg_mask = MAC_ADDR24_MASK;
45: bmac_reg_mask = MAC_ADDR25_MASK;
46: bmac_reg_mask = MAC_ADDR26_MASK;
47: bmac_reg_mask = MAC_ADDR27_MASK;
48: bmac_reg_mask = MAC_ADDR28_MASK;
49: bmac_reg_mask = MAC_ADDR29_MASK;
50: bmac_reg_mask = MAC_ADDR30_MASK;
51: bmac_reg_mask = MAC_ADDR31_MASK;
52: bmac_reg_mask = MAC_ADDR32_MASK;
53: bmac_reg_mask = MAC_ADDR33_MASK;
54: bmac_reg_mask = MAC_ADDR34_MASK;
55: bmac_reg_mask = MAC_ADDR35_MASK;
56: bmac_reg_mask = MAC_ADDR36_MASK;
57: bmac_reg_mask = MAC_ADDR37_MASK;
58: bmac_reg_mask = MAC_ADDR38_MASK;
59: bmac_reg_mask = MAC_ADDR39_MASK;
60: bmac_reg_mask = MAC_ADDR40_MASK;
61: bmac_reg_mask = MAC_ADDR41_MASK;
62: bmac_reg_mask = MAC_ADDR42_MASK;
63: bmac_reg_mask = MAC_ADDR43_MASK;
64: bmac_reg_mask = MAC_ADDR44_MASK;
65: bmac_reg_mask = MAC_FC_ADDR0_MASK;
66: bmac_reg_mask = MAC_FC_ADDR1_MASK;
67: bmac_reg_mask = MAC_FC_ADDR2_MASK;
68: bmac_reg_mask = MAC_ADD_FILT0_MASK;
69: bmac_reg_mask = MAC_ADD_FILT1_MASK;
70: bmac_reg_mask = MAC_ADD_FILT2_MASK;
71: bmac_reg_mask = MAC_ADD_FILT12_MASK_MASK;
72: bmac_reg_mask = MAC_ADD_FILT00_MASK_MASK;
73: bmac_reg_mask = MAC_HASH_TBL0_MASK;
74: bmac_reg_mask = MAC_HASH_TBL1_MASK;
75: bmac_reg_mask = MAC_HASH_TBL2_MASK;
76: bmac_reg_mask = MAC_HASH_TBL3_MASK;
77: bmac_reg_mask = MAC_HASH_TBL4_MASK;
78: bmac_reg_mask = MAC_HASH_TBL5_MASK;
79: bmac_reg_mask = MAC_HASH_TBL6_MASK;
80: bmac_reg_mask = MAC_HASH_TBL7_MASK;
81: bmac_reg_mask = MAC_HASH_TBL8_MASK;
82: bmac_reg_mask = MAC_HASH_TBL9_MASK;
83: bmac_reg_mask = MAC_HASH_TBL10_MASK;
84: bmac_reg_mask = MAC_HASH_TBL11_MASK;
85: bmac_reg_mask = MAC_HASH_TBL12_MASK;
86: bmac_reg_mask = MAC_HASH_TBL13_MASK;
87: bmac_reg_mask = MAC_HASH_TBL14_MASK;
88: bmac_reg_mask = MAC_HASH_TBL15_MASK;
89: bmac_reg_mask = BMAC_COL_CNT_MASK;
90: bmac_reg_mask = BMAC_OA_COL_CNT_MASK;
91: bmac_reg_mask = BMAC_EX_COL_CNT_MASK;
92: bmac_reg_mask = BMAC_LT_COL_CNT_MASK;
93: bmac_reg_mask = MAC_DEF_TIMER_MASK;
//94: bmac_reg_mask = BMAC_PK_ATT_CNT_MASK;
94: bmac_reg_mask = BRxMAC_FRM_CNT_MASK;
95: bmac_reg_mask = MAC_LEN_ER_CNT_MASK;
96: bmac_reg_mask = BMAC_AL_ER_CNT_MASK;
97: bmac_reg_mask = BMAC_CRC_ER_CNT_MASK;
98: bmac_reg_mask = BMAC_CD_VIO_CNT_MASK;
99: bmac_reg_mask = MAC_RND_SEED_MASK;
//104: bmac_reg_mask = BMAC_SM_REG_MASK;
100: bmac_reg_mask = BMAC_ALTAD_CMPEN_MASK;
101: bmac_reg_mask = BMAC_HOST_INFO0_MASK;
102: bmac_reg_mask = BMAC_HOST_INFO1_MASK;
103: bmac_reg_mask = BMAC_HOST_INFO2_MASK;
104: bmac_reg_mask = BMAC_HOST_INFO3_MASK;
105: bmac_reg_mask = BMAC_HOST_INFO4_MASK;
106: bmac_reg_mask = BMAC_HOST_INFO5_MASK;
107: bmac_reg_mask = BMAC_HOST_INFO6_MASK;
108: bmac_reg_mask = BMAC_HOST_INFO7_MASK;
109: bmac_reg_mask = BTxMAC_BYTE_CNT_MASK;
110: bmac_reg_mask = BTxMAC_FRM_CNT_MASK;
111: bmac_reg_mask = BRxMAC_BYTE_CNT_MASK;
112: bmac_reg_mask = BMAC_SM_REG_MASK;
function bit[31:0] bmac_util_class :: bmac_reg_default (integer sel) {
0: bmac_reg_default = BTxMAC_SW_RST_DEFAULT;
1: bmac_reg_default = BRxMAC_SW_RST_DEFAULT;
2: bmac_reg_default = MAC_SEND_PAUSE_DEFAULT;
//3: bmac_reg_default = BTxMAC_STATUS_DEFAULT;
//4: bmac_reg_default = BRxMAC_STATUS_DEFAULT;
//5: bmac_reg_default = BMAC_CTRL_STAT_DEFAULT;
3: bmac_reg_default = BTxMAC_STAT_MSK_DEFAULT;
4: bmac_reg_default = BRxMAC_STAT_MSK_DEFAULT;
5: bmac_reg_default = BMAC_C_S_MSK_DEFAULT;
6: bmac_reg_default = TxMAC_CONFIG_DEFAULT;
7: bmac_reg_default = RxMAC_CONFIG_DEFAULT;
8: bmac_reg_default = MAC_CTRL_CONFIG_DEFAULT;
9: bmac_reg_default = MAC_XIF_CONFIG_DEFAULT;
10: bmac_reg_default = MAC_IPG0_DEFAULT;
11: bmac_reg_default = MAC_IPG1_DEFAULT;
12: bmac_reg_default = MAC_IPG2_DEFAULT;
13: bmac_reg_default = MAC_SLOT_TIME_DEFAULT;
14: bmac_reg_default = BMAC_MIN_DEFAULT;
15: bmac_reg_default = BMAC_MAX_DEFAULT;
16: bmac_reg_default = MAC_PA_SIZE_DEFAULT;
17: bmac_reg_default = MAC_JAM_SIZE_DEFAULT;
18: bmac_reg_default = MAC_ATTMPT_LMT_DEFAULT;
19: bmac_reg_default = MAC_CTRL_TYPE_DEFAULT;
20: bmac_reg_default = BMAC_ADDR0_DEFAULT;
21: bmac_reg_default = BMAC_ADDR1_DEFAULT;
22: bmac_reg_default = BMAC_ADDR2_DEFAULT;
23: bmac_reg_default = MAC_ADDR3_DEFAULT;
24: bmac_reg_default = MAC_ADDR4_DEFAULT;
25: bmac_reg_default = MAC_ADDR5_DEFAULT;
26: bmac_reg_default = MAC_ADDR6_DEFAULT;
27: bmac_reg_default = MAC_ADDR7_DEFAULT;
28: bmac_reg_default = MAC_ADDR8_DEFAULT;
29: bmac_reg_default = MAC_ADDR9_DEFAULT;
30: bmac_reg_default = MAC_ADDR10_DEFAULT;
31: bmac_reg_default = MAC_ADDR11_DEFAULT;
32: bmac_reg_default = MAC_ADDR12_DEFAULT;
33: bmac_reg_default = MAC_ADDR13_DEFAULT;
34: bmac_reg_default = MAC_ADDR14_DEFAULT;
35: bmac_reg_default = MAC_ADDR15_DEFAULT;
36: bmac_reg_default = MAC_ADDR16_DEFAULT;
37: bmac_reg_default = MAC_ADDR17_DEFAULT;
38: bmac_reg_default = MAC_ADDR18_DEFAULT;
39: bmac_reg_default = MAC_ADDR19_DEFAULT;
40: bmac_reg_default = MAC_ADDR20_DEFAULT;
41: bmac_reg_default = MAC_ADDR21_DEFAULT;
42: bmac_reg_default = MAC_ADDR22_DEFAULT;
43: bmac_reg_default = MAC_ADDR23_DEFAULT;
44: bmac_reg_default = MAC_ADDR24_DEFAULT;
45: bmac_reg_default = MAC_ADDR25_DEFAULT;
46: bmac_reg_default = MAC_ADDR26_DEFAULT;
47: bmac_reg_default = MAC_ADDR27_DEFAULT;
48: bmac_reg_default = MAC_ADDR28_DEFAULT;
49: bmac_reg_default = MAC_ADDR29_DEFAULT;
50: bmac_reg_default = MAC_ADDR30_DEFAULT;
51: bmac_reg_default = MAC_ADDR31_DEFAULT;
52: bmac_reg_default = MAC_ADDR32_DEFAULT;
53: bmac_reg_default = MAC_ADDR33_DEFAULT;
54: bmac_reg_default = MAC_ADDR34_DEFAULT;
55: bmac_reg_default = MAC_ADDR35_DEFAULT;
56: bmac_reg_default = MAC_ADDR36_DEFAULT;
57: bmac_reg_default = MAC_ADDR37_DEFAULT;
58: bmac_reg_default = MAC_ADDR38_DEFAULT;
59: bmac_reg_default = MAC_ADDR39_DEFAULT;
60: bmac_reg_default = MAC_ADDR40_DEFAULT;
61: bmac_reg_default = MAC_ADDR41_DEFAULT;
62: bmac_reg_default = MAC_ADDR42_DEFAULT;
63: bmac_reg_default = MAC_ADDR43_DEFAULT;
64: bmac_reg_default = MAC_ADDR44_DEFAULT;
65: bmac_reg_default = MAC_FC_ADDR0_DEFAULT;
66: bmac_reg_default = MAC_FC_ADDR1_DEFAULT;
67: bmac_reg_default = MAC_FC_ADDR2_DEFAULT;
68: bmac_reg_default = MAC_ADD_FILT0_DEFAULT;
69: bmac_reg_default = MAC_ADD_FILT1_DEFAULT;
70: bmac_reg_default = MAC_ADD_FILT2_DEFAULT;
71: bmac_reg_default = MAC_ADD_FILT12_MASK_DEFAULT;
72: bmac_reg_default = MAC_ADD_FILT00_MASK_DEFAULT;
73: bmac_reg_default = MAC_HASH_TBL0_DEFAULT;
74: bmac_reg_default = MAC_HASH_TBL1_DEFAULT;
75: bmac_reg_default = MAC_HASH_TBL2_DEFAULT;
76: bmac_reg_default = MAC_HASH_TBL3_DEFAULT;
77: bmac_reg_default = MAC_HASH_TBL4_DEFAULT;
78: bmac_reg_default = MAC_HASH_TBL5_DEFAULT;
79: bmac_reg_default = MAC_HASH_TBL6_DEFAULT;
80: bmac_reg_default = MAC_HASH_TBL7_DEFAULT;
81: bmac_reg_default = MAC_HASH_TBL8_DEFAULT;
82: bmac_reg_default = MAC_HASH_TBL9_DEFAULT;
83: bmac_reg_default = MAC_HASH_TBL10_DEFAULT;
84: bmac_reg_default = MAC_HASH_TBL11_DEFAULT;
85: bmac_reg_default = MAC_HASH_TBL12_DEFAULT;
86: bmac_reg_default = MAC_HASH_TBL13_DEFAULT;
87: bmac_reg_default = MAC_HASH_TBL14_DEFAULT;
88: bmac_reg_default = MAC_HASH_TBL15_DEFAULT;
89: bmac_reg_default = BMAC_COL_CNT_DEFAULT;
90: bmac_reg_default = BMAC_OA_COL_CNT_DEFAULT;
91: bmac_reg_default = BMAC_EX_COL_CNT_DEFAULT;
92: bmac_reg_default = BMAC_LT_COL_CNT_DEFAULT;
93: bmac_reg_default = MAC_DEF_TIMER_DEFAULT;
//97: bmac_reg_default = BMAC_PK_ATT_CNT_DEFAULT;
94: bmac_reg_default = BRxMAC_FRM_CNT_DEFAULT;
95: bmac_reg_default = MAC_LEN_ER_CNT_DEFAULT;
96: bmac_reg_default = BMAC_AL_ER_CNT_DEFAULT;
97: bmac_reg_default = BMAC_CRC_ER_CNT_DEFAULT;
98: bmac_reg_default = BMAC_CD_VIO_CNT_DEFAULT;
99: bmac_reg_default = MAC_RND_SEED_DEFAULT;
//104: bmac_reg_default = BMAC_SM_REG_DEFAULT;
100: bmac_reg_default = BMAC_ALTAD_CMPEN_DEFAULT;
101: bmac_reg_default = MAC_HASH_TBL0_DEFAULT;
102: bmac_reg_default = MAC_HASH_TBL1_DEFAULT;
103: bmac_reg_default = MAC_HASH_TBL2_DEFAULT;
104: bmac_reg_default = MAC_HASH_TBL3_DEFAULT;
105: bmac_reg_default = MAC_HASH_TBL4_DEFAULT;
106: bmac_reg_default = MAC_HASH_TBL5_DEFAULT;
107: bmac_reg_default = MAC_HASH_TBL6_DEFAULT;
108: bmac_reg_default = MAC_HASH_TBL7_DEFAULT;
109: bmac_reg_default = BTxMAC_BYTE_CNT_DEFAULT;
110: bmac_reg_default = BTxMAC_FRM_CNT_DEFAULT;
111: bmac_reg_default = BRxMAC_BYTE_CNT_DEFAULT;
112: bmac_reg_default = BMAC_SM_REG_DEFAULT;
function integer bmac_util_class :: flen(integer sel) {
function integer bmac_util_class :: flen_j(integer sel) {
task bmac_util_class :: rx_pkt_count_check(integer pkt_count) {
bit [15:0] csr_rx_pkt_count;
if ( get_plus_arg(CHECK, "RX_TEST") ) {
if ((get_plus_arg (CHECK, "GET_MAC_PORTS=0"))){
base_addr = get_mac_reg_base(0);
mac_pio_class.xmac_pio_rd( base_addr + XMAC_CONFIG, cfg_rd_data,1'b0 );
if (cfg_rd_data[28:27] == 2'b01) {
mac_pio_class.bmac_pio_rd(PCS0_BASE + PCS_PACKET_COUNTER,rd_data, 1'b0);
csr_rx_pkt_count = rd_data[26:16];
else if (cfg_rd_data[28:27] == 2'b00) {
mac_pio_class.xmac_pio_rd(XPCS0_BASE + XPCS_PACKET_COUNTER,rd_data, 1'b0);
csr_rx_pkt_count = rd_data[15:0];
else if ((get_plus_arg (CHECK, "GET_MAC_PORTS=1"))){
base_addr = get_mac_reg_base(1);
mac_pio_class.xmac_pio_rd( base_addr + XMAC_CONFIG, cfg_rd_data,1'b0 );
if (cfg_rd_data[28:27] == 2'b01) {
mac_pio_class.bmac_pio_rd(PCS1_BASE + PCS_PACKET_COUNTER,rd_data, 1'b0);
csr_rx_pkt_count = rd_data[26:16];
else if (cfg_rd_data[28:27] == 2'b00) {
mac_pio_class.xmac_pio_rd(XPCS1_BASE + XPCS_PACKET_COUNTER,rd_data, 1'b0);
csr_rx_pkt_count = rd_data[15:0];
if (csr_rx_pkt_count != pkt_count) {
printf("ERROR :Rx Pkt Counter Error: Expected %0d Obeserved %0d \n", \
pkt_count,csr_rx_pkt_count);
printf("XPCS/PCS packet counter matches the no_of_packets\n");
task bmac_util_class :: tx_pkt_count_check(integer pkt_count) {
bit [15:0] csr_tx_pkt_count;
if ( get_plus_arg(CHECK, "TX_TEST") ) {
if ((get_plus_arg (CHECK, "GET_MAC_PORTS=0"))){
base_addr = get_mac_reg_base(0);
mac_pio_class.xmac_pio_rd( base_addr + XMAC_CONFIG, cfg_rd_data,1'b0 );
if (cfg_rd_data[28:27] == 2'b01) {
mac_pio_class.bmac_pio_rd(PCS0_BASE + PCS_PACKET_COUNTER,rd_data, 1'b0);
csr_tx_pkt_count = rd_data[10:0];
else if (cfg_rd_data[28:27] == 2'b00) {
mac_pio_class.xmac_pio_rd(XPCS0_BASE + XPCS_PACKET_COUNTER,rd_data, 1'b0);
csr_tx_pkt_count = rd_data[31:16];
else if ((get_plus_arg (CHECK, "GET_MAC_PORTS=1"))){
base_addr = get_mac_reg_base(1);
mac_pio_class.xmac_pio_rd( base_addr + XMAC_CONFIG, cfg_rd_data,1'b0 );
if (cfg_rd_data[28:27] == 2'b01) {
mac_pio_class.bmac_pio_rd(PCS1_BASE + PCS_PACKET_COUNTER,rd_data, 1'b0);
csr_tx_pkt_count = rd_data[10:0];
else if (cfg_rd_data[28:27] == 2'b00) {
mac_pio_class.xmac_pio_rd(XPCS1_BASE + XPCS_PACKET_COUNTER,rd_data, 1'b0);
csr_tx_pkt_count = rd_data[31:16];
if (csr_tx_pkt_count != pkt_count) {
printf("ERROR :Rx Pkt Counter Error: Expected %0d Obeserved %0d \n", \
pkt_count,csr_tx_pkt_count);
printf("XPCS/PCS packet counter matches the no_of_packets\n");
// make the value of len evenly distributed between 20 and 1518