上篇文章用一个简单的源同步接口的例子,分析了vivado 根据set_input_delay约束来做STA分析的方法,本篇继续来分析源同步输入接口,对于源同步输入时序约束 ,有以下三个方面需要约束:
1、时钟约束,用于去定义源同步接口所用的时钟;
2、输入输出延迟约束;主要是告诉fpga 输入的时钟和数据之间的时间关系;
3、时序例外,确保有效的时序路径进行时序分析,无效的时序路径不进行时序分析。
在FPGA内部 ,用来捕获输入数据的时钟 可以是外部器件直接输入的时钟,也可以是外部器件输入的时钟经过锁相环产生的时钟。至于实际使用时,可以根据接口类型和时序要求去决定究竟用哪种时钟方式
当是以下三种源同步输入时,用PLL生成时钟:
1、边沿对齐的SDR或DDR(创建时钟相位偏移使得能在数据有效窗口的中间去锁存数据);
2、高速的源同步输入;
3、精确调整时钟与数据间的相位关系。
但是以下源同步输入时,可以直接用源同步输入时钟:
1、中心对齐的SDR或DDR;
2、低速的源同步输入。
图一
源同步接口是寄存器到寄存器间的数据传输模型(图一),只是一个寄存器是在外部器件那边,一个是在fpga里。输入fpga的源同步时钟(input clock),是由外部器件产生的。所以你必须创建一个时钟来描述源同步接口输入fpga的时钟特性(比如时钟的周期,相位等)。同时还需要创建一个虚拟时钟来表示外部器件用来发送数据的时钟(Virtual clock)。 如果用FPGA的源同步输入时钟直接作为采样时钟时,也可以不创建虚拟时钟,直接用输入时钟来进行约束。
下面是几种常用的输入时钟约束方式:
1、输入时钟数据边沿对齐 (图二)
图二
对于输入时钟数据边沿对齐的输入,可以用PLL将输入时钟移相90°,使得时钟数据在fpga里中心对齐。这样每个时钟来时,采样的数据就不容易出错了。
时钟约束指令如下,第一条是创建虚拟时钟,周期是100Mhz,第二条是创建PLL生成的时钟约束,生成的时钟有90°的相位偏移。
2、输入时钟数据中心对齐(图三)
由于输入时钟数据已经是中心对齐,所以,时钟经过锁相环 不产生相位偏移。
图三
约束指令如下,第一条是创建虚拟时钟约束,第二条是对输入FPGA的时钟进行约束,其相对于数据有90°的偏移。所以waveform 是{2.5 7.5}而不是{0,5}。第三条是对经过锁相环产生的时钟进行约束。
3、输入时钟数据中心对齐,输入时钟直接作为fpga寄存器捕获数据的时钟 (图四)
图四
约束指令如下,这条与上面的第二条输入时钟数据都是中心对齐的,都可以用,只是这条没经过锁相环而已。上面第二条经过锁相环但没有相位偏移,所以没什么区别。
下面介绍源同步输入接口的输入最大最小延迟约束方法
输入约束指令格式是: set_input_delay -clock -max (min) [get_ports “”] -add_delay ;即给出 输入时钟跟输入数据间的时间关系。
对于源同步输入约束,有“System-centric”和”FPGA-centric”两种方法。
1、”System-centric”:即以整个系统为中心进行输入约束,它以外部器件,fpga,它们间的走线构成一个整体,当以系统为中心进行约束时,需要考虑外部器件与fpga间 数据和时钟的走线延时,时钟到输出延时,以及外部器件的建立保持时间,Tco等参数,模型如图五所示:
图五
对于”System-centric”有两种方式去获得输入最大最小延迟值:
一.用外部器件的tco进行输入延迟约束;
(1)用外部器件的tco进行输入延迟约束,如果外部器件的tco是跟输出时钟相关,如图六所示。那么就可以直接利用tco max和tco min来计算输入延迟的最大最小值。
图六
(2)如果外部器件的tco是跟输入时钟相关,如图七所示,那就需要通过计算来得到tco和tco min的值进而去计算输入的最大最小延迟值。
图七
tcomax=tcomaxDATA-tcominCLOCK
tcomin=tcominDATA-tcomaxCLOCK
当知道了tco和tcomin后就可以来计算输入的最大最小延迟值了,公式如下所示。
最大输入延迟 :即数据从外部器件到fpga的最大路径延迟+外部器件的tco-最小的时钟路径延迟
最小输入延迟:即数据从外部器件到fpga的最小路径延迟+外部器件的tco-最大的时钟路径延迟
最后写成sdc约束指令:
注意:下面约束的参考时钟都是虚拟时钟。
SDR:即单沿发送数据,一个时钟周期内的上升沿或者下降沿发送数据。下面Example 40 42是指上升沿发送数据,下降沿的话需在get ports前加上 -clock fall表示下降沿
DDR:即时钟上下沿都发送数据
二.用外部器件的tsu,th进行输入延迟约束
如果知道外部器件的数据发送建立,保持时间则可以用建立保持时间去设置输入延迟
(1)输入最大延迟值计算:即数据信号最慢到达fpga,而时钟信号最快到达fpga。用数据路径延迟的最大值+UI-外部器件的建立时间-时钟的最小路径延迟 ,其中UI代表一个时钟周期。
(2)输入最小延迟值计算:
同样最后用sdc约束指令描述输入最大最小延迟如下:
SDR:
DDR:
”FPGA-centric”:即以fpga为中心建立输入输出延迟约束。只需要知道FPGA的一些参数就能对输入时序进行约束,比如fpga的建立保持时间,或时钟数据偏斜。而不需要知道除FPGA外的任何参数可以用(1)建立保持时间;(2)最大数据偏斜 两种方式来得到输入最大最小延迟值。
一.建立保持时间:当你的fpga源同步输入接口有建立保持时间要求,你可以根据建立保持时间要求计算出相应的最大最小输入延迟。
用输入fpga时钟作为参考进行输入延迟约束,当是SDR时,unit interval=时钟周期,当是DDR时,unit interval=时钟周期/2,图八是一个DDR输入时钟和数据关系:
图八
写成SDC约束指令如下:
当输入时钟与数据是中心对齐时,可以用虚拟时钟作为参考时钟进行约束,时钟与数据关系如图九所示:
图九
从图九中可以看出:
输入时钟与输入数据是中心对齐方式;
输入时钟跟输入数据有一个90°的相位关系;
虚拟时钟没有相位偏斜。
由于虚拟时钟跟输入时钟有90°的相位差,所以用虚拟时钟作为约束的参考时钟时,其最大最小延迟值应加 上移相时间(如90°则值为时钟周期÷4)。
二 最大数据偏斜
图十
用虚拟时钟作为输入延迟约束的参考时钟,使得“FPGA-centric”约束非常容易。因为输入最大最小延迟即等于数据相对于时钟的正负偏斜值
input Max Delay= UI(单元间隔)-Setup=正偏斜
input Min Delay= Hold=负 偏斜
SDC约束指令如下:
即使虚拟时钟或者输入fpga时钟有相位偏斜,输入最大最小延迟也还是等于正负skew,不会改变。