精华内容
下载资源
问答
  • 2021-10-03 12:45:59

    1时序分析和时序约束

    时序分析的目的:
    通过分析FPGA设计中各个寄存器之间的数据和时钟传输路径,来分析数据延迟和时钟延迟的关系。一个良好的设计系统,必然能够保证整个系统中的所有寄存器都能够正确的寄存数据。
    数据和时钟路径是由EDA软件,通过对特定器件布局布线得到的。
    时序约束的目的:
    (1)告知EDA软件,本设计需要达到怎样的时序指标,然后EDA软件会根据时序的各个参数,尽量优化布局,以达到该指标。
    (2)协助EDA软件进行分析设计的时序路径,以产生相应的时序报告。

    2例子分析

    2.1实现代码

    `timescale 1ns / 1ps
    //
    module top(
        input            sys_clk,
        input  [0:0]     a,
        input  [0:0]     b,   
        output reg [0:0] c
        );   
        
        reg  [0:0]  a_reg;
        reg  [0:0]  b_reg;
        wire [0:0]  c_wire;   
        
        always@(posedge sys_clk)
        begin
            a_reg<=a;
            b_reg<=b;
        end 
        
        assign c_wire=a_reg & b_reg;   
        
        always@(posedge sys_clk)
        begin
            c<=c_wire;
        end  
          
    endmodule
    
    
    
    

    2.2时序分析的基本模型

    在这里插入图片描述
    D触发器需要用到DFF,与门需要用到LUT。
    延迟产生原因:
    (1)内部连线走线延迟;
    (2)组合逻辑电路延迟。

    Tco:时钟上升沿到达D触发器的D端 到 数据输出到Q端的延迟。
    Tsu:寄存器稳定数据的建立时间,由目的寄存器自身的特性决定。在时钟信号的上升沿到达时钟接口时,触发器的数据输入端(D)必须提前N纳秒稳定下来,否则无法保证数据正确存储。也就是说,D触发器D端口的数据必须比时钟上升沿提前Nns到达D触发器的端口。
    为了保证正确接收数据,内部连线走线延迟+组合逻辑电路延迟必须小于sys_clk- Tsu。如下图所示。

    请添加图片描述
    例子分析:
    a=1,b=1;间隔一定的时间,a变成0;
    在这里插入图片描述

    图中,a_reg_D指的是寄存器a的D端,a_reg_Q指的是寄存器a的Q端。

    更多相关内容
  • 空战时机时序约束下的任务分配
  • 本文在衔接上一讲的基础上,推出了,针对时序约束的解决方案,这些方案来源于多方资料、以及官网资料的阅读总结。   不少人总说,好的时序都是设计出来的,不是约束出来的,想必,这种话你一定听过无数次,...
  • 时序分析和时序约束基础时序分析和时序约束基础1. 时序分析2. 时钟约束 时序分析和时序约束基础 1. 时序分析 以下图所示的电路为例,电路由两个 D 触发器 Reg1 和 Reg2 组成,数据从 Reg1 的 D 端口输入,经过 Reg1 ...

    时序分析和时序约束基础

    1. 时序分析

    以下图所示的电路为例,电路由两个 D 触发器 Reg1 和 Reg2 组成,数据从 Reg1 的 D 端口输入,经过 Reg1 的寄存从 Reg1 的 Q 端口输出,再经过一段组合逻辑电路,输入 Reg2 的 D 端寄存。
    为了能够使数据正确的被 Reg2 寄存,需要满足以下时序。
    时序电路示意图

    • 建立时间 T s u T_{su} Tsu
      数据在时钟上升沿 (假设使用的时钟边沿为上升沿) 到来前需要稳定一段时间,这段时间的最小值即为建立时间,当稳定时间小于建立时间时数据无法被寄存。
    • 保持时间 T h T_h Th
      数据在时钟上升沿 (假设使用的时钟边沿为上升沿) 到来后需要保持一段时间,这段时间的最小值即为保持时间,当稳定时间小于保持时间时数据无法被寄存。
    • 传播延时 T c o T_{co} Tco
      当时钟上升沿到来时,数据从同一个寄存器的 D 端口稳定传输到 Q 端口所需要的时间。即 Q 端口并不是在时钟上升沿到来时立刻变化。
    • 数据组合逻辑传输时间 T d a t a T_{data} Tdata
      数据在组合逻辑电路中传输耗费的时间。
    • 时钟偏斜 T s k e w T_{skew} Tskew
      同一时钟信号到达源寄存器 (Reg1) 和目的寄存器 (Reg2) 的差值,一般为到达目的寄存器的时间减去到达源寄存器的时间。
    • 时间裕度 T s l a c k T_{slack} Tslack
      当数据到达 Reg2 的 D 端口时,此时还未到达 Reg2 的建立时间,中间的差值即为时间裕度。

    所有的参数在下图的时序图中标出,其中 Clk1、D1、Q1 分别为 Reg1 的时钟信号、D 端口信号、Q 端口信号,Clk2、D2、Q2 分别为 Reg2 的时钟信号、D 端口信号、Q 端口信号。
    时序分析示意图

    经过简单分析可以得到下面的公式,其中 T c l k T_{clk} Tclk 为时钟周期。
    T c o + T d a t a + T s l a c k + T s u − T s k e w = T c l k T_{co} + T_{data} + T_{slack} + T_{su} - T_{skew} = T_{clk} Tco+Tdata+Tslack+TsuTskew=Tclk

    • 为了满足建立时间,需要让 D2 端口的信号比 Reg2 的时钟沿提前一个建立时间到达,需要满足
      T c o + T d a t a < T c l k + T s k e w − T s u T_{co} + T_{data} < T_{clk} + T_{skew} - T_{su} Tco+Tdata<Tclk+TskewTsu
      也可以通过 T s l a c k T_{slack} Tslack 判断,当 T s l a c k T_{slack} Tslack 为正值时,时序满足, T s l a c k T_{slack} Tslack 越大时间裕度越好,即
      T s l a c k = T c l k + T s k e w − T c o − T d a t a − T s u > 0 (1.2.1) \tag{1.2.1} T_{slack} = T_{clk} + T_{skew} - T_{co} - T_{data} - T_{su} > 0 Tslack=Tclk+TskewTcoTdataTsu>0(1.2.1)

    • 为了满足保持时间,以 D2 端口为例,D2 端口应该在保持时间内都稳定不变,即新的 D2 端口信号应该晚于 Reg2 时钟沿一个保持时间到达,即
      T c o + T d a t a > T s k e w + T h (1.2.2) \tag{1.2.2} T_{co} + T_{data} > T_{skew} + T_h Tco+Tdata>Tskew+Th(1.2.2)

    时序分析中需要同时满足建立时间和保持时间,一般来说因为 T d a t a T_{data} Tdata 的存在,保持时间基本都会满足。

    2. 时钟约束

    时序约束分析电路

    时序约束就是我们给出描述电路功能的硬件语言代码,以及要求的时序条件,比如时钟周期、时钟偏斜、输入延迟、扇出、面积等,EDA 软件再根据要求,从内部器件库中选择合适的器件搭建电路。
    以上图所示的电路结构为例,Module模块中是需要综合的部分,也即我们的硬件语言代码描述的部分,Module中路径可以分为四种,分别为

    1. Path1: 前级寄存器的 clk 端口到后级寄存器的 D 端口
    2. Path2: 模块的输入端口到第一个寄存器的 D 端口
    3. Path3: 最后一个寄存器的 D 端口到模块的输出端口
    4. Path4: 模块的输入端口到模块的输出端口

    首先分析四条路经中唯一没有和模块外界直接连接的路径 Path1,根据 1.2 节中的公式 (1.2.1) 和 (1.2.2),其中 T c o T_{co} Tco T d a t a T_{data} Tdata T s u T_{su} Tsu T h T_h Th 这些参数均与器件相关,EDA 软件可直接从器件库中计算得出,但是对于 T c l k T_{clk} Tclk T s k e w T_{skew} Tskew 这些与时钟相关的参数,因为时钟一般由模块外部的晶振、PLL 等提供,EDA 软件是不知道的,所以需要我们告诉 EDA 软件这些跟时钟有关的参数,这个过程也就是时钟约束
    关于时钟的参数除了我们在 1.2 节中提到的周期、偏斜以外,还有延迟、抖动、转换,下面依次介绍。
    同样以两个相邻的寄存器的数据传输为例,如图所示由 PLL 生成的源时钟信号 CLK_SOURCE 经过一段路径传输到模块的时钟输入端口 CLK_IN,进而又在模块中分别传输到 Reg1 和 Rge2 的时钟端口 CLK1 和 CLK2。

    时钟约束分析电路

    • 时钟周期 Cycle
      时钟周期很好理解,DC(Design Compiler) 中相关命令为

      create_clock -period 10 [get_ports clk] //创建周期为10ns的时钟信号clk
      
    • 时钟延迟 Latency
      时钟延迟分为两部分,一部分是从源时钟 CLK_SOURCE 到模块时钟输入端口 CLK_IN 的延迟,称为 Source latency,对应图中 Source latency;另一部分是从模块输入时钟端口 CLK_IN 到寄存器的时钟端口 CLK1/CLK2,称为 Network latency,对应图中 network_latency1 和 network_latency2。
      DC 中相关命令为

      set_clock_latency -source 3 [get_clocks clk]
      set_clock_latency 3 [get_clocks clk]
      

      时钟延迟和偏斜

    • 时钟偏斜 Skew
      由于延迟的存在,时钟到达每个寄存器的延迟都不相同,导致不同寄存器的时钟信号存在相位差,称为时钟偏斜。时钟偏斜可以分为两种,全局时钟偏斜和局部时钟偏斜。
      全局时钟偏斜为模块中延迟最大的寄存器的时钟信号与延迟最小的寄存器的时钟信号相位的差值。
      局部时钟偏斜是两个相邻的寄存器时钟信号的相位差值,即源寄存器和目的寄存器,局部时钟偏斜影响着时间裕度。

    • 时钟抖动 Jitter
      由于晶振本身稳定性,电源以及温度变化等原因造成的在连续时钟周期内时钟频率的变化。如图所示,对于相邻的两个周期,前一个周期长度为 T 1 T1 T1,后一个周期长度为 T 2 T2 T2,有时钟偏斜 J i t t e r = T 2 − T 1 Jitter = T2 - T1 Jitter=T2T1
      时钟抖动

    • 时钟不确定度 Uncertainty
      在 DC 中,将时钟偏斜 Skew 和时钟抖动 Jitter 合并在一起称为不确定度,因为 Skew 和 Jitter 均对时钟信号的相位有影响,我们预估最大全局时钟偏斜的绝对值为 Skew_abs,最大时钟抖动的绝对值为 Jitter_abs,分别对建立时间和保持时间进行分析。
      对于建立时间,如图所示,原时钟周期为 T,在最坏情况下,由于时钟抖动,该周期长度减小至 T’ = T - Jitter,由于时钟偏斜,目的寄存器时钟沿提前源寄存器 Skew_abs 时间到达。在 t0 时刻源寄存器 (Reg1) 的 Q 端开始向前传输数据,目的寄存器对应的时钟边沿由 t3 时刻提前至 t1 时刻,相当于时钟提前达到了 (Skew_abs+Jitter_abs),将该时间称为 set Uncertainty。
      建立时间不确定度

      对于保持时间,如图所示,由于保持时间考虑的源寄存器和目的寄存器的时钟边沿属于同一周期,时钟抖动不产生影响,在最坏情况下,目的寄存的时钟沿相对源寄存器延迟到达 Skew_abs 时间,目的寄存器对应的时钟边沿由 t0 时刻延迟至 t1 时刻,相当于目的寄存器的时钟沿延后了 Skew_abs 时间,将该时间称为 hold Uncertainty。
      保持时间不确定度

      DC 中相关命令为

      set_clock_uncertainty -setup 0.5 [get_clocks clk]
      set_clock_uncertainty -hold 0.5 [get_clocks clk]
      
    • 时钟转换 Transition
      实际上时钟信号从低电平到高电平或者从高电平到低电平需要时间,转变所需要的时间即 Transition,一般定义为上升转换时间为电压的20%上升至80%的时间。
      DC中相关命令为

      set_clock_transition -max 0.2 [get_clocks clk]
      

    需要注意的是以上的时钟属性中,Jitter、 Transition 和 Source latency 完全由模块外部晶振、PLL 等因素决定,而 Skew、Network latency 完全由模块内布局布线决定,也就是模块内时钟树。而时钟树综合一般与逻辑综合分开,在时钟树综合前 (pre-CTS),我们需要预估出时钟树的Skew、Network latency。而在时钟树综合后 (post-CTS),这些参数则可以通过计算精确得到,我们只需要设置模块外部的时钟参数即可。

    参考
    时序基本介绍——Jitter与Skew区别
    CTS学习记录3-preCTS&post CTS&post route
    DC(三)——时钟约束

    展开全文
  • FPGA设计之时序约束四大步骤 作者:潘文明 本文章探讨一下FPGA的时序约束步骤,本文章内容,来源于配置的明德扬时序约束专题课视频。 时序约束是一个非常重要的内容,而且内容比较多,比较杂。因此,很多读者对于...
      • FPGA设计之时序约束四大步骤

    作者:潘文明

    本文章探讨一下FPGA的时序约束步骤,本文章内容,来源于配置的明德扬时序约束专题课视频。

    时序约束是一个非常重要的内容,而且内容比较多,比较杂。因此,很多读者对于怎么进行约束,约束的步骤过程有哪些等,不是很清楚。明德扬根据以往项目的经验,把时序约束的步骤,概括分成四大步,分别是时钟的约束、input delays的约束、output delays的约束和时序例外。

    时序约束是有先后的,首先要做时钟约束、其次是input delays约束、再次是output delays约束,最后才是时序例外的约束。这是一个完整的大步骤,也就是说我们在项目开始阶段就可以约束我们的时钟,把我们时钟的频率、周期、来源等等定义好。这一步做完之后,先不要做二三四步。这时候我们要完成我们的设计,要把我们内部的时序都完成之后才做第二步设置“input delays”,比如说我们从外部进来的一个情况。第三步output delays,也就是说要往下游器件发送的一个时序情况。当这一二三步都做完之后,我们在最后项目的阶段才做一个时序例外的情况。时序例外也就是说哪些时序是不需要分析的,这种情况要设置好。最后我们才能把整个时序约束完成。

    以上是大的步骤,但事实上每一个步骤又可以细分成很多种情况。例如时钟约束,时钟可以分很多种,一种是差分时钟,一种是管脚进来的时钟、还有我们PLL产生时钟等等。还有一种是有数据但没有时钟的情况。input delays、output delays也有很多种,我们到底要怎么样去分析,怎么去看。明德扬就把这四个步骤再进行细化,就是根据情况来分别列出来。

    下面分别展开描述。

        1. 时钟

    时钟约束可以分成很多种情况,不同的情况就有不同的约束方法,一般有哪几种情况呢?

    如上图,时钟约束概括地,可以分成三种情况,分别是输入时钟、PLL等衍生时钟以及自己分步的时钟。

          1. 输入时钟

    输入时钟是指时钟从FPGA管脚进来的情形,这也是最常见的情况。根据输入的管脚的不同,输入时钟情况又可以分成:输入管脚是单端的、输入管脚是差分的,以及GT或者恢复时钟三种情况。

    第一种:输入管脚是单端的,即时钟直接从管脚进来、并且是单端信号。例如普通低速晶振,大部分是这种情况,明德扬的FPGA ALTERA学习板,如MP801、MP603,其时钟均是由晶振产生,送到FPGA,并且是单端的信号。

    第二种:输入管脚是差分的,即时钟直接从管脚进来,并且是差分信号。大部分高速晶振、LVDS接口等,属于此情形。例如明德扬FPGA XILINX学习板,如MP802,其包含了PCIE管脚,其输入的时钟就是差分的;这个板子的DDR的驱动时钟,时钟频率在200M左右,也是属于此种以情形。

    第三种:GT或者恢复时钟,即使用了高速收发器的情形。在高速收发器管脚中,是没有时钟的,时钟已经嵌入到数据里面,使用FPGA的GTX IP核接收数据,并且从数据恢复出时钟。这个恢复出来的时钟就是此种情形。最常见的就是光纤接口。

          1. PLL等衍生时钟

    那假如说我不是输入管脚,而是PLL产生的输出时钟,这个 就是PLL等衍生时钟。这种时钟,FPGA的工具,会自行推导,一般无需约束,但实质应用中,强烈建议约束,会有好处的,好处在下一篇文章中说明。

          1. 自己分频的时钟

    还有一种情况是自己分频的时钟,假如说我们自己写了一个计数器,把它二分频、四分频、八分频等,分频出来的信号当为时钟,这种情况就是自己分频的时钟。

    首先说明,明德扬不推荐使用此方法来产生时钟。但确实要用到分频时钟时,那就要记得做时钟约束。这种情况下要怎么进行约束呢?

    以上概括了说明了时钟的几种情况,每种情况下,其约束方法都有些不同以及注意点。具体约束方法,可以看后续文章的内容。

        1. input delays

    input delay约束,即输入延时约束,是时序约束的重点,input delay 又分几种呢?

    如上图,input delay约束概括地,可以分成三种情况,分别是系统同步、源同步和有数据无时钟。

          1. 系统同步

    第一个是系统同步方式,也就是说整个电路板上FPGA以及上游器件都共用一个时钟,并且相位严格相同,这个就是系统同步的方式。

          1. 源同步

    第二种是源同步的方式,源同步是怎么样?就是上游器件,把数据和时钟信号一起送到FPGA上来的,那这种就是源同步。

    源同步是更常用的一种方式,系统同步比较少用,为什么呢?因为要做到上游器件跟FPGA的相位差为0,没有一点时钟差,这种要求非常高。而源同步是数据跟时钟都是从上游器件一起输送过来给FPGA,这是一种更常用的方式。

    这个源同步,又有很多种,具体SDR、DDR和有数据无时钟三种情况。

    第一种:SDR。SDR是指时钟是单沿有效的方式,比如说我只用上升延或者下降延的一个方式,SDR约束的参数,其获取的方法有两种:查看上游器件手册(通过查看上游器的数据手册,获取参数)以及通过示波器测量(通过示波器测量信号的相位差,获取参数)。

    第二种:DDR。DDR是另一种方式,它是一种时钟双沿有效的一个方式。也就说即用它的上升延,也用它的下降延。例如说我们的DDR2、DDR3的时钟,都是上下降沿一直采数据的;包括千兆网的RGMII接口,也是通过双沿的方式。

    DDR的这种情况,我们还可以继续划分成中心对齐和边沿对齐两种情况。

    中心对齐是指:时钟边沿始终在数据的中间,时钟上升沿的左右两边,数据都是稳定的。边沿对齐是指:时钟和数据边沿对齐的,在时钟变化沿两边,其数据是不稳定的。

    第三种:有数据无时钟。第三种就是有数据无时钟的情况。例如说常见的串口。串口是直接数据过来的,它是没有随路时钟过来的。而我们用本地时钟去采样,就会出现有数据无时钟。那对于这种我们应该怎么去约束,又是另一种情况。

        1. output delays

    输出延时约束和输入延时一样,也是约束的重点。output delay 我们主要分两种,系统同步和源同步。

          1. 系统同步

    整个电路板上FPGA以及下游器件都共用一个时钟,并且相位严格相同,这个就是系统同步的方式。此时FPGA往下游器件发送数据,这时候只传送数据线就可以了。而时钟跟FPGA共用一个的,不需要传时钟。

          1. 源同步

    源同步就是FPGA往这个器件发数据,在发数据过程中也发一个时钟过去,这是一个随路时钟的一个方式,是源同步。

    源同步我们还分SDR和DDR。

    第一种:SDR。SDR是指时钟是单沿有效的方式,比如说我只用上升延或者下降延的一个方式,SDR约束的参数,其获取的方法有两种:查看上游器件手册(通过查看上游器的数据手册,获取参数)以及通过示波器测量(通过示波器测量信号的相位差,获取参数)。示波器测量比较少用。

    第二种:DDR。DDR是另一种方式,它是一种时钟双沿有效的一个方式。也就说即用它的上升延,也用它的下降延。例如说我们的DDR2、DDR3的时钟,都是上下降沿一直采数据的;包括千兆网的RGMII接口,也是通过双沿的方式。

    DDR的这种情况,我们还可以继续划分成中心对齐和边沿对齐两种情况。

    中心对齐是指:时钟边沿始终在数据的中间,时钟上升沿的左右两边,数据都是稳定的。边沿对齐是指:时钟和数据边沿对齐的,在时钟变化沿两边,其数据是不稳定的。

        1. 时序例外

    时序例外一般用在clock与IO都约束后,还是不满足时序要求的情况下。主要包括多周期路径、不需要检查的路径和组合电路延时等三种情况,如下图。

          1. 周期路径****

    多周期路径是指完成一个运算需要超过1个时钟周期的情形,多周期路径在IC设计领域运用较多,但在FPGA里应用较少。

          1. 不需要检查的路径

    有一些路径是不需要分析的,具体可以分成三种:常量或伪常量信号、互斥路径和异步时钟。

    第一种:常量或伪常量信号。某些信号虽然不满足时序要求,但实质上该信号在应用场景中,是不会改变的,例如某个开关信号,它在上电时打开后,就一直保持打开状态,不会变来变去。那么这个信号就可以认为是伪常量信号。假设它不满足时序要求,也是无所谓的,因为不会变,不会变就意味着建立时间和保持时间肯定满足,所以不存在问题。这种信号是不需要检查 的。

    第二种:互斥的路径。可以简单认为是双向端口,即代码中,使用inout定义的信号。

    第三种:异步时钟。即信号从一个时钟域,跨到另一个时钟域的情况。这也是不需要检查 的。注意,这里说不用检查,是指完成异步信号同步化后,不用检查的意思。

          1. 组合电路延时

    还有一种是组合电路的延时。组合电路延时就是说我从这个管脚到另一个管脚之间,另一个管脚进来,这个管脚出去中间没有任何一个时钟,这是组合电路给延时的一种情况。

        1. 总结与建议

    前面我们讲了时钟约束、输入延时、输出延时还时序例外的情况。每一种情况又分了很多种,根据它的不同类型来区分,每次约束的时候都是其中的一种情况。比如说CLK差分,就去找时钟,然后根据差分管脚怎么约束,来找到对应情况,按照要求进行约束。这相当于我已经提供一个表给你,你按照这个表去核对。找到对应的情况,按要求进行约束就可以了。

    记住:开始的时候,只是配置时钟,不配置input delay 、 output delays和持续例外。因为我们开始的时候是专心于内部电路,我们时序的一个设计,满足内部要求之后,再去配置我们的接口。在时钟完全通过之后再配置input delay 和output delays 。

    时序例外是最后差不多要完工了再进行配置的。而且这个配置是要很小心。因为我们实际例外,比如说不用检查,我们set false path这种情况,设置好就是表示不用检查。如果在开始的时候,就设置好了,万一中间又要改变,你改变的话,那你忘了把这个约束给干掉了,这种情况就会出现有错误也提示不出来的情况。所以说时序例外应该是最后情况下进行的。

    这个顺序是明德扬经验的一个顺序,我们的项目基本上是按照这个顺序做的。但是不同的公司也会有不同的做法。例如说我一开始全部都不约束,到最后再生约束,这也是可以的。这种做法没有统一标准,反正学明德扬的课程,你就按这个步骤做,去到其他公司,再根据公司要求去做就可以了。

    本文章是基于赛灵思的一个时序约束,ALTERA也是相似的,甚至IC芯片设计领域,也是同样的思路。

    有句话讲的很好,我们的时序是设计出来的,不是约束出来的。所以说时序重要还是不重要?当然重要。但是它不是非常重要,更重要的是假如说我时序出现例外,不满足的时候,更重要是改变你的设计,而不是要求约束。

    下一篇文章,我们将具体探讨“时钟约束”的内容,讲解各种情况下的时序约束方法。需要更多更详细的资料,可以找作者了解。

    总结

    写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于 java开发 的学习思路及方向。从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。

    由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的 点击我的Gitee获取
    还有 高级java全套视频教程 java进阶架构师 视频+资料+代码+面试题!

    全方面的java进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。

    展开全文
  • 时序约束实战篇

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


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

    行万里路–时序约束实战篇

    我们以Vivado自带的wave_gen工程为例,该工程的各个模块的功能较为明确,如下图所示。为了引入异步时钟域,我们在此程序上增加了另一个时钟–clk2,该时钟产生脉冲信号pulse,samp_gen中在pulse为高时才产生信号。
    在这里插入图片描述

    1. 梳理时钟树

    我们首先要做的就是梳理时钟树,就是工程中用到了哪些时钟,各个时钟之间的关系又是什么样的,如果自己都没有把时钟关系理清楚,不指望综合工具会把所有问题暴露出来。
    在我们这个工程中,有两个主时钟,四个衍生时钟,如下图所示。
    在这里插入图片描述
    确定了主时钟和衍生时钟后,再看各个时钟是否有交互,即clka产生的数据是否在clkb的时钟域中被使用。
    在这个工程比较简单,只有两组时钟之间有交互,即:
    a. clk_rx与clk_tx
    b. clk_samp与clk2
    其中,clk_rx和clk_tx都是从同一个MMCM输出的,两个频率虽然不同,但他们却是同步的时钟,因此他们都是从同一个时钟分频得到,因此它们之间需要用set_false_path来约束;而clk_samp和clk2是两个异步时钟,需要用asychronous来约束。
    在这里插入图片描述
    注:图中只有clk_rx到clk_tx的箭头,不应该有从clk_tx到clk_rx的箭头。
    完成以上两步,就可以进行具体的时钟约束操作了。

    2. 约束主时钟

    在这一讲开讲之前,我们先把wave_gen工程中的wave_gen_timing.xdc中的内容删掉,即先看下载没有任何时序约束的情况下会综合处什么结果?
    对工程综合并Implementation后,Open Implementation Design,会看到下图所示内容。
    在这里插入图片描述
    可以看到,时序并未收敛。由于在改工程中,用了一个MMCM,并在里面设置了输入信号频率,因此这个时钟软件会自动加上约束,则不存在之前讲的“如果我们不加时序约束,软件是无法得知我们的时钟周期是多少,PAR后的结果是不会提示时序警告的”。
    接下来,我们在Tcl命令行中输入report_clock_networks -name mainclock,显示如下:
    在这里插入图片描述
    输入下列语句,创建时钟

    create_clock -name clk2 -period 25 [get_ports clk_in2]
    

    3. 约束衍生时钟

    系统中有4个衍生时钟,但其中有两个是MMCM输出的,不需要我们手动约束,因此我们只需要对clk_samp和spi_clk进行约束即可。约束如下:

    create_generated_clock -name clk_samp -source [get_pins clk_gen_i0/clk_core_i0/clk_tx] -divide_by 32 [get_pins clk_gen_i0/BUFHCE_clk_samp_i0/o]
    create_generated_clock -name spi_clk -source [get_pins dac_spi_i0/out_ddr_flop_spi_clk_i0/ODDR_inst/C] -divide_by 1 -invert [get_pins spi_clk_pin]
    

    我们再运行report_clocks,显示如下:
    在这里插入图片描述
    我们再理论篇“create_generated_clock”一节中讲到,我们可以重新设置Vivado自动生成衍生时钟的名字,这样可以更方便我们后续的使用。按照前文所讲,只需设置name和source参数即可,其中这个source可以直接从report_clocks中得到,因此我们的约束如下:

    create_generated_clock -name clk_tx -source [get_pins clk_gen_i0/clk_core_i0/inst/mmcm_adv_inst/CLKIN1] [get_pins clk_gen_i0/clk_core_i0/inst/mmcm_adv_inst/CLKOUT1]
    create_generated_clock -name clk_rx -source [get_pins clk_gen_i0/clk_core_i0/inst/mmcm_adv_inst/CLKIN1] [get_pins clk_gen_i0/clk_core_i0/inst/mmcm_adv_inst/CLKOUT0]
    

    大家可以对比一下repot_clocks的内容和约束指令,很容易就能看出他们之间的关系。
    把上述的约束指令在Tcl中运行后,我们再运行一遍repot_clocks,显示如下:
    在这里插入图片描述
    在时序的分析中,我们看到,clk_samp和clk2这两个异步时钟之间存在数据交互,因此要进行约束,如下:
    在这里插入图片描述

    4. 延迟约束

    对于延迟约束,比较麻烦一些,因为有时还要计算PCN上的走线延迟导致的时间差。而且不加延迟约束,Vivado也只是在Timing Report中提示warning,并不会导致时序错误。
    在这里插入图片描述
    比如在很多的ADC设计中,输出的时钟边沿刚好是数据的中心位置,而如果我们不加时序约束,则Vivado会默认时钟和数据是对齐的。
    在这里插入图片描述
    对于输入管脚,首先判断捕获时钟是主时钟还是衍生时钟,如果是主时钟,直接用set_input_delay即可,如果是衍生时钟,要先创建虚拟时钟,然后再设置delay。对于输出管脚,判断有没有输出随路时钟,若有,则直接使用set_output_delay,若没有,则需要创建虚拟时钟。
    在本工程中,输入输出数据管脚的捕获时钟如下图所示:
    在这里插入图片描述
    根据上表,我们创建的延迟约束如下,其中的具体数字在实际工程中药根据上下游器件的时序关系(在各个器件手册上可以找到)和PCB走线延迟决定。未避免有些约束有歧义,我们把前面所有的约束也加进来。
    在这里插入图片描述

    5. 伪路径约束

    在不加伪路径的时序约束是,Timing Report会提示很多的erro,其中就有跨时钟域的error.
    在这里插入图片描述
    我们可以直接在上面右键,然后设置来哥哥时钟的伪路径。
    在这里插入图片描述
    这样会在xdc中自动生成约束。
    我们可以手动天界这两个时钟的伪路径如下:
    在这里插入图片描述
    伪路径的设置是单向的,如果两个时钟直接存在相互的数据的传输,则还需要添加从clk_tx到clk_rx的路径,这个工程中只有从rx到tx的数据传输,因此这一条就可以了。
    异步复位也需要添加伪路径,rst_pin的复位输入在本工程中就是当做异步复位使用,因此还需要添加一句:
    在这里插入图片描述
    对于clk_samp和clk2,它们之间存在数据交换,但我们在前面已经约束过asynchronous了,这里就可以不用重复约束了。
    这里需要提示一点,添加上面这些约束后,综合时会提示xdc文件的warning。
    在这里插入图片描述
    但这可能是Vivado综合过程中,读取到该约束文件时,内部电路并未完全建好,就出现了没有发现clk_gen_i0/clk_core_io/inst/mmcm_adv_inst/CLKIN1等端口的情况,有如下几点证明:

    1. 这个路径在代码中确实存在
    2. 若把该sdc文件,设置为仅在Implementation中使用,则不会提示该warning
    3. 在Implementation完成后,无论是Timing Report还是通过tcl的report_clocks指令,都可以看到这几个时钟已经被正确约束。下图所示即为设置完上面的约束后的Timing Report。
      4.

    6. 多周期路径约束

    多周期路径,我们一般按照以下几个步骤来约束:
    1.带有使能的数据
    首先来看带有使能的数据,在本工程中的Timing Report中,也提示了同一个时钟域之间的几个路径建立时间不满足要求
    在这里插入图片描述
    其实这几个路径都是带有使能的路径,使能的周期为2倍的时钟周期,本来就应该在2个时钟周期内去判断时序收敛。因此,我们添加时序约束:

    set_multicycle_path 2 -setup -from [get_cells {cmd_parse_i0/send_resp_data_reg[*]} -include_replicated_objects] -to [get_cells {resp_gen_i0/to_bcd_i0/bcd_out_reg[*]}]
    set_multicycle_path 1 -hold -from [get_cells {cmd_parse_i0/send_resp_data_reg[*]} -include_replicated_objects] -to [get_cells {resp_gen_i0/to_bcd_i0/bcd_out_reg[*]}]
    

    也可以这样写

    set_multicycle_path -from [get_cells {cmd_parse_i0/send_resp_data_reg[*]} -include_replicated_objects] -to [get_cells {resp_gen_i0/to_bcd_i0/bcd_out_reg[*]}] 2
    set_multicycle_path -hold -from [get_cells {cmd_parse_i0/send_resp_data_reg[*]} -include_replicated_objects] -to [get_cells {resp_gen_i0/to_bcd_i0/bcd_out_reg[*]}] 1
    

    我们也可以直接右键通过GUI的方式进行约束,效果是一样的。
    在工程的uart_tx_ctl.v和uart_rx_ctl.v文件中,也存在带有使能的数据,但这些路径在未加多路径约束时并未报出时序错误或者警告。
    在接收端,捕获时钟频率是200MHz,串口速率是115200,采用16倍的Oversampling,因此使能信号周期是时钟周期的200e6/115200/16=108.5倍。
    在接收端,捕获时钟频率是200MHz,串口速率是115200,采用16倍的Oversampling,因此使能信号周期是时钟周期的166.667e6/115200/16=90.4倍。
    因此,时序约束如下:

    #串口接收端
    set_multicycle_path -from [get_cells uart_rx_i0/uart_rx_ctl_i0/* -filter IS_SEQUENTIAL] -to [get_cells uart_rx_i0/uart_rx_ctl_i0/* -filter IS_SEQUENTIAL] 108
    set_multicycle_path -hold -from [get_cells uart_rx_i0/uart_rx_ctl_i0/* -filter IS_SEQUENTIAL] -to [get_cells uart_rx_i0/uart_rx_ctl_i0/* -filter IS_SEQUENTIAL] 107
    #串口发送端
    set_multicycle_path -from [get_cells uart_tx_i0/uart_tx_ctl_i0/* -filter IS_SEQUENTIAL] -to [get_cells uart_tx_i0/uart_tx_ctl_i0/* -filter IS_SEQUENTIAL] 90
    set_multicycle_path -hold -from [get_cells uart_tx_i0/uart_tx_ctl_i0/* -filter IS_SEQUENTIAL] -to [get_cells uart_tx_i0/uart_tx_ctl_i0/* -filter IS_SEQUENTIAL] 89
    
    1. 两个有数据交互的时钟之间存在相位差 在本工程中,没有这种应用场景,incident不需要添加此类约束
    2. 存在快时钟到慢时钟的路径 在本工程中,没有这种应用场景,incident不需要添加此类约束
    3. 存在慢时钟到快时钟的路径 在本工程中,没有这种应用场景,incident不需要添加此类约束

    至此,重新Synthesis和Implementation后,可以看到,已经没有时序错误
    在这里插入图片描述
    到这里,教科书版的时序约束教程就基本结束了。但在我们平时的工程中,跟上面这种约束还是有差异的:

    1. 首先是虚拟时钟,这个约束在平时的工程中基本不会用到,像需要设计虚拟时钟的场景,我们也都是通过设计来保证时序收敛,设置虚拟时钟的意义不大。
    2. 第二就是output delay,在FPGA的最后一级寄存器到输出的路径上,往往都使用了IOB,也就是IO block,因此最后一级寄存器的位置是固定的,从buffer到pad的走线延时是确定的。在这种情况下,是否满足时序要求完全取决于设计,做约束只是验证一下看看时序是否收敛。所以也基本不做。但是input delay是需要的,因为这是上一级器件输出的时序关系。
    3. 第三个就是多周期路径,我们讲了那么多多周期路径的应用场景,但实际我们是根据Timing Report来进行约束的,即便那几种场景都存在,但如果Timing Report中没有提示任何时序warning,我们往往也不胡去添加约束。
    4. 第四个就是在设置了多周期后,如果还是提示Intra-Clocks Paths的setup time不过,那就要看下程序,是否写的不规范。比如
      在这里插入图片描述
      这么写的话,如果时钟频率稍微高一些,比如250MHz,就很容易导致从regB到regD的setup time不满足要求。因为begin end里面的代码都是按顺序执行的,要在4ns内完成这些复制与判断逻辑,挑战还是挺大的。因此,我们可以这样改写:
      在这里插入图片描述
      把寄存器的赋值分开,功能还是一样的,只是分到了几个always中,这样就不会导致问题了。
    展开全文
  • xilinx时序约束

    千次阅读 2020-12-19 01:06:29
    在进行FPGA的设计时,经常会需要在综合、实现的阶段添加约束,以便能够控制综合...下面主要总结一下Xilinx FPGA时序约束设计和分析。一、周期约束周期约束是Xilinx FPGA 时序约束中最常见的约束方式。它附加在时钟网...
  • (05)FPGA时序约束三大步骤 1 文章目录 1)文章目录 2)时序约束引言 3)FPGA时序约束课程介绍 4)FPGA时序约束三大步骤 5)技术交流 6)参考资料 2 时序约束引言 1)什么是静态时序分析? 通俗来说:在...
  • vivado中时序约束

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

    千次阅读 2019-04-19 09:10:06
    由于该系列文章阅读有顺序性,所以请跳转至该系列文章第一篇从头开始阅读,并按照文章末尾指示按顺序阅读,否则会云里雾里,传送门在此:...1 时序约束与时序分析 1.1 保证数字电路的正确性 ...
  • 逻辑综合(3)逻辑综合中如何施加时序约束
  • 1、时序约束:两个作用。 (1)为了达到约束的指标。 (2)协助EDA软件获得正确的时序分析报告。 2、时序分析模型 总结: 时间余量slack=时钟周期+时钟偏斜-Tsu-Tco-Tdata Tclk+Tclk2-Tsu-(Tclk1+Tco+Tdata)>=...
  • (95)Vivado时序约束TCL命令-all 1 文章目录 1)文章目录 2)时序约束引言 3)FPGA时序约束课程介绍 4)Vivado时序约束TCL命令-all 5)技术交流 6)参考资料 2 时序约束引言 1)什么是静态时序分析? ...
  • 该文章将描述vivado时序约束编写简单流程并不涉及具体代码。 二:vivado时序约束文件编写 1:建立一个简单的vivado工程,编译运行通过。 2:时序约束文件在综合和布局布线都可以添加,因为我们小的工程综合的时候...
  • 时序约束搜集整理

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

    2020-06-08 20:00:47
    参考bilibili网址:https://www.bilibili.com/video/BV1ME41127So?p=4 参考CSDN网址:... ... 1、如何查看时钟周期约束状态 (1)在上图中tcl命令框里,输入命令 report_clock_neworks -name...
  • vivado 时序约束

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

    千次阅读 2018-08-03 11:23:44
    一、在给FPGA做逻辑综合和布局布线时,需要在工具中设定时序约束。通常,在FPGA设计工具中都FPGA中包含有4种路径:从输入端口到寄存器,从寄存器到寄存器,从寄存器到输出,从输入到输出的纯组合逻辑。通常,需要...
  • 时钟约束分三种情况:输入时钟、PLL等衍生时钟以及自己分频的时钟。而其中输入时钟又可再分三种,第一种是输入管脚是CLK的,第二种是差分时钟,最后一种是GT或恢复的一个时钟。下面分别展开描述。
  • 时序约束(一)

    2020-10-17 23:32:19
    FPGA设计过程中的时序部分在低速系统下可能涉及的比较少,甚至在某些情况下可以不进行约束,但是在高速系统下时序分析与时序约束则比较重要。时序分析与时序约束直接影响系统所能运行的频率以及稳定性,而FPGA的优势...
  • 直到在后来的一次调试中踩了雷,才明白时序约束的重要性,如下verilog代码。 /********************************************************************************************/ reg [31:0]get_num; reg [7:0
  • 时序约束——相关基础概念

    千次阅读 2020-09-17 13:06:39
    时序路径 典型的时序路径有4类: 建立保持时间 典型的时序模型如下图所示,一个完整的时序路径包括源时钟路径、数据路径和目的时钟路径,也可以表示为触发器+组合逻辑+触发器的模型。 Tclk ≥ Tco + Tlogic + ...
  • 例程代码:这是一个计数器,为了很好的演示时序约束,使用PLL IP核创建了一个时钟 第一个文件,也是顶层文件,count.v module counter(Clk,rst_n,pio); input Clk; //系统时钟,50M input rst_n; //全局复位,低...
  • Input delay 时序约束实例 概述: 对Input delay时序约束做以描述以及实例分析。 必备基础:建立时间与保持时间 文章目录1、 IO时序分析的基本模型2、引出Input delay3、Input delay时序约束实例以及时序报告解读4、...
  • 1. 时序路径 ** 典型的时序路径有4类,如下图所示,这4类路径可分为片间路径(标记①和标记③)和片内路径(标记②和标记④)。 对于所有的时序路径,我们都要明确其起点和终点,这4类时序路径的起点和终点分别如下...
  • 也就是单边采样,接下来介绍DDR采样,也就是双边采样,在实验应用中,DDR采样也是很广泛的,比如CMOS、DRAM、ADC、千兆以太网等,都是DDR接口的,因此也需要去分析时序是否正确,学会如何去进行时序约束
  • 基本时序约束命令

    2019-01-17 19:39:28
    在 进行FPGA的设计时,经常会需要在综合、实现的阶段添加约束,以便能够控制综合、实现过程,使设计...下面主要总结一下Xilinx FPGA时序约束设计和分析。    一、周期约束  周期约束是Xilinx FPGA 时序约束中最常...
  • FOGA毕竟不是ASIC,对时序收敛的要求更加严格,本文主要介绍本人在工程中学习到的各种时序约束技巧。首先强烈推荐阅读官方文档UG903和UG949,这是最重要的参考资料,没有之一。它提倡要在设计的早期阶段就要排除问题...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,849
精华内容 5,139
关键字:

时序约束代码