认识FPGA触发器的亚稳态
浅谈IC设计中亚稳态的问题以及信号同步电路简单实现
亚稳态与跨时钟域
高级FPGA设计技巧!多时钟域和异步信号处理解决方案
高级FPGA设计技巧!多时钟域和异步信号处理解决方案
假设器件输出在电压0-VL认为数字逻辑0,VH-VDD之间认为是数字逻辑1.当器件超过规定时间内输出电压仍在VL--VH之间时不能判定是逻辑0还是逻辑1,经过更长时间电压稳定时也不能确定稳定在0-VL还是VH-VDD。我们称之为亚稳态。
本段摘自亚稳态与跨时钟域--冯旭
为什么要满足建立时间和保持时间的要求?因为虽然说数字电路中只有1和0,但实际上电路在从1到0和从0到1变化时是不可能瞬间完成的,是有一个变化的过程的(性能越好的器件这个变化的时间越短,但不可能完全没有)。
在时钟变化的这段时间里,寄存器将对数据进行锁存。如果数据在这段时间内发生了变化,对于寄存器来说也就无法识别应该锁存哪个数据,到底是变化前的还是变化后的,寄存器的输出也将变得无法预测。因此,数据在建立时间和保持时间内必须保持稳定不变。
从更加宏观的设计角度来看,异步逻辑是亚稳态出现的重要原因。
在正常的同步电路中,亚稳态出现的可能性很小,除非时钟的设计有很大问题(比如时钟延迟、时钟抖动、时钟偏斜很严重)。在设计过程中designer会通过sdc等约束保证同步电路的时序收敛。而异步逻辑则很容易出现亚稳态,异步逻辑没有统一的时钟,也无法通过sdc约束和工具检查 完全发现异步逻辑的时序问题。没有统一的时钟也就意味着控制信号随时可能发生变化,想要满足建立时间和保持时间的约束当然也就变的十分困难。
亚稳态的出现归根到底就是因为建立时间和保持时间不满足要求。
原因见1.2节,同步电路肯定要保证在正常工作频率/电压/温度/工艺下是没有亚稳态的。异步电路是无法保证一定没有亚稳态,但designer识别风险并保证亚稳态概率降到可控范围内。
首先必须是+1或者-1,才能保证两次改变只有1bit变化
a.格雷码没有毛刺,不会引入额外的亚稳态
b.如果地址同步错误(仅限+1/-1同步错误,突然读和写都连续进行,导致地址变化过快,同步可能错误太多会出现mem空或者满,这种情况只能靠其他rtl设计保证)功能上虚空虚满不会造成逻辑错误。
当src clk和des clk完全异步关系,时钟没有任何频率与相位的关系时,Physical Design也无法通过sdc等约束来保证setup/hold的满足。所以只能通过多级寄存器级联降低亚稳态,rtl design通过设计保证跨时钟域的信号传输正确性。cdc会找到所有这些寄存器,后端替换使用专用的cell来改善亚稳态
最大的危害就是亚稳态的传播,如果发生亚稳态输出负载了很多组合逻辑,这些组合逻辑又输入到不同的寄存器,就会极其容易导致这些寄存器也进入亚稳态,然后继续传播。最终能够导致整个系统崩溃(范围太大,rtl设计也无法保证错误被纠正或被放弃)
亚稳态可能会导致cell的输出值错误,但这个错误如果不传播问题不大,也可以通过设计放弃或纠正错误值。2级或更多级的寄存器级联同步器的第一级寄存器就很可能输出错误的值,但是多级级联增加了亚稳态的稳定时间使最后一级寄存器进入亚稳态的概率极大的降低(可以达到几十年上百年一次),就相当于降低亚稳态的概率和传播。
并不能完全消除亚稳态及其传播,只能降低到可接受的范围之内。
两级触发器可防止亚稳态传播的原理:假设第一级触发器的输入不满足其建立保持时间,它在第一个脉冲沿到来后输出的数据就为亚稳态,那么在下一个脉冲沿到来之前,其输出的亚稳态数据在一段恢复时间后必须稳定下来,而且稳定的数据必须满足第二级触发器的建立时间,如果都满足了,在下一个脉冲沿到来时,第二级触发器将不会出现亚稳态,因为其输入端的数据满足其建立保持时间。同步器有效的条件:第一级触发器进入亚稳态后的恢复时间 + 第二级触发器的建立时间 < = 时钟周期。
假设每一级寄存器输出在下一级寄存器capture时间还没有稳定的概率为p,那么多加n级寄存器最后一级输出亚稳态的概率就是p的n次方,所以大大降低了亚稳态的传播
不一定。不满足建立保持时间寄存器不知道capture logic ‘0’ 还是logic ‘1’,输出最终稳定值可能不确定,但寄存器可能会在规定的时间内输出稳定。
不是不能,而是由于经过了组合逻辑和走线的延时,亚稳态传播到目的寄存器的时间增大很多。本来可能在到达下一级寄存器的时候满足下一级的setup/hold时间,结果又不能满足setup。这种情况下,只有在很低速的时钟频率时,第二拍触发器才可以避免亚稳态。因此是不正确的处理方法。也就是说同步器两级触发器之间不要添加任何逻辑,这样可以使得信号获得尽可能长的时间来回到稳定状态。否则还有经过组合逻辑的时间。
组合逻辑还会产生glitch,导致增加亚稳态的几率
通过组合逻辑信号沿可能变差
原因和问题6一致。
不是不能,比如说准静态信号 经常是可以这么做的。就APB配置信号 可以这么做。
但是大多情况下 由于多bit之间的走线延时不一样(假设中间没有组合逻辑),到达destination clk domain 寄存器的D端时间不一样 ,导致被采样时间有的早一拍,有的晚一拍,输出Q端就永远无法得到想要的数据。同时由于bit位宽增加,亚稳态的概率也增加了。所以要加握手信号或者经过fifo。
对于一位同步器 或者用多个一位同步器同步多bit数据 本身即使降低了亚稳态的传播,并不能保证数据的正确性。应用在静态或准静态数据好使,其他情况要添加握手机制。
可参考本人另一篇转载文章https://blog.csdn.net/cy413026/article/details/103141979
相关信号在跨越时钟边界后失去相关。这个问题是最不直观的。这将导致非常不确定的行为,如数据丢失,算术结果破坏。
这类不直观的问题在可视化的检查中很难被发现,特别是用RTL电路形式,在设计审查是经常被忽视。必须将严格的设计规则和有效的自动分析用于这类问题。
在广泛的相关信号中,可能产生相关性丢失的几种不同方式,包括:
无论何时一个信号进入亚稳态,可以使用同步器确定它的值,但是在接收时钟域不能保证在信号有效之前的精确周期数。因此,任何一个多位信号,每位有独立的时钟同步,每位在到达接收时钟域时,相对其它位将产生倾斜。
即使亚稳定不发生,任何成对数据位信号在到达相应的同步器之前,通过不同的线路或者电特性使两个信号产生不同的延时,都可能丢失同步。
可能一个同步器采样输入信号,并且在另一个同步器捕获信号变化之前,先捕获信号的变化,这样,两个信号将在一个时钟周期内倾斜,并且不再相关。
和亚稳态一样,最怕glitch在组合逻辑中大面积传播。
对于启动信号、控制信号、握手信号,触发器的清零信号(CLEAR)、预置信号 (PRESET)、时钟输入信号(CLK)或锁存器的输入信号/异步电路就会产生逻辑错误。任何一点毛刺都可能使系统出错。非常敏感。
D触发器是对毛刺不敏感的,毛刺如果要通过D触发器到达Q端,就需要在时钟跳变沿产生,且满足setup/hold时间。概率要小很多,通常是不能满足的。
参考本人另一篇文章GlitchFree的时钟切换技术
在时钟电路中,引起错误 驱动寄存器工作,或则毛刺时钟时序不好引起亚稳态。
在复位电路中也是会导致系统错误的复位,或者不满足remove/recovery时间,导致复位亚稳态。
异步电路最怕glitch引起亚稳态,所以同步电路过程的寄存器之间不要有组合逻辑,以免引入glitch导致额外的亚稳态。
利用冗余项消除毛刺,采用格雷码,采样法,吸收法,延迟办法,具体可参考
FPGA中竞争冒险问题的研究
组合逻辑电路的分析与设计
Race_condition