当前位置:首页 >> 信息与通信 >>

一种利用IC Compiler实现复杂情况下off-track布线的方法


http://www.synopsys.com.cn/inform ation/snug/2009/ic-compiler

一种利用 IC Compiler 实现复杂情况下 off-track 布线的方法
徐君 中国科学院计算技术研究所 微处理器中心

xujun@ict.ac,cn

摘要
随着芯片设计日渐复杂以及设计者对芯片面积最小化、性能最大化的不懈追求, 物理设计面临着越来越大 的挑战, 这时候就需要工具具有良好的扩展性,通过提供给用户足够的接口,使用户能够充分利用这些接 口满足自己特殊的设计要求。

本文将介绍借助 ICC 的可编程能力实现项目对布线的特殊需求的一种方法。在龙芯 3 号二级缓存模块的物 理设计阶段,我们面临着宏单元过多、布线资源严重匮乏的局面,为了将宏单元的连线以最有效的方式引 出,只能让连线走在非 track 通道上。我们借助 ICC 的可编程能力开发脚本完成了连线的非 track 部分,又 利用 ICC 提供的命令将这些连线巧妙地连接到相应的元器件引脚上,最终很好的达成了我们的设计目标。

1. 引言
我们经常面临一些复杂情况下的布线挑战,既要保证面积够小从而缩减成本,又要保证连线够短从而提高 性能。这时候单纯地依靠几个命令或某种流程已无法满足我们的设计需要。我们期望工具可以提供给用户 必要的接口,使我们可以从实际项目出发,扩展出我们需要的功能。Synopsys 的 IC Compiler 恰好满足了 我们的这一需求,它以 TCL 语言作为用户界面,通过提供给用户对象属性以及基本命令,展现出强大的可 扩展性。较之上一代主要基于 Scheme 语言的 Astro 而言,它更加灵活、鲁棒、容易操作和掌握。 本文使用的方法成功地用于龙芯 3 号二级缓存模块物理设计, 具有一定的通用性和启发性。 本文组织如下: 第一部分提出问题,介绍项目概况,阐述我们面临的设计难点;第二部分介绍我们如何开发点工具,实现 off-track 布线;第三部分介绍我们如何利用工具提供给我们的命令,将我们所做的 off-track 连线成功的连 到相应标准单元的引脚上,完成整个布线过程;文章的最后是结论。

2. 龙芯 3 号二级缓存模块概况
该项目采用 65nm 工艺流片,共有 7 层走线金属。power strap 由垂直方向的 M6 和水平方向的 M7 交叉构 成。对于宏单元上空的电源、地,我们采用了特殊处理方式。宏单元本身使用了 M1-M5 共 5 层金属,其 中 M5 是电源、地的引脚,如图 1(a)所示。为保证宏单元供电充足,龙芯 3 号对所有宏单元都是直接将 M6 贴到竖向 M5 引脚上并很紧密地打上通孔。 这样, 宏单元上空就只能在 M6 的电源、 地之间走少量信号线, 而且这些 M6 布线资源绝大部分都不在 track 上。图 1(b)显示了宏单元的电源、地与标准单元部分的不同。

内部电源、 地引脚, 层金属。 由图可见, 横向、 竖向都有。 为保证供电充足, 图 1(a): ram 内部电源、地引脚,为 M5 层金属。 由图可见,横向、 竖向都有。为保证供电充足, M6 strap 的中心线完全与竖向的 M5 引脚中心线重合, 引脚中心线重合, 的走线空间就非常有限了。 这样留给 M6 的走线空间就非常有限了。

上空电源、地与标准单元部分采用不同的处理方式。 图 1(b): ram 上空电源、地与标准单元部分采用不同的处理方式。
龙芯 3 号二级缓存容量是 1MB,由 32 个容量为 4096*72 的宏单元构成其数据部分,每个宏单元有 8 位用 于 ECC 检查,因此 4096*(72-8)*32/8=1MB。该模块的 floorplan 如图 2 所示。因为是 4 路组相联,所以在 图 2 中我们将数据部分分为 4 组,每组由 8 个宏单元面对面构成。通道宽度是 89.4um。每个数据宏单元 包含 72 个 D 端口,72 个 Q 端口,12 个 A 端口以及 13 个时钟、测试以及读写使能控制端口,也就是说, 每个宏单元都将有 169 条线进出, 个宏单元将有 169*8=1352 条线通过这个宽为 89.4um 的通道。 65nm 8 在 工艺下,竖向的 M2、M4 最小宽度和最小间距都是 0.1um,因此 1um 宽度最多可以通过 10 条连线 (1/0.2*2=10,乘 2 是因为可以走两层金属)。如此看来,89.4um 最多可以走 890 条连线,指望所有这 1352 条线都穿过这个通道是不切实际的。

的目录项, 块为标志项, 图 2: 二级缓存模块 floorplan。最上面和最下面是 cache 的目录项,中间 8 块为标志项,其余 。 32 块为数据项,分为 4 组。 块为数据项, 每组之间的通道宽度为 89.4um。 。我们计划 data 的 Q 端输出由 ram 上空穿过, 端以及其他端口输入和目录项的全部连线均由通道进出。 上空穿过,D 端以及其他端口输入和目录项的全部连线均由通道进出。
于是我们设想将宏单元的 Q 端连线从宏单元上空引出,就利用上面提到的少量 M6 布线资源。这样,通道 内只需穿过(72+12+13)*8=776 条连线,这是可以实现的,而且利用工具的自动化流程就可以办到。

唯一的难点在于宏单元上空的走线。图 3 是一个示意。我们要在 M6 strap 的间隙内走出自己的 Q 端输出 和从上面的宏单元传来的 feedthrough,而这些可以走 M6 signal 的地方基本都不在 track 上,这就需要我 们自己想办法完成这部分工作。

宏单元上空走线示意图。 进行操作时, 图 3: 宏单元上空走线示意图。在对一个 macro 进行操作时,两侧设置 route guide 以限制走 线区域

3. 在宏单元上空做 off_track 连线
3.1 插入 buffer 引导连线
为确保连线能够按照我们设想的方向延伸,我们在通道内和宏单元上、下分别插入 buffer 用来引导连线。 逻辑上,我们在 RTL 中将这些 buffer 写定,并对这些 buffer 和连线做特殊命名,然后在综合过程中设置上 dont_touch 属性。 物理上, 在做 floorplan 阶段用 set_cell_location 命令将他们摆在合适的位置并设上 fixed 属性, 此时注意一定要放置在 row 上。 这既可以通过计算出精确的坐标实现, 也可以全部摆完后稍微 move 一下让 ICC 自动调整。插入结果如图 4 所示。

用于引导连线。图中白色为飞线,表示连接关系。 图 4: 在 ram 块之间添加 buffer 用于引导连线。图中白色为飞线,表示连接关系。其中延伸到 逻辑的, 阶段, 逻辑还没有被布局。 右下角的飞线是指向 bist 逻辑的,因为在 floorplan 阶段,bist 逻辑还没有被布局。

3.2 宏单元上空连线
在宏单元上空走过的线包括从上面传下来的 feedthrough 和自己的 Q 端输出。对 feedthrough,只要在能 走 M6 的位置创建一条贯穿宏单元的线即可。对于自己的 Q 端输出,则要完成三部分工作:1)在竖向 PG net 间隙找到能走 M6 的坐标;2)根据 Q 端引脚和 M7 PG net 位置,确定能走 M7 信号线的坐标;3)将 M6 和 M7 通过 via6 通孔连接起来。 我们用 Perl 开发了一个点工具, 用来输出 ICC 用来创建连线和通孔的命令 create_net_shape 和 create_via。 该点工具的输入和输出如图 5 所示。

走线。 图 5: 在 ram 上空创建 m6 走线。输出为可直接为 ICC 所用的 tcl 脚本和供后面使用的

走线。 图 6: 在 ram 上空创建 m6 走线。输出为可直接为 ICC 所用的 tcl 脚本和供后面使用的 m6
该点工具的输入可以是具有某种固定格式的文件,也可以是命令行参数。利用该工具可以完成 M6 的 feedthrough 和竖直方向 Q 端输出。 绘制 M7 的方法与 M6 非常类似,甚至更简单。因为 M7 的 PG net 是顶层划分下来的,所以我们只需知道 第一条 M7 PG net 的位置即可计算所有其他 M7 PG net 坐标。这样,我们只要在满足 DRC 的前提下在与 Q 端最接近的位置绘制 M7 信号线,算法与 route_m6_over_ram.pl 相同,唯独输入由 Q 端引脚位置替代 了 M6 strap,如图 6 所示。

的连接。图中, 自动生成的, 图 7: Q 端引脚与 M7 的连接。图中,上面部分是 ICC 自动生成的,下面部分是我们开发程序仿 照生成的。 照生成的。

图 8: 连接 Q 端引脚与 M7 signal 的代码片段

本设计中 ram 的 Q 端引脚为 M2 和 M3,因此还要考虑如何将引脚与 M7 相连。我们先是在前面两步工作 结束的基础上, ICC 自动完成这部分工作, 让 然后我们先选取一条 ICC 连接得比较好的引脚, 如图 7 所示, 记录所用的 M3-M7 各层金属长度和各通孔位置,以此为基准,考虑电源、地通孔位置,加以调整,开发程 序去完成所有引脚连接。程序片段如图 8 所示。 因为在绘制 M6 和 M7 过程中,相应信号的横纵坐标也已输出,因此 M6 与 M7 间的通孔位置就很容易确定 了。如果 M6 起始点坐标为(x,y),M7 启始点坐标为(a,b),则通孔坐标为(x,b)。 至此,我们就实现了宏单元上空的 off-track 走线,如图 9 所示。

图 9: ram 上空的 off-track 走线

3.3 将 off_tracktrack 上

宏单元上空的连线通过 M6 引出,如 3.1 介绍,我们在宏单元间隙放置了相应 buffer,我们需要这些连线能 够连到相应 buffer 的引脚上。为了让工具来完成这部分工作,我们需要在它们与 buffer 相连之前,将所有 off-track 连线纠正到 track 上。 在我们前面的工作中,每条点工具绘制好的 M6 连线都有相应坐标输出,而 M6 的 track 位置是可以计算出 来的。 因此根据已有 M6 位置找到离它最近的 M6 track 位置不是难事。 但问题在于: 要确保找到 M6 track 1) 不与电源地连线有 DRC 规则违背;2)要确保找到的 M6 track 没有被前面的 M6 连线占用。 为解决这两个问题,我们采用“单向原则”。一条 M6 金属,与它最近的 track 也许在左也许在右,所谓“单向 原则”就是放弃“最近”条件,只选择一个方向上的,比如都选右边的。如果右边的 track 与 PG via 有 DRC 违背,则继续向右选择下一条。根据分析,如果两条 M6 金属选择了同一条 track,则这两条 M6 信号线一 定相邻。因此,我们只需记录上一条 M6 信号线的 track 坐标即可,如果本条信号线与上一条冲突,则再向 右选下一条 track。调整后的结果如图 10 所示。

红色单元为要连接的 图 10: 将 off-track 走线调整到 track 上, 图中虚线为 M6 track, , 红色单元为要连接的 buffer, , 绿色是一条完整连接的信号线。 绿色是一条完整连接的信号线。

4. 完成布线流程
至此,此模块的所有需要精确完成的布线工作都已结束,接下来就是完成所有与宏单元相关的连线连接工 作。这里布线的顺序很重要,因为它直接影响的到布线资源的使用。我们的原则是重要的、需要尽可能短 的线先布。这里,调整到 track 的 M6 还未与 buffer 相连。而我们知道,buffer 的 pin 脚是 M1 的,如何让 ICC 能够自动连上 buffer 引脚并遵从我们先前利用点工具生成的部分连线,便成了很重要的一个环节。幸 运的是,ICC 提供给我们一个非常有用的命令恰好可以满足我们的设计需求。

set_net_routing_layer_constraints [get_nets …] \ -min_layer_name {M6} -max_layer_name {M6} 该命令限定信号线走哪些层金属。在我们这个设计中,如果我们限定这些信号线走 M6 金属层,则 ICC 使 用我们的 M6 连线的几率就会非常之高。实验的结果也证明了这一点,如图 10 中那条被标志为绿色的信号 线所示。

于是我们的设计流程可作如下安排:

for (i=0; i<4; i++) { turn on Xtalk options; route signal nets of Q[*] output;

route bist logic; route other signal nets of ram; } 利用这种方法,ram 部分的布线 DRC violation 为 0,而且时序最优。

5. 结论
随着设计复杂度逐渐升高和开发人员对性能、 面积以及功耗的不懈追求, 芯片设计逐渐向“精”的方向发展。 很多项目为了达到自己的规范要求,不得不用 ASIC 的设计流程完成“半定制”的设计方法。相比于传统的版 图工具,ICC 提供给用户丰富的接口,使得用户可以按照自己的设想去扩展工具的潜能,有效地节省了开 发时间,提升了开发效率,甚至将很多“不可能”的任务变成了活生生的现实。

本文就是利用 ICC 的这种能力完成了一种非常复杂的布线方案,具有一定的通用性和启发性。在可以预知 的将来,ICC 的这种可扩展能力也许会变成物理设计人员手中一笔宝贵的财富和锋锐的利刃。

6. 参考文献
[1] IC Compiler User Guide


相关文章:
更多相关标签: