前言

本文摘自于:《FPGA之道》。

外部接口相关时序分析

外部接口的情况纷繁复杂,因此外部接口的时序分析往往需要根据具体情况来具体对待,并且外部接口在默认的情况下是不具有完整逻辑锥结构的,因此,通常相关的时序分析工作均需要人工干预完成(搭建逻辑锥)。例如同步输入或输出接口就可以通过虚拟寄存器的方法来补全逻辑锥,从而进行时序分析,因此本章节就来讨论一些常见的外部接口相关的时序分析应对情况。

功能仿真对接口分析的帮助

针对于接口的一些时序要求,有时候往往是单靠时序工具所分析不了的,因为基于逻辑锥的分析思路丝毫不关心功能,当碰到诸如“在接收到A端口的高脉冲后,经过至少T0时间后,在B端口输出持续时间至少为T1的高脉冲,并在该脉冲结束后的T2时间之内,从C端口输出以不小于T2时间为间隔的3个高脉冲信号,并在其中最后一个脉冲信号结束后的T3时间之后、T4时间之前,从B端口再次输出一个持续时间至少为T1的高脉冲……”这样的接口时序需求时,时序分析工具往往都无能为力。事实上,类似这样的接口时序需求往往不在少数,因为复杂一点的接口往往都跟功能具有很强的相关性,例如,下图就是一个关于EEPORM芯片的编程时序:
FPGA之道(79)静态时序分析(五)外部接口的相关时序分析_其他
每当这个时候,功能仿真的结果往往就成为了时序分析时非常好的帮手,因为功能仿真给出的波形结果就是不考虑各项时间延迟的理想情况,此时,我们再辅以通过时序分析工具所得出的一些时间延迟参数,就可以调整得到考虑实际延迟情况的波形结果,然后据此便可得出时序是否得到满足的结论。
例如,某输出接口的时序需求为A端口、B端口先后发出一个高脉冲,两个脉冲的间隔不得大于200ns,脉冲高电平持续时间不得小于20ns。那么,若A、B端口的输出实际上都是由频率为100MHz的clk信号驱动的,并且其相关的功能仿真波形如下所示:
FPGA之道(79)静态时序分析(五)外部接口的相关时序分析_寄存器_02
可见,在理想情况下,A、B端口输出的高脉冲持续时间均为30ns,A、B高脉冲之间的间隔为100ns。由于延迟并不会造成单根数据线上波形形状的畸变,所以A、B端口上高脉冲的持续时间肯定满足要求,接下来就需要考虑实际延迟对A、B端口发出高脉冲的间隔的影响了。假设,clk信号到达产生A、B端口信号触发器的skew分别为2ns、3ns,对应触发器的输出到A、B端口的时间延迟分别为7ns、9ns。那么,若以clk为基准,clk任一个时钟上升沿为参考,A端口的输出要比其在功能仿真波形上实际晚9ns(2+7),B端口则要晚12ns(3+9),则A、B两个端口发出高脉冲的间隔实际应为103ns(100-9+12),也满足需求。

纯输入接口

纯输入接口关心的是你能否正确接收别人的输出。

纯时钟输入接口

纯时钟输入接口指的是仅将外部时钟信号导入FPGA芯片的接口,即外部电路或芯片输出时钟信号,而FPGA芯片接收该时钟信号。虽然我们对于输入的时钟也应该有各项时间指标要求,但这往往都是对外部时钟源的要求,不是FPGA芯片本身能够控制的,所以我们不会针对纯时钟输入接口进行时序分析。不过,这类接口往往是FPGA内部逻辑进行时序分析的基础,所以通常需要将其本身的各项时间指标尽量精准的告诉时序分析工具。

纯同步输入接口

纯同步输入接口,指的就是外部设备在输出数据的同时也输出用于采集该数据的时钟信号。那么对于FPGA来说,处理该类输入接口的方法通常是采用输入的时钟去采集相应的输入数据即可,如下图所示:
FPGA之道(79)静态时序分析(五)外部接口的相关时序分析_时序分析_03
对于目前的时序分析工具来说,我们往往只需要指明数据端口处每个采样点的稳定周期及其与时钟端口处时钟信号的相对位置(通常相对于某个边沿来指定,例如D稳定周期100ns,开始稳定时刻提前clk上升沿60ns),时序分析工具便可以自动完成时序分析。到此为止,纯同步输入接口的时序分析就完成了,但是这里有两点需要特别注意:
第一点,对纯同步输入接口进行时序分析看似容易,但其背后所隐藏的道理却不简单。首先,该怎么虚拟寄存器就是一个难题。为什么这么说呢?因为要想让逻辑锥覆盖到所有的输入路径,必须虚拟一组生成寄存器,对应的电路原理图应该类似如下:
FPGA之道(79)静态时序分析(五)外部接口的相关时序分析_其他_04
对于实际电路来说,当D的位宽较大时,由于不同寄存器的输出有先有后,虽然D的每一个比特的稳定周期应该等于时钟周期,但整个数据D的稳定周期往往是小于时钟周期的。例如,对于一个位宽为3比特的数据D来说,如果在某一个时钟上升沿,其输出应该从0(“000”)变为7(“111”),然后下一个时钟上升沿再变回到0,那么其实对于每一个比特来说,均应该会有一个周期的时间稳定在电平1,不过由于时钟skew以及路径延迟的原因,就会导致最终输出的D如下图所示:
FPGA之道(79)静态时序分析(五)外部接口的相关时序分析_寄存器_05
可见,D数据中各个比特的最大、最小延迟相差多少,D数据的稳定时间就会比一个时钟周期减少多少,而且稳定开始取决于最大延迟路径,稳定结束取决于最小延迟路径。
鉴于此,外部芯片手册中所提供的该接口中数据D的稳定周期往往也是要小于时钟clk的周期的。因此,如果使用虚拟寄存器的方法,即便我们一切从简,令这些虚拟寄存器的时钟skew全部为0,那么为了能够真实还原输入端口处D和clk之间的关系,我们必须反推出一个最大tco和一个最小tco来。
现在问题来了!最大tco、最小tco好求,但该怎么为所有的虚拟寄存器分配tco值呢?要知道,D数据中的每一位所对应的FPGA内部触发器的时钟skew、路径延迟都是不一样的,所以不同的分配原则绝对会造成不同的时序分析结果。例如,仍参考上图,就算采集D[0]~D[3]的触发器的skew均为0,如果D[1]的路径延迟最大、D[0]的路径延迟最小,则对于内部采样寄存器组来说,D稳定的周期更短了,相对于clk的建立、保持时间也更小了;但如果我们令D[1]的tco最小、D[0]的tco最大,则相对于内部采样寄存器组来说D稳定的周期及相对于clk的建立、保持时间很可能会得到改善(当然,也可能更差,因为物极必反嘛)。由此可见,如果我们只知道D与clk的关系,并不能得出虚拟寄存器组tco的唯一解,而不同的tco解集所对应的时序分析结果又不尽相同,那到底该怎么办呢?
考虑到建立时间余量只关心D的最大延迟、保持时间余量只关心D的最小延迟,所以我们可以先令所有虚拟寄存器的tco均为最大tco,然后进行时序分析,并忽视时序报告中关于保持时间的结论;然后再令所有虚拟寄存器的tco均为最小tco,然后再次进行时序分析,并忽视时序报告中关于建立时间的结论。最后,结合这两次时序分析中的有效结果,便可得到关于该同步输入接口最终的时序分析结果。
不过仔细想想就会发现,上述两次逻辑锥在求解时,虽然每次虚拟寄存器组的tco取值不同,但所有虚拟寄存器的tco都是一致的。既然这样,tco完全成为了一个群延迟参数,并且对于每条路径来说,它只不过是累加时的一个初值而已。既然如此,我们完全没有必要求解两次逻辑锥,只需要令所有寄存器的tco也均为0,进行一次求解,然后对分析结果进行简单的tco修正即可。例如,此时时序分析工具给出FPGA内部寄存器在采样时,D相对于clk信号的建立时间为100ns、保持时间为-5ns,若反推出的最大、最小tco分别为30ns、20ns,则内部寄存器在采样时D相对于clk信号的实际建立时间为70ns(100-30)、保持时间为15ns(-5+20)。
由于D的位宽通常来说不是1比特的,并且相应芯片手册中往往也都只会给出整个D数据的稳定期以及和clk之间的关系(并不会逐比特给出),所以当你直接为时序分析工具指明了D的稳定周期以及其与clk之间的关系后,时序分析工具往往都会采用虚拟寄存器加tco修正的方式来进行时序分析求解。当然,如果相应芯片手册能够给出关于D数据中每个比特相对于clk之间的关系(每个比特的持续周期通常应该等于时钟周期,即便是clk中有jitter,此处也该这么认为,因为jitter会在稍微靠后一些的时钟信号分析阶段被考虑到),又或者是D数据的稳定周期可以被近似认为等于clk的时钟周期,那么对应的虚拟寄存器组tco的解便唯一了,此时就只需要虚拟寄存器便可得到该同步输入接口的时序分析结果。

第二点,在上述求解过程中,我们显然忽略了一个问题,那就是将外部器件和FPGA芯片连接起来的多根用于传输并行D数据和clk时钟信号的电路板布线也是具有延迟的,因此时序分析工具针对外部接口给出的分析结果往往都是一种近似值,而这种近似的好坏,则取决于电路板板级布局、布线的质量。事实上,当数据信号的采样率不是特别高的情况下,板级布线延迟的时间的确是可以忽略的,因为电信号1ns可以传播大概20cm这么长的距离,而电路板上的数据线往往都不会有这么长,所以低频时,板级布线误差对数据和时钟的相对位置关系影响是很小的。而对于高采样率的数据传输时,器件手册都会注明要求将多根板级布线的长度误差控制在10个mil之内(也就是0.254毫米之内),可见此时群延迟虽然不可忽略,但其对所有数据、时钟线都几乎是一样的(误差在皮秒甚至飞秒级别)。综上所述,我们在时序分析的时候通常不去考虑板级布线带来的误差。

纯异步输入接口

纯异步输入接口,指得是仅将外部数据信号导入FPGA芯片的接口,因此,为了接收该数据,FPGA芯片只能使用一个异步的时钟,通过一些变通的方法来实现数据可靠的采集,例如,通用异步串口接收端这样的逻辑设计就是纯异步输入接口的一个最典型的例子。对于这类接口,往往都会在功能上来保证接收的正确性,所以通常不需要进行时序分析。

同步输入异步采集

有时候,当同步输入接口的速率过慢、速率可变或者时钟不连续的时候,FPGA内部可能会采用纯异步的方式来同时对待输入时钟和数据,即把数据和时钟信号都当做数据,用过采样的方式去采集两者,根据模式分析等方法找到时钟信号敏感边沿的位置,并据此去获得一次有效的数据信号采样。其接口示例电路如下图所示:
FPGA之道(79)静态时序分析(五)外部接口的相关时序分析_寄存器_06
这样做的好处是保证了FPGA内部逻辑整体都工作在一个确定的时钟信号下。此时,你可能觉得我们已经从功能上面考虑到了采集正确性的问题,所以也想当然的认为此处可以省略时序分析步骤,但事实并非如此。
与纯异步输入接口不同,此时我们只能从功能上面确保clk信号的采样正确性,却没有办法从功能上面确保D信号的采样正确性。原因很简单,clk信号的波形模式是可以预知的,因为无论一个时钟信号是持续不断的、间歇性的、还是频率可变的等等,只要检测到0至1(或1至0)的突变,就表示检测到了上升沿(或下降沿)。但D信号到底应该是一个什么样子我们并不清楚。也许你会问,那纯异步接口是怎么保证正确接收数据的呢?原因很简单,由于纯异步接口没有时钟信号,因此外部设备在发送数据的时候就考虑到了这点,因此通常会对待发送数据进行编码、插入前导码、尾码等方式,以确保接收端在采集信号的时候有规律可循。可是对于同步输入接口来说,由于发送方已经提供了采样数据所需的时钟信息,所以它也就没有必要浪费精力来对D数据进行特殊处理了。也许你觉得可以通过持续过采样并监测D信号来找出其稳定期,并以此确定何时正确采样,那么还是有几个问题无法解决:一、如果D端口始终发送同一个数据呢?这样你将找不到数据边界;二、D上数据的采样率并不一定是恒定的,因此你即便能够找到了当前边界,也无法预测下一个边界;三、由于各类延迟,FPGA芯片在采集clk信号与D信号时肯定会有时间偏差,那么你怎么确定当前模式匹配成功的clk有效边沿应该采样连续几段稳定D信号中的哪一段呢?四、如果clk信号本身是不连续的,那么问题三带来的隐患将更加危险。
因此以clk信号的模式匹配为参考来采集D信号是存在一定风险的,但至于为什么我们据此设计的FPGA逻辑几乎不会出什么岔子,是因为这样做的背景往往是clk信号的频率很低、D信号的采样率也很低,因此FPGA内部各类延迟相对clk信号的周期或者D信号单符号的稳定区间往往可以忽略不计。在此前提下,我们可以认为FPGA内部触发器在采集clk与D信号时,几乎还是它们曾经的样子。但如果是一个专业FPGA验证机构的话,对于这种风险是不能视而不见的,需要给出时序方面的证明。一种偷懒的方法是根据功能仿真结果来辅助说明,例如可得理想情况下采集D信号的位置具有多少建立时间余量、多少保持时间余量,如果这些余量都是几百ns级别,显然你是没有必要去深究现实情况下的具体数字量的,因为与采集clk与D信号相关的线延迟、门延迟通常都是10ns甚至更小量级的。但有的时候,迫于客户需求或者余量并不是特别大等原因,是一定要给出精确的时序分析报告才能证明该输入接口工作正确性的,这时,时序分析工作碰到的情况会比较复杂,详细介绍如下:

因为用于过采样的高速时钟到达采集输入时钟和数据的各个寄存器存在skew,不同比特的数据信号到达采集它们的触发器也存在不同的路径延迟。因此单纯的找出数据D的所有比特到达采样其触发器的最大路径延迟和最小路径延迟是没有意义的。例如,当D的路径延迟均为10ns,clk的路径延迟为2ns,过采样时钟到达各个D采样触发器的skew均为10ns,到达clk采样触发器的skew为2ns时,则相当于D和clk的采样值对应到原始信号上是属于同一个时刻,就跟它们之间并没有延迟一样。
故,此时必须考虑到过采样时钟的skew,找出采集数据D的这组触发器中,d-clk端路径延迟差最大和最小的两个,以及采集clk信号触发器的d-clk端路径延迟差最大、最小情况(绝大对数时候,由于clk信号只有一个,内部采集clk的触发器也只有一个,所以相应触发器的d-clk端路径延迟差最大、最小值都是一样的,不过考虑到类似【内部时钟相关时序分析->多时钟驱动同一时钟域的时序分析】小节的情况,不一样也是有可能的),便可以得到FPGA内部布线延迟及过采样时钟skew对外部输入D和clk造成的相对影响。例如,D数据在采样时的最大、最小数据时钟延迟差分别为5ns、2ns,clk信号在采样时的最大、最小数据时钟延迟差均为3ns,则D相对于clk的建立时间缩小了2ns(5-3=2),保持时间缩小了1ns(3-2=1)。如果过采样时钟存在jitter,则我们还需要分析逻辑功能,看对clk信号进行模式匹配判决的过采样时钟边沿与实际有效抽取D数据的过采样时钟边沿是否是一个边沿,如果是,则不考虑jitter;如果不是,若jitter为2ns,则最差情况下,D相对于clk的建立时间缩小了2+2=4ns,保持时间缩小了1+2=3ns。
最后再考虑到过采样时钟在采样clk信号的两种极限关系(最佳极限:clk有效沿刚到过采样时钟边沿就到;最差极限:过采样时钟边沿刚过去,clk有效边沿就到),若过采样时钟周期为T,这便意味着过采样时钟对于clk信号的上升沿判断最多可能存在着T的迟滞。紧随上例,如果原始D信号相对于原始clk信号的建立时间为20ns、保持时间为10ns,则在不考虑jitter的情况下,经过线延迟与过采样时钟skew的影响,等效变为D信号相对于clk信号的建立时间为18ns(20-2)、保持时间为9ns(10-1)。而若过采样时钟周期为5ns,且功能上我们会取clk上升沿判定(为1)同时刻的D采样值,则,最佳极限下,D相对于过采样时钟的建立时间为18ns、保持时间为9ns;最差极限下,D相对于过采样时钟的建立时间为23ns(18+5)、保持时间为4ns(9-5)。综合考虑,D相对于过采样时钟的建立时间为18ns、保持时间为4ns,只要这符合触发器的建立、保持时间要求,时序分析便应该是通过的。

注意,考虑到直接求解采样D信号触发器组的d-clk端路径延迟差最大和最小值是比较麻烦的一件事,尤其是当D的位宽较大时。因此,通常的做法是在FPGA外部虚拟一组产生输入数据D的寄存器(其实也就是随意指明D的稳定周期及其相对于过采样时钟的关系),和一个产生输入时钟clk的寄存器(其实也就是随意指明clk的稳定周期及相对于过采样时钟的关系),让这些寄存器的时钟端均连接到过采样时钟信号,如下图所示:
FPGA之道(79)静态时序分析(五)外部接口的相关时序分析_其他_07
这样,你相当于构造了两个纯同步输入接口,令所有虚拟寄存器相对于过采样时钟skew都一样(可以取0)、tco都为0,只要随便指明D、clk相对于过采样时钟的关系,时序分析工具便会自动报出过采样时钟在FPGA内部采集各个D和clk的建立时间余量和保持时间余量,而这其中就包含了各个触发器的d-clk端路径延迟差信息。其中,D总线中建立时间余量最小的那一个触发器自然对应着数据D相关触发器组中d-clk端路径延迟差最大的情况,而保持时间余量最小的那一个自然对应着数据D相关触发器组中d-clk端路径延迟差最小的情况。同理提取出clk信号的d-clk端路径延迟差最大、最小情况。最后,再结合实际中D和clk的相对时间关系、逻辑功能中D、clk有效采样的情况,异步采样clk时的两种极限情况等等,便可以得到所需的时序分析结果。

纯输出接口

纯输出接口关心的是你的输出能否满足别人接收时的要求。

纯时钟输出接口

纯时钟输出接口指的是仅将FPGA内部时钟信号导出的接口,即FPGA芯片输出时钟信号给外部电路或芯片使用。
既然是给外部使用,那么就必须要满足外部芯片对时钟信号的要求,这其中包括时钟频率、占空比等。由于各项延迟并不会造成时钟信号波形的畸变,因此关于纯时钟输出接口的时序分析,基本上可以通过功能仿真结果来完全说明。

纯同步输出接口

纯同步输出接口,指的就是FPGA在输出数据的同时也输出用于采集数据的时钟信号。而本小节,我们主要讨论一种比较简单、比较常见的情况,那就是该接口的输出数据本身就是由当前时钟或其同源时钟生成的,例如下图所示:
FPGA之道(79)静态时序分析(五)外部接口的相关时序分析_数据_08
此时,我们通常只需要将外部芯片对数据、时钟关系的需求转化为数据端口相对于时钟端口敏感边沿的建立、保持时间要求(例如D应该在clk上升沿到来前20ns就开始稳定,而在clk上升沿到来后15ns内不得撤销稳定),时序分析工具便可以自动完成时序分析。到此为止,纯同步输出接口的时序分析就完成了,但是这里也有三点需要特别注意:
第一点,纯同步输出接口的时序分析看起来也是非常容易的,不过我们还是要了解一下其背后所隐藏的道理,虽然绝大部分工作都已经被时序分析工具主动承担了。要想让逻辑锥覆盖到所有的输出路径,必须虚拟一组采集寄存器,对应的电路原理图应该类似如下:
FPGA之道(79)静态时序分析(五)外部接口的相关时序分析_其他_09
对于一个外部芯片来说,如果数据手册只告诉你它在接收数据时,D相对于clk的建立、保持时间要求,而没具体告诉你D的每个比特相对于clk的建立、保持时间要求,那么你必须以最坏的情况考虑问题,这样时序分析所给出的结果才是完全可信的。对应上图情况,即虚拟寄存器的时候应该让D的每个比特相对于clk的建立、保持时间要求都等于整个D信号相对于clk的建立、保持时间要求。这样一来,你无需计算便可以得到一个关于虚拟寄存器组建立、保持时间要求的唯一解。可见,纯同步输出接口的求解原理要比纯同步输入接口简单一些。这是因为对于【纯输入接口->纯同步输入接口】小节中介绍的虚拟寄存器来说,虽然外部芯片指明了的D的稳定持续周期,但你不能据此认为最差的情况是D所有的比特的稳定持续周期也跟整个D一样。原因很简单,这不科学!因为D的稳定持续周期几乎肯定是要小于其同步时钟周期的,但单个触发器的输出稳定周期都是等于其同步时钟周期的(不考虑时钟jitter),故上述关于最差情况的推断是时序分析工具无法帮你实现的。事实上,对于同步输入接口来说,你只能估计出虚拟寄存器的最大、最小tco,但能够满足这种要求的组合有无限多,并且没有标准可供你指出到底哪一个tco的组合是最差情况,因此你需要虚拟寄存器后再通过tco修正法来综合得到最终的时序分析结果。
第二点,不知大家是否留意到,上述电路在输出时钟信号的时候,先在FPGA内部对时钟信号进行了一次取反操作(经过了非门),其目的无非是为了能够让clk的有效边沿(上升沿)尽可能的对齐数据D的中心,以尽可能的提供给后续芯片更加宽裕的建立时间和保持时间。不过好像在时序分析的过程中我们并没有对此现象进行什么特别的处理,这是为什么呢?主要原因就是时钟信号可以穿透组合逻辑,并且对于非门这样的单元,时序分析工具往往还是可以预知其对时钟信号波形的影响的。
第三点,有些遗憾的是,有些时序分析工具只允许虚拟时钟端口直接连接到inner clk的虚拟采集寄存器组。此时,我们首先需要从功能上判断出理想情况下,D和clk之间的关系。然后再通过本次虚拟得到D相对于inner clk的最大、最小延迟。之后再通过后续【不可完全拆解复合接口->纯组合逻辑接口】小节中介绍的方法获得clk相对于inner clk的最大、最小路径,即可推算出D相对于clk的建立、保持时间。如果再考虑到inner clk的jitter,则需要从功能上去分别分析D稳定开始、结束两个时刻对应inner clk的边沿事件是否与clk有效的边沿事件对应inner clk的边沿事件是一个事件?如果是,则不考虑jitter,否则考虑jitter。

纯异步输出接口

纯异步输入接口,指得是FPGA芯片仅仅对外输出数据信号,因此,外部芯片为了接收该数据,只能使用一个异步的时钟,通过一些变通的方法来实现数据可靠的采集,例如,通用异步串口发送端这样的逻辑设计就是纯异步输出接口的一个最典型的例子。对于这类接口,往往都会在功能上来保证接收的正确性,所以通常不需要进行时序分析。

异步生成同步输出

与【纯输入接口->同步输入异步采集】小节中介绍的类似,只不过方向相反,纯同步输出接口的数据和时钟也可以均由一个高频内部时钟产生,这样同步输出所驱动的外部逻辑和产生该接口信号的内部逻辑便属于于不同的时钟域,所以将这类同步输出的处理方式称为异步生成同步输出。其接口示例电路如下图所示:
FPGA之道(79)静态时序分析(五)外部接口的相关时序分析_时序分析_10
由于时序分析工具并不能理解功能,因此,在理想情况下(无延迟),D和clk之间的相互关系还必须得由功能仿真得出。例如,若inner clk的频率为100MHz,通过功能仿真,我们发现,D上每个符号的持续时间为20个inner clk周期,且D相对于clk上升沿的建立时间为9个inner clk周期,保持时间为11个inner clk周期。由此可得,理想情况下,输出D相对于clk的建立时间为90ns,保持时间为110ns。
同样的道理,由于90ns、110ns是比较大的一个余量,FPGA内部的路径延迟以及后续接收电路对D信号的建立、保持时间要求通常为10ns级别甚至更小,所以无需进行进一步的时序分析就可以得出该同步输出接口满足要求的结论。但是若功能仿真后的余量本身并没有这么大,又或者客户确实需要你提供一个精确的分析结果,则需要参考inner clk的skew以及从触发器的tco以及触发器的输出到pin脚的延迟。
与【纯输入接口->同步输入异步采集】小节中所关心的不同,此处我们的确是需要去求出D信号的最大、最小路径延迟以及clk信号的最大、最小路径延迟的(考虑jitter)。因为从上图就可以很明显的看出,以inner clk为参考,D信号每一个比特的延迟取决于inner clk的skew、触发器tco以及触发器Q到pin路径延迟的总和(对于clk信号同理)。故我们只要能获得上述4个极限延迟情况,就可以得到延迟对Q与clk之间关系的影响。
若仍接前例,在没有jitter的情况下,D信号的最大、最小路径延迟分别为11ns、4ns,clk信号的路径延迟为7ns,那么,延迟造成D相对于clk的建立时间变为86ns(90+7-11),保持时间变为107ns(110-7+4),同时也造成D单个符号稳定时间由200ns变为193ns。
接下来,让我们考虑一下jitter的情况。jitter对上例的建立时间结果是否有影响,取决于D刚开始输出本次数据时所对应inner clk的有效边沿是否与clk从0变为1时对应inner clk的有效边沿是同一个时钟边沿。如果是同一个边沿,则jitter不会影响建立时间,否则,若jitter为2ns,则最差情况下,D相对于clk的建立时间变为84ns(86-2)。同理,jitter对上例的保持时间结果是否有影响,取决于D变为新数据时对应inner clk的有效边沿是否与clk从0变为1时对应inner clk的有效边沿是同一个时钟边沿。如果是同一个边沿,则jitter不会影响保持时间,否则,若jitter为2ns,则最差情况下,D相对于clk的保持时间变为105ns(107-2)。可以通过功能仿真确认jitter是否会对D与clk之间的关系有影响,不过通常情况下,D上本次数据的开始、结束与clk上升沿在功能仿真中应该不是被同一个inner clk边沿所驱动,所以实际情况下,D相对于clk的建立和保持时间往往都会受到影响。那么,若我们碰到的就是一般情况,承接前例,在jitter为2ns时,其造成D相对于clk的建立时间变为84ns,保持时间变为105ns,同时也造成D单个符号稳定时间由193ns变为189ns。如果外部电路使用clk信号采样D时,其建立、保持时间要求分别为10ns、8ns,则从时序分析的结果来看是富富有余的。

注意,我们同样没有必要求出每个输出触发器对应的inner clk的skew、tco以及其输出到pin脚的延迟来计算和比较出D、clk的最大、最小路径延迟,只需要在FPGA外部虚拟一组同步采集寄存器,时序分析工具就会帮我们求解出这些路径延迟。虚拟方式如下:
FPGA之道(79)静态时序分析(五)外部接口的相关时序分析_其他_11
这样,你相当于构造了两个纯同步输出接口,令所有虚拟寄存器相对于inner clk的skew都一样(可以取0),只要随便指明D、clk相对于inner clk的关系,时序分析工具便会自动报出inner clk在FPGA外部采集各个D和clk的建立时间余量和保持时间余量,而这其中就包含了各个虚拟触发器处的d-clk端路径延迟差信息。由于我们已经指定所有虚拟寄存器相对于inner clk的skew都一样,因此此时的最大、最小d-clk端路径延迟信息就对应于D、clk的最大、最小路径延迟。所以,D总线中建立时间余量最小的情况自然对应着数据D延迟最大的路径,而保持时间余量最小的情况自然对应着数据D延迟最小的路径。同理可提取出clk信号的最大、最小路径延迟。

可完全拆解复合接口

其实FPGA芯片与外围电路的接口在很多时候都不会那么的纯粹,经常会同时包含输入、输出两类端口,有时候甚至还包含双向端口,因此我们姑且称这类接口为复合接口。由于这类接口内部的信号方向并不统一,所以无法直接套用前两个章节介绍的方法进行时序分析。
那么,根据复合接口的特点,如果其输入与输出端口本身没有太强时间相关性,可以独立进行时序分析,那么我们则可以将该复合接口分解为若干个纯输入接口和纯输出接口,分别进行时序分析。满足这个条件的复合接口称之为可完全拆解的复合接口,否则称为不可拆解的复合接口。
对于可完全拆解的复合接口来说,通过将其划分为若干个独立的纯输入和纯输出接口,便可以套用前面两个章节的方法来进行时序分析。例如,一个关于某AD芯片的接口包括3个信号:clkOut、ADClkIn、ADDataIn,其中,clkOut是FPGA输出给AD的工作时钟,而ADClkIn、ADDataIn则是AD芯片输出的采样时钟及采样数据。虽然clkOut与ADClkIn之间肯定具有一定关系,甚至可能还是同一个时钟信号,但由于AD芯片的数据手册通常会指明ADClkIn与ADDataIn之间的关系,所以我们在接收AD芯片输出的时候并不需要去关心clkOut与ADClkIn之间到底有什么联系。鉴于此,我们可以把该AD芯片的复合接口分解为一个纯时钟输出接口(包含clkOut信号)和一个纯同步输入接口(包含ADClkIn、ADDataIn两个信号),然后分别进行时序分析。
最后需要补充一点,双向端口虽然在FPGA芯片上只对应一个物理pin脚,但在时序分析时,其可以被拆解为一个输入端口和一个输出端口。所以,我们可以把该双向端口先当做输入端口,对整个接口做一次时序分析,再把其当做输出端口,对整个接口再做一次时序分析即可。

不可完全拆解复合接口

当我们碰到一个复合接口的时序分析需求时,首先是要想办法把从其中剥离出一些简单接口,并对它们进行单独分析。而若到了不能再进行剥离的时候,若所剩下的端口中仍然同时包含输入及输出端口,则此类接口就叫做不可完全拆解复合接口。本章节,就为大家介绍几种比较典型的不可完全拆解复合接口的时序分析应对方法,而对于一些更为复杂的情况,就请大家参考本章节的内容,灵活应对吧。

纯组合逻辑接口

纯组合逻辑接口,指的是从输入到输出之间没有任何时序单元,只有纯组合逻辑。例如下图所示情况:
FPGA之道(79)静态时序分析(五)外部接口的相关时序分析_寄存器_12
对于这种情况的时序分析,主要是要求出从Din到Dout所有路径中的延迟最大和最小的两个值。可是当Din和Dout位宽均较宽且组合逻辑也较复杂时,从Din到Dout会有非常多条路径,人工分析起来实在是一项不可完成的任务,因此,通常都采用同时虚拟生成、采集两组寄存器组,并虚拟一个不存在的时钟的方式来让时序分析工具帮忙求解。思路如下图所示:
FPGA之道(79)静态时序分析(五)外部接口的相关时序分析_寄存器_13
此时,令virtual clk到各个寄存器的skew为0(其实相等即可),每个寄存器的tco为0,然后随便指定virtual clk的周期,时序分析工具便可以按照逻辑锥的思路求解出当前同步逻辑的建立时间和保持时间。显然,virtual clk的周期减去建立时间就等于Din到Dout间最大的路径延迟,而保持时间则等于Din到Dout间最小的路径延迟。
现实情况中,纯组合逻辑接口时序分析的一个应用示例,就是当两块芯片之间在同步传输数据时,如果想插入一块FPGA芯片对数据做一些组合逻辑处理,那么负责接收的芯片是否能够正确采集到处理后的数据。该示例的电路原理图如下所示:
FPGA之道(79)静态时序分析(五)外部接口的相关时序分析_其他_14
假设,chipA输出的Din相对于其输出的clk信号来说,建立时间为50ns,保持时间为30ns,每符号Din稳定长度为80ns。那么,若通过时序分析得出,从Din到Dout的最大路径延迟为25ns,最小路径延迟为15ns,则,Dout相对于其输入的clk信号来说(不考虑板级布线延迟),建立时间为25ns(50-25),保持时间为45ns(30+15),每符号Dout稳定长度为70ns(25+45)。若chipB对Dout的建立、保持时间要求分别为30ns、20ns,则由于25ns<30ns,建立时间不足,所以chipB不能正确采样Dout。

输入、输出直接共用时钟接口

输入、输出直接共用时钟的复合接口,指的是数据的接收方为数据的发送方提供用于输出数据的时钟信号,而其本身则又使用该时钟去接收发送方所输出的数据。这样一来,我们必须通过时序分析得到接收方收到的数据相对于其采集时钟的关系,以确保数据的正确传递。那么,根据FPGA芯片所扮演的角色不同,这种复合接口又可细分为输入为主的直接共用时钟接口和输出为主的直接共用时钟接口,分别介绍如下:

输入为主的直接共用时钟接口

输入为主指的是FPGA芯片扮演通信双方中接收方的角色,例如下图所示情况:
FPGA之道(79)静态时序分析(五)外部接口的相关时序分析_其他_15
可见,FPGA内部的inner clk信号直接导出给chip芯片,而chip芯片则会利用该时钟信号驱动并输出数据data给FPGA芯片,而在FPGA芯片内部,则又使用inner clk信号驱动触发器来完成data数据的采集。
我们可以通过chip芯片的器件手册来得出data信号相对于clk信号的关系,不过要想确定FPGA内部的触发器是否能够完成正确的数据采集,则需要知道data相对于inner clk的关系,因此我们需要先找到clk与inner clk之间的关系。其实,clk就是inner clk,我们只需求出inner clk产生源处传递到FPGA相应输出pin脚的延迟即可。例如,若chip芯片手册给出,data会在本次clk下降沿过后10ns进入稳定,而在下次clk下降沿过后5ns即发生改变。若inner clk周期为50ns,inner clk到FPGA相应输出pin脚处的时间延迟为8ns。则可得出data相对于inner clk上升沿的建立时间为7ns(25-10-8),保持时间为38ns(25+5+8)。接下来,我们就将该复合接口的时序分析转化为一个纯同步输入接口的时序分析,参考【纯输入接口->纯同步输入接口】小节便可最终完成上例的时序分析。
当然了,关于inner clk到clk端的延迟,可以参考【组合逻辑接口】中介绍的思路来构建虚拟寄存器。当然了,此时,inner clk被看做了数据,不过只要稍加变化,也是可以将其看做时钟的,例如下图所示虚拟方法:
FPGA之道(79)静态时序分析(五)外部接口的相关时序分析_其他_16
令FPGA内部虚拟寄存器的skew为0,两个虚拟寄存器之间的数据路径延迟为0,则上述逻辑锥的保持时间就是inner clk到clk之间的延迟。
事实上,对于某些时序分析工具,只需直接指明data相对于clk信号pin脚的建立、保持时间,便会自动得到时序分析结果,因为时序分析工具会自动虚拟寄存器组如下图所示:
FPGA之道(79)静态时序分析(五)外部接口的相关时序分析_数据_17
当然,位于外部芯片内的虚拟寄存器组,仍然需要仿照【纯输入接口->纯同步输入接口】小节中介绍的那样,以最大、最小tco两种情况综合分析。

输出为主的直接共用时钟接口

输出为主指的是FPGA芯片扮演通信双方中发送方的角色,例如下图所示情况:
FPGA之道(79)静态时序分析(五)外部接口的相关时序分析_时序分析_18
此时,我们显然关心的是从clk输入pin脚到data输出pin脚的最大、最小路径延迟。若最大延迟为20ns、最小延迟为10ns、clk周期为50ns,则在chip内部,data相对于clk的建立时间为30ns(50-20)、保持时间为10ns,data稳定周期为40ns(30+10)。当然了,为了得到从clk到data之间的最大、最小路径延迟,我们也是没有必要求出clk到FPGA内部各个寄存器的skew、tco以及寄存器输出到pin脚的延迟,只要在外部芯片chip内部虚拟一组寄存器即可,如下图所示:
FPGA之道(79)静态时序分析(五)外部接口的相关时序分析_时序分析_19
令所有虚拟寄存器的skew等于0,只要指明clk信号的时间参数,便可以得到该逻辑电路的建立时间和保持时间,可以发现,这个保持时间和建立时间就是我们最终所需要的保持时间和建立时间。

输入、输出间接共用时钟接口

输入、输出间接共用时钟的复合接口,指的是数据的接收方使用本地时钟接收发送方传来的数据,但其提供给发送方的却不是本地时钟信号,而是本地时钟域所产生的数据信号。相比于直接共用时钟的复合接口,间接共用让接口中的输入、输出端口之间的关系又复杂了一些。
对于这类复合接口,FPGA芯片所扮演的角色只能为接收方,因为若FPGA扮演发送方的角色,则这种接口又会变为输出为主的直接共用时钟接口。道理很简单,因为我们只需根据外部芯片的器件手册来确保我们发送的数据是否满足它的接收需求,而根本不会关心外部芯片内部是如何处理其时钟与数据。故,针对FPGA来说,输入、输出间接共用时钟接口只包含一种情况,那就是输入为主的间接共用时钟接口,例如下图所示情况:
FPGA之道(79)静态时序分析(五)外部接口的相关时序分析_数据_20
由于clk是inner clk时钟域所产生的数据,而时序分析又无法洞悉逻辑功能,因此,针对此类接口,必须先通过功能仿真或者阅读代码的方法,得到理想情况下输出clk有效边沿与内部采集data时inner clk的有效边沿之间到底有多少余量,以及clk的时钟周期等参数。例如,我们发现,FPGA的功能被设计为:若在当前inner clk驱动下,clk信号由0变1,则会在3个时钟周期后采集data数据,并且clk的周期等于7倍的inner clk周期。则,若inner clk的周期为20ns,则理想情况下,FPGA会在发出clk信号的有效边沿后60ns对data进行采集。若chip芯片手册中给出,data的稳定起始于clk上升沿后10ns,结束于下一次clk上升沿前的15ns,则理想情况下,data相对于inner clk来说,其建立时间为50ns(60-10),保持时间为65ns(140-15-60)。
以上仅仅是得出了理想情况下data相对于inner clk的情况,可现实中必须要考虑到延迟,因此我们还必须知道从inner clk到clk信号之间的最大、最小延迟(考虑到jitter),以及从data到FPGA内部采样触发器的最大、最小d-clk路径差才行。为了求出这两组延迟,虚拟寄存器的思路如下图所示:
FPGA之道(79)静态时序分析(五)外部接口的相关时序分析_寄存器_21
令所有虚拟寄存器的时钟skew为0,则虚拟寄存器后,我们将求inner clk到clk信号之间的最大、最小延迟转化为一个纯同步输出接口的求解;将求data到FPGA内部采样触发器的最大、最小d-clk路径差转化为一个纯同步数入接口的求解。为了简便起见,我们可以先求解纯同步输出接口,获得inner clk到clk信号之间的延迟后,便可以推出data相对于inner clk之间的延迟,据此再去求解一个纯同步输入接口即可。