背景
在晶圆级堆叠设计中,每个独立的芯片都有一个独立的网表,这些独立的网表需要连接成一个总的网表来进行仿真或者做LVS检查。如下图所示:
上图中,chip1与chip2之间通过Micro bumps连接,在chip1中,连接处的节点是某个具体的信号名,在chip2中,对应连接处的节点是某个具体的信号名。由于不同芯片之间的设计可能是独立完成的,2个信号的命名不一定完全一致,需要工具自动把这2个信号名做连接,保证连接后的总的网表是正确的。
如何自动完成2个芯片的网表连接,保证连接的正确性呢?
除了上述3D 形式的堆叠,还有2.5D形式的连接,如下:
可以把上述电路看成3个独立的网表,chip1, chip2, link网表,这3个网表需要在pin的位置做连接,形成一个完整网表。
由于不同芯片之间的设计可能是独立完成的,信号的命名不一定完全一致,需要工具自动把这3个网表做连接,保证连接后的总的网表是正确的。
网表自动连接的方式
一般情况下,网表的pin对外连接有2种连接方式: 通过pin name的名字寻找连接关系和通过pin name的坐标寻找连接关系。
Pin name的名字连接方式是指:2个芯片的pin在连接处的pin name是完全相同的名字,工具依靠pin name的名字来自动把2个芯片做连接,不需要考虑坐标对应关系。
坐标连接方式是指:2个芯片的pin在连接处没有指定pin name,只有内部节点号。在此条件下,工具通过2个芯片的坐标对应关系来实现自动连接。其坐标和节点的对应关系需要通过网表提取的内部数据接口来实现,用户在运行网表提取或者寄生参数提取时需要提供有节点及坐标数据生成的数据接口。例如,晶体管级提取可能需要通过带有坐标接口的数据来自动寻找坐标关系,单元级提取可能需要LEF/DEF的接口来自动寻找坐标关系。
基于pin name的连接
首先定义芯片的自定向下堆叠关系如下:
Top_to_Bottom: Circuit1 Circuit2 Circuit3
Circuit1 TopCell: NoLayerM4substrate_plate
Circuit1 netlist: fullchip/RC.spf
Circuit2 TopCell: NoLayerM4substrate_link
Circuit2 netlist: link/RC.spf
Circuit3 TopCell: NoLayerM4substrate_plate
Circuit3 netlist: fullchip/RC.spf
它定义了3个Chip,从上到下的连接顺序是:Circuit1, Circuit2, Circuit3。
然后分别给出了3个电路的网表和top cell。
在该目录下,有2个子目录分别是:fullchip, link。
fullchip的版图如下:
运行该例子步骤如下:
首先进入fullchip目录,自动调用寄生参数提取全芯片的寄生参数,得到RC.spf。
Link电路的版图如下:
运行该例子步骤如下:
进入link目录,调用寄生参数提取工具得到RC.spf。
上述2个目录提取运行结束后,进入它的上层主目录,运行自动合并命令,该命令自动运行基于线网名的网表合并,把3个电路的网表自动合并,合并结果是内容如下:
.include fullchip/RC.spf
.include link/RC.spf
.subckt merge
+ Circuit1_B6__Circuit2_B6__Circuit3_B6
+ Circuit1_B4__Circuit2_B4__Circuit3_B4
+ Circuit1_B1__Circuit2_B1__Circuit3_B1
+ Circuit1_B7__Circuit2_B7__Circuit3_B7
+ Circuit1_A__Circuit2_A__Circuit3_A
+ Circuit1_B2__Circuit2_B2__Circuit3_B2
+ Circuit1_B8__Circuit2_B8__Circuit3_B8
+ Circuit1_B5__Circuit2_B5__Circuit3_B5
+ Circuit1_B3__Circuit2_B3__Circuit3_B3
+ Circuit1_single
+ Circuit1_sub
+ Circuit1_m4a
+ Circuit1_m4c
+ Circuit1_m4b
+ Circuit1_m4d
+ Circuit2_SINGLE
+ Circuit3_single
+ Circuit3_sub
+ Circuit3_m4a
+ Circuit3_m4c
+ Circuit3_m4b
+ Circuit3_m4d
XCircuit1
+ Circuit1_B6__Circuit2_B6__Circuit3_B6
+ Circuit1_B4__Circuit2_B4__Circuit3_B4
+ Circuit1_B1__Circuit2_B1__Circuit3_B1
+ Circuit1_B7__Circuit2_B7__Circuit3_B7
+ Circuit1_A__Circuit2_A__Circuit3_A
+ Circuit1_B2__Circuit2_B2__Circuit3_B2
+ Circuit1_B8__Circuit2_B8__Circuit3_B8
+ Circuit1_B5__Circuit2_B5__Circuit3_B5
+ Circuit1_B3__Circuit2_B3__Circuit3_B3
+ Circuit1_single
+ Circuit1_sub
+ Circuit1_m4a
+ Circuit1_m4c
+ Circuit1_m4b
+ Circuit1_m4d
+ NoLayerM4substrate_plate
XCircuit2
+ Circuit1_B6__Circuit2_B6__Circuit3_B6
+ Circuit1_B4__Circuit2_B4__Circuit3_B4
+ Circuit1_B1__Circuit2_B1__Circuit3_B1
+ Circuit1_B7__Circuit2_B7__Circuit3_B7
+ Circuit1_A__Circuit2_A__Circuit3_A
+ Circuit1_B2__Circuit2_B2__Circuit3_B2
+ Circuit1_B8__Circuit2_B8__Circuit3_B8
+ Circuit1_B5__Circuit2_B5__Circuit3_B5
+ Circuit1_B3__Circuit2_B3__Circuit3_B3
+ Circuit2_SINGLE
+ NoLayerM4substrate_link
XCircuit3
+ Circuit1_B6__Circuit2_B6__Circuit3_B6
+ Circuit1_B4__Circuit2_B4__Circuit3_B4
+ Circuit1_B1__Circuit2_B1__Circuit3_B1
+ Circuit1_B7__Circuit2_B7__Circuit3_B7
+ Circuit1_A__Circuit2_A__Circuit3_A
+ Circuit1_B2__Circuit2_B2__Circuit3_B2
+ Circuit1_B8__Circuit2_B8__Circuit3_B8
+ Circuit1_B5__Circuit2_B5__Circuit3_B5
+ Circuit1_B3__Circuit2_B3__Circuit3_B3
+ Circuit3_single
+ Circuit3_sub
+ Circuit3_m4a
+ Circuit3_m4c
+ Circuit3_m4b
+ Circuit3_m4d
+ NoLayerM4substrate_plate
.ends
可以看到,该合并模式是基于线网名字的合并,针对2个上下相邻的电路,如果pin 的名字一致,则工具自动把相同pin的名字合并连接成一个节点。
基于坐标的自动连接
针对上述用例,还可以通过坐标查找的方式来实现自动连接。其配置文件如下:
Top_to_Bottom: Circuit1 Circuit2 Circuit3
Circuit1 TopCell: NoLayerM4substrate_plate
Circuit1 netlist: fullchip/RC.spf
Circuit1 COORDINATE Path: fullchip
Circuit1 COORDINATE top layer: top_layer
Circuit1 COORDINATE bottom layer: bot_layer
Circuit1 COORDINATE top device: d1_top
Circuit1 COORDINATE bottom device: d1_bot
Circuit2 TopCell: NoLayerM4substrate_link
Circuit2 netlist: link/RC.spf
Circuit2 COORDINATE Path: link
Circuit2 COORDINATE top layer: link_layer
Circuit2 COORDINATE bottom layer: link_layer
Circuit2 COORDINATE top device: link_top
Circuit2 COORDINATE bottom device: link_bot
Circuit3 TopCell: NoLayerM4substrate_plate
Circuit3 netlist: fullchip/RC.spf
Circuit3 COORDINATE Path: fullchip
Circuit3 COORDINATE top layer: top_layer
Circuit3 COORDINATE bottom layer: bot_layer
Circuit3 COORDINATE top device: d1_top
Circuit3 COORDINATE bottom device: d1_bot
该文件中增加了COORDINATE的数据文件指定,其中 COORDINATE top layer的含义是:该chip的最上方与其它芯片连接时用这个layer图形的坐标来判断与其它chip图形的坐标是否有overlap,如果有overlap,就把这2个图形的节点连接成一个节点。
COORDINATE top device的含义是:如果一个很长的线网被切割成很多个子节点,要找距离top_device最近的子节点来连接到另外一个chip的对应节点。
进入它的上层主目录,运行自动合并命令,该命令自动运行基于COORDINATE的坐标计算网表合并,把3个电路的网表自动合并,合并结果内容如下:
.include annex_NoLayerM4substrate_plate.spf
.include annex_NoLayerM4substrate_link.spf
.subckt merge
+ Circuit1_B6__Circuit2_B6__Circuit3_B6
+ Circuit1_B4__Circuit2_B4__Circuit3_B4
+ Circuit1_B1__Circuit2_B1__Circuit3_B1
+ Circuit1_B7__Circuit2_B7__Circuit3_B7
+ Circuit1_A__Circuit2_A__Circuit3_A
+ Circuit1_B2__Circuit2_B2__Circuit3_B2
+ Circuit1_B8__Circuit2_B8__Circuit3_B8
+ Circuit1_B5__Circuit2_B5__Circuit3_B5
+ Circuit1_B3__Circuit2_B3__Circuit3_B3
+ Circuit1_single__Circuit2_single__Circuit3_single
+ Circuit1_sub
+ Circuit1_m4a
+ Circuit1_m4c
+ Circuit1_m4b
+ Circuit1_m4d
+ Circuit2_SINGLE
+ Circuit3_sub
+ Circuit3_m4a
+ Circuit3_m4c
+ Circuit3_m4b
+ Circuit3_m4d
XCircuit1
+ Circuit1_B6__Circuit2_B6__Circuit3_B6
+ Circuit1_B4__Circuit2_B4__Circuit3_B4
+ Circuit1_B1__Circuit2_B1__Circuit3_B1
+ Circuit1_B7__Circuit2_B7__Circuit3_B7
+ Circuit1_A__Circuit2_A__Circuit3_A
+ Circuit1_B2__Circuit2_B2__Circuit3_B2
+ Circuit1_B8__Circuit2_B8__Circuit3_B8
+ Circuit1_B5__Circuit2_B5__Circuit3_B5
+ Circuit1_B3__Circuit2_B3__Circuit3_B3
+ Circuit1_single__Circuit2_single__Circuit3_single
+ Circuit1_sub
+ Circuit1_m4a
+ Circuit1_m4c
+ Circuit1_m4b
+ Circuit1_m4d
+ Circuit1_0:A
+ Circuit1_1:A
+ Circuit1_2:A
+ Circuit1_3:A
+ Circuit1_4:A
+ Circuit1_5:A
+ Circuit1_9:A
+ Circuit1_10:A
+ Circuit1_14:A
+ Circuit1_15:A
+ Circuit1_19:A
+ Circuit1_20:A
+ Circuit1_21:A
+ Circuit1_22:A
+ Circuit1_23:A
+ Circuit1_24:A
+ Circuit1_26:A__Circuit2_1__Circuit3_0:A
+ Circuit1_27:A__Circuit2_2__Circuit3_1:A
+ Circuit1_28:A__Circuit2_3__Circuit3_2:A
+ Circuit1_29:A__Circuit2_4__Circuit3_3:A
+ Circuit1_30:A__Circuit2_5__Circuit3_4:A
+ Circuit1_31:A__Circuit2_6__Circuit3_5:A
+ Circuit1_35:A__Circuit2_10__Circuit3_9:A
+ Circuit1_36:A__Circuit2_11__Circuit3_10:A
+ Circuit1_40:A__Circuit2_15__Circuit3_14:A
+ Circuit1_41:A__Circuit2_16__Circuit3_15:A
+ Circuit1_45:A__Circuit2_20__Circuit3_19:A
+ Circuit1_46:A__Circuit2_21__Circuit3_20:A
+ Circuit1_47:A__Circuit2_22__Circuit3_21:A
+ Circuit1_48:A__Circuit2_23__Circuit3_22:A
+ Circuit1_49:A__Circuit2_24__Circuit3_23:A
+ Circuit1_50:A__Circuit2_25__Circuit3_24:A
+ NoLayerM4substrate_plate
XCircuit2
+ Circuit1_B6__Circuit2_B6__Circuit3_B6
+ Circuit1_B4__Circuit2_B4__Circuit3_B4
+ Circuit1_B1__Circuit2_B1__Circuit3_B1
+ Circuit1_B7__Circuit2_B7__Circuit3_B7
+ Circuit1_A__Circuit2_A__Circuit3_A
+ Circuit1_B2__Circuit2_B2__Circuit3_B2
+ Circuit1_B8__Circuit2_B8__Circuit3_B8
+ Circuit1_B5__Circuit2_B5__Circuit3_B5
+ Circuit1_B3__Circuit2_B3__Circuit3_B3
+ Circuit2_SINGLE
+ Circuit1_26:A__Circuit2_1__Circuit3_0:A
+ Circuit1_27:A__Circuit2_2__Circuit3_1:A
+ Circuit1_28:A__Circuit2_3__Circuit3_2:A
+ Circuit1_29:A__Circuit2_4__Circuit3_3:A
+ Circuit1_30:A__Circuit2_5__Circuit3_4:A
+ Circuit1_31:A__Circuit2_6__Circuit3_5:A
+ Circuit1_35:A__Circuit2_10__Circuit3_9:A
+ Circuit1_36:A__Circuit2_11__Circuit3_10:A
+ Circuit1_40:A__Circuit2_15__Circuit3_14:A
+ Circuit1_41:A__Circuit2_16__Circuit3_15:A
+ Circuit1_45:A__Circuit2_20__Circuit3_19:A
+ Circuit1_46:A__Circuit2_21__Circuit3_20:A
+ Circuit1_47:A__Circuit2_22__Circuit3_21:A
+ Circuit1_48:A__Circuit2_23__Circuit3_22:A
+ Circuit1_49:A__Circuit2_24__Circuit3_23:A
+ Circuit1_50:A__Circuit2_25__Circuit3_24:A
+ Circuit1_single__Circuit2_single__Circuit3_single
+ NoLayerM4substrate_2
XCircuit3
+ Circuit1_B6__Circuit2_B6__Circuit3_B6
+ Circuit1_B4__Circuit2_B4__Circuit3_B4
+ Circuit1_B1__Circuit2_B1__Circuit3_B1
+ Circuit1_B7__Circuit2_B7__Circuit3_B7
+ Circuit1_A__Circuit2_A__Circuit3_A
+ Circuit1_B2__Circuit2_B2__Circuit3_B2
+ Circuit1_B8__Circuit2_B8__Circuit3_B8
+ Circuit1_B5__Circuit2_B5__Circuit3_B5
+ Circuit1_B3__Circuit2_B3__Circuit3_B3
+ Circuit1_single__Circuit2_single__Circuit3_single
+ Circuit3_sub
+ Circuit3_m4a
+ Circuit3_m4c
+ Circuit3_m4b
+ Circuit3_m4d
+ Circuit1_26:A__Circuit2_1__Circuit3_0:A
+ Circuit1_27:A__Circuit2_2__Circuit3_1:A
+ Circuit1_28:A__Circuit2_3__Circuit3_2:A
+ Circuit1_29:A__Circuit2_4__Circuit3_3:A
+ Circuit1_30:A__Circuit2_5__Circuit3_4:A
+ Circuit1_31:A__Circuit2_6__Circuit3_5:A
+ Circuit1_35:A__Circuit2_10__Circuit3_9:A
+ Circuit1_36:A__Circuit2_11__Circuit3_10:A
+ Circuit1_40:A__Circuit2_15__Circuit3_14:A
+ Circuit1_41:A__Circuit2_16__Circuit3_15:A
+ Circuit1_45:A__Circuit2_20__Circuit3_19:A
+ Circuit1_46:A__Circuit2_21__Circuit3_20:A
+ Circuit1_47:A__Circuit2_22__Circuit3_21:A
+ Circuit1_48:A__Circuit2_23__Circuit3_22:A
+ Circuit1_49:A__Circuit2_24__Circuit3_23:A
+ Circuit1_50:A__Circuit2_25__Circuit3_24:A
+ Circuit3_26:A
+ Circuit3_27:A
+ Circuit3_28:A
+ Circuit3_29:A
+ Circuit3_30:A
+ Circuit3_31:A
+ Circuit3_35:A
+ Circuit3_36:A
+ Circuit3_40:A
+ Circuit3_41:A
+ Circuit3_45:A
+ Circuit3_46:A
+ Circuit3_47:A
+ Circuit3_48:A
+ Circuit3_49:A
+ Circuit3_50:A
+ NoLayerM4substrate_plate
.ends
可以看到,它的合并结果与基于线网名的合并结果是不一样的,原因是:fullchip中有10个图形是有线网名的,还有16个图形是没有线网名字的。如下图:
基于线网名的合并方法只能把有线网名的图形做合并,不能把没有线网名的图形做合并。而基于COORDINATE的坐标查找方式可以把不带线网名的图形按照坐标对应关系去做合并,能满足更多的应用场景。
例如,Circuit1_26:A__Circuit2_1__Circuit3_0:A 这个节点,它的含义是: circuit1的26:A号节点与Circuit2的1号节点连接,Circuit2的1号节点与circuit1的0:A号节点连接。这些节点都没有线网名字,是工具内部对节点进行了编号。工具通过COORDINATE的坐标信息可以自动把这些节点连接起来。
其中circuit1的26:A的节点信息如下:
*|NET 1 0.00911097PF
*|I (0:A 0 A B 0 10.012 20.953)
*|I (0:B 0 B B 0 10.012 20.953)
*|I (26:A 26 A B 0 10.012 20.953)
*|I (26:B 26 B B 0 10.012 20.953)
*|S (1:1 17.012 20.953)
*|S (1:2 13.512 20.953)
*|S (1:3 13.512 20.953)
*|S (1:4 10.012 20.953)
R17_102 0:A 1:2 0.01
R17_103 0:A 0:B 0.01
R17_104 0:B 26:A 0.01
R17_105 0:B 26:B 0.001
R17_106 1:1 1:2 0.01
R17_107 1:1 1:4 50
R17_108 1:2 1:3 2.04082e-08
R26 26:A 26:B link_bot r=1e-06
可以看到,线网1号节点被拆分成了8个节点,其中26:A是bot_device对应的子节点,它距离与它下相邻的chip最近,因此选择26:A作为连接节点。
运行结束后,可以打开 log文件,它显示了每个chip的pin连接信息,如下:
+----------+
| Circuit1 |
+----------+
| Circuit2 |
+----------+
| Circuit3 |
+----------+
Circuit1-Circuit2 connect pin
26:A - 1
27:A - 2
28:A - 3
29:A - 4
30:A - 5
31:A - 6
B6 - B6
B4 - B4
B1 - B1
35:A - 10
36:A - 11
B7 - B7
A - A
B2 - B2
40:A - 15
41:A - 16
B8 - B8
B5 - B5
B3 - B3
45:A - 20
46:A - 21
47:A - 22
48:A - 23
49:A - 24
50:A - 25
single - single
Circuit2-Circuit3 connect pin
1 - 0:A
2 - 1:A
3 - 2:A
4 - 3:A
5 - 4:A
6 - 5:A
B6 - B6
B4 - B4
B1 - B1
10 - 9:A
11 - 10:A
B7 - B7
A - A
B2 - B2
15 - 14:A
16 - 15:A
B8 - B8
B5 - B5
B3 - B3
20 - 19:A
21 - 20:A
22 - 21:A
23 - 22:A
24 - 23:A
25 - 24:A
single - single
2.5D的自动连接
该例子是一个2.5D + 3D连接的例子,图示如下:
上述连接的描述如下:
chipstack: (0,0) chip4 chip1
chipstack: (300,0) chip5 chip2
chipstack: (300,200) chip3
interposer: link1
chip1 TopCell: NoLayerM4substrate_plate
chip1 netlist: fullchip/C.spf
chip2 TopCell: NoLayerM4substrate_2
chip2 netlist: fullchip2/C.spf
chip3 TopCell: NoLayerM4substrate_plate
chip3 netlist: fullchip/C.spf
chip4 TopCell: NoLayerM4substrate_2
chip4 netlist: fullchip2/C.spf
chip5 TopCell: NoLayerM4substrate_plate
chip5 netlist: fullchip/C.spf
link1 TopCell: link
link1 netlist: link/C.spf
上面的描述对应的图示如下:
共有3个 chip stack,每个chip stack的坐标是相对link1的坐标。
Link1的版图如下:
Chip1, chip3, chip5的版图如下:
Chip2, chip4的版图如下:
运行自动连接命令, 它是基于COORDINATE模式的节点合并。运行结果内容如下:
.include annex_NoLayerM4substrate_2.spf
.include annex_NoLayerM4substrate_plate.spf
.include annex_link.spf
.subckt merge
+ chip3_B6__chip5_B6__chip2_B6__chip4_B6__chip1_B6__link1_B6
+ chip3_B4__chip5_B4__chip2_B4__chip4_B4__chip1_B4__link1_B4
+ chip3_B1__chip5_B1__chip2_B1__chip4_B1__chip1_B1__link1_B1
+ chip3_B7__chip5_B7__chip2_B7__chip4_B7__chip1_B7__link1_B7
+ chip3_A__chip5_A__chip2_A__chip4_A__chip1_A__link1_A
+ chip3_B2__chip5_B2__chip2_B2__chip4_B2__chip1_B2__link1_B2
+ chip3_B8__chip5_B8__chip2_B8__chip4_B8__chip1_B8__link1_B8
+ chip3_B5__chip5_B5__chip2_B5__chip4_B5__chip1_B5__link1_B5
+ chip3_B3__chip5_B3__chip2_B3__chip4_B3__chip1_B3__link1_B3
+ chip3_single__chip5_single__chip2_single__chip4_single__chip1_single__link1_single
+ chip1_sub
+ chip1_m4a
+ chip1_m4c
+ chip1_m4b
+ chip1_m4d
+ chip5_sub
+ chip5_m4a
+ chip5_m4c
+ chip5_m4b
+ chip5_m4d
+ chip3_sub
+ chip3_m4a
……
……
同样可以打开log文件查看具体的连接信息,如下:
chip1-link1 connect pin
1 - 1
2 - 2
3 - 3
4 - 4
5 - 5
6 - 6
B6 - B6
B4 - B4
B1 - B1
10 - 10
11 - 11
B7 - B7
A - A
B2 - B2
15 - 15
16 - 16
B8 - B8
B5 - B5
B3 - B3
20 - 20
21 - 21
22 - 22
23 - 23
24 – 24
25 - 25
single - single
可以看到,工具自动把带有数字的节点连接关系通过坐标对应关系找到,自动形成连接,从而保证网表连接的正确性。
--
FROM 111.196.128.*