来做一次装修 之版图实现第二步 -- Floorplan
扫描二维码
随时随地手机看文章
上一讲,我们了解了import步骤,现在开始我们要接触到物理cell的操作了。如果形象一点讲floorplan的话,那我们现在就要开始“装修”了。
Floorplan的主要步骤如下图所示:
这里的布局并不是指自动布局,而是手动布局。工具再强大,也一定是基于我们给的一个初始点的,在这一步骤,我们就要给出这个初始点。
第一步:Create die/core area:首先,你必须定义你的die的大小和形状,工具会根据这个形状和你给定的其他选项,结合前面创建library的技术文件,来初始化整个die和core,这里边有下面一些基本概念要搞清楚。
1: die 和core的定义。Floorplan初始化后,die/core就都有了,这两个名词还是不同的,大家来感觉一下下图:
die是用户创建的边界空间,是所有可以绕线的区域总和。core是工具可以使用来放置std-cell的区域,大家一定要弄清楚这两句话的区别。此外,die这个概念在icc2上稍微有调整,被boundary名称所取代。
在某些工艺的要求下,die的宽度、高度必须是某一个基础数值的整数倍,这是为了在模块集成、PG-grid的时候,可以做到无缝对接。比如:你的基础宽度、高度分别是 ,$w和$h,那么你的die的每一个顶点的x/y坐标,都必须是这个$w/$h的整数倍。小艾也是最近才接触到这种工艺的,这样确实方便,尤其是在做PG、模块拼接等工作的时候,感兴趣的同学可以了解一下
2:site_row/cell_site:如果初始化成功了,你可以在版图上看到site_row的信息。如下图
在这张图上边,你能看到水平线(site_row)和垂直线(cell_site),他们的数值来自于你的技术文件(*.tf),具体如下图:
这里height定义了site_row的高度,这个数值就是你最矮的std-cell的高度(因为有时候你会碰到2X/4X site_row高度的std-cell)。同样,这里的width定义了cell_site的间距,这个数值同时也是你的工艺里边两条相邻poly之间的距离。有时候,在同一种工艺里边,有不同的Tile unit定义,tile越大,cell的性能越好,但是漏电也大。icc/icc2也支持mix-tile的设计,在一个芯片中,对性能要求高的模块是很有用处的。
下图是site_row/cell_sie在die边界的情况,很明显可以看到,所有的site_row/cell_site只存在于core区域内,这就是为什么,工具只能把std-cell放置到core区域内的原因了。
第二步:Place terminal:这里的terminal是指,当前模块的顶层设计所有port的接触点,就是我们在分离器件上所说的“管脚”。下面截图示意了两层水平terminal的摆放:
大家可以看到,所有的terminal都是紧贴着die boundary的,这样才方便外界访问本模块。Terminal说穿了就是一些紧贴边界的金属,这些金属和普通绕线的金属是一样的。如果是模块级别,terminal的放置都是基于顶层push-down的结果的,因为只有顶层才是模块terminal的使用者。通常top-layouter会给出一个脚本文件,block只需要直接执行就可以产生所有port对应的terminal。否则的话,需要使用一些命令来控制工具的自动放入,切记,千万不要用手一个一个摆,很容易出错。
如果是full-chip,所有的terminal都是基于IO PAD的,我们会在另外的top-level篇章里边详细描述
这里引申出一个track的概念。同样使用上图,那些横向的细线就是当前层的track。所有的绕线层都是有track的,所有的实际绕线也都是压着track走的。track 之间的距离,也就是这层绕线的pitch距离。在工艺上,一般把track分为prefer和none-prefer track,对应的也就是由prefer routing和none-prefer routing。这里的示例是prefer routing的。这里是两层的terminal,这两层的track、pitch是一模一样的,截图里其实有两层的track,这里只是被交叠盖住了,没有显示出来而已。
此外,大家还可以看到一个信息,track都是压在die的边界上的,这个和site_row是不同的。由于所有的绕线都是基于track的,也就意味着,在core和die的加缝处,是可以走线的,但是却不能放置std-cell的,这点大家要明白。
在前两步骤里,我们要清楚三个概念;core、site_row、track。他们三个小伙伴是我们floorplan阶段的好帮手,未来也是我们下面步骤的根基,如果你出现了绕线、自动布局等问题,一定记得回过头看来看一下这些基本的配置。
”装修“到这里,我们先小结一下:die就是建筑外围,core是套内面积,site_row/track就是你们家的水路和电路,terminal就是家里的门和窗,是和外界沟通的重要渠道,这些都好了,我们要开始在套内面积进行优化和布局了。
第三步:Create voltage_area:
在上一讲,我们知道了输入的时候有一个UPF文件,这里的voltage-area就是基于UPF文件里边定义的power domain来规划的。通常来讲,本级模块的顶层default-domain,一般都是Always-On(AO)domain,下边的power-domain 都是Switch-off(SW)domain
这就像是我们家里的套间格局,你们家有几个小房间,就有多少的SW power-domain,每一个power-domain对应在物理区域里就是voltage-area,客厅、过道就是default-domain。如果外界要访问小房间一定要经过:大门(terminal)、客厅(AO default domain)然后再到各个小房间(SW domain)。反之亦然,这个流程也就是我们常说的数据流向问题,要认识到这一点,对你的floorplan的规划会有很好的帮助。下图是一个简单的AO, SW domain的规划图,信号通过terminal先进到了AO ,然后再进入SW。
通常情况下,按照数据流向的理论,下图就是一个比较合适的voltage-area的规划。
具体到各种实际情况,根据经验、数据流向进行调整有时候会很好的结果。
在工具的布局中,所有属于同一个power domain的子模块都会被工具放进对应VA所定义的区域,所以VA的布局直接决定了整个floorplan的大方向,做floorplan的时候,需要清楚各个power domain 的相对数据流关系,以方便自己构建合适的VA。
套间也布置好了,下面就该 家具、家电进场了。
第四步:Macro placement :
如果说VA决定了floorplan的大方向,那么Macro placement 是决定了具体std-cell的摆放,由于工具的算法永远都是timing driven的,macro 位置定了,工具会测算相关std-cell逻辑,然后会根据TNS/DRC等因素来放置相关的std-cell。同样VA,terminal的位置,也会影响std-cell的自动放置。
依据上图,这里分三种典型情况来做一说明
A: 属于AO domain的macro:要尽量放到边界上,预留出port access的区域。中大型模块,interface的port都会很多,要流出足够空间来terminal 绕线,其次,不能挡在VA的边界,这样会引起AOSW的交互。
B: 在同一个domain下的macro,要按照功能、层级摆放。同样功能的摆到一起,例如ram放到一块,rom放到一起;还有就是同样logical memory放到一起。一般的逻辑memory的容量都很大,具体实现时,会有很多物理的memory cell,如果他们都是属于同一个逻辑下的,所以要放到一起。
C: 多列macro的摆放:C类型的macro阵列的横向长度很长(见阴影区域),所以这个时候,相邻macro的中间应该预留一些放置buffer的位置,用于buffer tree、cts 的构建,这样的做法对clock skew、timing、logical DRC都有好处。
Macro阵列规划:大家来注意如下两个macro阵列规划的选择:
阵列一:所有的macro都尽量摆成了一个正方形
阵列二:所有的macro都顺着长边分布。
在阵列布局中,第一我们要把macro尽量放到va的边界,这点比较好理解,没有人会把大衣柜放在我是中间吧,这两个例子都满足。
除此之外,剩下留给std-cell布局的区域,应该是尽量趋近于正方形的,这是因为,大部分工艺的横向、纵向绕线资源是对等的,所以正方形应该是一个比较平衡的选择。所以这里的阵列一是一个相对正确的选择。
如果你的工艺在绕线资源上有特殊性,你需要依照具体的要求来规划std-cell的可用区域。
整个floorplan的大体步骤就是这样,由于这个环节很重要,任何细节都胡以蝴蝶效应的方式存在于整个流程中,一定要充分思考。
Floorplan的规划,是要基于工艺、物理的考量;更要兼顾设计需求;同时也要熟悉工具的特点的一个复合性工作。





