endcap和welltap_ICC布局规划

写在前面的标注:这里的流程参照guide,以及微信公众号:数字集成电路设计及EDA教程

首先,简单的介绍一下floorplan的重要性,在之前的我学完成,本人之前的学Encounter忽略这个,这里特别的说明一下。

Floorplan为什么这么重要呢?

floorplan设计将影响到芯片的面积、速度、信号完整性和设计周期。一个好的Floorplan,不仅能获得更好的QoR ( Quality of Result ),也将大大减少后续布局布线以及时序收敛所耗费的时间和精力。所以后端设计上流程中的反复主要是发生在这一步。如果这一步做得比较好,则后面一次通过的几率就比较高,反之如果回溯到这一步,则花费的时间开销就会很大。同时,floorplan也是在数字IC的后端设计中人工手动参与最多的相比较place,CTS,route等阶段而言。因此可以说,做好Floorplan设计,芯片设计就成功了一半。

Floorplan的功能?

Floorplan的主要目的是为模块、I/O接口、电源焊盘分配相对的位置,并定义时钟和电源分配。在Floorplan之前我们需要知道每个模块的门级电路尺寸和运行频率,以及模块之间的连接关系,这样才能设计出更好的Floorplan。同时也不能等到网表完全确定后才开始这一步,Floorplan是确定芯片面积、线长、线拥塞情况的决定要素,现代EDA工具在Floorplan阶段就可以估计线延迟。因此,实际项目中,往往是前端逻辑初步定义好之后就要开始尝试Floorplan,这样可以发现一些逻辑设计阶段不能发现的问题。对于面积很大的ASIC芯片物理设计,往往采用层次化设计方案,通过顶层设计规划、子模块划分和实现,以及芯片顶层组装实现。对于顶层划分,往往综合考虑设计层次,连接关系以及面积,将整个设计划分成多个子模块,然后再对每个子模块分别进行物理设计,而顶层就可以将这些模块当成仅有IO口的黑盒子宏模块进行物理设计。

ICC floorplan的主要内容:

确定芯片的尺寸

标准单元的排列形式

IO单元及宏单元的位置

电源地网络的分布

ICC floorplan流程

1. 在设计中添加physical only cells

2. 读入IO约束文件

3. 创建Floorplan

4. 加入Pad filler

5. 宏单元放置

6. 布局障碍的放置

7. 添加N well和衬底接触单元

8. 电源地规划

9. 自动做floorplan的placement,作为floorplan的参考

在设计中添加physical only cells

Physical onlycells是那些在网表中没有,而在实际芯片中需要存在的一些单元,如电源地IO、给IO供电的IO、corner Pad cells、填充单元 以及一些衬底、阱接触单元等。需要在读入IO约束文件之前添加。

在Layout Window的菜单栏中依次选择“ECO”→“Create Cell”。

1)添加IO Corner

IO Corner的作用是连接芯片拐角处两边的IO Pad,连接衬底以及衬底以上的各个层,使得IO Pad内部的电路形成一个电源地的供电环路。同时也使它们的衬底、阱 等各个层连续,不至于出现DRC的违反。

2)添加为Core供电的IO

3)添加为IO供电的IO

create_cell {vss_l vss_r vss_t vss_b} io_lib/pv0i

create_cell {vdd_l vdd_r vdd_t vdd_b} io_lib/pvdi

create_cell {CornerLL CornerLR CornerTR CornerTL} io_lib/pfrelr1

2

3

读入IO约束文件

在LayoutWindow的菜单栏中依次选择“Floorplan”→“Read Pin/Pad Physical Constraints”,在栏中填写前边准备好的tdf文件,然后点击OK。

相应的命令为:read_pin_pad_physical_constraints /xxx/data/main_pad.tdf

创建Floorplan

在Layout Window的菜单栏中依次选择“Floorplan”→“Create Floorplan”。

在ICC中有三种布局规划控制方案,其中:

1)Aspect ratio:

这种是指定芯片高度和宽度比值的方案,可以设置Core的利用率。

2)Width/Height

指定高度和宽度,一般对于含有Macro的设计,多用这种方案。

相应的命令为:

create_floorplan [-options]

创建Floorplan之前,所有的IO、宏单元以及标准单元都是叠放在一起的;Floorplan之后,所有的IO都已经摆放正确,且所有的宏单元都随机排列在芯片上方,所有的标准单元都排列在芯片右方。

加入Pad filler

Pad filler连接两个两邻的IO pad,实现从衬底到各层金属的相连,为IO内部电路形成电源地供电环路,如果IO之间没有间隙则可以不插入这些单元。除此之外,如果IO中间没有插入的话,可能会出现供电问题以及DRC的违反。插入的方法如下:

在LayoutWindow的菜单栏中依次选择“Finishing”→“Insert Pad Filler”,在“Pin/Blockage cells”框中填写Pad Filler的Cell名。“Pin/Blockage overlap cells”在框中填写那些尺寸小的允许交叠的Pad Filler的名字,因为某些情况下不允许交叠的话可能这些Pad没法连成一个环,一般这些PadFiller的宽度小于1 μm。例如某个Pad Filler的名字是PFILL10RN,则后边的数字一般代表了该Filler的宽度,也就是说这个Filler宽10 μm,PFILL01RN代表它的宽度为0.1 μm。在填写时要注意:一定要按照从大到小的顺序进行填写,因为软件会按照从前到后的顺序插入Pad Filler。

相应的命令为:

insert_pad_filler

宏单元放置

对于Floorplan而言,人们更倾向于靠自己的经验去摆放Macro,摆放它们时不仅要考虑面积、互联线长等传统问题,还需要考虑Place阶段,Macro的摆放对于Place的影响。因为Macro从本质上讲就是一个巨型的标准单元,很多Macro也存在于各个模块内,在Floorplan阶段并不能和模块对等的考虑。对于这个问题,人们根据实际生活中的经验,提出一种边缘摆放(edge place)的方法。

边缘摆放的好处主要来源于下面两点:

  1)从目前芯片设计的趋势来看,芯片中除了计算单元外就是随机存储单元RAM、只读存储单元ROM等。这些存储单元占据的芯片面积在有些设计中甚至超过百分之五十。对于存储单元来说,存在数据端口和存储端口,并且周围需要有一些可测性电路。这使得这些单元引线众多且功耗巨大。将它们贴边放置,不仅有利于这些单元的供电,而且防止这些单元过多的引脚对其他单元的布线造成影响。

  2)标准单元在布局时,按照Row所划定的高度一排一排的摆放,这样既有利于算法的设计,又有利于工业制造。并且在给各个器件供电时,可以使用横向的电源线将处于同一高度的器件连接在一起统一供电。若是将标准单元都摆放在芯片区域的中心,而大的Macro摆放在四周,就可以使标准单元方便的只用一条电源线连接在一起,而不会被高度不统一的Macro打断。对电源网格的设计提供了巨大便利。

Macro的摆放原则基本如下,可以参照下面这张图:

1)模块尽量摆放在靠近相应输入输出口(IO pad)的位置。一般来说对于大型的Macro,他们不仅仅需要与芯片内部的其他Macro或者标准单元进行数据交换,还需要与芯片外部的器件进行通信。比如,锁相环单元需要接收外部晶振信号,存储单元需要接收外部地址等。这种数据交换就是靠IO pad进行的,因此摆放在离相应的数据端口附近,有利于减少互联线长度,减少线上延迟,并节约布线资源。

2)大的Macro摆放尽量贴近版图的边缘和角落,这样有利用空间的利用。

3)Macro与Macro之间要留有一定空隙,给予布线资源。特别是在Macro的间隙有端口的时候更是如此,设计者可以通过相邻Marco边界上端口的多少来决定留有多大的间隙比较合适。在使用EDA软件的Floorplan设计时,同样可以给Macro加上晕环(halo)来控制Macro与Macro之间的距离。在ICC中这被成为KeepoutMargin,有hard和soft之分,hard区域不允许任何Cell放置在该区域,soft则在coarse place的时候不允许任何Cell放入其内,但是在optimization以及legalization的时候是允许Cell放入其内的,也就是只允许Buffer加入其中。Keepout Margin与Placement Blockage不同,它并不是独立存在的,而是依附于Macro周围,可随Macro移动的。所以它是专门用来控制Macro和其他单元之间距离的一种功能。

4)合理设置Macro摆放的角度。在考量Macro摆放的角度时,不仅仅考虑空间摆放的因素,还要根据端口的连接关系与互连模块的位置来决定。如前面原理图中存储模块的端口方向朝向中央,因为中间的标准单元需要与存储模块进行数据交换,存在互连关系。在实际设计时,不仅要根据端口与标准单元之间的连接关系,还要考虑Macro与Macro之间的互连关系进行综合判断。

手工对宏单元进行摆放后,需要将他们设置为dont_touch属性,以防止在布局阶段软件对它进行移动。命令为:set_dont_touch_placement [all_macro_cells]。效果如下:

布局障碍的放置

摆放完Macro之后需要在Macro周围放置Hard Placement Blockage,它会阻止任何Cell放置在该区域,甚至包括后边的Tap Cell以及Core Filler Cell。同时它也会阻止离它很近的地方放置太多的Cell,如果放置的Cell太多,就会在Macro出pin的地方产生一些Congestion。如果不放置Hard Placement Blockage,那么软件就会在布局阶段自动在Macro周围放置Cell,因此就会产生一些N Well或者P注入、N注入等层次间距的违反,同时也可能会产生一些Congestion。

添加EndCap

在28 nm以及更小尺寸的工艺中,为了保证栅以及氧化层的一致性,需要在标准单元Row两端放置EndCAP(如下图所示)。它相当于一种Dummy管子,用来保证两边的标准单元左右环境的一致性。避免在光刻时,由于最两端标准单元左右环境的不一致导致其性能有所差异。

一般对于28 nm以及更高端的工艺中才会有这类单元。如果工艺库中含有这类单元,最好加上。

添加N well和衬底接触单元

在超深亚微米工艺中,由于标准单元的N阱和衬底接触占的面积比较大,所以不在每个标准单元中都做相应的接触,而是单独做一个Cell,每隔一定的间距放一些,由此能够节省很多面积。在该单元中包含了N阱接触和衬底接触。不同的工艺库可能名称不一样,一般名字为FILLTIE*。

一般标准单元库中会给出两种摆放方式,一种是Normal(如图4所示),另一种是Flipped(如图5所示)。

库中一般会定义Normal放置方式中两个TapCell之间的最大间距,以20 μm为例,则每个Tap Cell距离它最近的Tap Cell的间距最大应该是20 μm。图5所示的方案满足同样的规则,不过由于每一行Row上面都有Tap Cell(且临近两行Row上面摆放的Tap Cell是反转的),因此同一行的两个F之间的间距最大可以是40 μm。

在ICC的菜单栏中依次选择“Finishing”→“AddTap Cell Array”,得到图6

ICC有三种方式来放置Tap Cell,如上图所示,一种是Normal,也是工具默认的选项,工具会按照设定的间距在每一行Row上面都放置Tap Cell。第二种是every_other_row,这种模式是隔行放置方式,对应于前面的图4。第三种是stagger_every_other_row,这种是每行均放置Tap Cell,不过相邻两行是以stagger的方式放置的,对应于前面的图5。

电源地规划

电源地规划包括以下内容:

创建Core PG Rings;

创建Macro PG Rings,并连接Macro的PG pins;

将IO的电源地连接到CorePG Rings上;

创建PG Strap;

电源地Rail布线;

检查IR-drop。

其中,创建CorePG Rings和PG Strap这两个步骤可以用手工指定的方式来设计,也可以用ICC中的SynthesizePower Network来实现,后者只需要设计者对功耗、电压降、金属层次、宽度等给出相应的约束,软件就会给出一个尽量满足要求的电源地规划方案。前提是设计库中已经指定了TLU+文件,且进行IR-drop分析也需要用到该文件。

电源地规划中过多的电源地会占用太多的布线资源,另外,在电源地下方会尽量限制摆放的标准单元的密度,以防止出现拥塞,因此,电源地是不能太多的,否则整个设计的利用率会大大降低。因此其实这是在IR-drop和Congestion之间的折衷。在不影响Congestion的情况下可以尽量多布电源地线。

1 常见Core PG Rings

这里采用手工创建的方式,在菜单栏中依次选择“Preroute” → “Create Rings”,之后在最上方选择“Rectangular”表示以矩形方式创建,另一选项“Rectilinear”表示以线条方式创建,该选项可以创建非矩形形状的环。对于Core PGRings的创建一般用矩形来创建,所以选择“Rectangular”。

在“Nets”栏中填写为哪些nets创建电源地环,在“Around”一栏中填写为哪些区域/模块创建电源地环,由于这里是为Core创建,所以选择“Core”。此外还可以为Macro以及Region来创建。

在“Side”一栏中选择为哪条边创建环,可以为其指定偏移“Offset”、宽度“Width”、以及层次“Layer”。如果设置了偏移,还需要指定该偏移是相对于Core的绝对偏移还是满足DRC间距的偏移。

使用操作的命令:create_rectangular_rings [-options]

2 创建Macro PG Rings、MacroPG Straps,并连接Macro的PGpins

如果是为Macro创建PG Rings,则有三种选择:

- Specified Macro : 可以为选中的单/多个Macro分别创建

- Specified as a Group: 可以为某些选定的组的外围来创建,组内部则不创建

- ExceptMacros: 可以为那些选定的Macro之外的Macro来进行创建

该操作使用的命令也是: create_rectangular_rings [-options]

或者使用template来创建Macro的PG Ring。

为了降低整个Macro的IR-drop,可以在Macro上边多打一些PG Strap,另外某些Memory的datasheet上面也可能会对它上面的Strap的数目以及宽度做出很多限制。

3 将IO的电源地连接到CorePG Rings上

相应的GUI操作依次为:“Preroute” → “Preroute Instances”,相应的命令为:

preroute_instances [-options]

由于最大线宽的限制,给电源地IO布线不能布的太宽,这时候可以通过多次连接来实现非常好的电源地IO布线方案。如下图所示,分别在lowend、high end以及中心向两边偏移一定的距离来布四条线。

如果说电源地环有多条,那么在不指定extend_for_multiple_connections的时候软件只会连接最外边的电源地环,要想实现与每圈环都接触,那么需要设置在后边的-options中添加extend_for_multiple_connections,并指定一个-extension_gap距离,在该距离内同一个net上的power mesh都会连接到一起。

4 创建PG Strap

由于创建PG Strap除了手工创建外还可以采用另一种更简单的方式来产生,即Synthesize Power Network,所以这里用这种方式进行讲解。

首先移除之前定义的一些层次约束,由于之前已经手动产生了Core PG Rings所以需要跳过Ring的约束。

set_fp_rail_constraints -remove_all_layers

set_fp_rail_constraints -skip_ring -nets "VDD VSS"

之后需要为Power Network进行一些相应的设置,依次选择“Preroute”⟶“Power Network Constraints”⟶“Strap Layers Constraints”,如图3所示,可以设置相应的层次、最大最小Strap的数目、宽度,设置完毕一层之后点击Set,然后设置另一层。设置完毕后点击Close。

设置完约束之后便可以进行电源地网络的综合了。在菜单栏中依次选择“Preroute”⟶“Synthesize Power Network”。如图10所示。

选择“By Power network by nets”,在“Nets”中填写PG Nets名称,之后填写供电电源值、预计的功耗,在“Synthesizeoptions”一栏中选中“Synthesizepower plan”,勾选“Specifiedpad masters”以指定IO Pad的方式来设置从什么地方进行供电,并在后边的框中选择相应的供电IO。

上述选项设置完毕之后,点击“Apply”,便可以观看设计中的IRdrop,如图11所示,如果不满足则需要修改约束并重新生成。

如果IR drop已经满足了自己的要求,可以点击“Commit”,软件便会尽量产生出满足自己定义的规则的PG Strap。注意该操作一旦执行,不可撤销。所以最好在执行该操作前对设计进行保存。或者如果执行了该操作,发现有问题,想要撤销,可以用remove_route_by_type -pg_strap来删除PG Strap。

set_fp_rail_constraints-remove_all_layers

set_fp_rail_constraints -skip_ring -nets "$MW_GROUND_NET$MW_POWER_NET"

set_fp_rail_constraints-add_layer -layer TM1 -direction vertical -max_strap 12 -min_strap 10 -max_width 2 -min_width 1.5 -spacing minimum

set_fp_rail_constraints-add_layer -layer TM2 -direction horizontal -max_strap 20 -min_strap 18 -max_width 2 -min_width 1.5 -spacing minimum

synthesize_fp_rail-nets "$MW_POWER_NET $MW_GROUND_NET" -voltage_supply 0.8 -synthesize_power_plan -power_budget 40 -pad_masters {VDD:PVDD1RN_X.FRAM VDD:PVDD1RN_Y.FRAM VSS:PVSS1RN_X.FRAM }1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

5 电源地Rail布线(给标准单元供电的电源和地线)

该步的GUI操作为:“Preroute”→“Preroute Standard Cells”。相应的命令为preroute_standard_cells[-options],此处需要注意选择fill_empty_rows,因为某些Row上面可能没有放置标准单元,所以需要填充这些空的Row。

使用的命令: preroute_standard_cells-nets {VDD VSS} \

-connect horizontal \

-fill_empty_rows \

-port_filter_mode off \

-cell_master_filter_mode off \

-cell_instance_filter_mode off \

-voltage_area_filter_mode off \

-route_type {P/G Std. Cell Pin Conn}

6 检查IR-drop

做电源网络分析(Power Network Analysis, PNA),查看电源规划的IR Drop。这里只介绍该操作的命令:analyze_fp_rail-nets "VDD VSS" \

-power_budget 10 \

-voltage_supply 1.1 \

-pad_masters { VDD:PVDD1RN.FRAMVSS:PVSS1RN.FRAM }

自动做floorplan的placement,作为floorplan的参考

自动做floorplan的placement,作为floorplan的参考。这一步是对前面做的Floorplan做以评判,看其质量如何,如果Floorplan做的不好,那么后边也许就没有继续做下去的必要了,因为后边的流程可能根本就走不通,因此这一步至关重要,它是对Floorplan的质量做以简单的评估,如果质量很差,那么需要参考之前的Floorplan方案,并做以调整,直到结果在可以接受的范围内,然后才能继续往下做。

为了对手工Floorplan的结果做以评判,需要在拥塞和时序上对它进行检查,所以可以在布局之前,首先让软件快速的做一个粗略的布局,可以输入以下命令来在Floorplan阶段做快速布局:

create_fp_placement -congestion_driven-timing_driven

之后需要报告设计中的拥塞情况,输入命令:report_congestion

这里提到了拥塞(Congestion),它对于后端设计至关重要,我们针对该命令产生的报告做以介绍。

拥塞代表一个GRC(GlobalRouting Cell)边界上需要的布线资源与可用布线资源的比值,当所需布线资源大于可用布线资源时,就会存在拥塞。ICC在报告拥塞时,默认首先进行全局布线,使用全局布线的结果来报告拥塞。可以在ICC的GUI界面中上方工具栏中依次选择“View” →“Map Mode”→“Global RouteCongestion”来显示拥塞图(CongestionMap)。如图12所示。

GRC为正方形,每个边的尺寸通常为标准单元高度的两倍。它会计算出GRC每条边可用于布线的布线通道(track)的数目(Capacity),以及布线需要的布线通道的数目(Demand)。图13中画出了一个GRC,边上的数值即为Demand/Capacity。Demand – Capacity即为溢出(Overflow)的数目,如果存在Overflow,则Congestion Map中就会将GRC的那条边进行高亮,Overflow越大,则颜色越偏向于暖色调(即红色)。

下面给出了report_congestion的报告:

上图中,“Max” overflow是13,意味着至少有一个GRC的边界overflow是13。也就是说这条边要额外走13条线,可是却没有额外的布线资源来供它进行布线。总共的GRC overflow是2.73%,意味着设计中所有GRC的边界大约有2.73%存在着overflow。

  根据经验,一般最大的Overflow如果超过10基本上这个设计就无法布通了,最好不要超过3~5。另外如果总共的overflow超过2%,也可以认为设计在后边很难绕通。这些说明Floorplan不是很好,需要修改Floorplan或者重新进行Floorplan,需要看拥塞出现在什么地方,根据不同情况不同对待。

如果出现很大/很多拥塞,该如何处理?

1. memory 间的channel congestion

  当相邻的两个memory距离很近时,导致memory的数据线和地址线在狭窄的空间内无法找到足够的布线通道,通常会发生congestion。

  解决方法一般为调整memory的位置,为出pin的区域留出足够的空间,避免产生狭窄的通道。

2. 局部高密度标准单元引起的congestion

  大量的绕线通过高密度标准单元区域时,有时候会发生局部的较为严重的congestion。

  为了解决局部congestion,我们通常会借助partial blockage降低局部区域的标准单元密度。

- Partial blockage是placement blockage的一种,是某一区域设定标准单元的利用率。有时候用partial blockage,并不能有效的解决congestion,这时候可以用blockage array来解决此类congestion。

- Blockage array是用“blockage阵列”的方式,控制congestion区域的标准单元的在区域内成条状分布:一方面降低了密度,另一方面预留出了布线通道。

局部高密度Pin cell导致的congestion

  在数字逻辑设计中,如果某些模块用了大量的高密度pin标准单元(如AOI, OAI等),这些标准单元会有很多的互联关系,这样就会导致在有限的空间内,存在大量的绕线,从而发生congestion。

  常用的解决方法是有针对性的降低此种标准单元的密度,如在ICC里,可以对这些标准单元设置keep_out_margin。通过此种方法,可以有效的削弱congestion。

PowerMesh太多引起的Congestion

  数字IC版图设计中如果PowerMesh打的太多,由于下面要放置标准单元,所以在出Pin的地方可能会存在Congestion。

  常用解决办法是,减少power,不要打太多,根据以往经验和IR-drop分析的结果减少一些。另外可以在布局之前设置让软件在Power下面不要放太多单元,设置partial blockage,partial density control。

  如果设计中有很大的拥塞,需要赶快解决。在Floorplan阶段也没有必要把设计中的拥塞全部降到0,因为此时软件只是快速做了一个参考布局方案而已,并非实际的布局,所以某些拥塞并没有完全解决,它们可以在后续的布局阶段解决。由于ICC允许可以不沿着格点布线,所以在布线阶段也会解决一部分拥塞。

  除了前面的拥塞,ICC也可以在Floorplan之后对时序做以简要的报告,看是否存在Setup的违反,如果违反很大的话可能Floorplan也存在一些问题,例如一些需要高速通讯的Macro相隔距离太远。请选中你要保存的内容,粘贴到此文本框

  • 6
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值