OFFSET 的意思是偏移。对于同步时序电路来讲,数据和时钟之间的偏移量是必需要关注的。OFFSET IN和OUT分别对应的是输入和输出FPGA数据和时钟之间的偏移关系,本文将分析这一种关系。阅读本文前须要对时序收敛的基本概念和创建、保持关系有必定了解,这些内容能够在时序收敛:基本概念,创建时间和保持时间(setup time 和 hold time)中找到。html
系列目录 ui
时序收敛:基本概念spa
创建时间和保持时间(setup time 和 hold time)3d
OFFSET约束(OFFSET IN 和OFFSET OUT)orm
Clock Skew , Clock uncertainly 和 Periodhtm
特殊约束From Toblog
简单来讲,以输入约束为例 OFFSET约束指定的是rem
数据在采样时刻以前多少时间有效(OFFSET BEFORE),以及有效时间是多少(VALID)
Input delay指的是
进入到FPGA内部的数据跳变沿可能的最先时刻(min),和最后时刻(max),即max-min是数据不稳定的时间。
譬如(UG911)
UCF OFFSET = IN 1ns VALID 2ns BEFORE clka;
XDC set_input_delay -clock clka -max 9 [all_inputs]
set_input_delay -clock clka -min 1[all_inputs]
Note: This assumes the clock period is 10 ns
Offset 约束定义了外部时钟pad和与之相关的输入、输出pad之间的相对关系。这是一个基础的时序约束。Offset定义的是外部之间的关系,不能用在内部信号上。
OFFSET约束写起来仍是比较简单的,如
OFFSET = {IN|OUT} offset_time [units] {BEFORE|AFTER} clk_name [TIMEGRP group_name];
offset_time 写多少取决于数据之间所须要的相对关系,另外,弄懂XST是如何分析时序关系也是十分重要的。
下面的式子是UG612中指出的时序要求须要知足的关系,看着可能不是太明白,可是结合例子分析就容易理解了。下面的式子给出的要求是Toffset_IN_BEFORE - (TData + TSetup - TClock) > 0 ,实际上就对应着slack 大于0 。 具体表述以下(分别为创建时间和保持时间要求)
TData + TSetup - TClock <= Toffset_IN_BEFORE
where
TSetup = Intrinsic Flip Flop setup time
TClock = Total Clock path delay to the Flip Flop
TData = Total Data path delay from the Flip Flop
Toffset_IN_BEFORE = Overall Setup Requirement
TClock - TData + Thold <= Toffset_IN_BEFORE_VALID
where
Thold = Intrinsic Flip Flop hold time
TClock = Total Clock path delay to the Flip Flop
TData = Total Data path delay from the Flip Flop
Toffset_IN_BEFORE_VALID = Overall Hold Requirement
文档中还提到了Hold time的需求,创建时间和保持时间在上文有介绍。UG612这里是个大坑,给出了这个式子以后就再也没有讨论过hold time了。以前的WP327(WP327部份内容错误,UG612有修正)却是提到了这一点
“The OFFSET IN requirement value is used as a setup time requirement of the FPGA during the setup time analysis. The VALID keyword is used in conjunction with the requirement to create a hold-time requirement during a hold-time analysis. The VALID keyword specifies the duration of the incoming data valid window, and the timing analysis tools perform a hold-time analysis. By default, the VALID value is equal to the OFFSET time requirement, which specifies a zero hold-time requirement. See Figure 6."
这一段介绍了hold time 的处理方法。若是指定了数据的VALID 时间,那么hold time 的requirement 是肯定的,这样可以进行具体的分析;若是没有肯定,那么默认认为hold-time 的requirement 是0 。
Simple Example
Slack: -0.191ns (requirement - (data path - clock path - clock arrival + uncertainty))
Source: reset (PAD)
Destination: my_oddrA_ODDR_inst/FF0 (FF)
Destination Clock: clock0_ddr_bufg rising at 0.000ns
Requirement: 3.000ns
Data Path Delay: 2.784ns (Levels of Logic = 1)
Clock Path Delay: -0.168ns (Levels of Logic = 3)
Clock Uncertainty: 0.239ns
上面的例子首先告诉咱们,OFFSET_IN约束是3ns,也就是说对于输入数据在采样时钟沿前3ns有效。那么在触发器上可否正确采样取决于:触发器采样时钟延迟了-0.168,故多提早了-0.168ns;data path delay是2.784,故数据延迟2.784;源、目的端时钟关系为0,不变;不肯定性带来坏的影响,有
slack = 3 + (-0.168) -2.784 - 0.239 +0;
Phase-Shifted Example
Slack: 2.309ns (requirement - (data path - clock path - clock arrival + uncertainty))
Source: reset (PAD)
Destination: my_oddrA_ODDR_inst/FF0 (FF)
Destination Clock: clock90_bufg rising at 2.500ns
Requirement: 3.000ns
Data Path Delay: 2.784ns (Levels of Logic = 1)
Clock Path Delay: -0.168ns (Levels of Logic = 3)
Clock Uncertainty: 0.239ns
分析过程相似,不过咱们注意到在定义的时候,相对值是clock,可是触发器采样的时钟是clk90(Destination)。这也就意味着咱们多了一个clock arrival time,这个值是2.5ns。其他和上面的例子是同样的。
那么回到以前的式子Toffset_IN_BEFORE - (TData + TSetup - TClock) > 0 ;分析报告中的requirement 实际上就是Toffset_IN_BEFORE,data path包括了TData 和 TSetup,TClock实际上就是clock arrival 和clock path delay。这个式子是没有考虑到clock uncertainty 的。
在结束这一节以前,还要说起一个很奇怪的,不知道为什么要存在的概念。以前没有特别说明,对于OFFSET IN约束来讲,写法大抵是
OFFSET = IN 3ns BEFORE clock;
采用before是很天然的,由于咱们一直在分析创建时间,创建时间就是偏偏是采样沿以前。OFFSET IN还能够这样写,即(等价的)
OFFSET = IN 2 ns AFTER clock_pad
此时对应的须要知足的条件是
TData + TSetup - TClock <= TPeriod - Toffset_IN_AFTER
where
TSetup = Intrinsic Flip Flop setup time
TClock = Total Clock path delay to the Flip Flop
TData = Total Data path delay from the Flip Flop
TPeriod = Single Cycle PERIOD Requirement
Toffset_IN_AFTER = Overall Setup Requirement
通常采用OFFSET约束的时候还须要指定数据有效的时间,譬如
OFFSET = IN 2 ns VLAID 4ns BEFOR clock_pad
指数据在采样沿到达前2ns有效4ns。
OFFSET OUT 约束是FPGA到下游的器件的时钟、数据之间的相对关系,具体能够用下图来表示。具体约束要求,下游器件接收到的数据会在时钟沿以后多久以内到达。那么,根据这一幅图能够得出Clock to Out = clock_delay + clock_to_out + data_delay + clock_arrival。这是由于FPGA内部的触发器的时钟延迟了clock path,同时因为触发器的触发时间,FPGA触发器输出就延时了clock_delay+clock_to_out时间,同时数据还有延迟。另,图中给出的是一种状况,这种状况下clock_arrival = 0,最后的结果还须要加上clock_arrival. (注:下图给出的是系统同步方式,图没有画好)
根据这一相对关系,能够得出FPGA时序须要知足的关系
TQ + TData2Out + TClock <= Toffset_OUT_AFTER
where
TQ = Intrinsic Flip Flop Clock to Out
TClock = Total Clock path delay to the Flip Flop
TData2Out = Total Data path delay from the Flip Flop
Toffset_OUT_AFTER = Overall Clock to Out Requirement
具体的分析和OFFSET IN的相似,这里再也不重复,一样给出几个例子。
例子分析
Simple Example
Slack: -0.865ns (requirement - (clock arrival + clock path + data path + uncertainty)) Source: OutD_7 (FF) Destination: OutD<7> (PAD) Source Clock: clock3_std_bufg rising at 0.000ns Requirement: 3.000ns Data Path Delay: 3.405ns (Levels of Logic = 1) Clock Path Delay: 0.280ns (Levels of Logic = 3) Clock Uncertainty: 0.180ns