CDC设计与验证问题

CDC设计
Clock Domain Crossing(CDC)design ,即跨时钟域设计。我们知道,亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态(0或者1)。在多时钟域设计中,亚稳态无法避免,但是我们可以抵消亚稳态的不利影响。
图1展示了从一个时钟域到另外一个时钟域同步数据失败的例子,这导致输出进入亚稳态,原因是采样时钟沿与发送时钟沿太过靠近,木得预留足够的数据保持稳定之后以供采样时间。在这里插入图片描述
亚稳态是一个不容忽视的问题。如图2给出,由于输出的不确定性,在接收时钟域中遍历亚稳态输出会导致非法信号值在整个设计余下部分传播。由于CDC信号可能会在一段时间内波动,接收时钟域中的输入逻辑可能会将波动信号的逻辑电平识别为不同的值,从而将错误信号传播到接收时钟域中。在这里插入图片描述
设计中使用的每个触发器都有确定的建立和保持时间,即以及合法的指定了在时钟上升沿之前和之后输入数据保持不变的时间。该时间窗口的存在正是为了防止信号变化过快太接近另外一个同步信号而导致输出进入亚稳态。
同步器
同步数据需要考虑两种场景:
1、跨时域传输时允许错过一些采样信号;
对于这种场景,指在有些设计中,不需要采样每个值,但是要求采到的数据是准确的。举个例子,标准异步FIFO设计中使用的格雷码计数器的集合,计数器不需要从另外一个时钟域采样到每个合法值,但至关重要的是,采样值必须能够准确的识别出满/空条件。
2、跨时域传输时的每个信号都必须采样;
每一个CDC信号都需要被准确的采到。

以上两种场景下,共同的要求都是信号需要从一个时钟域同步到另一个时钟域,so,接下来讨论同步问题。
TWO flip-flop同步器
第一个触发器将异步输入信号采样到新的时钟域中,并等待一个完整的时钟周期的时间,使得第一阶段输出信号上的任何亚稳态衰减完成,然后通过相同的时钟将1级信号采样到第二级触发器中,目的是使第二阶段信号现在成为稳定且有效的信号,准备在新的时钟域内分配。在这里插入图片描述
从理论上讲,同步信号到第二级触发器时,由于第一级信号仍可能存在较长的亚稳态,也有可能导致第二级输出信号也变为亚稳态。这一情况,可由MTBF来推断发生的概率。同步失败的时间概率计算(MTBF)是多个变量的函数,其中包括用于生成输入信号和为同步触发器提供时钟的时钟频率。
对于大多数同步设计,
两个触发器同步器足以消除所有可能的亚稳态。

MTBF-mean time before failure 平均故障前时间
在大多数设计中,对于任何越过CDC边界的信号,必须计算平均故障前时间(MTBF)。 从这个意义上讲,故障意味着信号传递到同步触发器,在第一级同步器触发器上变为亚稳态,且一个周期之后,当它被采样到第二级同步器触发器中时,仍然是亚稳态的。
由于信号在一个时钟周期后仍未稳定到一个确定值,因此在采样并传递到接收时钟域后,该信号仍可能是亚稳态的,导致后续逻辑存在潜在故障。在计算MTBF时,大数字优先于小数字。MTBF值越大,表示两次潜在故障之间的时间间隔越长,虽然较小的MTBF值表明亚稳性可能经常发生,同样会导致设计失败。

相关论文给出了一个用来计算同步电路的MTBF的表达式。由表达式可以看出直接影响同步器电路的MTBF的两个最重要因素是:采样时钟频率(将信号采样到接收时钟域中有多快)和数据更改频率(越过CDC边界的数据更改有多快)。即,在高速设计中故障发生的频率更高(MTBF较短),或者当采样数据更频繁地变化时。
在这里插入图片描述

Three flip-flop 同步器
对于一些高速设计,2级触发器同步的MTBF太短了,因此三级触发器用来提高MTBF的值使得设计满足时间需求。
在这里插入图片描述
同步来自发送时钟域的信号
将来自于发送时钟域的信号在传输到接收时钟域之前寄存信号是个好主意吗?这里隐藏了一个假设,即CDC信号会被同步到接收时钟域。因此,它们不要求在发送时钟域进行同步。这样的假设并不合理,通常时要求在发送时钟域寄存信号。考虑这样一个例子,如下图6中,发送时钟域中的信号在传送到接收时钟域之前并未被寄存。
在这里插入图片描述
从该例子中可以看出,从发送时钟域得到的组合逻辑输出,可能在CDC边界处经历combinational setting。这种组合建立有效地增加了由于数据更改可能会产生的微小震荡数据突发的频率,增加了数据正在变化时可以采样的边沿数,所以,对不断变化的数据采样而导致的亚稳态场景出现的概率增大了。

将信号同步到接收时钟域
在这里插入图片描述
aclk域信号在传递到bclk域之前先在adat触发器寄存。adat触发器滤除输入(a)上的组合setting信号,并将纯净信号传递到bclk域。

将快速信号同步到慢速时钟域
对于跨时域传输问题,传输信号的位宽以及同步技术都是务必考虑的问题。与同步器相关的一个问题是来自发送时钟域的信号在被采样之前可能会改变值两次,或太靠近较慢时钟域的采样边缘。每当信号从一个时钟域发送到另一个时钟域时,都必须确定丢失的信号对于当前设计是否重要。
当不允许丢失采样样本时,我们有以下两种方法来解决该问题:
(1)一种开环解决方案,可以确保在没有ACK(确认)的情况下捕获信号;
(2)一种闭环解决方案,要求跨过CDC边界的接收信号反馈ACK;
以下讨论这两种解决方案。

在时钟域之间传递可靠信号的要求
当快速时钟域的时钟频率是慢速时钟域的1.5X或者更多时,将慢速时域的控制信号同步到快速时钟域通常不会出现问题,因为快速时钟信号将会采样慢速CDC信号一次或者多次。比起将较快的信号采样到慢速时域,慢速信号采样到快速时域可能产生的问题更多,设计者可以利用这一特点,使用简单的两级触发器在两个时钟域之间同步传输单比特CDC信号。

the “three edge” requirement
相关论文指出当通过一个2级触发器的同步器在时两个钟域之间传递一个CDC信号时,CDC信号必须大于接收域时钟周期宽度的1-1 / 2倍。即可以描述为“输入数据值必须在三个目标时钟沿保持稳定”。

对于极长的源时钟和目标时钟频率,可以安全地将该要求放宽到接收时钟域周期时间的1-1 / 4倍或更短,但是“三边沿”准则是最安全的初始设计条件,并且比使用仿真过程中动态测量CDC信号的分数宽度更容易通过使用SystemVerilog断言进行证明。

“三边沿”要求实际上适用于开环和闭环解决方案,但闭环解决方案的实现会自动确保为所有CDC信号检测到至少三个边沿。

passing a fast CDC pulse
当发送时钟域的频率高于接收时钟域的频率时,若CDC脉冲在发送时钟域中只有一个周期宽。如果CDC信号仅在一个快速时钟周期内产生脉冲,此时CDC信号可能会在较慢时钟的上升沿之间变高和变低,而不会被捕获到较慢的时钟域中,如图8所示。在这里插入图片描述

采样一个较长但又不是足够长的CDC脉冲
当发送时钟域向接收时钟域发送比接收时钟频率的周期稍宽脉冲,在大多数情况下,信号将被采样并通过,但是也有可能出现CDC脉冲将改变得太靠近接收时钟域的两个上升时钟沿,从而违反了第一个时钟沿的建立时间和第二个时钟沿的保持时间,无法形成预期的脉冲。这种可能的故障如图9所示。在这里插入图片描述

开环解决方案–使用同步器采样信号
解决这个问题的一种可行方案是将CDC脉冲脉冲宽度设置为超过采样时钟周期大小一段时间,如图10所示,最小脉冲宽度是接收时域时钟周期的1.5倍,假设CDC信号会被接收时钟沿采样1到2次,当相对时钟频率固定并且正确分析后,可以适用开环采样。
优点:
速度快,不需要等待ACK确认信号;
缺点:
设计需求改变,工程师可能无法分析原始的开环解决方案。可以通过在模型中添加SystemVerilog断言来最小化此问题,以检测输入脉冲是否未能超过“三个边沿”设计要求。
在这里插入图片描述
闭环解决方案–使用同步器采样信号
闭环策略是发送一个使能控制信号,将它同步到新的时钟域,然后通过另外的同步器把同步的信号传输到发送时钟域作为ACK确认信号。
优点:同步反馈信号到发送时钟域,可以安全准确的确认第一个控制信号已经被新的时钟域识别并采样到;
缺点:在允许控制信号变化之前,两个方向上的同步控制信号存在较大时延。在这里插入图片描述

跨时域传输多个信号
在时钟域之间传递多个信号时,简单的同步器不能保证数据的安全传送。在同一事务中从一个时钟域到另一个时钟域传输多个CDCbit的多时域设计过程中,工程师经常犯错误,并且容易忽略CDC位同步采样的重要性。因为同步多个信号的过程中数据之间难免存在偏(skew),即使多个信号的走线长度控制的再好,也无法避免skew问题,以及由此导致的采样失败。必须采用多位CDC策略,以避免采样到偏移的多bit值。
Multi-bit CDC 策略
为避免多位CDC偏斜采样情况,以下将多位CDC策略分为三个主要类别:
(1)多位信号合并。
尽可能将多个CDC位合并为1bit CDC信号。
(2)multi-cycle path公式。
使用同步的负载信号安全地传递多个CDC位。
(3)使用格雷码传递多个CDC位。
本节的其余部分将详细介绍这些策略中的每一个。
(1)Multi-bit signal 合并
如果可能,是否可以将多个CDC信号合成单比特之后再传输呢?如下图中所示,每个的CDCbit均采用同步器进行同步,如果控制信号的顺序和对齐很重要的话,这样能否正确的把信号传输到另外一个时钟域就是一个必须十分注意的问题了。在这里插入图片描述
从图12的例子中可以看出,接收时钟域的寄存器为了能将data写入寄存器需要按顺序的接收来自发射时钟域的load和enable信号,如果load和enable信号在同一个发射时钟沿被同时驱动,则两者之间的微小偏移skew可能会导致被同步到两个不同的时钟周期去。由于load与enable不对齐,data无法被写入寄存器。
为了解决这个问题,我们将两个控制信号合并,如图13所示,仅有一个load_enable信号驱动接收时钟域的load和enable信号,合并消除了两个控制信号到达的偏差问题。
在这里插入图片描述
两个相移顺序控制信号
如图14所示,发送时钟域的两个控制信号b_ld1和b_ld2,它们依次从发送时钟域驱动到接收时钟域,以控制流水线数据寄存器的输入使能信号。问题是在第一个时钟域中b_ld1控制信号在b_ld2信号拉高之前可能会提前无效,接收时钟的上升沿可能出现在两个制信号脉冲之间的微小间隙中,导致在接收时钟域的使能控制信号链中形成一个周期的间隙。这使得a3寄存器无法按时取到a2数据。
在这里插入图片描述
对于以上问题的解决方案是,合并控制信号并增加一个触发器。如下图15所示。
在这里插入图片描述
多个CDC信号
图16显示了在两个时钟域之间传递的两个编码控制信号。如果采样时两个编码信号略有偏斜,在接收时钟域中,可能会在一个时钟周期内生成错误的解码输出。在这里插入图片描述
(2)multi-cycle path公式
MCP公式与FIFO技术可解决多个CDC信号传输的问题。以下给出两种用于解决该问题的多周期路径公式MCP:
(a)闭环-具有反馈的MCP公式;
(b)闭环-具有ACK确认反馈的MCP公式;
还有2种FIFO策略可以用作该问题的闭环解决方案:
(c) 异步FIFO实现;
(d) 2-深度FIFO实现;
在这里插入图片描述
优点:
不需要发送时钟域来计算在时钟域之间发送脉冲的适当宽度。
缺点:
发送时钟域只要将使能信号切换到接收时钟域,以表明数据已经传输完成并准备好可以被加载。不需要使能信号返回其初始逻辑电平。

该策略无需同步即可传递多个CDC信号,同时将同步的使能信号传递至接收时钟域。在同步使能信号通过同步到达接收时钟域寄存器之前,不允许接收时钟域对多位CDC信号进行采样。

之所被称为MCP,是由于未同步数据码字直接传递到接收时钟域并保持多个接收时钟周期,且在允许未同步的数据码字改变之前,允许使能信号同步并识别到接收时钟域中。
因为在采样之前,未同步的数据会经过多个时钟周期后并保持稳定,采样值不会出现亚稳态的危险。
使用同步使能脉冲的MCP formulation
或许在时钟域之间传输同步使能信号的常用方法是触发被传递给同步脉冲发生器的使能信号,以指出可以在下一个接收时钟沿能够采到未同步的多周期数据码字。
在这里插入图片描述
这种同步使能脉冲产生的关键是输入信号的极性无关紧要。在图18中,d输入在第一个cycle时翻转为高电平,到cycle4的时候高电平以及传播经过了三个同步触发器,在cycle3中,输出q2和q3触发器的极性不同,导致同步使能脉冲在同一周期的异或门的输出端形成。相似地,在cycle7d输入翻转为低电平,到cycle10,高电平信号已经传播经过了三个同步触发器。在cycle9 q2和q3触发器的输出具有不同的极性导致使能脉冲形成在异或门的输出端。
以上讨论中均使用同步使能脉冲发生电路,若将该电路采用等效符号表示则更为高效实用,具体的等效符号如图19所示。
在这里插入图片描述除了产生任意d输入极性的脉冲之外,同步使能脉冲发生电路还有一个跟随d输入延迟3个时钟周期的q输出,q输出经常用作反馈信号,并作为确认信号ACK由发送时钟域中的另一个同步使能脉冲生成电路传输。
图20给出了典型的发送-接收触发脉冲发生器设计。
在这里插入图片描述
使用这项技,要求接收时钟域具有适当的逻辑以在检测到脉冲时捕获数据,因为该脉冲仅在每个多周期数据字的一个接收时钟周期内有效。
闭环–带有反馈的MCP formulation
使用MCP formulation时的一项重要技术是将使能信号作为确认信号传输回发送时钟域,如图21所示。
在这里插入图片描述
在图21所示的例子中,确认反馈信号b_ack产生一个确认脉冲aack,aack作为一个一位状态机(状态为READY–BUSY)的输入,当状态为READY时,指明发送时钟域的输入数据adatain可以改变数据准备输入,即一旦already信号拉高,发送方便可以自由的发送新数据和控制信号。

这是一个自动反馈路径,它假设接收时钟域对于下一个经过MCP formulation同步的数据一直是ready状态。
闭环–带有确认反馈的MCP formulation
带有确认反馈的闭环策略是指发送方和接收方均有反馈,如下图22所示,在接收时钟域bload脉冲确认数据已经接收后,才将使能信号作为确认信号反馈给发送方。
在这里插入图片描述
对于图22中的示例,接收时钟域有一个状态为WAIT-READY的FSM,用于发送有效信号(bvalid)到接收逻辑当数据在数据寄存器的输入上有效时。直到接收逻辑通过置位bload信号确认应加载数据后,才实际加载数据。在加载数据之前,不会有对发送时钟域的反馈,之后将带有自动反馈的b_ack信号与MCP formulation一样发送回去。
这个反馈路径要求在捕获数据和发送反馈之前对接收时钟域进行操作。

关于multi-bit CDC 的其他技术
以下介绍两种有趣的FIFO实现方案可用于解决多位CDC信号完整性:
(1)异步FIFO实现
(2)2-deep FIFO实现
使用异步FIFO进行Multi-bit CDC信号传输
跨时钟域传输多bit的数据或者控制信号,采用异步FIFO无疑是个好办法,异步FIFO是一块共享存储器或者寄存器缓存区,其中在发送时钟域写入数据在接收时钟域将数据读出。
一个标准的异步FIFO允许在未满的状态下,向其中写入数据,同时允许在未空的状态下,接收方将数据从其中读出。因此问题的关键是判断空满,采用格雷码计数器可以方便的实现,至于原因,详见博客:跨时域传输数据
使用1-deep/2-寄存器 FIFO同步器跨时域传输设计如下。
在这里插入图片描述
由于这个FIFO仅由两个寄存器或者2-deep的双端口RAM组成,用于检测满空标志的格雷码计数器是简单的toggle触发器,实际上只不过是1位二进制计数器。
复位后,两个指针都被清零并且FIFO为空,因此FIFO未满。我们使用倒转未满条件来表示FIFO准备好接收数据或控制字(wrdy为高)。
将数据或控制字放入FIFO(使用wput)后,
wptr切换并且FIFO变满,换句话说,
wrdy信号变低,这也禁用了切换wptr的功能,因此也禁用了将另一个字放入2寄存器FIFO的功能,直到接收时钟域逻辑将第一个字从FIFO中删除为止。
此设计特别有趣的是,wptr现在指向2寄存器FIFO中的第二个位置,
因此,当FIFO再次准备就绪时(当wrdy为高电平时),wptr已经指向下一个要写入的位置。
在FIFO的接收端复制了相同的概念。当数据或控制字写入FIFO时,
FIFO不为空。我们使用反转的非空条件表示FIFO具有准备好接收的数据或控制字(rrdy为高)。
通过使用两个寄存器来存储多位CDC值,我们能够从发送MCP公式中删除一个时钟周期,而从确认反馈路径中删除另一个时钟周期。

面向时钟的设计划分
设计划分为每个模块只允许使用一个时钟,并且均满足Timing要求,则静态时序分析对于设计中的每个时钟域而言会变得非常容易。
建议1:创建同步器模块以将信号从一个时钟域传递到另一时钟域,并且每个同步器模块仅允许一个时钟。
原因:假设任何信号从一个时钟域传递到另一个时钟域最终都会遇到建立和保持时间的问题。隔离CDC边界逻辑可以显著减少多时钟设计的设计和验证工作量。
在大多数情况下,同步器模块将是设计中唯一出现建立和保持时间故意违例的模块。在异步时钟域之间传递信号时,会发生时间违例是已知的事实,这就是为什么必须在设计中添加同步器的原因。
在这里插入图片描述
如图30所示的例子中,是一个包含3个时钟域的设计,每个时钟域分别被标注为aclk、bclk、cclk。所有的aClk设计模块都被组合成一个aClk逻辑块,b/c也是如此。 源自异步时钟域的任何信号在允许驱动另一个逻辑模块的输入之前,都要经过同步器模块。

总结
跨时域传输容易出现错误,导致设计失败。因此我们要遵循正确的跨时域传输策略以指导设计。

单比特CDC传输的建议
*发送时钟域的输出为寄存器类型以消除组合逻辑可能带来的毛刺等;
*将信号同步到接受时钟域。MCP formulation可以在必要的时候使用;

多比特DCD建议
*合并–尽可能将多个信号合并为1bit然后同步到接收时钟域;
*使用MCP formulation跨时域传输多bit数;
*使用FIFOs传输数据信号或者控制信号;
*使用格雷码计数器;

猜你喜欢

转载自blog.csdn.net/lilliana/article/details/106642667
今日推荐