一、基本概念
01.什么是时钟抖动
时钟抖动 ,Clock Jitter,是相对于理想时钟沿实际时钟存在不随时间积累的、时而超前、时而滞后的偏移称为时钟抖动(时钟脉冲宽度发生暂时变化,也就是T cycle时钟周期或大或小)。
02.什么是时钟偏差
时钟偏差 , Clock Skew,是指同一个时钟域内的时钟信号到达数字电路各个部分(一般是指寄存器)所用时间的差异。
时钟偏差分为两类:正偏差和负偏差。
当信号传输的目标寄存器在接收寄存器之前捕获正确的时钟信号,电路发生正偏差(也就是时 钟布线方向与数据流水方向一致);
数据方向:RegA → RegB → RegC
时钟方向:RegA → RegB → RegC
时钟方向:RegA → RegB → RegC
反之当信号传输的目标寄存器在接收寄存器之后捕获正确的时钟信号,电路发生负偏差(也 就是时钟布线方向与数据流水方向相反)。
数据方向:RegA → RegB → RegC
时钟方向:RegC → RegB → RegA
时钟方向:RegC → RegB → RegA
03.什么是Uncertainty
Clock Uncertainty 的概念比较好理解,就是 时钟的不确定性 。时钟的不确定性主要是由Clock Skew 和 Jitter 构成。
Clock Uncertainty = Clock Jitter + Clock Skew
一般标准的时序约束文件中,都需 要加 Clock Uncertainty 的约束,这个约束是为了让时序分析更贴近真实的电路设计。 对于 Uncertainty 的设置,每种工艺,或者每种设计来说,都不尽相同。一般来说, 频率较高的时钟,我们可以设置相对较小的 Clock Uncertainty;而频率较低的或者经过分频的时钟,我们可以把 Clock Uncertainty 加大一些。
04.什么是发起沿和采样沿
寄存器发送数据和接收数据都是需要在时钟边沿进行的,因此对寄存器来说,都有一个发起沿和一个采样沿。
发起沿 ,英文名为 Launch edge,是发送数据的时钟边沿,通常选择上升沿。
采样沿 ,英文名为 Capture edge,是采样到该数据的时钟边沿,通常也是上升沿。
通常情况下这两个边沿会有一个时钟周期的差别。
rega和regb使用同一个时钟信号,rega在Launch edge发送数据,regb下一个时钟周期的 Capture edge采样到rega送入的数据,rega到regb中间可能还有一些组合逻辑。 也就是说时序电路里面,寄存器都是按照时钟节拍进行工作的。 也就是说rega的数据送到regb的D端,必须要在一个时钟周期内到达,否则就会出现regb采样失败的问题,因为regb采样时不看rega数据是否已到达,regb采样的时候是只要有Capture edge边沿就进行采样。
05.什么是同步电路和异步电路
简单来说,FPGA 设计中寄存器全部使用一个时钟的设计是 同步设计电路 ,FPGA 设计中寄存器使用多个时钟的设计是 异步设计电路 。
06.什么是建立时间和保持时间
建立时间 , Setup Time,缩写是 Tsu,即在时钟上升沿之前数据必须稳定的最短时间。 若不满足 setup time,数据无法进入寄存器,也就是说寄存器的数据采样会失败。
保持时间 ,Hold Time,缩写是 Th,即在时钟上升沿之后数据必须稳定的最短时间。若不满足 hold time,数据也无法进入寄存器,也就是说寄存器的数据采样 采样也会失败。
总体来说,就是 寄存器的采样需要同时满足建立时间和保持时间 ,这两个值是寄存器成功采样的前提。
二、时序分析的基本公式
07.时序分析的基本路径
时序分析的基本路径包括 4 种:
⚫ 管脚输入和寄存器之间的路径(即 pin2reg)
⚫ 寄存器和寄存器之间的路径(即 reg2reg)
⚫ 寄存器和管脚输出之间的路径(即 reg2pin)
⚫ 管脚输入和管脚输出之间的路径(即 pin 2pin)
下图完整的展示了 4 种时序路径,下图主要包括三个芯片器件,分别是 Device A,FPGA Device 和 Device B,这三个芯片可能位于一个电路板上面,也可以位于不同的电路板上面,但是三个芯片都是使用的同一个时钟,即图中的 Board Clock。
从上图我们可以看出
管脚输入和寄存器之间的路径 (即 pin2reg): 从 device A 的时钟到 FPGA 的第一级寄存器的输入端口,这个部分包括 3 个延迟, 分别是 Tco( 时钟到寄存器输出延时 ),Input Delay( PCB 板的输入走线延迟 )和 Internal Delay( FPGA 内部的输入走线延迟 )。
寄存器和寄存器之间的路径 (即 reg2reg): 两个同步元件之间的路径(rega 到 regb 蓝色),这个部分包括 2 个延迟,分别是 Tco( 时钟到寄存器输出延时 )和 Data Path Dela( FPGA 内部的组合逻辑和数据走线延迟 )。
寄存器和管脚输出之间的路径 (即 reg2pin): 最后一级寄存器到 device B 数据端口的路径(黄色),这个部分包括 3 个延迟,分别是 Tco( 时钟到寄存器输出延时 ),Internal Delay( FPGA 内部的输入走线延迟 )和 Output Delay( PCB 板子的输出走线延迟 )。
管脚输入和管脚输出之间的路径 (即 pin 2pin): 端口到端口的路径(dinb 到 dinb 绿色),这个部分包括 1 个延迟,即 Data Path Delay( FPGA 内部的组合逻辑和数据走线延迟 )。
我们要关注的这些时序路径的起点称为 start point,时序路径的终点称为 end point。
08.数据到达时间和时钟到达时间
数据到达时间(Data Arrival Time) :数据在发送沿发送之后,经过多长时间会到达接收寄存器的数据端口,即到达 regb 的 D 端口的时刻,这个时刻就是数据到达时间。
我们需要选择一个参考(基准)时间点。通常选择 launch edge 作为零时刻基准 点。数据经过Tco时间,到达 Q 端口。 数据从 Q 端口,要经过组合逻辑,以及布线的线延时才能到达接收端的 D 端口的 (Tdata)。
数据到达时间 Data Arrival Time = 启动沿时间 + Tclka + Tco + Tdata; 选择 launch edge 作为零时刻基准点。
时钟到达时间(clock Arrival Time):
选择 launch edge 作为零时刻基准点。其实是 launch edge 加上1个时钟周期就是采样沿间。
时钟到达时间 Clock Arrival Time = 采样沿时间 + Tclkb;
09.建立时间的裕量
建立时间的裕量 ,英文为 Setup slack。
建立裕量为正值说明两个寄存器有合格的建立关系,建立裕量为负值说明两个寄存器建立关系不满足,会导致采样出错。
上图是寄存器建立关系过程,寄存器 reg1 和寄存器 reg2 使用拥有相同属性的时钟源。
首先要获得Clock1的启动沿受延迟的影响,而时序分析模型用了一条公式评估启动沿受Tclk1 + Tco + Tdata 的影响:
数据到达时间 Data Arrival Time = 启动沿时间 + Tclk1 + Tco + Tdata
= 0ns + 3.2ns + 0.2ns + 0.6ns
= 4ns
接下来要获得 Clock2 的锁存沿受延迟的影响。同样时序模型也使用了一条公式评估 锁存沿受 Tclk2 + Tsu 的影响:
数据锁存(读取)时间Data Required Time = 锁存沿时间+ Tclk2 - Tsu
= 10ns + 2ns - 1.4ns
= 10.6ns
最后用数据抵达时间和数据锁存时间取得建立余量:
建立余量 = 数据锁存时间 - 数据抵达(获取|读取)时间
Setup Slack = Data Required Time - Time Arrival Time
= 10.6ns - 4ns
= 6.6ns
其中建立余量6.6ns 是在上图的“蓝色框图的部分”。在这里,建立余量是“正值”,即“reg1 和 reg2 之间的建立关系是合格”。
10.保持时间的裕量
保持时间的裕量 ,英文为 Hold slack。
保持裕量为正值说明两个寄存器有合格的保持关系,保持裕量为负值说明两个寄存器保持关系不满足,也会导致采样出错。
“保持时间”在寄存器的概念中是表示:寄存器在读取某个数据以后,需用一段最小时间来“确保数据锁存”的稳定。
保持关系Hold Relationship 是求出两个寄存器(节点)之间的保持余量的过程。保持关系是指寄存器1 在还没有更新输出之前,寄存器2 用最快速的速度读取从寄存器1 发送过来的数据。
数据保持时间 Data Hold Time = 启动沿+ Tclk1 + Tco+ Tdata + 数据周期时间
= 0ns + 3.2ns + 0.2ns + 0.6ns + 10ns
= 14ns
数据锁存(读取)时间Data Required Time = 锁存沿+ Tclk2 + Th
= 10ns + 2ns + 1.4ns
= 13.4ns
保持余量 Hold Slack = 数据保持时间- 数据锁存(获取|读取)时间
= 14ns - 13.4ns
= 0.6ns
最后取得的保持余量是 0.6ns,这也意味着保持余量是正值,所以寄存器 1和寄存器2之间的保持关系是合格的。
11.多周期路径(Multicycle Paths)检查
在同步逻辑设计中,通常都是按照单周期关系考虑数据路径时序是否满足。但是往往存在这样的情况:一些数据不需要在下一个时钟周期就稳定下来,可能在数据发送后几个时钟周期之后才起作用;一些数据经过的路径太复杂,延时太大,不可能在下一个时钟周期稳定下来,必须要在数据发送后数个时钟周期之后才能被采用。
举个例子:比如乘法器电路,乘法器由于其逻辑实现电路比较复杂,往往需要多个时钟周期才能计算出乘法结果,那么此时如果还是按照单周期路径检查的结果,就会出现虚报时序违规的问题。 不设置多周期路径约束的后果有两种:
1.是按照单周期路径检查的结果,虚报时序违规;
2.是导致布局布线工具按照单周期路径的方式执行,虽然满足了时序规范,但是过分优化了本 应该多个周期完成的操作,造成过约束。过约束会侵占本应该让位于其他逻辑的布局布线资源,有可能造成其他关键路径的时序违规或时序余量变小。
在多周期路径的建立时间(Setup Time)检查中,时序分析软件会按照用户指定的周期数延长Data Required Time,放松对相应数据路径的时序约束,从而得到正确的时序余量计算结果;
在保持时间(Hold Time)检查中,时序分析软件也会相应地延长Data Required Time, 不再按照单周期路径的分析方式执行(不再采用launch edge最近的时钟沿,而是采用latch edge最近的时钟沿),这就需要用户指定保持时间对应的多周期个数。
时序分析软件缺省的Hold Time检查公式是需要用户修改的——针对Setup Time多周期路径的设置也会影响到Hold Time的检查。究其原因,多周期路径是为了解决信号传播太慢的问题,慢到一个周期都不够,所以要把 Setup Time的检查往后推几个周期——扩大Setup Time检查的时间窗口。而Hold Time检查信号是否传播得太快,如果把检查时刻往后推,就缩小了Hold Time检查的时间窗口。
一个易于理解的例子:
上图说明reg1到reg2的数据在两个时钟周期内到达即可,可以设置一个多周期约束。
三.器件时序模型
12.什么是 PVT
PVT 是指芯片工艺(Process)、电压(Voltage)和温度(Temperature)。 PVT 和时序模型关系很紧密,也就是说不同的 PVT 参数,芯片的时序模型都是有差异的。
什么是芯片的 Process corner。Process corner,中文名工艺角。 不同的芯片晶圆和不同的晶圆批次之间,因为掺杂、刻蚀、温度等外界因素导致晶体管参数的变化范围比较大。为了减小设计困难度,需要将器件性能限制在某个范围内,并报废超出这个范围的芯片,来严格控制预期的参数变化。工艺角和这个性能范围相关。
Process corner 一般有三种 Corner 模型:
典型工艺角:Typical corner
快速工艺角:Fast corner
慢速工艺角:Slow corner
Typical 是指晶体管驱动电流是一个平均值;Fast 是指晶体管驱动电流是最大值;Slow 是指晶体管驱动电流是最小值。除了 Process 工 艺 角 外,还 有 电 压 、温度和最 好 /坏 的情况等条 件才组合成PVT(Process、Voltage、Temperature)条件。
电压:1V+10% ,1V ,1V-10%
温度:-40C , 0C, +25C, 125C
时序分析工具会依据仿真需求,使用不同的PVT组合,用于STA 分析,因为实际ASIC/FPGA 芯片也存在不同的PVT组合,每种组合的时序模型是不一样的,因此STA需要分析各种情况下的合。
一般时序分析会涉及到如下三种情况:
最好的条件(Best Case)——速度最快的情况;
最坏的条件(Worst Case)——速度最慢的情况;
典型的条件(Typical Case)——速度介于最快和最慢之间;
这三种情况分别对应如下细节:
BCF(Best Case) :fast process,lowest temperature,high voltage
WCS(Worst Case) :slow process,high temperature,lowest voltage
TYP(Typical Case) :typical process,nominal temperature,nominal voltage
时序分析工具通过 Worst corner 来保证建立时间的时序,通过 Best corner 来保证保持时间的时序。由于一般情况下设计以建立时间违例为主,所以时序分析工具默认使用 slow corner。
13.什么是 Path
Path 是时序分析中非常重要的一个概念,Path就是路径的意思,时序分析一般关注的是时序违例,这些时序违例的路径一般都是由各种path组成的。
Path 通常分为三类:
(1) Clock paths:从Clock Port 或内部生成的clock pin到寄存器Cell的时钟输入Pin。
(2) Data paths:从输入Port到寄存器Cell的数据输入 pin ,或从寄存器Cell的数据输出pin到另一个寄存器Cell的数据输入pin。
(3) Asynchronous paths:从输入Port到寄存器Cell的异步输入pin ,或从寄存器Cell的数据输出pin到另一个寄存器Cell的异步输入pin。
三种 path 如下图所示:
四、时许约束
⚫ 时钟约束
⚫ 时钟约束+时序例外约束
⚫ 时钟约束+时序例外约束+I/O 约束
14.时钟约束
时钟约束是最基本的一个约束,因为 FPGA 工具是不知道你要跑多高的频率的,你必须要告诉工具你要跑的时钟频率。时钟约束也就是经常看到的 Fmax,因为 Fmax 是针对“最差劲路径”,也就是说,如果该“最差劲路径”得到好成绩,那些不是最差劲的路径的成绩当然比“最差劲路径”好。Best case 的 Fmax 评估比起 Worst case 有更好的表现(也更接近实体的 Fmax 评估)。
15.时钟约束+时序例外约束
有时候一个设计中,存在多个时钟,光有时钟约束是不够的,还需要加一些例外约束,时序例外约束包括 FalsePath 、MulticyclePath、MaxDelay、MinDelay。但这还不是最完整的时序约束。如果仅有这些,说明时序分析思路还局限在 FPGA 芯片内部。
16.系统时钟约束+时序例外约束+I/O 约束
一般 FPGA 设计都是有 IO 管脚的,这些 IO 管脚也需要相关约束,IO 约束包括引脚分配位置、空闲引脚驱动方式、外部走线延时(InputDelay 、OutputDelay)、上下拉电阻、驱动电流强度等。加入 I/O 约束后的时序约束,才是最完整的时序约束。
FPGA 作为 PCB 上的一个器件,是整个 PCB 系统时序收敛的一部分。FPGA 作为 PCB 设计的一部分,是需要 PCB 设计工程师像对待其他器件一样,阅读并分析其 I/O 时序图的。FPGA不同于一般器件之处在于,其 I/O Timing 在设计后期可以于一定范围内调整。虽然如此,最好还是在 PCB 设计前期给与充分的考虑并归入设计文档。正因为 FPGA 的 I/O Timing 会在设计期间发生变化,所以准确地对其进行约束是保证设计稳定可控的重要因素。许多在 FPGA 重新编译后,FPGA 对外部器件的操作出现不稳定的问题都有可能是由此引起的。
好的时序是设计出来的,不是约束出来的 。好的约束必须以好的设计为前提。没有好的设计,在约束上下再大的功夫也是没有意义的。不过,通过正确的约束也可以检查设计的优劣,通过时序分析报告可以检查出设计上时序考虑不周的地方,从而加以修改。通过几次“分析—修改—分析” 的迭代也可以达到完善设计的目标。应该说,设计是约束的根本,约束是设计的保证,二者是相辅相成的关系。