时钟域信号同步的IP解决方案 作者:Rick Kelly,Synopsys研发经理 为了确保拥有多个异步时钟域的系统级芯片(Soc)能够可靠运行,设计人员必须使这些跨越了多个域的时钟和数据信号保持同步。尽管这并不属于新提出的要求,但随着多时钟域的越来越常见和复杂化,使得这一要求具备了新的重要意义。大规模集成加上对性能的严格要求以及频率调节都导致在许多不同频率下发生了很多时钟域跨越现象-就像一场数字化的“完美风暴”。 跨时钟域(CDC)问题会以许多种形式出现,其评估难度相当高。幸好,Synopsys DesignWare库产品提供了许多卓越的CDC解决方案,这些方案应用简便,设计人员只需掌握在何时以及何处应用它们即可。 本文解释了在时钟和数据信号从一个时钟域跨越到另一个时钟域时所发生的许多类型的同步问题。在任何情况下,本文所包含的问题都涉及到相互异步的时钟域。随着每一个问题的提出,本文将概述一个或多个DesignWare解决方案。这些主题和解决方案包括: 基本同步问题 当来自一个时钟系统的信号将用作另一个与其不同步的时钟系统的输入时,就需要对信号进行同步以达成。而不进行同步就无法达成时序收敛。图1所示为采用一个单寄存器来同步至目的时钟域的异步输入。 伴随这种方法会出现的一个问题是,当一个触发器的数据输入处于逻辑0至逻辑1之间的过渡过程当中时,发给这个触发器时钟信号时有可能产生亚稳态现象。亚稳态现象也有可能发生在触发器的建立时间或保持时间出现违反现象时。解决亚稳态事件使其达至逻辑1或逻辑0所要求的时间量取决于建立时间或保持时间被违反的严重程度(图2)。 Clock to Q delay 时钟至Q延迟 FF Minimum specs 触发器最小规格 图2 解决亚稳态事件所用时间 当亚稳态事件持续时间长至足以影响到下一个逻辑阶段时,同步器就发生了故障。故障间平均时间(MTBF)通常计算如下: 其中: 对于有着相对较高数据传输速率的高速应用来说,即使两级同步器也有可能无法获得足够的MTBF,特别是在FPGA实现方案中。如果加入第3级,则只有在第1级在亚稳态保持了足够长的时间,导致侵占了FF2的建立时间的情况下,第2级才有可能发生亚稳态事件(图3)。 图3 3级同步器 Sampe MTBF test … MTBF测试电路示例 采用这一方法,MTBF可计算为: T0和T1常数与所选用的具体触发器相关,并有可能从库供应商处获得。库供应商会采用如图4所示的电路来测定这些常数。错误计数器用于测量在输入时钟处于某一特定组合的输入频率下的MTBF。通过在不同频率比率下让此电路运行,就可以测定T0和T1的数值。 图4 用于测定触发器常数的电路 参见以下资料,可以了解更多有关亚稳态和MTBF计算的信息: 图5a – 扫描测试中不受控制的偏移有可能导致跨域捕获发生违反 图 5b – 在域之间复用一个锁存器可以确保1/2时钟周期的保持 图5c – 一个负边沿D触发器也可保持1/2时钟周期的保持图5 跨时钟域扫描测试问题 对于基本同步来说,设计人员可以使用DesignWare的DW_sync组件,此组件有以下参数: 宽度 图6 采用DW_sync组件时可能的级数同步临时事件 有些时间,您需要在一个时钟域内设置逻辑电路以告知另一个异步时钟域内的逻辑电路,有某一特定事件已经发生。一种方法是采用如图7所示的方案,其中通过门选复位来清空源域内的脉冲。 ![]() 图7b – 较好但仍存在门选复位 图7c – 更好的设计方案,但仍不是最佳方案 图7 另一个时钟域内事件的通知逻辑 在使用一个高电平有效的脉冲作为跨时钟域事件的信号时,这个脉冲的宽度必须足以确保采样操作的完成,而且必须在脉冲之间存在明显的无信号时间。为了避免采用脉冲拉伸机制,您可以使用不归零(NRZ)信号发生方式,而不要使用归零(RZ)信号发生方式。图8所示为clk_d域是如何在后一种类型的信号下捕获变化的,这是一种在许多状况下难于采用的方法。 Event in clk_s:clk_s内的事件 图8 NRZ信号发生方式的优点 为了简化时钟域之间的脉冲传递,可采用DW_pulse_sync双时钟脉冲同步器(图9)。标为“clk_s”的虚线框内的逻辑电路运行在clk_s(源)时钟域下,而标为“clk_d”的虚线框内的逻辑电路运行在clk_d(目的)时钟域内。在域之间采用NRZ信号可以实现更高的事件处理流量,而且由于无需反馈,所要求的逻辑电路也较少。 Register…:可以通过parameter, reg_event在器件外配置寄存器 图9 DW_pulse_sync双时钟脉冲同步器 Multiple …:多寄存器同步器 Multiple …:多寄存器同步器 图10 加了确认的DW_pulseack_sync脉冲同步器 如果需要反馈,则可以采用DW_pulseack_sync,这是一种带有确认的脉冲同步器。如图10所示,这个IP产品提供了一个NRZ反馈信号,能够比无确认版本提供更高的事件处理流量。DW_pulseack_sync还提供了可配置的标志寄存器和反馈延时。 同步数据总线 在从一个时钟域跨越至另一个时钟域时,在目的时钟对接近过渡状态的总线进行采样时,数据总线上有可能出现瞬时虚假数值(图11)。例如,一条从11011001变为01011010的8位总线上有3个位发生了改变。在所涉及的偏移存在时序上不确定性的情况下,就有会看到8个可能出现的数值: the initial value (11011001), the final value (01011010) and six possible intermediate values ( 11011000, 11011011, 11011010, 01011001, 01011000 and 01011011). Source…:源总线 图11 瞬时总线数值 一种在同步数据总线时避免不想要的过渡数值的方法是,采用一个带有确认的临时事件同步器。这种逻辑可以采用以下次序对跨越时钟边界的数据进行同步交换:保持数据,发送“请接受”,发回“已接受”,释放数据寄存器。DW_pulseack_sync组件能够发送必要的“请接受”和“已接受”事件。 Optional …:可选用的临时数据寄存器 图12 带确认的DW_data_sync总线同步器确认延迟问题 在源时钟比目的时钟快得并不多(或根本相同)时,提供一个确认信号的同步器可能会引发时延问题。如果在应用当中时延具有关键性的意义,则应考虑采用一种“提前”确认方式,即通过设置参数ack_delay = 0来进行配置。 — Max Fclk_s = Fclk_d * (2 – 0.25) 如果确保目的时钟速率超过了(Fclk_s * (f_sync_type + 1.25))[2],则可以使用更简单的信号同步体系。在目的时钟较快的情况下,可以对“请接受”事件进行同步,并在不到源域1个时钟周期的时间内捕获数据。因此,也就不需要发回“已接受”事件了。在需要最大程度地减少时延和/或不必要的逻辑电路时,例如,在对一个实时时钟寄存器进行更新并将其内容发送到一个高速逻辑区块时,这种方法就较为实用。 Event …:事件同步逻辑电路 图13 不带ac确认信号的DW_data_sync_na总线同步器总线同步的特殊情况 如果在任一时刻,一条总线上只会有一个位发生改变(也就是格雷码格雷码过渡),则简单的多寄存器同步绝对不会引发过渡虚假数据。而在接近采样时钟时有一个位发生改变时,第一个捕获此位的寄存器有可能进入亚稳态,但这个位将会转向新数值或旧有数值。 Last value:上一次的数值 图14 DW_data_sync_1c单时钟过滤数据总线同步器 针对这些情况,DesignWare提供了单时钟过滤数据总线同步器DW_data_sync_1c(图14)。此同步器可以消除存在高位间时序偏移特性的数据过渡中的过渡数值。 数据传输与数据流 在跨时钟域传输数据时,请牢记数据传输与数据流之间的差别。在数据传输当中,在典型情况下不会长时间维持背靠背(back-to-back)式的数据发送。数据同步设计可作为一个示例,例如采用DW_data_sync的设计方案。 Push logic:推送逻辑电路 图15 配合双端口RAM的双时钟FIFO 此设计采用了DesignWare组件DW_ffoctl_s2_sf和DW_ffo_s2_sf来实现一个带有状态标志位的同步(双时钟)FIFO(图16)。自从1999年建立其体系架构以来,这些组件一直在DesignWare Library IP内广受欢迎。 Push logic:推送逻辑电路 图16 配有状态标志的DesignWare双时钟FIFO控制器 实现状态标志位的另一种方案是采用动态标志位的双时钟FIFO,它采用DW_ ffo_2c_df和DW_ffoctl_2c_df组件(图127)。除了动态标志位支持以外,DW_ffoctl_2c_df提供了一些新特色(在DW_ffoctl_s2_sf提供的以外): Pre-fetch cache:预取高速缓存 图17 配有动态标志位的DesignWare双时钟FIFO任意相位相干数据流 一些芯片向外部逻辑电路提供了一个将与数据共同返回至芯片的时钟(图18)。在这些应用当中,如何在最小时延的情况下让数据流返回至芯片内的时钟域呢? Return clock:返回时钟 图18 与外部逻辑电路来回传输的时钟和数据 Event ….:事件同步逻辑电路 图19 不带确认的DW_data_sync_na数据总线同步器 如果数据传输率足够低,而且芯片拥有一个足够快的内部时钟(典型情况约为数据传输率的4倍左右),则可以采用DW_data_sync_na(图19),并依靠过采样来可靠地捕获数据。 如果数据传输率过高,导致不能采用过采样技巧来可靠处理数据,则需要采用一种具备某种数据存储能力的方法,例如双时钟FIFO。您可能想要采用DW_ffo_2c_df和AW_ ffo_s2_sf组件,但是,这两种组件存在着额外逻辑电路的费用,还有比采用简单数据传输技巧更高的时延。 Receive control:接收控制 图20 DW流同步数据数据同步器 对于DW_stream_sync,深度(depth)参数控制着解复用的通道数量。对于相干数据流来说,可将深度的数值设置为(f_sync_type + 2)。 Bubble …:输出数据内的泡沫代表着源时钟速率与目的时钟速率之间的差别 图21 无数据的数据流 在数据流传输率低于目的时钟率时,DW_stream_sync会偶然生成一个输出端没有数据的周期(图21)。但是,如果正确地设置了预填充数值(通过prefll_lvl参数)以及深度(depth)参数,则DW_stream_sync可以同时稍微加快和稍微放慢地处理输入的数据流。此项能力对于提高数据源会在一些较小误差范围内变动时的互操作性是实用的。 特殊情况-复位/清零 Source …:源侧控制 图22 DW_reset_sync复位序列同步器 DW_reset_sync能够采用源侧或目的侧启动的清零操作来控制源域和目的域的逻辑清零的正确序列。图23所示是源侧启动方法的时序,侧图24所示为目的侧方法。 图23 DW_reset_sync源侧启动的时序 图24 DW_reset_sync目的侧启动的时序特殊情况-相关时钟系统 一些设计采用了源自于同一个主时钟的多个时钟域。如果您通过时钟树限制了时钟偏移现象,则可以采用一种高效的方法来跨越这种时钟边界来获取数据。 (high …):高速域 图25a – 大于2的时钟比率 图25b-等于2的时钟比率 Source …:源侧捕获寄存器 图25 用于低频至高频时钟的准同步数据接口DW_data_qsync_lh 具体来说,DW_data_qsync_lh提供了一种可用于低频至高频时钟的准同步数据接口(图25)。换句话说,数据从较慢的源域发送至较快的目的域。如果时钟比率为2,则目的域的第一个触发器将是一个负边沿触发器。否则,所有触发器(两个域内)均为正边沿型。 图26所示为采用DW_data_qsync_lh进行数据传输时的时序。正如此时序图所示,IP确保了在时钟相关以及目的时钟快于源时钟时的同步数据传输。 Internal …:内部输入捕获寄存器 图26. DW_data_qsync_lh时序 图27a – 时钟比率大于2 (low-speed domain):低速域 图27b-等于2的时钟比率 图27 用于低频至高频时钟的准同步数据接口DW_data_qsync_hl Previous data:以前的数据 图28. DW_data_qsync_hl时序CDC收敛问题 在两个或多个信号只采用多个寄存器(例如DW_sync)进行同步,并且随后这些信号在目的时钟域内组合成单一逻辑表达时(图29),才存在跨时钟域收敛的问题。 Signal A …:信号A逻辑电路 图29 跨时钟域收敛 即使诸如Synopsys的Leda这样的代码检查工具能够识别出CDC收敛的实例,但这些工具却不能决定这种收敛是否代表着一种功能上的错误。其潜在问题是,依靠多寄存器同步器的统一均匀时延的状态机的设计有可能在芯片上不能正确运行。 Clock …:时钟至Q延迟 图30 用于检测误采样的触发器模型 一种更好的方法是采用一个包含了一个复用器的误采样模型。这种方法是基于认识到,在目的逻辑电路对一个正在变化的位进行采样时,所捕获的最终数值只有可能是两种可能数值之一,即:最新输入数值或来自以前周期的输入数值。而在同步器的第一个触发器前设置一个复用器时,就可以通过控制这个复用器来建立误采样行为的模型(图31)。 Missample …:误采样控制 图31 基于复用器的误采样检测 这个误采样方法已经内嵌于DW_sync组件之内以及所有其它采用了DW_sync的DesignWare CDC IP。 verif_en数值 0 1 2 表1 verif_en参数的数值请注意,“?_sync_type”指参数f_sync_type (适用于源域至目的域的时延)或r_sync_type(适用于从目的域至源域的时延)之中任一个的数值。 Width:宽度 图32 在verif_en = 1时的DW_sync误采样检测 请牢记,在输入时序偏移很大时,误采样有可能在多个时钟周期内持续存在-只能在使用DW_data_sync_1c的芯片外数据同步情况下才可经常见到。在设置verif_en = 2时,DesignWare Library CDC组件可以通过多达3个时钟周期来“模糊”数据过渡现象。图33所示为这种情况下的误采样原理框图。从4个可能选项之中选择2位随机数值,其中包括了串联的3个历史寄存器。 Width:宽度 图33 在verif_en = 2时的DW_sync误采样检测 DW_sync内所采用的误采样模型也可以用于建立在对同一时刻有一个以上位发生变化的总线进行采样时有可能出现的瞬态虚假数据的模型。如果认为自己的设计不会受这些虚假数值的影响,则可以通过采用这种误采样建模方法来加强自己的信心。DW_ sync可以随机为每一个总线位选择旧数值或新数值来生成过渡数值(图34)。 Source …:源总线 图34 能够捕获虚假数值的误采样模型 由于误采样在实际运行中发生频度极低(除非在MTBF非常低的情况下),通常您必须等上很长时间才能见到与CDC机制相关的问题。此模型采用了DW_sync,通过造成误采样行为的频繁发生来恶化这种问题。具体来说,在一次误采样延时当中,DW_sync的每一位均通过了50%的数据过渡现象。这样,如果在一个合理数量的CDC事务处理内对DW_sync误采样建模的系统仿真成功的话,则您可非常确保实际芯片内不会发生CDC问题。 工艺映射问题 与CDC同步相关的另一个特殊问题是多寄存器同步器向技术单元的映射。在Design Compiler将两个触发器映射到一个目标库的同一行上时,此工具会不可避免地选择能够满足时序限制条件的最小面积的单元,而不是对同步最好的触发器。因此,您通常想要通过手动方式或通过脚本方式用已知的“亚稳态强化”触发器来替代这些触发器。 附录A-采用提前确认(ack_delay=0)时的频率限制 在采用具备提前确认功能的DW_data_sync组件时,设计人员需要意识到,在源时钟快至足以对提前确认进行同步并且在目的域能够捕获到给出确认的数据之前就更新了数据寄存器时,就会存在运行风险。 Synchronization ….:在ack_delay=0, r_sync_type=2以及clk_s过快时的同步危险情况 Ack …:clk_s确认同步器的第一级刚刚检测到时,确认信号就发出了(在clk_d内) 因此,以下公式必须保持为真: 更方便的形式是: 如果时钟抖动和保持时间均考虑在内,则最差情况下的时序调校情况会是,在一个正在内部发出的确认信号存在clk_d内最早的峰值间抖动时,与此同时,存在抖动的clk_s在最迟可能的峰值间时刻发出一个上升沿。这样,最迟可能的峰值间抖动clk_d就需要发生在比最早的峰值间抖动clk_s更早的位置,且领先幅度至少为寄存器捕获data_d所要求的保持时间。 Add …:增加时钟抖动(不确定性)以及必要的数据捕获保持时间 Internal …:内部确认信号 因此,以下公式必须保持为真: 更方便的形式时: Internal …:要捕获的内部数据 因此,以下公式必须保持为真: 采用更方便的形式时: Pclk_d:clk_d的周期 这些计算以下列假设为基础: 附录B-使用DW_data_sync_na时的频率限制在使用DW_data_sync_na时,目的时钟的频率必须快至足以在源时钟域可能再次改变其内部捕获数据的最早时刻之前,以“充分的时间”捕获来自源时钟域的数据。 最差情景是,在目的时钟校准至其上升沿紧随在用于产生内部数据改变标志位的源时钟上升沿之后的情况下。在这种情况下,第一个数据标志位同步寄存器几乎失去了对数据标志位的捕获,而且随后(在目的时针的3个周期之后),源域主就再次改变了数据。这种危险状况在下面的时序图内用DW_data_sync_na设计内的两级同步(也就是,f_sync_type参数设置为2)时进行了说明。 Synchronization ….:在clk_s不够快时,DW_data_sync_na所发生的同步危险 Adding …:添加时钟抖动(不确定性)以及必要的数据捕获保持时间 因此,如下公式必须保持为真: 更为方便的形式是: Pclk_d:clk_d的周期 这些计算以下列假设为基础: 1) 在其抖动窗口内最早可能位置处发生的clk_d的上升沿位于处于其最迟可能位置的clk_s上升沿之后一个周期的可能性不为零。 [1] 此项通用规划假设触发器延时和时钟抖动在任何时候都不会超过clk_d时钟周期的1/4以上。有关此种情形下的更详细计算方式请参见附录A。[2] 此项通用规划假设触发器延时和时钟抖动在任何时候都不会超过clk_d时钟周期的1/4以上。有关此种情形下的更详细计算方式请参见附录B。 |
|