时序分析是FPGA设计中永恒的话题,也是FPGA开发人员设计进阶的必由之路。慢慢来,先介绍时序分析中的一些基本概念。
时钟的时序特性主要分为抖动(Jitter)、偏移(Skew)、占空比失真(Duty Cycle Distortion)3点。对于低速设计,基本不用考虑这些特征;对于高速设计,由于时钟本身的原因造成的时序问题很普遍,因此必须关注。
时钟抖动 (clock jitter) 理想的时钟信号应该是理想的方波,但是现实中的时钟的边沿变化不可能是瞬变的,它有个从低到高 / 从高到低的变化过程,如下图所示。
常见的抖动参数有3种:
时钟抖动的原因就是噪声。时钟抖动是永远存在的,当其大到可以和时钟周期相比拟的时候,会影响到设计,这样的抖动是不可接受的。
时钟偏斜 (clock skew) 时钟信号要提供给整个电路的时序单元,所以时钟信号线非常长,并构成分布式的RC网路。它的延时与时钟线的长度、时序单元的负载电容、个数有关,所以产生所谓的时钟偏移。时钟偏移是指同一个时钟信号到达两个不同的寄存器之间的时间差值,根据差值可以分为正偏移和负偏移。
时钟偏移的计算公式:Tskew = Tclk2 - Tclk1
时钟偏移是永远存在的,当其大到一定程度会影响电路的时序。解决方法就是在FPGA的设计中让主要的时钟信号走全局时钟网络。该网络采用全铜工艺和树状结构,并设计了专用时钟缓冲和驱动网络,到所有的IO单元、CLB和块RAM的偏移非常小,可以忽略不计。
占空比失真DCD (Duty Cycle Distortion)
即时钟不对称,时钟的脉冲宽度发生了变化。DCD会吞噬大量的时序裕量,造成数字信号的失真,使过零区间偏离理想的位置。DCD通常是由信号的上升沿和下降沿之间时序不同而造成的。
信号扇入/扇出 (fan-in/fan-out) 扇出(fan-out)是定义单个逻辑门能够驱动的数字信号输入最大量的术语。大多数TTL逻辑门能够为10个其他数字门或驱动器提供信号。因而,一个典型的TTL逻辑门有10个扇出信号。
在一些数字系统中,必须有一个单一的TTL逻辑门来驱动10个以上的其他门或驱动器。这种情况下,被称为缓冲器(buf)的驱动器可以用在TTL逻辑门与它必须驱动的多重驱动器之间。这种类型的缓冲器有25至30个扇出信号。逻辑反向器(也被称为非门)在大多数数字电路中能够辅助这一功能。
模块的扇出是指模块的直属下层模块的个数。一般认为,设计得好的系统平均扇出是3或4。一个模块的扇出数过大或过小都不理想,过大比过小更严重。一般认为扇出的上限不超过7。扇出过大意味着管理模块过于复杂,需要控制和协调过多的下级。解决的办法是适当增加中间层次。一个模块的扇入是指有多少个上级模块调用它。
扇人越大,表示该模块被更多的上级模块共享。这当然是我们所希望的。但是不能为了获得高扇人而不惜代价,例如把彼此无关的功能凑在一起构成一个模块,虽然扇人数高了,但这样的模块内聚程度必然低,这是我们应避免的。设计得好的系统,上层模块有较高的扇出,下层模块有较高的扇人。其结构图像清真寺的塔,上面尖,中间宽,下面小。
时序分析起点和终点
数据输出延时 (Tco) 数据输出延时(Tco):这个时间指的是当时钟有效沿变化后,数据从输入端到输出端的最小时间间隔。
建立时间 (setup time) 建立时间(setup time)是指触发器的时钟信号上升沿到来以前,数据稳定不变的时间。输入信号应提前时钟上升沿(如上升沿有效)T 时间到达芯片,这个T就是建立时间。简而言之,时钟边沿触发前,要求数据必须存在一段时间,这就是器件需要的建立时间。如不满足建立时间,这个数据就不能被这一时钟打入触发器,只有在下一个时钟上升沿,数据才能被打入触发器。
保持时间 (hold time) 保持时间(hold time)是指触发器的时钟信号上升沿到来以后,数据稳定不变的时间。简而言之,时钟边沿触发后,数据也必须保持一段时间,以便能够稳定读取,这就是器件需要的保持时间。如果hold time 不够,数据同样不能被打入触发器。
如果不满足建立和保持时间的话,那么DFF(D type flip-flop/D类型触发器) 将不能正确地采样到数据,将会出现亚稳态(metastability )的情况。如果数据信号在时钟沿触发前后持续的时间均超过建立和保持时间,那么超过量就分别被称为建立时间裕量和保持时间裕量。
数据到达时间 (Data Arrival Time) 输入数据在有效时钟沿后到达所需要的时间。主要分为三部分:时钟到达寄存器时间(Tclk1),寄存器输出延时(Tco)和数据传输延时(Tdata)。
数据到达时间的计算公式: Data Arrival Time = Launch edge + Tclk1 +Tco + Tdata
时钟到达时间 (Clock Arrival Time) 时钟从latch边沿到达锁存寄存器时钟输入端所消耗的时间为时钟到达时间。
时钟到达时间的计算公式: Clock Arrival Time = Lacth edge + Tclk2
建立裕量 (Setup Slack) 当数据需求时间大于数据到达时间时,就说时间有余量,Slack是表示设计是否满足时序的一个称谓。
建立裕量的计算公式:
Setup slack = Data Required Time - Data Arrival Time
正的slack表示数据需求时间大于数据到达时间,满足时序(时序的余量),负的slack表示数据需求时间小于数据到达时间,不满足时序(时序的欠缺量)。
最大时钟频率 时钟最小周期:系统时钟能运行的最高频率。
最小时钟周期为数据到达时间等于数据需求时间。
时序分析
分析上图,数据传播的路径从上一级触发器到下一级触发器建立经过的数据时延总和为:Tclk1 + Tco + Tdata + Tsetup - slack + Tsu。
在两级寄存器之间,时钟间隔为:Tclk + Tclk2。
根据建立时间要求(在下一个时钟上升沿到来的时候,数据必须稳定,且保持一定的时间Tsu)可以列一个不等式:数据时延时钟间隔,即:Tclk1 + Tco + Tdata + Tsetup - slack + Tsu = Tclk + Tclk2。
同理,根据保持时间要求(时钟上升沿到来后,寄存器锁存数据的时候,数据要保持一定的稳定时间Th)可以列出:Tco + Tdata = Th。
随着系统时钟 fclk 变大时,Tclk变小,则要求 Tco + Tdata 也变小,当 Tco + Tdata 不满足第一个不等式时,不满足建立时间要求;但是,Tco + Tdata 也不是越小越好,当其太小时,不满足第二个不等式时,触发器不能正常锁存数据,即不满足保持时间要求。从某种意义上说,Th限制了数据传输速率。
对于设计者来说最大的目的是提高时序的裕量,这样即使信号完整性上出现一点问题,或者外界环境发生一定的变化,系统仍然能正常工作,这就是一个设计优良的系统应该体现出的超强的稳定性。
|