出处:http://bb2hh.blogbus.com/logs/20373036.html
作者:pythonlong
一个比较全的例子,不过还有比较多的特殊情况。
create_clock -period 100 [get_ports Pclk]
create_clock -period 100/8 -name pclkx8 [get_pins BUF2X2/Y]
create_clock -period 10 [get_ports Sclk]
create_generated_clock -name clk_div2 -divide_by 2 -add -source [get_attribute [get_ports Sclk] sources] -master_clock Sclk [get_pins DIV/clk_div2]
create_generated_clock -name clk_div4 -divide_by 4 -add -source [get_attribute [get_ports Sclk] sources] -master_clock Sclk [get_pins DIV/clk_div4]
create_generated_clock -name clk_div8 -divide_by 8 -add -source [get_attribute [get_ports Sclk] sources] -master_clock Sclk [get_pins DIV/clk_div8]
create_generated_clock -name Sclk1_l -multiply_by 1 -add -source [get_attribute [get_clocks pclkx8] sources] -master_clock pclkx8 -combinational [get_pins MUX1/Sclk1]
create_generated_clock -name Sclk1_h -multiply_by 1 -add -source [get_attribute [get_clocks clk_div2] sources] -master_clock clk_div2 -combinational [get_pins MUX1/Sclk1]
create_generated_clock -name Sclk2_l -multiply_by 1 -add -source [get_attribute [get_clocks clk_div8] sources] -master_clock clk_div8 -combinational [get_pins MUX1/Sclk2]
create_generated_clock -name Sclk2_h -multiply_by 1 -add -source [get_attribute [get_ports Sclk] sources] -master_clock Sclk -combinational [get_pins MUX1/Sclk2]
对于Sclk1,Sclk2驱动的时钟树的输出port,应该如下设置
set_output_delay -max 3 -clock [get_clocks Sclk1_l] [get_ports xx_out1]
set_output_delay -max 3 -add_delay -clock [get_clocks Sclk1_h] [get_ports xx_out1]
set_output_delay -max 3 -clock [get_clocks Sclk2_l] [get_ports xx_out2]
set_output_delay -max 3 -add_delay -clock [get_clocks Sclk2_h] [get_ports xx_out2]
对于Pclkx8需要的约束如下:
set_input_delay -max 2 -clock [get_clocks Pclk] [get_pins BUF2X2/Y]
红色圈圈出的设计要注意的,因为低速Pclkx8作为数据输入,对于Pclkx8又做时钟,又做数据,所以在时钟树前加buffer,然后用buffer的输出pin做create_clock。
记住:时钟会向后穿过任何组合逻辑,直到endpoint!
pll是macro,会被astro,或者dc作为black box。对于工具来说信号传输到黑盒子就算终止了,但是内部还要用到黑盒子产生的时钟,所以要create_clock .对于pll输出的clock的input_delay,output_delay约束却要用到外部的Pclk来约束。