FPGA之道(78)静态时序分析(四)内部时钟相关时序分析

前言

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

内部时钟相关时序分析

时序分析的情形可以概括分为两大类:一类是和内部时钟相关的时序分析,它用来保证FPGA内部逻辑可以对数据进行正确处理;另一类是和外部接口相关的时序分析,它用来保证FPGA芯片可以正确地和外围电路进行通信。当一个FPGA设计的两类时序分析均通过时,就可以保证这个FPGA设计在实际电路中可以实现其所预期的功能了,那么在本章节,我们将先围绕着FPGA设计内部时钟的相关时序分析,来看一下都会有哪些常见情形。

单时钟域时序分析

如果你的FPGA设计内部逻辑全部都只基于一个时钟信号的一个边沿事件进行工作的话,那么你的FPGA设计就只包含了一个时钟域。虽然这种情况并不多见,但是只要可能的话,我们应该力求将自己的FPGA程序设计成这种结构,因为越是简单的结构越稳定、越可靠、越容易实现。(有一点需要说明,时钟结构简单并不代表着功能结构简单!)
对于这种单时钟域的时序分析,应对方法也很简单,只需要指明该时钟信号的周期、占空比、jitter等参数,然后相应的时序分析软件便可按照逻辑锥的思路进行全面分析。

多时钟域时序分析

如果FPGA设计内部使用了多个时钟事件,那么该FPGA设计就包含了多个时钟域。对于这样的FPGA设计,我们可以把它分成域内和域间两种情况来进行时序分析:
对于域内来说,每个时钟域如果只看其内部,那么它仍是一个纯粹的同步逻辑,则可以采用单时钟域的方式来逐个进行时序分析。
而对于域间来说,也就是跨时钟域传递信号的情况,其实在很多时候是无需进行时序分析的。因为不同时钟域的时钟周期、相位往往都是很不相同的,即便它们之间具有一定相关性,由于很可能碰到两个时钟事件相邻很近的情况,所以即便套用一般逻辑锥的思路进行分析的话,十有八九也是要报错的。因此对于跨时钟域的情况,往往是在进行逻辑设计的时候,采用一些安全的通信措施,并以此来保证FPGA设计的行为能够正常实现(详见【程序设计篇->编程思路->时钟及时钟域->跨时钟域问题】章节中的介绍)。事实上,对于毫不相关的两个时钟信号,时序分析工具也无法去对其跨时钟域情况进行分析,因为无法推断逻辑锥内部各个寄存器之间时钟事件的到达时间差,不过,对于那些有一定相关性的时钟来说,情形就会有所不同。

同源时钟的时序分析

同源时钟,指的是如果对两个或两个以上的时钟事件进行溯源的话,可发现它们最终都是由一个父时钟信号直接或间接产生的,甚至发现它们原本就是同一个时钟信号,因此它们之间的各项时间参数都具有很强的相关性。 也正是因为这样,时序分析工具便可以根据源时钟的情况来推断出各个子时钟的情况。所以,只要指明源时钟信号的各项时间参数,各个子时钟域的内部及其它们之间跨时钟域的情形就都会被时序分析工具进行分析。
例如,如果有一部分逻辑使用时钟信号clk0的上升沿驱动,而另一部分逻辑使用时钟信号clk0的下降沿驱动,那么这两个时钟域的时钟信号肯定属于同源时钟的范畴(因为它们原本就是一个时钟信号)。这种逻辑的典型应用就是DDR相关接口逻辑,此时必须要有相应的跨时钟域时序分析来保证DDR接口的功能正确性。而为了实现这一点,我们只需要给clk0指明各项具体的时间参数即可,时序分析工具会自动分析上升沿与下降沿逻辑间的跨时钟域时序问题。
再例如,有一部分逻辑使用时钟信号clk0的上升沿驱动,而另一部分逻辑使用时钟信号clk0取反操作后所得时钟信号clk1的上升沿驱动,那么clk0和clk1肯定也属于同源时钟的范畴。同样,为了保证clk0、clk1之间数据传递的正确性,以及clk0、clk1自身时钟域内寄存器工作的正确性,我们只需要给clk0指明各项具体的时间参数,时序分析工具便可以完成相应的时序分析工作。
更为一般的,一个时钟信号以及其经过组合逻辑后变成的若干个新的时钟信号之间,均是同源关系,只要指明源时钟信号的各项时间参数,所有时钟域及其跨时钟域情况均会得到分析 。但是,也有的时候某两个同源时钟之间的相位关系导致其跨时钟域时序分析时很难或不可能通过,因此我们必须在功能方面做好足够的保护措施来保证跨时钟域通信的正确性。 但同时我们又希望每个子时钟的时钟域内必须得到时序分析。为了达到这个目的,有两种做法:
方法一,如果两个时钟域的时钟信号同源但不是同一个时钟信号(例如部分逻辑使用一个时钟的上升沿,而另一部分逻辑使用这个时钟下降沿的情况不行),那么不去指明源时钟的各项具体时间参数,而是去分别指明它们的各项具体的时间参数,且让这些时序参数之间不具有相关性,这样在时序分析工具看来,这两个时钟信号就相当于毫不相关的两个时钟信号,自然也就不会分析其跨时钟域情况。
方法二,指明源时钟的各项具体参数,或者分别指明两个子时钟的各项具体参数(参数中存在相关性),但显式的指明让时序分析工具忽略这两个时钟域之间的时序分析。

PLL、DCM的时序分析

其实,提到同源时钟,容易想到的另一类例子就是PLL或DCM等时钟处理模块的应用。它们均是可以根据一个输入时钟生成若干个输出时钟,并且在大部分情况下,输入时钟和输出时钟之间都具有明确、可调的相位关系。这样一来,PLL、DCM等的父时钟和各个子时钟(甚至子子时钟)之间就具有很强的相关性。不过时序分析工具并不关心某个模块的功能,也并不知道PLL、DCM的输入、输出之间到底是什么样一个相关关系,故,默认情况下,如果只为PLL、DCM的父时钟指明了各项具体时间参数,时序分析工具是无法对各个子时钟的时钟域以及相关跨时钟域问题进行时序分析的。
不过有一个值得高兴的好消息,那就是对于FPGA开发者来说,我们往往是使用FPGA自带的集成开发环境来一气合成的完成时序分析,这样一来,由于FPGA编译器知道PLL、DCM等父时钟与子时钟之间的关系,因此,即便我们仅指明了父时钟的相关时间参数,编译器也会自动推断并追加各个子时钟的各项时间参数,并且这些子时钟的时间参数显然是以父时钟时间参数为参考的。所以在这种情况下,集成开发环境自带的时序分析工具会把PLL、DCM等的父时钟和各个子时钟当做同源时钟来对待。这样便会给我们带来一些方便,例如一个PLL输出的一个高速的时钟想偶尔从一个它输出的低速时钟的时钟域去采集一些信号的采样值,但是又不希望采样到低速时钟域数据的不稳定期。虽然可以通过一些保护措施来确保采样正确,可是面对这么简单一个功能,难道没有更简单的方法去实现采样的可靠性么?当然有,那就是进行跨时钟域分析。例如,当一个PLL输出两个频率比为2:1的时钟信号clkM2、clkM1时,假设它们两者的波形关系如下图:
在这里插入图片描述
可见,如果两者均是上升沿有效的话,那么任意两个相邻的不同时钟域的信号都离得足够远,因此clkM2完全有可能在不加任何保护措施的情况下,直接从clkM1的时钟域采样到完全稳定的数据(反之亦然)。因此,只要此时的跨时钟域时序分析通过,就可以确保跨时钟域采样的正确实现。更具代表性的情况是PLL或DCM输出了两个同频但不同相的时钟,当它们两者之间传递数据的时候,我们更希望通过简单的直接采样方式来完成,那么这个时候,跨时钟域时序分析就是不能忽略的。
令人讨厌的是,有好消息的同时往往也有一个坏消息,那就是对于某一些情形,我们不希望同源时钟之间进行跨时钟域分析,可是由于FPGA编译器“多管闲事”,而让时序分析总报告错误。例如,当一个PLL输出两个频率比为4:3的时钟信号clkM4、clkM3时,假设它们两者的初始相位一致,可得波形如下图:
在这里插入图片描述
可见,如果两者均是上升沿有效的话,那么会周期性的出现一些比较极端的情况(图中虚线圈出保持时间的最差情况),如果频率比为8:7或者更接近1的值,则极端情况会更多、更差。除此以外,不同频率间在传递数据时如果采用直接采样的方式,你很难说清楚时钟clkM3此时的上升沿应该采集clkM4什么时候上升沿所对应的数据。所以,有些时候,即使这些时钟是源同步的,我们也希望把它们当成没有任何关系的时钟来对待,并采用适当的保护逻辑来保证跨时钟域的信号传递。此时,为了避免时序分析工具介入当前跨时钟域情况进行分析,需要显式的为其指明需要忽略这两个时钟域之间的时序分析。
当然,对于专业的FPGA验证团队而言,由于他们是在FPGA设计已经编译实现之后才介入时序分析环节的,所以编译器无法为他们自动推断并追加各个子时钟的各项时间参数。故此时,如果需要进行跨时钟域分析,需要人为手动的指明各个时钟(包括主时钟、子时钟,视跨时钟域的情况而定)的各项时间参数,并且要让它们的参数与父时钟(或者彼此之间)具有相关性。反之,如果不需要进行跨时钟域时序分析,则只需要人为去指明各个时钟的各项时间参数,并让不同时钟的这些参数之间不具有相关性即可。

相关时钟的时序分析

如果我们只把目光局限于FPGA设计内部的话,那么只有【同源时钟的时序分析】、【PLL、DCM的时序分析】两个小节的情况才会被看做同源时钟,而对于从FPGA芯片两个不同pin脚引入的时钟信号,则不会被看做同源时钟。原因很简单,因为时序分析工具只对FPGA设计本身的相关实现进行分析,它无法预知整个硬件系统是什么样一个状态。可现实情况中,并不仅仅是FPGA芯片才具有类似逻辑取反、相位调整、倍频、分频等等时钟相关的操作功能,也有很多独立的时钟处理芯片存在,因此,从FPGA芯片不同pin脚引入的时钟信号如果结合整个硬件系统来分析的话也有可能是属于同源的。因此,我们称这种类似FPGA芯片外部同源的情况为相关时钟,即如果时钟溯源可以将搜索范围扩展到FPGA外部的话,如果两个内部看似不同源的时钟信号最终都是由一个外部的父时钟信号直接或间接产生的话,那么就称它们为相关时钟。
不过,默认情况下,即使两个时钟信号相关,但由于时序分析工具不知道,所以并不会进行跨时钟域分析。但如果我们碰到必须要考虑两者之间跨时钟域的分析情形,则需要告诉时序分析工具,这两个时钟之间的关系。此时,由于源时钟分叉点位于FPGA芯片外部,所以我们必须对两个相关时钟信号分别指明其时间参数,但只要我们让这两者的时间参数具有一定的相关性,相关时钟间的跨时钟域时序分析便可得到执行。

数据用作时钟的时序分析

经过【同步时序逻辑的分析原理】章节的学习,我们了解到时序分析工具对内部时钟的相关分析是基于逻辑锥结构的,但它丝毫没有关心这些逻辑锥到底具有一个什么样的逻辑功能。因此,如果一个时钟信号没有同源的父信号,也不是由类似PLL、DCM这样的时钟处理单元产生的,那么即便你把它当做时钟来用,时序分析工具(甚至编译器)也无法推测出该信号的各项时间参数,从而无论是其时钟域内还是其和别的时钟域之间的跨时钟域问题,都不会得到分析。使用一个数据信号做一些逻辑的时钟信号就属于这样的情况。
通过【程序设计篇->编程思路->时钟及时钟域->时钟信号的分类->按来源分】小节的学习,可以了解到,数据用作时钟的情况有两种:一种是门控时钟,一种是行波时钟。
对于门控时钟来说,其实指的就是组合逻辑产生的数据被用作时钟。如果该组合逻辑的输入本身就包含了一个有效时钟信号,那么这些组合逻辑并不会阻碍时序分析工具对该有效时钟信号的分析,因为组合逻辑的相关延迟是可以求出的,所以经过组合逻辑后,时钟信号的各项时间参数也是可以得到的。否则,我们需要专门为该组合逻辑的某个输入或者整个组合逻辑的输出指明其时钟信号的各项时间参数,这样后续逻辑的时序分析才会得以执行。当然了,使用门控时钟是一种非常不好的习惯,还是希望大家避免在自己的FPGA设计中引入门控时钟,当然,这也就同时避免了针对它的时序分析问题。
而对于行波时钟来说,其实指的就是寄存器的输出被用作时钟。例如,有一个8比特的计数器counter,在时钟clk的驱动下工作,如果将其每一位输出都看做一个新的时钟信号的话,那么counter_0对应clk的2分频、counter_1对应clk的4分频、……、counter_7对应clk的256分频。显然,时序分析工具无法根据寄存器的各项时间参数来推出其Q端与clk端之间是否具有某种频率倍率关系,所以如果你用counter_0、counter_1、……、counter_7去驱动时序逻辑的话,在默认设置下,时序分析工具既不会把它们之间或它们与clk之间看成同源时钟,也不会对其每个单独的时钟域内部进行分析,因为时序分析工具根本就无法推算出它们的频率是多少。因此,如果不想漏掉行波时钟相关的时序分析,我们也需要专门为该寄存器的输出指明其时钟信号的各项时间参数。如果希望对多个的确有相关性的行波时钟进行跨时钟域时序分析,可参考【多时钟域时序分析->相关时钟的时序分析】小节中的应对方法。

异步逻辑时序分析

默认情况下,不对异步逻辑进行时序分析,因为既然是异步的,逻辑锥的输入条件就不充分,而且对于一个确定的时钟域来说,寄存器对其的采样或者其对寄存器的影响就具有不确定性,也就很有可能会出现问题,这是无须进行时序分析就可知道的,所以异步逻辑总是危险的。
那么对于异步数据来说,常常是通过加保护电路(例如两级寄存器采样)这样的方式来确保FPGA设计对异步数据的采样具有容错性。不过有时候,异步信号被用作复位时,为了防止由于异步信号的撤销到达各个寄存器的时间不同而导致的所有寄存器没能够在一个上升沿同时脱离复位状态,我们需要通过异步复位同步化的方式(详见【程序设计篇->编程思路->复位的设计->复位的设计方法->异步信号异步复位】小节)来让时序分析工具对寄存器的异步复位端进行分析,以确保寄存器复位的统一性和正确性。

多时钟驱动同一时钟域的时序分析

有些时候,FPGA设计的某一部分时序逻辑可能需要在不同时段工作在不同时钟信号下,例如,一个PWM波的生成逻辑,在不改变其逻辑功能前提下,只要改变其工作时钟频率就可以在保持原有占空比的前提下控制输出PWM波的频率。因此,也许有人会将该逻辑设计成为可被多个时钟信号驱动的,其中多个时钟信号通过一个多路复用器,在适当的控制信号下选通一个时钟来作用于该部分同步逻辑。
那么,对于上述情况的时序分析,通常包括两部分:时钟切换部分和同步逻辑部分。其中,时钟切换部分肯定是异步逻辑,因此在时钟切换的瞬间肯定会引起驱动后续逻辑的时钟信号产生毛刺等不稳定现象,这是无需分析就知道会有风险的事情。所以此处通常都不需要进行时序分析,而FPGA设计应该通过功能来确保后续同步电路能够正常工作。例如,在完成时钟切换后,对时钟域进行复位操作。而对于同步逻辑部分,其和单时钟域时序分析情形类似,由于同步逻辑的时序分析不受参考时间0点选取的影响,因此可以选择时钟信号复用器的输出端出现时钟有效边沿的时刻为参考时间0点。并且由于只有建立时间跟时钟频率有关,所以可以针对最快的那个时钟信号进行时序分析,如果其时序分析通过,则说明其它低速时钟的时序分析也可以通过。

Latch相关的时序分析

寄存器是一个边沿有效的时序单元,而Latch(锁存器)则是一个电平有效的时序单元,因此,当时钟电平变化使得Latch由导通状态变为保持状态时,其时钟边沿与数据信号之间也是需要满足一定建立时间要求和保持时间要求的。但是,当时钟电平变化使得Latch由保持状态变为导通状态后,在整个时钟电平持续不变周期内,Latch就仅相当于一个具有一定时间延迟的传输门而已。正因为如此,Latch会使时序分析变得非常复杂与困难,所以,除非万不得已,我们强烈建议大家不要使用Latch,也强烈建议大家注意编程习惯,防止无意的使用Latch。但是,总有那么一些特殊情况让你摆脱不了Latch的魔爪,因此,接下来就让我们简单了解一些典型的Latch时序分析情况,以供在无法避免使用Latch时进行参考。
首先,让我们先看一个正常的同步时序逻辑电路如下:
在这里插入图片描述
若各项logic仅仅是线延迟,那么只要各项时间延迟在允许的范围内,则其数据和时钟的时序关系应该类似如下图所示:
在这里插入图片描述
可是,如果我们将上例中的寄存器D2替换为高电平使能的锁存器Latch后,其逻辑电路如下图所示:
在这里插入图片描述
只要各项时间延迟在允许的范围内,那么其数据和时钟的关系应该如下图所示:
在这里插入图片描述
可见,相比不使用Latch的情况,Q3的输出整整提前了1个时钟周期(设周期为T),其效果就跟纯同步逻辑电路中没有寄存器D2一样。需要说明的是,时序分析工具通常会将Latch看待成一个时序器件,然后让其参与逻辑锥的划分与分析,所以在分析的时候,上图的Latch就相当于一个下降沿敏感的寄存器,所以从D1到Latch或者是从Latch到D3,其理想建立时间、保持时间都是半个时钟周期。不过从上图可以看出,对于D3来说,其建立时间实际可能会更长(这是由于Latch在时钟高电平时导通,使得D2的数据直接传递到Q2的原因),不过这也不算是过约束,因为logic1的延迟可能会导致D3理想建立时间的最差情况就是半个时钟周期。但是,如果我们分析D3的保持时间的话,会发现其实际上可能是一个接近于0的值(这也是由于Latch在时钟高电平时导通,若logic1的延迟非常小的话,会使得D3处的旧数据很快由于Q1的变化而改写),因此,这是非常危险的。所以对于以上情况,我们需要在时序分析工具给出的结果的基础上,再去人工分析一下保持时间的最差情况。
而若Latch为低电平有效的,则时序分析工具会把它当做一个上升沿敏感的寄存器。故从D1到Latch或者是从Latch到D3,其理想建立时间都是1个时钟周期、保持时间都是0。因此,实际上时序分析工具认为Q3处的波形应该和之前的纯同步时序逻辑电路一样,可是只要各项时间延迟在允许的范围内,那么其数据和时钟的关系应该如下图所示:
在这里插入图片描述
可见,Q3的输出仍整整提前了1个时钟周期,这是由于Latch在时钟低电平时导通,若logic1、logic2的延迟比较小的话,会使得D3处的数据在Latch进入保持状态前就已经稳定。如果真是这样的话,Q3的理想建立时间和保持时间应该都是半个周期。
由此可见,本来逻辑锥的分析原理就是建立在每个逻辑锥都可以看成独立的个体来分析,可是如果有了Latch,那么以Latch为底面元素的逻辑锥能否正确工作实际上是依赖于Latch为顶点的逻辑锥的内部具体延迟特性的。因此,当使用了Latch时,时序分析往往是需要结合人工的分析来进行补充的。
更一般的,对于如下图所示的情况:
在这里插入图片描述
其中,Latch使能端与D1、D3的时钟端完全是异步的,因此时序分析工具便不会分析D1到Latch以及Latch到D3的情况。可现实中,这种电路往往是在某些情况下,需要打开Latch的使能,让数据从D1传递到D3。可见,此时的Latch只相当于一个传输门,因此D1和D3之间能否正确完成数据传递取决于logic1、logic2、Latch的门延迟以及时钟的skew。上述这些参数,在工况固定、布局布线确定后都应该是已知值,因此D1、D3间是否能够正确传递数据是可以被分析的,但由于时序分析工具不考虑功能且会将Latch看成一个时序单元,所以并不会帮我们分析,故D1到D3的时序分析是需要人工来协助的。
综上所述,我们可以毫不客气的称Latch为FPGA设计中的毒瘤,因为它不单对毛刺敏感,并且还会让时序分析变得困难和不可信。不过,Latch也不并不是一无是处,如果非要说说它的优点的话,也有那么几点。例如,相比于寄存器,Latch实现存储功能的同时使用更少的资源。另外,在时序分析方面,Latch具有一个叫做timing borrow的特性,可以应对类似下图这样的情况:
在这里插入图片描述
上图常见于接口,本来第一个时钟的上升沿应该采集data1,可是由于数据传递的延迟过大(超过1个时钟周期),如果采用上升沿敏感的寄存器肯定是无法实现类似上图的结果。可是,如果使用高电平有效的Latch的话,由于在下降沿到来后,Latch才进入保持状态,所以相比于寄存器,Latch对数据的延迟可以多容忍一个时钟高电平的时间跨度。这就好像是从哪里又借到了一些时间用来确保数据在D端口的建立,所以称为timing borrow。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
FPGA中的静态时序分析和动态时序分析是两种不同的时序分析方法,用于评估设计的时序性能和稳定性。 静态时序分析是一种在设计编译阶段进行的分析方法。它基于设计元数据和时序约束,通过计算信号路径的传播延迟和时序约束之间的差异来评估设计的时序性能。静态时序分析可以提前检测到潜在的时序问题,如setup和hold错误,并提供相关的报告和警告信息。它通常用于优化设计,通过调整布局布线、逻辑重划等方式来改善时序性能。 动态时序分析是一种在设计完成后、在实际运行或仿真过程中进行的分析方法。它通过模拟或测试电路的实际运行情况,考虑信号传播延迟、时钟抖动、噪声等因素,评估设计在实际环境中的时序性能。动态时序分析可以更准确地模拟设计的实际行为,并检测到一些静态时序分析无法捕捉到的问题。 区别总结如下: 1. 时间点:静态时序分析在设计编译阶段进行,动态时序分析在设计完成后进行。 2. 分析对象:静态时序分析基于设计元数据和时序约束,动态时序分析基于实际运行或仿真过程中的电路行为。 3. 检测能力:静态时序分析可以提前检测到潜在的时序问题,如setup和hold错误,动态时序分析可以检测到静态分析无法捕捉到的问题。 4. 优化方法:静态时序分析通过调整布局布线、逻辑重划等方式来改善时序性能,动态时序分析可以帮助验证设计在实际环境中的可靠性和稳定性。 综上所述,静态时序分析和动态时序分析是两种不同的时序分析方法,用于评估设计的时序性能和稳定性,各有其优缺点和应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李锐博恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值