虚拟时钟
虚拟时钟,指的是在设计中不存在的时钟,因此设计中定义虚拟时钟满足以下3个特点:
1.设计中的某个时钟是一个现实存在的,但是其时钟源不是来自设计中任何的引脚和端口,即设计中的时序单元都不是由该时钟触发,然而设计中部分时序路径的输入输出端口又与该时钟相关。如下图所示,由于时钟1并不直接在设计里起作用,时钟1即为虚拟时钟。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcsQXYtJ3bm9CXldWYtlWPzNXZj9mcw1ycz9WL49TQNBTW6xkUkpWZFh2VaBTVt1keOpWVShWMh1EZtZVaOVUTCp0RONDaIZVNatWTM50aUNkRFJ1MNRlYOpkMZdHOF1UToRVWw50VRdHeFR2VKRlUyk0Vh1GZx4UezV0U39mViZFbGdVVwBTYzIESVxGbUNlSkVEVR5EbSVUO5pVdCNDW2wWbZRXMywUdO1GTqx2RjhXNpVGcKdlY0lTeMZTTINGMShUYvwlbj5yZtlmbkN3YuQnclZnbvN2Ztl2Lc9CX6MHc0RHaiojIsJye.jpg)
2.由于虚拟时钟与设计中的任何引脚和端口没有直接关系,所以定义虚拟时钟的命令中不指定时钟的端口。
通过SDC命令create_clock来创建虚拟时钟,比如通过该命令定义一个周期为10、占空比为50%的虚拟时钟信号。
create_clock -name virtual_clk -period 10 -waveform {0 5}
3.虚拟时钟在设计中的实际应用是用于作为输入输出端口延时约束的时钟源,主要分为以下3种情况。
(1)设计的输入端口信号来自外部某个时钟控制下的时序路径输出端,如下图所示。
根据以上情况,设计本身的时钟为CLK1,但是其输入端口core_in是来自外部基于CLK2时钟域下的时序路径的输出,其命令如下:
create_clock -name CLK2 -period 10 -waveform {0 5}
create_clock -name CLK1 -period 10 [get_ports core_ck]
set_input_delay -clock CLK2 -max 2.7 [get_ports core_in]
以上命令定义设计本身的时钟CLK1和定义虚拟时钟CLK2,同时基于虚拟时钟来定义输入端口core_in的时序约束,其输入延时为2.7ns
(2)设计的输出端口信号进入外部某个时钟控制下的时序路径输入端,如下图所示。
根据以上情况,设计本身的时钟为CLK1,但是其输出端口core_out是到一个外部基于CLK2时钟域下的时序路径的输入,其命令如下:
create_clock -name CLK2 -period 10 -waveform {0 5}
create_clock -name CLK1 -period 10 [get_ports core_ck]
set_output_delay -clock CLK2 -max 2.7 [get_ports core_out]
以上命令定义设计本身的时钟CLK1和定义虚拟时钟CLK2,同时基于虚拟时钟来定义输出端口core_out的时序约束,其输出延时为2.7ns。
(3)设计的输入、输出端口信号都是外部某个时钟控制下的时序路径,如下图所示。
设计本身的时钟为CLK1,但是其输入、输出端口是自外部基于CLK2时钟域下的时序路径,命令如下:
create_clock -name CLK2 -period 10 -waveform {0 5}
create_clock -name CLK1 -period 10 [get_ports core_ck] set_input_delay -clock CLK2 -max 2.7 [get_ports core_in]
set_output_delay -clock CLK2 -max 2.7 [get_ports core_out]
以上命令定义设计本身的时钟CLK1和定义虚拟时钟CLK2,同时基于虚拟时钟来定义输入、输出端口的时序约束,其输入、输出延时都定义为2.7ns。