周期约束

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

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

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

如下图:

时序约束之周期约束_ide

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

时序约束之周期约束_ide_02

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


时序约束之周期约束_时钟周期_03

时序约束之周期约束_寄存器_04

其中时序约束之周期约束_时钟周期_05是时钟输出时间,时序约束之周期约束_寄存器_06是同步元件之间的组合逻辑延时,时序约束之周期约束_ide_07是同步元件的建立时间,时序约束之周期约束_ide_08是时钟信号之间的偏斜(偏移)。

最小时钟周期的倒数就是最高频率,用时序约束之周期约束_时钟周期_09表示。

时序约束之周期约束_寄存器_10

时序约束之周期约束_时钟周期_09能体现设计的时钟性能,是最重要的时序指标之一。


可以用两种方法对时钟网络附加时钟周期约束,分别为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设计手册