我们来分析下这个毛刺。由于2MHz输入信号local_2m和50MHz时钟clk_50m是异步的,因此毫无疑问会有亚稳态的出现。当亚稳态出现的时候,触发器的输出一开始随机震荡到高电平,但很快亚稳态结束,并返回到”错误的”低电平状态。于是就表现为毛刺。如果想从门
电路角度解释为什么会出现毛刺,可以参考文献[5].
在测试中,每大约一小时,clk2m_ob就会出现一次这样的毛刺。可以看出亚稳态的捕捉窗口是非常小的。这个实验中大约发生了 60 minutes * 60 seconds/20nS = 180*10^9次采样。因此捕捉窗口的大致范围为20nS * (2/25) / (180*10^9) ~= 9 *10^(-12) s = 9 fs. 这么高的精度,没有任何仪器可以精确模拟,这也是为什么亚稳态现象只能用统计的方法去研究的原因。
另一方面,同样的电路功能,clk2m_oa却从来没有出现过这样的毛刺。这说明亚稳态掉表现形式不是固定的。猜测clk2m_oa的亚稳态表现为中间电平的形式,并最终返回到”正确”的状态。由于tR时间非常短,并且亚稳态和信号的边沿混和在一起,无法和正常情况进行区分。根据XAPP094的解释,亚稳态的表现是和器件的PVT(制作工艺Process,电压Voltage,温度Temperature)相关的,并且和具体电路的增益,噪声相关。如果是这样,clk2m_oa和clk2m_ob的各自触发器的或增益或噪声是有差异的,所以表现不一致。
3. 亚稳态返回到哪一个稳定态是不可预测的,而且和输入数据无关。
亚稳态返回到哪一个稳定态是不可预测的,和输入数据无关。因此假设亚稳态较快的返回,目的寄存器(destination FF)能够采样到稳态电平,也可能采样到错误的电平,导致系统功能错误。
亚稳态的危害
目前主流的FPGA都是基于同步设计思想。一个良好的子模块设计都是同步于同一个时钟的子系统。当不同时钟域的多个模块进行
通信时,就可能会发生亚稳态。
另外,同一个时钟域内,如果时序不满足,比如由于组合逻辑和走线的延时过大,导致源寄存器的跳变到达目的寄存器的时刻刚好位于时钟的跳变沿,也会发生亚稳态。当然,在同步模块中,对于一个时序收敛良好的设计,不会存在亚稳态的情况。
1. 理论上讲,如果亚稳态不能够在一个时钟周期内返回到稳定态,那么目的寄存器也会发生亚稳态。这就是亚稳态的传播。
2. 亚稳态的毛刺直接输出,有可能导致系统错误。比如毛刺信号送给CPU做中断,可能导致CPU产生错误的中断响应。
3. 采样到错误的电平,导致功能错误。这是逻辑设计人员最容易遇到的问题。最典型的例子是,假设有一个4bits one-hot编码的状态机。正常的功能只有四个状态0,2,4,8。但是这个状态机的有多个异步输入信号,那么就会发生亚稳态。我们知道,亚稳态返回到1或者0是随机的,这样就会出现状态机的输入有非法的组合,导致状态机进入到非法状态{1,3,5,6,7,9,10….}。如果状态机没有安全编码保护,状态机就会挂死在非法状态。
4. 破坏Block RAM的内容。在读取RAM时,如果生成读地址的时钟和RAM的读时钟是异步的,那么读取也会破坏RAM的内容。基本上是因为读RAM会伴随一个自动的回写动作,这是大多数CMOS FPGA的特性。回写的时候,由于在地址上发生了亚稳态,导致某一个地址的内容回写到了另外的地址上,从而破坏了RAM的内容。
亚稳态的处理
理论上讲,异步信号输入到一个同步系统,亚稳态是不可避免的。现实问题是如何降低亚稳态带来的危害,如何降低亚稳态发生的概率。
亚稳态最终会返回到稳定态,因此只要等足够的时间,就可以免受亚稳态的危害。亚稳态返回的时间tR(resolution time)是个很复杂的问题,取决于系统的MTBF要求和器件本身。总的来是很短的。对于90nm或者更小的工艺,在可以接受的MTBF如10年内,tR大约在1nS左右;MTBF如1000年内,tR大约在2nS左右,具体可以咨询响应的FPGA制造商。
1. 降低亚稳态发生的概率。
经典的处理方法是多拍同步。参见图5的Correct Method.
异步信号经过第一个寄存器,如果发生了亚稳态,2nS(假设MTBF=1000Y)左右返回到稳定态,如果时钟周期大于2ns(时钟频率小于500MHz), 那么显然第二个寄存器就没有亚稳态发生了。此时亚稳态的唯一影响就是不能在最准确的时刻识别到异步信号,有可能早一拍,或者晚一拍识别。
多说一点,为了处理亚稳态,识别异步信号需要的时间就较长(2拍或者更多),这就是目前流行的同步设计的代价。异步设计较好的解决了这个问题,异步设计靠硬件握
手机制来反馈什么时候识别成功。有兴趣的朋友可以了解一下一个新兴的FPGA公司Achronix。
作为对比,我们看看图5中的wrong method. 第一拍触发器在接收异步信号后,产生了亚稳态。由于经过了组合逻辑和走线的延时,亚稳态传播到目的寄存器的时间增大很多。这种情况下,只有在很低速的时钟频率时,第二拍触发器才可以避免亚稳态。因此是不正确的处理方法。
2. 降低亚稳态带来的危害。
一个良好的设计必须有好的容错能力,让设计对亚稳态不敏感。如果亚稳态出现,至少要有能力恢复。
1. 状态机如果有异步信号输入,一定要多拍处理异步信号,并且使用安全状态机,任何情况下不可以让状态机挂死在非法状态。
2. 异步接口不可能做到准确地定时,在预算精度时,必须容忍+/-1拍的延时。
3. 异步FIFO两个时钟域的地址交互时,使用格雷码计数器并多拍处理, 可减低对亚稳态的敏感.
4. 能用低的频率实现的功能,不要用高的频率。频域较高时,要用三拍或者更多的触发器来降低亚稳态的危害。
5. 较陡的信号边沿(包括数据和时钟)有利于降低发生亚稳态的概率。