转自 http://blog.sina.com.cn/s/blog_70c1137b01012hlx.html
幸运的是,这些问题难以定位但容易在设计中避免,只需我们在设计中稍加关注即可避免。任何一个成熟的团队都应该有自己的“checklist”。最近的一次检视中,发现一个设计可能同时受亚稳态和毛刺影响。那个有4年经验的工程师漫不经心的说“如果完全照教科书做,的确应该像你说的那样”。与遵守规则同样重要的是对规则的理解。
1亚稳态
1.1亚稳态的定义
亚 稳态是指触发器无法在某个规定时间段内达到一个确定的状态。当一个触发器进入亚稳态时,该触发器的输出何时能稳定以及会稳定在哪个状态都不能确定。在达到 稳定之前的时间,触发器输出一些中间电平或者处于震荡状态,并且这种无用的输出电平可以沿着信号通路上级联的触发器传播下去。
1.2亚稳态的产生机制
如果触发器的setup time、hold time不满足,就可能产生亚稳态,此时触发器的输出端Q在有效时钟沿之后比较长的一段时间处于不确定的状态,这段时间称为决断时间(resolution time)。经过resolution time之后Q端将稳定到0或者1,但究竟是0还是1和输入没有关系。
图1是一个处于亚稳态的寄存器的输出的例子。
1.3亚稳态的危害与避免
亚稳态会导致逻辑误判,如果发生亚稳态的部位对系统的稳定至关重要同时缺少防错机制,则可能导致系统崩溃(逻辑挂死)。
逻辑误判可以通过特殊设计减轻危害,例如异步fifo的gray设计。比发生部位本身的逻辑误判更严重的是亚稳态传递。亚稳态传递会扩大故障面,让问题变得复杂。
在完全同步的设计中,CAD工具可以方便的分析每一个触发器的建立保持时间。理论上一个时序完全收敛的纯同步设计不会有亚稳态问题。和有赖于时序分析的完备性,例如所使用的timing mode与实际芯片及其工作条件的吻合度,实际时钟抖动、偏斜与预期是否一致等。扩大时序裕量可以降低亚稳态发生的概率。
当前一个数字芯片上往往有多个时钟域,时钟域之间的异步设计是必不可少的。只要系统中存在异步设计,则亚稳态无法避免,但我们可以尽量限制亚稳态的影响范围并通过特殊的逻辑设计容忍可能的逻辑误判。
1.3.1缩小亚稳态的影响范围
a.“将异步输出寄存器的扇出限制为1”
如图2所示,让异步输出寄存器的扇出为1相当于减少了异步路径的条数。
若异步信号有多个输出,则可能因为路径延迟和时钟偏斜导致有的寄存器采到有效值,有的寄存器进入不确定的状态,如图2和图3所示。
b.“异步信号参与逻辑运算前先同步两拍”
如图2所示,异步信号直接参与逻辑运算可能会导致亚稳态传递,而先将其用2级寄存器同步则基本可以把亚稳态限制在这2级寄存器内。经过两级触发器同步,在右边的输出将是同步的,而且该输出基本不存在亚稳态。其原理是即使第一个触发器的输出端存在亚稳态,经过一个CLK周期后,第二个触发器D端的电平仍未稳定的概率非常小,因此第二个触发器Q端基本不会产生亚稳态。值得注意的是,这会大大降低亚稳态的发生概率但是并不是说一定不会出现,如果是关键信号,在接下来的设计中采用防错设计依然是必要的。
1.3.2 通过设计容忍逻辑误判
通过设计容忍逻辑误判的典型例子是异步fifo的gray设计。Fifo中ram的读写地址是0、1、2…连续的,而相邻二进制数的格雷码只相差1bit。也就是,对读写地址来说,任何一个时钟沿只有一个bit跳变,而且这1bit出现暂时的逻辑误判无关紧要。
图4是常用的将总线数据传递到异步时钟域的例子。
只要系统中有异步元件,亚稳态就是无法避免的,因此设计的电路首先要减少亚稳态导致错误的发生,其次要使系统对产生的错误不敏感。前者要用同步电路来实现,而后者根据不同的设计应用有不同的处理办法。
如何防止亚稳态?
1 降低系统时钟频率,不能改变亚稳态发生概率,但是能较少亚稳态传到后一级,较少 了系统运行错误的概率。
2 用反应更快的FF
3 引入同步机制,防止亚稳态传播(可以采用前面说的加两级触发器)。
4 改善时钟质量,用边沿变化快速的时钟信号
2.2毛刺的产生机制
组合逻辑的多个输入端到达某一汇合点的时间有先后,导致组合逻辑电路的输出出现瞬间错误。图5是一个动态冒险的例子,即使假设线延迟为0,毛刺依然存在。关于动态冒险和静态冒险本文不作详细解析。
1.3针对毛刺的设计
与亚稳态不同,在我们的设计中,毛刺几乎是无法避免的。不过有一点相同的是,在一个纯同步的设计中,毛刺不会带来问题。
文章评论(0条评论)
登录后参与讨论