blob: f8988b713aaa8a6744413e86bc09d8105b5ec4e2 [file] [log] [blame]
# Copyright 2023 Google LLC
# Copyright lowRISC contributors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# Meridian RDC Waivers for SPI_DEVICE
#
# W_RST_COMBO_LOGIC
# rst_rx/txfifo signals are reset signals but also returns data to SW. it is
# recognized as combo reset by tool but reset line is OK.
# TODO: Add buffer to separate other logics from reset
set_rule_status -rule {W_RST_COMBO_LOGIC} -status {Waived} \
-expression {(SourceReset=~"*.u_spi_device.u_reg.u_control_rst_*xfifo.q*")} \
-comment {rst_rx,txfifo are reset signals directly connected to the registers.q}
set_rule_status -rule {W_RST_COMBO_LOGIC} -status {Waived} \
-expression {(SourceReset=~"*.u_spi_device.rst_*_buf")} \
-comment {rst csb, tpm_csb are reset merging with scan chain.}
# RDC could not catch the relation between CSb and SCK. (SCK negedge to CSb
# de-assertion shall take 5ns at minimum)
#
# However, if CSb mis-behaved, the logic may/maynot push entries to CMDADDR
# FIFO and WR FIFO.
set_rule_status -rule {E_RST_METASTABILITY} -status {Waived} \
-expression {(MetaStableFlop=~"*.u_spi_tpm.u_cmdaddr_buffer.fifo_wptr*")} \
-comment {when csb de-asserted, SCK should be quiescent. If not, the behavior is unpredictable}
set_rule_status -rule {E_RST_METASTABILITY} -status {Waived} \
-expression {(MetaStableFlop=~"*.u_spi_tpm.u_wrfifo.fifo_wptr*")} \
-comment {when csb de-asserted, SCK should be quiescent. If not, the behavior is unpredictable}
# TODO(#15886): Find better env setup to define the relation between CSb and
# all SCK generated clocks.
# CSb to RX/TX FIFOs pointers E_RST_METASTABILITY
set_rule_status -rule {E_RST_METASTABILITY} -status {Waived} \
-expression {(SourceReset=~"*u_spi_device.rst_csb_buf") && \
(ResetFlop=~"*u_spi_device.io_mode_outclk*") && \
(MetaStableFlop=~"*u_spi_device.u_fwmode.u_*x_fifo.fifo_*ptr*")} \
-comment {CSb does not conflict to SPI_CLK if host system follows the protocol}
# Rx/Tx FIFO resets are issued when SPI is idle.
set_rule_status -rule {E_RST_METASTABILITY} -status {Waived} \
-expression {(SourceReset=~"*u_spi_device.u_reg.u_control_rst_rxfifo*") && \
(MetaStableFlop=~"*u_spi_device.u_fwmode.u_rxf_ctrl.*")} \
-comment {Assumption is to reset RX/TX FIFO when SPI is idle}
set_rule_status -rule {E_RST_METASTABILITY} -status {Waived} \
-expression {(SourceReset=~"*u_spi_device.u_reg.u_control_rst_rxfifo*") && \
(MetaStableFlop=~"*u_spi_device.rxf_full_q")} \
-comment {Assumption is to reset RX/TX FIFO when SPI is idle}
set_rule_status -rule {E_RST_METASTABILITY} -status {Waived} \
-expression {(SourceReset=~"*u_spi_device.u_reg.u_control_rst_*xfifo*") && \
(ResetFlop=~"*u_spi_device.u_fwmode.u_rx_fifo.fifo_rptr_q*") && \
(MetaStableFlop=~"*u_spi_device.u_reg.u_reg_if.rdata_q*")} \
-comment {Assumption is to reset RX/TX FIFO when SPI is idle. \
SW reads FIFO PTR not at the same time.}
set_rule_status -rule {E_RST_METASTABILITY} -status {Waived} \
-expression {(SourceReset=~"*u_spi_device.u_reg.u_control_rst_*xfifo*") && \
(MetastableFlopReset=~"*u_spi_device.u_reg.u_control_mode.q*")} \
-comment {CONTROL.mode dose not change.}
set_rule_status -rule {E_RST_METASTABILITY} -status {Waived} \
-expression {(SourceReset=~"*u_spi_device.u_reg.u_control_rst_txfifo*") && \
(MetaStableFlop=~"*u_spi_device.txf_empty_q")} \
-comment {Assumption is to reset RX/TX FIFO when SPI is idle}
set_rule_status -rule {E_RST_METASTABILITY} -status {Waived} \
-expression {(SourceReset=~"*u_spi_device.u_reg.u_control_rst_*xfifo*") && \
(ResetFlop=~"*u_spi_device.u_fwmode.u_tx_fifo.fifo_rptr_*") && \
(MetaStableFlop=~"*u_spi_device.u_reg.u_reg_if.rdata_q*")} \
-comment {Assumption is to reset RX/TX FIFO when SPI is idle. \
SW reads FIFO PTR not at the same time.}
set_rule_status -rule {E_RST_METASTABILITY} -status {Waived} \
-expression {(SourceReset=~"*u_spi_device.u_reg.u_control_rst_*xfifo*") && \
(ResetFlop=~"*u_spi_device.u_fwmode.u_tx_fifo.fifo_rptr_q*") && \
(MetaStableFlop=~"*u_spi_device.u_p2s.out_shift*")} \
-comment {Assumption is to reset RX/TX FIFO when SPI is idle. \
SW reads FIFO PTR not at the same time.}
set_rule_status -rule {E_RDC_METASTABILITY} -status {Waived} \
-expression {(SourceReset=~"*u_spi_device.u_reg.u_control_rst_txfifo*") && \
(ResetFlop=~"*u_spi_device.u_fwmode.u_tx_fifo.fifo_rptr*") && \
(MetaStableFlop=~"*u_spi_device.u_fwmode.u_tx_fifo.storage*")} \
-comment {TXFIFO reset may cause the output data change (surely). \
RDC reports the RDC_METASTABILITY caused by this. \
To avoid the issue, rst_sync + data sync should be implemented. \
However, due to the lack of the SCK, rst_sync cannot be added.}
# CSb to Any SPI_CLK path (RDC could not figure out the relation between CSb and SPI_CLK)
set_rule_status -rule {E_RST_METASTABILITY} -status {Waived} \
-expression {(SourceReset=~"*u_spi_device.rst_csb_buf") && \
(ClockDomains=~"SPI_DEV_*_CLK::SPI_DEV_*_CLK")} \
-comment {RDC does not correctly relate CSB and SCK domains}
# Below waiver is from CSb to Passthrough SCK clock gating logic.
set_rule_status -rule {E_RST_METASTABILITY} -status {Waived} \
-expression {(SourceReset=~"*u_spi_device.rst_csb_buf") && \
(ClockDomains=~"SPI_DEV_*_CLK::SPI_DEV_CLK")} \
-comment {RDC does not correctly relate CSB and SCK domains}
# CONTROL.mode CSR does not change when CSb toggles
set_rule_status -rule {E_RDC_METASTABILITY} -status {Waived} \
-expression {(SourceReset=~"*u_spi_device.rst_csb_buf") && \
(ObservableFlopReset=~"*u_reg.u_control_mode*")} \
-comment {CONTROL.mode is configured at the init time.}
# CPHA, CONTROL.mode waivers for main rst
set_rule_status -rule {E_RST_METASTABILITY E_RDC_METASTABILITY} \
-status {Waived} \
-expression {(ResetFlop=~"*u_spi_device.u_reg.u_cfg_cp*") && \
(ClockDomains=="IO_DIV4_CLK::IO_DIV4_CLK")}\
-comment {If CPHA is set, MainReset, SwRsqRst, POK reset causes a single \
edge to SPI_DEV_IN or SPI_DEV_OUT clock. As the edge occurs at the same \
time with the IP reset, it may create metastability issue to many \
registers inside SPI_DEVICE IP. \
\
However, at the time when POR is released, or SW requsts the reset, SPI \
is assumes as quiescent or stalled. If SPI line is stalled, part of the \
internal content may not be reset. But, it can be solvable by setting \
invert to the CSb pad. \
}