什么是virtual clock
指的是没有定义source(时钟源)的时钟。通常用于对interface timing的约束,相关的sdc命令为set_input_delay set_output_delay。(相对应,定义了source(时钟源)的时钟,就是real clock)
示例:
create_clock -name VCLK -period 10
简单的说,设置virtual clock的好处就是可以在不影响real clock的情况下,指定clock的clock network delay。
我们知道,clock latency包括了clock source latency和clock network delay。当BLOCK中没有做clock tree 的时候,clock network delay 等于0, 这时候,RegA到PORT这个path来说,用virtual clock还是用real clock, 效果都是一样的。
但是,当BLOCK到了CTS阶段后,因为有BLOCK内部有clock network delay的存在,而RegB仅仅是个虚拟的寄存器,他的clock tree是不存在的,因此,clock network delay也就是0,这就会导致 RegA 到 PORT的timing path变得过于严格(与之相反,input 到 内部寄存器的path的setup check就会过于乐观)。那么我们可以对RegB设source latency。然而不幸的是,如果用的是real clock, 那么必然会导致RegA的clock的source latency也相应的改变。这时候就体现出了virtual clock的好处。
示例:用virtual clock对PORT加约束
set_output_delay -clock [get_clocks VCLK] -max 1 [get_port PORT] -add
假设我们对于RegB 是用的virtual clock(如示例),在CTS之后,就可以对VCLK加上latency:set_clock_latency -clock VCLK $clock_network_delay。
而对于real clock,在CTS之后,都要由ideal clock设为propgated clock(set_propagated_clock), 这样,对于real clck,是不能够用set_clock_latency设置clock network delay的。
当然,用real clock也是有办法解决这个问题的,那就是修改input delay或者output delay。对于Figure1, 可以将output delay 减少 clock network delay一样的数值。
由于现在的PR工具都会在CTS之后自动进行update io latency的动作,我们完全没有非要用一个real clock,然后自己去在CTS之后去修正port的input delay或者output delay。
以上就是我们需要用virtual clock的目的。