很多人工作多年,却还不理解Encounter timing report中的phase shift是如何计算出来的?确实是一个很抽象的概念,这次我们来介绍一下它是怎么计算的。
先看以下公式
首先得会学会“取沿”
setup和hold的check机制不一样
它们的capture edge取法也不大一样
setup检查:自己和别人检查,因此capture edge发生在最近的launch edge后面
hold检查:自己和自己检查,因此capture edge发生在最近的launch edge前面或者正好同沿
如下图所示,两种箭头很好地表示出了setup和hold的检查机制,牢牢地记住这两张图才能很好地去计算Phase shift.
实战分析
leading edge VS leading edge(single clk)
对于setup来说
图上L代表leading edge,T代表trailing edge。capture clock edge发生在launch clock edge之后,因此,我们可以以0作为launch clock edge点,想一想上面那张检查机制图。那它对应的capture clock edge位置就在4这个位置。由于都是leading edge,第一个cycle的相位差其实就是0-0。因此,计算公式如下:
Phase Shift = (CE-LE) - (C1-L1) = (4-0)- (0 - 0)= 4
这种情况下面Phase Shift确实就是时钟周期
我们可以来看一下report_timing的结果来验证一下:
对于hold来说
captureclock edge发生在launch clock edge之前或者同沿,因此,我们可以以0作为launch clock edge,这个位置往前没有leading edge,那我们可以取同沿的0作为capture clock edge。同样的,第一个cycle的相位差其实就是0-0。因此,计算公式如下:
Phase Shift = (CE-LE) - (C1-L1) = (0-0)- (0 - 0)= 0
通过timing report来验证一下
2
trailing edge Vs leading edge(single clk)
对于setup来说
同样的,我们选0作为launch clock edge,往后看,选第一个trailing edge作为capture clock edge。第一个cycle的边沿相位差就是2-0。因此,计算公式如下:
Phase Shift = (CE-LE) - (C1-L1) = (2-0)- (2 - 0)= 0
这种情况下,Phase Shift就不等于周期了
通过timing report来验证一下:
对于hold来说
我们如果选0作为launch clock edge的话,往前看就没有trailing edge。因此我们需要选择4作为launch clock edge,那对应的capture clock edge就选择2。第一个cycle的边沿相位差就是2-0。因此,计算公式如下:
Phase Shift = (CE-LE) - (C1-L1) = (2-4)- (2 - 0)= -4
加深点难度,来看复杂的,在不同的clock domain中,如何去计算Phase Shift呢?
其实,leading edge和trailing edge的定义方式还是一样,只是capture clock edge和launch clock edge的差值我们需要选择最小的delta值,因为最小的delta值满足check以后,剩余的其他delta值也都可以满足。
3
leading edge VS leading edge(diff clk)
对于setup来说
我们选4作为launch clock edge。对应的最短的capture clock edge就是6。第一个cycle的边沿相位差就是0-0。因此,计算公式如下:
Phase Shift = (CE-LE) - (C1-L1) = (6 - 4)- (0 - 0)= 2
对于hold来说
我们可以选0作为launch clock edge。0也可以作为capture clock edge。而且是距离最短的沿,第一个cycle的边沿相位差就是0-0。因此,计算公式如下:
Phase Shift = (CE-LE) - (C1-L1) = (0 - 0)- (0 - 0)= 0
4
railing edge VS leading edge(diff clk)
对于setup来说
从上图就可以看出,为了得到最短的leading到trailing edge,我们选8作为launch clock edge。对应的最短的capture clock edge就是9。第一个cycle的边沿相位差就是3-0。因此,计算公式如下:
Phase Shift = (CE-LE) - (C1-L1) = (9 - 8)- (3 - 0)= -2
对于hold来说
为了得到最短的leading到trailing edge,我们选4作为launch clock edge。对应的最短的capture clock edge就是3。第一个cycle的边沿相位差就是3-0。因此,计算公式如下:
Phase Shift = (CE-LE) - (C1-L1) = (3 - 4)- (3 - 0)= -4
leading edge VS leading edge(multicycle)
最后,来看个更加复杂的,multicycle path
这条path的setup multicycle设成2
它的划分方法也和普通的一样,上图中,红色边沿代表leading edge,绿色代表trialing edge。我们选11作为launch clock edge。对应的最短的capture clock edge就是12。第一个cycle的边沿相位差就是0-1。因此,计算公式如下:
Phase Shift = (CE-LE) - (C1-L1) = (12 - 11)- (0 - 1)=2
唯一不同的是,对于multicycle path,我们还需要加上cycle adjustment值,也就是补偿的cycle值,上图中multicycle是2,那它补偿的cycle就是1个cycle,也就是4ns