跨时钟域信号同步的IP解决方案Word文档下载推荐.docx
《跨时钟域信号同步的IP解决方案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《跨时钟域信号同步的IP解决方案Word文档下载推荐.docx(33页珍藏版)》请在冰豆网上搜索。
为了保持稳定一致的解决用时,设计人员可以采用一个2个触发器组成的序列。
但是,这种传统解决方案肯定会增加时延。
在采用2个触发器的解决方案,时钟树就以减去触发器FF1的时钟至Q延时后的时钟周期以及FF2的建立时间要求为基础。
对于有着相对较高数据传输速率的高速应用来说,即使两级同步器也有可能无法获得足够的MTBF,特别是在FPGA实现方案中。
如果加入第3级,则只有在第1级在亚稳态保持了足够长的时间,导致侵占了FF2的建立时间的情况下,第2级才有可能发生亚稳态事件(图3)。
图3 3级同步器
SampeMTBFtest…MTBF测试电路示例,ErrorCounter错误计数器。
采用这一方法,MTBF可计算为:
T0和T1常数与所选用的具体触发器相关,并有可能从库供应商处获得。
库供应商会采用如图4所示的电路来测定这些常数。
错误计数器用于测量在输入时钟处于某一特定组合的输入频率下的MTBF。
通过在不同频率比率下让此电路运行,就可以测定T0和T1的数值。
图4 用于测定触发器常数的电路
参见以下资料,可以了解更多有关亚稳态和MTBF计算的信息:
•“确保亚稳态不会破坏您的数字设计方案”,作者:
DeboraGrosse,Unisys,EDN,1994
•“数字系统亚稳态特性”,作者:
Kleeman&
Cantoni,IEEETransactionsonComputers,ol.C-36,No.1,Jan.,1987
•Google:
MTBF亚稳态同步
另一个基本同步问题涉及到扫描测试。
扫描链经常采用保持锁存以确保在时钟域之间实现正确的扫描切换。
如果在扫描测试排序时,让最后一个扫描输入循环后面直接跟一个捕获循环,且让两者的时钟均由测试时钟来驱动,则有可能无法正确捕获到跨越时钟域的功能信号(图5)。
在源侧域之间插入一个锁存器能够提供1/2时钟周期的延迟,确保了扫描测试期间的正确捕获操作,从而解决了这个问题。
在不处于扫描模式时,可由一个复用器将这个锁存器旁路,实现正常功能运行。
另一种解决方案是在较小型的时钟域之间插入一个负边沿触发器。
图5a–扫描测试中不受控制的偏移有可能导致跨域捕获发生违反
图5b–在域之间复用一个锁存器可以确保1/2时钟周期的保持
图5c–一个负边沿D触发器也可保持1/2时钟周期的保持
图5 跨时钟域扫描测试问题
对于基本同步来说,设计人员可以使用DesignWare的DW_sync组件,此组件有以下参数:
•宽度
•f_sync_type:
级数
•tst_mode:
0=>
无保持,1=>
锁存,2=>
负边沿触发器
•verif_en(下文讨论;
不影响综合)
在以f_sync_type参数指定了级数后,将获得如图6所示的配置方式之一。
图6 采用DW_sync组件时可能的级数
同步临时事件
有些时间,您需要在一个时钟域内设置逻辑电路以告知另一个异步时钟域内的逻辑电路,有某一特定事件已经发生。
一种方法是采用如图7所示的方案,其中通过门选复位来清空源域内的脉冲。
图7a–较差的设计方案
图7b–较好但仍存在门选复位
图7c–更好的设计方案,但仍不是最佳方案
图7另一个时钟域内事件的通知逻辑
在使用一个高电平有效的脉冲作为跨时钟域事件的信号时,这个脉冲的宽度必须足以确保采样操作的完成,而且必须在脉冲之间存在明显的无信号时间。
为了避免采用脉冲拉伸机制,您可以使用不归零(NRZ)信号发生方式,而不要使用归零(RZ)信号发生方式。
图8所示为clk_d域是如何在后一种类型的信号下捕获变化的,这是一种在许多状况下难于采用的方法。
Eventinclk_s:
clk_s内的事件;
Returnto…:
Clk_d内捕获的归零信号;
Capturedin…:
在clk-d内捕获的信号
图8 NRZ信号发生方式的优点
为了简化时钟域之间的脉冲传递,可采用DW_pulse_sync双时钟脉冲同步器(图9)。
标为“clk_s”的虚线框内的逻辑电路运行在clk_s(源)时钟域下,而标为“clk_d”的虚线框内的逻辑电路运行在clk_d(目的)时钟域内。
在域之间采用NRZ信号可以实现更高的事件处理流量,而且由于无需反馈,所要求的逻辑电路也较少。
Register…:
可以通过parameter,reg_event在器件外配置寄存器;
NRZ…:
跨域的NRZ信号;
Multiple…:
多寄存器同步器;
History…:
用于检测变化的历史寄存器
图9 DW_pulse_sync双时钟脉冲同步器
Multiple…:
Busystate…:
忙碌状态;
NRZfeedbackack_delay=1:
NRZ反馈ack_delay=1:
图10 加了确认的DW_pulseack_sync脉冲同步器
如果需要反馈,则可以采用DW_pulseack_sync,这是一种带有确认的脉冲同步器。
如图10所示,这个IP产品提供了一个NRZ反馈信号,能够比无确认版本提供更高的事件处理流量。
DW_pulseack_sync还提供了可配置的标志寄存器和反馈延时。
同步数据总线
在从一个时钟域跨越至另一个时钟域时,在目的时钟对接近过渡状态的总线进行采样时,数据总线上有可能出现瞬时虚假数值(图11)。
例如,一条从11011001变为01011010的8位总线上有3个位发生了改变。
在所涉及的偏移存在时序上不确定性的情况下,就有会看到8个可能出现的数值:
theinitialvalue(11011001),thefinalvalue(01011010)andsixpossibleintermediatevalues(11011000,11011011,11011010,01011001,01011000and01011011).
Source…:
源总线;
Destinationclk:
目的时钟;
1st…:
第1个同步寄存器
2nd…:
第2个同步寄存器;
Intermediatevalue:
过渡数值;
过渡数值
图11 瞬时总线数值
一种在同步数据总线时避免不想要的过渡数值的方法是,采用一个带有确认的临时事件同步器。
这种逻辑可以采用以下次序对跨越时钟边界的数据进行同步交换:
保持数据,发送“请接受”,发回“已接受”,释放数据寄存器。
DW_pulseack_sync组件能够发送必要的“请接受”和“已接受”事件。
而一种带确认信号的数据总线同步器DW_data_sync能更好地完成此项任务。
此IP消除了过渡虚拟数据,而且您可以对其进行配置,提供临时性的数据存储能力(图12)。
Optional…:
可选用的临时数据寄存器;
Handshake…:
同步交换逻辑;
Send…:
发送控制
图12带确认的DW_data_sync总线同步器
确认延迟问题
在源时钟比目的时钟快得并不多(或根本相同)时,提供一个确认信号的同步器可能会引发时延问题。
如果在应用当中时延具有关键性的意义,则应考虑采用一种“提前”确认方式,即通过设置参数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=200MHz时
—MaxFclk_s=Fclk_d*(2–0.25)
—MaxFclk_s=200MHz*1.75=350MHz
如果确保目的时钟速率超过了(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…:
事件同步逻辑电路
图13 不带ac确认信号的DW_data_sync_na总线同步器
总线同步的特殊情况
如果在任一时刻,一条总线上只会有一个位发生改变(也就是格雷码格雷码过渡),则简单的多寄存器同步绝对不会引发过渡虚假数据。
而在接近采样时钟时有一个位发生改变时,第一个捕获此位的寄存器有可能进入亚稳态,但这个位将会转向新数值或旧有数值。
在诸如跨时钟域监测计数器的应用当中,格雷码总线就较为实用。
计数器数值的格雷码允许您使用较简单的同步技巧来在持续不断的监测下达成更低的时延。
总线同步的另一种特殊情况涉及到一个您没有访问权的源域clk_s。
例如,您有可能要面对一个来自于没有提供源时钟的外界源的进入芯片内的相对较慢的总线。
由于电路板布线时延有可能导致位与位间的时序偏移超过单个时钟周期,多寄存器同步就有可能遇到超过一个时钟周期以上的过渡虚假数值。
在这种情况下,您可以使用“历史寄存器”来检测数据所发生的变化,并决定何时将数据传递给芯片核心。
Lastvalue:
上一次的数值;
Newvalue:
新数值;
Control…:
控制状态机;
Counter:
计数器;
Highcount:
高位计数
图14DW_data_sync_1c单时钟过滤数据总线同步器
针对这些情况,DesignWare提供了单时钟过滤数据总线同步器DW_data_sync_1c(图14)。
此同步器可以消除存在高位间时序偏移特性的数据过渡中的过渡数值。
数据传输与数据流
在跨时钟域传输数据时,请牢记数据传输与数据流之间的差别。
在数据传输当中,在典型情况下不会长时间维持背靠背(back-to-back)式的数据发送。
数据同步设计可作为一个示例,例如采用DW_data_sync的设计方案。
而另一方面,数据流允许在设备提供的数据存储能力的限制范围内实现背靠背式的数据发送,例如采用FIFO。
DesignWareLibrary内的双时钟FIFO依赖于双端口RAM的使用(图15)。
源域内的推送逻辑电路负责将数据写入到RAM,而目的域内的弹出逻辑电路负责将数据从RAM读取。
Pushlogic:
推送逻辑电路;
Poplogic:
弹出逻辑电路;
FIFOController:
FIFO控制器
Pushinterface:
推送接口;
Popinterface:
弹出接口
图15 配合双端口RAM的双时钟FIFO
此设计采用了DesignWare组件DW_ffoctl_s2_sf和DW_ffo_s2_sf来实现一个带有状态标志位的同步(双时钟)FIFO(图16)。
自从1999年建立其体系架构以来,这些组件一直在DesignWareLibraryIP内广受欢迎。
图16 配有状态标志的DesignWare双时钟FIFO控制器
实现状态标志位的另一种方案是采用动态标志位的双时钟FIFO,它采用DW_ffo_2c_df和DW_ffoctl_2c_df组件(图127)。
除了动态标志位支持以外,DW_ffoctl_2c_df提供了一些新特色(在DW_ffoctl_s2_sf提供的以外):
•支持多RAM配置
•来自RAM数据的重新定位
•从双侧提供同步FIFO清空功能
•提供来自RAM的读取启用信号
Pre-fetchcache:
预取高速缓存;
Pushinterface(…):
推送接口(计数器和状态);
Pop…:
弹出接口中(计数器和状态);
In-progresslogic:
顺序执行逻辑
图17 配有动态标志位的DesignWare双时钟FIFO
任意相位相干数据流
一些芯片向外部逻辑电路提供了一个将与数据共同返回至芯片的时钟(图18)。
在这些应用当中,如何在最小时延的情况下让数据流返回至芯片内的时钟域呢?
Returnclock:
返回时钟;
Return…:
返回数据有效;
Return…:
返回数据;
Requestclock:
请求时钟;
Requestinformation:
请求信息;
MasterChip:
主芯片;
Off-shiplogic:
芯片外逻辑电路
图18与外部逻辑电路来回传输的时钟和数据
Event….:
图19不带确认的DW_data_sync_na数据总线同步器
如果数据传输率足够低,而且芯片拥有一个足够快的内部时钟(典型情况约为数据传输率的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解决方案更低的时延和更少的逻辑电路。
Receivecontrol:
接收控制;
Sendcontrol:
To…:
至clk_s顺序逻辑;
To…:
至clk_d顺序逻辑
图20DW流同步数据数据同步器
对于DW_stream_sync,深度(depth)参数控制着解复用的通道数量。
对于相干数据流来说,可将深度的数值设置为(f_sync_type+2)。
只要您的设计满足以下两个条件,就可以将DW_stream_sync用于非相干数据流同步:
具备了足够的存储能力,能够采集由于时钟差别所产生的松驰数据;
以及数据流之间的间隙时间允许DW_stream_sync追上。
增加解复用通道的数量可以让数据流在稍慢于数据流时钟的目的时钟下运行。
在数据猝发时,被数据占用的解复用通道的数量将逐步增加。
在确定所要采种的解复用通道的数量时,要考虑到频率差别以及猝发规模。
Bubble…:
输出数据内的泡沫代表着源时钟速率与目的时钟速率之间的差别
图21无数据的数据流
在数据流传输率低于目的时钟率时,DW_stream_sync会偶然生成一个输出端没有数据的周期(图21)。
但是,如果正确地设置了预填充数值(通过prefll_lvl参数)以及深度(depth)参数,则DW_stream_sync可以同时稍微加快和稍微放慢地处理输入的数据流。
此项能力对于提高数据源会在一些较小误差范围内变动时的互操作性是实用的。
特殊情况-复位/清零
DesignWareLibrary内有几种类型的IP可以帮助您处理跨时钟域事件同步时的特殊问题。
这些问题当中包括了对复位和清零信号的控制。
如果一个FIFO控制器的目的侧在源侧之间进行了清零和释放,则目的地有可能依据旧的指针信息而采取行动。
您可以通过采用一个复位序列同步器DW_reset_sync来防止此类问题的发生(图22)。
此IP能够正确地为源域和目的域内的逻辑电路的同步清零设定次序,以确保空状态或闲置状态的产生。
Source…:
源侧控制;
Dest.…:
目的侧控制
图22DW_reset_sync复位序列同步器
DW_reset_sync能够采用源侧或目的侧启动的清零操作来控制源域和目的域的逻辑清零的正确序列。
图23所示是源侧启动方法的时序,侧图24所示为目的侧方法。
图23DW_reset_sync源侧启动的时序
图24DW_reset_sync目的侧启动的时序
特殊情况-相关时钟系统
一些设计采用了源自于同一个主时钟的多个时钟域。
如果您通过时钟树限制了时钟偏移现象,则可以采用一种高效的方法来跨越这种时钟边界来获取数据。
源侧捕获寄存器;
(high…):
高速域;
Destination…:
目的侧捕获寄存器
图25a–大于2的时钟比率
图25b-等于2的时钟比率
图25用于低频至高频时钟的准同步数据接口DW_data_qsync_lh
具体来说,DW_data_qsync_lh提供了一种可用于低频至高频时钟的准同步数据接口(图25)。
换句话说,数据从较慢的源域发送至较快的目的域。
如果时钟比率为2,则目的域的第一个触发器将是一个负边沿触发器。
否则,所有触发器(两个域内)均为正边沿型。
图26所示为采用DW_data_qsync_lh进行数据传输时的时序。
正如此时序图所示,IP确保了在时钟相关以及目的时钟快于源时钟时的同步数据传输。
Internal…:
内部输入捕获寄存器;
Previousdata:
以前的数据
图26.DW_data_qsync_lh时序
图27a–时钟比率大于2
(low-speeddomain):
低速域;
Control…:
Timingreference:
时序基准
图27b-等于2的时钟比率
图27用于低频至高频时钟的准同步数据接口DW_data_qsync_hl
如果您必须从较快的目的域向较慢的源域传输数据,则采用另一个IP产品DW_data_qsync_hl可让您安全地管理好时序。
这个适用于低频至高频时钟的准同步数据接口采用了一个时序基准信号来决定数据变化用的正确时刻(图27)。
如上所示,如果时序比率为2,则实现方案采用负边沿触发器,但在这一情况下,是源域内用于采样来自目的域时序基准信号的触发器采用负边沿触发器。
图28所示为一个DW_data_qsync_hl运行时的时序图。
Previousdata:
图28.DW_data_qsync_hl时序
CDC收敛问题
在两个或多个信号只采用多个寄存器(例如DW_sync)进行同步,并且随后这些信号在目的时钟域内组合成单一逻辑表达时(图29),才存在跨时钟域收敛的问题。
SignalA…:
信号A逻辑电路;
SignalB…:
信号B逻辑电路;
Clk_s…:
clk_s域
Logiccombines…:
组合了来自clk_s域信号的逻辑电路;
Clk_d…:
clk_d域
图29跨时钟域收敛
即使诸如Synopsys的Leda这样的代码检查工具能够识别出CDC收敛的实例,但这些工具却不能决定这种收敛是否代表着一种功能上的错误。
其潜在问题是,依靠多寄存器同步器的统一均匀时延的状态机的设计有可能在芯片上不能正确运行。
正常的仿真并不能揭示出这种问题,因为多寄存器同步器在仿真时每一次均会表现出完全相同的时延。
而在真实情况下,在信号变化与采样时钟配合起来后,其变化有时候会通过N个时钟的N级同步而传递下去,而在其它时候这些变化要用掉N+1个时钟。
除了MTBF非常低以外,这种问题在芯片上发生得并不频繁,所以,可能只有在几周运行后才能发觉。
一种检测这种误采样问题的方式是在仿真时采用一种特殊的触发器模型(图30)。
但是,正如真实世界一样,只有在采样触发器发