精华内容
下载资源
问答
  • vivado中时序约束

    2021-07-04 16:43:25
    如图5-38所示为本课题代码设计完成后、时序约束前的时序分析报告。 图5-38 时序约束前时序报告 Xilinx Vivado时序报告可提供设计时序特性的高层次信息,依据时序报告可针对具体问题进行解决,其中本课题设计中...

    对于Zynq设计中,优化FPGA时序约束设计对于实现高速数字信号采集与处理至关重要。Xilinx 官方提供的Vivado设计软件中提供了时序报告功能(Report Timing Summary),为Zynq设计的时序约束提供便捷的设计。如图1所示为本课题代码设计完成后、时序约束前的时序分析报告。

    图1  时序约束前时序报告

    Xilinx Vivado时序报告可提供设计时序特性的高层次信息,依据时序报告可针对具体问题进行解决,其中本课题设计中主要有以下两种时序设计警告:

    TNS:(总体时序负裕量)表示Zynq中高速数字设计时域中每个端点建立/恢复违规时间总和。

    THS:(总体保持时序裕量)表示Zynq中高速数字设计时域中每个端点保持/移除违规时间总和。

    以上两种时序报告指标过高会导致时序逻辑工作不稳定。

    通过Vivado中Report_Clock_interaction Tcl命令查看时钟设计中时钟源与各个目标时钟的交互关系,如图2所示:

    图2  Report_Clock_interaction时序报告图

    本课题中高速数字链路设计完成后出现的以上两类时序报告主要违例时间来源于通常有以下几种:

    1. 系统主时钟与生成时钟间的路径约束;
    2. 高速双倍数据速率(DDR)输入输出(ADC、DAC)的端口约束;
    3. Zynq主时钟(200MHz)、高速ADC(250MHz)和高速DAC(500MHz)跨时钟域间违例;

    本课题设计优化时通过以下几种方式解决:

    (1)创建主时钟与生成时钟,划分时钟组:

    主时钟是指为设计定义时序参考的时钟,时序可利用主时钟获得时序路径要求以及与其他生成时钟的相位关系;划分时钟组是为防止不同工作时钟源之间的互斥,尤其对于高速ADC与DAC间时钟域的划分。

    (2)输入输出端口约束:

    输入输出端口约束,是为了描述进出FPGA器件接口的外部路径时序,以满足FPGA数据传输时的建立时间与保持时间,为此需要定义一个与ADC或DAC工作时钟频率相同的虚拟时钟,以完成约束端口功能。

    优化完成后Vivado时序报告如图3所示:

    图3  时序优化后时序报告

    展开全文
  • 时序约束

    千次阅读 2018-08-03 11:23:44
    一、在给FPGA做逻辑综合和布局布线时,需要在工具中设定时序约束。通常,在FPGA设计工具中都FPGA中包含有4种路径:从输入端口到寄存器,从寄存器到寄存器,从寄存器到输出,从输入到输出的纯组合逻辑。通常,需要...
    一、在给FPGA做逻辑综合和布局布线时,需要在工具中设定时序的约束。通常,在FPGA设计工具中都FPGA中包含有4种路径:从输入端口到寄存器,从寄存器到寄存器,从寄存器到输出,从输入到输出的纯组合逻辑。通常,需要对这几种路径分别进行约束,以便使设计工具能够得到最优化的结果。下面对这几种路径分别进行讨论。 
    1.从输入端口到寄存器:
        这种路径的约束是为了让FPGA设计工具能够尽可能的优化从输入端口到第一级寄存器之间的路径延迟,使其能够保证系统时钟可靠的采到从外部芯片到FPGA的信号。约束名称:input delay.   约束条件的影响主要有4个因素:外部芯片的Tco,电路板上信号延迟Tpd,FPGA的Tsu, 时钟延迟Tclk.  Tco的参数通常需要查外部芯片的数据手册。计算公式:input delay = Tco+Tpd+Tsu-Tclk.    FPGA的Tsu也需要查FPGA芯片的手册。 FPGA速度等级不同,这个参数也不同。 Tpd和Tclk需要根据电路板实际的参数来计算。通常,每10cm的线长可以按照1ns来计算.   例如:系统时钟100MHz,  电路板上最大延迟2ns, 时钟最大延迟 1.7ns, Tco 3ns, FPGA的Tsu(触发器固有的建立时间)为0.2ns. 那么输入延迟的值: max Input delay = 2+3+0.2-1.7=3.5ns.  这个参数的含义是指让FPGA的设计工具把FPGA的输入端口到第一级寄存器之间的路径延迟(包括门延迟和线延迟)控制在 10ns-3.5ns=6.5ns 以内。这个3.5ns在quartus timequest中的约束就是input delay。这个6.5ns在xilinx的约束中就是OFFSET IN。具体写法依约束参考对象不同有两种,NET DATA_IN OFFSET = IN 3.5ns AFTER CLK(这个clk是launch clk);NET DATA_IN OFFSET = IN 6.5ns BEFORE CLK(这个clk明显是latch clk了)。
    后记:关于这个约束,参考http://www.doc88.com/p-112663065567.html(偏移约束详解,王春平)。对于初始时钟沿的问题之前没有注意过,这个学习了,就是说你的offset是相对于初始时钟沿来说的。但是对于fpga来讲,就拿他的例子来说,外部芯片是下降沿出数据,相对于随路时钟的上升沿2ns之前数据准备好了,那么fpga是要控制它的delay在2ns之内还是12ns之内呢,或者说fpga是怎么知道它的采样沿是上升沿还是下降沿呢,代码里反映的吗?
    2.寄存器到寄存器: 
       这种路径的约束是为了让FPGA设计工具能够优化FPGA内寄存器到寄存器之间的路径,使其延迟时间必须小于时钟周期,这样才能确保信号被可靠的传递。由于这种路径只存在于FPGA内部,通常通过设定时钟频率的方式就可以对其进行约束。对于更深入的优化方法,还可以采用对寄存器的输入和寄存器的输出加入适当的约束,来使逻辑综合器和布线器能够对某条路径进行特别的优化。还可以通过设定最大扇出数来迫使工具对其进行逻辑复制,减少扇出数量,提高性能。 
    3.寄存器到输出:
       这种路径的约束是为了让FPGA设计工具能够优化FPGA内部从最后一级寄存器到输出端口的路径,确保其输出的信号能够被下一级芯片正确的采到。约束的名称: output delay,            约束条件的影响主要有3个因素:外部芯片的Tsu,电路板上信号延迟Tpd,时钟延迟Tclk.  Tsu的参数通常需要查外部芯片的数据手册。计算公式:output delay = Tsu+Tpd-Tclk.         例如:系统时钟100MHz,  电路板上最大延迟2ns, 时钟最大延迟 1.7ns, Tsu 1ns, 输出延迟的值: max output delay = 1+2-1.7=1.3ns .  这个参数的含义是指让FPGA的设计工具把最后一级寄存器到输出端口之间的路径延迟(包括门延迟和线延迟)控制在 10ns-1.3ns=8.7ns 以内。
    这个6.5ns在xilinx的约束中就是OFFSET OUT。同样有两种写法,NET DATA_OUT OFFSET = OUT 8.7ns AFTER CLK;NET DATA_OUT OFFSET = OUT 1.3ns BEFORE CLK。
    4.从输入端口到输出端口:
       这种路径是指组合逻辑的延迟,指信号从输入到输出没有经过任何寄存器。给这种路径加约束条件,需要虚拟一个时钟,然后通过约束来指定哪些路径是要受该虚拟时钟的约束。在Synplifypro和Precision中都有相应的约束来处理这种路径。
    二、分析时序
    不断学习,不断更新…
    1.通过creat timing constraints来建立约束,包括offset in、offset out和period,它们属于全局的约束,然后点valid constraints,设计的约束便自动生成在ucf文件里了,前提是之前得有ucf文件。
    2.经过布局布线以后,可以查看static timing,看设计的时序约束是否能满足。还看到说查看综合报告或映射后静态时序报告可以看到你的约束是否现实,这个要继续了解一下。
    3.通过这个analyze timing/floor plan design(plan ahead)可以查看各个约束的路径的实际位置。还可以看到具体到路径它的逻辑延时占多少时间,布线延迟占多少时间,一般来讲符合60/40原则,即逻辑延迟占到60%以下设计就很容易满足要求。
    4.周期约束覆盖同步单元之间的延时路径,如果系统有多个时钟,各自约束之,应该就可以了我理解。然而单纯的只使用全局约束往往会导致过约束,道理很简单,因为有的路径是不需要加上这个约束的(不需要加的加上了属于过约束),像多周期路径、跨时钟域的路径等。你如果加上了,只能让综合工具做一些无谓的努力(侵占了本应该属于其它逻辑的布局布线资源,反而可能造成其它关键路径时序的违规和时序余量变小)。所以这个时候就需要特定路径的时序约束,它的目的并不是给路径多大的优化,而是给你的综合工具更大的灵活性来满足你的时序要求。
    5.关于路径终点的定义:IO PADS、FF、FL、RAM。可以通过creat timing constraints来方便的将路径终点进行分组,从而进行组间的时序约束。全局约束默认是将所有的终点作为一个group。
    6.相关时钟域的约束:为一个时钟进行周期约束,以这个周期约束确定相关的时钟。像DCM有多个时钟输出,只需要确定输入时钟的周期约束,那么执行工具会自动推导出其它输出时钟的约束。
      不相关时钟域的约束:例如有clka和clkb两个时钟域,分别做了周期约束,那么它们之间的延时路径默认是没有覆盖到的,这个时候就可以在两个group之间做特定路径的约束(快速/慢速/例外),由于clka和clkb都分别做了约束,两个group已经被自动分好了,就以时钟为依据就行了。
    7.看到一段话,说的是附加时序约束的基本策略,很好,拿过来。附加时序约束的一般策略是先附加全局约束,然后对快速和慢速例外路径附加专门约束。附加全局约束时,首先定义设计的所有时钟,对各时钟域内的同步元件进行分组,对分组附加周期约束,然后对FPGA/CPLD输入输出PAD附加偏移约束、对全组合逻辑的PAD TO PAD路径附加约束。附加专门约束时,首先约束分组之间的路径,然后约束快、慢速例外路径和多周期路径,以及其他特殊路径。

    8.对自己在做的一个工程,原先什么约束都没有加,运行结果会偶尔出现读写SRAM出错的情况,有时候加上chipscope反而没错了,稍作改动综合之后结果也不一样。再遇到这样的情况,肯定就能知道是关键路径的时序问题。就加了一个全局时钟的约束,它是DCM的输入。经过PR以后,看它的STA,发现提示了几个路径的错误,其中有一条就是从PC104接口过来的地址送到我内部一个模块的时候路径的setup time不满足,slack为负。slack是时序余量,是用周期减去时序通路上消耗的时间,正的为满足时序要求,负的就表示不满足。有网友说了几个改正的方案:

    1)修改PR的布局布线策略,比如改成时间优化,允许duplication(禁止逻辑优化)等
    2) 加强placement constraint
    5)使用floorplanner
    以上几点不需要修改设计。如果还不行就要优化code了。
    3)减少fanout (尤其中间的组合逻辑)
    4)插入额外的flip-flop等。

    本项目实际的修改就是在中间将逻辑打断,加了一级flip-flop。然后就不报timing error了。

    9.一般同一个时钟域的话不用考虑hold time,因为tco+tdelay>t_hold肯定可以满足,就算是加上始终偏斜,那么应该满足tco+tdelay-tpd>t_hold也是没有问题的,因为tdelay跟tpd和thold比不一个等级的。

    三、详细看了一下ISE生成的timing report,做以下分析。

    1.只做了一个输入全局时钟的约束,经过DCM以后生成三个时钟,一个CLK0,一个八倍频的时钟和一个八分频的时钟。timing report以时钟为条件分了四个部分做分析。

    2.每一部分基本包括两个方面,一个是component switching limit,还有一个就是路径的分析。其中component switching limit是跟器件相关的,对输入时钟的占空比有一个容忍的范围,参数值包括低电平最低持续多长时间(low pulse limit)和高电平最低持续多长时间(high pulse limit),而这个两个值根据输入时钟的大小是有变化的,这个都是器件固有的特性。

    3.路径的分析呢,分为setup和holdup进行分析,如果有不满足时序要求的路径(slack为负)那么就列出来,如果这个时钟下没有不满足时序要求的路径,那么同样会列出三个最坏情况的路径,setup的三个,holdup的三个。



    展开全文
  • Input delay 时序约束实例 概述: 对Input delay时序约束做以描述以及实例分析。 必备基础:建立时间与保持时间 文章目录1、 IO时序分析的基本模型2、引出Input delay3、Input delay时序约束实例以及时序报告解读4、...

    Input delay 时序约束实例

    概述: 对Input delay时序约束做以描述以及实例分析。

    必备基础:建立时间与保持时间
    所需工程:工程


    1、 IO时序分析的基本模型

    我们要想进行FPGA内部IO的时序分析,就要明确外部信号到达FPGA引脚时数据和时钟的相位关系(就是知道何时外部数据和时钟到达FPGA引脚端)。引出以下两个系统模型进行分析

    模型一:系统同步FPGA输入模型:由一个时钟源驱动上下游器件。(基本上被淘汰,不适合高速传输)
    在这里插入图片描述

    System clock为晶振。

    模型二:源同步FPGA输入模型:上游器件提供同步时钟和同步数据。(逐渐被高速串行协议PCIE、SATA等等取代,但是还是被广泛的应用比如低速的AD、DA器件)
    在这里插入图片描述

    System clock为晶振,为上游器件的两个寄存器提供时钟,Reg2在时钟的上升沿输出高电平,在时钟的下降沿输出低电平,其实输出的就是同步的时钟。

    2、引出Input delay

    以模型二为例分析:

    在这里插入图片描述


    数据延时:
    Tco : 数据在上游器件接口的延迟
    Td_bd:数据路径延迟
    Td_fi : 数据在FPGA内部到寄存器D端的延迟

    时钟延时:
    Tc_d : 时钟在上游器件的延迟
    Tc_bd:时钟路径延迟
    Tc_fi : 时钟在FPGA内部到寄存器C端的延迟

    模型二的传输延迟图如下所示:(参考建立时间与保持时间会看的更清楚)
    在这里插入图片描述

    针对FPGA内部的寄存器Reg3:
    数据要求到达的时间为:Tc_d +Tc_bd +Tc_fi(时钟采样沿到达的时间)
    数据实际到达的时间为:Tco +Td_bd +Td_fi

    FPGA内部Tc_fi、Td_fi的延时是知道的,但是外部延时Tc_d +Tc_bd、Tco +Td_bd FPGA是不知道的,那么FPGA不知道怎么这段延时,怎么正确的进行时序分析呢,就引入了input delay约束来告诉FPGA外部器件的时钟和数据的关系。

    input delay = 数据到达FPGA引脚时间 - 时钟发射沿到达FPGA引脚时间 = Tco +Td_bd - Tc_d -Tc_bd。

    以下是Vivado时序约束中描述的Input delay:
    在这里插入图片描述

    由于数据线不止一根,而且布线有长有短(短快长慢)、线宽不一、阻抗不一等因素,数据延迟就会有最大最小。就会出现 LrMaxLrMin,如下图所示
    在这里插入图片描述
    如果DATA0(看数据到达FPGA引脚的图)往右偏,也就延时更大,则数据到达FPGA内部寄存器也会往右偏,这样就会压缩建立时间余量(Tus_Slack)。
    建立时间余量(Setup Slack): 要求数据到达时间和数据实际到达时间的差值。

    如果DATA0(看数据到达FPGA引脚的图)往左偏,也就延时更小,则数据到达FPGA内部寄存器也会往左偏,这样就会压缩保持时间余量(Th_Slack)。
    保持时间余量(Hold Slack): 数据实际结束位置和要求数据结束位置的差值。

    如果建立时间余量或保持时间余量出现负值就会引起时序违例。
    在这里插入图片描述

    3、Input delay时序约束实例以及时序报告解读

      通过Vivado进行input delay约束实现FPGA管脚处时钟上升沿到达之后3ns数据到达(时序图中时钟发射沿在左数据在右)并查看时序报告。
    在这里插入图片描述

    顶层设计如下所示:
    在这里插入图片描述

    顶层代码:
    (参考B站尤老师代码)

    module top_ioddr(
    
        input	wire 	sdrclk,
        input	wire 	[3:0]	sdrdata,
        input	wire 	sdrden,
        output	reg 	tout 	
    	);
    
    //sdr clock domain
    reg [3:0] sdrdata_r1,sdrdata_r2;
    reg 	sdrden_r1,sdrden_r2;
    
    always @(posedge sdrclk ) begin
    	{sdrdata_r2,sdrdata_r1} <= {sdrdata_r1,sdrdata};
    end
    
    always @(posedge sdrclk ) begin
    	{sdrden_r2,sdrden_r1} <= {sdrden_r1,sdrden};
    end
    
    always @(posedge sdrclk) begin
    	if(sdrden_r2 == 1'b1) begin
    		tout <= (&sdrdata_r1)|(&sdrdata_r2);
    	end
    	else begin
    		tout <= (^sdrdata_r2);
    	end
    end
    
    endmodule
    

    约束:

    set_property PACKAGE_PIN W19 [get_ports sdrclk]
    set_property PACKAGE_PIN Y22 [get_ports sdrden]
    set_property PACKAGE_PIN V20 [get_ports {sdrdata[0]}]
    set_property PACKAGE_PIN U20 [get_ports {sdrdata[1]}]
    set_property PACKAGE_PIN AB22 [get_ports {sdrdata[2]}]
    set_property PACKAGE_PIN AB21 [get_ports {sdrdata[3]}]
    set_property IOSTANDARD LVCMOS33 [get_ports sdrclk]
    set_property IOSTANDARD LVCMOS33 [get_ports {sdrdata[*]}]
    set_property IOSTANDARD LVCMOS33 [get_ports sdrden]
    
    set_property PACKAGE_PIN Y21 [get_ports tout]
    set_property IOSTANDARD LVCMOS33 [get_ports tout]
    

    首先不做任何约束查看时序报告:
    在这里插入图片描述
    因为只查看输入信号,所以只选From,选择数据sdrdata[0]、sdrdata[1]、sdrdata[2]、sdrdata[3]、sdrden
    在这里插入图片描述
    在这里插入图片描述
    查看时序报告,余量都显示无穷,这是因为我们没有添加任何约束,Vivado为了防止报时序警告就设置为了无穷。
    在这里插入图片描述
    我们添加主时钟约束:
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    ok保存,查看约束文件,约束已经被添加
    在这里插入图片描述
    设置input delay
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    数据:(哪些信号相对于时钟的关系要描述就添加谁)
    在这里插入图片描述
    在这里插入图片描述
    时钟到达3ns后数据到达,则设置max、min均为3ns
    在这里插入图片描述
    Apply 保存,查看约束文件,约束已经添加
    在这里插入图片描述
    重新打开report就能看到时序打印信息
    在这里插入图片描述
    双击Path6,查看详细信号路径延时(图中第二行注释的Max、Min 改为 Fast和Slow)
    下图input delay为3ns,详细解读看图
    在这里插入图片描述

    4、以传感器送数据到FPGA为例分析input delay

      以SONY的一款CMOS传感器IMX222LQJ-C传输数据到FPGA为例进行input delay分析。

    传感器时序图如下所示
    在这里插入图片描述
    从以上时序图以及描述中我们可以得到以下信息:
    ①、传感器数据传输工作模式有两种
      模式一:数据起始与时钟的下降沿对齐。
      模式二:数据起始与时钟的上升沿对齐。
    ②、数据相对时钟沿,往右最大延时2ns。
      数据相对时钟沿,往左最大延时2ns
    ③、时钟可以工作在54MHz或者37.125Hz,我们选择54MHz进行分析。

    下图中红框处代表传感器的输出引脚,蓝框处代表FPGA输入引脚,知道上图的时序关系,就知道了红框处即传感器输出引脚的时钟和数据的相位关系,通过PCB工程师以及一些材料介质等计算会得到中间PCB布线延时(一般会做等延时处理),所以蓝框处即FPGA输入引脚处的时钟和数据的相位关系也就知道了,从而就可以约束input delay。

    在这里插入图片描述

    4.1 、传感器在模式一(数据起始与时钟的下降沿对齐)下时序分析

      传感器在模式一下,数据起始与时钟的下降沿对齐。
    在这里插入图片描述
    因为
    input delay = 数据到达FPGA引脚时间 - 时钟发射沿到达FPGA引脚时间 。
    所以
    从上图Data1处可以看出的Input delay Min和Input delay Max。
    Input delay Min:周期/2 - 2ns。
    Input delay Max:周期/2 + 2ns。

    时钟频率为54MHz,时钟周期为18.5185,做主时钟约束
    在这里插入图片描述
    约束input delay(min=周期/2-2ns;max=周期/2+2ns)
    在这里插入图片描述
    约束文件
    在这里插入图片描述
    综合实现后打开时序报告,在数据的中心对数据进行采样时,没有时序违例。
    在这里插入图片描述在这里插入图片描述
    仔细观察:发现相同的路径有两个报告
    分别打开Path11和Path16:两种不同的报告是软件在不同的环境下分析的。
    比如CPU温度高了就会降频,CPU为低压版本工作频率就相对低,FPGA也一样,就会导致信号延时增加。
    在这里插入图片描述

    4.2 、传感器在模式二(数据起始与时钟的上升沿对齐)下时序分析

      传感器在模式二下,数据起始与时钟的上升沿对齐。
    在这里插入图片描述
    因为
    input delay = 数据到达FPGA引脚时间 - 时钟发射沿到达FPGA引脚时间 。
    所以
    从上图Data0处可以看出的Input delay Min和Input delay Max。
    Input delay Min: - 2ns。
    Input delay Max: + 2ns。

    更改时序约束
    在这里插入图片描述
    查看约束文件:
    在这里插入图片描述
    直接rerun时序(不综合布局布线):hold Time出现了时序违例
    在这里插入图片描述在这里插入图片描述
    便是以下模型,建立时间余量很大,保持时间余量成为了负值

    建立时间余量:要求数据到达的时间 - 实际数据到达的时间(②-①)。
    保持时间余量:数据实际结束的时间 - 要求数据结束的时间(④-③)。
    在这里插入图片描述

    但是如果重新布局布线就会发现,上面的违例消失了,这是因为在布局布线的时候,综合工具会增加数据的走线延时,来得到正确的建立时间余量个保持时间余量。
    在这里插入图片描述
    在这里插入图片描述

    4.2.3 利用PLL相移消除时序违例

      但是如果时序违例严重,我们可以通过PLL具有调相的功能来实现时钟的移位使之消除建立时间余量和保持时间余量的违例。以下为加入PLL的系统模型:

    在这里插入图片描述
    加入PLL调整时钟相位使之出现正值的保持时间余量(图中是将上图时序中的时钟左移)。
    在这里插入图片描述
    但是实际PLL具体该怎么加入呢?

    步骤1: 加入PLL IP,先不设置相移查看一次时序报告,删除XDC之前的时钟约束,主时钟的约束也删除,因为PLL会生成主时钟的约束。
    在这里插入图片描述
    top代码:

    module top_ioddr(
    
        input	wire 	sdrclk,
        input	wire 	[3:0]	sdrdata,
        input	wire 	sdrden,
        output	reg 	tout 	
    	);
    
     clk_wiz_0 clk_gen0
       (
        // Clock out ports
        .clk_out1(sdrclk1),     // output clk_out1
       // Clock in ports
        .clk_in1(sdrclk));      // input clk_in1
    
    //sdr clock domain
    
    reg [3:0] sdrdata_r1,sdrdata_r2;
    reg 	sdrden_r1,sdrden_r2;
    
    always @(posedge sdrclk ) begin
    	{sdrdata_r2,sdrdata_r1} <= {sdrdata_r1,sdrdata};
    end
    
    always @(posedge sdrclk ) begin
    	{sdrden_r2,sdrden_r1} <= {sdrden_r1,sdrden};
    end
    
    always @(posedge sdrclk) begin
    	if(sdrden_r2 == 1'b1) begin
    		tout <= (&sdrdata_r1)|(&sdrdata_r2);
    	end
    	else begin
    		tout <= (^sdrdata_r2);
    	end
    end
    
    endmodule
    

    打开时序约束窗口:
    以下是PLL自动约束的
    在这里插入图片描述
    添加 input delay约束
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    保存
    打开report timing

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    报告如下:
    在这里插入图片描述
    保持时间出现违例(和不加PLL一样,因为我们没有做相移),要么是数据延时太小,要么是时钟延时太大。

    打开建立时间路径,查看采样沿为18.5185(第二个上升沿):
    在这里插入图片描述
    打开保持时间路径,查看数据和时钟到达的时间
    在这里插入图片描述
    在这里插入图片描述
    所以保持时间余量为 -1.386 -(-0.389)=-0.997ns
    所以要想保持时间余量成为正值,则时钟要往左移(上面算式的减数更小),但是要小多少的,也就是时钟应该怎么相移,移多少呢,这就得计算一下了。
    所以为了保持时间余量成为正值,被减数继续往负值走,比如为 -1.389
    -1.386 -(-1.389)=0.003ns 近似于刚好称为正值。
    时钟到达的时间为-0.389变为-1.389,相当于向左偏移了1ns

    换算成相位:
    时钟频率:54MHz
    时钟周期:18.518 ns;相位对应360度
    时间为:1ns ;相位对应 1/18.518=x/360 所以x=19.440度。
    又因为时钟是向左移,所以通过PLL将时钟左移大概20度就会使保持时间余量称为正值。

    步骤二: 设置IP核相移为-20:
    在这里插入图片描述
    时钟左移会使保持时间余量(④-③)成为正值:
    在这里插入图片描述

    综合实现,打开report timing查看时序报告:
    打开建立时间路径
    再次查看采样沿为17.486ns(近似左移了1ns)
    在这里插入图片描述
    保持时间余量成为了正值,满组时序要求
    在这里插入图片描述
    完成了以上的验证。

    ★★★如有错误,欢迎指导!!!

    展开全文
  • vivado 时序约束

    千次阅读 2019-06-17 13:51:46
    XDC的基本语法可以分为时钟约束、IO约束以及时序例外约束,对一个设计进行约束的先后顺序也可以按照这三类约束依次进行。 时钟约束 时钟约束必须最早创建,端口进来的主时钟以及GT的输出RXCLK/TXCLK都必须由用户...

    XDC的基本语法可以分为时钟约束、IO约束以及时序例外约束,对一个设计进行约束的先后顺序也可以按照这三类约束依次进行。

     

    时钟约束

    时钟约束必须最早创建,端口进来的主时钟以及GT的输出RXCLK/TXCLK都必须由用户使用create_clock自主创建。如果是差分输入的时钟,可以仅在差分对的P侧用get_ports获取端口,并使用create_clock创建。

    create_clock-name clk_200 - period 5 [get_ports clk200_p]

    针对vivado自动推导的衍生时钟,比如MMCM/PLL/BUFR的输出时钟,可以由vivado自动推导,用户无需创建。

    但是,工具不能自动推导出使用寄存器和组合逻辑搭建的分频器等衍生的时钟,必须有用户使用create_generated_clock来创建。举例如下

     

    Clk1 是原本就有的主时钟,clk2 是衍生出来的时钟。注意创建时钟,语法不一样。

    为什么时钟要进行时钟约束,不约束有什么后果?这里还是不知道。

    I/O约束

    在设计的初级阶段,可以不加IO约束,让工具专注于满足FPGA内部的时序要求。当时序要求基本满足后,再加上IO约束跑实现。

    1  不加任何IO约束的端口,时序要求被视为无穷大。

    2  XDC中的set_input_delay/set_output_delay 是从系统 角度来约束。

    3  典型的IO时序,包括系统同步,源同步,SDR和DDR等。在vivado图形界面的XDC templates中有示例。2014.1版后,还有一个timing constraints wizard可供使用。timing constraints wizard 用过,操作简单,需要知道信号最大最小延迟和板间最大最小延迟即可。

    (芯片引脚上有信号的最大最小延迟,板子上的默认都是0,不知道这样操作可以不)

    http://group.chinaaet.com/273/4100028543  timing constraints wizard 使用方法

     

    时序例外约束

    时序例外约束包括set_max_delay/set_min_delay,set_multicycle_path,set_false_path等,这类约束除了要满足XCD的先后顺序优先级外,还要遵循自身的优先级限制。总的准则是,针对同一条路径,对约束目标描述越具体的优先级越高。

     

    还有其他的技巧和说明,参考链接

    http://xilinx.eepw.com.cn/news/article/a/1375

     

    https://www.cnblogs.com/moluoqishi/p/10655539.html   常用的约束语法看这里

    / 新的起点///

    约束的管理

    时序分析是建立在时序约束的基础之上。FPGA设计有4类时序路径的起点和终点:

    时序路径

    起点

    终点

    应用约束

    输入端口到FPGA内部第一级触发器的路径

    Chip A/clk

    Rega/D

    Set_input_delay

    FPGA内部触发器之间的路径

    Rega/clk

    Regb/D

    Create_clock

    FPGA内部末级触发器到输出端口的路径

    Regb/clk

    Chipb/D

    Set_output_delay

    FPGA输入端口到输出端口的路径

    输入端口

    输出端口

    Set_max_delay

     

    表中 1 2 3 所示路径可归结为一个统一的模型:触发器+组合逻辑+触发器。

    一个完整的时序路径由源时钟路径、数据路径和目的时钟路径2部分构成。约束的目的则是为了验证下面公式是否成立:

    Tco为发端寄存器时钟到输出时间;Tlogic为组合逻辑延迟;Trouting为两级寄存器之间的布线延迟;Tsu为接收端寄存器建立时间;Tskew为两级寄存器的时钟歪斜,其值等于时钟统一边沿到达两个寄存器时钟端口的时间差;Tclk为系统所能达到的最小时钟周期。在FPGA中,对于同步设计Tskew可忽略(认为值等于0)。由于Tco和Tsu取决于芯片工艺,因此,一旦芯片型号选定就只能通过Tlogic和Trouting来改善Tclk。其中,Tlogic和代码风格有很大关系,Trouting和布局布线策略有很大关系。

    时钟周期约束

    在vivado 中,通过creat_clock可轻松创建时钟周期约束。

    creat_clock的对象必须为主时钟(primary clock)。主时钟通常有两种情形:一种是时钟由外部时钟源提供,通过时钟引脚进入FPGA,该时钟引脚绑定的时钟为主时钟;另一种是高速收发器(GT)的时钟RXOUTCLK或TXOUTCLK。对于7系列FPGA,需要对GT的这两个时钟手工约束(GTX的时钟IP核生成时候如果界面上有配置时钟频率,这里是不需要约束的)。

    那如何确定主时钟呢?除了根据上面两种情况判断外,还可以通过TCL 输入指令来获取。在输入指令之前,要先open synthesized design。个人还是喜欢第一个指令,直观。

    report_clock_networks –name mynetwork  

    check_timing –override_defaults no_clock

    确定了主时钟,就可以对其创建时钟周期约束:

    情形1:主时钟之间有明确的相位关系

    -waveform不仅确定了时钟的占空比,也确定了时钟之间的相位关系。

    (1)clka频率为200Mhz,等占空比。(初始化为1,waveform不是从0开始)

    (2)clkb频率为100Mhz,占空比为40:60。

    (3)clkc频率为200Mhz,等占空比,时钟抖动为120ps。

    下面这些指令,可以在tools --- language templates  ---- XDC   里面对应查找


    create_clock -name <clock_name> -period <period> [get_ports <clock port>]
              
               

     

    情形2:主时钟之间为异步关系

    主时钟之间如果是异步关系,则需要通过set_clock_groups命令明确指定。

    set_clock_groups -asynchronous -group <clock_name_1> -group <clock_name_2>
     

     

    如果两个主时钟还通过MMCM或PLL生成了其他时钟,若这两个主时钟为异步关系,则它们的生成时钟也为异步关系。

    学习了创建时钟,和异步时钟,就迫不及待的试了一下。我用的是一个SRIO 的例子,代码中有3路X4 的srio。在XDC文件中创建了SRIO 的参考输入时钟(也就是代码中引脚输入的时钟),同时把这三个时钟设置为不相关。但是,查看编译时间,生成bit文件的时间前后并未变化,糟糕的是,竟然IP核内部还出现了时序错误……IP 核内部代码时序报错,一脸懵,又不知道怎么改。

     

    后来,查看IP核当时的生成文件,_ooc.xdc 。这个文件是在创建IP核的时候就生成的。里面不仅有参考时钟输入约束(也就是端口的引脚输入),还有内部GTX 生成时钟的约束。猜想可能是IP核已经创建的时候,我自己再创建的,不太好吧。

     

     

    3:差分时钟的约束

    差分时钟只约束P端即可

    4:在同一端口创建多个时钟

    5:高速收发器的时钟约束

        记得好像是IP核中的XDC文件已经自动约束了,需要查验一下。

    6:创建虚拟时钟

       只有在创建输入或输出延迟约束时才会使用虚拟时钟。顾名思义,虚拟时钟并没有与之绑定的物理引脚。之所以创建虚拟时钟,是因为传输给FPGA的数据所用到的捕获时钟是由FPGA内部生成的,与主时钟频率不同;或者PCB上有clock  buffer导致时钟延时不同。

      如下图所示,din的发送时钟为200MHZ,而FPGA的主时钟clkin为100MHZ,捕获时钟由该主时钟通过MMCM生成。

    create_clock –name sysclk –period 10 [get_ports clkin]

    create_clock –name vclk –period 5

    set_input_delay 2 –clock vclk [get_ports din]

    上述的时间单位,都是ns。

     下图是clock buffer导致时钟延迟不同。

                               

       create_clock –name –period 10 [get_ports clkin]

       create_clock –name –period  10

       set_clock_latency  -source 1 [get_clocks virclk]

    set_input_delay –clock virclk –max 4 [get_ports din]

    set_input_delay –clock virclk –min 2 [get_ports din]

     

    谨慎使用为路径约束,时序错误基本都是代码逻辑写的不正确,最先要从代码查找问题。伪路径并不表示该路径不存在,而是指基于该路径的电路功能不会发生或该路径无须时序约束。(基于该路径的电路功能不会发生,以前也遇到过用了伪路径,的确没有时序错误,但是代码逻辑不对了)。对于异步时钟的跨时钟域路径,要从设计上保证跨时钟路径的安全性,从约束角度而言可以将其设置为伪路径。

    set_false_path –from[] –to [] 。 通常在图形化界面中设置,XDC文件自动生成。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 基本时序约束命令

    2019-01-17 19:39:28
    在 进行FPGA的设计时,经常会需要在综合、实现的阶段添加约束,以便能够控制综合、实现过程,使设计...下面主要总结一下Xilinx FPGA时序约束设计和分析。    一、周期约束  周期约束是Xilinx FPGA 时序约束中最常...
  • 例程代码:这是一个计数器,为了很好的演示时序约束,使用PLL IP核创建了一个时钟 第一个文件,也是顶层文件,count.v module counter(Clk,rst_n,pio); input Clk; //系统时钟,50M input rst_n; //全局复位,低...
  • 由于该系列文章阅读有顺序性,所以请跳转至该系列文章第一篇从头开始阅读,并按照文章末尾指示按顺序阅读,否则会云里雾里,传送门在此:...1 时序约束与时序分析 1.1 保证数字电路的正确性 ...
  • xilinx时序约束

    千次阅读 2014-04-28 16:56:04
    在进行FPGA的设计时,经常会需要在综合、实现的阶段添加约束,以便能够控制综合、实现过程,使设计...下面主要总结一下Xilinx FPGA时序约束设计和分析。    一、周期约束  周期约束是Xilinx FPGA 时序约束中最常
  • 对自己的设计的实现方式越了解,对自己的设计的时序要求越了解,对目标器件的资源分布和结构越了解,对EDA工具执行约束的效果越了解,那么对设计的时序约束目标就会越清晰,相应地,设计的时序收敛过程就会更可控。
  • DC 时序约束

    千次阅读 2017-10-16 19:40:18
    前面介绍的设计都不算很复杂,都是使用时钟的默认行为作为电路的约束,都存在有路径给你约束,即信号的变化要在一个时钟周期内完成,并达到稳定值,以满足寄存器的建立和保持的要求。此外进行可测性设计(design for ...
  • 时序约束实战篇

    2020-08-24 17:01:29
    文章目录行万里路--时序约束实战篇1. 梳理时钟树2. 约束主时钟3. 约束衍生时钟4. 延迟约束5. 伪路径约束6. 多周期路径约束 本文摘抄自: 个人网站:http://www.technomania.cn/ 微信公众号:Quant_times、Reading_...
  • ISE时序约束学习笔记

    2021-01-19 11:53:09
    ISE时序约束(参考Xilinx UG612) Global Offset golbal offset 的约束语句如下: ...实现图中时序约束的具体代码为: NET "SysClk" TNM_NET = "SysClk"; TIMESPEC "TS_SysClk" = PERIOD "SysClk" 5 n
  • 时序约束(一)

    2020-10-17 23:32:19
    FPGA设计过程中的时序部分在低速系统下可能涉及的比较少,甚至在某些情况下可以不进行约束,但是在高速系统下时序分析与时序约束则比较重要。时序分析与时序约束直接影响系统所能运行的频率以及稳定性,而FPGA的优势...
  • 时序路径   典型的时序路径有4类,如下图所示,这4类路径可分为片间路径(标记①和标记③)和片内路径...应用约束 ①输入端口到FPGA内部第一级触发器的路径 ChipA/clk rega/D set_input_delay ②FPGA内部触发...
  • 1,I/O引脚不加以约束,很可能出现问题 例如,基于ADV7123芯片的RGB数字时序转VGA模拟时序 如果不加以I/O时序约束,那么得到的图像有点问题 解决方法:时钟:使用clk取反后的时钟 图像输出
  • 11 FPGA时序约束实战篇之伪路径约束

    千次阅读 2020-01-29 12:44:52
      在不加伪路径的时序约束时,Timing Report会提示很多的error,其中就有跨时钟域的error。 我们可以直接在上面右键,然后设置两个时钟的伪路径。 这样会在xdc中自动生成如下约束: set_false_path -from ...
  • FPGA的时序约束

    2019-09-04 14:31:44
    在进行FPGA的设计时,经常会需要在综合、实现的阶段添加约束,以便能够控制综合、实现过程,使设计满足我们需要的运行速度、引脚位置等要求。通常的做法是设计编写约束文件并导入到综合实现工具,在进行FPGA/CPLD的...
  • 时序约束搜集整理

    2020-07-12 19:50:24
    XDC的基本语法可以分为时钟约束、I/O约束以及时序例外约束三大类。端口进来的主时钟以及GT的输出RXCLK/TX CLK都必须由用户使用create_clock自主创建。而衍生时钟 MMCM/PLL/BUFR的输出时钟都可以由Vivado自动推导 ...
  • FPGA时序约束学习

    2019-11-22 14:00:14
    时序(timing)是与FPGA速度相关的三大指标之一,其余两个为延时(latency)和吞吐量(throughput),这三个指标是相互影响的,...接下来就讲讲lattice芯片中与时序约束相关的东西吧,我也是初学者,有很多不足之处...
  • xilinx 时序约束

    2015-06-26 13:47:50
    前一段时间调试了 xilinx 的板子上跑代码,自己加 IP 核,看了它的 约束文件,在网上找了一些讲语法的资料,自己整理了一下,我感觉 在你了解了语法之后,确实得好好看一下它自己给出的约束,有些我 自己没用到,我...
  • FPGA时序约束一点总结

    2018-06-04 09:34:26
    时序约束的一点总结。打拍。掌握好时序。手动分配位置,这个不是一定有效。打破层级或者物理综合,或者自动加流水等综合优化参数调整。根据实际情况使用异步时钟策略。换速度更快的片子。最也进接手一个对时序要求很...
  • Vivado时序约束(转载)

    千次阅读 2019-05-21 21:07:15
    Vivado时序约束 本文主要介绍如何在Vivado设计套件中进行时序约束,原文出自Xilinx中文社区。 1 Timing Constraints in Vivado -UCF to XDC Vivado软件相比于ISE的一大转变就是约束文件,ISE软件支持的是UCF(User ...
  • 一个设计的时序报告中,design run 时序有红色,裕量(slack)为负数时,表示时序约束出现违例,虽然个别违例不代表你的工程就有致命的问题,但是这是一个风险(时序报告是按照工艺、电压以及温度的上下限给出的...
  • FPGA时序约束

    千次阅读 2015-01-01 19:02:19
    时序性能是 FPGA 设计最重要的指标之一。造成时序性能差的根本原因有很多,但其直接原因可分为三类: 布局较差、逻辑级数过多以及信号扇出过高。下面通过时序分析实例来定位原因并给出相应的解决方案。 1.布局太...
  • input_delay和output_delay时序约束

    万次阅读 2018-09-20 11:04:47
     在高速系统中FPGA时序约束不止包括内部时钟约束,还应包括完整的IO时序约束和时序例外约束才能实现PCB板级的时序收敛。因此,FPGA时序约束中IO口时序约束也是一个重点。只有约束正确才能在高速情况下保证FPGA和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,740
精华内容 4,296
关键字:

时序约束代码