- debug rules的顺序
- Ac_unsync01
- Ac_unsync01
- Ac_datahold01a
- when to use
- Description
- 潜在的问题
- how to debug and fix
- 个人解决的思路debug使用gui界面更容易理解
- waveform viewer
- 根据设计分析源输出的信号会保持多久
- Ac_cdc08
- Reset_info01
- 附录spyglass cdc debug理解
根据工程遇到的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 rule
和Ac_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
- 如果源和目的实例,都在一个IP module里,要使用ip_block约束;
- 如果跨时钟域穿过一个黑盒子,保证黑盒子配置是正确的,可以使用下述两种方式的任一一种。
2.1 黑盒子,要设置好时钟域。(使用abstract_port约束)
2.2 黑盒子的pin已经定义feed through。(使用assume_path)
如果不想查看黑盒子的跨时钟域报告,可以设置cdc_reduce_pessimism参数到这个黑盒子bbox。 - 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_cell
和ram
等模块,不能吃lib,要吃有功能描述的.v;否则CDC会无法理解std_cell
和ram
的行为。
但不吃lib,又会报无法综合。