blob: 96c116713da03d1211fe7661be6bb5a9f2d023fe [file] [log] [blame]
# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
#
# Verix CDC waiver file
# Expression:
# ControlSignal==""
# ReconSignal==""
# MultiClockDomains=="IO_DIV2_CLK::IO_DIV4_CLK"
#
## Waive SPI_DEV clocks <-> SPI_DEV_PASSTHRU clocks
set_rule_status -rule {W_CNTL} -status {Waived} -expression \
{(MultiClockDomains == "SPI_DEV_OUT_CLK,SPI_DEV_PASSTHRU_OUT_CLK::SPI_DEV_IN_CLK,SPI_DEV_PASSTHRU_IN_CLK")} \
-comment {Irrelevant clock relationship. Exclusive}
set_rule_status -rule {W_DATA W_MASYNC} -status {Waived} -expression \
{(MultiClockDomains == "SPI_DEV_OUT_CLK,SPI_DEV_PASSTHRU_OUT_CLK::SPI_DEV_IN_CLK,SPI_DEV_PASSTHRU_IN_CLK")} \
-comment {Irrelevant clock relationship. Exclusive}
set_rule_status -rule {W_CNTL} -status {Waived} -expression \
{(MultiClockDomains == "SPI_DEV_IN_CLK,SPI_DEV_PASSTHRU_IN_CLK::SPI_DEV_OUT_CLK,SPI_DEV_PASSTHRU_OUT_CLK")} \
-comment {Irrelevant clock relationship. Exclusive}
set_rule_status -rule {W_DATA W_MASYNC} -status {Waived} -expression \
{(MultiClockDomains == "SPI_DEV_IN_CLK,SPI_DEV_PASSTHRU_IN_CLK::SPI_DEV_OUT_CLK,SPI_DEV_PASSTHRU_OUT_CLK")} \
-comment {Irrelevant clock relationship. Exclusive}
set_rule_status -rule {W_CNTL} -status {Waived} -expression \
{(MultiClockDomains == "SPI_DEV_CLK,SPI_DEV_PASSTHRU_CLK::SPI_DEV_IN_CLK,SPI_DEV_PASSTHRU_IN_CLK")} \
-comment {Irrelevant clock relationship. Exclusive}
set_rule_status -rule {W_DATA W_MASYNC} -status {Waived} -expression \
{(MultiClockDomains == "SPI_DEV_CLK,SPI_DEV_PASSTHRU_CLK::SPI_DEV_IN_CLK,SPI_DEV_PASSTHRU_IN_CLK")} \
-comment {Irrelevant clock relationship. Exclusive}
set_rule_status -rule {W_CNTL} -status {Waived} -expression \
{(MultiClockDomains == "SPI_DEV_IN_CLK,SPI_DEV_PASSTHRU_IN_CLK::SPI_DEV_CLK,SPI_DEV_PASSTHRU_CLK")} \
-comment {Irrelevant clock relationship. Exclusive}
set_rule_status -rule {W_DATA W_MASYNC} -status {Waived} -expression \
{(MultiClockDomains == "SPI_DEV_IN_CLK,SPI_DEV_PASSTHRU_IN_CLK::SPI_DEV_CLK,SPI_DEV_PASSTHRU_CLK")} \
-comment {Irrelevant clock relationship. Exclusive}
set_rule_status -rule {W_CNTL} -status {Waived} -expression \
{(MultiClockDomains == "SPI_DEV_CLK,SPI_DEV_PASSTHRU_CLK::SPI_DEV_OUT_CLK,SPI_DEV_PASSTHRU_OUT_CLK")} \
-comment {Irrelevant clock relationship. Exclusive}
set_rule_status -rule {W_DATA W_MASYNC} -status {Waived} -expression \
{(MultiClockDomains == "SPI_DEV_CLK,SPI_DEV_PASSTHRU_CLK::SPI_DEV_OUT_CLK,SPI_DEV_PASSTHRU_OUT_CLK")} \
-comment {Irrelevant clock relationship. Exclusive}
set_rule_status -rule {W_CNTL} -status {Waived} -expression \
{(MultiClockDomains == "SPI_DEV_OUT_CLK,SPI_DEV_PASSTHRU_OUT_CLK::SPI_DEV_CLK,SPI_DEV_PASSTHRU_CLK")} \
-comment {Irrelevant clock relationship. Exclusive}
set_rule_status -rule {W_DATA W_MASYNC} -status {Waived} -expression \
{(MultiClockDomains == "SPI_DEV_OUT_CLK,SPI_DEV_PASSTHRU_OUT_CLK::SPI_DEV_CLK,SPI_DEV_PASSTHRU_CLK")} \
-comment {Irrelevant clock relationship. Exclusive}
# Asynchronous reset
set_rule_status -rule {W_ASYNC_RST_FLOPS} -status {Waived} \
-expression {(DrivingSignal=~"*u_spi_device.u_reg.u_control_mode.q*") && \
(ReceivingFlop=~"*u_spi_device.u_fwmode.*")} \
-comment {u_control_mode is same clock inside fwmode}
set_rule_status -rule {W_RECON_GROUPS} -status {Waived} \
-expression {(ControlSignal=~"*u_status_23_to_1_sync.*") && \
(ReconSignal=~"*u_spid_status.outclk_p2s_byte_*")} \
-comment {status bits are converged into SPI line. But transmit bit-by-bit. OK to send old and new status bits in a transaction}
set_rule_status -rule {W_CNTL} -status {Waived} \
-expression {(Signal=~"*u_spi_device.rxf_full_q*") && \
(ReceivingFlop=~"*u_spi_device.u_sync_rxf*")} \
-comment {2FF synchronizer covers the clock domain crossing. RECONV is not waived.}
# DPSRAM waiver
# DPSRAM B port has clock mux. Unless in SPI Generic mode, B port is in DEV_IN_CLK or SPI_DEV_PASSTHRU_IN_CLK
set_rule_status -rule {W_DATA} -status {Waived} \
-expression {(ReceivingFlop=~"*u_spi_device.u_memory_2p.u_mem.gen_generic.u_impl_generic.b_rdata_o*") && \
(MultiClockDomains=="SPI_DEV_IN_CLK,SPI_DEV_PASSTHRU_IN_CLK::IO_DIV4_CLK,SPI_DEV_CLK,SPI_DEV_PASSTHRU_CLK")} \
-comment {DPSRAM B port has clock mux. Unless in SPI Generic mode, B port is in DEV_IN_CLK or SPI_DEV_PASSTHRU_IN_CLK}
set_rule_status -rule {W_DATA} -status {Waived} \
-expression {(ReceivingFlop=~"*u_spi_device.u_memory_2p.*") && \
(MultiClockDomains == "SPI_DEV_IN_CLK,SPI_DEV_PASSTHRU_IN_CLK::IO_DIV4_CLK,SPI_DEV_CLK,SPI_DEV_PASSTHRU_CLK")} \
-comment {DPSRAM runs at SCK in Flash and Passthrough mode}
# FWMode FIFO @ SYS_CLK path
set_rule_status -rule {W_DATA} -status {Waived} \
-expression {(Signal=~"*u_spi_device.u_fwmode.u_*x_fifo.fifo_*ptr*_q*") && \
(ReceivingFlop=~"*u_spi_device.u_reg.u_reg_if.rdata*")} \
-comment {RD FIFO Read port/ TX FIFO Write port are in SYS_CLK in Generic Mode}
# FWMode: read pointer of rxfifo (SYS -> SYS)
set_rule_status -rule {W_DATA} -status {Waived} \
-expression {(Signal=~"*.u_spi_device.u_reg.u_rxf_ptr_rptr*") && \
(ReceivingFlop=~"*.u_spi_device.u_fwmode*")} \
-comment {rxf, FwMode sits in SYS_CLK. Synchronous}
# Set from iDebug
set_rule_status -rule {W_CNTL} -expression {(MultiClockDomains == "IO_DIV4_CLK::SPI_DEV_IN_CLK,SPI_DEV_PASSTHRU_IN_CLK") && (ReceivingFlop == "top_earlgrey.u_spi_device.u_spid_addr_4b.u_sys2spi_sync.u_sync_1.gen_generic.u_impl_generic.q_o[0]") && (Signal == "top_earlgrey.u_spi_device.u_reg.u_cfg_addr_4b_en.q[0]") && (Association == "Data") && (SyncDepth == "2") && (SyncFlop == "top_earlgrey.u_spi_device.u_spid_addr_4b.u_sys2spi_sync.u_sync_2.gen_generic.u_impl_generic.q_o[0]")} -status {Waived} -lastedit_user {root} -lastedit_time {Thursday, 24 March 2022 13:46:23 PDT} \
-comment {addr_4b_en signal is static not a pulse signal. No intention of the bit value being changed.}
set_rule_status -rule {W_CNTL} -expression {(MultiClockDomains == "SPI_DEV_IN_CLK,SPI_DEV_PASSTHRU_IN_CLK::IO_DIV4_CLK") && (ReceivingFlop == "top_earlgrey.u_spi_device.u_spid_status.u_busy_sync.u_sync_1.gen_generic.u_impl_generic.q_o[0]") && (Signal == "top_earlgrey.u_spi_device.u_spid_status.sck_status_busy") && (Association == "Data") && (SyncDepth == "2") && (SyncFlop == "top_earlgrey.u_spi_device.u_spid_status.u_busy_sync.u_sync_2.gen_generic.u_impl_generic.q_o[0]")} -status {Waived} -lastedit_user {root} -lastedit_time {Thursday, 24 March 2022 13:55:28 PDT} \
-comment {busy signal is set then stay. 2FF to SYS clock domain is fine}
set_rule_status -rule {W_CNTL} -expression {(MultiClockDomains == "IO_DIV4_CLK::SPI_DEV_IN_CLK,SPI_DEV_PASSTHRU_IN_CLK") && (ReceivingFlop == "top_earlgrey.u_spi_device.u_spid_status.u_busy_clr_sync.prim_flop_2sync.u_sync_1.gen_generic.u_impl_generic.q_o[0]") && (Signal == "top_earlgrey.u_spi_device.u_spid_status.u_busy_clr_sync.src_level") && (Association == "Data") && (SyncDepth == "2") && (SyncFlop == "top_earlgrey.u_spi_device.u_spid_status.u_busy_clr_sync.prim_flop_2sync.u_sync_2.gen_generic.u_impl_generic.q_o[0]")} -status {Waived} -lastedit_user {root} -lastedit_time {Thursday, 24 March 2022 14:02:56 PDT}
set_rule_status -rule {W_CNTL} -expression {(MultiClockDomains == "IO_DIV4_CLK::SPI_DEV_IN_CLK,SPI_DEV_PASSTHRU_IN_CLK") && (ReceivingFlop == "top_earlgrey.u_spi_device.u_spid_status.u_status_23_to_1_sync.u_sync_1.gen_generic.u_impl_generic.q_o[0]") && (Signal == "top_earlgrey.u_spi_device.u_spid_status.u_busy_sync.u_sync_2.gen_generic.u_impl_generic.q_o[0]") && (Association == "Blocked-Dangling") && (SyncDepth == "2") && (SyncFlop == "top_earlgrey.u_spi_device.u_spid_status.u_status_23_to_1_sync.u_sync_2.gen_generic.u_impl_generic.q_o[0]")} -status {Waived} -lastedit_user {root} -lastedit_time {Thursday, 24 March 2022 14:03:01 PDT}
set_rule_status -rule {W_CNTL} -expression {(MultiClockDomains == "SPI_DEV_IN_CLK,SPI_DEV_PASSTHRU_IN_CLK::IO_DIV4_CLK") && (ReceivingFlop == "top_earlgrey.u_spi_device.u_upload.u_payloadptr_clr_psync.prim_flop_2sync.u_sync_1.gen_generic.u_impl_generic.q_o[0]") && (Signal == "top_earlgrey.u_spi_device.u_upload.u_payloadptr_clr_psync.src_level") && (Association == "Data") && (SyncDepth == "2") && (SyncFlop == "top_earlgrey.u_spi_device.u_upload.u_payloadptr_clr_psync.prim_flop_2sync.u_sync_2.gen_generic.u_impl_generic.q_o[0]")} -status {Waived} -lastedit_user {root} -lastedit_time {Thursday, 24 March 2022 14:05:55 PDT}
set_rule_status -rule {W_INTERFACE} -expression {(ComponentClass == "DATA") && (ErrorType == "Uncontrolled-Tx-MASYNC") && (MultiClockDomains == "IO_DIV4_CLK::IO_DIV4_CLK,SPI_DEV_CLK,SPI_DEV_PASSTHRU_CLK") && (Signal == "top_earlgrey.u_spi_device.u_reg.u_rxf_ptr_rptr.q[12:2]")} -status {Waived} -lastedit_user {root} -lastedit_time {Thursday, 24 March 2022 14:11:36 PDT}
set_rule_status -rule {W_INTERFACE} -expression {(ComponentClass == "DATA") && (ErrorType == "") && (MultiClockDomains == "IO_DIV4_CLK,SPI_DEV_CLK,SPI_DEV_IN_CLK,SPI_DEV_PASSTHRU_CLK,SPI_DEV_PASSTHRU_IN_CLK::IO_DIV4_CLK,SPI_DEV_CLK,SPI_DEV_PASSTHRU_CLK") && (Signal == "top_earlgrey.u_spi_device.u_fwmode.u_rx_fifo.storage[7:0][7:0]")} -status {Waived} -lastedit_user {root} -lastedit_time {Thursday, 24 March 2022 14:11:36 PDT}
set_rule_status -rule {W_INTERFACE} -expression {(ComponentClass == "CNTL") && (ErrorType == "") && (MultiClockDomains == "SPI_DEV_IN_CLK,SPI_DEV_PASSTHRU_IN_CLK::IO_DIV4_CLK,SPI_DEV_CLK,SPI_DEV_PASSTHRU_CLK") && (Signal == "top_earlgrey.u_spi_device.u_fwmode.u_rx_fifo.fifo_wptr_gray_q[3:0]")} -status {Waived} -lastedit_user {root} -lastedit_time {Thursday, 24 March 2022 14:11:36 PDT}
# Static Config Signals in SPI TPM
set_rule_status -rule {W_DATA} -status {Waived} \
-expression {( \
(Signal=~"*.u_spi_device.u_reg.u_tpm_did*") || \
(Signal=~"*.u_spi_device.u_reg.u_tpm_int*") || \
(Signal=~"*.u_spi_device.u_reg.u_tpm_rid*") \
) && (MultiClockDomains=="IO_DIV4_CLK::SPI_DEV_IN_CLK,SPI_DEV_PASSTHRU_IN_CLK")} \
-comment {TPM DID/VID/RID, INT_ENABLE, INT_STATUS are static signal. Does not change while in active}
# Static Config (CMD_INFO)
# TODO: Not matched
set_rule_status -rule {W_DATA} -status {Waived} \
-expression {(Signal =~ "*u_spi_device.u_reg.u_cmd_info*") && \
((MultiClockDomains == "IO_DIV4_CLK::SPI_DEV_IN_CLK,SPI_DEV_PASSTHRU_IN_CLK") || \
(MultiClockDomains == "IO_DIV4_CLK::SPI_DEV_OUT_CLK,SPI_DEV_PASSTHRU_OUT_CLK"))} \
-comment {CMD_INFO registers are static value. Configured then stay there}
# TODO: Create more specific Flop instance inside prim_flop_2sync to waive broadly.
set_rule_status -rule {W_CNTL} -status {Waived} \
-expression {(Signal=~"*u_spi_device*_*ptr_gray_q*") && \
(ReceivingFlop=~"*u_spi_device*u_sync_1.*")} \
-comment {2FF sync for gray code.}
# Static registers
set_rule_status -rule {W_INTERFACE W_DATA} -status {Waived} \
-expression {(Signal =~ "*.u_spi_device.*u_control_mode*") && \
(MultiClockDomains =~ "IO_DIV4_CLK::*SPI_DEV*CLK*")} \
-comment {IO mode control is changed in SPI Idle state}
set_rule_status -rule {W_DATA} -status {Waived} \
-expression {(Signal=~"*.u_spi_device.u_reg.u_control_abort*") && \
(ReceivingFlop=~"*.u_spi_device.u_fwmode*")} \
-comment {abort -> FwMode sits in SYS_CLK}
set_rule_status -rule {W_INTERFACE W_DATA} -status {Waived} \
-expression {(Signal =~ "*.u_spi_device.u_reg*u_cmd_info*") && \
(MultiClockDomains =~ "IO_DIV4_CLK::*SPI_DEV*CLK*")} \
-comment {CMD_INFO is pre-configured, static}
set_rule_status -rule {W_DATA} -status {Waived} \
-expression {(Signal =~ "*.u_spi_device.u_reg*u_cmd_info*") && \
(MultiClockDomains =~ "IO_DIV4_CLK::*SPI_DEV*CLK*")} \
-comment {CMD_INFO is pre-configured, static}
set_rule_status -rule {W_DATA} -status {Waived} \
-expression {(Signal =~ "*.u_spi_device.u_reg.u_cfg_*x_order*") && \
(MultiClockDomains =~ "IO_DIV4_CLK::*SPI_DEV*CLK*")} \
-comment {IO mode control is changed in SPI Idle state}
# UNUSED IO_DIV4 clock in Flash/Passthrough mode
set_rule_status -rule {W_DATA} -status {Waived} \
-expression {(Signal =~ "*u_spi_device*io_mode_outclk*") && \
(ReceivingFlop =~ "*u_spi_device.u_memory_2p*")} \
-comment {Other than IO_DIV4_CLK, other clocks are in-phase}
# SPIDEV to pinmux Retention, waived
set_rule_status -rule {W_DATA} -status {Waived} \
-expression {(Signal =~ "*u_spi_device*") && \
(ReceivingFlop =~ "*u_pinmux_aon.*retreg_q*")} \
-comment {retention reg sits in IO_DIV4_CLK, but can be ignored}
# SPI line to registers. Can't add CDC path due to timing
set_rule_status -rule {W_DATA} -status {Waived} \
-expression {(Signal =~ "SPI_DEV_D*") && \
(ReceivingFlop =~ "*u_spi_device.u_memory_2p*b_rdata*")} \
-comment {SPI line cannot have CDC}
# Waive FwMode IO_DIV4 domain
set_rule_status -rule {W_DATA} -status {Waived} \
-expression {( \
(ReceivingFlop=~"*u_spi_device.u_fwmode.u_*xf_ctrl.*") || \
(ReceivingFlop=~"*u_spi_device.u_fwmode.u_tx_fifo.fifo_wptr*") || \
(ReceivingFlop=~"*u_spi_device.u_fwmode.u_rx_fifo.fifo_rptr*") ) && \
(MultiClockDomains=~"IO_DIV4_CLK::*SPI_DEV_IN_CLK,SPI_DEV_PASSTHRU_IN_CLK")} \
-comment {?xf_ctrl sits in DIV4, due to clock mux while Generic is not active, tool confused}
# Waive W_G_CLK_GLITCH: When SPI_DEV_CLK toggles, other signals are static
set_rule_status -rule {W_G_CLK_GLITCH} -status {Waived} \
-expression {(GatedClock=~"*.u_spi_device.clk_spi_*") || \
(GatedClock=~"*.u_spi_device.u_sram_clk_*")} \
-comment {When SPI_DEV_CLK toggles, other signals are static}