FPGA设计之时序约束(三)——伪路径及多周期路径约束

本文针对Intel FPGA。
创建好时钟并且按照异步规则分组后,就可以按照这些约束对设计进行时序分析了。
默认的情况下,软件按照launch沿、latch沿只间隔一个时钟周期(1T)的原则分析所有需要检查的timing path。在综合、布局布线时,工具也会根据时序约束,尽可能使所有timing path都满足1T的要求。但工具也不是万能的,如果设计要求过高的话,有些timing path可能达不到设计要求,这样不满足设计要求的timing path就会以timing violation(时序违例)的形式给出。
在很多情况下,设计的结构和功能并不要求所有的timing path都符合1T的要求,甚至有的timing path则根本没有时序要求,比如说异步复位信号。这时候,就可以对这一类的timing path设定相对宽松的时序约束或者不做时序要求,称之为timing exceptions。
常用的设定timing exception的方式有两种:false path和Multicycle path。

Set False Path

set_clock_groups 不可以完全代替set_false_path。因为伪路径并不一定是跨时钟域路径。
什么情况下需要用到set_false_path呢?

  • 1.跨时钟域的数据传输
    不同时钟域直接无法进行真正意义的同步时序分析,若设置过时钟分组这里应该不用再重复设置。在设计时应该使用打两拍同步、FIFO、握手机制来保证数据传输的正确性。另外多位数据传输用FIFO、握手机制而不会用打两拍同步的,因为同步器只要有一位出现同步错误那么整个都是错的。对于两bit标志位跨时钟域传输后做与非运算应当先在源时钟域下做与非运算再将结果送到目的时钟域,切忌先都送到目的时钟再运算。

  • 2.测试逻辑等不会影响功能的逻辑
    比如TDC内部信号测试的时钟路径,在正常工作时,是不会参与功能性的路径的。可在SDC文件中将其设定为伪路径。

  • 3.异步复位
    对于与时钟完全异步的复位信号,用set_false_path,但是,如果reset信号在某个时钟上升沿时检查,则不能set_false_path。

  • 4.上电即写入数据的reg,并且后面不会修改其值。

  • 命令格式:

//所有以dffe9a*为终点的路径为虚假
set_false_path  -to [get_ports dffe9a*]

//从tdc_aid_pll_2到tdc_main_pll_inst直接的路径全部为虚假路径
set_false_path  -from  [get_clocks {tdc_aid_pll_2:tdc_aid_pll_2_inst|altpll:altpll_component|tdc_aid_pll_2_altpll1:auto_generated|wire_pll1_clk[0]}]  -to  [get_clocks {tdc_main_pll_inst|altpll_component|auto_generated|pll1|clk[1]}]

//穿过 pin UMUXOS的路径全部为虚假路径
set_false_path  -though [get_pins UMUXOS]

//以该顺序穿过 pin UMUXOS1 pin UMUXOS2的路径全部为虚假路径
set_false_path  -though [get_pins UMUXOS1] -though [get_pins UMUXOS2]

  • 解析
    from 起点
    though 经过的路径
    to 终点

Set Multicycle Path

设置多周期路径的情景:

  • 1.同步时钟域下,在发射沿产生数据后,数据要经过1个周期以上的时间才会稳定下来,那么这时候就需要设定多周期路径。比如除法器IP,输入数据后输出的数据不会立即稳定。
  • 2 .同步时钟域下,launch edge和latch edge有偏斜,比如周期为12ns,偏置2ns。那么建立时间就只有2ns,而保持时间有10ns。建立时间十分紧张,而保持时间余量太大,显然不合理。
  • 3.异步时钟域下,快采慢or慢采快

如此一来放松了这条路径的建立保持时间的约束强度,使得布局布线时可以集中精力去优化其他关键路径。在逻辑资源占用率高时,多周期路径的设定将变得十分必要。

  • 命令格式:
//模板
set_multicycle_path [-h | -help] [-long_help] [-end] [-fall_from  ] [-fall_to  ] [-from  ] [-hold] [-rise_from  ] [-rise_to  ] [-setup] [-start] [-through  ] [-to  ] 
//实例
set_multicycle_path -setup -end -from  [get_clocks {local_clk_i}]  -to  [get_clocks {pll_s_clk|altpll_component|auto_generated|pll1|clk[0]}] 2
//将latch edge的建立时间检查延后了一个周期,即现在有两个周期的建立时间余量(默认是1)
set_multicycle_path -hold -end -from  [get_clocks {local_clk_i}]  -to  [get_clocks {pll_s_clk|altpll_component|auto_generated|pll1|clk[0]}] 1
//将latch edge的保持时间检查的时间相对于原先保持时间检查的时刻向前移动1个周期(默认为0,默认建立时间和保持时间的相对位置不会动。保持时间检查紧跟着建立时间检查的时刻移动,并且在其前面一个周期检查)
//建立和保持时间多周期约束必须成对出现。
  • 解析
    -end 指定本条多周期路径是针对目的端的(多用于快采慢,比较符合分析习惯)
    -start 指定本条多周期路径是针对源端的(多用于慢采快,比较符合分析习惯)
    from 数据发射源时钟
    to 数据接收端时钟
    setup 指定本条约束是针对建立时间检查而设置约束的
    hold 指定约束是针对保持时间检查而设置的
    具体用法可参考 多周期约束.

你可能感兴趣的:(时钟与时序)