tsu : setup time , 建立时间 , 指在有效的时间边沿信号到来之前, 端口D上数据持续稳定不变的时间;
建立时间要求
建立时间要求, 指的是寄存器能够正常工作, 在有效时钟边沿到来之前,D端口的数据至少需要持续保持稳定不变的时间;
寄存器正常工作所允许的最小tsu , 可以为零 或者负数;
建立时间余量
建立时间余量 = tsu - 建立时间要求 , 如果建立时间余量大于或等于0,表示能够正常工作, 反之不然;
th : hold time , 保持时间 , 与建立时间相对应 , 保持时间是指有效的时钟边沿信号到来之后, 数据端D保持持续稳定不变的时间;
保持时间要求
寄存器能够正常工所允许的最小th , 建立时间可以为零乃至负数 , 与寄存器的类型和具体实现结构有关;
保持时间余量
保持时间余量 = th - 保持时间要求 ; 保持时间余量大于或等于 0 ; 则表示寄存器能够正常工作;
tco : clcok to output delay ;
当寄存器clk 端口的时钟信号与D口的数据信号的时序关系满足建立时间和保持时间要求时 , tco指从时钟有效边沿到达寄存器时开始, 输出 Q 上稳定得到 D 端采样的时间;
理想时钟的稳定周期T , 但是一般时钟都不甚理想,通过以下参数进行描述:
时钟精度
频率$ f_0$的时钟信号, 实际在电路中为
f
1
f_1
f1 ,
时间精度
=
Δ
∣
f
0
−
f
1
∣
f
0
时间精度 = \frac{\Delta|f_0 - f_1|}{f_0 }
时间精度=f0Δ∣f0−f1∣
时钟漂移
时钟频率 f 0 f_0 f0的时钟信号 ,但实际电路中频率一般为 f 1 < f 0 < f h f_1 < f_0< f_h f1<f0<fh,此类长期可观测的变化称时钟漂移
时钟抖动 , 比时钟漂移更短期的时钟抖动,用来描述时钟信号有效边沿到来的周期不确定性 ;
时钟歪斜也即时钟脉冲相位差 , 指时钟信号到达各个寄存器的路径不同, 路径不同边沿到达时间就不同, 这个时间差即为 clock skew
slew rate
SR, 电压转换速率, 压摆率 , 压摆率越大, 可以理解为眼图的眼睛越大;
以逻辑锥为基础划分上述电路
只要一个逻辑锥底面上的寄存器能够正常工作, 那么其内部各个信号的时间延迟就不会与前级的逻辑锥有任何关系,即寄存器可以打断时延路径;
设时钟边沿时刻 t x t_x tx 下一边沿时刻 t x + T t_x + T tx+T
顶点寄存器理想 t s u = T t_{su}= T tsu=T , 但是肯定会存在一个D口的时间偏差 t d t_d td, 时钟偏差 t c t_c tc
那么设寄存器建立时间为
t
s
u
r
q
t_{surq}
tsurq, 公式
(
2
)
(2)
(2)必须被满足
t
s
u
=
(
t
x
+
T
+
t
c
)
−
(
t
x
+
t
d
)
=
T
+
t
c
−
t
d
≥
t
s
u
r
q
t_{su} = (t_x + T + t_c ) - (t_x + t_d) = T + t_c - t_d ≥ t_{surq}
tsu=(tx+T+tc)−(tx+td)=T+tc−td≥tsurq
此处原理分为多种工况, 工具的计算策略等待后续在进行分析;
t s u t_{su} tsu 计算的T为常量, 那么一般会取多次连续时钟下的 t c − t d t_c - t_d tc−td的最小值为一般建立时间;
单时钟域分析
基于单时钟边沿事件设计的FPGA程序在明确时钟周期, 占空比, jitter 之后按照逻辑锥的思路进行分析;-
多时钟域时序分析
首先明确, 不同时钟域之间无需进行时序分析, 因为其时钟周期, 相位不同不存在分析必要, 跨时钟的处理需要设计保证; 同时两个无关的时钟信号, 工具是无法推断各个寄存器之间的时间到达差,所以工具也无法分析; 如时钟具备一定相关性则如下:
同源时钟的时序分析
时序分析工具分析此类情况的先决条件是指明源时钟信号的各项参数;
典型应用于DDR等双边沿触发的时序逻辑中,向工具指明时间参数, 时序分析工具会自动分析两个边沿逻辑间的跨时钟时序;
其余状况 比如经过逻辑产生的时钟与源时钟的时序分析均类似;
但是会存在一种状态时钟同源但是相位差异很大导致时序分析不过, 但是单独时钟域里又必须进行时序分析,那么如下 :
两个时钟信号同源但不是同一个时钟信号, 那么此时就需要分别指明各自的时间参数,且时序参数之间不具备相关性以达到阻止工具分析其之间的跨时钟的目的; 同时也可以选择直接false掉此条时钟路径;
同理,PLL, DCM的时序分析一般情况下编译器对这些衍生时钟关系是已知的, 一切会由编译器自动推断, 在系统层面根据时钟频率做好跨时钟处理即可, 但是当PLL的衍生时钟之间频率接近时,我们需要flase这些路径, 因为如不告知编译器其会进行时序报错;
FPGA验证时在编译之后介入时序分析 , 那么编译器就无法推断姿势中时间参数, 因此在需要跨时钟分析时,需要指定各个时钟的各项参数, 以及子父时钟之间的相关性, 如不需要在指明各个时钟的各项参数之后让各项参数之间不具有相关性就可完成目的;
相关时钟的时序分析
外部时钟芯片产生的多路时钟 ,以FPGA的视角来看其就是两个无关的信号; 但因其具有相关性 ,那么称这些时钟为相关时钟;
相关时钟的跨时钟域分析并不会默认执行,而需要向编译器报告相关时钟时间参数, 并让时间参数具有一定的相关性;
数据用作时钟的时序分析
时序分析工具无法推测该类信号的时间参数,这类时钟所驱动的时钟域不会得到时序分析;
典型指 门控时钟 和 行波时钟;
门控时钟本质上也是可以按照逻辑锥策略进行逻辑数据输出的时间参数推测,因为其是将组合逻辑产生的数据作为时钟 前提是其组合逻辑的输入是一个有效时钟信号,如没有就需要手动指明该组合逻辑的时钟信号的各项时钟参数;
行波时钟是将寄存器的输出用作时钟,默认情况下行波计数器的输出时钟不会得到分析,因为无法推测频率, 需要指明时间参数;
异步逻辑时序
默认不对异步逻辑进行时序分析, 因为逻辑锥的输入条件不充分;
异步数据在设计上进行两级采样等操作保证数据准确性, 异步复位采用异步复位同步化来让时序分析工具对寄存器的异步复位端进行分析;
接口时序不具备完整逻辑锥结构, 那么就需要搭建逻辑锥;
功能仿真
接口时序具有强功能性, 功能仿真的结果为不考虑时间延迟的理想情况 , 其结果 + 时间延迟翻出就可推测真实时序;
纯输入接口
能否正确接受其他接口的输出
纯时钟输入接口
外部时钟芯片的输出管脚, 不对此类管脚做时序分析, 但是时钟端口为内部逻辑时序分析的基础, 因此需要向工具精准报告各项时间指标;
纯同步输入接口
指外部设备同步输出数据和时钟 , FPGA视角为用该时钟采集该数据;
针对上述接口,需要指明数据端口处的每个采样点的稳定周期和时钟端口处时钟信号的相对位置, 工具会自动完成时序分析;
纯异步输入接口
异步串口为代表的异步口须在设计上保证数据采样正确性, 因此无需进行时序分析; 数据编码, 前导码, 尾码等方式
同步输入异步采集
过采样的方式同时采集数据和时钟;
时钟的采集检测到边沿即可, 但是D会出现一些异常: 数据边界的界定 , clk和D的时间偏差, clk本身的连续性, D的采样率不恒定等情况;
一般在clk频率D采样率较低的情况下上述异常可以忽略不计,在严格的FPGA验证领域可能需要详细分析;
纯输出接口
输出能否满足其他接口接受时的要求;
纯时钟输出接口
FPGA的输出时钟信号给外部芯片供钟, 必须满足外部芯片对时钟信号的要求 : 时钟频率, 占空比等参数;
延迟不会导致时钟信号的畸变 , 因此功能仿真结果完全可以说明结果;
纯同步输出接口
FPGA同步输出数据和用于采集数据的时钟信号;
首先我们明确该数据的生成来自于该时钟或其同源时钟(这种情况比较常见);
其次需要将外部芯片对数据, 时钟关系的需求转化为数据端口相对与时钟端口敏感边沿的建立, 保持时间要求,时序工具便可以自动完成时序分析;
纯异步输出接口
纯异步输出接口指FPGA芯片仅对外输出数据信号 , 系统保证数据准确性, 无需约束;
异步生成同步输出
纯同步输出接口的数据和时钟可以由一个高频内部时钟产生, 这样同步输出所驱动的外部逻辑和产生该接口信号的内部逻辑便属于不同的时钟域;这类同步输出的处理方式称为异步生成同步输出;
理想无延迟的情况下, D 和 clk之间的关系可以由功能仿真得出;
可完全拆解复用接口
内部信号方向不统一的接口;
拆分内部信号为单一类型, 在按照上述类型进行分析, 对于inout信号, 可以拆解为两个信号,一个输入端口 一个输出端口, 并做两次时序分析;
不可完全拆解复合接口
在剥离简单接口后, 剩余接口仍旧同时包含输入及输出端口 ,
纯组合逻辑接口
没有时序单元主要考虑Din 到 Dout的最大和最小路径延迟是否满足需求, 为达到这个目的, 需要在Din的输入端和Dout的输出端(即接口电路的两侧)按照Din和Dout的位宽虚拟出 t c o t_{co} tco的寄存器和skew为0的时钟, 之后按照逻辑锥的思路求解当前同步逻辑的 t s u t_{su} tsu 和 t h t_h th, 则 最大延迟为 T c l k − t s u T_{clk} - t_{su} Tclk−tsu; 最小延迟为 t h t_h th;
输入, 输出直接共用时钟接口
数据的接收方为数据的发送方提供用于输出数据的时钟信号并使用该时钟信号进行数据接收;
此时必须通过时序分析得到接收方数据相对采集时钟的关系, 用以保证数据准确性;
FPGA接收
需要明确输入时钟(本质上也是输出时钟)与内部时钟的关系, 即clk_in的源到FPGA相应输出pin的延迟;
clk_in的源到FPGA相应输出pin的延迟可以将clk_in看做数据, 在两侧虚拟寄存器, 令skew = 0, 数据路径延迟 = 0,则逻辑锥的 t s h t_{sh} tsh即为延迟
假设发送端data会在本次clk后10ns稳定, 下次clk下降沿5ns后改变, T c l k i n T_{clkin} Tclkin = 50ns, clk_in的源到FPGA相应输出pin的延迟8 ns;
则data相对于clk_in的 t s u = 25 − 20 − 8 = 7 n s t_{su} = 25 - 20 - 8 = 7ns tsu=25−20−8=7ns ; t h = 25 + 5 + 8 = 38 n s t_h = 25 + 5 + 8 = 38ns th=25+5+8=38ns;
之后问题会转化纯同步输入接口;
FPGA发送
此时关心的是从clk输入pin到data输出pin脚的最大, 最小路径延迟;
只需要在外部芯片虚拟一组寄存器即可得到clk到data之间的最大, 最小路径延迟;令所有虚拟寄存器的skew等于0 ,只要指clk的时间参数,即可得出该逻辑电路的建立时间和保持时间,并且其就是最终所需的建立和保持时间;
假设最大延迟为20ns, 最小延迟为10ns, clk周期为50ns, 则data相对clk的 t s u = 30 n s ( 50 − 20 ) t_{su} = 30ns (50 - 20) tsu=30ns(50−20); t h = 10 n s t_h = 10ns th=10ns; data稳定周期为 40 n s ( 30 + 10 ) 40ns(30 + 10) 40ns(30+10);
输入, 输出间接公共时钟接口
数据的接收方使用本地时钟接收发送方传来的数据, 但是其提供给发送方的却不是本地时钟信号, 而是本地时钟域所产生的数据信号;
此接口FPGA只能作为接收方 ;场景为FPGA输出clK时钟给外部chip寄存器的D口, chip输出时钟clk_in向FPGA输出时钟的寄存器和双方数据寄存器供钟;
理想情况下可以通过仿真的clk的有效边沿与clk_in以及data的有效边沿之间的余量,以此计算保持时间和建立时间, 但是考虑延迟以及jitter的存在必须考虑clk_in和clk之间的最大最小延迟和data到FPGA内部寄存器的最大最小d_clk路径差;
同理在双边都进行虚拟寄存器, 令虚拟寄存器的时钟skew为0 , 将clk_in和clk信号之间最大最小延迟转化为纯同步输出接口;将d_clk路径差转化为纯同步输入接口;先计算输出接口得到clk_in和clk之间的延迟,即可推断出data和clk_in之间的延迟,之后在求解纯同步输入接口;
本文为个人读书笔记整理,仅作个人理解之用