精华内容
下载资源
问答
  • 跨时钟域之全面解析

    千次阅读 多人点赞 2020-07-04 17:33:47
    跨时钟域(Clock Domain Crossing,CDC)信号处理问题,首先要考虑的就是亚稳态。 1.亚稳态 亚稳态是指在设计的正常运行过程中,信号在一定时间内不能到达稳定的0或者1的现象。 在多时钟设计中,亚稳态是不可避免的...

    跨时钟域(Clock Domain Crossing,CDC)信号处理问题,首先要考虑的就是亚稳态。

    1.亚稳态

    亚稳态是指在设计的正常运行过程中,信号在一定时间内不能到达稳定的0或者1的现象。

    在多时钟设计中,亚稳态是不可避免的,可以减少亚稳态的发生和传播,消除亚稳态的有害影响。
    在这里插入图片描述
    上图中在信号adat传输到bclk中采样,由于采样时间靠近第二个时钟的上升沿,发生同步失败。同步失败是由于输处bdat变为亚稳态,而在bdat再次被采样时没有收敛到合法的稳定状态。

    为什么会产生亚稳态?
    存储元件,如交叉耦合反相器、SR锁存器、D锁存器和D触发器等都有两个稳定的状态,即0和1,也就是能存储0和1这两个状态。亚稳态就是既不是0又不是1的状态。在分析元器件时,把器件抽象为理想器件以简化分析,但实际的元器件并不是理想的,一个理想的CMOS反相器的电平传输特性如下所示:
    在这里插入图片描述
    理想的CMOS反相器件的电平传输特性:
    在0 < VIN < VM时,VOUT= V+
    在VM < VIN < V+时,VOUT=0

    刚好在VM这个点就能完成“突变”,界限明确。实际上变化时一个过程的。实际的CMOS反相器电平传输特性如下:
    在这里插入图片描述

    在0 < VIN < VIL时,VOH < VOUT < VMAX
    在VIH < VIN < V+时,Vmin < VOUT < VOL
    在VIL <VIN <VH时,VOUT = VIN(VOL < VOUT < VOH)

    如果在后一级的判断电路把低于VOL电压判断为0,把高于VOH的电压判断为1,那么在输入VIL–VLH这个范围的电压产生的VOUT后一级电路就不能判断当前是0还是1,有可能是0,有可能是1,不能准确预测它的输出。

    实际情况下,没有一个点来作为分界线,实际电路做不出来。实际上是高于VH才算1,低于VL才算0,VH>VL,也就是说高阈值VH和VL之间是由一段距离的。

    当输入数据不满足寄存器的建立时间和保持时间的时候,寄存器很可能捕捉到输入数据的电平在未定义的电平区间,就是亚稳态。

    不是每个违反寄存器建立时间和保持时间的信号翻转都会导致亚稳态。一个寄存器进入亚稳态和从亚稳态进入稳态的时间依赖与制造商的制造工艺和使用环境。大部分情况下,寄存器会很快的进入一个定义的稳态中。

    亚稳态的危害

    由于亚稳态的输出在稳定下来之前可能是毛刺、振荡、固定的某一电压值,因此亚稳态除了导致逻辑误判之外,输出在0~1之间的中间电压值还会使下一级产生亚稳态(导致亚稳态的传播)。逻辑误判有可能通过电路的特殊设计减轻危害,亚稳态的传播扩大了故障面,难以处理。

    电平信号的逻辑误判一般只会对电路造成几个时钟的延时,后面还会稳定在需要的电平,不会造成逻辑错误。

    亚稳态信号的稳定时间通常比一个时钟周期要短的多。一般情况下不会超过一个或者两个周期,取决于触发器的性能。
    如果亚稳态超过一个或者两个周期,那么就会被下一个触发器采样到,这样就会造成亚稳态的传播。

    在这里插入图片描述
    上图的bdat1的亚稳态在下一个时钟沿还没稳定,就造成了亚稳态的传播。这里可以选择更快的触发器,减少亚稳态收敛的时间。

    亚稳态的量化公式
    设计人员采用平均故障间隔时间(MTBF:mean-time-between-failure)这个指标来估算从问题出现并导致故障的两个事件间的平均时间。MTBF越高,说明设计的稳定性越好。如果发生了故障,只是说明没有解决亚稳态的问题,并不是系统本身真的出现了问题。

    在这里插入图片描述
    C1和C2代表器件的相关的常数,器件的建立时间和保持时间越小,C2越小,MTBF就越大。所以可以通过更快的触发器,来减少亚稳态发生的概率。

    在这里插入图片描述
    数据变化频率越小,采样时钟越低,MTBF越大。

    减少亚稳态的方法
    亚稳态是不可避免的,是器件的固有属性。可以减少亚稳态的发生和传播,避免亚稳态带来的消极影响。

    减少亚稳态的方法有以下几种:
    (1)使用同步器:比如常用的2级或者多级FF打拍的方法
    (2)降低频率:如果能满足功能要求,降低频率能够减少亚稳态的发生。
    (3)避免变化过快或者过于频繁的信号进行跨时钟采样。
    (4)采用更快的触发器:更快的触发器,也可以亚稳态的产生

    同步器
    信号跨时钟边界,一般有两种场景:
    (1)信号跨时钟边界,可以漏掉某些值
    (2)信号跨时钟边界,不能漏掉任何值

    两级触发同步器
    在这里插入图片描述
    (1)如果亚稳态维持的时间不止一个周期,在下一个时钟上升沿没有稳定,那么第二级的FF也会进入亚稳态,这种情况的概率是1/MTBF

    (2)第一级亚稳态在下一个时钟上升沿稳定,但是被是识别为0,那么第二级的FF输出bq2_dat就是0,说明信号跨时钟采样失败。但是这种情况不会造成亚稳态的传播,也就是不会影响后面的设计。针对这种情况,一般会改变设计,不会让快时钟域的单cycle脉冲,跨时钟到慢的时钟内采样。

    三级或多级同步器
    在高速、超高速设计中,两级的MTBF可能还不够,为了保险会采样三级或多级同步器。
    3级FF的MTBF是2级FF的MTBF的7倍。

    同步器的输入:源时钟寄存
    采用同步器的另外一个要求:通常,需要跨时钟的信号,需要在源时钟经过一级FF进行寄存输出。即,跨时钟信号必须是寄存器的输出,中间不能有组合逻辑。如果输入不是寄存器的输出,是组合逻辑的输出,会是如下情况:
    在这里插入图片描述
    可以看到,adat是组合逻辑的输出,变化的频率更快了,根据MTBF公式:
    在这里插入图片描述
    数据变化太快,会减少MTBF,增加亚稳态发生的概率。如果adat是FF的输出,根据FF的特性,输出在一个时钟周期内是不会改变的,数据的变化频率不会超过时钟频率,这样就能降低跨时钟信号变化的频率,减少亚稳态发生的概率:
    在这里插入图片描述
    在使用同步信号时,要求理解了其中的原理,要求输入信号必须是源时钟域的寄存器输出。

    2. 跨时钟信号处理方法

    跨时钟域的信号可以分为单bit信号和多bit信号。

    单bit信号跨时钟域的处理
    信号跨时钟域,根据两个异步时钟之间的关系可以分为:
    (1)信号从快时钟域到慢时钟域
    (2)信号从慢时钟域到快时钟域

    单bit信号一般采用同步器来做CDC(clock domain crossing)。由于在CDC时,会在源时钟域做寄存器输出,所以信号的变化频率不会超过源时钟的频率,所以这里可用两个时钟间的快慢来分类。

    快时钟域到慢时钟域

    信号从快时钟域到慢时钟域CDC如下图所示:
    在这里插入图片描述
    当在aclk中生成的信号adat被送到了另一个时钟域bclk中采样,由于采样时间太靠近第二个时钟的上升沿,发生的同步失败。同步失败是由于输出bdat1变为亚稳态,而在bdat1再次被采样时没有收敛到合法的稳定状态。

    如果是电平信号进行CDC,不用考虑时钟快慢,直接用同步器就可以,因为总能被采样到。

    快时钟到慢时钟的(单bit)信号处理,主要问题是信号在快时钟域中,可能会多次改变,这样慢是可能来不及采样导致数据丢失。这个问题被称为信号宽度问题,在CDC检查工具中,如果快时钟的信号宽度不足,就会报出CDC违例。

    快时钟到慢时钟的(单bit)信号处理分为两种:
    (1)采样丢失是被允许的。单bit信号一般不会是这种情况,如果是,直接用同步器同步就行。
    (2)采样丢失不被允许。这样就用其他手段来保证数据不丢失。主要原理是保证快时钟与的信号宽度满足一定的条件,使得慢时钟域有足够时间采样到。

    信号宽度的“三时钟沿”要求
    比较安全的宽度是,快时钟域的信号宽度必须是慢时钟域周期的1.5倍以上。也就是要持续3个时钟沿以上(上升沿和下降沿都算)。这个被称为“三时钟沿”要求。

    下面是一个CDC信号只持续一个周期的例子:
    发送时钟域的频率高于接收时钟域,而CDC脉冲在发送时钟域只有一个周期宽,这样CDC信号可以在慢时钟上升沿之间变动,不会被捕获到慢时钟域。
    在这里插入图片描述

    如果CDC信号宽度超过慢时钟周期,但是不足1.5个周期,也会发生问题。
    在这里插入图片描述
    如上图所示,信号宽度超过了一个慢时钟周期,但是可能会setup和hold time违例,导致信号采样失败。

    信号宽度问题的解决方法:

    通过保证信号宽度满足超过慢时钟周期的1.5倍,来解决这个问题,这是最直接,也是跨时钟最快的方法。可以通过system verilog加“断言”的方式来检测是否满足条件。

    但实际中很少用这种方法,因为设计可能会变,设计人员在改变设计时,可能会忘记这个限制。

    所以,通常还是通过“握手”的方式来保证数据被采样到。

    通常的做法是:发送一个使能控制限号,将它同步到新的时钟域,然后通过另一个同步器将同步信号作为确认信号作为确认信号传回发送时钟域,如下图所示:

    在这里插入图片描述
    优点:
    同步反馈信号是一种非常安全的技术,可以识别第一个控制信号并将其采样到新的时钟域中。

    缺点:
    在允许控制信号改变之前,在两个方向上同步控制信号有相当大的延迟。也就是时候,在应答信号到来之前,是不允许源信号改变的。

    在实际的芯片设计中,脉冲(宽度有限)信号的同步都是采用这种握手机制来处理。

    慢时钟到快时钟域

    慢时钟域到快时钟域的CDC,直接使用信号同步器就可以了。

    目标时钟频率必须是源时钟频率1.5倍或者以上,才能算慢时钟到快时钟的CDC。
    只有满足快1.5倍以上,才能满足“三时钟沿要求”。才能保证快时钟域能够采样到慢时钟域的脉冲。

    如果目标时钟域只快一点,为保险起见,还是用握手机制。

    有的设计中为了保险和以后修改的方便,或者不清楚时钟之间的关系,都会按照握手机制来处理。

    多个信号跨时钟的处理

    不同同步器的芯片上的走线也可能不同,导致延时不一样。会导致后端走线难度增大。

    在CDC检查的时候,会有专门的规则来检查是否采样了多bit信号用同步器聚合使用的情况。

    多个信号CDC策略可以分为以下几种:
    (1)多个信号合并,在可能的情况下,将多个CDC合并为1位的CDC信号
    (2)多周期路径发。使用同步负载信号安全地传递多个CDC位。
    (3)使用格雷码传递多个CDC位。
    (4)使用异步FIFO来传递多位信号
    (5)使用DMUX电路结构进行多位信号传递

    多个信号合并

    有时候并不需要将多个信号做CDC。下面是将两个信号合并为1位信号做CDC。

    下图中,接收时钟域中的寄存器需要加载信号和使能信号崔你那个将数据值加载到急促器中。如果负载和使能信号都是在同一个发送时钟边缘上驱动的。那么控制信号之间的小偏差就有可能导致两个信号在接收时钟域中同步到不同的时钟周期。在这种情下,数据不会被加载到寄存器中,就会出问题。
    在这里插入图片描述
    解决方法是,将控制吸纳后b_load和b_en合起来;b_lden = b_load & b_en同步到aclk时钟域中。

    下面这个例子中,显示了两个使能信号,aen1和aen2,它们从发送时钟域依次驱动到接收时钟域,以控制流水线数据寄存器的使能输入。问题是同步器并不能保证两个cycle一定能同步过来,下面的同步器花了3个cycle才tongue完成数据,导致流水线寄存器不能“流水”起来。

    在这里插入图片描述
    该问题的解决方案是只向接收时钟域发送一个控制信号,并在接收时钟域内生成第二个相移流水线使能信号。

    在这里插入图片描述在这里插入图片描述

    多周期路径(Multi-Cycle Path,MCP)
    下图显示在时钟域之间传递两个编码控制信号。如果这两个编码信号在采样时略有偏差,则在接收时钟域中的一个时钟周期内可能会产生错误的解码输出。

    在这里插入图片描述
    多位数据问题可以用“多周期路径法(MCP)”来解决。
    MCP方法是指直接不同步将数据发生到目标时钟域,但是同时送一个同步过的控制信号到目标时钟域。数据和控制信同时发送,允许数据在目标寄存器的输入端进行设置,同时控制信号在到达目标寄存器的负载输入端之前做同步。

    MCP优点:
    (1)不需要在发送时钟域计算适当的脉冲宽度
    (2)发送时钟域只需要将enable toggle到接收时钟域,表示数据已经被传递完成,已经准备好被加载,使能吸纳后不需要返回到初始逻辑电平。

    MCP方法的实质是,不同步多位的数据,只同步一位的控制信号,通过握手保证控制信号能够正确传输,然后在目标时钟域通过控制信号来采样数据。

    MCP需要用到“同步脉冲器”:
    在这里插入图片描述
    同步脉冲器的符号表示如下:在这里插入图片描述

    多周期路径法有两种方法来传递多位信号:在这里插入图片描述
    多周期路径法的思想十分有用,但是实际中用来传递多位信号比较少见,因为逻辑过于复杂。但是MCP方法用来传递单bit的信号却十分有用。

    格雷码

    对于计数器的CDC,大部分是不需要的,如果需要,那就使用格雷码。

    格雷码每次只允许更改一个位,从而消除了跨时钟域同步更改多个CDC位所带来的问题。

    需要注意的是:格雷码必须是计数到2^n才是每次改变一个bit。

    如果计数器是从0-5计数,那么从5–0的计数就不止一个bit改变,就失去了只改变一个bit的初衷。

    格雷码最常见的应用是在异步fifo中,通常异步fifo的深度都是2^N。原因如上,就算浪费面积,也需要把FIFO深度设置为2 ^ N.

    异步FIFO(AFIFO)
    就是深度为2的AFIFO,来进行多bit数据的CDC. 如下图所示:

    在这里插入图片描述
    2个寄存器搭建的AFIFO,地址只需要一位。相比MCP方法,逻辑简单,可以复用AFIFO代码(一般公司都有芯片验证过的AFIFO代码),而且延时也比MCP方法小。

    DMUX(数据分配器)
    有一个输入端和多个输出端1,其逻辑功能是一个输入端的信号发送到多个输出端中某一个,简称DMUX,作用与MUX正好相反。

    在这里插入图片描述

    3.SpyGlass CDC流程

    数字电路的集成度越来越高,设计也就越复杂。系统很少都只工作在一个时钟频率之下。一个系统中往往会存在多个时钟,这些时钟之间有可能是同步的,也有可能是异步的。一个系统中,异步时钟之间存在信号通道,则就会存在CDC(clock domain crossign)。

    下图中,CLKA和CLKB之间没有固定的相位关系,是异步时钟。前半部分设计属于时钟域CLKA,后半部分设计属于时钟域CLKB。DA信号从时钟域CLKA进入到时钟域CLKB,是一个跨时钟域的信号,这条路径被称为CDC path。

    在这里插入图片描述
    CDC(Clock Domain Crossing)是前端设计中最常见的问题。在RTL中要恰当的处理每个异步的控制信号和数据信号,否则就会出现亚稳态,造成严重的function false。

    SpyGalss是目前业界唯一可靠的RTL Sign off解决方案,可以帮助客户在设计早起发现潜在问题,保住产品质量,极大的减少设计风险,降低设计成本。

    包括五大模块:lint,CDC(跨时钟域检查),LP(低功耗),Constraint(约束),DFT(可测试性)。

    在这里插入图片描述
    SpyGlass CDC分析使你能够识别设计中的CDC问题。SpyGlass CDC tool是中Formal Check Methodology工具,相比写case跑仿真来找CDC问题,靠SpyGlass能更早,更全,更快的发现CDC问题。它能够:
    (1)管理是多时钟域设计
    (2)系统地处理CDC问题
    (3)检查和报告任何不同步的信号:时钟和复位

    SpyGlass CDC与静态时序分析相比:
    (1)STA对async interface不太好使,只适合sync模块分析
    (2)CDC paths总是需要设置成false paths
    (3)一般在design的后期能在netlist level做才有意义

    SpyGlass CDC与功能仿真相比:
    (1)黑盒测试很难穷举
    (2)白盒测试需要assertions
    (3)需要覆盖CDC的所有test branches
    (4)很难幸运的覆盖所有,一般只能发现部分问题
    (5)一般在design后期才发现问题

    当soc design设计的clock domain太多,用到很多第三方IP,及设计人员水平参差不齐时,用SpyGlass CDC来检查保证RTL质量是十分必要的。

    在工程的block-level和SOC集成的两个不同阶段,所用的CDC Goal也是有所不同的。Block-level关心的是模块内部,只有模块内部检查没问题后才能做deliver,而SOC集成主要关心的是模块间interface 的CDC问题。

    展开全文
  • 跨时钟域处理--最终详尽版

    千次阅读 多人点赞 2020-03-27 23:30:40
    跨时钟域处理–最终详尽版 文章目录跨时钟域处理--最终详尽版1. 异步时序定义2. 亚稳态3. 单比特同步策略方法一:双锁存器注意问题1注意问题2注意问题34.多比特同步策略控制信号多比特同步同步变化的控制信号控制...

    跨时钟域处理–最终详尽版

    为了彻底理解跨时钟域问题,多方搜集资料,做个简单整理备忘。主要参考了如下几个资源:

    1. https://zhuanlan.zhihu.com/p/45186793 跟IC君一起学习集成电路
    2. https://www.cnblogs.com/PG13/p/10329678.html 新芯时代
    3. 格雷码 https://www.cnblogs.com/zhuruibi/p/8988044.html
    4. 主要参考来源:“ASIC 中的异步时序设计” 王夏泉 华中科技大学
    5. 主要参考来源: “Clock Domain Crossing (CDC) Design & Verification Techniques Using SystemVerilog”
    6. https://blog.csdn.net/lovingduo/article/details/77723219

    1. 异步时序定义

    异步时序设计指的是在设计中有两个或以上的时钟, 且时钟之间是同频不同相或不同频率的关系。而异步时序设计的关键就是把数据或控制信号正确地进行跨时钟域传输。

    2. 亚稳态

    每一个触发器都有其规定的建立(setup)和保持(hold)时间参数, 在这个时间参数内, 输入信号在时钟的上升沿是不允许发生变的。 如果在信号的建立时间中对其进行采样, 得到的结果将是不可预知的,即亚稳态。

    触发器进入亚稳态的时间可以用参数 MTBF(mean time between failures)来描述, MTBF即触发器采样失败的时间间隔,其公式描述如下:

    M T B F = e t r / τ / T 0 f a MTBF = e^{t_r/\tau}/T_0fa MTBF=etr/τ/T0fa

    其中:

    • t r t_r tr = 分辨时间(时钟沿开始)
    • τ , T 0 \tau,T_0 τ,T0 = 触发器参数
    • f f f = 采样时钟频率
    • a = 异步事件触发频率

    通常,MTBF越大说明系统采样失败的可能越小。可见,对于高速的设计,MTBF是更容易发生的。对于一个典型的 0.25µm 工艺的 ASIC 库中的一个触发器,我们取如下的参数:

    tr = 2.3ns, τ = 0.31ns, T0 = 9.6as, f=100MHZ, a = 10MHZ, MTBF = 2.01 days

    也就是说触发器以100MHZ工作,假设异步事件触发的频率,也就是数据变化的频率跟采样时钟频率相同。我们用10MHZ的频率去不停地采它的数据,每个上升沿数据都会发生变化,则每两天就可能采集到一次亚稳态(个人理解,如有误请指正)。如果使用单锁存器同步,b的时钟上升沿采集a的数据时很可能采到亚稳态数据。

    3. 单比特同步策略

    方法一:双锁存器

    为了避免亚稳态,应该使得MTBF尽量大。采用双锁存器可以改善这一问题:

    当使用了双锁存器以后, b_dat2 的MTBF由以下公式可以得出:
    M T B F = e ( t r / τ ) / T 0 f a × e ( t r / τ ) / T 0 f a MTBF = e^{(tr/τ)}/ T_0fa × e^{(tr/τ)}/ T_0fa MTBF=e(tr/τ)/T0fa×e(tr/τ)/T0fa
    如果我们仍然使用上一节所提供的参数,则b_dat2 的MTBF为 9.57*109(years)。由上述结果可以看出,双锁存器法可以消除亚稳态问题。

    注意问题1

    时钟域B两级同步的寄存器跟时钟域A的输出寄存器之间不能有组合逻辑。组合逻辑电路各个输入信号的不一致性以及组合逻辑内部路径的延时时间不一样,运算后的信号存在毛刺如图(2),我们无法预先知道CLKB 的上升沿何时会到来,CLKB 采样到的信号就无法预知。

    因此,要想CLKB 能采到稳定的信号,时钟域A的信号必须是经过CLKA 敲过,在一个时钟周期内是稳定的信号,如图(3)所示:

    注意问题2

    Clock-gating enable 信号没有经过异步处理:

    在下图中a_in 信号经过CLKA的DFF敲过,再送到两级DFF 同步器处理,完全没毛病。但是F2的使能信号EN是从时钟域A来的,当EN信号变化的时候,由于时钟域不一样,无法保证使能之后的CLKB信号采样数据时满足setup/hold time 要求,这时F2输出信号也就变得无法预测了。因此对clk gating的信号也要做处理。

    注意问题3

    如果较快的时钟域是较慢时钟域频率的1.5倍(或更多),那么将较慢的控制信号同步到较快的时钟域通常不是问题,因为较快的时钟信号将采样较慢的CDC信号一次或多次。因此将快采慢比慢采快引起的潜在问题更少,所以对于快采慢的情况,使用简单的两个触发器同步器在时钟域之间传递单个Clock Domain Crossing (CDC)信号即可。

    而对于慢采快的情况则最好更加稳妥些,一般要求在接收时钟域中采样信号要保持三个时钟上升沿的时间(“three edge” requirement),也就是1.5倍的采样时钟周期。一般来说1.25倍也够。

    如果采样信号维持时间过短,则慢时钟域很可能会漏采:

    即使采样信号比采样周期略长,也可能会面临信号改变正好落在时钟沿的setup和hold violation的区域:

    解决方案:
    1.开环地控制信号的长度

    不需要知道接收时钟域的边沿信息,只要在发送域保证发送信号的长度就可以。

    2.闭环控制
    采用反馈信号自动延长快时钟域的信号:

    将A时钟域要传输的信号打一拍送到B域中进行双reg同步,同步之后的信号在反馈会A中,A中再进行双reg同步,当A域中反馈同步信号变为高时才将被采信号拉低,这样的方法时比较稳妥的,但是会有更多的延时,并且需要更多同步reg。
    FF1由源时钟驱动,输入变高,FF1输出变高。FF1的Q输出反馈通过与门和或门保证了在FF5输出为0时,只要FF1输出变高,FF1输出就一直保持高。直到FF3同步输出变成1后,FF5输出变成1,与门输出0。这时只要输入为0,FF1输出即为0

    扩展*

    同样一个快时钟域的脉冲信号,其宽度只有快时钟域的一个周期的长度,现在需要将该信号同步到一个相对较慢的时钟域,如果要求不能在快时钟域将脉冲信号展宽,并且同样采用双寄存器同步,该如何实现?
    下面的这个电路可以解决这一问题:

    这个电路跟异步复位同步释放很像,其原理是通过把要处理的异步脉冲当作第一个DFF的时钟输入,这样当有脉冲时该级会拉高,之后后面两级同步器检测到后将第一个DFF置位,这样第一个DFF就置为0,后级之后也变为0. 这种同步器的好处在于不需要再源时钟域对信号做处理,但是缺点也很明显,因为需要将信号作为时钟,会消耗额外的时钟资源,并且该信号的毛刺会导致不可预知的错误。 所以上面这种同步器实际上不推荐使用。还是老老实实展宽脉冲吧。

    4.多比特同步策略

    经常会遇到多个比特的控制信号或者数据信号跨时钟域传输的问题,解决这类问题的出发点主要有:

    • 尽可能将这些信号合并成单bit
    • Multi-cycle path (MCP). 使用同步信号。
    • 使用Gray码

    控制信号多比特同步

    同步变化的控制信号

    例如下面的例子,load和en作为两个控制信号需要跨时钟同步。两个信号可能需要同时拉高才能正确操作,但是实际同步时可能两者存在一定skew,导致再同步域两级reg同步后两个信号错开,导致控制失败:

    这种解决办法也很简单,只要将他们合并成一个即可:

    控制信号多比特之间有一定时钟相位差

    这种情况下,如果两个信号隔开固定的相位,在传输过程中可能会有一定偏移,则同步时也会导致下面的问题:

    可见,ld2信号和ld1信号的相位间隔被改变了,而这通常不是我们希望的。解决办法是只传输其中一个信号,另一个信号在同步域内产生。例如上面的例子可以将ld1在B时钟域通过ld1打一拍得到:

    数据多比特同步

    在数据的多比特传输时更要注意skew的问题,如果bit之间有skew,则传输值很可能出错:

    主要有两类解决方法: 1. Multi-Cycle Path (MCP) formulation 多周期路径规划(名字怪怪的,感觉就是握手机制) 2. FIFO

    方法一:脉冲同步法(开环的结绳法)

    首先用到的一个电路是脉冲产生电路:

    一个典型的脉冲同步器用于信号同步的例子:

    或者还有另一个版本更加清楚一些:

    脉冲同步器的工作方式如下:

    1. 在A时钟域产生一组单周期脉冲,其间隔至少需要比B时钟域的两个时钟周期大,否则B中无法进行边沿检测。同时这组脉冲也表示了A中数据传送的开始和结束。
    2. 在A时钟域中,两个脉冲被电平翻转器(可以由异或门或者mux+inv构成)将脉冲之间的区域变为一段高电平(结绳toggle)
    3. A中的结绳信号在B中通过边沿产生器翻译为两个单周期脉冲
    4. B中需要由逻辑去监测脉冲并进行信号的采样

    仿真案例:

    (有时间再自己写个仿真下)

    方法二:闭环结绳法

    上面的脉冲同步信号实际上是开环产生的,需要考虑B时钟域的周期宽度。而下面这种闭环方式解决了这个问题:

    其具体原理是:

    1. 首先,asend生成一个脉冲,经过结绳、解绳到B中变为另一个脉冲
    2. 该脉冲反馈回A中通过边沿采样变回A中的单周期脉冲(因为这边讨论的是慢采快,所以A总能采到B的单周期脉冲)
    3. 一个简单的FSM接受反馈的脉冲并给出ready信号,表示单次采样结束,A模块可以改变adata的数据了,同时控制asend信号给出一个新的脉冲,代表单次传输结束,结绳解绳到B中后B也接受到了结束脉冲。

    上面的这种方法还是不够完备,因为反馈信号也是单周期脉冲,在上面第二步中可以发现,如果A的频率比B慢,采不到脉冲岂不是僵硬,所以为了通用,慢采快还是快采慢都能适配,干脆在B中也加入A的的结绳以及FSM来控制整个流程,原理图如下:

    可见,B中的状态机接收到脉冲后输出valid信号告诉外面B可以采数据了,bload置高,数据开始采样,之后b_ack置高,送入A中产生结束脉冲,结束脉冲返回B中后FSM跳回not valid状态,一次传输结束。

    下面是上面的简陋版本:

    其中标明_clk1 的信号表示该信号属于 clk1 时钟域, 同理标明_clk2 的信号表示该信号属于 clk2 时钟域。在两次src_req_clk1 之间被 src_vld_clk1“ 结绳” (pluse2toggle),在将src_vld_clk1 用双锁存器同步以后, 将该信号转换为 dst_req_clk2(toggle2pluse)。同理,用dst_vld_clk2 将 dst_req_clk2“结绳”, dst_vld_clk2 表明在 clk2 时钟域中, src_dat_clk1 已经可以进行正确采样了。 最后将 dst_vld_clk2 转换为 dst_ack_clk1(synchronizer and toggle2pluse), dst_ack_clk1 表明 src_dat_clk1 已经被 clk2 正确采样了, 此后 clk1 时钟域就可以安全地传输下一个数据了。 可以看出,“结绳法” 关键是将信号结绳以后, 使其保持了足够长的时间,以便另一个时钟可以正确地采样。

    电路图如下:

    上图描述了握手协议的完整流程,其中三角带横线的符号是异或门。同时给出了两个脉冲之间结绳信号(vld信号)的产生方法。

    总之:

    • 优点:“结绳法” 可以解决快时钟域向慢时钟域过渡的问题, 且其适用的范围很广。
    • 缺点:实现较为复杂,特别是其效率不高,在对设计性能要求较高的场合应该慎用。

    方法三:异步双口RAM+格雷码(异步FIFO)

    处理多bit数据的跨时钟域,一般采用异步双口RAM。假设我们现在有一个信号采集平台,ADC芯片提供源同步时钟60MHz,ADC芯片输出的数据在60MHz的时钟上升沿变化,而FPGA内部需要使用100MHz的时钟来处理ADC采集到的数据(多bit)。

    在这种类似的场景中,我们便可以使用异步双口RAM来做跨时钟域处理。先利用ADC芯片提供的60MHz时钟将ADC输出的数据写入异步双口RAM,然后使用100MHz的时钟从RAM中读出。

    但我们读出RAM中的数据时,肯定不是一上电就直接读取,而是要等RAM中有ADC的数据之后才去读RAM。这就需要100MHz的时钟对RAM的写地址进行判断,当写地址大于某个值之后再去读取RAM。

    在这个场景中,其实很多人都是使用直接用100MHz的时钟对RAM的写地址进行打两拍的方式,但RAM的写地址属于多bit,如果单纯只是打两拍,那不一定能确保写地址数据的每一个bit在100MHz的时钟域变化都是同步的,肯定有一个先后顺序。如果在低速的环境中不一定会出错,在高速的环境下就不一定能保证了。所以更为妥当的一种处理方法就是使用格雷码转换。

    格雷码简介

    在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。格雷码(Gray Code)又称Grey Code、葛莱码、格莱码、戈莱码、循环码、反射二进制码、最小差错码等。

    格雷码有多种编码形式

    十进制数4位自然二进制码4位典型格雷码十进制余三格雷码十进制空六格雷码十进制跳六格雷码步进码
    00000000000100000000000000
    10001000101100001000100001
    20010001101110011001100011

    表中典型格雷码具有代表性。若不作特别说明,格雷码就是指典型格雷码,它可从自然二进制码转换而来。

    二进制格雷码的生成方法有很多,具体可自行搜索或见:

    https://www.cnblogs.com/zhuruibi/p/8988044.html

    回到刚才的问题,多比特利用双寄存器打两拍在高速场合不再适用,而使用格雷码可以将这种多比特变为单比特传输(格雷码每次变化只有一位会变)如果先将RAM的写地址转为格雷码,然后再将写地址的格雷码进行打两拍,之后再在RAM的读时钟域将格雷码恢复成10进制。这种处理就相当于对单bit数据的跨时钟域处理了。

    异步FIFO

    使用异步双口ram的场合其实用异步fifo也是一样的。

    使用场景:在有大量的数据需要进行跨时钟域传输, 并且对数据传输速度要求比较高的场合 。

    一个异步 FIFO 一般由如下部分组成:
    1. Memory, 作为数据的存储器;
    2. 写逻辑部分,主要负责产生写信号和地址;
    3. 读逻辑部分,主要负责产生读信号和地址;
    4. 地址比较部分,主要负责产生 FIFO 空、满的标志。

    异步FIFO代码可以参考我的另一篇文章:

    https://www.cnblogs.com/lyc-seu/p/12439203.html#%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81

    方法四:二深度FIFO同步器

    二深度FIFO的地址实际上只有单bit,所以不需要进行gary编码,所以异步FIFO中的编码模块可以简化:

    其中的gray2bin,bin2gray都可以省略,并且空满信号的产生之间通过同或门和异或门即可产生。

    限制: 由于深度只有2,所以只适合某些特定场景(突发传输要求FIFO最小深度小于2的场景)

    方法五:DMUX同步器

    对于多bit的data信号,还可以使用使能技术,也就是通过一个使能信号来判断data信号是否已经稳定,当使能信号有效的时候说明data处于稳定状态,在这种情况下终点寄存器才对信号进行采样,可以保证没有setup/hold违例。而使能信号一般使用double FF的方法来进行同步。下面是DMUX的同步示意图:

    展开全文
  • 跨时钟域处理

    2016-11-18 15:25:01
    第一部分 FPGA跨时钟域的处理方法 原文:http://blog.csdn.net/verylogic/article/details/21410077  在一个fpga系统设计中,经常需要处理多个时钟来源,比如FPGA作为一个转发桥连接几个不同的IC。不同的...

    第一部分 FPGA跨时钟域的处理方法

    原文:http://blog.csdn.net/verylogic/article/details/21410077

        在一个fpga系统设计中,经常需要处理多个时钟来源,比如FPGA作为一个转发桥连接几个不同的IC。不同的时钟域有不同的时钟频率和时钟相位。如何处理好多个时钟信号在FPGA内部的关系,让数据以及相关的控制信号在不同的时钟域之间准确的传递就是一个比较困难的问题。在这种情况下,建立与保持时间就显得尤为重要。理论上完美的信号应该是矩形的,上升和下降时间为0,在低速率系统中,上升下降时间确实可以忽略不计,但在高速系统中,这个时间不能忽略。在数字系统中0和1的判决在于电压,高于一个电压值表示为1,低于一个电压值表示为0,在这两个电压之间存在一个中间不确定状态的值,当跨时钟域的时候,新的时钟域时钟采样时间恰好落在这个区间内,就可能发生错误,这就是数字系统中最需要避免的亚稳态。如何避免呢?

        最好的办法是采用FIFO,读写时钟分别是两个时钟域的时钟,通过FIFO的满空状态,以及读写使能,控制好输入输出的流量。

        还有一种办法就是使用双锁存器的办法,即一个信号从A时钟域进入另一个时钟域B的时候,先用B时钟对输入信号连续锁存2次,然后再在B时钟域中使用,可以有效消除亚稳态,不过需要注意的是假如A时钟频率低于B时钟频率的时候,出现数据被插值,即一组数据,本来是10个字节依次传递过来,但到达B时钟域后,因为B时钟较快,而数据变化速率依然是A时钟频率决定,于是数据可能会出现被多次采样,造成不被期望产生的插值,变成十几个乃至几十个数据。当A时钟频率高于B时钟频率的时候,可能会出现信号漏采的问题。所以采用FIFO是更稳妥的办法,当然FIFO也有一定的局限性,所以需要灵活的使用这两种办法,以达到最佳效果。


    第二部分 基于FPGA的跨时钟域信号处理——专用握手信号

    原文:http://www.eepw.com.cn/article/269611.htm

          在逻辑设计领域,只涉及单个时钟域的设计并不多。尤其对于一些复杂的应用,往往需要和多个时钟域的信号进行通信。异步时钟域所涉及的两个时钟之间可能存在相位差,也可能没有任何频率关系,即通常所说的不同频不同相。

          图1是一个跨时钟域的异步通信实例,发送域和接收域的时钟分别是clk_a和clk_b。这两个时钟频率不同,并且存在一定的相位差。对于接收时钟域而言,来自发送时钟域的信号data_a2b有可能在任何时刻变化。


                                            图1 跨时钟域通信

    对于上述的异步时钟域通信,设计者需要做特殊的处理以确保数据可靠的传输。由于两个异步时钟域的频率关系不确定,触发器之间的建立时间和保持时间要求也无法得到保证。如果出现建立时间或者保持时间违规,接收域将会采样到处于亚稳态数据,那么后果可想而知。

      如何有效的进行跨时钟域的信号传输呢?最基本的思想是同步,在这个基础上设计者可以利用各种协议约定进行通信。单向控制信号检测方式(前面提到过的脉冲信号检测方法,这里为了和握手方式相区别,所以如此称呼)、握手协议的方式或者借助存储器的方式都是比较常用的处理手段。

      本文将重点介绍握手方式进行异步时钟域的通信。

      图2是一个基本的握手通信方式。所谓握手,意即通信双方使用了专用控制信号进行状态指示。这个控制信号既有发送域给接收域的,也有接收域给发送域的,有别于前面的单向控制信号检测方式。



    展开全文
  • 设计中的多时钟域处理,时钟树综合中很好的资料
  • Verilog--CDC跨时钟域处理(快时钟域到慢时钟域)CDC问题单比特信号的跨时钟域问题从快时钟域到慢时钟域从慢时钟域到快时钟域多比特信号的跨时钟域问题异步FIFO握手协议 今天先写单比特信号从快时钟域到慢时钟域的...


    今天先写单比特信号从快时钟域到慢时钟域的方法,后续继续填坑

    CDC问题

    单比特信号的跨时钟域问题

    从快时钟域到慢时钟域

    设计思想

      从慢时钟域到快时钟域通常使用打两拍的方法,这也适用于从快时钟域到慢时钟域时,但是如果当单比特信号持续时间小于快时钟域的一个周期时,需要用展宽信号再打两拍的方法。

    设计相关代码

    module Sync_Pulse
    (
        input   clka,           //快时钟域
        input   clkb,			//慢时钟域
        input   rst_n,
        input   pulse_ina,      //脉冲或电平信号都可以
        output  pulse_outb,     //脉冲信号
        output  signal_outb     //电平信号
    );
    //--------------------------------------------------------
    reg         signal_a;
    reg         signal_a_r1;
    reg         signal_a_r2;
    reg         signal_b;
    reg         signal_b_r1;
    //--------------------------------------------------------
    //--    a时钟域生成展宽信号
    //--------------------------------------------------------
    always @(posedge clka or negedge rst_n)begin
        if(!rst_n)begin
            signal_a <= 1'b0;
        end
        else if(pulse_ina) begin        //检测到脉冲
            signal_a <= 1'b1;           //拉高
        end
        else if(signal_a_r2) begin      //同步到b后同步回a
            signal_a <= 1'b0;           //拉低,展宽使命完成
        end
    end
    //--------------------------------------------------------
    //--    展宽信号同步到b时钟域再同步回a时钟域
    //--------------------------------------------------------
    always @(posedge clkb or negedge rst_n)begin
        if(!rst_n)begin
            signal_b    <= 1'b0;
            signal_b_r1 <= 1'b0;
        end
        else begin
            signal_b    <= signal_a;
            signal_b_r1 <= signal_b;
        end
    end
    
    always @(posedge clka or negedge rst_n)begin
        if(!rst_n)begin
            signal_a_r1 <= 1'b0;
            signal_a_r2 <= 1'b0;
        end
        else begin
            signal_a_r1 <= signal_b_r1;
            signal_a_r2 <= signal_a_r1;
        end
    end
    //--------------------------------------------------------
    //--    脉冲信号输出,上升沿检测
    //--------------------------------------------------------
    assign pulse_outb = ~signal_b_r1 & signal_b;
    //--------------------------------------------------------
    //--    电平信号输出,b时钟域展宽信号
    //--------------------------------------------------------
    assign signal_outb = signal_b_r1;
    
    
    endmodule
    

    tb文件

    `timescale 1ns/100ps
    module tb_cdc_f2s ();
        
    reg clka;
    reg clkb;
    reg rst_n;
    reg pulse_ina;
    wire pulse_outb;
    wire signal_outb;
    
    
    initial begin
        clka = 0;
        clkb = 0;
        rst_n = 0;
        #10
        rst_n = 1;
    end
    
    initial begin
        pulse_ina = 0;
        #30 
        pulse_ina = 1;
        #2
        pulse_ina = 0;
        #218 
        pulse_ina = 1;
        #2
        pulse_ina = 0;
    end
    
    always #10 clka = ~clka;
    always #20 clkb = ~clkb;
    
    cdc_f2s u_cdc_f2s(
        .clka           (clka),
        .clkb           (clkb),
        .rst_n          (rst_n),
        .pulse_ina      (pulse_ina),
        .pulse_outb	    (pulse_outb),
        .signal_outb    (signal_outb)
    );
    endmodule
    

    Modelsim仿真结果
    在这里插入图片描述

    从慢时钟域到快时钟域

    多比特信号的跨时钟域问题

    异步FIFO

    可以看我这一篇
    https://blog.csdn.net/weixin_44425619/article/details/115406095

    握手协议

    DMUX

    格雷码+双D触发器

    展开全文
  • 1.为什么要分析跨时钟域数据传输问题? 正常来讲同步时钟域下的数据传输,只要建立和保持时间满足,外部环境(核心电压/温度)没有剧烈变化,一般情况下可以保证数据可靠传输。而异步时钟域在时序约束的时候已经...
  • 单bit 源时钟域打一拍,目的时钟域打两拍或者更多拍 多bit fifo方法,原理是格雷码指针判断空满,深入了解,可以分析一下源目的时钟分别是快或慢的情况。架构简单,设计review快,质量可靠。 所有异步处理机制,都多...
  • (大疆2020数字芯片)下列关于多bit数据跨时钟域的处理思路,错误的有() A. 发送方给出数据,接收方用本地时钟同步两拍再使用; B. 发送方把数据写到异步fifo,接收方从异步fifo里读出; C. 对于连续变化的信号,...
  • 时钟到快时钟,两级触发器同步。 快时钟到慢时钟,如果是下面第一个图,clkb可以采样到signal_a_in,但是如果只有单脉冲,如第二个图所示,怎不能确保采样到signal_a_in。 这个时候可以展宽signal_a_in,至少为...
  • 跨时钟域处理一直是数字IC,FPGA等数字电路设计中最常见的问题,英文说法是***...对于数字信号的跨时钟域问题,有很多已经非常成熟的处理方式,例如寄存器打两拍,DMUX,结绳信号法,异步FIFO等。本篇文章主要介绍的方
  • 逻辑设计中一般存在多个时钟,那么信号在多个时钟之间如何切换呢?这个就涉及到了异步电路设计,异步电路设计也是逻辑设计中非常重要的设计,可以说异步处理不好,逻辑出问题的可能性非常大。 一、亚稳态简介 在介绍...
  • 1、基础知识 传播延迟(Tpd) 从第一个触发器的输出,传播到第二个触发器的输入所花费的时间;...Tpd表示传播延迟,Tsu表示建立时间,不考虑时钟偏斜,那么最小时钟周期为: Tmin = Tco + Tpd + Tsu; 2、
  • 异步FIFO 方法四:二深度FIFO同步器 方法五:DMUX同步器 为了彻底理解跨时钟域问题,多方搜集资料,做个简单整理备忘。主要参考了如下几个资源: https://zhuanlan.zhihu.com/p/45186793 跟IC君一起学习集成电路 ...
  • 亚稳态和跨时钟域CDC

    2020-08-22 23:24:56
    一、亚稳态 1.亚稳态的概念:当输入...一般情况下这段时间不会超过一到两个时钟周期(取决于触发器的性能)。如果亚稳态的持续时间过长,就有可能被下一级的触发器捕获,导致下一级触发器也处于亚稳态,这就是亚稳态的
  • 单bit信号跨时钟域传输1.1 电平同步器1.2 边沿检测器1.3 脉冲同步器1.4 电平延展-快到慢2. 多bit信号跨时钟域传输2.1. 握手2.2. 异步FIFO2.3 使用异步双口RAM2.4 DMUX3. 相关题目3.1 设计一个脉冲检测器3.2 介绍...
  • 跨时钟域笔记(四)

    2020-08-08 10:39:43
    跨时钟域笔记(四) 原文链接 跨时钟域处理–最终详尽版 目录跨时钟域处理--最终详尽版1. 异步时序定义2. 亚稳态3. 单比特同步策略方法一:双锁存器注意问题1注意问题2注意问题3扩展*4.多比特同步策略控制信号多比特...
  • 首发来自微信公众号:数字芯片设计 31.乒乓buffer可以提高系统的数据吞吐量,提高系统的处理...异步FIFO几乎涵盖了Clock-Domain Crossing (CDC)跨时钟域的全部知识,所以手写异步FIFO代码也是一项基本功。 正确选项:B
  • CDC

    千次阅读 2020-05-28 22:32:35
    跨时钟域处理方法总结如下: 1、有关系的时钟之间传单bit数据,理论上只需要源数据保持足够长的时间(clk2的两个周期)即可; 2、无关系的时钟之间传单bit数据,必须要使用同步器; 3、不管有无关系的时钟进行单bit...
  • 多比特(CDC)处理方法,DMUX跨时钟域有哪些问题,怎么处理(不愧是华为出来的) 同步复位和异步复位的异同优缺 异步复位有哪些时序问题,什么时候异步复位时序违例不需要考虑 AXI中怎么保证乱序还知道谁是谁的?...
  • cdc(clock domain crossing)

    千次阅读 2018-04-25 14:01:54
    ,既可以取消跨时钟域的组合逻辑,又减少了模块间的布线延迟。 5.重聚(Reconvergence) 该字的各个位与接收时钟域同步,但每个位都受到 可变延迟的影响。 同样, FSM 的 next_state 输入可以表示与当前状态不一致...
  • 首发来自公众号:数字芯片设计21.数字电路设计中,下列哪种手段无法消除竞争冒险现象()【A】加滤波电容,消除毛刺【B】增加冗余项消除逻辑冒险【C】增加选通信号,避开毛刺【D】降低时钟频率...
  • 笔试总结(七)

    2020-07-13 17:42:53
    对于单bit跨时钟域: (1)两级或者三级同步器 (2)使用握手信号进行同步 对于多bit跨时钟域: (1)使用多周期路径的方法进行同步,将未经同步的信号和同步控制信号一起发射到目标时钟域 (2)对信号使用格雷码...
  • 当前这个题感觉用的是DMUX做的多bit跨时钟域处理,其本质就是将vaild信号先做打2拍处理,然后取第二拍对应上升沿作为DMUX的sel信号,sel有效后,就会导通源时钟域的多Bit数据信号进入目的时钟域,被目的时钟域直接...
  • 目录 锁存器和触发器 1.名词解释 2.锁存器和触发器的区别 3.触发器、锁存器、寄存器的区别? 4.锁存器有哪些缺点? 5.触发器有哪些类型?...9.如何处理跨时钟域信号? 竞争与冒险 1.毛刺 2.竞争与冒险 3....
  • always块间是并行的,符合硬件中电路并行计算的特性always时钟触发的特性,符合寄存器的行为Verilog是一种自顶向下的层次化设计方法,能够将复杂的大型数字系统划分为规模较小且功能相对简单的单元电路,从而加速...
  • 某年华为IC笔试

    万次阅读 2020-09-02 10:31:46
    利用格雷码方式打拍异步处理时,格雷码必须依次序变化,不能间隔 多bit数据的跨时钟域同步常用方法: 二进制计数值格雷码打两拍法 此法主要是由于如果直接将二进制数打两拍至下一时钟域时,由于二进制计数的下一个...
  • 寒武纪IC

    2020-07-23 22:32:49
    使用握手协议方式处理跨时钟域数据传输,只需要对双方的握手信号(req和ack)分别使用脉冲检测方法进行同步。在具体实现中,假设req、ack、data总线在初始化时都处于无效状态,发送域先把数据放入总线,随后发送...
  • vivo数字IC提前提2021

    千次阅读 2020-08-16 15:39:24
    C 使用格雷码 D 使用DMUX电路 解析:本题答案为C,之所以不能使用格雷码做同步的原因是计数器的技术范围在0~6,如果是0-7就可以用了,这样格雷码就可以形成闭环(直接使用格雷码做跨时钟域需要2n个连续的计数才可以...

空空如也

空空如也

1 2
收藏数 37
精华内容 14
关键字:

dmux跨时钟域