众所周知,在芯片后端设计中,和宏单元Macro相关的时序一般比较难满足。通常情况下,设计人员通过人为的调整Useful-Skew的方式(比如clock latency和balance point delay)来优化和Macro相关的时序。
在Fusion Compiler(后面简称FC)中,工具为用户提供了自动优化和Macro相关时序的方法,也就是set_skew_macros这个命令。我们下面来详细介绍下这个命令的功能和用法。
如上图所示,是我们对有input path、output path、input register和output register的描述。那么针对Macro的useful skew优化就是通过自动调整input Regs、output Regs以及Macros的offset值达到优化input paths和output paths的目的。举个简单的例子,比如input paths的时序比较差,那么工具会通过preppone input Regs或者postpone macros的方式去优化input paths 的时序。那么在FC中如何使用这一功能呢?
1. 首先用户需要根据需求指定需要skew优化的Macros。
比如:set macro [get_cells Macro_A Macro_B Macro_C]
2. 然后使用set_skew_macros命令来优化Macro相关的时序路径。
比如: set_skew_macros -bank_name *** -macros $macro -improve_side input
上面的这个例子就是优化macro A、B、C的input paths。同样地,你也可以根据需求指定output paths(output)或者同时优化input paths和output path(both).
针对以上命令的使用有以下说明:
1.设置了set_skew_macros之后,工具在全局CCD,也就是做useful skew computation之前会优先用单独的skew优化算法来优化macro bank的input paths和output paths。因此,macro相关的path享有较高的优先级。
当然,如果不使用macro skew的方法,默认的CCD优化也会优化macro相关的时序路径,但是优化效果不如前者。因为在默认的CCD optimization中,macro paths和non-macro paths具备同样的优先级。
2.工具在优化input paths的同时,不会以损害output paths的时序为代价。但是会degrade outer paths(也就是和input regs和out regs相关的外部路径)。
比如上图,我们需要优化Input paths,那么工具通过prepone input registers, postpone macros来提升input paths的时序。同时,为了不损害output paths,那么工具也会postpone output registers。当然,将Macro相关的timing放在较高的优先级会degrade outer paths的时序。
3.在macro skew的基础上,用户也可以指定user skew(latency或者balance point delay)。那么max_skew = macro_skew + user_skew。
4. 可以通过如下设置控制macro skew的优化力度:
compile.flow.skew_macros_max_prepone (default: 300ps)
compile.flow.skew_macros_max_postpone (default: 200ps)
compile.flow.skew_macros_effort (default: medium)
最后一点,也是需要特殊注意的是,Macro skew发生在FC initial_opto的CCD useful skew computation之前。因此,后续的CCD skew computation在优化outer paths的时候可能会对input registers和output registers的skew value进行改变,从而影响了对macro bank的优化。为了避免类似上述的情况发生,我们可以通过如下设置disable input registers和output registers的CCD 优化。
group_path -name input_reg -to [get_pins INPUT_REG_*/D]
group_path -name output_reg -from [get_pins OUTPUT_REG_*/CK]set_app_options –name ccd.skip_path_groups –value {input_reg output_reg}
好了,如果读这个命令感兴趣的话,赶紧用起来吧!