布图规划(floorplan)与布局(place)在芯片设计中占据着重要的地位,它的合理与否直接关系到芯片的时序收敛、布线通畅、电源稳定以及良品率。所以在整个芯片设计中,从布图规划到完成布局一般需要占据整个物理实施1/3的时间。
芯片设计中,在布图规划后需要进行电源设计;对于较小的芯片,它的过程是建立一些简单的电源网线,因此,电源设计常常被认为是布图规划所捎带的一部分工作。随着芯片的尺寸增大,电源设计也更为复杂,它已不仅仅局限于“网格”设计,拟称它为“电源(地)规划”则更能反映出当代设计的实际情况。因此,在物理实施的过程中,从数据输入到时钟树综合之前,内容上可分成三大项内容,即布图规划、电源规划和布局。其中布局又称标准单元放置,它实际上包括对I/O单元的排序放置、大模块(block)放置和标准单元放置的规划。而布图规划与电源规划和布局三项任务通常是连续进行的,但在工程中往往是穿插反复进行。
布图规划开始时,首先要准备好各种基本设计数据和相应的物理库、时序库文件,并输人到布图规划的工具环境中来,为其后的布局和布线做好准备。需要准备的文件如下:
布图规划的主要内容包含了对芯片大小(die size)的规划、芯片设计输入输出(I/O)单元的规划、大量硬核或模块(hard core, block)的规划等。在某些不规则的设计中,需要对布线通道进行一些特殊的设置,这些参数的设定也是布图规划中的组成部分。在一些较为复杂的超大规模集成电路设计中,为了尽量减少时钟信号线的偏差、提高芯片的性能,在布局之前便需要对时钟网络进行规划,此时的时钟网络分布与普通的时钟树不同,它也是布图规划的重要组成部分。可见,布图规划的内容是对芯片内部结构的完整规划与设计。
布图规划的主要内容为:
作为连接芯片内部信号与封装管脚的桥梁,I /O 单元的分配要综合考虑印制板走线、封装形式、供电情况以及内部模块结构,从而保证信号从芯片内部传递到外部时其路径最短,同时要求从I/O单元关键引线到封装点时,避免信号交叉,方便封装基板的制作,减少基板上的走线层数,从而降低封装的成本。当芯片为通用芯片时,需要参考现有的类似芯片的封装形式,从而方便产品的应用,如果芯片是专用于某个设计,则芯片的封装可以以印制板走线为基础,从而确定I /O 单元的位置。
I /O 单元可分大致为信号接口和电源两种类型,信号I /O 单元的关键是选择驱动的大小,而电源I /O单元需要重点考虑的是供电电源的数量计算和摆放。I /O 单元的类型有:数字输入单元、数字输出单元、数字双向输入输出单元、静电保护单元、给I /O 接口单元供电的单元、给芯核供电的单元、数字填充单元、模拟供电单元、模拟输入单元、模拟输出单元、模拟填充单元、专用输入输出单元、角填充单元等。在输入输出单元中,又分为普通输入、带上拉输人、带下拉输入、带施密特整形等多种类型,按照驱动能力(以0.18um为例)可以分别有1mA、2mA、4mA、6mA、8mA、12mA、16mA等。设计者需要根据实际情况选择单元的类型以及驱动能力。在基于标准单元的数字集成电路设计中,I /O 单元都是厂家提供,工程师可以参考设计文档,从而完成I /O 单元的选型.
厂家所提供的库中,往往具有多种宽度的I /O 单元。如SMIC的0. 18um 1P6M工艺中,就有普通宽度、狭窄宽度、宽宽度3种类型。当芯片的输入输出单元较多,而内部逻辑单元较少且一般为I /O 单元限制型设计时,一般选用狭窄的I /O 单元;当芯片的输入输出单元较少,而内部逻辑单元较大时,则一般选用宽的I /O 单元。在同样条件下狭窄型I /O 单元比宽型I /O单元的高度要高。当设计为子模块时,I /O单元的形式为接点(pin)而不是接口(pad)。芯片设计中I /O单元为最常见下图(b)。在ASIC设计中,为了提高利用率,每一边的所有单元可以事先做成一块模块。芯片的pin和pad的物理特征和形状与封装中的pin和pad是不一样的。
芯片中pin指芯片内部各子模块或cell逻辑连接的接点;封装中的pin指芯片封装好后的管脚,即用户能够看到的管脚。IO pad是与芯片外部连接的。
此外,当芯片面积较大、芯片时序较为紧张时,则采用倒置封装(flip chip)设计,即I /O 单元的分布不是四边摆放,而是均匀分布在芯片的内部,让芯片的接触点与基板、载体、电路板相连,在相连的过程中,由于芯片的凸点是朝下连接,因此称为倒装。常见的如电脑中的内存条:
flip chip 优点在于其封装简单、封装与晶片尺寸相当、成本低、便携、芯片倒装焊减少传统引线的寄生电容,有利于提高频率、改善热特性;而其缺点为芯片裸露、还需要进行二次封装、二次布线设计复杂。
在布图规划和布局工具中,对采用倒置封装的面积I /O(area I/O)的摆放通过以下步骤完成:
在数模混合的标准I/O单元库中,电源I /O 单元可以大致分为3类:
给模拟器件供电的I /O 单元在布局上有其特殊的要求,一般情况下,一个模拟器件采用一对供电I / O单元便可以满足要求,如果芯片的I / O单元比较宽松,则最好使用“双绑定”(即将die上两个I /O 单元绑定bonding到一个焊盘上),从而保证器件的稳定工作。
数字I /O 单元也分为两大组,一组是给I /O 单元供电,一组是给核内的标准单元供电,因此在设计I /O 单元供电时,需要计算两组电源的数量以及其分布。
1、给核内单元供电的I /O单元的数量m 根据芯片的功耗、I /O单元的供电电压以及供电电流来估算,公式如下:
式中,是芯片的平均功耗
是供电I /O单元正常正常条件下的供电电压
是供电I /O 单元的最大电流
是调整因子,最小取1〜2,域大可取5〜10,根据芯片的实际情况而定
2、给I /O单元供电的供电单元数量也由多种因素来决定,I /O 单元的功耗、输出I /O 单元的驱动能力、同步开关噪声(SSN,simultaneous switching noise; SSO, simultaneous switching output noise)等都影响了此类I /O 单元的数值,经验做法是给I /O单元供电的单元数量与给输出信号端口的比例为1 : (5〜10)的关系,与给内核供电的I /O 单元的数量是1 : 2 的关系。
在布图规划与布局之前,常规条件下会对芯片的时序进行理想情况下的零线负载模型(zero WLM,wire load model)做延迟分析,从而验证当前使用的、刚综合出来的网表是否有较好的时序(通常在逻辑综合结束时,应当产生用零线负载模型进行延迟分析报告)。如果在理想情况下,时序已经很紧张,建立时间的实际值与要求值之差,即剩余时间(slack)比较大,则应当重新优化网表,或者从RTL代码着手,缩短关键路径的延迟。
以层次化设计为例,下面说明在布图规划阶段的延迟预估的方法。
层次化设计大致可分为三个步骤:芯片顶层设计规划、子模块分割(partition)与实现以及芯片顶层组装实现。层次化设计的时序预估有两部分内容,在芯片规划阶段对整个芯片的延迟预估和时序分析以及子模块约束的产生,子模块约束的产生是在芯片延迟预估和时序收敛的前提下进行的。在时序预算(time budgeting)时,首先需要对整个芯片的时序进行分析,分析方法为:实验多种布图规划后,根据其标准单元布局,采用静态时序分析方法,对整个芯片的延迟做出估算,用时序违例(即负值剩余时间,negative slack)来评估哪种布图规划更为合理。得到时序分析的结果后对时序进行预算。
在层次设计时进行时序预算的方法是:首先确认穿过各个分割区域的时钟,并产生时钟路径上的传播延迟;然后确定各个分割区域的所有边界接点,对每一分割区域的边界接点,根据通路延迟的大小,对应其所属的时钟域,输入接点生成输入延迟(set_input_delay),输出接点生成输出延迟(set_output_delay)等时序约束。
一个输入输出单元可能有多条路经通过,多条路径经过一个单点时会产生时序竞争。在处理这些多时钟端口时,设计工具会选择用户指定的路径来解决竞争问题,并且还会把该路径设为时序预算分配中的考虑对象,可以用时序预算给出的参数选项(option)来完成路径的选择。
另外,以路径延迟(set_max_delay,set_min_delay)的约束通过一个多时钟域端口时,
该约束与输人输出延迟等约束相比,具有优先权。
在层次化设计中,需要对时钟树上的延迟进行预估和分配,在芯片进行逻辑综合时,应根据时钟周期,计算时钟在芯片内的延迟。在展平式设计时,布图规划和布局阶段一般以定义的时钟延迟和时钟不确定性来模拟时钟,在时钟树综合阶段才分析时钟的真实属性。但是在层次化设计中,因为在子模块级才进行时钟树综合,故在顶层布图规划和布局阶段,需要对时钟树上的延迟进行预估和分配。
上图所示的层次化设计,时钟clk1从顶层穿过了子模块1、子模块2、子模块3,最后又回到了顶层。该时钟树上的时钟延迟分配主要从模块之间的时序预估,以及时钟树穿过区域的面积从而确定时钟树上延迟的大小。clk1总的时钟树的延迟理想值为1.2ns,子模块1的面积较小,且逻辑较为宽松,则时钟树上的延迟分配了 0. 2ns,子模块2的面积跟子模块3 的面积相仿,但是clk1在子模块2中所挂接的寄存器较模块3多,时序较为紧张,故而分配给子模块2的时钟树延迟为0. 5ns,分配给子模块3 的时钟树延迟为0.3ns。从顶层到子模块1之间的时钟延迟为0.1ns,从子模块3 到输出的延迟为0. 1ns,故分配的(指令)结果如下:
create_clock -name "clk1" -period 10 -waveform {0 5} [get_ports {xtall}]
set_clock_latency 1.2 [get_clocks {clk1}]
create_clock-name "sub1_clk1" -period 10 -waveform {0 5} [get_ports {module1/A}]
set_clock_latency -source 0.1 [get_clocks {sub1_clk1}]
set_clock_latency 0.2 [get_clocks {sub1_clk1}]
create_clock-name "sub2_clk1" -period 10 -waveform {0 5} [get_ports {module2/B}]
set_clock_latency -source 0.305 [get_clocks {sub1_clk1}]
set_clock_latency 0.5 [get_clocks {sub2_clk1}]
create_clock-name "sub3_clk1" -period 10 -waveform {0 5} [get_ports {module3/A}]
set_clock_latency -source 0.9 [get_clocks {sub1_clk1}]
set_clock_latency 0.3 [get_clocks {sub3_clk1}]
从上面的图中我们看出,时钟树上的延迟分为两种:一种即-source定义的是从时钟的源头到达所定义的时钟树根节点的延迟;另一种则是直接对时钟树上延迟的定义,通过两者来确定一个时钟树的延迟信息。
模块或宏模块的布放是布图规划中比较繁琐但是很重要的工作,进人纳米设计技术之前,大多采用半自动布放。和I /O单元的布放方法类似,模块的布放属于布局,但它又是在布图规划阶段完成的。由于占据空间很大,它们的布局完成后,电源规划才有实际意义。当代SoC设计可以包含数百或更多个模块,如下图所示,这时必须借助EDA工具来实现模块的自动布局。
模块布放位置是建立在布图规划基础上的,模块布局的结果又会对前期布图规划的期望目标产生直接影响,其中,能否保证布线的完成是通过布线通道的分析来进行的。
当读入设计数据和用户定义芯片的面积(即die size)之后,EDA 工具根据LEF(或其他工艺文件)工艺内容中布线间距(pitch)的大小,在整个芯片内部自动生成各金厲层连续、规则的布线轨道。布线轨道(routing track)是指芯片内部专门用于布线的路径,布线通道(routing channel)是每两条或多条布线轨道的空间,它们的上面是不可以摆放标准单元的。在模块(如RAM)四周通常还预留不允许摆放标准单元仅供专门布线的晕道(halo)。这是因为在基于标准单元的设计中,标准单元在布局阶段完成了整个芯片内部的摆放,由于标准单元占据了底层金属的绝大多数布线轨道,当芯片局部出现拥塞时,采用布线晕道的定义会增添更多底层的布线通道。在RAM之间预留了很多不放置标准单元的底层布线通道。当然这种预留底层布线通道的做法,解决了当前局部拥塞的问题,但也会产生其他区域的拥塞问题,因此,在布图规划和布局中,需要多次迭代分析,从而实现最佳效果。
在层次化设计中,对各个预计分割的区域之间也需要进行布线通道的定义。通道宽度估算会考虑模块布局的拓扑约束,这些约束包括子模块到子模块的界限及它们之间的距离、顺序和排列,以及它们的表面比率、网络权重和子模块隔离区。如下图所示 。
在层次化设计中,布线通道按照形状分有典型的T 形通道和L 形通道两种。需要通过对这两种类型的通道进行均衡、排序以及切割等方法,从而保证模块之间的布线通道能够满足芯片的布通性。当两个子模块在芯片内部的空间跨度比较大时,有时还需要定义直通(feedthrough)布线通道,从而满足时序和布线的要求。由于基于行的子模块内的布线一般比子模块间的布线更节约布线空间,因此展平式设计可以减少布线面积。这样,在层次化的方法中也引入了满足基于行的布线方法,称作无通道(charmel-less)分割法如下图(b)所示。下图(a)为基于布线通道的分割,下图图(c)为混合法。图中每个“模块(block)”为层次化设计中从顶层分割而成的子模块,每个子模块可以包含一个或多个逻辑模块(module)。
当每个子模块实现了布局布线并满足时序要求后,可以产生自己的物理单元(LEF)和时序单元( lib或1LM),这时它就成为一个硬核模块,它可以被看成是展平式设计中基于模块的设计(BBD,block-based design)类型。