我们先来探讨fan-out与ground bounce的关系。一般上,我们知道fan-out不能过多,不然会造成不良后果。至于是什么不良后果,一般的解释对初学者来说都不是很明确,甚至有点模糊。我们就从fan-out开始做解释。当一个module的fan-out越大,举例(n MB x 1) Vs (m MB x 8)的记忆体来说,chip的用量也相对减少,因此耗电量也较小。然而,fan-out越大,也代表着同时操作的output pin也随着增大。在数字设计里,每个output pin对0的驱动就是通过自身的GND pin来做current sink。我们知道每个pin都有相应的电感值,而自感就是因应于电流所产生的。因为V=L(di/dt),所以当fan-out增大,(di/dt)也随着增大;当频率变得越高,(di/dt)也变得更大了。因自感而引起的电压差(V)就造成所谓的ground-bounce。对逻辑0来说,它的区分值是0 - 0.4V左右,因此它的noise margin也比逻辑1来得小。因此,因自感而引起的ground-bouce效应是非常被重视的。至于如何能在fan-out的数量与ground-bounce的控制之间取得平衡点,对于一个数字系统设计师来说,这是不可漠视的。
至于VCC bounce,这则是transcient current所引起的。何谓transcient current?就是逻辑1与逻辑0的转换瞬间,电流从VCC通过Q1与Q2直接传入GND,所引起的瞬间电流增大值。Q1与Q2就是控制逻辑1与逻辑0输出的switching transistor;当输出为逻辑1,Q1为ON,Q2为OFF;当输出为逻辑0,Q1为OFF,Q2为ON。我们知道每个pin都存在相应的电感值,而这瞬间的transcient current就是造成V(di/dt)忽然增高的主要原因,这就是所谓的VCC bounce。一般上,在高速设计里,VCC bounce所造成的负面影响不比ground bounce那般严重,然而它对信号完整性设计的影响是不容忽视的。或许有人会问,为什么VCC bounce会对高速设计有较微的负面影响呢?原因很简单,就是逻辑1的noise margin比起逻辑0来得高,因此对信号的bouncing值有较大的宽容性。我们所熟悉的decoupling capacitor就是针对于transcient current所做的解决方案。好了,现在transcient current解决了,然而,在逻辑芯片数量较多的数字系统里,为数不小的transcient current相加起来对电源又会造成什么程度的影响呢?这我就留在下一篇文章再详细叙述了。对有兴趣深入研究的朋友,我在这里先给个提示,就是你们留意电源输出是不是有一个480uF - 2200uF的capacitor是直接连去GND的。
在一般情况下,ground bounce对逻辑的影响会比vcc bounce来得大,这是因为个别noise margin的不同而造成的。还有,所谓的逻辑影响不是单纯的逻辑错误那么简单,在某些个别情况,逻辑电平往往进入无法分辨为1或0的情况,这跟metastability的情形有点类似,然而,其分别在于metastability是随着clock cycle以触发沿为界限而恢复逻辑电平,而ground bounce所造成的情况则是有点"asynchronous"的意味。不论如何,这两种情况都对逻辑,尤其是组合逻辑设计造成一定的影响。
之前,我们只考虑了基于电感特性所造成的bouncing情况。然而,在实际上还有几点比如电容特性也是在高速设计里需要有所留意的。我们知道,在基于对传输线特性的考究,每个芯片的管脚除了带有电感值之外,还带有电容值。因为布线的差距,所以每个管脚都有不同的电感与电容值。然而,最短的传输线都是比其他较长的拥有较低的电感与电容值的,而这所谓最短的传输线,通常就是处于芯片中心两旁的管脚。因此,我们一般上都会看到高速数字芯片的VCC和GND都是在芯片中心处的两旁,而一般低速数字芯片的VCC和GND就处于芯片的对角线,这是很不利于高速数字系统设计的。除此之外,我们之前所提到的关于fan-out的数量不能太多,不然会造成ground bounce,那只是基于对电感的考虑;如果再加入对电容的考虑,那就是造成额外delay time的原因。要知道,fan-out的数量越大,就代表电容并联的数量越多,因此整体的电容有效值也跟着增大。一般上,我们考虑每100 pF会造成3 ns的delay,不过,不同的制造技术会令这数值有所改变。对于搞fpga设计的人来说,在做static timing分析的时候,都会留意到fan-out数量较多的地方,因应的delay time也会较大,这就是造成这现象的原因。对于这现象的解决方案是:在基于电路板的系统上,除了考虑合适的布线,在适当的地方加上适当数量的buffer可以有效的减低电容值;在基于fpga的系统上,除了尽量减低与平均分布fan-out的数量之外,得考虑在synthesis时加上logic duplication。
地弹效应是因由电感而产生的,电容所造成的主要效应是延时。地弹效应的发生是源于Simultaneously Switching Outputs (SSO)对管脚电感的瞬间变化所引起的。一般上,不同的芯片都有提供对于每个VCC与GND组最大SSO的参考数字,只要在做设计时确定不高于SSO,而在设计板子时也谨守高速设计的规则,都不会造成太大的问题。在fpga设计上,除了谨慎留意fan-out的数量外,在设定 i/o slew rate 的时候也不能盲目的把 slow 都设定成 fast,须知这会增加 di/dt,地弹效应也相应增加了。除此之外,需知fast i/o slew rate对pure resistive load不会有太大的改进,其主要用处是减低capacitive load (电容性负载) 所造成的延时效应。最后,还是老生常谈,紧记电感是因由电流产生的,电容是因由电压产生的。
在高速设计的领域里,对电气的物理特性有充分了解是很大程度必须要掌握的。有时在设计上面对问题,不能只单纯的从传统调试方式去解决问题。比方说,如果一个多路数字音频传输设计不断面临噪音的问题,症结不一定就出自接地不完好这一论点上。如果仿真和测试都没有找出什么问题,就应该往其他方面的可能性去寻求出路,比如想想是不是coupling出了什么问题。一般上,如果AC coupling的电容值和传输信号的run-length不协调,往往这就是问题所在,而不关系乎于接地不良好,而导致噪音不被GND过滤这一惯性的想法。当然,如果有TDR作为调试条件的,那又另当别论。作为后话,如果调试条件不是很充足的话,比如只有osicilloscope和logic analyzer,在调试过程里的尽量发挥想象力,不能苟泥于惯性的想法。如果有spectrum analyzer和测试eye-diagram的条件,就得充分了解和利用调试工具去解决问题。在很多情况里,基于deterministic jitter和random jitter就可以探讨出很多常被忽略可又足以致命的问题来。