热度 2| |
后端论坛看到一个有关generated clock adjustment的帖子,觉得有趣,做了几个实验,记录一下结果,跟大家分享。
实验1:DFF实现2分频,分频时钟上升沿下降沿分别驱动launch,capture DFF
(这个库的symbol画的不是特别好,negedge DFF的时钟端没有画个小圆圈,而是用CPN来表示。)
电路很简单,先是一个DFF(u_dff_div2)实现2分频,分频后得到的generated clock驱动四个data path。
- Path 1: Launch用generated clock上升沿,capture用generated clock上升沿
- Path 2: Launch用generated clock上升沿,capture用generated clock下降沿
- Path 3: Launch用generated clock下降沿,capture用generated clock上升沿
- Path 4: Launch用generated clock下降沿,capture用generated clock下降沿
在SDC里,主时钟与generated clock定义分别为:
create_clock -name CLK -period 2 -waveform [list 0 1] [get_port clk]
create_generated_clock u_dff_div2/Q -add -name CLK_DIV2 -master_clock CLK -source u_dff_div2/CP -edges {1 3 5}
时钟关系示意张图如下。
下面看看四个data path的report。
Path 1:
Path 2:
Path 3:
Path 4:
不难看出,当launch或capture用到generated clock (CLK_DIV2)下降沿时,report中都会加上generated clock adjustment CLK_DIV2 Adj. = 2.000。
这个generated clock adjustment是什么意思呢?不妨以path 3 report为例做分析。
首先讨论STA需要一个参照系。最常见的参照系就是时钟,launch和capture path的delay都是相对时钟这个共同的参照系(timing reference)加加减减得到的。
Path 3的launch和capture时钟都是generated clock (CLK_DIV2),而generated clock (CLK_DIV2)又是从主时钟CLK衍生而来的,所以最根本的timing reference就是主时钟CLK。这个例子里2分频DFF(u_dff_div2)用的是CLK的上升沿,意味着generated clock (CLK_DIV2)的上升沿和下降沿都和CLK的上升沿对齐,所以:
1) report中的launch,capture path的起点都是clk ^,而且取的是clk在t=0ns的那个上升沿。
2) launch path用的是generated clock (CLK_DIV2)的下降沿。虽然CLK_DIV2下降沿也和clk上升沿对齐,但显然不会是t=0ns那个clk ^。从前面的时钟关系示意图可以看到 capture CLK_DIV2下降沿对应的只能是t=2ns clk ^。为了弥补起点取了t=0ns clk ^,工具在capture path加上了generated clock adjustment 2ns。
3) capture path起点虽然也取了t=0ns clk ^,但setup analysis是next cycle (next edge) analysis,report中加了phase shift 4.000ns,实际的capture是generated clock (CLK_DIV2)在t=4ns的上升沿。
实验2:DFF实现2分频,分频时钟反向代替下降沿
做个小变化,把实验1中的negedge DFF换成posedge DFF,随后用反向后的CLK_DIV2驱动。
Report结果基本没变化,generated clock (CLK_DIV2)的下降沿出现在launch或capture path中,工具都会加上generated clock adjustment。
顺便提一下,有的设计要求都用posedge DFF,这是有道理的,避免了把negedge DFF放到scan chain头上,对PR有一定帮助。
实验3:ICG实现2分频,分频时钟上升沿下降沿分别驱动launch,capture DFF
与实验1类似,分频电路换成了ICG实现。
在SDC里,主时钟与generated clock定义分别为:
create_clock -name CLK -period 2 -waveform [list 0 1] [get_port clk]
create_generated_clock u_icg_clk_gated/Q -add -name CLK_GATED -master_clock CLK -source u_icg_clk_gated/CP -edges {1 2 5}
这里需要注意的是-edges与实验1不同。如果-edges设置有错,工具会报错(TA-152)。
时钟关系示意张图如下。
Path 3 report。
首先可以看到这个report里generated clock adjusment为0。Why? ICG在STA里是”透明的”,工具可以反向穿过ICG回溯到时钟源头。其次,用ICG分频,分频时钟的上升沿下降沿分别对应主时钟的上升沿下降沿,这点与DFF分频是不同的,工具回溯是可以精准定位到主时钟的上升沿下降沿的。在上面的report里,可以看到launch的timing reference是clk v,而capture的timing reference是clk ^,没有任何模棱两可,因此不需要generated clock adjustment。
小结一下。
分析STA首先确定参照系timing reference。
DFF分频时钟用作launch或capture时钟,工具会自动加上generated clock adjustment,保障计算正确。
ICG分频时钟用作launch或capture时钟,如果工具可以精准定位到master clock的上升沿下降沿,就不需要generated clock adjustment。