到目前为止,我们已经看到了如何约束时钟和端口来指定设计中的时序要求,我们可以通过这些基础的约束命令来进行时序约束,但是时序分析工具默认的时序检查方式可能和我们实际工程实现的情况不同,通常来说是约束过紧,可能导致时序失败。此时,设计者就需要额外增加一下啊约束命令,用于调整既有的时序检查方式,以保证达到我们的设计预期。设计者额外增加的这部分约束,我们称之为时序异常(也有地方称之为时序例外约束)。
时序异常一般可以分成一下三种情况:
- 虚假路径——它们是不需要满足任何时序要求的路径。实现工具在收约束时忽略此种路径中的时序
- 多周期路径——它们是需要多个周期来传递数据的路径。实现工具放宽此种路径上的时序
- 最小延迟和最大延迟——它们是具有特殊要求的最大延迟和最小延迟的路径,并且是在设计人员想要覆盖推测的建立和保持要求时指定的。
本文中,我们重点关注虚拟路径。
我们刚刚提到过,虚拟路径是不需要满足任何时序要求的路径,所谓的虚拟路径(False路径),之所以称为“虚拟”,并不是这条路径不存在,而是表示这条路径是设计中的非功能路径或没有任何时序要求的路径。显然,对于这样的路径,我们需要通过时序异常,使得实现工具忽视这样路径的存在,放弃对于它们进行时序分析和时序约束的努力。
常见的虚拟路径包括以下几种:
- 已经做过同步处理的跨时钟域路径
- 上电后只做一次的初始化写入的寄存器路径
- 复位或测试逻辑的路径
- 某些实际并不存在的时序路径
虚拟路径使用set_false_path命令在SDC中建模
该命令的BNF是:
set_false_path [-setup]
[-hold]
[-rise][-fall]
[-from from_list]
[-to to_list]
[-through through_list]
[-rise_from rise_from_list]
[-rise_to rise_to_list]
[-rise_through rise_through_list]
[-fall_from fall_from_list]
[-fall_to fall_to_list]
[-fall_through fall_through_list]
[-comment comment_string]
在所有开关之间,该命令指定了以下内容:
使用-from,-through,-to选项可以指定要声明为虚拟路径的路径。该规格可以包含一个或多个上述选项。-from 和 -to 最多只能为每个命令指定一次。但是,-through 可以在同一个命令中多次指定。
我们举一个简单的例子:
set_false_path -from S1 -through X1 -to D1
这样的一行约束就表示:从S1到D1,经过X1的所有路径都被设置为了虚拟路径。
有时,一个选项的任何参数都是一个具有多个元器件的列表,而不是单个元器件。在这种情况下,它相当于具有多个命令,每个命令只有一个元器件。如:
set_false_path -from S1 -through{X1,X2};
//等价于
set_false_path -from S1 -through X1;
set_false_path -from S2 -through X2;
上述的例子都表示从S1开始并通过X1或者X2中任何一条的路径。
选项-from和-to只能分别是时序的起始点和终点。另外,除了电路元器件外,这些选项也可以指定时钟。当指定时钟名称时,它表示由时钟触发的所有时序电路元器件以及所有输入输出端口,相当于指定时钟的输入/输出延迟是由特定的时钟来指定的。事实上,在 -from 和 -to 中指定时钟可以提供一种简单的方式来覆盖更多的时序电路元器件。因此,set_false_path -from CLK1表示所有的路径都源自于(1)所有由CLK1触发的时序电路元件(2)相对于CLK1约束的所有输入端口。
通常,应该对指定为起始点或终点的元器件有一些建议。起始点应该是一个时钟、主要的输入端口或双向端口、一个时序电路单元、一个时序电路单元的时钟引脚、一个指定了输入延迟的引脚。同样,终点应该是一个时钟、主要的输出端口或双向端口、一个时序电路单元、一个时序电路单元的数据引脚、一个指定了输出延迟的引脚。一些工具也可能允许某些其他点被指定为起始点或终点,但是使用这些点将最小化实现流程中这种虚假路径的重用,因为这种例外可能不被所有工具普遍接受。
有时候,设计人员可能想要为特定的过渡过程提供虚假的路径,而不是沿着路径提供所有的过渡过程。
这可以通过以下的方式实现:
在某种情况下,设计人员可能只想为建立或者保持路径设置这个约束、这是使用 -setup 和 -hold 选项来实现的。
在指定虚拟路径时,设计人员需要注意以下事项: