CDC检查是数字电路的必要检查之一,本节逻辑对应的一些常见的错误类型和原因,以供参考备用,一般工具会报出几种不同的分类,下面罗列出目前工作中碰见的问题:
1. Setup Stage
1. SETUP_RESET_UNDECL
Reset 未约束,采用create_reset来设置reset signals, 或者是其他原因进行解决即可。
2. SETUP_BBOXPIN_UNCONSTRAINED
block-box的管脚没有约束或者部分约束。确认连接关系,没问题waive了就行了。
3. CDC_UNSYNC_ASYNCRESET
复位信号没有经过目的时钟域同步,一般是目的端复位被异步时钟驱动,或者工具没有推断处同步逻辑,这个可以根据具体的设计来进行判断,确保功能符合预取
2. Sync Stage
1. CDC_UNSYNC_ASYNCRESET
异步复位没有同步释放, 需要排查设计,修改逻辑,或者可以确保reset和时钟的固定关系,不会引起reset异步释放问题。
2. CDC_UNSYNC_DATA
部分数据并没有经过同步,和同步的逻辑进行组合逻辑之后就进行使用了。
常规下是需要修改的,除非来自异步域的信号为准静态信号,且在逻辑上不会产生问题。
3. CDC_UNSYNC_NOSCHEME
跨时钟域信号没同步就被dest采集,默认是一定要进行修改的,除非是准静态信号。
3. cov_stage
3.1 CDC_COHERENCY_MULTI_SYNC
Multiple synchronization of same source SrcInfo.
经过逻辑再同步的处理机制是不好的,可能会导致数据到后续寄存器端的时间不同导致采样数据有问题;
不修复该问题可能有以下问题:
Data coherency issues if synchronized destinations driven by the same source converge. – 信号经过逻辑到达后一个时钟域的时间不同,可能引发数据不一致的问题,这个在跨时钟域边界,看一下是否有max dealy/data_check保证;这样的设计是不可重复使用的,因为由于潜在的收敛问题,芯片故障的风险很大
修复方式:
先同步,后分发,如果放在源时钟域的话,先做组合逻辑可能会有毛刺导致问题,非要在src侧做的话,就做完逻辑再寄存器输出,但是引入了一拍,这也遵循同步器之前不加组合逻辑的需求。
3.2 CDC_COHERENCY_RECONV_SEQ
Sequential convergence found at ConvergencePoint
//– 同步之后的聚合点,有寄存器参与,同步之后的同一个信号存在汇聚点
Clock1的数据在clock2中经过同步的信号,和经过同步之后打拍的信号最终进行组合逻辑,这在实际使用中需要确认用法,因为这种做法,可能是导致同步之后的信号组合和原始的值的组合不同,导致电路问题;
To fix the violation, either of the following needs to be done:
如果确认是设计需求,且不会引起数据一致性问题,可以忽略;或者用configure_cdc_convergence (-ignore_through_objects /-ignore_at_objects /-ignore_among_signals) command on the related nets or signals,设定约束。否则,将信号同步信号简化或者逻辑前移或者后移。
3.3 CDC_COHERENCY_ASYNCSRCS_RECONV_COMB
Combinational convergence found at ConvergencePoint –
//来自不同时钟域的信息,在目的时钟域中同步之后进行组合逻辑运算
解决办法:
1. 如果确认是设计需求,且不会引起数据一致性问题,可以忽略;或者用configure_cdc_convergence (-ignore_through_objects /-ignore_at_objects /-ignore_among_signals) command on the related nets or signals,设定约束;
2. 否则需要修改设计,;
3.4 CDC_COHERENCY_RECONV_COMB
Combinational convergence found at ConvergencePoint.
clk1的数据同步之后再clk2中做组合逻辑,存在逻辑汇聚点,存在多种不同的场景;这种场景是会存在问题的,因为再经过同步之后路径的delay可能存在不同,那么就可能会导致信号出现异常组合,导致不期望的信号组合导致逻辑失败,所以需要在设计中明确是否会存在对应问题,是否需要将同步信号简化,逻辑前移或者后移。
Refer to the related reason codes section and take any of the following steps based on the reason code reported.
- Reason Code: DIV_SRC_CONV
Same with GRAY_CHECK_IGNORED_DIV_SRC_CONV reason and solve ways;
- Reason Code: GRAY_CHECK_IGNORED_DIV_SRC_CONV
This kind of convergence can cause data coherency issues and may cause chip failure,可以采用以下方式修正这个问题:
1. 如果确认是设计需求,且不会引起数据一致性问题,可以忽略;或者用configure_cdc_convergence (-ignore_through_objects /-ignore_at_objects /-ignore_among_signals) command on the related nets or signals,设定约束
2. 修改设计,避免对应通路的产生;
- Reason Code: SYNC_SRC_CONV
需要查看电路结构来判断对应设计是不是符合预期;以下是建议动作:
1. 明确在source signals处,采用了gray码编码,确保没有coherency issue;
2. 如果是static signal引起的,可以采用create static进行约束;
3. 如果路径上的同步器对于汇聚点不是同时生效的,可以wavie
4. 如果涉及明确汇聚点不会引起数据一致性问题,可以采用configure_cdc_convergence (-ignore_through_objects /-ignore_at_objects /- ignore_among_signals) command on the related nets or signals进行设置;
5. 如果汇聚点是一个mux单元,那么这里肯定不会同时选中,那么采用disable the configure_cdc_convergence -disable_mux_exclusivity command进行设置;
6. 如果汇聚点是不同的domain,可以采用configure_cdc_convergence - stop_diff_domain command进行设置
3.5 CDC_COHERENCY_ASYNCSRCS_RECONV_SEQ
//来自不同时钟域的信息,在目的时钟域中同步之后,最后做逻辑,但其中一个在目的时钟域中多打了1拍以上;
解决办法:
1. 如果确认是设计需求,且不会引起数据一致性问题,可以忽略;或者用configure_cdc_convergence (-ignore_through_objects /-ignore_at_objects /-ignore_among_signals) command on the related nets or signals,设定约束;
2. 否则需要修改设计。
4.Glitch
CDC path contains structure resulting in potential glitch propagation to destination GlitchDestInfo.
1. Reason Code: GLITCH_SOURCE_RECONVERGES
同一个源头的不同路径可以会有不同的delay,可能产生不同的时间延迟,因此引起毛刺;
a. 修改设计;
b. 确保各个信号到达dest的时间是一样的; sdc中进行约束;
2. Reason Code: GLITCH_SOURCES_FROM_DIFF_DOMAIN
不同源头的delay可能不同,因此产生不同时间延迟,因此引起毛刺;
a. 确保setup clock是正确的;
b. 检查源信号是否是准静态的;
c. 如果满足上述两个条件,那么您可能需要修复设计;
3. Reason Code: GLITCH_SOURCES_FROM_SAME_DOMAIN
a . 检查源信号是否是准静态的
b. 可能需要修改设计