![48934f897896f8a1b9637db0f088c277.png](https://i-blog.csdnimg.cn/blog_migrate/874aa835d537aebecbd9c05f098260be.jpeg)
根据定义,虚拟时钟是没有时钟源的时钟,也就是说虚拟时钟是被定义的,但未与任何引脚(pin)/端口(port)关联的时钟。
虚拟时钟用作设置input delay/output delay的参考(reference)。
如何定义虚拟时钟,其sdc命令如下:
create_clock–name VCLK –period 10
上面的SDC命令定义周期为10 ns的虚拟时钟“ VCLK”。
定义虚拟时钟的目的,用于指定虚拟时钟的latency 和接口时序。下图是一种定义虚拟时钟的方案。
![c6eb0546d23ec72401a8cf14ee1a9bae.png](https://i-blog.csdnimg.cn/blog_migrate/33f5ad08b793d45e63ee459328ea3123.png)
Reg-A是内部触发器,通过PORT发送数据。由于它是一个同步信号,因此我们可以假定它被位于模块外部的触发器(Reg-B)采样。
在该模块内,可以通过使用与clock_in同步的时钟为端口PORT指定output delay来约束reg2output路径。
但是,如果我们参考clock_in本身指定output delay,就无法指定到达触发器(Reg-B)的clock latency。因为如果我们指定clock_in的延迟,则它也对Reg-A起作用。
在时钟树综合之后,会导致output port约束变得更悲观。同理,会导致input port约束变得更乐观。
![1be7cebe508cb87a0ebb6e35e1f86573.png](https://i-blog.csdnimg.cn/blog_migrate/e99afaac10916831d2cb6e555c3f5570.png)
module delay ( clk, data_in, data_out );
inputclk, data_in;
output data_out;
wire n1,n2;
DFFQXL data_out_reg ( .D(n1), .CK(clk), .Q(n2) );
CLKINVX1 U1 ( .A(data_in), .Y(n1) );
CLKINVX1 U2 ( .A(n2), .Y(data_out) );
endmodule