巧用LEF实现row aware track规划
对于常规的track,通常基于LEF里的pitch,offset就可以直接创建(PS:当然也有invs自动调整的场景,这个需要用户留意),但是由于std-cell 的PG pin的存在,这个对于M1 (std-cell pin layer)track,是有一点小复杂,如果用户想充分利用M1的track,需要一点小技巧,这篇文章采用了了LEF里的一个特性来实现这个目的。闲言少叙,ICer GO!
大部分的std-cell LIB的pin (PG signal)基本都是出在最低层,譬如:M1,由于IR的考虑和tap-less的设计策略,M1的PG pin通常不会使用min width。所以用户会经常碰到M1的PG pin的相邻track无法利用的问题,从而导致一些track的浪费。
M1 track 的场景
譬如某55nm工艺,tech_lef 对M1的描述如下:
可以看到,min width是0.09
PS: 这里为了方便,pitch (0.2) > width(0.09) + spacing (0.09)
std-cell的细节如下:
item | value |
---|---|
Std-cell row | 1.2 |
PG pin width | 0.1 |
Track pitch | 0.2 |
所以,这里在PG pin的相邻的track和PG pin的间距只有0.05,这个track显然是无法被利用的。
另外,由于PG pin width(0.1)正好是pitch(0.2)的一半,tech_lef里边也声明了offset是0.1,所以这样的每一个stdcell的M1 的PG pin 都会处于M1的两个track的正中心。(见下图)
PS:这里也是std-cell 设计成track的整数倍的一个原因,方便用户在row和track之间做关联
这样,对于上述情况,在每一行row的stdcell上都会重复出现
0.2(pitch) = pg_pin_width(0.1) + pg_pin_相邻track_spacing(0.02)*2
所以,为了可以让PG pin相邻的track可以使用利用上,就需将和PG相邻track 做特殊处理,其他的track 依然按照正常的pitch进行规划即可。
invs 内建命令方式
Invs里边提供了add_track
的命令,可以对于局部track进行调整和定义,也支持使用比较复杂的-pitch_pattern
和-width_pitch_pattern
模式,同时也可以支持repeat功能,减少用户的脚本量。
譬如:
invs> add_tracks –pitch_pattern {M1 pitch n {pitch m repeat p} pitch n {pitch m repeat p} ...... pitch n {pitch m repeat p}}
基于pattern: pitch_n * 1 + pitch_n*p)的多次重复的M1 track array,直至die edge。这样的写法有以下几个问题:
- 脚本量过大:每一个pattern都需要手动重复
- 导出的DEF也较为复杂(基于输出脚本量)
- 不方便维护
所以,这里推荐采用下列的更为智慧的一种方式
LEF 指引实现row aware 的track构建
仔细观察这个问题,目前要解决的是std-cell PG pin相邻的track的间距,其他的track 依然维持当前的pitch。
功能介绍
在LEF 5.8里边,有一个property可以单独定义row对上下的track pitch要求,其余的pitch依然按照常规的的pitch构建
譬如下例:
PITCH 0.1 FIRSTLASTPITCH 0.14
此时,invs会对基于row的相邻pitch,采用FIRSTLASTPITCH
的定义:0.14,对于其他的pitch,使用PITCH 的定义:0.1,示意如下。
所以,
row = FIRSTLASTPITCH * 2 + n*PITCH
这里的智能之处就是n是invs根据row和PITCH共同演算出来的,不需要用户去做显性定义,更不用去手动重复pattern,这个对于大大提升了track的创建效率,也减少了的DEF的数据量。
就这个例子而言,row是1.08,那么根据上述公式,可以得到n=8,完整算式是:
1.08(row) = 0.14(FIRSTLASTPITCH) * 2 + 8* 0.1 (PITCH )
这种考虑row的pitch规划,可以很好的兼顾row和pitch,从而让所有的M1 track都是属于可用状态。由于这里是对FIRSTLASTPITCH
统一规定,所以PG pin的中线(center line)需要位于两个pitch的正中央。目前看过很多std-cell lib,这个应该是std-cell的一个设计准则。
项目实战
针对文章开始的stdcell和tech_lef描述,目前需要下列的LEF进行描述对上述功能进行是能:
为了让5.8对于古早LEF有很好的兼容性,这里使用的是PROPERTYDEFINITIONS
的方式对此功能进行引入,所以无论你的LEF是之前的任意老版本(VERSION 5.7|5.6 etc.;
),这种写法都可以让invs正确识别。
这个时候track 的结果如下:
PS:这个示例比较凑巧,PG pin的中线正好和track重合,对于此类简单问题,用户也可以使用offset的方式进行调整,对于复杂的情形,建议使用上述LEF的方式。
Track的调整比对
可见,经过调整优化,M1的available track 提升了:14.4%
【敲黑板划重点】
track是绕线的基础资源,巧用LEF的方式,可以有效地利用M1的track,对于资源有限的项目而言,不失为一种,在不改变die size的情形下有效提升资源的有效手段
参考资料
Cadence LEF/DEF 5.8 Language Reference
Cadence Innovus Text Command Reference