版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://bb2hh.blogbus.com/logs/64871300.html
注明:如需转载,请注明作者出处,谢谢~,Author:pythonlong
以下根据资料和个人体会整理,如果错误,疑问欢迎请指正,讨论!!
一个PLL的应用电路图如下:
首先要明白PLL的作用:保持REF_CLK,FB_CLK相位一致。上图电路的时序如下:
如上图CLK_IN到REF_CLK有延迟,CLK到FB_CLK也有延迟,但是这2个延迟会让REF_CLK,FB_CLK的相位一致。
由于clk会在macro的输入端停止传输,所以需要一些适当约束,才能进行综合和时序分析。
有两种方法设置PLL的输出时钟(从综合到时序分析)
方法1:
dc综合的时候在PLL的输出端:
create_generated_clock -name PLL_CLK -source CLK_IN -multiply 1 [get_pins PLL/CLK]
如果PLL库中没有时序信息,可以根据spec通过create_qtm_model创建QTM模型。
pt做sta的时候同样可以使用创建的QTM模型,或者使用annotated_delay标记上图中的蓝色路径:
set_disable_timing PLL
set _max_rise [get_attribute [get_timing_path -delay max_rise -through PLL/CLK -through PLL/FB_CLK] arrival]
set _max_fall [get_attribute [get_timing_path -delay max_fall -through PLL/CLK -through PLL/FB_CLK] arrival]
set _min_fall [get_attribute [get_timing_path -delay min_fall -through PLL/CLK -through PLL/FB_CLK] arrival]
set _min_rise [get_attribute [get_timing_path -delay min_rise -through PLL/CLK -through PLL/FB_CLK] arrival]
remove_disable_timing PLL
set_annotated_delay -cell -max -rise -to PLL/CLK [expr 0.0 - $_max_rise]
set_annotated_delay -cell -min -rise -to PLL/CLK [expr 0.0 - $_min_rise]
set_annotated_delay -cell -max -fall -to PLL/CLK [expr 0.0 - $_max_fall]
set_annotated_delay -cell -min -fall -to PLL/CLK [expr 0.0 - $_min_fall]
2.在PLL输出端:create_clock -name PLL_CLK [get_pins PLL/CLK]
然后设置source latency:
set_clock_latency -source -late 5 [get_clocks PLL_CLK]
set_clock_latency -source -early 2 [get_clocks PLL_CLK]
pt做sta的时候同样在PLL输出端:create_clock -name PLL_CLK [get_pins PLL/CLK]
而clock的source latency需要计算得出:
set ref_max_rise [get_attribute [get_timing_path -delay max_rise -from CLK_IN -to PLL/REF_CLK] arrival]
set ref_max_fall [get_attribute [get_timing_path -delay max_fall -from CLK_IN -to PLL/REF_CLK] arrival]
set ref_min_fall [get_attribute [get_timing_path -delay min_fall -from CLK_IN -to PLL/REF_CLK] arrival]
set ref_min_rise [get_attribute [get_timing_path -delay min_rise -from CLK_IN -to PLL/REF_CLK] arrival]
set_disable_timing PLL
set fb_max_rise [get_attribute [get_timing_path -delay max_rise -through PLL/CLK -through PLL/FB_CLK] arrival]
set fb_max_fall [get_attribute [get_timing_path -delay max_fall -through PLL/CLK -through PLL/FB_CLK] arrival]
set fb_min_fall [get_attribute [get_timing_path -delay min_fall -through PLL/CLK -through PLL/FB_CLK] arrival]
set fb_min_rise [get_attribute [get_timing_path -delay min_rise -through PLL/CLK -through PLL/FB_CLK] arrival]
remove_disable_timing PLL
set_clock_latency -source -late -rise [expr $ref_max_rise -$fb_max_rise]
set_clock_latency -source -early -rise [expr $ref_min_rise -$fb_min_rise]
set_clock_latency -source -late -fall [expr $ref_max_fall -$fb_max_fall]
set_clock_latency -source -early -fall [expr $ref_min_fall -$fb_min_fall]
clock_latency为时序图中粉红色路径
由上面可以知道2中约束方法是一致的。方法一中REF_CLK的延迟加上annotated delay就是方法二中的source latency。
上面有个技巧就是先disable PLL的时序,而get_timing_path使用through,而不是使用from,to。
另外当考虑OCV的时候需要自习分析FB的路径和clock tree的关系,确定那些net是launch,哪写是capture。
因为OCV的时候使用延迟的计算不一样。会导致悲观或者乐观分析。
文章评论(0条评论)
登录后参与讨论