对于FPGA的时序分析主要包括管脚和内部寄存器的时序分析,目前这边刚看了一点时序分析的资料,总结在这里,希望能够对大家也带来帮助。
时序分析目前主要针对同步时序逻辑的静态时序分析(STA),主要涉及的概念整理如下大概有(后面有漏回来补充):
- 时钟频率
- 建立时间
- 保持时间
- 时钟相位偏斜(skew)
- 建立时间门限
- 保持时间门限
- 组合逻辑延迟
- 寄存器固有延迟
- 数据到达时间
- 建立时间余量
- 保持时间余量
概念的意义后面会介绍
经典的寄存器到寄存器时序分析图:
Com 表示combitional 组合逻辑
时序路径:
粉红色表示两条时钟的路径,红色表示数据路径;
时钟频率:时钟频率就是时钟的变化速率表示为Fclk,周期表示为Tclk
时钟相位偏斜(skew):时钟从管脚或者从PLL输出到达第二个寄存器(reg2)和第一寄存器(reg1)的时间差为时钟偏斜,实际中时钟偏斜可以是正值也可以是负值(寄存器离时钟源位置或时钟线buf数量决定),表示为Tskew;
寄存器固有延迟:数据D_reg1在时钟clk_reg1采样到Q_reg1输出有一个时间延迟,这个延迟跟工艺有关系,器件选定那么这个值就是确定的,是已知量,表示为Tcq
组合逻辑延迟:数据从Q_reg1到D_reg2经过组合逻辑,组合逻辑存在传输延迟,传输延迟的大小跟逻辑量(门的数量和级数)存在正相关,表示为Tcom
Td:为了使后面的图看起来简单一点,目前将D_reg1采到数据到D_reg2数据输入的延迟记为Tdelay(Td)=Tcq+Tcom;
发射沿(launch):clk_reg1的上升沿
捕获沿(capture):clk_reg2的上升沿
将上面的概念落到经典的两级寄存器传输图上:
Tsckew用deltaT表示了
数据到达时间:数据到达时间是指数据到达D_reg2端口的时间;
建立时间:数据到达时间到捕获沿的时间,表示为Ts
保持时间:数据从捕获沿到下一级寄存器数据(D端口)端口的时间,表示为Th
为使捕获沿能够准确的采到数据,那么就要求数据在捕获沿之前和捕获沿之后保持稳定的一段时间,这个时间的最小值就是建立时间门限(Ts_th)和保持时间门限(Th_th),建立时间门限和保持时间门限是器件的固有属性,跟器件工艺有关,是已知量;
将上面的概念落实到时序图:
从时序图,现在很容易看出来:
Ts = Tclk-Td+Tsckew
Th=Td-Tsckew
建立时间余量:建立时间和建立时间门限的差值,表示为Ts_slack
保持时间余量:保持时间和保持时间门限的差值,表示为Th_slack
从时序图,现在很容易看出来:
Ts_slack = Ts - Ts_th;
Th_slack = Th - Th_th;
那么,接下来用这些概念怎么来解决时序问题呢?
两种情况:
- 建立时间余量不足违例
建立时间余量不足违例从上面推的式子来看,最大问题可能在Td过大,而Td中寄存器固有延迟是固定的,所以是中间组合逻辑延迟太大,这种情况可以中间插寄存器来打断大延时的时序路径:这个组合逻辑延迟8ns,加一级寄存器将这个大的组合逻辑分为两块延迟小的组合逻辑优化建立时间余量;
两级大概表示为3ns和5ns,实际可能会更小;
如果设计时序(通信协议,握手等)已经跟下游或者上游逻辑固定好了,不能将数据再延迟一拍,那么能做的只能优化这块组合逻辑;找到组合逻辑延迟最长的路径(关键路径,这个关键路径工具一般会报)如是很深的if…else…可以想办法平铺开用case等,如果是很长的进位链(位宽很大的加减法器,乘法器)可以考虑改为小位宽或者调用IP; - 保持时间违例
目前遇到保持时间违例的情况比较少,因为时钟频率都不是很快,数据有一定的延迟便可以满足,但如果时钟频率过快,数据延迟又很小可能会出现;说的不一定对
以上是目前这边对时序的一点理解,有不对的欢迎留言一起讨论;