Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / verif / env / niu / rxc_sat / vera / rxdma / niu_rx_exit_tools.vr
// ========== Copyright Header Begin ==========================================
//
// OpenSPARC T2 Processor File: niu_rx_exit_tools.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 <vera_defines.vrh>
#include "niu_gen_pio.vrh"
#include "niu_rx_descp.vrh"
#include "niu_rxdmc.vrh"
#include "cMesg.vrh"
#include "mac_pio_class.vrh"
#include "xpcs_memory_map.vri"
#include "dmc_memory_map.vri"
#include "ipp_memory_map.vri"
#include "xmac_util.vrh"
#include "bmac_util.vrh"
#include "dmc_memory_map.vri"
extern niu_gen_pio gen_pio_drv;
extern Mesg be_msg;
extern mac_util_class mac_util;
extern bmac_util_class bmac_util;
extern mac_pio_cl mac_pio_class;
extern CRDMC rdmc;
class rx_counters { // class to be used for both model and rtl values
integer mac_id;
string name;
// mac: xmac => only xmac, bmac => only bmac, mac => xmac & bmac
integer mac_crc_cntr; // CRC errors
integer xmac_hist1_cntr; // 64B
integer xmac_hist2_cntr; // 65-127B
integer xmac_hist3_cntr; // 128-255B
integer xmac_hist4_cntr; // 256-511B
integer xmac_hist5_cntr; // 512-1023B
integer xmac_hist6_cntr; // 1024-1522B
integer xmac_hist7_cntr; // >1523B (or) All sizes
integer mac_mpszer_cntr; // oversize pkts
integer xmac_frag_cntr; // undersize pkts
integer xmac_byte_cntr; // Bytes
integer xmac_mcast_cntr; // multicast
integer xmac_bcast_cntr; // boradcast
integer mac_codevio_cntr; // code violations
integer bmac_alignerr_cntr; // alignment errors
integer bmac_frame_cntr; // alignment errors
// ipp
integer ipp_chksum_cntr; // checksum errors
integer ipp_ecc_err_cntr; // ecc error pkts dropped
integer ipp_runt_pkt_cntr; // runt pkts discarded
task new (integer port_id) {
mac_id = port_id;
name = "";
mac_crc_cntr = 0;
xmac_hist1_cntr = 0;
xmac_hist2_cntr = 0;
xmac_hist3_cntr = 0;
xmac_hist4_cntr = 0;
xmac_hist5_cntr = 0;
xmac_hist6_cntr = 0;
xmac_hist7_cntr = 0;
mac_mpszer_cntr = 0;
xmac_frag_cntr = 0;
xmac_byte_cntr = 0;
xmac_mcast_cntr = 0;
xmac_bcast_cntr = 0;
mac_codevio_cntr = 0;
bmac_alignerr_cntr = 0;
bmac_frame_cntr = 0;
ipp_chksum_cntr = 0;
ipp_ecc_err_cntr = 0;
ipp_runt_pkt_cntr = 0;
}
task display_counters() {
if (mac_id==0 || mac_id==1) {
printf("%s_xmac_crc_cntr = %0d\n", name, mac_crc_cntr);
printf("%s_xmac_hist1_cntr = %0d\n", name, xmac_hist1_cntr);
printf("%s_xmac_hist2_cntr = %0d\n", name, xmac_hist2_cntr);
printf("%s_xmac_hist3_cntr = %0d\n", name, xmac_hist3_cntr);
printf("%s_xmac_hist4_cntr = %0d\n", name, xmac_hist4_cntr);
printf("%s_xmac_hist5_cntr = %0d\n", name, xmac_hist5_cntr);
printf("%s_xmac_hist6_cntr = %0d\n", name, xmac_hist6_cntr);
printf("%s_xmac_hist7_cntr = %0d\n", name, xmac_hist7_cntr);
printf("%s_xmac_mpszer_cntr = %0d\n", name, mac_mpszer_cntr);
printf("%s_xmac_frag_cntr = %0d\n", name, xmac_frag_cntr);
printf("%s_xmac_byte_cntr = %0d\n", name, xmac_byte_cntr);
printf("%s_xmac_mcast_cntr = %0d\n", name, xmac_mcast_cntr);
printf("%s_xmac_bcast_cntr = %0d\n", name, xmac_bcast_cntr);
printf("%s_xmac_codevio_cntr = %0d\n", name, mac_codevio_cntr);
}
else if (mac_id==2 || mac_id==3) {
printf("%s_bmac_crc_cntr = %0d\n", name, mac_crc_cntr);
printf("%s_bmac_frame_cntr = %0d\n", name, bmac_frame_cntr);
printf("%s_bmac_mpszer_cntr = %0d\n", name, mac_mpszer_cntr);
printf("%s_bmac_codevio_cntr = %0d\n", name, mac_codevio_cntr);
printf("%s_bmac_aligner_cntr = %0d\n", name, bmac_alignerr_cntr);
}
printf("%s_ipp_chksum_cntr = %0d\n", name, ipp_chksum_cntr);
printf("%s_ipp_ecc_err_cntr = %0d\n", name, ipp_ecc_err_cntr);
printf("%s_ipp_runt_pkt_cntr = %0d\n", name, ipp_runt_pkt_cntr);
}
}
class rx_exit_tools {
task new() { }
function rx_counters read_rx_rtl_cntrs(integer port_id);
task match_rtl_env_cntrs(rx_counters rtl_counts, rx_counters env_counts);
task compare(integer port_num, integer rtl_cnt, integer env_cnt, string name_str);
}
function rx_counters rx_exit_tools::read_rx_rtl_cntrs(integer port_id) {
rx_counters rx_cntr_handle;
string handle_name;
bit [39:0] base_addr;
bit [31:0] read_data;
sprintf(handle_name, "rtl_counts%0d", port_id);
rx_cntr_handle = new(port_id);
rx_cntr_handle.name = handle_name;
if (port_id==0 || port_id==1){
base_addr = bmac_util.get_mac_reg_base(port_id);
mac_pio_class.xmac_pio_rd(base_addr + MAC_CRC_ER_CNT, read_data,1'b0);
rx_cntr_handle.mac_crc_cntr=read_data;
mac_pio_class.xmac_pio_rd(base_addr + RxMAC_HIST_CNT1, read_data,1'b0);
rx_cntr_handle.xmac_hist1_cntr=read_data;
mac_pio_class.xmac_pio_rd(base_addr + RxMAC_HIST_CNT2, read_data,1'b0);
rx_cntr_handle.xmac_hist2_cntr=read_data;
mac_pio_class.xmac_pio_rd(base_addr + RxMAC_HIST_CNT3, read_data,1'b0);
rx_cntr_handle.xmac_hist3_cntr=read_data;
mac_pio_class.xmac_pio_rd(base_addr + RxMAC_HIST_CNT4, read_data,1'b0);
rx_cntr_handle.xmac_hist4_cntr=read_data;
mac_pio_class.xmac_pio_rd(base_addr + RxMAC_HIST_CNT5, read_data,1'b0);
rx_cntr_handle.xmac_hist5_cntr=read_data;
mac_pio_class.xmac_pio_rd(base_addr + RxMAC_HIST_CNT6, read_data,1'b0);
rx_cntr_handle.xmac_hist6_cntr=read_data;
mac_pio_class.xmac_pio_rd(base_addr + RxMAC_HIST_CNT7, read_data,1'b0);
rx_cntr_handle.xmac_hist7_cntr=read_data;
mac_pio_class.xmac_pio_rd(base_addr + RxMAC_MPSZER_CNT, read_data,1'b0);
rx_cntr_handle.mac_mpszer_cntr=read_data;
mac_pio_class.xmac_pio_rd(base_addr + RxMAC_FRAG_CNT, read_data,1'b0);
rx_cntr_handle.xmac_frag_cntr=read_data;
mac_pio_class.xmac_pio_rd(base_addr + RxMAC_BT_CNT, read_data,1'b0);
rx_cntr_handle.xmac_byte_cntr=read_data;
mac_pio_class.xmac_pio_rd(base_addr + RxMAC_MC_FRM_CNT, read_data,1'b0);
rx_cntr_handle.xmac_mcast_cntr=read_data;
mac_pio_class.xmac_pio_rd(base_addr + RxMAC_BC_FRM_CNT, read_data,1'b0);
rx_cntr_handle.xmac_bcast_cntr=read_data;
mac_pio_class.xmac_pio_rd(base_addr + MAC_CD_VIO_CNT, read_data,1'b0);
rx_cntr_handle.mac_codevio_cntr=read_data;
}
else if (port_id==2 || port_id==3){
bmac_util.rd_ipp_mac_reg(port_id, BRxMAC_FRM_CNT, read_data, 1'b0);
rx_cntr_handle.bmac_frame_cntr=read_data;
bmac_util.rd_ipp_mac_reg(port_id, BMAC_AL_ER_CNT, read_data, 1'b0);
rx_cntr_handle.bmac_alignerr_cntr=read_data;
bmac_util.rd_ipp_mac_reg(port_id, BMAC_CRC_ER_CNT, read_data, 1'b0);
rx_cntr_handle.mac_crc_cntr=read_data;
bmac_util.rd_ipp_mac_reg(port_id, BMAC_CD_VIO_CNT, read_data, 1'b0);
rx_cntr_handle.mac_codevio_cntr=read_data;
bmac_util.rd_ipp_mac_reg(port_id, MAC_LEN_ER_CNT, read_data, 1'b0);
rx_cntr_handle.mac_mpszer_cntr=read_data;
}
read_rx_rtl_cntrs = rx_cntr_handle.object_copy();
read_rx_rtl_cntrs.display_counters();
}
task rx_exit_tools::match_rtl_env_cntrs(rx_counters rtl_counts, rx_counters env_counts) {
if (rtl_counts.mac_id !== env_counts.mac_id) {
printf("ERROR match_rtl_env_cntrs: Cannot compare rtl and env counts for 2 different ports\n");
printf("match_rtl_env_cntrs: Not doing the comparison of counts as part of exit check!\n");
return;
}
if (rtl_counts.mac_id==0 || rtl_counts.mac_id==1) {
compare(rtl_counts.mac_id,rtl_counts.mac_crc_cntr, env_counts.mac_crc_cntr, "mac_crc_cntr");
#ifdef 0
// byte counter should be skipped as it is not accurate as well
compare(rtl_counts.mac_id,rtl_counts.xmac_hist1_cntr, env_counts.xmac_hist1_cntr, "xmac_hist1_cntr");
compare(rtl_counts.mac_id,rtl_counts.xmac_hist2_cntr, env_counts.xmac_hist2_cntr, "xmac_hist2_cntr");
compare(rtl_counts.mac_id,rtl_counts.xmac_hist3_cntr, env_counts.xmac_hist3_cntr, "xmac_hist3_cntr");
compare(rtl_counts.mac_id,rtl_counts.xmac_hist4_cntr, env_counts.xmac_hist4_cntr, "xmac_hist4_cntr");
compare(rtl_counts.mac_id,rtl_counts.xmac_hist5_cntr, env_counts.xmac_hist5_cntr, "xmac_hist5_cntr");
compare(rtl_counts.mac_id,rtl_counts.xmac_hist6_cntr, env_counts.xmac_hist6_cntr, "xmac_hist6_cntr");
compare(rtl_counts.mac_id,rtl_counts.xmac_byte_cntr, env_counts.xmac_byte_cntr, "xmac_byte_cntr");
#endif
compare(rtl_counts.mac_id,rtl_counts.xmac_hist7_cntr, env_counts.xmac_hist7_cntr, "xmac_hist7_cntr");
compare(rtl_counts.mac_id,rtl_counts.mac_mpszer_cntr, env_counts.mac_mpszer_cntr, "mac_mpszer_cntr");
compare(rtl_counts.mac_id,rtl_counts.xmac_frag_cntr, env_counts.xmac_frag_cntr, "xmac_frag_cntr");
compare(rtl_counts.mac_id,rtl_counts.xmac_mcast_cntr, env_counts.xmac_mcast_cntr, "xmac_mcast_cntr");
compare(rtl_counts.mac_id,rtl_counts.xmac_bcast_cntr, env_counts.xmac_bcast_cntr, "xmac_bcast_cntr");
compare(rtl_counts.mac_id,rtl_counts.mac_codevio_cntr, env_counts.mac_codevio_cntr, "mac_codevio_cntr");
}
else if (rtl_counts.mac_id==0 || rtl_counts.mac_id==1) {
compare(rtl_counts.mac_id,rtl_counts.mac_crc_cntr, env_counts.mac_crc_cntr, "mac_crc_cntr");
compare(rtl_counts.mac_id,rtl_counts.bmac_frame_cntr, env_counts.bmac_frame_cntr, "bmac_frame_cntr");
compare(rtl_counts.mac_id,rtl_counts.mac_mpszer_cntr, env_counts.mac_mpszer_cntr, "mac_mpszer_cntr");
compare(rtl_counts.mac_id,rtl_counts.mac_codevio_cntr, env_counts.mac_codevio_cntr, "mac_codevio_cntr");
compare(rtl_counts.mac_id,rtl_counts.bmac_alignerr_cntr, env_counts.bmac_alignerr_cntr, "bmac_alignerr_cntr");
}
}
task rx_exit_tools::compare(integer port_num, integer rtl_cnt, integer env_cnt, string name_str) {
if (rtl_cnt!==env_cnt) {
be_msg.print(e_mesg_error,"rx_exit_tools", "Counter Mismatch",
"%s: Expected %0d Observed %0d \n", name_str, env_cnt, rtl_cnt);
}
else {
printf ("rx_exit_tools.compare Counter %s matched between env and rtl for port %0d\n",
name_str, port_num);
}
}