我做的一个EDI的布局方法,大家一起来讨论一下。
时间:10-02
整理:3721RD
点击:
大家好,入手布局布线一段时间了。
由于工程对时序的要求非常高,按常规流程,目前也拿不出特别好的降时序的方法。
因此,我们内部人员,只能自己动手想办法进行细调。
在研究中,我发现了一种有效的在布局阶段降低时序的方法,希望对各位朋友有用。
当然,我走布局布线的时间还很短,难免这个方法,有很多问题,希望各位前辈,不吝赐教。
言归正传:
在大规模芯片整体布局时,我们一般是控制SRAM的放置。
往往关键路径,存在于部件间的连线。而一味调整部件间距离,又会造成局部绕线。反复调整,使迭代进度比较慢。
因此,对于部分部件,我们往往采取区域优化,在从顶层调用的方法。
以上,都是常规方法。下面,我主要说下,在局部部件优化时候的特殊策略。
这里,除了看timing报告,做优化,其实,我们后端,还可以找前端,问清楚流水栈和逻辑分布,通过调整寄存器来优化布局。
以一个运算部件为例:
1,在布局中,其共分为4栈,读取,执行,存储,写回。
其中,读取阶段,由于寄存器阵列,有大量的旁路,造成了其在逻辑级上较多,同时,大量的复杂连接,也容易形成绕线。
这里,我通过对逻辑分析。将名为control的20个寄存器,在中心进行阵列放置,使绕线延迟,变得均衡。
2,同时,由于从SRAM出来的一栈,SRAM和窗口寄存器本身的延迟较大,容易成为关键路径,而其下一站,逻辑级数和部件延时都较低。
因此,我对前400条关键路径的与SRAM相关的寄存器,用脚本进行了沿SRAM的阵列布局。
注:这里,我使用的脚本方法是,用根据起始坐标,用perl程序计算出坐标阵列。直接用placeInstance命令方式,而不是通过每次从SRAM的Pin脚坐标,增加一个偏移量,进行放置。这样做,可以大大加快脚本的运行速度。
还有一点,为什么只对前400条路径,进行操作,原因是,相关寄存器数量较多,我无法保证,拉动之后,SRAM附近的空间依然足够工具优化放置逻辑,所以只对前面的进行操作。经过几次试验,发现,对前400条操作,效果比较好。
3,根据逻辑关联,调整了2个控制软宏的空间位置,进行guide放置。
4,和前端商量,将setup最大的SRAM的片选使能端,设置为双周期路径。干掉了一大批关键路径。
通过以上3种方法的精调。基本将关键路径逼入了,其纯逻辑延迟占94%。跟传统流程下的关键路径延迟比较,成功的下调了34%的延时。
我觉得,这种方法,还是比较有效的,深入器件内部,进行寄存器调整,可以比工具,更有针对性和预见性的进行调整,效率和效果都还可以。
希望发上来和大家分享,大家有什么更好的建议,也请告诉我哦。
由于工程对时序的要求非常高,按常规流程,目前也拿不出特别好的降时序的方法。
因此,我们内部人员,只能自己动手想办法进行细调。
在研究中,我发现了一种有效的在布局阶段降低时序的方法,希望对各位朋友有用。
当然,我走布局布线的时间还很短,难免这个方法,有很多问题,希望各位前辈,不吝赐教。
言归正传:
在大规模芯片整体布局时,我们一般是控制SRAM的放置。
往往关键路径,存在于部件间的连线。而一味调整部件间距离,又会造成局部绕线。反复调整,使迭代进度比较慢。
因此,对于部分部件,我们往往采取区域优化,在从顶层调用的方法。
以上,都是常规方法。下面,我主要说下,在局部部件优化时候的特殊策略。
这里,除了看timing报告,做优化,其实,我们后端,还可以找前端,问清楚流水栈和逻辑分布,通过调整寄存器来优化布局。
以一个运算部件为例:
1,在布局中,其共分为4栈,读取,执行,存储,写回。
其中,读取阶段,由于寄存器阵列,有大量的旁路,造成了其在逻辑级上较多,同时,大量的复杂连接,也容易形成绕线。
这里,我通过对逻辑分析。将名为control的20个寄存器,在中心进行阵列放置,使绕线延迟,变得均衡。
2,同时,由于从SRAM出来的一栈,SRAM和窗口寄存器本身的延迟较大,容易成为关键路径,而其下一站,逻辑级数和部件延时都较低。
因此,我对前400条关键路径的与SRAM相关的寄存器,用脚本进行了沿SRAM的阵列布局。
注:这里,我使用的脚本方法是,用根据起始坐标,用perl程序计算出坐标阵列。直接用placeInstance命令方式,而不是通过每次从SRAM的Pin脚坐标,增加一个偏移量,进行放置。这样做,可以大大加快脚本的运行速度。
还有一点,为什么只对前400条路径,进行操作,原因是,相关寄存器数量较多,我无法保证,拉动之后,SRAM附近的空间依然足够工具优化放置逻辑,所以只对前面的进行操作。经过几次试验,发现,对前400条操作,效果比较好。
3,根据逻辑关联,调整了2个控制软宏的空间位置,进行guide放置。
4,和前端商量,将setup最大的SRAM的片选使能端,设置为双周期路径。干掉了一大批关键路径。
通过以上3种方法的精调。基本将关键路径逼入了,其纯逻辑延迟占94%。跟传统流程下的关键路径延迟比较,成功的下调了34%的延时。
我觉得,这种方法,还是比较有效的,深入器件内部,进行寄存器调整,可以比工具,更有针对性和预见性的进行调整,效率和效果都还可以。
希望发上来和大家分享,大家有什么更好的建议,也请告诉我哦。
多谢分享!
Thank you for sharing
谢谢西西同学的分享,回去我也试试,我目前也正遇到类似的问题!
小编大侠,真是厉害啊,不知道你做后端多久了,感觉经验很深啊。
你这样做要对设计理解的很深入啊,一般单纯做后端的难以达到这个深度啊。
我目前也遇到了关于CPU的时序问题,CSMC0.18的工艺,周期5.01,实现不了,只能做到5.5
你说的固定reg的位置,这个得花大力气研究设计吧。
这个也太微操作了吧, 当然是有实力,
但有时候搞的太细比较累,
floorplan的原则当然是按照数据流来放,可以和前端的人商量下,
对于 timing问题, 可以用path group, 增加margin,增加综合margin的方法来修,
言简意赅,该说的都说到了。
5楼朋友谬赞了。我也才入行没多久,还是新人。
我是怕丢工作。
时序压不下来,主管很火大。
而目前,公司里制定的流程条件下,自动布局,又达不到要求。
margin和grouppath也用了。
专门修绕线的脚本也上了。
关键路径上的器件也全换成LVT了。
这年头,大家都知道,找份工作不容易,我真怕失业。
所以才下了这个笨功夫。
PS:主管看了汇报后,只回了一句,那6%非逻辑延迟,可以压掉不?
各位前辈经验丰富,是否能帮我看看,我还可以用什么招呢?
关键是看看 zero wireload model下有多少margin啊,
后端的能力是有限的,如果 前端留的margin不够,后端不一定能达到timing的,
我看你能用的都用了,再修比较难了,
6% 非逻辑延迟---- 就是flop的延迟是吧, flop换成lvt 也能提高timing,