spyglass CDC入门笔记

根据工程遇到的cdc规则,进行理解。
目标:

  • 熟悉rules的阅读方法,参考文档是SpyGlass CDC Rules Reference Guide(另外一个cdc的书是spyglass cdc submethodology,介绍spyglass作为cdc工具的方法学,而且这一本要先看。有这两本书就够了。)
  • 熟悉cdc遇到的error、warning
  • debug思路
    • error肯定有问题,不要只关注结构上是否做了异步处理,也许异步处理的实现有问题。这个可以从waveform上去分析。例如异步fifo,有些设计,功能上导致格雷码跳转不是按顺序的,有时候从5转为0;这时,就会有error报告。而且确实是错误设计。

debug rules的顺序

按照下述流程顺序,依次排查warning和error。
基于goal目标的流程。
1. cdc_setup
如果出现大量违反,成千上万个。那么很大可能是setup步骤不正确或者不完整。
必须解决Ac_unsync01 ruleAc_unsync02 rule的违反之后,再解决其它问题。
2. cdc_setup_check
3. clock_reset_integrity
4. cdc_verify
5. cdc_verify_struct

Ac_unsync01

when to use

找到未做同步的跨时钟域信号。

description

跨时钟域的信号,未做同步处理。

messages and suggested fix

潜在的问题

会出现亚稳态。

how to debug and fix

  1. 如果源和目的实例,都在一个IP module里,要使用ip_block约束;
  2. 如果跨时钟域穿过一个黑盒子,保证黑盒子配置是正确的,可以使用下述两种方式的任一一种。
    2.1 黑盒子,要设置好时钟域。(使用abstract_port约束)
    2.2 黑盒子的pin已经定义feed through。(使用assume_path)
    如果不想查看黑盒子的跨时钟域报告,可以设置cdc_reduce_pessimism参数到这个黑盒子bbox。
  3. 3.

个人解决的思路

通过电路图分析,源信号,是一个控制寄存器,是一个配置完成后,就基本不会改变的信号。
由于功能的原因,可以不需要做同步设计。

Ac_unsync01

when to use

多位信号的跨时钟域,没有找到相关同步逻辑。

个人解决的思路

发现一个情况,是因为cdc约束了两个时钟信号,但是他们都应该属于一个时钟域的。
修改办法:两个时钟改成一个时钟域。

Ac_datahold01a

when to use

跨时钟域时,数据同步的正确性。

Description

当enable使能之后,数据同步,会出现不稳定情况。
- fifo同步机制
- 握手同步机制
- 时钟门控单元的同步机制

潜在的问题

qualifier作为同步enable时,同步的不正确

how to debug and fix

原因可能:
1. 缺少reset信号
2. setup流程不正确或者不完整
3. 波形的初始值不正确(datahold经常是这个原因,即spyglass工具不能识别你的源时钟域触发器的输出信号,功能上是可以保证保持足够时间的。)

个人解决的思路(debug,使用gui界面更容易理解)

waveform viewer

G1(我理解,应该是下述信号的第几个变化点)
源时钟域
目的时钟域
源输出(就是源触发器的输出端口)
目的输入(就是目的触发器的的输入端口)
目的输出(就是目的触发器的输出端口)
有图形,可以看出data hold的危险。

根据设计,分析源输出的信号会保持多久?

如果能够保证“源输出”的信号,保留足够长时间,被目的时钟域的触发器正常采样到,就没有问题。
虽然,默认的严重级别是ERROR。


Ac_cdc08

Severity:Error

个人评价:设计里,Ac_cdc08是常见的异步处理规则。

when to use

控制总线,即控制信号不是单bit的信号。控制总线用于跨时钟域的情况下,有情况没有遵循格雷编码。
理解:
控制总线,没有经过格雷码译码。这是异步处理的标准方法之一。单位信号,可以简单的2级同步器同步;多位控制总线,一般利用异步fifo结构,而且异步fifo的控制信号,就是通过格雷码译码的。
为什么一定要用格雷码译码?
看异步fifo的教程,就可以知道,格雷码的编码特点,总线信号每次变化都有且仅有1位信号发生变化。这种编码特点,适合多位信号的同步。多位信号组成的bus[3:0]同步之前的变化,跟同步之后的变化是一致的,中间不会有其它不期望的状态变化。不画图解释了,网上多的是。

Description:

Reports control-bus clock domain crossings which do not follow gray encoding.
会检查以下三种同步机制:

  • 多级触发器同步
  • 利用同步单元进行同步
  • qualifier synchronization scheme using qualifier -crossing。我理解的是利用已经做过同步的控制信号,进行数据同步。

Parameters

保留

Constraints

需要定义的约束?
clock
reset
set_case_analysis
input ports要指定时钟域
cdc_false_path
quasi_static

Meassages and Suggested Fix

相关rule的显示,有可能是error、warning、info

message1

error:控制总线用于跨时钟域的情况下,有情况没有遵循格雷编码。
然后介绍潜在问题、不修复的风险、怎样debug并修复(而且提供了检查失败的原因分析)
原因和解决思路:
1. 存在潜在的reset导致的;需要在约束文件里定义这个reset信号。
2. setup(clock、reset、set_case_analysis、input ports要指定时钟域)不正确或者不全。这种情况,要formal setup rules检查。
3. waveform viewer的初始状态值不正确。这种情况需要在约束文件里提供正确的初始状态值,或者利用vcd文件加载正确的初始状态值。

message2

warning情况。Partially-Proved状态。
这种情况,应该不会多见。毕竟是SOC,没那么复杂。
spyglass cdc工具没有分析完全。出现这种问题,需要考虑以下几种情况。
1. 设置fa_atime参数,降低assertion run-time
2. 设置fa_propfile参数,使用递增性的分析方法;
3. 设置fa_abstract参数,即应用abstraction技术,使复杂的验证问题转为更小的能解决的问题。

meassage3

控制总线,跨越时钟域做同步的时候,遵循了格雷码的要求,是PASS的。
这种信息,叫INFO。
1. 一般来说,不会报告,可以设置fa_msgmode;去报告。

Example code and/or Schematic

有图有例子,并提供了解决方案。
技巧:
1. schematic,颜色有标注意义的。比如跨时钟域的交界线、源时钟域的信号逻辑区域、目标时钟域的信号逻辑区域、。

Reset_info01

Severity:info

when to use

用这个规则,可以查找设计中的异步和同步置位或者复位信号。

Description

定义了复位或者置位(统称为复位信号)的类型。

复位的位置复位的类型
复位来自输入端口叫primary复位
复位来自bbox黑盒子叫black box复位
复位来自触发器的输出叫derived复位
悬空的线网叫undriven复位
latch或者三态门的输出叫gated复位

附录:spyglass cdc debug理解

spyglass的错误报告,分组有多种。主要是下面两种。个人理解,利用Goal by rule去分组,按照spyglass执行流程,依次解决error和warning。有利于spyglass流程;因为Severity ERROR不一定是第一时间要解决的。而流程错误,需要第一时间解决。

通过Goal by rule去分组

通过Severity去分组

疑问?同一个复位信号,用做同步复位的同时,又用做异步复位。该怎么定义?

现在是定义为异步复位;因为定义为同步复位的时候,会提示异步复位信号未约束。

利用spyglass自动生成clock/reset约束,也许需要迭代几次才能找全。而不是一次就能找出所有的clock/reset信号。

黑盒子怎么设置,才算是完善的。

abstract_port

clock

约束写法,推荐period和edge参数都要写上。
周期默认单位是10ns,可以查询《spyglass consolidated constraints appnotes》

current_design rtl_ctrl
clock -name clka -period 10 -edge {0 5}

reset

分异步同步两种复位定义。
如果是复位信号,既做了同步,又做为异步复位使用;我理解是看做同步复位信号,因为看做同步复位信号,相对异步复位信号,会考虑同步复位信号的跨时钟域处理。

current_design rtl_ctrl
reset -async -name reseta -value 0
reset -sync -name resetb -value 0

set_case_analysis

input

个人理解

std_cellram等模块,不能吃lib,要吃有功能描述的.v;否则CDC会无法理解std_cellram的行为。
但不吃lib,又会报无法综合。

  • 15
    点赞
  • 193
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值