周期约束+IO约束


本文摘抄自:
个人网站:http://www.technomania.cn/
微信公众号:Quant_times、Reading_Times

前言

时序约束是FPGA设计中最根本也是最重要的步骤之一,当然,也是难点之一。相信很多朋友都在网上看了不少将时序约束的文章,对建立/保持时间一顿分析,自己好不容易理解了,发现并不知道这东西在实际中怎么应用。本教程综合整理了网上和树上关于时序约束的资料,在后面也有一章节是专门针对实际工程进行时序约束。

1. 读万卷书–时序约束理论篇

1.1 周期约束理论篇

首先来看什么是时序约束,泛泛来说,就是我们告诉软件(Vivado,ISE等)从哪个Pin输入信号,输入信号要延迟多长时间,时钟周期是多少,让软件PAR(Place and Route)后的电路能够满足我们的要求。因此如果我们不加时序约束,软件是无法得知我们的时钟周期是多少,PAR后的结果是不会提示时序警告的。
周期约束就是告诉软件我们的时钟周期是多少,让PAR后要保证在这样的时钟周期内时序不违规。大多数的约束都是周期约束,因为时序约束最多的是时钟。
在讲具体的时序约束前,我们先介绍两个概念:

  1. 发起端/发起寄存器/发起时钟/发起沿:指的是产生数据的源端
  2. 接收端/接收寄存器/捕获时钟/捕获沿:指的是接收数据的目的端

建立/保持时间

  1. 在clk上升沿来之前,数据提前一个最小时间量“预先准备好”,这个最小时间量就是建立时间;
  2. 在clk上升沿来之后,数据必须保持一个最小时间量“不能变化”,这个最小时间就是保持时间
    在这里插入图片描述
    建立时间和保持时间是由器件特性决定了,当我们决定了使用哪个FPGA,就意味着建立和保持时间也就确定了。Xilinx FPGA的setuo time基本都在0.04ns的量级,hold time基本在0.2ns的量级,不同器件会有所差异,具体可以查对应器件的DC and AC Switching Characteristics。

时序路径

典型的时序路径有4类,如下图表示,这4类路径可分为片间路径(标记1和标记3)和片内路径(标记2和标记4)。
在这里插入图片描述
对于所有的时序路径,我们都要明确其起点和终点,这4类时序路径的起点和终点分别如下表。
在这里插入图片描述
这4类路径中,我们最为关心的是2的同步时序路径,也就是FPGA内部的时序逻辑。

时序模型

典型的时序模型如下图所示,一个完整的时序路径包括源时钟路径,数据路径和目的时钟路径,也可以表示为触发器+组合逻辑+触发器的模型。
在这里插入图片描述
该模型典型的时序要求为(公式1)
在这里插入图片描述
其中,Tco为发端寄存器时钟到输出时间;Tlogic为组合逻辑延迟;Trouting为两级寄存器之间的布线延迟;Tsetup为收端寄存器建立时间;Tskew为两级寄存器的时钟偏斜,其值等于时钟同边沿到达两个寄存器时钟端口的时间差;Tclk为系统所能达到的最小时钟周期。
skew分为两种,positive skew和negetive skew,其中,positive skew见下图,这相当于增加了后一级寄存器的触发时间。
在这里插入图片描述
但对于negetive skew,则相当于减少了后一级寄存器的触发时间,如下图所示。
在这里插入图片描述
当系统稳定后,都会是positive skew的状态,但即便是positive skew,综合工具在计算时序时,也不会把多出来的Tskew算进去。
用下面这个图来表示时序关系就更加容易理解了。为什么要减去Tskew,下面这个图也更为直观。
在这里插入图片描述
发送端寄存器产生的数据,数据经过Tco、Tlogic、Trouting后达到接收端,同时还要给接收端留出Tsetup的时间,而时钟延迟了Tskew的时间,因此有:(公式2)
在这里插入图片描述
对于同步设计Tskew可以忽略(认为其值为0),因为FPGA中的时钟树会尽量保证到每个寄存器的延迟时间。
公式中提到了建立时间,那保持时间在什么地方体现呢?
保持时间比较难理解,他的意思是reg1的输出不能太快到达reg2,这是为了防止采到的新数据太快而冲掉原来的数据。保持时间约束的是同一个时钟边沿,而不是对下一个时钟边沿的约束。
在这里插入图片描述
reg2在边沿2时刻刚刚捕获reg1在边沿1时刻发出的数据,若reg1在边沿2时刻发出的数据过快达到reg2,则会冲掉前面的数据。因此保持时间约束的是同一个边沿。
在这里插入图片描述
在时钟沿达到之后,数据要保持Thold的时间,因此,要满足:(公式3)
在这里插入图片描述
在公式1中,Tco跟Tsu一样,也取决于芯片工艺,因此,一旦芯片信号选定就只能通过Tlogic和Trouting来改善Tclk。其中,Tlogic和代码风格有很大关系,Trouting和布局布线策略有很大关系。

1.2 I/O约束

管脚约束

管脚约束就是指管脚分配,我们要制定管脚的PAKAGE_PIN和IOSTANDARD两个属性的值,前者指定了管脚的位置,后者指定了管脚对应的电平标准。
在vivado,使用如下方式在xdc中对管脚进行约束。
在这里插入图片描述
在vivado中规定,必须要指定管脚电平,不然在最后一步生成比特流时会出错。
除了管脚位置和电平,还有一个大家容易忽略但很容易引起错误的就是端接,当我们使用差分电平时,比如LVDS,在V6中我们使用IBUFDS来处理输入的差分信号时,可以指定端接为TRUE。
在这里插入图片描述
但在Utrascale中的IBUFDS,却把端接这个选项去掉了
在这里插入图片描述
我们必须要在xdc或I/O Ports界面中,手动指定,否则可能会出错。
在这里插入图片描述
笔者之前就踩过一个坑,差分端口输入,当连接这样的输入数据为11101111这种时,中间那个0拉不下来,还是1,同样也会发生在00010000,这样就会导致数据输出错误,后来才发现是端接忘记加,因为端接会影响信号的实际电平,导致FPGA判断错误。
当综合完成后,我们可以点击DRC,进行设计规则检车,这一步可以报出一些关键问题,比如时钟端口未分配在时钟引脚上等。
在这里插入图片描述

延迟约束

延迟约束用的是set_input_delay和set_output_delay,分别用于Input端和output端,其时钟源可以是时钟输入管脚,也可以是虚拟时钟。但需要注意的是,这两个约束并不是起延迟的作用,具体原因下面分析。

  1. set_input_delay
    这个约束跟ISE中的OFFSET=IN功能相同,但设置方式不同。下图所示为input delay的约束说明图。
    在这里插入图片描述
    从图中很容易理解,
    在这里插入图片描述
    当满足图中的时序时,最大延迟为2ns,最小延迟为1ns。
    因此,需要添加的时序约束为:
    在这里插入图片描述
  2. set_output_delay
    set_output_delay的用法跟set_input_delay十分相似,这里就不再展开讲了。我们上面讲set_input_delay的描述中,大家可以看到,这个约束是告诉vivado我们的输入信号和输出信号之间的延迟关系,跟下面要讲的时钟周期约束是一个原理,让vivado在这个前提下去Place and Route。并不是调节输入信号的延迟,因为有不少的FPGA工程师在没用过这个约束指令之前,都以为这是调节延迟的约束。
    如果要调整输入信号的延迟,只能使用IDELAY,在V6中,IDELAY模块有32个tap值,每个tap可以延迟78ps,这样总共差不多是2.5ns。

猜你喜欢

转载自blog.csdn.net/gemengxia/article/details/108192687
今日推荐