FPGA设计之时序约束

时间:2024-03-30 07:07:11

在FPGA的设计当中,时序约束的重要性不言而喻。这也是要做好FPGA设计必须掌握的一门基本功。但是我发现,很多初学者甚至有一两年设计经验的已经入门的工程师(包括本尊..汗),并不重视这一基本技能。

归根到底原因可能有以下几个方面:1.没有遇到问题,代码写完后编译通过了,板测功能实现就OK啦。2.感觉有点无从下手,没有很系统的资料,有些概念难以理解,公式又多,并且sdc文件里面的相关约束语法比较陌生,所以干脆先放下,等以后遇到问题再说。在这里,我想说得是,出来混,早晚得还滴。首先,编写完代码,系统能跑起来只是完成设计中的一小部分,调试才是花比较多的时间。有好几次调试我都感觉我不是在调试板子,而是被板子调戏…….

正是因为走过前面的这么多坑,所以我下定决心,务必要拿下一这块。然后网上各种查阅前辈的分享经验,啃官网手册,花了将近一个多月的时间,慢慢消化,转化为自己的知识点。然后才有了这篇博客。

再开篇之前,我想声明以下两点:

1.时序约束重要。这话说得是时序很重要,好的时序是设计出来的,不是约束出来的。一个好的设计,良好的代码习惯才是最重要的。

2.高速信号。通常有人会说,我的时钟才几MHz,不用约束啦。我觉得这话有点不妥。高速信号通常来说可以分为两类,一种是高频信号,另外一种是上升时间很快的信号。信号的带宽与上升时间有个估算公式,即BW=0.35/上升时间,BW单位为Hz,上升时间单位为秒,所以就算频率很低的数字信号也有可能是高速信号。

时序约束这一个知识点,我打算分成两篇来介绍,第一篇介绍一下基本概念,先有个概念嘛,要不然后面都有点不知所云啦;第二篇是介绍常用的一些指令以及约束的流程。通过这两篇博客把自己这段时间的收获记录下来,有理解不对的地方希望大家指正,要是能够帮助到一些正在学习这块的童鞋,那就更好啦。哈哈….

言归正传,下面正式进入正文:

时序约束基本概念:

启动沿(launch)与锁存沿(latch)

这对概念就比较简单了,能用图说话的就不用文字,一目了然。

FPGA设计之时序约束 FPGA设计之时序约束


图1   Launch & Latch

Launch Edge (启动沿): 前级寄存器发送数据对应的时钟沿。

Latch Edge (锁存沿):后级寄存器锁存数据时对应的时钟沿。

建立时间(setuptime)与保持时间(hold time)

setup time :数据要能够被LatchEdge正确锁存,必须要在Latch Edge 到达之前保持稳定,这个提前到达的最少时间量,就是建立时间。

Hold time : 数据要能够被LatchEdge正确锁存,除了在Latch Edge到达之前提前准备好以外,还必须在Latch Edge到达后,保持稳定一段时间。这段保持稳定的时间,就是Hold time。

数据要求时间(requiretime)与数据到达时间(arrival time)

所有的信号在传输过程中都会有一定的延时,这里不展开详细论述。

         数据到达时间(arrivaltime):

FPGA设计之时序约束FPGA设计之时序约束

图2   Arrive time

其中,Tclk1是指Launch Edge启动后,时钟到达REG1的延迟。Tco是指数据输出延时,定义为D触发器的上升沿有效到D触发器输出端数据有效的时延,Tco是器件固有参数。Tdata是指数据从上级寄存器到达下一级寄存器的路径延迟。

数据要求时间(require time):

数据要求时间有两种,分别是建立时间与保持时间

FPGA设计之时序约束FPGA设计之时序约束

图3   Require time (setup)

数据要求时间(setup) = LatchEdge + Tclk2 – Tsu;其中,Tclk2是指时钟到REG2的路径延迟。

FPGA设计之时序约束FPGA设计之时序约束

图4   Require time (hold)

数据要求时间(hold) = LatchEdge + Tclk2 + Th;

  建立时间余量(setupslack)与保持时间余量(hold slack)

建立时间余量(setup slack)

FPGA设计之时序约束FPGA设计之时序约束

图5   setup slack

从上图我们可以知道:

setup slack =数据要求时间(setup)-数据到达时间(arrivaltime)

保持时间余量(hold slack)

FPGA设计之时序约束FPGA设计之时序约束

图6   hold slack

hold slack =数据到达时间(arrivaltime) -数据要求时间(hold)

以上就是我觉得时序分析当中,务必要掌握的几个基本概念。理解上述概念之后,下一篇博客将对时序分析的流程以及常用的一些指令作简析。

:在分析数据要求时间(requiretime)与数据到达时间(arrival time)的时候,官网的手册中还有几种针对FPGA内部的不同计算公式。在这里我也罗列出来,阐述一下自己对这几对公式的理解。

FPGA设计之时序约束FPGA设计之时序约束

图7   FPGA内部的计算关系

至于在FPGA内部Data_Require_Time的计算当中,为什么要减掉Setup_Uncertainty。首先要搞清楚setup_uncertainty是什么东西。我们觉得我们可以通过参照clock uncertainty来理解。clock uncertainty等于clock skew + jitter of clock source。clock skew是指理想的时钟是完全同步的,也就是说所有寄存器的时钟都同时到达,但实际上实现不了,clock skew是指同一时钟域内不同寄存器时钟最早到达和最迟到达的时间差。 jitter是指时钟源的时基抖动。例如理想的PLL产生的时钟源每个周期都相同,但实际上每个周期的上升沿会有一些偏差。这就是时钟抖动。

由此看来,这个Setup_Uncertainty正如其名说,是个不确定量,为了保险起见,当然要要求数据在锁存时刻之前到达,以免不满足建立时间。也可以这么理解,在建立时间到来之前,要求数据再提前一些到达,这样时序更加保险不过,在实际应用当中,我们在写sdc约束文件的时候,只需约束到外部器件到FPGA管脚处这一层次即可,FPGA的内部时序关系,Timequest会根据所选的器件,自行约束。但是也要理解,因为一旦内部时序违例需要修改逻辑的时候,这些分析要用上。