文章目录
一、什么是Virtual Clock
我们通常说的create_clock, create_generated_clock 都是real clock。而virtual clock则不挂在任何port或者pin上,只是虚拟创建出来的时钟。Virtual Clock是没有定义时钟源的时钟,而Real Clock是定义了时钟源的时钟。
Virtual clock与real clock的区别就在于是否有source,real clock有实实在在的source pin/port,沿着source可以trace到clock sink,可以对real clock做CTS;而virtual clock不行。
定义Real/Virtual clock cmd代码如下(示例):
# real clock, with source pin/port
create_clock -name "CLK" -period 10 -waveform [0 5] [get_ports clk]
# virtual clock
create_clock -name "CLK_V" -period 10 -waveform [0 5]
二、Virtual Clock的作用
我们通常会把input/output delay挂在virtual clock上,因为input/output delay约束本来就是指片外的时钟,所以挂在virtual clock上较为合理。
1. input/ouput dely
对于BLOCK,2个FF源于同一个clk,它们是同步的,所以RegA->RegB这条跨block的path需要检查timing;而对于BLOCK,这条path是看不见的,它只能看到RegA->PORT的path,即block内部看到的path比真实path要短。这样就需要对output port PORT 设output delay约束,delay value为从PORT到RegB/D的delay,如下图所示。
clock latency包括了clock source latency和clock network delay。
source latency是外部CLK source到BLOCK CLK port的delay;network latency是从CLK port 到RegA/CP的latency,这部分就是CTS后clock tree的长度。
当BLOCK中没有做clock tree 的时候,clock network delay 等于0, 是ideal的,这时候RegA到PORT这个path来说,用virtual clock还是用real clock效果都是一样的。
timing report 如下所示。
Startpoint: data_out_reg
(rising edge-triggered flip-flopclocked by clk_in)
Endpoint: PORT (output port clocked by clk_in)
PathGroup: clk_in
PathType: max
Point Incr Path
-----------------------------------------------------------
clock clk_in (rise edge) 0.00 0.00
clock network delay (ideal) 0.00 0.00
data_out_reg/CK (DFFQXL) 0.00 0.00 r
data_out_reg/Q (DFFQXL) 1.00 * 1.00 f
U2/Y(CLKINVX1) 1.00* 2.00 r
PORT (out) 0.00 2.00 r
data arrival time 2.00
clock clk_in (rise edge) 10.00 10.00
clock network delay (ideal) 0.00 10.00
output external delay -8.00 2.00
data required time 2.00
-----------------------------------------------------------
data required time 2.00
data arrival time -2.00
-----------------------------------------------------------
slack(MET) 0.00
但是,当BLOCK到了CTS阶段后,因为有BLOCK内部有clock network delay的存在,而RegB仅仅是个虚拟的寄存器,他的clock tree是不存在的,因此,RegB的clock network delay也就是0,这就会导致 RegA 到 PORT的setup timing path变得过于严格(与之相反,input 到 内部寄存器的path的setup check就会过于乐观),即timing很难meet(in2reg hold,reg2out setup)。
timing report 如下所示。
Startpoint: data_out_reg
(rising edge-triggered flip-flop clocked by clk_in)
Endpoint: PORT (output port clocked by clk_in)
PathGroup: clk_in
PathType: max
Point Incr Path
-----------------------------------------------------------
clock clk_in (rise edge) 0.00 0.00
clock network delay (propagated) 1.50 1.50
data_out_reg/CK (DFFQXL) 0.00 1.50 r
data_out_reg/Q (DFFQXL) 1.00 * 2.50 f
U2/Y(CLKINVX1) 1.00* 3.50 r
PORT (out) 0.00 3.50 r
data arrival time 3.50
clock clk_in (rise edge) 10.00 10.00
clock network delay (propagated) 0.00 10.00
output external delay -8.00 2.00
data required time 2.00
-----------------------------------------------------------
data required time 2.00
data arrival time -3.50
-----------------------------------------------------------
slack(VIOLATED) -1.50
data path上由于增加了1.5ns的clock network latency,而发生了时序违例。这是因为设置output_delay参考的clock path上没有clock latency。
解决方案如下:
-
如果用real clock,修改input delay或者output delay。对于上面的示例, 可以将output delay 减少clock network delay一样的数值,另外为了保持和CTS后的结果一致,在综合的时候还需要通过set_clock_latency设置clock network delay。
-
对于RegB 是用的virtual clock(VCLK),在CTS之后,就可以对VCLK加上latency。而对于real clock,在CTS之后,都要由ideal clock设为propgated clock(set_propagated_clock *), 因此对于real clck,是不能够用set_clock_latency设置clock network delay的。
代码如下(示例):
set_clock_latency -clock VCLK $clock_network_delay
2. virtual clock
Virtual clock就是用来帮助我们约束IO的,设置virtual clock的好处就是可以在不影响real clock的情况下,指定clock的clock network delay。
假如DUA里面的register全部由CLK_CORE驱动,但是ROW_IN和STATE_O的related_clock分别为CLK_SAD和CLK_CFG,这种情况下,可以使用virtual clock来约束IO,如下图所示。
代码如下(示例):
create_clock -name VIRTUAL_CLK_SAD -period 10 -waveform {2 8}
create_clock -name VIRTUAL_CLK_CFG -period 8 -waveform {0 4}
create_clock -period 10 [get_ports CLK_CORE]
set_input_delay -clock VIRTUAL_CLK_SAD -max 2.7 [get_ports ROW_IN]
set_input_delay -clock VIRTUAL_CLK_CFG -max 4.5 [get_ports STATE_O]
下面是in2reg波形图。
下面是reg2out波形图。
三、什么情况下Virtual Clock不再适用
当input/output ports由片外的时钟约束时,使用virtual clock比较合理。但是当input/output ports由内部的clock驱动时,则不能再使用virtual clock,需要使用真实的clocks。