• 正文
  • 相关推荐
申请入驻 产业图谱

芯片设计 -- RDC问题分析和处理

06/09 08:26
3644
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

1. 什么是RDC?

RDC,即Reset Domain Crossing,一般是指信号跨越不同的异步复位域。RDC问题可能会产生亚稳态,导致芯片设计出问题。在设计时需要注意防范和处理RDC问题。

下面介绍几个RDC的典型实例。

RDC实例1:

如上图所示,d1信号先后经过了触发器F1和F2,F1和F2的复位域不同,分别为rst1和rst2。由于rst1异步复位拉低,导致q1信号发生变化(由高变为低),这样就会使触发器F2输出的q2信号可能产生亚稳态,导致芯片发生逻辑错误,如下图。

其实,主要原因是rst1为异步复位,可能在任意时刻发生复位,F1的q1立刻会发生变化,这个变化如果落在F2的setup/hold时间窗口里,就会导致setup/hold违例, 从而产生亚稳态。还有一个重要原因是:async reset assert的路径无法被STA约束,因为异步复位的assert可以在任何时间发生,所以没有办法做STA。
如果将rst1进行同步处理(异步复位,同步释放)再给到F1,那么依然是存在RDC问题的,异步复位的异步是RDC问题,而同步释放(是否做了同步)则是CDC问题。CDC path和RDC path有可能重叠。

RDC实例2:

在某些情况下,即使只有一个异步复位也会导致RDC问题。

如下图所示,rst1异步复位给到了触发器F1和F2,但是在给到F1之前delay了3个时钟周期,这样如果rst1的assert持续时间(例如2个周期)小于delay时间,那么就会产生RDC问题。因为F1发生复位时,F2已经复位完成并进入工作状态了。

2. RDC问题处理方法

接下来介绍几种常见的RDC解决方法。首先最简单直接的方法就是不使用异步复位,而是用同步复位。因为同步复位的assert和deassert都可以被STA给约束,所以不会产生RDC问题。如果无法避免使用异步复位且RDC问题确实存在,那么可以参考以下几种方法。

1. 控制复位顺序

例如在RDC实例1中,可以通过硬件设计或者软件来控制复位顺序,保证rst2比rst1先assert。这样在rst1 assert时,触发器F2输出的q2信号会处于稳定的复位值,不会产生亚稳态。

如果保证了复位顺序的话,可以在spyglass中通过如下命令来声明复位顺序:set_rdc_define_assertion_sequence -from_reset {rst2} -to_reset {rst1}

2. 控制时钟和复位顺序

例如在RDC实例1中,如果可以在rst1复位assert之前,将F2的clock给gating住(关闭),那么也可以解决RDC的问题。

可以在spyglass中通过如下命令来声明复位和时钟的顺序:set_rdc_define_assertion_sequence -from_reset {rst2} -to_clock {clk}

3. 加同步器

例如在RDC实例1中,可以在对F1的输出q1进行打拍同步,再给到F2。这样F2的输入就不会产生setup/hold violation了,但是同步器可能会影响原来的逻辑关系,并且带来一些面积开销。

4. clamp钳位控制

还有一种常用的方法是加钳位控制。例如下图,在触发器F1的输出端加一个与门(或者或门),在rst1复位assert期间,通过clamp信号来控制与门的输出为0(或门的输出为1)。这样当F1异步复位时,F1输出的q1的变化不会影响到F2,从而就不会产生亚稳态和RDC问题了。

参考内容:

掌握了CDC,你听说过RDC吗

https://blog.csdn.net/weixin_45260499/article/details/133920719

https://www.cnblogs.com/lanlancky/p/17400758.html

相关推荐