ICC布局规划---1

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/pfrelr

读入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)的方法。
边缘摆放的好处主要来源于下面两点:
&#8195 1)从目前芯片设计的趋势来看,芯片中除了计算单元外就是随机存储单元RAM、只读存储单元ROM等。这些存储单元占据的芯片面积在有些设计中甚至超过百分之五十。对于存储单元来说,存在数据端口和存储端口,并且周围需要有一些可测性电路。这使得这些单元引线众多且功耗巨大。将它们贴边放置,不仅有利于这些单元的供电,而且防止这些单元过多的引脚对其他单元的布线造成影响。
&#8195 2)标准单元在布局时,按照Row所划定的高度一排一排的摆放,这样既有利于算法的设计,又有利于工业制造。并且在给各个器件供电时,可以使用横向的电源线将处于同一高度的器件连接在一起统一供电。若是将标准单元都摆放在芯片区域的中心,而大的Macro摆放在四周,就可以使标准单元方便的只用一条电源线连接在一起,而不会被高度不统一的Macro打断。对电源网格的设计提供了巨大便利。

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

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]。效果如下:
@宏单元放置 | center

布局障碍的放置

摆放完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以及更高端的工艺中才会有这类单元。如果工艺库中含有这类单元,最好加上
@EndCAP摆放位置  | center

添加N well和衬底接触单元

在超深亚微米工艺中,由于标准单元的N阱和衬底接触占的面积比较大,所以不在每个标准单元中都做相应的接触,而是单独做一个Cell,每隔一定的间距放一些,由此能够节省很多面积。在该单元中包含了N阱接触和衬底接触。不同的工艺库可能名称不一样,一般名字为FILLTIE*。
一般标准单元库中会给出两种摆放方式,一种是Normal(如图4所示),另一种是Flipped(如图5所示)。
@图4 FillTIE Cell的Normal | center
@图5 FILLTIE Cell的Flipped放置方式 | center
库中一般会定义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
@图6 添加Tap Cell阵列 | center
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”。
@图7 创建Core PG Rings |center
在“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以及中心向两边偏移一定的距离来布四条线。
@图8 用多条线将IO的电源地连接到CorePGRings | center
如果说电源地环有多条,那么在不指定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。
@图9 ICC中的Power Network Constraints |center
设置完约束之后便可以进行电源地网络的综合了。在菜单栏中依次选择“Preroute”⟶“Synthesize Power Network”。如图10所示。
@图10 在ICC中以SynthesizerPowerNetwork的方式创建PG Strap | center
选择“By Power network by nets”,在“Nets”中填写PG Nets名称,之后填写供电电源值、预计的功耗,在“Synthesizeoptions”一栏中选中“Synthesizepower plan”,勾选“Specifiedpad masters”以指定IO Pad的方式来设置从什么地方进行供电,并在后边的框中选择相应的供电IO。
上述选项设置完毕之后,点击“Apply”,便可以观看设计中的IRdrop,如图11所示,如果不满足则需要修改约束并重新生成。
@图11 Synthesize Power Network产生的IR drop图
如果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 }

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所示。
@图12 在ICC布局规划之后报告的拥塞图 |center

GRC为正方形,每个边的尺寸通常为标准单元高度的两倍。它会计算出GRC每条边可用于布线的布线通道(track)的数目(Capacity),以及布线需要的布线通道的数目(Demand)。图13中画出了一个GRC,边上的数值即为Demand/Capacity。Demand – Capacity即为溢出(Overflow)的数目,如果存在Overflow,则Congestion Map中就会将GRC的那条边进行高亮,Overflow越大,则颜色越偏向于暖色调(即红色)。
@13 ICC中Congestion Map图 | center
下面给出了report_congestion的报告:
@ICC中的Congestion 报告 | center
上图中,“Max” overflow是13,意味着至少有一个GRC的边界overflow是13。也就是说这条边要额外走13条线,可是却没有额外的布线资源来供它进行布线。总共的GRC overflow是2.73%,意味着设计中所有GRC的边界大约有2.73%存在着overflow。
&#8195 根据经验,一般最大的Overflow如果超过10基本上这个设计就无法布通了,最好不要超过3~5。另外如果总共的overflow超过2%,也可以认为设计在后边很难绕通。这些说明Floorplan不是很好,需要修改Floorplan或者重新进行Floorplan,需要看拥塞出现在什么地方,根据不同情况不同对待。

如果出现很大/很多拥塞,该如何处理?
1. memory 间的channel congestion
&#8195 当相邻的两个memory距离很近时,导致memory的数据线和地址线在狭窄的空间内无法找到足够的布线通道,通常会发生congestion。
&#8195 解决方法一般为调整memory的位置,为出pin的区域留出足够的空间,避免产生狭窄的通道。
2. 局部高密度标准单元引起的congestion
&#8195 大量的绕线通过高密度标准单元区域时,有时候会发生局部的较为严重的congestion。
&#8195 为了解决局部congestion,我们通常会借助partial blockage降低局部区域的标准单元密度。
- Partial blockage是placement blockage的一种,是某一区域设定标准单元的利用率。有时候用partial blockage,并不能有效的解决congestion,这时候可以用blockage array来解决此类congestion。
- Blockage array是用“blockage阵列”的方式,控制congestion区域的标准单元的在区域内成条状分布:一方面降低了密度,另一方面预留出了布线通道。

  1. 局部高密度Pin cell导致的congestion
    &#8195 在数字逻辑设计中,如果某些模块用了大量的高密度pin标准单元(如AOI, OAI等),这些标准单元会有很多的互联关系,这样就会导致在有限的空间内,存在大量的绕线,从而发生congestion。
    &#8195 常用的解决方法是有针对性的降低此种标准单元的密度,如在ICC里,可以对这些标准单元设置keep_out_margin。通过此种方法,可以有效的削弱congestion。

  2. PowerMesh太多引起的Congestion
    &#8195 数字IC版图设计中如果PowerMesh打的太多,由于下面要放置标准单元,所以在出Pin的地方可能会存在Congestion。
    &#8195 常用解决办法是,减少power,不要打太多,根据以往经验和IR-drop分析的结果减少一些。另外可以在布局之前设置让软件在Power下面不要放太多单元,设置partial blockage,partial density control。
    &#8195 如果设计中有很大的拥塞,需要赶快解决。在Floorplan阶段也没有必要把设计中的拥塞全部降到0,因为此时软件只是快速做了一个参考布局方案而已,并非实际的布局,所以某些拥塞并没有完全解决,它们可以在后续的布局阶段解决。由于ICC允许可以不沿着格点布线,所以在布线阶段也会解决一部分拥塞。
    &#8195 除了前面的拥塞,ICC也可以在Floorplan之后对时序做以简要的报告,看是否存在Setup的违反,如果违反很大的话可能Floorplan也存在一些问题,例如一些需要高速通讯的Macro相隔距离太远。

  • 15
    点赞
  • 146
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值