首先,祝大家端午安康!
再到今天的话题:“数字后端APR如何撒 sparecell?”。之前整理过《数字后端APR要撒哪些sparecell,撒多少合适》,那么今天来讨论一下如何把这些 sparecell 撒进去。
以 innovus 为例,createSpareModule 创建 spare cell module 后,用placeSpareModule 来撒 spare cell。来看一下它他命令参数。
-moduleName <moduleName> 就是 createSpareModule 创建的 module 名字。
-numModules <interger> 用来指定 spare cell module 例化多少个。所以上面的 createSpareModule 创建时定义各个cell数量可以一个宏单元内部的,然后例化好几次;也可以是相对整个APR区域,定义好全局的数量,只例化一次。
offsetx、offsety、stepX、stepY 用来把 createSpareModule 这个宏单元例化成一个阵列,比如100um一组。搭配另一个参数-util来指定这个宏单元内部的松散程度,取值0.0~1.0之间,数字越大越紧凑(类似这个宏单元区域的密度)。man里的一个例子,在这个例子中,把SPGM这个宏单元摆成一个channel型阵列。
另外还可以用 -area 指定一个区域,只放在这个区域内。
需要说明的是 placeSpareModule 命令也可以执行多次,多次在不同位置、按不同方式来添加 spare cell。在阵列的基础上,也可以再全局平均撒一些零散的。
另一个话题是“在什么阶段撒 sparecell”,place 之前、place 之后、route 之后?其实都可以。
place之前撒:好处是提前占位置,撒完后fix,这样sparecell更均匀。这个阶段 placeSpareModule 是无法立即看到效果,而是 place_design 之后才真正执行。所以,在place之前需要用 placeInstance 搭配 tcl 随机函数来指定随机坐标。
当密度较高时,工具在后续优化时可能会挪动 sparecell,甚至被挤到边缘。这种情况对后续ECO非常不利。可以用 dbSet 给 sparecell 提前加上 fixed 属性,防止挪动。这个问题,也是一个重要的 review 点。
如果是 gate array ECO cell,我们也要注意:要分析GA ECO cell最大的size是多少,ECO FILLER 或者 FILLER 电容的最大size是多少。要保证预留的 ECO FILLER 或者电容的大小,可以摆下最大的 GA Cell。有一些工艺 GA CELL是 double 高度的,在放 ECO FILLER时,就要考虑高度,以及 VDD 和 VSS 的方向,否则就可能出现 ECO FILLER 宽度或者高度不够的情况,导致无法使用某些大 size 的GA cell。GA FILLER 通常在place之前排成阵列,在route完后,找空挡再补插一些。
GA ECO Cell有个缺点,通常需要从Metal1开始重新绕线。当改动不大时,也许可以限制成Metal1 + Via1 + Metal2,改三层金属。而从成本角度来说,可能更希望改只上层金属、顶层金属。那么,我们可以在GA ECO Cell的基础上,再撒少量的 sparecell,来实现只改上层金属。当然还要配合一些其他手段来实现,比如把 sparecell 的线提前从上层穿过、甚至定制 sparecell 的出pin层。
