3. 层次化设计基础:Cell(单元)的定义、实例化与层次化引用关系

在 ICV DRC 配置中,Cell(单元)是层次化设计的核心构建块。理解 Cell 的定义、实例化以及它们之间的引用关系,是编写高效、可维护 DRC 规则文件的前提。本章将系统性地介绍这些基础概念,并展示它们在 DRC 上下文中的具体应用。

3.1 Cell 的定义与属性

一个 Cell 代表一个独立的、可复用的版图单元。在 DRC 规则文件中,Cell 不仅是一个几何图形的容器,还承载着特定的层次化属性。

属性 说明 DRC 上下文示例
Cell 名称 全局唯一的标识符,用于区分不同的单元。 INV_X1, NAND2_X2, TOP
几何图形 构成 Cell 的物理层图形(如扩散区、多晶硅、金属层)。 Cell 内部的 M1, M2, VIA1 图形
端口(Pin) Cell 与其他 Cell 或顶层进行电气连接的接口。 VDD, VSS, A, Y
边界(Boundary) 定义 Cell 占用的物理区域,通常用于布局规划。 PR_BOUNDARY 层
层次化属性 标记 Cell 的类型或用途,影响 DRC 规则的检查方式。 is_std_cell, is_macro, is_io_pad
关键概念: 在 DRC 中,Cell 的定义通常通过 cell 或 define_cell 语句在规则文件头部声明。一个 Cell 可以包含子 Cell,形成层次化结构。

3.2 Cell 的实例化(Instantiation)

实例化是将一个已定义的 Cell 放置到另一个 Cell 或顶层设计中的过程。每个实例都拥有独立的坐标、方向和变换属性。

  • 主 Cell(Master Cell): 被实例化的原始 Cell 定义。
  • 实例(Instance): 主 Cell 在父 Cell 中的一个具体副本。
  • 变换(Transform): 包括平移(X, Y 坐标)、旋转(0°, 90°, 180°, 270°)和镜像(X 轴或 Y 轴)。
实例化示例(伪代码):
// 定义主 Cell
cell INV_X1 {
  // 内部几何图形和端口定义
}

// 在顶层 Cell 中实例化
cell TOP {
  // 实例化 INV_X1,放置在 (10.0, 20.0) 处,不旋转
  inst u1 = INV_X1 at (10.0, 20.0) orient R0;

  // 实例化 INV_X1,放置在 (50.0, 20.0) 处,旋转 90 度
  inst u2 = INV_X1 at (50.0, 20.0) orient R90;

  // 实例化 INV_X1,放置在 (10.0, 60.0) 处,X 轴镜像
  inst u3 = INV_X1 at (10.0, 60.0) orient MY;
}

3.3 层次化引用关系

层次化引用关系描述了 Cell 之间如何通过实例化相互连接,形成树状或网状结构。理解这些关系对于 DRC 的“层次化检查”至关重要。

3.3.1 父子关系(Parent-Child)

父 Cell 包含子 Cell 的实例。子 Cell 是父 Cell 的组成部分。这种关系是层次化设计的基石。

3.3.2 兄弟关系(Sibling)

同一个父 Cell 下的不同子 Cell 实例之间互为兄弟。DRC 规则经常需要检查兄弟 Cell 之间的间距、交叠等物理约束。

3.3.3 引用路径(Reference Path)

从顶层 Cell 到某个特定实例的完整路径,用于唯一标识该实例。例如:TOP/u1/u2 表示顶层 Cell 下的 u1 实例内部的 u2 实例。

常见陷阱: 循环引用(Circular Reference)是层次化设计中的致命错误。即 Cell A 实例化 Cell B,而 Cell B 又直接或间接地实例化 Cell A。这会导致 DRC 工具在展开层次时陷入无限循环。所有 EDA 工具都严格禁止循环引用。
层次化引用关系示意图 TOP (顶层 Cell) u1 (INV_X1) u2 (NAND2_X1) u3 (INV_X1) u2/u4 (INV_X1) u2/u5 (INV_X1) 图例说明: • 蓝色节点:顶层 Cell(TOP) • 绿色节点:子 Cell 实例(u1, u2, u3) • 紫色节点:孙 Cell 实例(u2/u4, u2/u5) • 箭头方向:从父 Cell 指向子 Cell 实例

3.4 层次化引用在 DRC 中的意义

DRC 工具利用层次化引用关系,可以高效地执行检查,避免重复计算。核心思想是:“一次检查,多次复用”。

  • Cell 内部检查: 对于标准单元库中的 Cell(如 INV_X1),DRC 工具只需对其主 Cell 定义检查一次。所有该 Cell 的实例都自动继承检查结果,无需重复检查。
  • Cell 间检查: 检查不同 Cell 实例之间的相互作用(如间距、交叠)。这需要 DRC 工具理解实例的变换和相对位置。
  • 顶层检查: 检查顶层 Cell 与所有子 Cell 实例之间的全局规则,如电源网络完整性、天线效应等。
层次化检查效率对比:
// 非层次化(扁平化)检查:展开所有实例,检查所有图形
// 缺点:数据量大,检查速度慢,重复工作多

// 层次化检查:
// 1. 对 INV_X1 主 Cell 内部规则检查 1 次
// 2. 对 NAND2_X1 主 Cell 内部规则检查 1 次
// 3. 检查 TOP 层中 u1, u2, u3 之间的交互规则
// 优点:数据量小,检查速度快,避免重复
层次化检查 vs 扁平化检查流程对比 扁平化检查流程 1. 展开所有 Cell 实例 2. 生成单一扁平化版图 3. 对所有图形执行 DRC 检查 结果:数据量大,速度慢 层次化检查流程 1. 识别唯一主 Cell 定义 2. 对每个主 Cell 内部检查 1 次 3. 检查 Cell 实例间交互 结果:数据量小,速度快

3.5 层次化引用关系的管理

在大型 SoC 设计中,层次化引用关系可能非常复杂。良好的管理实践包括:

  • 使用层次化名称空间: 通过引用路径(如 TOP/BLOCK1/INST1)精确指定检查目标。
  • 利用 DRC 命令进行层次化操作: 如 select_cell, exclude_cell, push_down, pull_up 等,控制检查的范围和深度。
  • 避免过深的层次: 过深的层次嵌套会增加 DRC 工具解析引用关系的开销,通常建议层次深度不超过 10-15 层。
  • 使用抽象视图(Abstract View): 对于大型宏单元(如 SRAM、PLL),在 DRC 中使用其抽象视图(仅包含端口和阻挡层),而非完整版图,以大幅减少数据量。
最佳实践: 在编写 DRC 规则文件时,始终从顶层视角出发,明确哪些 Cell 需要被“推平”(flatten)检查,哪些 Cell 可以保持层次化检查。合理利用 cell 和 instance 选择器,可以精确控制检查粒度,平衡运行时间和检查覆盖率。