赞
踩
这几天一直在学习FPGA关于时序的内容,在低频率,小位宽的设计中,几乎不用考虑时序违例的情况,但是一旦上了高频率,大位宽,就很有必要分析好自己的时序,在出现问题的时候也能及时地解决。另外,随着对时序的深入理解,也有利于平时调试代码(我就有很多bug是因为clock的问题)。当然一次性肯定也没有办法学懂,学深,所以记录下来,希望自己后面也可以多多完善。本篇博客主要参考的有郑师兄的培训视频,一些网上的相关资料等等
时序分析与时序约束大致分为两类:一就是时序分析的基本知识,二就是如果发生时序违例的情况应该如何处理。
时序分析本质上就是时序检查,目的是检查设计中的所有D触发器是否能够正常工作。也就是检查(1)D触发器的同步端口(数据输入端口)的变化是否满足建立时间和保持时间的要求(2)检查D触发器的异步端口(异步复位端口)的变化(这里指复位信号的释放)是否满足恢复时间要求和移除时间要求。
主要分为静态时序分析和动态时序分析两种类型。
动态时序分析:将布局布线生成的布线延迟信息反标注到门级网表中进行仿真,检查是否存在时序违例。
动态时序分析的优点:直观,自动
动态时序分析的缺点:(1)testbench覆盖的时序路径不全面(2)覆盖率低(3)如果写很多条时序路径的testbench,可能导致仿真时间过长,消耗内存多。
静态时序分析:是指将设计中所有的时序路径,利用工具分成一小段一小段的路径,然后利用用户提供的一些基本信息(.XDC约束文件中体现),计算信号在这些路径上的传播延时,检查信号的建立和保持时间是否满足时序要求,通过对最大路径延时和最小路径延时的分析,找出违背时序约束的错误。
静态时序分析的优点:(1)不需要输入向量就能穷尽所有路径(2)运行速度快,占用内存较少。
静态时序分析的缺点:需要撰写基本的时序约束文件,告知时序引擎一些必要的信息(比如时钟,input dealy,output dealy)
综合来看,静态时序分析不仅可以对芯片设计进行全面的时序功能检查,还可以利用时序分析的结果来优化设计,因此现实中也是使用静态分析更多。
因为在FPGA中,都是依靠D触发器来完成时序功能的,所以要深入到原理部分,就必须熟悉D触发器。
下图是D触发器的电路结构,可以看出它由两部分组成:主锁存器和从锁存器。
当CLK = 0时,主锁存器工作,位于前级的主锁存器将输入D的值保存进来,而后级的从锁存器依然维持上一周期的的数据,由于这个时候前级和后级反相器环路之间的传输门是关闭状态,所以前级的数据不会到达后级。
当CLK =1时,从锁存器工作,前级反相器环路中保存的数据会传到后级,同时输入D的信号会被隔绝在外面,这个时候如果前级反相器环路中的信号没有循环一周以上,就会出现介于0和1之间的摇摆电位,造成亚稳态。由于亚稳态时间比延迟时间长,在读阶段读取数据可能会引入错误,所以我们引入建立时间来保证在时钟上升沿来临之前,输入D保持稳定的时间。
当CLK=1时,如果输入D在传输门关闭前发生变化,那么本该下一周期读取的数据就会提前进入锁存器,从而引起反相器环路震荡或者产生亚稳态。因此在CLK = 1之后输入D也需要稳定一段时间,称之为保持时间约束。保持时间约束是为了防止下一周期的数据冲刷掉本周起的数据。饿
全局时钟到输出延迟,时钟引脚发出全局时钟后获得有效输出所需的时间。即中间级的传输门到输出Q的延迟。
源时钟:也称为发起时钟
目的时钟:也称为捕获时钟
发起沿:源时钟产生数据的有效时钟沿
捕获沿:目的时钟捕获数据的有效时钟沿。
发起沿通常在0ns,捕获沿通常在下一个发起沿,发起沿和捕获沿通常相差一个时钟周期。
时钟偏差(clock skew):目的时钟与源时钟的偏差
建立时钟要求:表示定义最严格的建立约束的发送沿与捕获沿之间的关系。
时序路径是由设计实例之间的连接定义的。在数字化设计中,时序路径由一对时序元件组成,这对时序元件受相同时钟或 2 个不同时钟控制。
每条时序路径均由 3 个部分组成:源时钟路径,数据路径,目的时钟路径。
源时钟路径:源时钟路径是源时钟从源点(通常为输入端口)到发送时序单元的时钟管脚的路径。对于始于输入端口的时序路径,不存在源时钟路径。
数据路径:数据路径表示在其中传输数据的时序路径(介于路径起点与路径端点之间)。适用如下定义:(1) 路径起点为时序单元时钟管脚或数据输入端口;(2) 路径端点为时序单元数据输入管脚或数据输出端口。
目的时钟路径:目标时钟路径表示目标时钟从源点(通常为输入端口)到捕获时序单元的时钟管脚的路径。对于终止于输出端口的时序路径,不存在目标时钟路径。
第一种:从FPGA的输入端口到目的寄存器的数据输入端口。
数据:
第二种:从源寄存器的时钟端口到目的寄存器的数据输入端口。
数据:
这种时序路径一般在FPGA设计中最为常见。
第三种:从源寄存器的时钟端口到FPGA中的输出端口
第四种:从FPGA的输入端口到FPGA的输出端口。
在从输入端口到输出端口的路径中,数据无需锁存即可遍历整个器件。此类路径通常也称为输入到输出路径 (in-to-out path)。输入和输出延迟参考时钟可能是虚拟时钟,也可能是设计时钟。
这种情况很少。
1.确定建立时间要求(建立时间的捕获沿-建立时间的发起沿)
时序引擎会找出发起时钟和捕获时钟沿的最小公共周期,然后在最小公共周期找那个找到所有发起时钟沿和捕获时钟沿的所有可能得情况,并在所有可能得情况中找出最小的建立时间需求。从而确定了发起沿和捕获沿。
可以看出最小时钟周期=12ns,setup(2)为我们确定的最小建立时间需求,因此也可以确定发起沿:6ns,捕获沿:8ns,因此建立时间需求=捕获时钟沿-发起时钟沿 = 2ns。
2.计算数据需求时间,即在保证目的寄存器满足setup时间要求下,可以接受的最晚时间点。
Data Required Time(set up) = capture edge time + destination clock path delay - clock certainy - setup time
capture dege time:捕获沿时间
destination clock path delay :目的时钟相对于master clock的偏移
clock certainy :一般由于晶振导致的,很小。
setup time:建立时间,一般在手册中可以查到
3.计算数据的到达时间(真实)
Data Arrival Time(set up) = launch edge time + source clock path delay + datapath delay
launch dege time:是发起沿时间
source clock path delay:源时钟相对于master clock的时钟偏移
datapath delay:全局时钟输出延时(即)+组合逻辑延时+布线延时
4.计算setup的裕量(slack)
Slack(set up) = Data Required Time - Data Arrival Time
当slack为负时,即发生时序违例。
5.根据公式分析哪些因素会导致Setup Slack为负呢?
Setup Slack = (Capture edge -Launch edge) + (destination clk delay - source clk delay)
- Setup time - clk uncertainty - datapath delay
Setup Slack = Setup Requirement(一定大于0)+ clk skew(时钟歪斜) -
- uncertainty(很小) -
-
-
(时钟上升沿与输出Q端的差值)
排除一些不可控的因素(比如器件,温度等),我们可以在时序违例时调整的:Setup Requirement ,,
。
1.Setup Requirement 与实际情况不符合。
这种情况通常在同步跨时钟域中出现。在同步跨时钟域中源时钟和目的时钟的相位关系虽然是已知的,但是时序引擎默认选择的捕获沿通常都是错误的,需要用户通过多周期路径约束的方式手动修改建立时间需求。比如下图中,两个同频不同相的同步时钟,时序引擎默认选择的捕获沿是目的时钟第二个上升沿,到时建立时间要求非常小,肯定会造成时序违例。
2.clk skew为负值,且很大。
通常情况下,同一个时钟下的时钟歪斜不应该超过300ps,同步跨时钟域的时钟歪斜不应该超过500ps,异步跨时钟域路径的时钟歪斜一般比较大,因为他们的时钟源不同。
当出现时钟歪斜大的情况时:
3./
大
当设计中使用Block(DSP/Block RAM等)时,应该要注意以下问题。对于以这些Block为时序路径起点或者终点的时序路径,这些Block的/
/
都比普通的寄存器大,而且这些Block的布线延时和时钟歪斜都比较大。所以当使用这些Block作为时序路径的终点时,它的起点一定要是触发器。
比如说一个Block RAM的写数据信号,输入Block前最好打一拍。当使用这些Block作为时序路径的起点时,应该使用Block内部的输出寄存器,比如使用由Block RAM组成的FIFO时,尽量不要使用首字置出的,而是使用打一拍后疏忽的,使用后者可以显著降低。当时序路径为从一个Block到另一个Block时,中间需要进行打拍操作。当使用这些Block的控制端口时,应该保证这些控制信号的低扇出,如果使用由Block RAM组成的FIFO时,应该尽量降低读/写使能/地址信号的扇出。
4.大
一般情况下,逻辑延时与时序路径的逻辑层级数息息相关,逻辑层级是指时序路径的起点和终点之间组合逻辑单元(LUT)的个数。逻辑层级多一级意味着多一个LUT的延时加一条网线的总延时为0.5ns。如果某条路径的逻辑级数大于时钟周期/0.5ns,那么这条路径被称为长路径。
常用的处理长路径的方案有两种:第一种,修改rtl代码,在长路径的逻辑中加入流水线,将长路径打破分为多条短路径。第二种,使用综合工具的retiming优化方式,retiming实际上时寄存器重定向。原理是当某条长路径的相邻路径的建立时间裕量较大,那么它可以调整中间寄存器的位置,来调整布线延迟,通过适当增加相邻路径的布线延迟而减少长路径的布线延迟,使得哪些时序违例较小的长路径通过这种微调实现时序收敛。需要强调的是,这种方式只适合时序违例较小的长路径,对于一些延时特别大的长路径,也是无力回天。
5.大
一般情况下,布线延迟与设计整体或局部模块的资源利用率一级拥塞程度息息相关。
在正常情况下,一条网线的延时小于1ns,在发生拥塞的区域,网线的延时可能达到若干ns,导致布线延时显著增加。为了解决布线延迟大,需要从降低资源利用率和降低拥塞程度下手。
比如某个模块使用了大量的寄存器堆,占用了大量的资源,此时应该考虑使用Block RAM代替这些寄存器堆。某个模块使用了大量的数据选择器,此时应该考虑如何优化这些数据选择器。某个模块的控制信号扇出比较大,与其他模块的互联很重,此时应该考虑如何降低这些信号的扇出。某条时序路径的起点或者终点是Block,由于Block的位置比较固定,所以Block的布线延迟会大一些。最后需要强调的是,一定要额外关注高扇出的网线也会对布线延时产生影响。
1.确定保持时间需求(确定用于保持时间分析的发起沿和捕获沿)
保持时间要求是以建立时间要求为基础的,保持时间要求有两种:
2.计算数据需求时间(旧数据至少得保持的时间)
Data Required Time(hold) = destinantion clock capture edge time + destination clock path clock delay + clock uncertainty +hold time
3.计算数据的到达时间
Data Arrival Time(hold) = source clock launch dege time + source clock path delay + datapath delay
4.计算hold up 的裕量
Slack(hold) = Data Arrival Time - Data Required Time
Slack(hold) = +
(
+
) -
- holdup requirement - clk skew
hold up Slack为负的情况比较少见,当Setup Slack有较大裕量的时候,通常工具可以通过自动插入延时来增加hold up slack。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。