对于FPGA而言,时序收敛是一个很重要的概念。在我看来,时序约束是必要的,但不是在最重要的,我们应该在设计初始就考虑到时序问题,而不是完全的靠约束来获得一个好的结果。但我认为,对FPGA时序的分析能力是理解其运行机制的必要条件。之前也简单看过这方面的内容,却没有很正确的认识。这两天看了看UG612和相关内容,记录在此,这应该有一系列文章,希望不要烂尾。
系列目录
建立时间和保持时间(setup time 和 hold time)
OFFSET约束(OFFSET IN 和OFFSET OUT)
FPGA器件的需求取决于系统和上下游(upstream and downstrem)设备。我们的设计需要和其他的devices进行数据的交互,其他的devices可能是FPGA外部的芯片,可能是FPGA内部的硬核(是否还能是其他的FPGA design?我的理解是,如果两个FPGA design和成了一个,那么ucf内的时序约束是要修改的)。
对于FPGA design来说,必须要关注在指定要求下,它能否正常工作。这个正常工作包括同步时序电路的工作频率,以及输入输出设备的时序要求。在FPGA design内部,都是同步时序电路,各处的延时等都能够估计出来,但是FPGA内部并不知道外部的设备的时序关系。所以,Timing constraints包括
这正好对应了上图中三个部分,Path specific exceptions 暂时不提。
Input paths对应的是OFFSET IN约束,即输入数据和时钟之间的相位关系。针对不同的数据输入方式(系统同步和源同步,SDR和DDR)有不同的分析结果。
Register-to-register paths 对应的是整个FPGA design的工作时钟。如果只有一个时钟,那么只需要指定输入的频率即可。如果有多个时钟,这些时钟是通过DCM,MMCM,PLL生成的,那么显然ISE知道这些时钟之间的频率、相位关系,所以也不需要我们指定。如果这些不同的时钟是通过不同的引脚输入的,ISE不知道其相位关系,所以指定其中一个为主时钟,需要指定其间的相位关系。
Output paths对应的是OFFSET OUT 约束,和OFFSET IN约束很类似。
The input timing constraints cover the data path from the external pin or pad of the package of the FPGA device to the internal synchronous element or register that captures that data.
输入时序约束控制外部引脚到内部模块的路径。采用OFFSET IN来指出input timing constraints。(The OFFSET IN constraint defines the relationship between the data and the clock edge used to capture that data at the pin or pads of the FPGA device.)也就是说OFFSET IN定义了时钟沿河被采集数据的关系(相位)。输入模式分为两类,分别如下。
System Synchronous inputs
系统同步输入,指由同一时钟传输和捕获数据,如下图所示
1.时钟上升沿传输
2.下一个上升沿捕获
Source synchronous inputs
In a source synchronous input interface, a clock is regenerated and transmitted along with the data from the source device along similar board traces. This clock captures the data in the FPGA device.
The board trace delays and board skew no longer limit the operating frequency of the interface. The higher frequency also results in the source synchronous input interface typically being a dual data rate (DDR) application.
即一个时钟周期传两组数据,上升沿和下降沿均采集数据,在传输数据的同时传输时钟,利用重新生成的时钟捕获数据(DDR取代SDR)
寄存器-寄存器的约束,在同步时序电路中,就是周期的约束,具体分为以下几类
自动相关同步时钟域(DLL,DCM,PLL,MMCM)
因为它是自动的,所以基本不用管,当时我们要写输入到DCM的信号的时序约束。
手动相关同步时钟域
如果说,输入的同步时钟是从不同的引脚引入的,那么DCM就用不了了,我们需要手动的定义一个主时钟,并以之为参考,定义相对的约束。语法如下:
NET “PrimaryClock” TNM_NET = “TNM_Primary”;
NET “RelatedClock” TNM_NET = “TNM_Related”;
TIMESPEC “TS_primary” = PERIOD “TNM_Primary” PeriodValue HIGH HighValue%;
TIMESPEC TS_related” = PERIOD “TNM_Related” TS_Primary_relation PHASE value;
异步时钟域
xilinx无法分析,也可以用,具体参考ug612。
输出就是输入的逆
SDR
例子:NET "ClkIn" TNM_NET = "ClkIn";
OFFSET = OUT 5 ns AFTER "ClkIn";
DDR(一般来说不给约束就可以)
例子:NET “ClkIn” TNM_NET = “ClkIn”;
OFFSET = OUT AFTER “ClkIn” REFERENCE_PIN “ClkOut” RISING;
OFFSET = OUT AFTER “ClkIn” REFERENCE_PIN “ClkOut” FALLING;