时序约束之周期约束

举报
李锐博恩 发表于 2021/07/15 08:15:15 2021/07/15
【摘要】 周期约束 周期概念是FPGA/ASIC时序定义的基础,周期(PERIOD)约束附加在时钟网线上,时序分析工具根据PERIOD约束检查时钟域内所有同步元件(包括寄存器、锁存器、同步RAM/ROM等)的时序是否满足要求。 PERIOD约束会自动处理寄存器时钟端的反相问题。如果相邻同步元件的时钟相位相反,那么它们之间的延时将被默认限制为PERIOD约束值的一半。 PERIOD...

周期约束

周期概念是FPGA/ASIC时序定义的基础,周期(PERIOD)约束附加在时钟网线上,时序分析工具根据PERIOD约束检查时钟域内所有同步元件(包括寄存器、锁存器、同步RAM/ROM等)的时序是否满足要求。

PERIOD约束会自动处理寄存器时钟端的反相问题。如果相邻同步元件的时钟相位相反,那么它们之间的延时将被默认限制为PERIOD约束值的一半。

PERIOD约束分析的对象包括输入PAD到同步元件和同步元件到同步元件之间的组合逻辑路径。不同时钟网络之间的逻辑块以目标网络的时钟为约束。
如下图:

设定PERIOD约束之前,预估系统最高可能的工作频率是十分重要的。设计电路所能达到的最高工作频率取决于同步元件本身的建立保持时间,以及同步元件之间的逻辑和布线延迟,如下图:

由上图可以计算出,时钟的最小周期:

T_{CLK}=T_{cko}+T_{logic}+T_{su}-T_{clkskew}

T_{clkskew}=T_{clk2}-T_{clk1}

其中T_{cko}是时钟输出时间,T_{logic}是同步元件之间的组合逻辑延时,T_{su}是同步元件的建立时间,T_{clkskew}是时钟信号之间的偏斜(偏移)。

最小时钟周期的倒数就是最高频率,用f_{max}表示。

f_{max}= 1/T_{CLK}

f_{max}能体现设计的时钟性能,是最重要的时序指标之一。

可以用两种方法对时钟网络附加时钟周期约束,分别为Simple Method 和 Preferred Method。

下面分别介绍:

Simple Method

语法结构如下:

[period_item] PERIOD = period {HIGN|LOW} [hign_or_low_time];

命令解释:

关键字用粗体表示,“[ ]”里的内容为可选,“{ }”里的内容是必选的,“|” 用于分隔列表中的各选项。

  • period_item 可以是 NET “net_name” 或 TIMEGRP “group_name”。前者表示PERIOD约束作用在名为“net_name”的时钟网络线所驱动的同步单元上,后者表示PERIOD约束作用到TIMEGRP所定义的分组上,该分组由分组约束来定义,一般包括由寄存器、锁存器和RAM等同步单元。
  • 参数 period 为时钟周期值,其单位可以是ps、ns、us 或者ms,不区分大小写,默认单位是ns。
  • HIGH|LOW用于制定时钟周期的第一个脉冲是高电平还是低电平。
  • high_or_low_time 用于指定由HIGH|LOW指定的脉冲的持续时间,默认单位为ns,如果不提供High_or_low_time值,那么信号占空比为50%。

示例:

NET clka PERIOD = 50ns HIGN 20ns

说明:

设置时钟clka的周期为 50ns,高电平持续时间为 20ns, 该约束将被附加到 clka所驱动的所有同步单元上。


Preferred Method

语法结构如下:

TIMESPEC “TSidentifier” = PERIOD “TNM_reference” period {HIGH|LOW} [high_or_low_time]

 

命令解释:

  • TIMESPEC是一个时序规范标识符,表示当前约束为时序规范。
  • TSidentifier 包括了字母TS和一个标识符identifier,它们共同构成另一个时序规范,我们将其称为TS属性定义。TSidentifier 的值代表了具体的时序规范,可以在设计的其他地方引用。

用TIMESPEC 约束定义时钟的方法: 首先在时钟网络 clk 上附加 TNM_NET约束,把clk驱动的所有同步元件定义成一个分组,命名为 “sys_clk ”。

NET “clk” TNM_NET = “sys_clk”

TIMESPEC "TS_sys_clk" = PERIOD "sys_clk" 50ns HIGH 20ns

用TIMESPEC 约束定义的识别符 TS_sys_clk可以被其他时钟定义引用,这对于需要派生时钟的场合十分适用。

定义派生时钟

定义派生时钟的语法如下:

TIMESPEC "TSidentifier_2" = PERIOD "timegroup_name"  "TSidentifier_1" [* or /] factor PHASE [+ or -] phase_value[units]

 其中,TSidentifier_2是要定义的派生时钟, TSidentifier_1是已经定义的时钟, factor是两个时钟周期之间的倍数关系,是一个浮点数。 phase_value 指出两个时钟之间的相位关系,是一个浮点数。

派生时钟示例:定义时钟clk0:

TIMESPEC "TSclk0" = PERIOD "clk0" 50.0ns

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

TIMESPEC "TSclk1" = PERIOD "clk180" TSclk0  PHASE + 25.0ns

定义派生时钟clk90_2,其周期为主时钟的两倍,并延迟25ns。

TIMESPEC "TSclk2" = PERIOD "clk90" TSclk0*2 PHASE-25ns

 

参考自FPGA设计手册

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/81663669

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。