设计里挂了几个Hard Macro比如PLL、Memory它们的时钟输入pin怎么处理直接影响整个clock tree的balance效果。很多人图省事直接把macro的CLK pin设成stop pin。工具确实会balance这个pin的insertion delay但问题是——macro内部还有一层时钟树啊工具不知道macro里面的延迟balance出来的结果只是表面平衡macro内部的FF和外部FF的时钟到达时间其实差得远。正确的做法是设成float pin把macro内部的时钟延迟告诉工具。Pin类型工具行为适用场景Stop PinBalance skew minimize insertion delay普通FF的CLK pinExclude Pin忽略不balance数据引脚、复位引脚Non-stop Pin穿过该pin找真正的sink分频寄存器的CLK pinFloat PinBalance时计入内部延迟Hard Macro的CLK pin# Float Pin设置示例macro内部延迟500psset_clock_tree_exceptions -float_pins [get_pins PLL_1/CLK] \\-float_pin_max_delay_rise0.5 \\-float_pin_max_delay_fall0.5# 负float pinmacro内部延迟比预期小set_clock_tree_exceptions -float_pins [get_pins MEM_1/CLK] \\-float_pin_max_delay_rise-0.2 \\-float_pin_max_delay_fall-0.2 关键提醒Float pin的延迟值从哪来看macro的.lib时序模型或者让IP vendor提供内部clock tree的延迟数据。别瞎猜差100ps就可能导致hold violation。
Hard Macro的Float Pin设错了,skew balance全白干
设计里挂了几个Hard Macro比如PLL、Memory它们的时钟输入pin怎么处理直接影响整个clock tree的balance效果。很多人图省事直接把macro的CLK pin设成stop pin。工具确实会balance这个pin的insertion delay但问题是——macro内部还有一层时钟树啊工具不知道macro里面的延迟balance出来的结果只是表面平衡macro内部的FF和外部FF的时钟到达时间其实差得远。正确的做法是设成float pin把macro内部的时钟延迟告诉工具。Pin类型工具行为适用场景Stop PinBalance skew minimize insertion delay普通FF的CLK pinExclude Pin忽略不balance数据引脚、复位引脚Non-stop Pin穿过该pin找真正的sink分频寄存器的CLK pinFloat PinBalance时计入内部延迟Hard Macro的CLK pin# Float Pin设置示例macro内部延迟500psset_clock_tree_exceptions -float_pins [get_pins PLL_1/CLK] \\-float_pin_max_delay_rise0.5 \\-float_pin_max_delay_fall0.5# 负float pinmacro内部延迟比预期小set_clock_tree_exceptions -float_pins [get_pins MEM_1/CLK] \\-float_pin_max_delay_rise-0.2 \\-float_pin_max_delay_fall-0.2 关键提醒Float pin的延迟值从哪来看macro的.lib时序模型或者让IP vendor提供内部clock tree的延迟数据。别瞎猜差100ps就可能导致hold violation。