情景再现:
读入design后,调整好floorplan box,接下来就是摆放mem,如果此时mem的数量多达几百个,不知道这些mem的相互关系?不知道具体的数据流向,也没有guide或者前期的floorplan经验来指导摆放mem,那该怎么办呢?难道只能通过摆放多版mem的摆放来最终决定那一版是摆放的合理吗?(尝试多版,还不一定能得到比较好的结果)
下面介绍一种快捷实用的方法,只用跑一次就能得到design的数据流向以及符合数据流向的mem大致摆放位置,大大节省后端的run time。
第一步:
正常的读入design的数据;
第二步:
调整floorplan box到顶层切的形状。同时询问顶层,本模块的pin应该是放置die box的那条边;添加boundry cell、tapcell等(floorplan形状和pin的位置对mem的摆放有非常大影响,因此需要提前设置)
第三步:
不需要打power相关net,直接忽略
第四步:
设置place阶段mode,主要围绕setPlaceMode命令下的相关设置。希望和正常run place flow的placeMode设置相同,主要是为了和正常run place stage的时候的correlation做的好一些。
第五步:
开始设置command,如下:
- #命令版本为innovus版本18
- #设置congestion effort
- #设置inst gap(如果需要)
- #设置max_density
-
- #设置完mode后,键入下面命令
- place_design -concurrent_macros
run完上面命令后,会得到mem和std摆放情况,如下图1
注释:最大外框为die box、黄框为core box、红框为pin location、A—K组黑框表示跑完命令后工具根据design的数据流而摆放的mem group、绿色为模拟std摆放。
根据下图1就可以大致知道mem应该摆放的位置,以及哪些std是和mem的关联性比较强。比如A、B、C组mem是和pin关联性比较强的,如果pin的位置发生改变,那么对应的mem也需要摆放在pin的周围。F、G、I应该放置在一起,并且和pin的关联性较弱。同时发现K组mem和G组mem的周围std比较聚集,这就需要考虑在真正摆放mem后,在K和G mem的出pin地方会不会出现congestion的问题。
图1
根据上面图1的guide后摆放的正式mem的位置,如下图2
图2
第六步:
得到mem具体位置信息以及可能需要打的place blockage信息后,将mem和blockage用脚本写出。重新restore init后的db,soure先前保存的mem以及blockage的脚本。接下来开始正常打power和后续place流程。这样就可以只run一次就能大致知道mem的摆放位置啦,后续再根据place后真正的timing和congestion进行微调就可以啦,大大提升效率。