输出/输入延迟约束

 1 延迟约束的基础概念

         1.1 时序模型 

                 数字通信的时序模型主要分为:系统同步、源同步和自同步。

                详细见【理论篇】IC间通信的时序模型——系统同步、源同步和自同步。 

                补充:

                        ①同源一定同步,且系统知道同拍相对相位关系(超前或滞后),一定是下一拍latch上一拍的数据。

                        ②同步仅代表相位关系固定,非同源情况下遇时钟沿触发。

        1.2 虚拟时钟

                I/O delay设置需作用在虚拟时钟上,假定同步I/O端口的触发器虚拟的上一级或下一级触发器(虚拟触发器)的时钟为前述的虚拟时钟(实际上都是按同步来约束和检查的),这样可以将两级触发器的时钟按需求设置不同的频率和相位/latency。 

                详细见虚拟时钟(Virtual Clock)_耐心的小黑的博客-CSDN博客_虚拟时钟的作用​​​​​​

        1.3 数据与时钟的关系

                数据与时钟的关系,可以看做数据发射时钟launch_clock(data_clock)与数据锁存时钟latch_clock(clock_clock)的关系。数据与时钟的关系可分类为:单倍数据速率SDR(Single Data Rate)和双倍数据速率DDR(Double Data Rate)

                (补充:DDR是指数据在时钟上升沿和下降沿都有效的一种传输方式。时钟上升沿产生的数据,在下一个时钟下降沿被采样;时钟下降沿产生的数据,在下一个时钟上升沿被采样。)

                分类图示如下,表示I/O端口上未设置任何delay、忽略触发器数据输出延时t_co、时钟skew和建立保持时间之前的理想状态,其中单位间隔UI(Unit Interval)表示setup relationship的间隔。

SDRDDR

UI = T

UI = T/2

        1.4  I/O delay

                1.4.1 input_delay

                        含义:输入信号在时钟沿多长时间到达模块的port上。

                        “set_input_delay”是用来指定输入端口/port的数据输入相对于参考时钟边沿的延迟。               

                1.4.2 output_delay

                        含义:输出信号在后级模块中需要在时钟沿之前提前多长时间准备好

                        "set_output_delay"用于指定输出端口/port的数据输出相对于设计中参考时钟边沿的延迟。

                1.4.3 经验值

                        延迟值以ns为指定单位,可正可负,指的是数据与参考时钟的相位关系(超前或滞后/延迟)。

                        I/O delay约束中:

                                setup relationship(max)采取常用的0.7的margin值;

                                hold relationship(min)采取常用的0.0的margin值。

        1.5 数据引脚到数据引脚的检查(set_data_check)

                建立时间和保持时间检查也可以在任意两个数据引脚之间进行,一个引脚为约束引脚(constrained pin),其作用类似于触发器的数据引脚,而另一个引脚为相关引脚(related pin),其作用类似于触发器的时钟引脚。与触发器建立时间检查的一个重要区别是,数据到数据的建立时间检查是在与发起沿相同的沿上执行的(不同于触发器的常规建立时间检查,其中捕获时钟边沿通常会距离发起时钟沿一个周期)。因此,数据到数据的建立时间检查也称为零周期检查(zero-cycle checks)或同周期检查(same-cycle checks)。

                使用set_data_check命令可以指定数据到数据的检查,SDC约束命令示例如下:

                        set_data_check -from SDA -to SCTRL -setup 2.1

                        set_data_check -from SDA -to SCTRL -hold 1.5

                        注意:如果(-setup)约束值为负值,则violation区域向右缩,并不是方向相反;hold检查同理。

                参见下图,SDA是相关引脚(related pin),而SCTRL是约束引脚(constrained pin)。建立时间数据检查规定SCTRL应该在相关引脚SDA的边沿之前至少2.1ns到达,否则即为数据到数据的建立时间检查违例。保持时间数据检查规定SCTRL应该在SDA之后至少1.5ns到达,如果约束引脚的信号早于该时刻到达,即为数据到数据的保持时间检查违例。

                零周期(zero-cycle)建立时间检查会导致保持时间检查与其它保持时间检查有所不同,因为根据定义,通常在建立时间捕获沿之前的一个周期执行保持时间检查。由于数据到数据建立时间检查的约束引脚和相关引脚的时钟沿相同,因此在保持时间检查中,相关引脚(related pin)SDA的发起沿比约束引脚(constrained pin)SCTRL的发起沿要早一个周期。

                看图解读:这样的设置(SDR情况下),如果把SDA看做latch时钟,则发射SCTRL的时钟的、且与图中SDA同拍的上升沿的位置,超前SDA上升沿的2.1ns以上;发射SCTRL时钟的下一拍的上升沿延迟前述上升沿1.5ns以上。

                在某些情况下,设计人员可能要求在同一时钟周期上执行数据到数据的保持时间检查。相同周期的保持时间要求意味着要将用于相关引脚的时钟沿移回约束引脚的时钟沿处。可以通过指定多周期保持时间为-1来实现:

                        set_multicycle_path -1 -hold -to SCTRL

2 同步输入(Synchronous Inputs)

        同步输入包括系统同步输入和源同步输入。

        对于模块的输入接口来说, 这两者同步方式没有什么区别,故I/O delay的设置方式一样。

        ①创建data_clock:创建用于描述数据时钟的虚拟时钟data_clock(virtual clock):

create_clock -name data_clock -period 10

        ②创建clock_clock:输入端口的基础时钟,描述了时钟输入端口的时钟特性。

# 在输入端口上创建周期为 10 ns 的基础时钟

create_clock -name clock_clock -period 10 [get_ports clk_in]

        ③输入延迟约束:

#上升沿
set_input_delay [expr 0.7 * UI] -max -clock data_clock [get_ports data_in*]
set_input_delay [expr 0.0 * UI] -min -clock data_clock [get_ports data_in*]

#DDR add 下降沿
set_input_delay [expr 0.7 * UI] -max -clock data_clock -clock_fall \
[get_ports data_in*] -add
set_input_delay [expr 0.0 * UI] -min -clock data_clock -clock_fall \
[get_ports data_in*] -add

  

3 同步输出(Synchronous Outputs)

        3.1 系统同步输出

                ①创建data_clock:在输入端口上创建周期 10 ns 的基础(launch)时钟:

create_clock -name data_clock -period 10 [get_ports clk_in]

                ②创建clock_clock:创建一个虚拟时钟(virtual clock)作为latch_clk。

# 在输入端口上创建周期为 10 ns 的基础时钟

create_clock -name clock_clock -period 10

                ③输出delay设置:

#上升沿
set_output_delay [expr 0.7 * UI] -max -clock clock_clock [get_ports data_out*]
set_output_delay [expr 0.0 * UI] -min -clock clock_clock [get_ports data_out*]

#DDR add 下降沿
set_output_delay [expr 0.7 * UI] -max -clock clock_clock -clock_fall \
[get_ports data_out*] -add
set_output_delay [expr 0.0 * UI] -min -clock clock_clock -clock_fall \
[get_ports data_out*] -add

        3.2 源同步输出

                如上图所示,整个时序分析路径共3段path。按照上文中的经验值,现分别约定三段的setup relationship的margin分别为0.3、0(打平)和0.3个period值(总和<1.0个T)。

                可以利用set_data_check设置“clk_in→ data_out”和“clk_in→ clk_out”的skew关系,使得latch时钟超前数据,如下图:

                        skew设置:

set_data_check -from [get_ports clk_out*] -to [get_ports data_out*] -setup 0

set_data_check -from [get_ports clk_out*] -to [get_ports data_out*] -hold [expr 0.7 * UI]

set_multicycle_path -1 -hold -to [get_ports data_out*] 

                latch时钟滞后data时钟则会导致hold违例(同源已知同拍的相对相位关系),如下图:

4 补充时钟同异步关系

        无论是系统同步还是源同步,都属于同步关系,以上所有创建时钟都属于同步检查的group里。

5 补充伪路径异常(DDR)

        利用“set_false_path”设置不需要检查的路径,具体情况具体分析。

6 参考

        静态时序分析圣经翻译计划——第十章:鲁棒性检查 (上) - 知乎

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值