精华内容
下载资源
问答
  • QuartusII时序约束方法

    2018-07-15 19:44:55
    QuartusII时序约束方法,Quartus II 系列资料,包括常用的sdc命令和约束的方法
  • UCF文件中时序约束语法

    千次阅读 2018-05-17 20:24:22
    我总结了以下几种常用的语法:1)周期约束PERIOD 约束是一个基本时序和综合约束,它附加在时钟网线上,时序分析工具根据 PERIOD 约束检查时钟域内所有同步元件的时序是否满足要求,它将检查与同步时序约束端口相连接...
    约束 UCF 文件,从 Constrains Editor 直接输入是最方便、最直接的添加约束的方法了。我总结了以下几种常用的语法:
    1)周期约束
    PERIOD 约束是一个基本时序和综合约束,它附加在时钟网线上,时序分析工具根据 PERIOD 约束检查时钟域内所有同步元件的时序是否满足要求,它将检查与同步时序约束端口相连接的所有路径的延迟,但是不会检查 PAD 到寄存器的路径。
    附加时钟周期约束的首选方法(Preferred Method)语法如下:TIMESPEC “TSidentifier” = PERIOD“TNM_reference” period {HIGH|LOW} [high_or_low_time]其中“[]”内为可选项,“{}”为必选项,参数 period 为要求的时钟周期,可以使用 ps、ns、us 或者 ms 等单位,大小写都可以,
    缺省单位为 ns。HIGH|LOW关键词指出时钟周期里的第一个脉冲是高电平还是低电平,而high_or_low_time 为脉冲的延续时间,缺省单位也是 ns, 如果不提供该项,则缺省占空比为 50%。TIMESPEC 是一个基本时序相关约束标识,表示本约束为时序规范。TSidentifier包括字母 TS 和一个标识符 identifier(为 ASCII 码字符串)共同组成一个时序规范。
    例如定义时钟周期约束时,首先在时钟网线 clk 上附加一个 TNM_NET 约束,把clk 驱动的所有同步元件定义为一个名为 sys_clk 的分组,然后使用 TIMESPEC约束定义时钟周期。NET “clk” TNM_NET=”sys_clk”;

    TIMESPEC “TS_sys_clk”= PERIOD “sys_clk” 50 HIGH 30;而定义派生时钟的语法如下:TIMESPEC “TSidentifier_2”=PERIOD “timegroup_name”“TSidentifier_1” [*or/] factor PHASE [+|-] phase_value [units];其中 TSidentifier_2 为要定义的派生时钟,TSidentifier_1 为已经定义的时钟,factor 指出两者周期的辈出关系,是一个浮点数。phase_value 指出两者之间的相位关系,为浮点数。例如:

    定义主时钟 clk0:

    TIMESPEC “TS01” = PERIOD “clk0” 10.0 ns;

    定义派生时钟 clk180,其相位与主时钟相差 180°:

    TIMESPEC “TS02” = PERIOD “clk180” TS01 PHASE + 5.0 ns;

    定义派生时钟 clk180_2,其周期为主时钟的 1/2,并延迟 2.5ns:

    TIMESPEC “TS03” = PERIOD “clk180_2” TS01 /2 PHASE + 2.5 ns;

    2)偏移约束
    偏移约束规定了外部时钟和数据输入输出引脚之间的时序关系,

    TIMESPEC “TS01” = PERIOD “clk0” 10.0 ns;
    定义派生时钟 clk180,其相位与主时钟相差 180°:
    TIMESPEC “TS02” = PERIOD “clk180” TS01 PHASE + 5.0 ns;
    定义派生时钟 clk180_2,其周期为主时钟的 1/2,并延迟 2.5ns:
    TIMESPEC “TS03” = PERIOD “clk180_2” TS01 /2 PHASE + 2.5 ns;
    2)偏移约束
    偏移约束规定了外部时钟和数据输入输出引脚之间的时序关系,
    只用于与 PAD相连的信号,不能用于内部信号。使用该约束可以为综合实现工具指出输入数据到达 的时刻,或者输出数据稳定的时刻,从而在综合实现中调整布局布线过程,使正在开发的 FPGA/CPLD 的输入建立时间以及下一级电路的输入建立时间满足要 求。
    基本语法如下:
    OFFSET = {IN|OUT} “offset_time” [units] {BEFORE|AFTER} “clk_name”[TIMEGRP “group_name”];
    其中{IN|OUT}说明约束的是输入还是输出,offset_time 为 FPGA 引脚数据变化与有效时钟沿之间的时间差,BEFORE|AFTER 说明 该时间差在有效时钟沿的前面还是后面,TIMEGRP “group_name”定义了约束的触发器组,缺省时约束该时钟驱动的所有触发器。
    3)分组约束
    使用 TNM(Timing Name)约束可以选出构成一个分组的元件,并赋予一个名字,以便给它们附加约束。TNM_NET(timing name for nets)约束只加在网线上,其作用与 TNM 加在网上时基本相同,即把该网线所在路径上的所有有效同步元件作为命名组的一部分。不同之处在于当 TNM 约束 加在 PAD NET 上时,TNM 的值将被赋予 PAD,而不是该网线所在的路径上的同步元件,即 TNM 约束不能穿过IBUF。而用 TNM_NET 约束就不会出现这种情 况。
    4)专门约束

    附加约束的一般策略是首先附加整体约束,例如 PERIOD、OFFSET 等,然后对局部的电路附加专门约束,这些专门约束通常比整体约束宽松,通过在可能的地方尽量放松约束可以提高布线通过率,减小布局布线的时间。FROM_TO 约束在两个组之间定义时序约束,对两者之间的逻辑和布线延迟进行控制,这两个组可以是用户定义的,也可以是与定义的。用户可以使用 TNM_NET、TNM 和 TIMEGRP 定义组,而与定义组主要包括 FFS、LATCHES、PADS 和 RAMS 等。
    语法如下:

    TIMESPEC “TSname” = FROM “group1” TO “group2” value;

    其中 value 为延迟时间,可以使具体数值或表达式。

    MAXDELAY 约束定义了特定网线上的最大延迟,其语法如下:
    NET “net_name” MAXDELAY = value units;
    1: NET "pin_sysclk_i" LOC = AD12 | TNM_NET = pin_sysclk_i;
    2: TIMESPEC TS_pin_sysclk_i = PERIOD "pin_sysclk_i" 15 ns HIGH 50 %;
    3: #
    4: NET "pin_plx_lreset_n_i" LOC = B18;
    5: #
    6: NET "pin_plx_lhold_i" LOC = C17;
    7: NET "pin_plx_lholda_o" LOC = D17 | SLEW = FAST;
    8: #
    9: NET "pin_plx_ads_n_i" LOC = E18;
    10: NET "pin_plx_ads_n_i" OFFSET = IN 6.3 ns AFTER "pin_sysclk_i" HIGH;
    11: #
    12: NET "pin_plx_lw_r_n_i" LOC = E9;
    13: NET "pin_plx_lw_r_n_i" OFFSET = IN 6.3 ns AFTER "pin_sysclk_i" HIGH;
    14: #
    15: NET "pin_plx_blast_n_i" LOC = D18;
    16: NET "pin_plx_blast_n_i" OFFSET = IN 6.3 ns AFTER "pin_sysclk_i" HIGH;
    17: #
    18: NET "pin_plx_lad_io<0>" LOC = AD13 | SLEW = FAST | TNM = LAD;
    19: NET "pin_plx_lad_io<1>" LOC = AC13 | SLEW = FAST | TNM = LAD;
    20: NET "pin_plx_lad_io<2>" LOC = AC15 | SLEW = FAST | TNM = LAD;
    21: NET "pin_plx_lad_io<3>" LOC = AC16 | SLEW = FAST | TNM = LAD;
    22: NET "pin_plx_lad_io<4>" LOC = AA11 | SLEW = FAST | TNM = LAD;
    23: NET "pin_plx_lad_io<5>" LOC = AA12 | SLEW = FAST | TNM = LAD;

    24: NET "pin_plx_lad_io<6>" LOC = AD14 | SLEW = FAST | TNM = LAD;
    25: NET "pin_plx_lad_io<7>" LOC = AC14 | SLEW = FAST | TNM = LAD;
    26: NET "pin_plx_lad_io<8>" LOC = AA13 | SLEW = FAST | TNM = LAD;
    27: NET "pin_plx_lad_io<9>" LOC = AB13 | SLEW = FAST | TNM = LAD;
    28: NET "pin_plx_lad_io<10>" LOC = AA15 | SLEW = FAST | TNM = LAD;
    29: NET "pin_plx_lad_io<11>" LOC = AA16 | SLEW = FAST | TNM = LAD;
    30: NET "pin_plx_lad_io<12>" LOC = AC11 | SLEW = FAST | TNM = LAD;
    31: NET "pin_plx_lad_io<13>" LOC = AC12 | SLEW = FAST | TNM = LAD;
    32: NET "pin_plx_lad_io<14>" LOC = AB14 | SLEW = FAST | TNM = LAD;
    33: NET "pin_plx_lad_io<15>" LOC = AA14 | SLEW = FAST | TNM = LAD;
    34: NET "pin_plx_lad_io<16>" LOC = D12 | SLEW = FAST | TNM = LAD;
    35: NET "pin_plx_lad_io<17>" LOC = E13 | SLEW = FAST | TNM = LAD;
    36: NET "pin_plx_lad_io<18>" LOC = C16 | SLEW = FAST | TNM = LAD;
    37: NET "pin_plx_lad_io<19>" LOC = D16 | SLEW = FAST | TNM = LAD;
    38: NET "pin_plx_lad_io<20>" LOC = D11 | SLEW = FAST | TNM = LAD;
    39: NET "pin_plx_lad_io<21>" LOC = C11 | SLEW = FAST | TNM = LAD;
    40: NET "pin_plx_lad_io<22>" LOC = E14 | SLEW = FAST | TNM = LAD;
    41: NET "pin_plx_lad_io<23>" LOC = D15 | SLEW = FAST | TNM = LAD;
    42: NET "pin_plx_lad_io<24>" LOC = D13 | SLEW = FAST | TNM = LAD;
    43: NET "pin_plx_lad_io<25>" LOC = D14 | SLEW = FAST | TNM = LAD;
    44: NET "pin_plx_lad_io<26>" LOC = F15 | SLEW = FAST | TNM = LAD;
    45: NET "pin_plx_lad_io<27>" LOC = F16 | SLEW = FAST | TNM = LAD;
    46: NET "pin_plx_lad_io<28>" LOC = F11 | SLEW = FAST | TNM = LAD;
    47: NET "pin_plx_lad_io<29>" LOC = F12 | SLEW = FAST | TNM = LAD;
    48: NET "pin_plx_lad_io<30>" LOC = F13 | SLEW = FAST | TNM = LAD;
    49: NET "pin_plx_lad_io<31>" LOC = F14 | SLEW = FAST | TNM = LAD;
    50: TIMEGRP "LAD" OFFSET = IN 6.4 ns AFTER "pin_sysclk_i" HIGH;
    51: TIMEGRP "LAD" OFFSET = OUT 3.1 ns BEFORE "pin_sysclk_i" HIGH;
    52: #
    53: NET "pin_plx_ready_n_o" LOC = F18 | SLEW = FAST;
    54: NET "pin_plx_ready_n_o" OFFSET = OUT 4.2 ns BEFORE "pin_sysclk_i" HIGH;
    55: #
    56: NET "pin_plx_bterm_n_o" LOC = D10 | SLEW = FAST;
    57: NET "pin_plx_bterm_n_o" OFFSET = OUT 4.2 ns BEFORE "pin_sysclk_i" HIGH;
    58: #
    59: NET "pin_led_o<0>" LOC = D22;
    60: NET "pin_led_o<1>" LOC = C22;
    61: NET "pin_led_o<2>" LOC = E21;
    62: NET "pin_led_o<3>" LOC = D21;
    63: NET "pin_led_o<4>" LOC = C21;
    64: NET "pin_led_o<5>" LOC = B24;
    65: NET "pin_led_o<6>" LOC = C20;
    66: NET "pin_led_o<7>" LOC = B23;

    展开全文
  • FPGA时序约束

    2021-07-03 13:58:37
    FPGA时序设计概述时序约束相关概念发起沿和捕获沿时序路径常规时钟路径数据到达时间时钟到达时间数据需求时间(建立情况下)数据需求时间(保持情况下)建立时间的裕量保持时间的裕量时序分类时序约束语法创建时钟...

    概述

    要简单介绍为什么么进行时序约束,以及文章编写的思路

    时序约束相关概念

    1. 发起沿和捕获沿

    1. 时序路径

    1. 常规时钟路径

    1. 数据到达时间

    1. 时钟到达时间

    1. 数据需求时间(建立情况下)

    1. 数据需求时间(保持情况下)

    2. 建立时间的裕量

    3. 保持时间的裕量

    时序分类

    • create_clock :FPGA内部的同步元件之间的路径
    • set_input_delay : 外部器件末级触发器发送数据通过FPGA端口到达FPGA内部第一级接收的触发器的路径
    • set_output_delay :FPGA的末级触发器通过端口到达下游芯片的路径
    • set_max_delay :从输入端口到输出端口纯粹的组合逻辑
    • clock group
    • multicycle path
    • false path

    时序约束语法

    创建时钟周期约束

    • 时钟的定义

    周期、占空比、相位

    • primary clock

    晶振提供的时钟、吉比特transceiver的输入引脚

    create_clock -period 10 [get_ports sysclk]

    • 生成时钟
      MMCM、PLL、用户自己的分频逻辑,通过get_pins或get_ports来指定源时钟

    create_generated_clock -name clkdiv2 -source [get_ports clkin] -divide_by 2 [get_pins REGA/Q]
    create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -divide_by 2 [get_pins REGA/Q]
    create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -edges {1 3 5} [get_pins REGA/Q]

    • report_clocks

    • 时钟的分组的关系
      同步时钟(synchronous clocks)
      异步时钟(asynchronous clocks)

    set_clock_groups -name xxx -asynchronous -group [get xxx] -group [get xxx]
    set_clock_groups -name xxx -physically_exclusive -group [get xxx] -group [get xxx]

      不可扩展时钟(unexpendable clocks)
    

    设置输入延时约束

    set_input_delay 设置的延时表示数据到达时间相对于时钟的发起沿的延时。这个发起沿来自外部设备的时钟。数据到达时间是数据到达FPGA数据端口的时间。所以,这个约束就是告诉FPGA,外部设备的CLK与data之间的延迟关系。这样,FPGA就可以来调整内部时钟来适用它。

    set_input_delay -clock sysclk -max 4 [get_ports clkin]
    set_input_delay -clock sysclk -min 2 [get_ports clkin]

    -max 用来分析setup
    -min 用来分析hold

    DDR input delay示例

    set_input_delay 1 -min -clock clk [get_ports data_in]
    set_input_delay 2 -max -clock clk [get_ports data_in]
    set_input_delay 1 -min -clock clk [get_ports data_in] -clock_fall -add_delay
    set_input_delay 2 -max -clock clk [get_ports data_in] -clock_fall -add_delay

    clock_fall 告诉分析工具,当前时序分析使用下降沿作为发起沿。
    add_delay告诉分析工具,当前语句和前面的语句同时有效,不要进行覆盖。

    设置输出延时约束

    set_output_delay设置延迟表示下游芯片接受的数据相对于捕获沿的时间间隔,延迟参数的大小等于数据到达的时间减去捕获沿时间。和input delay一样,它们都是以外部芯片的时钟作为参考时钟的。区别是,input delay选择的是发起沿,所以数据转换的时间在发起沿后面;output选择的是捕获沿,数据转变在前面。所以,总结来说,无论输入还是输出,delay的时间就是数据转变的时刻和参考时刻之间的时间间隔。对于输入约束,参考时刻是发起沿;对于输出约束,参考时刻是捕获沿。

    set_output_delay -min -1 -clock clk [get_ports data_out]
    set_output_delay -max 3 -clock clk [get_ports data_out]
    set_output_delay -min -1 -clock clk [get_ports data_out] -clock_fall -add_delay
    set_output_delay -max 3 -clock clk [get_ports data_out] -clock_fall -add_delay

    在这里插入图片描述

    FPGA内部组合逻辑从输入端口到输出端口

    set_max_delay 15 -from [get_ports din] to [get_ports dout]

    在这里插入图片描述

    虚拟时钟

    外部设备到FPGA只有数据端口,没有时钟端口,需要创建虚拟时钟。这种情况下,一般来说,外部设备和FPGA使用相同的时钟源。下面的例子就是外部设备和FPGA使用同一个时钟源,外部设备在时钟的输入处添加了1ns的延迟的时钟buffer。

    create_clock -name sysclk -period 10 [get_ports clkin]
    create_clock -name virclk -period 10
    set_clock_latency -source 1 [get_clocks virclk]
    set_input_delay -clock vitclk -max 4 [get_ports ain]
    set_input_delay -clock vitclk -min 2 [get_ports ain]

    在这里插入图片描述
    对于 input delay,它的参考时钟可能是primary clock,也可能是使虚拟时钟。使用primary clock的情况下,外部器件和FPGA使用同一个时钟,那么,这个时钟一般就是外部设备的data端口所使用的clock。所以,这时的外部设备和FPGA同时连接data和clock。虚拟时钟的 clock对于FPGA和外部设备来说有一定的差异,比如上面的相位偏移。简而言之,primary clock和虚拟时钟的区别就是是不是同一个时钟,是同一个时钟就用primary clock,不是同一个时钟就用虚拟时钟。虚拟时钟源时钟和目的时钟之间的关系是固定的,不然无法分析。

    设置多周期约束

    startend 用于选择参考时钟,start 表示参考时钟是源时钟,end 表示参考时钟是目的时钟。
    当选择 -end 时,表示参考时钟选择目的时钟。

    源时钟(-start),发送沿移动目的时钟(-end),捕获沿移动
    建立<----(向后)—>(向前)(默认)
    保持—>(向前)(默认)<—(向后)

    -setup:表示该多周期路径所需要的时钟周期的个数
    -hold:表示相对于缺省捕获沿,实际捕获沿应回调的时钟周期的个数
    -end:表示参考时钟为捕获端所用时钟,对于-setup,缺省为-end
    -start:表示参考时钟为发送端所用的时钟,对于-hold,缺省为-start

    两倍时钟周期使能信号

    set_multicycle_path -from [get_cells rega] -to [get_cells rega] -setup -end 2
    set_multicycle_path -from [get_cells regb] -to [get_cells regb] -hold -end 1

    在这里插入图片描述

    相同的时钟周期,目的时钟正向偏移

    set_multicycle_path -from [get_clocks clk1] -to [get_clocks clk2] -setup -end 2

    在这里插入图片描述

    相同的时钟周期,目的时钟负向偏移

    不需要做多周期约束
    在这里插入图片描述

    发端慢速,收端快速

    set_multicycle_path -from [get_clocks clk1] -to [get_clocks clk2] -setup -end 2
    set_multicycle_path -from [get_clocks clk1] -to [get_clocks clk2] -hold -end 1

    在这里插入图片描述

    发端快速,收端慢速

    set_multicycle_path -from [get_clocks clk1] -to [get_clocks clk2] -setup -start 2
    set_multicycle_path -from [get_clocks clk1] -to [get_clocks clk2] -hold -start 1

    在这里插入图片描述

    设置伪路径约束

    伪路径是指在设计存在的路径,但是并不存在作用.在综合的时候不起作用,在实现的时候起作用。
    设置伪路径可以去除无效的伪路径,可以节约编译的时间。
    伪路径设置的命令 : set_false_path

    set_false_path [from args] [to args] [through args]

    例子

    set_false_path -from S1 -through {x1, x2}

    这个例子表示来自S1的路径,它们通过x1或者x2。{}中表示的是或的关系。

    1. 组合逻辑中的伪路径

    set_false_path -through [get_pins MUX0/I0] -through [get_pins MUX1/I1]

    2. 时序路径中的伪路径

    set_false_path -through [get_pins MUX0/I0] -through [get_pins MUX1/I0]

    3. 跨时钟域中的伪路径

    set_false_path -from [get_clocks clka] -to [get_clocks clkb]
    set_false_path -from [get_clocks clkb] -to [get_clocks clka]

    等价于

    set_clock_groups -asynchronous -group [get_clocks clka] -groups [get_clocks clkb]

    false path timing report

    set_flase_path -from [get_ports rst_pin]

    report timing -from [get_ports rst_pin]

    展开全文
  • xilinx时序约束

    2017-02-15 12:59:03
    在进行FPGA的设计时,经常会需要在综合、实现的阶段添加约束,以便能够控制综合、实现过程,使设计满足我们需要的运行速度、引脚位置等要求。通常的做法是设计编写约束文件并导入到综合实现工具,在进行FPGA/CPLD的...

    转自:http://blog.chinaunix.net/uid-15887868-id-4091631.html

    在进行FPGA的设计时,经常会需要在综合、实现的阶段添加约束,以便能够控制综合、实现过程,使设计满足我们需要的运行速度、引脚位置等要求。通常的做法是设计编写约束文件并导入到综合实现工具,在进行FPGA/CPLD的综合、实现过程中指导逻辑的映射和布局布线。下面主要总结一下Xilinx FPGA时序约束设计和分析。

      
      一、周期约束
        周期约束是Xilinx FPGA 时序约束中最常见的约束方式。它附加在时钟网线上,时序分析工具会根据周期约束来检查时钟域内所有同步元件的时序是否满足需求。周期约束会自动的寄存器时钟端的反相。如果相邻的两个元件的时钟相位是相反的,那么它们之间的延迟将被默认的限制成周期约束的一半。
      
        在进行周期约束之前,必须对电路的时钟周期明了,这样才不会出现约束过松或者过紧的现象。一般情况下,设计电路所能达到的最高运行频率取决于同步元件本身的Setup Time 和 Hold Time,以及同步元件之间的逻辑和布线延迟。周期约束一般是使用下面的约束方法:
      
      1、period_item PERIOD=period {HIGH|LOW} [high_or low_item]
      
        其中,period_item可以是NET或TIMEGRP,分别代表时钟线名称net name或元件分组名称group-name。用NET表示PERIOD约束作用到名为“net name”的时钟网线所驱动的同步元件上,用TIMEGRP表示PERIOD约束作用到TIMEGRP所定义的分组(包括FFS、LATCH和 RAM等同步元件)上。period是目标时钟周期,单位可以是ps、ns、μS和ms等。HIGH|LOW指出时钟周期中的第1个脉冲是高电平还是低电平,high or low time为HIGH LOW指定的脉冲的持续时间,默认单位是ns。如果没有该参数,时钟占空比 是50%。例如, NET SYS_CLK PERIOD=10 ns HIGH 4ns
      
      2、NET“clock net name”TNM_NET=“timing group name”;
      
      TIMESPEC“TSidentifier”=PERIOD “TNM reference”period {HIGH | LOW} [high or low item]INPUT_JITTER value;
      
        很多时候为了能够定义比较复杂的派生关系的时钟周期,就要使用该方法。其中TIMESPEC在时序约束中作为一个标识符表示本约束为时序规范;TSidentifier包括字母TS和一个标识符identifier共同作为一个TS属性;TNM reference指定了时序约束是附加在哪一个组上,一般情况下加在TNM_NET定义的分组上。HIGH | LOW 指的是时钟的初始相位表明第一个时钟是上升沿还是下降沿;high or low item 表示的是时钟占空比,即就是high或者low的时间,默认为1:1, INPUT_JITTER 表示的是时钟的抖动时间,时钟会在这个时间范围内抖动,默认单元为ps。比如周期约束:
      
      NET "ex_clk200m_p" TNM_NET = TNM_clk200_p;
      
      TIMESPEC "TS_clk200_p" = PERIOD "TNM_clk200_p" 5.000 ns HIGH 50 %;
      
        建立一个TNM_clk200_p的时序分组,包括时钟网络ex_clk200m_p驱动的所有同步元件,这些同步元件都将受到时序规范TS_clk200_p的约束。同步元件到同步元件有5ns的时间要求。占空比为1:1.
      
      二、偏移约束
        偏移约束包括OFFSET_IN_BEFORE、OFFSET_IN_AFTER、OFFSET_OUT_BEFORE和OFFSET_OUT_AFTER等4种约束。属于基本的时序约束,它规定了外部时钟和数据输入输出引脚之间的时序关系,只能用于与引脚相连接。其基本的语法为:
      
      OFFSET = {IN | OUT} “offset_time” [units] {BEFORE | AFTER} “clk_name” [TIMEGRP “group_name”];
      
        其中,[IN | OUT] 说明约束是输入还是输出,”offset_time”为FPGA引脚数据变化与有效时钟之间的时间差,[BEFORE | AFTER]说明该时间差在有效时钟沿的前面还是后面,”clk_name”时钟名,[TIMEGRP “group_name”]定义约束的触发器组,缺省时约束clk_name驱动的所有触发器。
      
      1、OFFSET_IN_BEFORE、OFFSET_IN_AFTER约束
      
        OFFSET_IN_BEFORE和OFFSET_IN_AFTER都是输入偏移约束。OFFSET_IN_BEFORE说明了输入数据比有效时钟沿提前多长时间准备好。于是芯片内部与输入引脚相连的,组合逻辑的延迟不能大于这个时间,否则会发生数据采样错误。OFFSET_IN_AFTER是输入数据在有效时间沿之后多久到达芯片的输入引脚。
      
      OFFSET_IN_BEFORE对芯片内部的输入逻辑的约束,约束如下:
      
      NET data_in OFFSET = IN Time BEFORE CLK;
      
      2、OFFSET_OUT_AFTER、OFFSET_OUT_BEFORE约束
      
        这两个都是输出约束,OFFSET_OUT _AFTER规定了输出数据在有效沿之后多久稳定下来,芯片内部的输出延迟必须小于这个数值。OFFSET_OUT_BEFORE是指下一级芯片的输入数据应该在有效时钟沿之前多久准备好。从下一级的输入端的延迟可以计算出当前设计输出的数据必须在何时稳定下来。其基本的语法规则为:“NET data_out” OFFSET=OUT
      
      Time AFTER CLK“;
      
      三、专门约束
      附加约束的一般策略是首先附加整天约束,比如PERIOD、OFFSET等约束,然后对局部的电路进行约束。 专门约束包括以下几个:
      
      1、FROM_TO约束
      
      FROM_TO在两个组之间定义的约束,对二者之间的逻辑和布线延迟进行控制,这两个组可以是用户自定义的,也可以预定义的,可以使用TNM_NET、TNM和TIMEGRP定义组。其语法如下:
      
      TIMESPEC “TSname“ = FROM ”group1“ TO ”group2“ value ;
      
      其中group1和group2分别是路径的起点和终点,value为延迟时间,可以是具体的数值或者表达式。比如:TIMESPEC TS_CLK = PERIOD CLK 30ns; TIMESPEC T1_T3 = FROM T1 TO T3 60ns;
      
      2、MAXDELAY约束
      
      MAXDELAY约束定义了特定的网络线的最大延迟,其语法如:
      
      NET “net_name“ MAXDELAY = value units ; value 为延迟时间。
      
      3、MAXSKEW约束
      
      MAXSKEW是高级时序约束,通过MAXSKEW约束附加在某一网线上,可以约束该网线上的最大SKEW。MAXSKEW语法如下:
      
      NET “net_name“ MAXSKEW = allowable_skew units;
      
      比如,NET “Singal“ MAXSKEW = 3ns;
      
      四、分组约束
        在FPGA设计当中,往往包含大量的触发器、寄存器和RAM等元件,为了方便附加约束需要把他们分成不同的组,然后根据需要对某些组分别约束。
      
      1、TNM约束。
      
      使用TNM约束可以选出一个构成分组的元件,并且赋予一个名字,以便添加约束。如:{NET | INST | PIN} “object_name“ TNM= “identifier“;
      
      其中object_name为NET、INST或PIN的名称,identifier为分组名称。
      
      2、TNM_NEY约束
      
        TNM_NET约束只加在网线上,其作用与TNM约束加在网线时基本相同,即把该网线所在路径上的所有有效同步元件作为一组命名。不同之处在于TNM是加在引脚上的,而不是该网线所在路径上的同步元件,也就是说TNM约束不能穿过IBUF,用TNM_NET约束就不出现这种情况。
      
      NET “net_name“ TNM_NET = [predefined_group:] identifier;
      
      TNM_NET只能用在网线上,否则会出现警告,或者同时该约束被忽略。
      
      2、TIMEGRP约束
      
        可以通过TIMEGRP约束使已有的分组约束构成新的分组,已经有的预定义和用TNM/TIMEGRP定义。使用TIMEGRP约束可以使多个分组合并组成一个新分组。
      
      TIMEGRP “big_group1“ = ”small_group“ ”medium_group“
      
      将”small_group“ ”medium_group“合并一个新分组big_group1。
      
      五、简单的避免时序违规和补救的方法
        PERIOD 约束定义的是触发器等同步元件的时钟周期。可使用时序分析器来验证同步元件之间的所有路径是否满足设计的建立和保持时序要求。PERIOD 约束违例将以负的时序裕量显示在在时序报告,并说明到底是建立时间还是保持时间要求出现违例。应找出两个所分析的同步元件间一条较快路径,如果是多周期路径,应该采样多周期约束,或至少是某种方法来确保数据在合适时间内到达并保持足够长的时间,以便时钟脉冲边沿能够正确采样。若布局布线软件无法找到更快的路径,则可从 FPGA Editor 工具中手动进行布线。不过一般不推荐使用手工布局布线。首先应该试试重构电路来满足时序要求。比如用寄存器打一拍,有点逻辑复制的意思,这样可以增加了信号的延迟,但是却可以使电路正确的采样数据。
      
        若外部信号值在时钟脉冲边沿之前发生变化,则需使用 DCM 或 PLL 延迟时钟脉冲边沿,这样数据才能由新的延迟时钟正确采样。有一种替代方法,就是在输入/ 输出模块中使用 IDELAY 元件,将数据移到时钟有效的位置上。
      
      一般情况下,提高电路的运行速度可以尽量减少时序违规的问题。具体总结如下:
      
      1、通过设置Xilinx ISE软件在“Implement Design“点击右键,选择”属性“选择”“Optimization Strategy”栏中选择”speed“以及点击右键选择”Design Goals and Strategies“选择”Timing performance“。
      
      2、尽量使用Xilinx公司提高的专用资源,FPGA厂商都提高了一些专用的,比如进位链MUX、SRL等。
      
      3、重新分配关键路径
      
      (1) 关键路径在同一Module,这样综合时可以获得最佳的时序效果。
      
      (2) 对关键路径近LOC约束,如果发现关键路径相关的LUT距离太远,可以使用floorplanner手工布线。
      
      (3) 复制电路,减少关键路径的扇出。当一个信号网络所带的负载越多的时候,他的路径也会相应的增加,所以通过复制电路,可以有效的减少甚至消除时序违规的问题。
      
      (4) 在关键路径网络上插入buffer减少扇出,提高速度,消除时序违规。
      
      4、 进行特殊约束,通过设置Multi_Cycle_Path意义不大,因为它不会直接对关键路径产生影响,这样想法显然不对,因为它可以对非关键路径散开的作用,给关键路径节约了空间,间接的达到压缩关键路径延迟的问题,有点“曲线救国“的味道。
      
      5、 通过修改代码减少逻辑级数和分割组合逻辑。
      
       
      
       注: 一般情况下,使用比较多的都是周期约束,专门约束只是针对部分器件可能需要,一般高端FPGA是不需要这个的
    展开全文
  • ISE时序约束学习笔记

    2021-01-19 11:53:09
    ISE时序约束(参考Xilinx UG612) Global Offset golbal offset 的约束语句如下: OFFSET = IN value VALID value BEFORE clock; 其中OFFSET = <value>定义了从采样时钟的上升沿到所传输数据使能之间的时间...

    ISE时序约束(参考Xilinx UG612)

    1. Global Offset
      golbal offset 的约束语句如下:
    OFFSET = IN value VALID value BEFORE clock;

    其中OFFSET = <value>定义了从采样时钟的上升沿到所传输数据使能之间的时间间隔,如下图:
    理想情况下SDR交互信号
    实现图中时序约束的具体代码为:

    NET "SysClk" TNM_NET = "SysClk";
    TIMESPEC "TS_SysClk" = PERIOD "SysClk" 5 ns HIGH 50%;  #200MHz时钟,占空比50%
    OFFSET = IN 5 ns VAILD 5 ns BEFORE "SysClk";

    在DDR传输的情况下,上升沿下降沿分别进行一次数据采集,如下图:
    在这里插入图片描述
    此时需要对上升沿下降沿分别进行约束

    OFFSET = IN value VAILD vaule BEFORE clock RISING;
    OFFSET = IN value VAILD vaule BEFORE clock FALLING;

    语句中OFFSET = <value>分别定义采样沿至数据段使能直接的间隔时间,以图中1.25ns为例,约束代码如下:

    NET "SysClk" TNM_NET = "SysClk";
    TIMESPEC "TS_SysClk" = PERIOD "SysClk" 5 ns HIGH 50%;  #200MHz时钟,占空比50%
    OFFSET = IN 1.25 ns VAILD 2.5 ns BEFORE "SysClk" RISING;
    OFFSET = IN 1.25 ns VAILD 2.5 ns BEFORE "SysClk" FALLING;

    在DDR

    1. TNM_NET 与 TNM on a net 之间的区别:TNM_NET 只能用于 net 对象,用于其它如 pin 或 instance 会报错
    展开全文
  • FPGA设计之时序约束---常用指令与流程

    万次阅读 多人点赞 2017-10-24 21:49:42
    说到FPGA时序约束的流程,不同的公司可能有些不一样。反正条条大路通罗马,找到一种适合自己的就行了。从系统上来看,同步时序约束可以分为系统同步与源同步两大类。简单点来说,系统同步是指FPGA与外部器件共用...
  • 今天给大侠带来Xilinx FPGA编程技巧之常用时序约束详解,话不多说,上货。 基本的约束方法 为了保证成功的设计,所有路径的时序要求必须能够让执行工具获取。最普遍的三种路径以及异常路径为: 输入路径...
  • ALTERA FPGA,SDC时序约束命令

    热门讨论 2010-04-21 21:50:17
    很好的ALTERA FPGA原英文版资料
  • 在ISE下分析和约束时序

    万次阅读 2014-08-13 20:23:09
    3.1 ISE的时序约束工具入门   像TimeQuest一样,ISE软件工具也有自己的时序约束及分析工具。ISE界面的processes当中,有一个user constraints列表,其中的Creat Timing Constrain可以提供用户添加指定的时序约束...
  • ISE约束文件UCF的基本语法

    万次阅读 多人点赞 2018-02-05 20:22:36
    首先声明,UCF约束文件其中的语法也有很多,笔者也不是特别清楚,...(1)时序约束:主要用于规范设计的时序行为,表达设计者期望满足的时序条件,知道综合和布局布线阶段的优化算法等。 (2)布局布线约束:主要用
  • vivado 时序约束

    千次阅读 2019-06-17 13:51:46
    XDC的基本语法可以分为时钟约束、IO约束以及时序例外约束,对一个设计进行约束的先后顺序也可以按照这三类约束依次进行。 时钟约束 时钟约束必须最早创建,端口进来的主时钟以及GT的输出RXCLK/TXCLK都必须由用户...
  • 但如果我们在使用诸如ISE、Quarters这样的集成开发环境时,如果在映射环节还没开始前就添加一些时序约束信息,则这些编译器每完成一部分布局布线工作,便会调用相应时序分析工具进行一次时序分析,如果发现分析结果...
  • 描述XDC——VIVADOUCF——ISEUCF与 XDC 约束/命令之间有什么区别?解决方案UCF 约束和 XDC 命令之间有很多区别。...UCF 约束基于时序组 (TNM、TNM_NET、TIMEGRP),而 XDC 命令则基于实例 (get_cell)、网络 (get...
  • 时序约束搜集整理

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

    千次阅读 2020-03-11 17:33:35
    在写.sdc约束文件时,要做的第一件事情就是使用create_clock对进入FPGA的时钟进行约束。其语法格式如下: create_clock[-add] [-name <clock_name>] -period [-waveform<edge_list>] 参数解释: -name...
  • FPGA设计-时序约束(中篇-实例分析)

    万次阅读 多人点赞 2017-01-14 14:15:00
    上一篇已经简单的介绍了时序,本文将会以一个ADC实例简单粗暴的进行分析; 现有一块ADC连接到FPGA上,需要在FPGA上实现高速数据的读取,那么第一步自然就是完成可靠的硬件连线,其中需要注意的是: 1. 注意信号的...
  • &lt;td class="t_f" id="...使用约束文件添加时序约束2010-01-16 13:07一般来讲,添加约束的原则为先附加全局约束,再补充局部约束,而且局部约束比较宽松。其目的是在可能的地方尽量放
  • I/O Delay约束的主要目的同时钟约束一样,是告诉编译器,外部输入输出信号与参考时钟之间的相位关系,便于综合器能够真实和准确的对IO接口的信号进行时序分析,同时也有利于综合器的布局布线。 注意:I/O Delay约束...
  • ——怎样增加时序约束(Timing Constraints) 逻辑综合的过程为:转化 优化 映射 另外还有环境约束和面积约束 时序有三个大的方面 input logic paths internal paths output paths 一个项目需要有一个spec即设计说明...
  • 一:时序约束 1:分类  时钟的约束(寄存器-寄存器之间的路径约束),输入延时的约束,输出延时的约束 2:时序约束对电路的要求  综合工具现在不能很好地支持异步电路,甚至不支持异步电路;  single clock...
  • 时序约束之周期约束

    千次阅读 2018-08-14 12:06:02
    周期概念是FPGA/ASIC时序定义的基础,周期(PERIOD)约束附加在时钟网线上,时序分析工具根据PERIOD约束检查时钟域内所有同步元件(包括寄存器、锁存器、同步RAM/ROM等)的时序是否满足要求。 PERIOD约束会自动处理...
  • 高速FPGA时序约束分析:时序约束语法规则(1) 高速FPGA调试时都会面临时序违约的问题,而稳定的时序能够使得系统再高低温以及异常环境下稳定可靠运行,因此时序约束不仅仅是为了满足系统高速运行的要求,也为了满足...
  • IO的约束主要是指input_delay与output_delay这两种,编译软件(ISE/Quartus)是个很强大而又很傻的工具,在设计的时候,你务必要告诉他在FPGA外部的信号时序关系,他才能够知道怎么去优化内部的时序,以满足时序设计...
  • FPGA的时序约束

    2019-09-04 14:31:44
    在进行FPGA的设计时,经常会需要在综合、实现的阶段添加约束,以便能够控制综合、实现过程,使设计满足我们需要的运行速度、引脚位置等要求。通常的做法是设计编写约束文件并导入到综合实现工具,在进行FPGA/CPLD的...
  • I/O Delay约束的主要目的同时钟约束一样,是告诉编译器,外部输入输出信号与参考时钟之间的相位关系,便于综合器能够真实和准确的对IO接口的信号进行时序分析,同时也有利于综合器的布局布线。 注意:I/O Delay约束...
  • FPGA设计之时序约束

    千次阅读 2017-10-18 20:52:35
    在FPGA的设计当中,时序约束的重要性不言而喻。这也是要做好FPGA设计必须掌握的一门基本功。但是我发现,很多初学者甚至有一两年设计经验的已经入门的工程师(包括本尊..汗),并不重视这一基本技能。 归根到底原因...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,525
精华内容 1,810
关键字:

时序约束语法