写在前面

         本文参考自《Clock Domain Crossing (CDC) Design & Verification Techniques Using SystemVerilog》—Clifford E. Cummings。

        主要讲述了如何进行跨时钟域设计。正文中,黑字为内容,浅蓝色字体是我的啰嗦。如果需要英文原文文章,可以评论留邮箱给我。

        系列文章:
        跨时钟域处理解析(一)(Clock Domain Crossing (CDC) Design & Verification Techniques Using SystemVerilog)

        跨时钟域处理解析(二)(Clock Domain Crossing (CDC) Design & Verification Techniques Using SystemVerilog)


        跨时钟域处理解析(三)(Clock Domain Crossing (CDC) Design & Verification Techniques Using SystemVerilog)


1.介绍

        2001 年,我发表了我的第一篇关于多异步时钟设计的论文。当时,我还没有找到任何好的资料来描述正确的多时钟设计所需的设计和综合技术。2001 年的论文是我多年来从实际ASIC 和FPGA 设计经验中收集到的技术集合。在2001 年的会议演讲结束时,数十位工程师和同事站出来与我分享了足够多的额外有趣的想法和技术,以撰写有关该主题的续集。在过去的八年里,我在我的高级和专家Verilog 和SystemVerilog 培训课程中加入了多时钟设计技术的指导,在同一时期,更多的同事和学生与我分享了更多有趣的多时钟设计技术。自2001 年发表第一篇多时钟论文以来,业界已在很大程度上将这些类型的设计方法确定为跨时钟域(Clock Domain Crossing,CDC) 技术。我将在本文中使用这种常见的命名法。


        这篇论文包括2001 年论文中描述的最佳技术以及过去十年与我分享的有趣且高效的多时钟设计技术的更新集合。实际的会议演示幻灯片将主要是自2001 年原始演示以来所采用的新技术的集合,仅保留足够的原始幻灯片来介绍基本的CDC 设计概念和问题。


        前言没什么好看的。


2.亚稳态

        亚稳态是指在设计正常运行期间的某个时间点,信号在一段时间内不会呈现稳定的0 或1 状态。在多时钟设计中,无法避免亚稳态,但可以减小亚稳态的不利影响。

        引用Dally 和Poulton 关于亚稳态的书[9]:

                “当用时钟对不断变化的数据信号进行采样时……事件的顺序决定了结果。事件之间的时间差越小,确定哪个先发生所需的时间就越长。当两个事件非常靠近地发生时,决策过程可能需要比分配的时间更长的时间,并且会发生同步失败。”

        图1 显示了在一个时钟域中生成的信号被采样得太靠近来自第二个时钟域的时钟信号的上升沿时发生的同步故障。同步失败是由于输出变为亚稳态并且在必须再次采样输出时未收敛到合法稳定状态而引起的。


        亚稳态的产生是由于寄存器采样不满足建立时间或保持时间要求导致的,亚稳态的产生是无法避免的,我们能做的只是想办法降低其发生的频率。在跨时钟域设计中,由于时钟域存在跨域,如果不采取手段,则会有很大概率会引入亚稳态。


2.1.为什么亚稳态是个问题?

        那么为什么亚稳态会成为问题呢?图2显示,穿越接收时钟域中附加逻辑的亚稳态输出会导致非法信号值在整个设计的其余部分传播。由于CDC 信号可能会波动一段时间,因此接收时钟域中的输入逻辑可能会将波动信号的逻辑电平识别为不同的值,从而将错误信号传播到接收时钟域中。 

        任何设计中使用的每个触发器都有一个指定的建立和保持时间,或者在时钟上升沿之前和之后数据输入不被合法允许改变的时间。这个时间窗口被精确指定为一个设计参数,以防止数据信号变化太接近另一个同步信号,从而导致输出进入亚稳态。 


        亚稳态最大的危害就是会将系统引入一个未知状态,对于许多设计而言,这无疑是致命的。


3.同步器

        在时钟域之间传递信号时,要问的一个重要问题是,我是否需要对从一个时钟域传递到另一个时钟域的信号的每个值进行采样?


3.1.两种同步场景

        跨CDC 边界传递信号时可能出现两种情况,确定哪种情况适用于您的设计很重要:

  1. 允许错过在时钟域之间传递的样本。
  2. 在时钟域之间传递的每个信号都必须被采样。

        第一种情况:有时不需要对每个值都进行采样,但重要的是采样值必须要准确。一个例子是标准异步FIFO设计中使用的一组格雷码计数器。在正确设计的异步FIFO 模型中,同步格雷码计数器不需要从相反的时钟域中捕获每个合法值,但至关重要的是采样值必须准确以识别何时发生满和空情况。


        第二种情况:CDC 信号必须被正确识别或识别和确认(即握手—译者注),然后才允许对CDC 信号进行更改。


        在这两种情况下,CDC 信号都需要某种形式地同步到接收时钟域中。


        并不是所有设计都需要全部数据都被采样。例如,异步FIFO设计中,就可以允许漏采的存在。因为异步FIFO的设计最重要的是正确(或者说不错误)地判断FIFO的空和满。漏采一些数据并不会对其判断空满造成错误,某种意义上还会使其设计更加安全。


3.2.双触发器同步器

        再次引用Dally 和Poulton[9] 关于同步器的内容:

                “同步器是一种对异步信号进行采样并输出与本地时钟或采样时钟同步的信号版本的设备。”

        数字设计人员使用的最简单常见的同步器是双触发器同步器,如图3 所示。第一个触发器将异步输入信号采样到新的时钟域中并等待一个完整的时钟周期以允许第一阶段输出信号上的任何亚稳态衰减,然后第一阶段信号被同一时钟采样到第二阶段触发器,其预期目标是第2 阶段信号现在是一个稳定且有效的信号,同步并准备好在新的时钟域内分配。

        理论上,当信号被计时到第二级以导致第二级输出信号也进入亚稳态时,第一级信号仍然可能是亚稳态。同步失败之间的时间间隔(MTBF) 概率的计算是多个变量的函数,包括用于生成输入信号和为同步触发器计时的时钟频率。可在Dally 和Poulton [9] 中找到对MTBF 计算的一种描述。

        对于大多数同步应用,两个触发器同步器足以消除所有可能的亚稳态。 


        双触发器同步,即为经典的打两拍,可适用大多数的一般设计。


3.3.MTBF —平均无故障工作时间

        对于大多数应用而言,重要的是对任何跨越CDC 边界的信号运行平均无故障工作时间(MTBF) 计算。在这个意义上,失败意味着一个信号被传递到同步触发器,在第一级同步器触发器上变为亚稳态,并在一个周期后在它被采样到第二级同步器触发器时继续保持亚稳态。由于信号在一个时钟周期后并未稳定到已知值,因此在采样并传递到接收时钟域时,信号仍可能处于亚稳态,从而导致相应逻辑的潜在故障。

        在计算MTBF 数字时,较大的数字优于较小的数字。较大的MTBF 数字表示潜在故障之间的时间间隔较长,而较小的MTBF数字表明亚稳态可能经常发生,同样会导致设计失败。

        Dally 和Poulton[9] 给出了一个很好的方程,其中对计算同步器电路的MTBF 可以进行非常彻底的分析。在不重复方程式和分析的情况下,应该指出直接影响同步器电路MTBF 的两个最重要因素是采样时钟频率(信号被采样到接收时钟域的速度)和数据更改频率(跨越CDC 边界的数据更改速度有多快)。

         从上面的部分方程可以看出,在更高速度的设计中,或采样数据变化更频繁时,故障发生的频率更高(MTBF 更短)。


        前面说了,亚稳态的产生是无法避免的,只能尽量避免。所以人们引入了MTBF这个参数来表征两次故障之间的时间,即多久会发生一次亚稳态。若能将MTBF控制在几十年(可以做到),则该设计即可视为几乎不会发生亚稳态的设计,毕竟我们的数字系统预期寿命也没那么长(军工级除外)。


3.4.三触发器同步器

        对于一些非常高速的设计,双触发器同步器的MTBF 太短,添加第三个触发器以将MTBF 增加到令人满意的持续时间。当然,满意与否是由设计师决定的。

        对于军工级或其相同级别设计、或者超高速设计,又或者可靠性要求较高的设计,可能需要打三拍,或者更多拍,这个取决于设计要求或公司规定。 


3.5.同步来自发送时钟域的信号

        关于 CDC 设计的常见问题:在将信号传递到接收时钟域之前寄存来自发送时钟域的信号是否是个好主意?问题中隐含的假设是CDC 信号将同步到接收时钟域;因此,它们不需要在发送时钟域中同步。这种合理化是不正确的,通常应该需要在发送时钟域中寄存信号。

        考虑一个示例,其中发送时钟域中的信号在传递到接收时钟域之前未寄存,如图6 所示。

        在此示例中,发送时钟域的组合输出可能会在CDC 边界处经历组合毛刺。这种组合毛刺大大增加了数据变化频率,可能会产生少量的振荡数据突发,从而增加在变化时可以采样的边沿数量,相应地增加采样变化数据和生成亚稳态信号的可能性。 


3.6.将信号同步到接收时钟域

        发送时钟域中的信号在传递到CDC 边界之前应该同步。来自发送时钟域的信号同步减少了可以在接收时钟域中采样的边沿数量,有效地降低了MTBF 方程中的数据更改频率,从而增加了计算失败之间的时间(有关说明,请参见第3.3 节)数据更改频率对MTBF 的影响)。

        在图7 中,aclk 逻辑在被传递到bclk 域之前在adat 触发器上建立。adat 触发器滤除触发器输入(a) 上的组合毛刺,并将干净的信号传递给bclk 逻辑。 


        显然,在数据被同步到异步时钟域前,首先需要在自己的时钟域寄存一拍,以消除组合逻辑产生的毛刺。防止毛刺被传播到其他时钟域,从而在数据采样时存在多个边沿,造成采样失败而发生亚稳态。


4.将快速信号同步到慢速时钟域

        如第3.1 节所述,如果CDC 信号在时钟域之间传递时无法漏采,那么在时钟域之间传递信号时考虑信号宽度或同步技术就很重要。

        与同步器相关的一个问题是,来自发送时钟域的信号在被采样之前可能会更改值两次,或者可能太靠近较慢时钟域的采样边沿。任何时间信号从一个时钟域发送到另一个时钟域时都必须考虑这种可能性,并且必须确定漏采的信号是否重要的问题。

        当不允许漏采时,有两种一般方法可以解决该问题:

  1. 一种开环解决方案,可确保无需确认即可捕获信号。
  2. 需要确认收到跨越CDC 边界的信号的闭环解决方案。

        本节将讨论这两种解决方案。


4.1.时钟域之间可靠的信号传递的要求

        一般来讲,快时钟域采慢时钟信号是没有问题的,基本都能采到;但是慢时钟域采快时钟信号则需要分情况讨论。


        如果较快时钟域的频率是较慢时钟域的1.5 倍(或更多),则将较慢的控制信号同步到较快的时钟域通常不是问题,因为较快的时钟信号将对较慢的CDC 信号采样一次或多次。意识到将较慢的信号采样到较快的时钟域比将较快的信号采样到较慢的时钟域引起的潜在问题更少,设计人员可能会利用这一事实,通过使用简单的两个触发器同步器在时钟域之间传递单个CDC 信号。


4.1.1.“三边”要求

        “三边”要求的实质是要保证信号足够长——能被接受时钟域采到。


        Mark Litterick[4] 指出,当通过双触发器同步器在时钟域之间传递一个CDC 信号时,CDC 信号必须比接收域时钟周期宽1.5倍。Littereick 将此要求描述为“输入数据值必须在三个目标时钟边沿保持稳定”。对于特别长的源和目标时钟频率,这个要求可能会安全地放宽到接收时钟域周期时间的1.25倍或更少,但“三边”指南是最安全的初始设计条件,并且通过使用SystemVerilog 断言比在仿真期间动态测量CDC 信号的分数宽度更容易证明。“三个边沿”要求实际上适用于开环和闭环解决方案,但闭环解决方案的实现会自动确保至少检测到所有CDC 信号的三个边沿。


4.2.问题 - 传递快速 CDC 脉冲

        考虑存在严重缺陷的情况,即发送时钟域的频率高于接收时钟域,并且CDC 脉冲在发送时钟域中只有一个周期宽。如果CDC 信号仅脉冲一个快时钟周期,则CDC 信号可能会在较慢时钟的上升沿之间变高和变低,而不会被捕获到较慢时钟域中,如图8 所示。


        此类情况就是慢采快直接采不到的可能性。


4.3.问题 - 采样一个长 CDC 脉冲 - 但不够长!

        此类情况就是慢采快,虽然不是单周期脉冲信号了,但任然无法被慢时钟域采到。


        考虑一些不直观和有缺陷的情况,其中发送时钟域向接收时钟域发送一个脉冲,该脉冲比接收时钟频率的周期略宽。在大多数情况下,信号将被采样并通过,但CDC 脉冲变化过于接近接收时钟域的两个时钟上升沿,从而违反第一个时钟沿上的建立时间的可能性很小但确实存在并且违反第二个时钟边沿的保持时间并且不形成预期的脉冲。这种可能的故障如图9 所示。 


4.4.开环解决方案 - 使用同步器采样信号

        该问题的一个可能的解决方案是在超过采样时钟周期时间的一段时间内置位CDC 信号,如图10 所示。如第4.1.1 节所述,最小脉冲宽度是采样时钟周期的1.5 倍。假设CDC 信号将被接收器时钟至少采样一次,也可能采样两次。

        当相对时钟频率固定并正确分析时,可以使用开环采样。

        优点:开环解决方案是通过CDC 边界传递信号的最快方式,不需要对接收信号进行确认。


        缺点:与开环解决方案相关的最大潜在问题是另一位工程师可能会将解决方案误认为通用解决方案,或者设计要求可能会发生变化,并且工程师可能无法重新分析原始开环解决方案。通过向模型中添加SystemVerilog 断言以检测输入脉冲是否未能超过“三个边沿”设计要求,可以将这个问题最小化。 


        此方法的本质是将脉冲信号拓宽,实际上就是讲快信号变为比满时钟域更慢的信号——降频。此类方法的缺陷是不够通用,若慢时钟变得更慢,则无法采样了。

4.5.闭环解决方案 - 使用同步器采样信号

        这个问题的第二个可能的解决方案是发送一个使能控制信号,将其同步到新的时钟域,然后将同步信号通过另一个同步器传回发送时钟域作为确认信号。


        优点:同步反馈信号是一种非常安全的技术,可以确认第一个控制信号已被识别并采样到新的时钟域中。


        缺点:在允许控制信号改变之前,在两个方向上同步控制信号可能存在相当大的延迟。 


        此方法的本质是先降频,后握手。通过接受时钟域反馈的信号来决定降频到什么程度。