| |
作者:Rick Kelly,Synopsys研发经理
2009年1月
为了确保拥有多个异步时钟域的系统级芯片(Soc)能够可靠运行,设计人员必须使这些跨越了多个域的时钟和数据信号保持同步。尽管这并不属于新提出的要求,但随着多时钟域的越来越常见和复杂化,使得这一要求具备了新的重要意义。大规模集成加上对性能的严格要求以及频率调节都导致在许多不同频率下发生了很多时钟域跨越现象-就像一场数字化的“完美风暴”。
跨时钟域(CDC)问题会以许多种形式出现,其评估难度相当高。幸好,Synopsys DesignWare库产品提供了许多卓越的CDC解决方案,这些方案应用简便,设计人员只需掌握在何时以及何处应用它们即可。
本文解释了在时钟和数据信号从一个时钟域跨越到另一个时钟域时所发生的许多类型的同步问题。在任何情况下,本文所包含的问题都涉及到相互异步的时钟域。随着每一个问题的提出,本文将概述一个或多个DesignWare解决方案。这些主题和解决方案包括:
• 基本同步 — DW_sync
• 临时事件同步 — DW_pulse_sync, DW_pulseack_sync
• 简单数据传输同步 — DW_data_sync, DW_data_sync_na, DW_data_sync_1c
• 数据流同步 — DW_fifo_s2_sf, DW_fifo_2c_df, DW_stream_sync
• 复位排序 — DW_reset_sync
• 相关时钟系统数据同步 — DW_data_qsync_hl, DW_data_qsync_lh
当来自一个时钟系统的信号将用作另一个与其不同步的时钟系统的输入时,就需要对信号进行同步以达成。而不进行同步就无法达成时序收敛。图1所示为采用一个单寄存器来同步至目的时钟域的异步输入。
伴随这种方法会出现的一个问题是,当一个触发器的数据输入处于逻辑0至逻辑1之间的过渡过程当中时,发给这个触发器时钟信号时有可能产生亚稳态现象。亚稳态现象也有可能发生在触发器的建立时间或保持时间出现违反现象时。解决亚稳态事件使其达至逻辑1或逻辑0所要求的时间量取决于建立时间或保持时间被违反的严重程度(图2)。
Clock to Q delay 时钟至Q延迟
FF Minimum specs 触发器最小规格
当亚稳态事件持续时间长至足以影响到下一个逻辑阶段时,同步器就发生了故障。故障间平均时间(MTBF)通常计算如下:
其中:
fclk 是采样时钟频率
fdata 是数据变化频率
tres 是解决亚稳态所允许占用的时间
T0和T1是与具体触发器相关的常数(下文将进一步叙述)
通常,由于在综合时会尝试在时序能够满足的条件下缩减门电路数以节省占用面积,所以设计人员无法控制至下一阶段间的时间预算。为了保持稳定一致的解决用时,设计人员可以采用一个2个触发器组成的序列。但是,这种传统解决方案肯定会增加时延。
在采用2个触发器的解决方案,时钟树就以减去触发器FF1的时钟至Q延时后的时钟周期以及FF2的建立时间要求为基础。
对于有着相对较高数据传输速率的高速应用来说,即使两级同步器也有可能无法获得足够的MTBF,特别是在FPGA实现方案中。如果加入第3级,则只有在第1级在亚稳态保持了足够长的时间,导致侵占了FF2的建立时间的情况下,第2级才有可能发生亚稳态事件(图3)。
Sampe MTBF test … MTBF测试电路示例
Error Counter 错误计数器
采用这一方法,MTBF可计算为:
T0和T1常数与所选用的具体触发器相关,并有可能从库供应商处获得。库供应商会采用如图4所示的电路来测定这些常数。错误计数器用于测量在输入时钟处于某一特定组合的输入频率下的MTBF。通过在不同频率比率下让此电路运行,就可以测定T0和T1的数值。
参见以下资料,可以了解更多有关亚稳态和MTBF计算的信息:
• “确保亚稳态不会破坏您的数字设计方案”,作者:Debora Grosse, Unisys, EDN, 1994 http://www.edn.com/archives/1994/062394/13df2.htm
• “数字系统亚稳态特性”,作者:Kleeman & Cantoni, IEEE Transactions on Computers, ol. C-36, No. 1, Jan., 1987
• Google:MTBF亚稳态同步
另一个基本同步问题涉及到扫描测试。扫描链经常采用保持锁存以确保在时钟域之间实现正确的扫描切换。如果在扫描测试排序时,让最后一个扫描输入循环后面直接跟一个捕获循环,且让两者的时钟均由测试时钟来驱动,则有可能无法正确捕获到跨越时钟域的功能信号(图5)。在源侧域之间插入一个锁存器能够提供1/2时钟周期的延迟,确保了扫描测试期间的正确捕获操作,从而解决了这个问题。在不处于扫描模式时,可由一个复用器将这个锁存器旁路,实现正常功能运行。另一种解决方案是在较小型的时钟域之间插入一个负边沿触发器。
对于基本同步来说,设计人员可以使用DesignWare的DW_sync组件,此组件有以下参数:
• 宽度
• f_sync_type:级数
• tst_mode:0 => 无保持,1=> 锁存,2 => 负边沿触发器
• verif_en (下文讨论;不影响综合)
在以f_sync_type参数指定了级数后,将获得如图6所示的配置方式之一。
有些时间,您需要在一个时钟域内设置逻辑电路以告知另一个异步时钟域内的逻辑电路,有某一特定事件已经发生。一种方法是采用如图7所示的方案,其中通过门选复位来清空源域内的脉冲。
在使用一个高电平有效的脉冲作为跨时钟域事件的信号时,这个脉冲的宽度必须足以确保采样操作的完成,而且必须在脉冲之间存在明显的无信号时间。为了避免采用脉冲拉伸机制,您可以使用不归零(NRZ)信号发生方式,而不要使用归零(RZ)信号发生方式。图8所示为clk_d域是如何在后一种类型的信号下捕获变化的,这是一种在许多状况下难于采用的方法。
Event in clk_s:clk_s内的事件
Return to …:Clk_d内捕获的归零信号
Captured in…:在clk-d内捕获的信号
为了简化时钟域之间的脉冲传递,可采用DW_pulse_sync双时钟脉冲同步器(图9)。标为“clk_s”的虚线框内的逻辑电路运行在clk_s(源)时钟域下,而标为“clk_d”的虚线框内的逻辑电路运行在clk_d(目的)时钟域内。在域之间采用NRZ信号可以实现更高的事件处理流量,而且由于无需反馈,所要求的逻辑电路也较少。
Register…:可以通过parameter, reg_event在器件外配置寄存器
NRZ…:跨域的NRZ信号
Multiple…:多寄存器同步器
History…:用于检测变化的历史寄存器
Multiple …:多寄存器同步器
Multiple …:多寄存器同步器
Busy state…:忙碌状态
NRZ feedback ack_delay=1:NRZ反馈ack_delay=1:
Multiple …:多寄存器同步器
Multiple …:多寄存器同步器
Busy state…:忙碌状态
NRZ feedback ack_delay=1:NRZ反馈ack_delay=1:
如果需要反馈,则可以采用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…:源总线
Destination clk:目的时钟
1st …:第1个同步寄存器
2nd …:第2个同步寄存器
Intermediate value:过渡数值
Intermediate value:过渡数值
一种在同步数据总线时避免不想要的过渡数值的方法是,采用一个带有确认的临时事件同步器。这种逻辑可以采用以下次序对跨越时钟边界的数据进行同步交换:保持数据,发送“请接受”,发回“已接受”,释放数据寄存器。DW_pulseack_sync组件能够发送必要的“请接受”和“已接受”事件。
而一种带确认信号的数据总线同步器DW_data_sync能更好地完成此项任务。此IP消除了过渡虚拟数据,而且您可以对其进行配置,提供临时性的数据存储能力(图12)。
Optional …:可选用的临时数据寄存器
Handshake…:同步交换逻辑
Send …:发送控制
在源时钟比目的时钟快得并不多(或根本相同)时,提供一个确认信号的同步器可能会引发时延问题。如果在应用当中时延具有关键性的意义,则应考虑采用一种“提前”确认方式,即通过设置参数ack_delay = 0来进行配置。
如果源时钟比目的时钟快出很多,则可以同步确认信号,而且数据可以在不到目的时钟1个周期内的时间内改变。在时延并非关键性问题时,最好采用默认的ack_delay = 1设置。如果没有使用延迟,则在本地注释块内记录此项附加说明就是一种很好的处理方式。
以下是使用ack_delay = 0的通用规则[1]:
• clk_d的周期不应当超过clk_s *的周期(r_sync_type – 0.25)
• clk_s的频率不应当超过clk_d *的频率(f_sync_type – 0.25)
• 例如,在 f_sync_type = r_sync_type = 2, Fclk_d = 200 M Hz时
— Max Fclk_s = Fclk_d * (2 – 0.25)
— Max Fclk_s = 200 M Hz * 1.75 = 350 M Hz
如果确保目的时钟速率超过了(Fclk_s * (f_sync_type + 1.25))[2],则可以使用更简单的信号同步体系。在目的时钟较快的情况下,可以对“请接受”事件进行同步,并在不到源域1个时钟周期的时间内捕获数据。因此,也就不需要发回“已接受”事件了。在需要最大程度地减少时延和/或不必要的逻辑电路时,例如,在对一个实时时钟寄存器进行更新并将其内容发送到一个高速逻辑区块时,这种方法就较为实用。
为了实现这一方法,可以采用DesignWare的不带确认的数据总线同步器DW_ data_sync_na(图13)。此IP提供了比双向数据同步更高的数据吞吐量以及更少的逻辑电路,但请牢记时钟频率要求[2]: Fclk_d ≥ Fclk_s * (f_sync_type + 1.25).
Event …:事件同步逻辑电路
如果在任一时刻,一条总线上只会有一个位发生改变(也就是格雷码格雷码过渡),则简单的多寄存器同步绝对不会引发过渡虚假数据。而在接近采样时钟时有一个位发生改变时,第一个捕获此位的寄存器有可能进入亚稳态,但这个位将会转向新数值或旧有数值。
在诸如跨时钟域监测计数器的应用当中,格雷码总线就较为实用。计数器数值的格雷码允许您使用较简单的同步技巧来在持续不断的监测下达成更低的时延。
总线同步的另一种特殊情况涉及到一个您没有访问权的源域clk_s。例如,您有可能要面对一个来自于没有提供源时钟的外界源的进入芯片内的相对较慢的总线。由于电路板布线时延有可能导致位与位间的时序偏移超过单个时钟周期,多寄存器同步就有可能遇到超过一个时钟周期以上的过渡虚假数值。在这种情况下,您可以使用“历史寄存器”来检测数据所发生的变化,并决定何时将数据传递给芯片核心。
Last value:上一次的数值
New value:新数值
Control…:控制状态机
Counter:计数器
High count:高位计数
针对这些情况,DesignWare提供了单时钟过滤数据总线同步器DW_data_sync_1c(图14)。此同步器可以消除存在高位间时序偏移特性的数据过渡中的过渡数值。
在跨时钟域传输数据时,请牢记数据传输与数据流之间的差别。在数据传输当中,在典型情况下不会长时间维持背靠背(back-to-back)式的数据发送。数据同步设计可作为一个示例,例如采用DW_data_sync的设计方案。
而另一方面,数据流允许在设备提供的数据存储能力的限制范围内实现背靠背式的数据发送,例如采用FIFO。DesignWare Library内的双时钟FIFO依赖于双端口RAM的使用(图15)。源域内的推送逻辑电路负责将数据写入到RAM,而目的域内的弹出逻辑电路负责将数据从RAM读取。
Push logic:推送逻辑电路
Pop logic:弹出逻辑电路
FIFO Controller:FIFO控制器
Push interface:推送接口
Pop interface:弹出接口
此设计采用了DesignWare组件DW_ffoctl_s2_sf和DW_ffo_s2_sf来实现一个带有状态标志位的同步(双时钟)FIFO(图16)。自从1999年建立其体系架构以来,这些组件一直在DesignWare Library IP内广受欢迎。
Push logic:推送逻辑电路
Pop logic:弹出逻辑电路
FIFO Controller:FIFO控制器
Push interface:推送接口
Pop interface:弹出接口
实现状态标志位的另一种方案是采用动态标志位的双时钟FIFO,它采用DW_ ffo_2c_df和DW_ffoctl_2c_df组件(图127)。除了动态标志位支持以外,DW_ffoctl_2c_df提供了一些新特色(在DW_ffoctl_s2_sf提供的以外):
• 支持多RAM配置
• 来自RAM数据的重新定位
• 从双侧提供同步FIFO清空功能
• 提供来自RAM的读取启用信号
Pre-fetch cache:预取高速缓存
Push interface (…):推送接口(计数器和状态)
Pop …:弹出接口中(计数器和状态)
In-progress logic:顺序执行逻辑
一些芯片向外部逻辑电路提供了一个将与数据共同返回至芯片的时钟(图18)。在这些应用当中,如何在最小时延的情况下让数据流返回至芯片内的时钟域呢?
Return clock:返回时钟
Return …:返回数据有效
Return…:返回数据
Request clock:请求时钟
Request information:请求信息
Master Chip:主芯片
Off-ship logic:芯片外逻辑电路
Event ….:事件同步逻辑电路
如果数据传输率足够低,而且芯片拥有一个足够快的内部时钟(典型情况约为数据传输率的4倍左右),则可以采用DW_data_sync_na(图19),并依靠过采样来可靠地捕获数据。
如果数据传输率过高,导致不能采用过采样技巧来可靠处理数据,则需要采用一种具备某种数据存储能力的方法,例如双时钟FIFO。您可能想要采用DW_ffo_2c_df和AW_ ffo_s2_sf组件,但是,这两种组件存在着额外逻辑电路的费用,还有比采用简单数据传输技巧更高的时延。
作为FIFO的替代方案,通过一定数量的DW_data_sync_na-type模块对数据进行解复用,然后在目的域内对它们进行重新复用,其效果如何呢?图20所示为这种数据流同步器方法的一种实现,即DW_stream_sync。此IP提供了比标准双时钟FIFO解决方案更低的时延和更少的逻辑电路。
Receive control:接收控制
Send control:发送控制
To …:至clk_s顺序逻辑
To…:至clk_d顺序逻辑
对于DW_stream_sync,深度(depth)参数控制着解复用的通道数量。对于相干数据流来说,可将深度的数值设置为(f_sync_type + 2)。
只要您的设计满足以下两个条件,就可以将DW_stream_sync用于非相干数据流同步:具备了足够的存储能力,能够采集由于时钟差别所产生的松驰数据;以及数据流之间的间隙时间允许DW_stream_sync追上。
增加解复用通道的数量可以让数据流在稍慢于数据流时钟的目的时钟下运行。在数据猝发时,被数据占用的解复用通道的数量将逐步增加。在确定所要采种的解复用通道的数量时,要考虑到频率差别以及猝发规模。
Bubble …:输出数据内的泡沫代表着源时钟速率与目的时钟速率之间的差别
在数据流传输率低于目的时钟率时,DW_stream_sync会偶然生成一个输出端没有数据的周期(图21)。但是,如果正确地设置了预填充数值(通过prefll_lvl参数)以及深度(depth)参数,则DW_stream_sync可以同时稍微加快和稍微放慢地处理输入的数据流。此项能力对于提高数据源会在一些较小误差范围内变动时的互操作性是实用的。
特殊情况-复位/清零
DesignWare Library内有几种类型的IP可以帮助您处理跨时钟域事件同步时的特殊问题。这些问题当中包括了对复位和清零信号的控制。
如果一个FIFO控制器的目的侧在源侧之间进行了清零和释放,则目的地有可能依据旧的指针信息而采取行动。您可以通过采用一个复位序列同步器DW_reset_sync来防止此类问题的发生(图22)。此IP能够正确地为源域和目的域内的逻辑电路的同步清零设定次序,以确保空状态或闲置状态的产生。
Source …:源侧控制
Dest. …:目的侧控制
DW_reset_sync能够采用源侧或目的侧启动的清零操作来控制源域和目的域的逻辑清零的正确序列。图23所示是源侧启动方法的时序,侧图24所示为目的侧方法。
一些设计采用了源自于同一个主时钟的多个时钟域。如果您通过时钟树限制了时钟偏移现象,则可以采用一种高效的方法来跨越这种时钟边界来获取数据。
Source …:源侧捕获寄存器
(high …):高速域
Destination …:目的侧捕获寄存器
Source …:源侧捕获寄存器
(high …):高速域
Destination …:目的侧捕获寄存器
具体来说,DW_data_qsync_lh提供了一种可用于低频至高频时钟的准同步数据接口(图25)。换句话说,数据从较慢的源域发送至较快的目的域。如果时钟比率为2,则目的域的第一个触发器将是一个负边沿触发器。否则,所有触发器(两个域内)均为正边沿型。
图26所示为采用DW_data_qsync_lh进行数据传输时的时序。正如此时序图所示,IP确保了在时钟相关以及目的时钟快于源时钟时的同步数据传输。
Internal …:内部输入捕获寄存器
Previous data:以前的数据
(low-speed domain):低速域
Control …:控制状态机
Timing reference:时序基准
图27 用于低频至高频时钟的准同步数据接口DW_data_qsync_hl
如果您必须从较快的目的域向较慢的源域传输数据,则采用另一个IP产品DW_data_qsync_hl可让您安全地管理好时序。这个适用于低频至高频时钟的准同步数据接口采用了一个时序基准信号来决定数据变化用的正确时刻(图27)。如上所示,如果时序比率为2,则实现方案采用负边沿触发器,但在这一情况下,是源域内用于采样来自目的域时序基准信号的触发器采用负边沿触发器。图28所示为一个DW_data_qsync_hl运行时的时序图。
Previous data:以前的数据
在两个或多个信号只采用多个寄存器(例如DW_sync)进行同步,并且随后这些信号在目的时钟域内组合成单一逻辑表达时(图29),才存在跨时钟域收敛的问题。
Signal A …:信号A逻辑电路
Signal B …:信号B逻辑电路
Clk_s …:clk_s域
Multiple …:多寄存器同步器
Logic combines …:组合了来自clk_s域信号的逻辑电路
Clk_d …:clk_d域
即使诸如Synopsys的Leda这样的代码检查工具能够识别出CDC收敛的实例,但这些工具却不能决定这种收敛是否代表着一种功能上的错误。其潜在问题是,依靠多寄存器同步器的统一均匀时延的状态机的设计有可能在芯片上不能正确运行。
正常的仿真并不能揭示出这种问题,因为多寄存器同步器在仿真时每一次均会表现出完全相同的时延。而在真实情况下,在信号变化与采样时钟配合起来后,其变化有时候会通过N个时钟的N级同步而传递下去,而在其它时候这些变化要用掉N+1个时钟。除了MTBF非常低以外,这种问题在芯片上发生得并不频繁,所以,可能只有在几周运行后才能发觉。
一种检测这种误采样问题的方式是在仿真时采用一种特殊的触发器模型(图30)。但是,正如真实世界一样,只有在采样触发器发生违反现象时,这些仿真才会显示出问题,这也是一种极少发生的现象。您将需要占用大量的仿真时间才能合理地确认没有收敛问题的存在。
Clock …:时钟至Q延迟
+Noise:噪声
Metastability …:亚稳态触发器模型
一种更好的方法是采用一个包含了一个复用器的误采样模型。这种方法是基于认识到,在目的逻辑电路对一个正在变化的位进行采样时,所捕获的最终数值只有可能是两种可能数值之一,即:最新输入数值或来自以前周期的输入数值。而在同步器的第一个触发器前设置一个复用器时,就可以通过控制这个复用器来建立误采样行为的模型(图31)。
Missample …:误采样控制
Synchronizer input:同步器输入
History …:历史寄存器
Two …:两级同步
Sychronizer output:同步器输出
这个误采样方法已经内嵌于DW_sync组件之内以及所有其它采用了DW_sync的DesignWare CDC IP。
在运行当中,由一个伪随机数字发生器来提供对每一个同步器输入位的随机控制。对于verilog仿真,可定义一个采用以下特征的宏: vcs +defne+DW_MODEL_MISSAMPLES…
对于Vhdl,采用 …_cfg_sim_ms配置:
对于U1:DW_sync采用配置dw03.DW_sync_cfg_sim_ms; end for;
您可通过设置参数verif_en = 0而按照每一个实例的具体情况禁用此项特征。如表1所示,您还有其它两种verif_en选择方案。图32所示为verif_en = 1时的DW_sync的误采样原理框图。
verif_en数值 0 1 2
时延(周期) ?_sync_type ?_sync_type to ?_sync_type + 1 ?_sync_type to ?_sync_type + 3
Width:宽度
Width:宽度
To …:至第1级同步触发器
Random …:随机数发生器
Random …:随机数发生器
请牢记,在输入时序偏移很大时,误采样有可能在多个时钟周期内持续存在-只能在使用DW_data_sync_1c的芯片外数据同步情况下才可经常见到。在设置verif_en = 2时,DesignWare Library CDC组件可以通过多达3个时钟周期来“模糊”数据过渡现象。图33所示为这种情况下的误采样原理框图。从4个可能选项之中选择2位随机数值,其中包括了串联的3个历史寄存器。
Width:宽度
Width:宽度
To …:至第1级同步触发器
Random …:随机数发生器
Random …:随机数发生器
DW_sync内所采用的误采样模型也可以用于建立在对同一时刻有一个以上位发生变化的总线进行采样时有可能出现的瞬态虚假数据的模型。如果认为自己的设计不会受这些虚假数值的影响,则可以通过采用这种误采样建模方法来加强自己的信心。DW_ sync可以随机为每一个总线位选择旧数值或新数值来生成过渡数值(图34)。
Source …:源总线
Destination …:目的总线
1st …:第1个同步寄存器
2nd …:第2个同步寄存器
Intermediate:过渡数值
Intermediate:过渡数值
由于误采样在实际运行中发生频度极低(除非在MTBF非常低的情况下),通常您必须等上很长时间才能见到与CDC机制相关的问题。此模型采用了DW_sync,通过造成误采样行为的频繁发生来恶化这种问题。具体来说,在一次误采样延时当中,DW_sync的每一位均通过了50%的数据过渡现象。这样,如果在一个合理数量的CDC事务处理内对DW_sync误采样建模的系统仿真成功的话,则您可非常确保实际芯片内不会发生CDC问题。
与CDC同步相关的另一个特殊问题是多寄存器同步器向技术单元的映射。在Design Compiler将两个触发器映射到一个目标库的同一行上时,此工具会不可避免地选择能够满足时序限制条件的最小面积的单元,而不是对同步最好的触发器。因此,您通常想要通过手动方式或通过脚本方式用已知的“亚稳态强化”触发器来替代这些触发器。
自DesignCompiler的B-2008.09版本开始,您就可以指定一个或多个“亚稳态强化”触发器在DesignWare CDC组件向您目标技术的映射中自动应用了。此项能力是通过将“synlib_preferred_ffs” DC变量赋予技术单元名称列表而达成的。例如,如果您的技术库包含了名称为FFSYNCFD1和FFSYNCFD2的已认定为“亚稳态强化”的两个不同触发器时,则以下命令将实现这些单元的正确映射:
set synlib_preferred_ffs “FFSYNCFD1 FFSYNCFD2”
请注意,此DC变量的数值是一个单独的文本串,则不是一个Tcl列表,而且此机制目的只支持单个触发器技术单元。
对于B-2008.09前的Design Compiler来说,您可以使用Tcl脚本来查找您设计中的DW_sync同步器寄存器,并用用户指定的触发器实例来替代它们。我们可按您的请求提供示例脚本。
在采用具备提前确认功能的DW_data_sync组件时,设计人员需要意识到,在源时钟快至足以对提前确认进行同步并且在目的域能够捕获到给出确认的数据之前就更新了数据寄存器时,就会存在运行风险。
在源时钟校准至其上升沿紧跟着用于产生提前确认信号的目的时钟上升沿时,就会发生最差情景下的场景。在这种情况下,第一个确认同步寄存器会立刻捕获到这个确认信号,而这个确认信号才刚刚维持住,而且新数据得到最快速的应用(由于确认信号的原因)。这种危险情况以下面的图中进行了说明,图中采用了一个位于DW_data_sync内带有提前确认(即,ack_delay参数设置为零)的两级同步(也就是r_sync_type参数设置为2)的设计方案。
Synchronization ….:在ack_delay=0, r_sync_type=2以及clk_s过快时的同步危险情况
Internal …:内部确认信号
Internal data to capture:要捕获的内部数据
New data:新数据
Ack …:clk_s确认同步器的第一级刚刚检测到时,确认信号就发出了(在clk_d内)
Second …:确认同步器的第二级检测到这个确认信号
Data …:在新数据由clk_s取得时,数据由clk_d捕获到
因此,以下公式必须保持为真:
更方便的形式是:
如果时钟抖动和保持时间均考虑在内,则最差情况下的时序调校情况会是,在一个正在内部发出的确认信号存在clk_d内最早的峰值间抖动时,与此同时,存在抖动的clk_s在最迟可能的峰值间时刻发出一个上升沿。这样,最迟可能的峰值间抖动clk_d就需要发生在比最早的峰值间抖动clk_s更早的位置,且领先幅度至少为寄存器捕获data_d所要求的保持时间。
Add …:增加时钟抖动(不确定性)以及必要的数据捕获保持时间
Internal …:内部确认信号
因此,以下公式必须保持为真:
更方便的形式时:
Internal …:要捕获的内部数据
Hold time:保持时间
New data:新数据
因此,以下公式必须保持为真:
采用更方便的形式时:
Pclk_d:clk_d的周期
Pclk_s:clk_s的周期
Fclk_d:clk_d的频率
Fclk_s:clk_s的频率
r_sync_type:同步级数
Jclk_d:Clk_d的峰值间抖动
Jclk_s:Clk_s的峰值间抖动
Thold:数据寄存器的保持时间要求
这些计算以下列假设为基础:
1) 在其抖动窗口内最迟可能位置处发生的clk_d的上升沿位于处于其尽早可能位置的clk_s上升沿之后一个周期的可能性不为零。
2) 发生在其抖动窗口内其最早可能位置的clk_s的某个上升位于其最迟可能位置处的clk_s的上升沿后N个周期的可能性不为零(其中N为所采用的同步级数,也就是,N = r_sync_type)。
如果所给出的公式受限过多,而且可以精确地测定出clk_s和clk_d的最大周期间掉抖动时,则可以使用如下的Jclk_s和Jclk_d定义。
Synchronization ….:在clk_s不够快时,DW_data_sync_na所发生的同步危险
Internal data change flag:内部数据改变标志
Internal …:要捕获的内部数据
New data:新数据
- Data…:数据已在内部捕获,数据改变标志位切换,指示新数据可用
- First ….:数据改变标志同步器的第一级几乎错失掉数据标志位的改变
First stage …:数据改变标志同步器的第一级检测到此改变
Second …:数据改变标志同步器的第二级检测到此改变
Data captured …:数据由clk_d所捕获,同时新数据也由clk_s进行了内部缓存
如果考虑到时钟抖动和保持时间,最差情况下的时序调校将是,内部数据标志位的变化发生在处于其峰值间抖动最迟位置的clk_s上升沿,此时(在同一时间)有一个clk_d的上升沿处于其峰值间抖动的最早可能位置。这样,对于处于其峰值间抖动最早可能位置的紧跟着的下一个clk_s上升沿来说,其发生时间就需要比处于峰值间抖动最迟可能位置的clk_d上升沿迟出至少寄存器捕获data_d所要求的保持时间。
Adding …:添加时钟抖动(不确定性)以及必要的数据捕获保持时间
Internal …:内部数据改变标志位
Internal data …:要捕获的内部数据
New …:新数据
Hold …:保持时间
因此,如下公式必须保持为真:
更为方便的形式是:
Pclk_d:clk_d的周期
Pclk_s:clk_s的周期
Fclk_d:clk_d的频率
Fclk_s :clk_s的频率
f_sync_type :同步级数
Jclk_d:Clk_d的峰值间抖动
Jclk_s:Clk_s的峰值间抖动
Thold :数据寄存器的保持时间要求
这些计算以下列假设为基础:
1) 在其抖动窗口内最早可能位置处发生的clk_d的上升沿位于处于其最迟可能位置的clk_s上升沿之后一个周期的可能性不为零。
2) 发生在其抖动窗口内其最迟可能位置的clk_d的上升沿位于最早可能位置处的clk_d的上升沿后N个周期的可能性不为零(其中N为所采用的同步级数加1,也就是,N = f_sync_type+1)。
如果所给出的公式受限过多,而且可以精确地测定出clk_s和clk_d的最大周期间掉抖动时,则可以使用如下的Jclk_s和Jclk_d定义。