// ========== Copyright Header Begin ==========================================
// OpenSPARC T2 Processor File: ilu_peu_checkers.v
// 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 ============================================
//-----------------------------------------------------------------------
// Disabling the Checkers for a certain time at the beginning of the sim
// The before_rst signal is used to disable all checkers for a specific
// delay at the start of simulation. The '#120' delay should be modified
// as necessary. Alternatively, the disable_checker directive can be
// altered to use a signal in the design (other than the before_rst
// signal) that informs 0-In when the design has been reset and the
//-----------------------------------------------------------------------
//----------------------------------------------------------------------
// Disable case checkers in IHP for a cycle after reset
//----------------------------------------------------------------------
// ****************************************************************************
// This is the N2 peu portion
// ****************************************************************************
`define ilu_top `CPU.dmu.ilu
`define ilu_clock `CPU.dmu.ilu.l1clk
// `define ilu_warmreset `CPU.dmu.ilu.isb.rst_cct.rst_l_out
`define ilu_warmreset `CPU.dmu.ilu.j2d_rst_l
`define peu_clock `PEU.pc_clk
`define peu_warmreset `PEU.peu_ptl.j2p_rst_l
`define peu_debug_a_reg `PEU.peu_ptl.ctb.tlr.csr.ptl_ctb_tlr_default_grp.tlu_dbg_sel_a
`define peu_ptl_etl_hcs `PEU.peu_ptl.etl.hcs
@(posedge tb_top.cpu.peu.iol2clk) ;
if ($test$plusargs("no_dmu2peu_edb_parity"))
if ($test$plusargs("no_dmu2peu_ibc_req_ack"))
if ($test$plusargs("no_dmu2peu_mps_val_chk"))
// 0in disable_checker -name *d2p_edb_odd_parity* no_edb_par
// 0in disable_checker -name *d2p_ibc_req_ack* no_ibc_req_ack
// 0in disable_checker -name *p2d_mps_value* no_mps_val_chk
// 0in disable_checker -name *p2d_mps_less_than* no_mps_val_chk
// p2d_ihb_data is matched by y2k_rcd when y2k_rcd_enq is active
// p2d_ihb_data is qualified by ihb_rptr_inc
// use the internal is_ihb_rcd signal to check the ihb data on y2k_rcd only, no
// completion or drain cases
// AT: -ret $0in_delay(`CPU.dmu.ilu.iil.rcdbldr.is_ihb_rcd)
// y2k_rcd[115:109] also does NOT follow p2d_ihb_data[126:120] when the ingress TLP is not
// a supported req. (See line 233-234 :/design/dmu/dmu_ilu_l/dmu_ilu/rtl/dmu_ilu_iil_rcdbldr.v.)
-req $0in_delay(`CPU.dmu.ilu.iil.xfrfsm.ihb_rptr_inc)
-req_id `CPU.dmu.ilu.p2d_ihb_data[126:120]
-ret $0in_delay(!`CPU.dmu.ilu.iil.rcdbldr.is_unsupported_req &
`CPU.dmu.ilu.iil.rcdbldr.is_ihb_rcd )
-ret_id `CPU.dmu.ilu.y2k_rcd[115:109]
-max_count_per_id_check off
-name AC_y2k_rcd_follows_p2d_ihb_data
// k2y_rcd when k2y_rcd_enq active is matched by d2p_ehb_data when d2p_ehb_we is active
-req `CPU.dmu.ilu.k2y_rcd_enq
-req_id `CPU.dmu.ilu.k2y_rcd[123:117]
-ret_id `PEU.d2p_ehb_data[126:120]
-max_count_per_id_check off
-name AC_d2p_ehb_data_follows_k2y_rcd
// Parity check on d2p_edb_data
/* 0in odd_parity -var ({`PEU.d2p_edb_data[31:0], `PEU.d2p_edb_dpar[0]})
-name AC_d2p_edb_odd_parity_bit_0
/* 0in odd_parity -var {`PEU.d2p_edb_data[63:32], `PEU.d2p_edb_dpar[1]}
-name AC_d2p_edb_odd_parity_bit_1
/* 0in odd_parity -var {`PEU.d2p_edb_data[95:64], `PEU.d2p_edb_dpar[2]}
-name AC_d2p_edb_odd_parity_bit_2
/* 0in odd_parity -var {`PEU.d2p_edb_data[127:96], `PEU.d2p_edb_dpar[3]}
-name AC_d2p_edb_odd_parity_bit_3
/* 0in value -var `PEU.p2d_mps
-name AC_p2d_mps_value_check
// == check against dev_ctl_reg[7:0]
-leader `PEU.peu_ptl.ctb.tlr.csr.ptl_ctb_tlr_default_grp.dev_ctl.dev_ctl_0.dev_ctl_csrbus_read_data[7:5]
-name AC_p2d_mps_against_dev_ctl_reg
// == check p2d_mps < peu device capability register mps field
wire [2:0] peu_dev_cap_reg_mps = `PEU.peu_ptl.ctb.tlr.csr.ptl_ctb_tlr_default_grp.dev_cap.dev_cap_csrbus_read_data[2:0] ;
-name AC_p2d_mps_less_than_dev_cap_mps
// === p2d_drain active when ehb or edb has parity error or when link is down
// === et2ct_header_parity_err = ehb and edb parity
// -leader (`PEU.peu_ptl.etl.hcs.et2ct_header_parity_err | `PEU.peu_ptl.etl.lcs.et2ct_data_parity_err | `PEU.peu_ptl.ctb.tlr.csr.rio.lpu_ldn )
-leader ($0in_rising_edge(`PEU.peu_ptl.etl.hcs.et2ct_header_parity_err | `PEU.peu_ptl.etl.lcs.et2ct_data_parity_err))
-follower ($0in_rising_edge(`PEU.p2d_drain))
-name AC_p2d_drain_active
// AT-: All the signals are in peu_clock domain: -clock `ilu_clock
// AT-: -reset ~`ilu_warmreset
//-----------------------------------------------------------------------
// Checkers for the gray code pointers
// There is a checker for each side of the clock domain boundary.
//-----------------------------------------------------------------------
/* 0in gray_code -clock `ilu_clock
-reset (~`ilu_warmreset | `PEU.p2d_drain)
-name AC_d2p_ech_wptr_gray_code */
/* 0in gray_code -clock `ilu_clock
-reset (~`ilu_warmreset | `PEU.p2d_drain)
-name AC_d2p_erh_wptr_gray_code */
/* 0in gray_code -clock `peu_clock
-reset (~`peu_warmreset | `PEU.p2d_drain)
-name AC_p2d_ihb_wptr_gray_code */
/* 0in gray_code -clock `peu_clock
-reset (~`peu_warmreset | `PEU.p2d_drain)
-name AC_p2d_ech_rptr_gray_code */
/* 0in gray_code -clock `peu_clock
-reset (~`peu_warmreset | `PEU.p2d_drain)
-name AC_p2d_erh_rptr_gray_code */
/* 0in gray_code -clock `peu_clock
-reset (~`peu_warmreset | `PEU.p2d_drain)
-name AC_p2d_ecd_rptr_gray_code */
/* 0in gray_code -clock `peu_clock
-reset (~`peu_warmreset | `PEU.p2d_drain)
-name AC_p2d_erd_rptr_gray_code */
//=== p2d, d2p request follows acknowlege
// Let 0in infer the transmit and receive clocks
// /* 0in req_ack `PEU.p2d_cto_req `PEU.d2p_cto_ack
// peu.d2p_cto_ack = peu.peu_ptl.rsb.rsb_ctrl.n_cto_ack_reg
/* 0in req_ack -req `PEU.p2d_cto_req
-ack `PEU.peu_ptl.rsb.rsb_ctrl.n_cto_ack_reg
// /* 0in req_ack `PEU.d2p_csr_req `PEU.p2d_csr_ack
// peu.d2p_csr_req = peu.peu_ptl.ctb.dcd.req
/* 0in req_ack -req `PEU.peu_ptl.ctb.dcd.req
-name AC_d2p_csr_req_ack -max 100 */
// /* 0in req_ack `PEU.p2d_csr_req `PEU.d2p_csr_ack
// peu.d2p_csr_ack = peu.peu_ptl.ctb.dcs.osm.ack
/* 0in req_ack -req `PEU.p2d_csr_req
-ack `PEU.peu_ptl.ctb.dcs.osm.ack
-name AC_p2d_csr_req_ack */
// peu.peu_ptl.itl.ifc.req = sync'd version of peu.d2p_ibc_req
// 07/21/05: Add back the -active option, since the ifc won't ack
// ingress buffer credit req during link training.
// For x1,x2,x4 tests, link training takes >10K cycles,
// which would have caused the checker to misfire.
// 09/16/06: suggested changing:
// -reset ~`PEU.peu_ptl.etl.ct2et_rst_l to
// -reset (tb_top.cpu.peu.peu_ptl.ctb.tlr.rio.ct2et_lnk_dwn |
// ~tb_top.cpu.peu.peu_ptl.ctb.tlr.rio.rst_l)
/* 0in req_ack -req `PEU.peu_ptl.itl.ifc.req
-ack_assert_to_req_deassert_min 1
-reset (`PEU.peu_ptl.ctb.tlr.rio.ct2et_lnk_dwn |
~`PEU.peu_ptl.ctb.tlr.rio.rst_l)
-active `PEU.peu_ptl.itl.ifc.ct2it_link
//=== p2d_ce_int active when ce-status_reg <> 0 and ce-interrupt_enable active
// -start (|(`PEU.peu_ptl.ctb.tlr.csr.ptl_ctb_tlr_default_grp.ce_int_en.ce_int_en_csrbus_read_data[63:0] & `PEU.peu_ptl.ctb.tlr.csr.ptl_ctb_tlr_default_grp.ce_err.ce_err_csrbus_read_data[63:0]))
// -reset ~`peu_warmreset
wire [63:0] p2d_ce_int_transition_count;
-leader $0in_delay(|(`PEU.peu_ptl.ctb.tlr.csr.ptl_ctb_tlr_default_grp.ce_int_en.ce_int_en_csrbus_read_data[63:0] & `PEU.peu_ptl.ctb.tlr.csr.ptl_ctb_tlr_default_grp.ce_err.ce_err_csrbus_read_data[63:0]))
-follower (`PEU.p2d_ce_int)
-transitions_checked p2d_ce_int_transition_count
//=== p2d_oe_int active when oe-status_reg <> 0 and oe-interrupt_enable active
// reg [63:0] p2d_oe_int_transition_count;
// -transitions_checked p2d_oe_int_transition_count
wire [63:0] p2d_oe_int_transition_count;
-leader $0in_delay(|(`PEU.peu_ptl.ctb.tlr.csr.ptl_ctb_tlr_default_grp.oe_int_en.oe_int_en_csrbus_read_data[63:0] & `PEU.peu_ptl.ctb.tlr.csr.ptl_ctb_tlr_default_grp.oe_err.oe_err_csrbus_read_data[63:0]))
-follower (`PEU.p2d_oe_int)
-transitions_checked p2d_oe_int_transition_count
//=== p2d_ue_int active when ue-status_reg <> 0 and ue-interrupt_enable active
wire ue_int_on = (|(`PEU.peu_ptl.ctb.tlr.csr.ptl_ctb_tlr_default_grp.ue_int_en.ue_int_en_csrbus_read_data[63:0] & `PEU.peu_ptl.ctb.tlr.csr.ptl_ctb_tlr_default_grp.ue_err.ue_err_csrbus_read_data[63:0]));
wire [63:0] p2d_ue_int_transition_count;
-leader $0in_delay(|(`PEU.peu_ptl.ctb.tlr.csr.ptl_ctb_tlr_default_grp.ue_int_en.ue_int_en_csrbus_read_data[63:0] & `PEU.peu_ptl.ctb.tlr.csr.ptl_ctb_tlr_default_grp.ue_err.ue_err_csrbus_read_data[63:0]))
-follower (`PEU.p2d_ue_int)
-transitions_checked p2d_ue_int_transition_count
//==== p2d_cto_tag is valid and constant during p2d_cto_req
/* 0in constant -var `PEU.p2d_cto_tag -active `PEU.p2d_cto_req
-name AC_p2d_cto_tag_constant
//===== peu_psr_pll_mpy should only change value 1 cycle after falling edge
// of warm reset. Otherwise, its value is constant until next warmreset
-start $0in_delay(($0in_falling_edge(`PEU.rst_wmr_)),3)
-stop $0in_falling_edge(`PEU.rst_wmr_)
-not_in $0in_delay(peu_psr_pll_mpy)
-name AC_peu_mpy_update_after_wrm
//-----------------------------------------------------------------------
// known-driven checkers for signals between ILU and PEU
// There is a checker for each side of the clock domain boundary.
// NOTE: resets are active low!
//-----------------------------------------------------------------------
//---------------------------------------------------------------------
//---------------------------------------------------------------------
/* 0in known_driven -clock `ilu_clock
-var `CPU.dmu.ilu.d2p_ihb_addr */
/* 0in known_driven -clock `ilu_clock
-var `CPU.dmu.ilu.p2d_ihb_wptr */
/* 0in known_driven -clock `ilu_clock
-var `CPU.dmu.ilu.d2p_idb_addr */
/* 0in known_driven -clock `ilu_clock
-active `CPU.dmu.ilu.d2p_ibc_req
-var `CPU.dmu.ilu.d2p_ibc_nhc */
/* 0in known_driven -clock `ilu_clock
-active `CPU.dmu.ilu.d2p_ibc_req
-var `CPU.dmu.ilu.d2p_ibc_phc */
/* 0in known_driven -clock `ilu_clock
-active `CPU.dmu.ilu.d2p_ibc_req
-var `CPU.dmu.ilu.d2p_ibc_pdc */
/* 0in known_driven -clock `ilu_clock
-var `CPU.dmu.ilu.d2p_ibc_req */
/* 0in known_driven -clock `ilu_clock
-var `CPU.dmu.ilu.p2d_ibc_ack */
/* 0in known_driven -clock `ilu_clock
-active `CPU.dmu.ilu.p2d_cto_req
-var `CPU.dmu.ilu.p2d_cto_tag */
/* 0in known_driven -clock `ilu_clock
-var `CPU.dmu.ilu.p2d_cto_req */
/* 0in known_driven -clock `ilu_clock
-var `CPU.dmu.ilu.d2p_cto_ack */
/* 0in known_driven -clock `ilu_clock
-var `CPU.dmu.ilu.p2d_ue_int */
/* 0in known_driven -clock `ilu_clock
-var `CPU.dmu.ilu.p2d_ce_int */
/* 0in known_driven -clock `ilu_clock
-var `CPU.dmu.ilu.p2d_oe_int */
/* 0in known_driven -clock `ilu_clock
-var `CPU.dmu.ilu.d2p_ech_wptr */
/* 0in known_driven -clock `ilu_clock
-var `CPU.dmu.ilu.p2d_ech_rptr */
/* 0in known_driven -clock `ilu_clock
-var `CPU.dmu.ilu.d2p_erh_wptr */
/* 0in known_driven -clock `ilu_clock
-var `CPU.dmu.ilu.p2d_erh_rptr */
/* 0in known_driven -clock `ilu_clock
-var `CPU.dmu.ilu.p2d_ecd_rptr */
/* 0in known_driven -clock `ilu_clock
-var `CPU.dmu.ilu.p2d_erd_rptr */
/* 0in known_driven -clock `ilu_clock
-var `CPU.dmu.ilu.d2p_edb_addr
-active `CPU.dmu.ilu.d2p_edb_we */
//---------------------------------------------------------------------
//---------------------------------------------------------------------
/* 0in known_driven -clock `peu_clock
-var `PEU.d2p_ihb_addr */
/* 0in known_driven -clock `peu_clock
-var `PEU.p2d_ihb_wptr */
/* 0in known_driven -clock `peu_clock
-var `PEU.d2p_idb_addr */
/* 0in known_driven -clock `peu_clock
/* 0in known_driven -clock `peu_clock
/* 0in known_driven -clock `peu_clock
/* 0in known_driven -clock `peu_clock
/* 0in known_driven -clock `peu_clock
/* 0in known_driven -clock `peu_clock
/* 0in known_driven -clock `peu_clock
/* 0in known_driven -clock `peu_clock
/* 0in known_driven -clock `peu_clock
/* 0in known_driven -clock `peu_clock
/* 0in known_driven -clock `peu_clock
/* 0in known_driven -clock `peu_clock
-var `PEU.d2p_ech_wptr */
/* 0in known_driven -clock `peu_clock
-var `PEU.p2d_ech_rptr */
/* 0in known_driven -clock `peu_clock
-var `PEU.d2p_erh_wptr */
/* 0in known_driven -clock `peu_clock
-var `PEU.p2d_erh_rptr */
/* 0in known_driven -clock `peu_clock
-var `PEU.p2d_ecd_rptr */
/* 0in known_driven -clock `peu_clock
-var `PEU.p2d_erd_rptr */
/* 0in known_driven -clock `peu_clock
-active `PEU.d2p_edb_we */
// 0in disable_checker -name cpu.peu.peu_ptl.etl.hcs.fifo_request.enq_deq 1
-name etl_hcs_fifo_request_enq_deq1
-enq `PEU.peu_ptl.etl.hcs.fifo_request.enq
-deq `PEU.peu_ptl.etl.hcs.fifo_request.deq
-enq_data `PEU.peu_ptl.etl.hcs.fifo_request.di
-deq_data `PEU.peu_ptl.etl.hcs.fifo_request.do
-clock `PEU.peu_ptl.etl.hcs.fifo_request.clk
-reset ~`PEU.peu_ptl.etl.hcs.fifo_request.rst_l
// 0in disable_checker -name cpu.peu.peu_ptl.etl.hcs.fifo_completion.enq_deq 1
-name etl_hcs_fifo_completion_enq_deq1
-enq `PEU.peu_ptl.etl.hcs.fifo_completion.enq
-deq `PEU.peu_ptl.etl.hcs.fifo_completion.deq
-enq_data `PEU.peu_ptl.etl.hcs.fifo_completion.di
-deq_data `PEU.peu_ptl.etl.hcs.fifo_completion.do
-clock `PEU.peu_ptl.etl.hcs.fifo_completion.clk
-reset ~`PEU.peu_ptl.etl.hcs.fifo_completion.rst_l
// 0in disable_checker -name cpu.peu.peu_ptl.rsb.rsb_rar.et2rs_ld_tx 1
-tx (it2rs_vld & ~n_rs2it_err)
-reset ~`PEU.peu_ptl.etl.ct2et_rst_l
// 0in disable_checker -name cpu.peu.peu_ptl.edb.ptl_edb_async_ram_chk 1
-name ptl_edb_async_ram_chk1
-enq_reset ~`PEU.peu_ptl.etl.ct2et_rst_l
-deq_reset ~`PEU.peu_ptl.etl.ct2et_rst_l
// 0in disable_checker -name cpu.dmu.ilu.iil.xfrfsm.zivar 1
/* 0in assert -var `CPU.dmu.ilu.iil.xfrfsm.isb2iil_vld
-active (((`CPU.dmu.ilu.iil.xfrfsm.is_ihb_rcd &
`CPU.dmu.ilu.iil.xfrfsm.ihb_rcd_is_cpl) |
`CPU.dmu.ilu.iil.xfrfsm.is_cto_rcd_ps2 ) &
~`CPU.dmu.ilu.iil.cib2iil_pec_drain &
~`CPU.dmu.ilu.iil.cib2iil_ihb_pe_drain)