调试规则顺序
Ac_unsync01
when to use
描述
消息和签名传真
潜在问题
how to debug and fix
个人解决的想法
Ac_unsync01
when to use
个人解决的想法
Ac_datahold01a
when to use
描述
潜在问题
how to debug and fix
个人解决的想法使用gui界面更容易理解
waveform viewer
根据设计分析从源输出的信号能保持多久
Ac_cdc08
安全错误
when to use
描述
参数
Constraints
Meassages and Suggested Fix
消息1
消息2
meassage3
example代码和方案
Reset_info01
when to use
描述
附录spyglass CDC调试理解
spyglass错误报告的分组有几种。 主要是以下两个个人的理解使用Goal by rule进行分组,根据spyglass的执行过程依次解析error和warning对于spyglass过程是有利的。 由于Severity ERROR不一定必须首先解决,因此必须首先解决进程错误
按Goal by rule分组
按Severity分组
我怀疑如何定义将同一个复位信号在同步复位的同时作为异步复位使用
要使用spyglass自动生成clockreset约束,可能需要多次重复,而不是一次找到所有的clockreset信号
黑匣子怎么设置才完美
摇滚音乐
重置
set_case_analysis
输入
个人理解
根据工程遇到的cdc规则,理解。
目标:
我熟悉rules的读法。 参考文档是《spyglass CDC rules参考指南》。 (另一本cdc的书是spyglass cdc submethodology,介绍spyglass作为cdc工具的方法论。 然后这个请先读一下。 有这两本书就足够了。 )
熟悉cdc遇到的错误、警告
调试的想法
错误一定有问题。 不要只关注结构上是否存在异步处理。 异步处理的实现可能有问题。 这可以从waveform分析。 例如,异步fifo在功能上被设计为axdll代码跳转不是按顺序进行的,而是在某些情况下从5迁移到0。此时,有一个错误报告。 而且确实是错误的设计。
调试规则顺序
按照以下步骤依次对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
找到了不同步的交叉时钟域信号。
描述
时钟域之间的信号没有执行同步处理。
消息和签名传真
潜在问题
进入准稳定状态。
how to debug and fix
如果源实例和目标实例都在一个IP模块中,则使用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的信号。控制总线用于跨时钟域的情况下,有情况没有遵循axdll编码。
理解:
控制总线,没有经过axdll码译码。这是异步处理的标准方法之一。单位信号,可以简单的2级同步器同步;多位控制总线,一般利用异步fifo结构,而且异步fifo的控制信号,就是通过axdll码译码的。
为什么一定要用axdll码译码?
看异步fifo的教程,就可以知道,axdll码的编码特点,总线信号每次变化都有且仅有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:控制总线用于跨时钟域的情况下,有情况没有遵循axdll编码。
然后介绍潜在问题、不修复的风险、怎样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
控制总线,跨越时钟域做同步的时候,遵循了axdll码的要求,是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}
1
2
reset
分异步同步两种复位定义。
如果是复位信号,既做了同步,又做为异步复位使用;我理解是看做同步复位信号,因为看做同步复位信号,相对异步复位信号,会考虑同步复位信号的跨时钟域处理。
current_design rtl_ctrl
reset -async -name reseta -value 0
reset -sync -name resetb -value 0
1
2
3
set_case_analysis
input
个人理解
std_cell和ram等模块,不能吃lib,要吃有功能描述的.v;否则CDC会无法理解std_cell和ram的行为。
但不吃lib,又会报无法综合。
---------------------