4. 层次化数据与版图数据库管理

在超大规模 SoC 的物理验证中,版图数据库的读入与展开往往是整个 Calibre 流程里最先遇到、也最容易被低估的性能瓶颈。一个 5nm SoC 的顶层 GDS 动辄 80~200 GB,包含数千万个单元实例,若读入策略与层次化处理方式选择不当,仅数据库加载就可能消耗数小时,并占用数百 GB 内存。本节围绕 GDS/OASIS 读入、层次化处理、单元复用与数据库缓存四条主线,说明如何把版图数据库管理从"能跑"调到"跑得快"。

一、GDS 与 OASIS:格式选择决定读入成本

GDSII 是流式二进制格式,记录以 8 字节对齐,单元(CELL)通过 SREF/AREF 引用,坐标以数据库单位(DBU)整数存储。OASIS 则采用变长整数、压缩表与重复结构(repetition),在相同版图下体积通常只有 GDS 的 1/5~1/10,且支持随机访问与增量读取。Calibre 读入时,GDS 需要顺序解析全部记录并重建层次树,而 OASIS 可直接定位到目标单元,跳过无关结构。

实际调优中,若上游工具能输出 OASIS,应优先使用 OASIS 作为 Calibre 输入。示例:某模块 GDS 为 12 GB,转换为 OASIS 后约 1.8 GB,Calibre 读入时间从约 22 分钟降至约 6 分钟(示例数据,实际随版图结构变化)。若必须使用 GDS,可通过 GDSII READ 相关选项控制读入行为,例如只读入指定顶层单元、跳过未引用的孤立单元。

# Calibre 读入 OASIS 的典型写法
LAYOUT PATH "soc_top.oas"
LAYOUT PRIMARY "soc_top"
LAYOUT SYSTEM OASIS
# 只读入顶层及其引用层次,忽略未引用单元
LAYOUT CASE YES
LAYOUT PRESERVE CELL YES

二、层次化处理:展开深度与内存的权衡

Calibre 默认以层次化方式处理版图,即保留单元引用关系,仅在必要时展开。层次化处理的核心参数是展开深度与单元复用判定。若把整个版图扁平化(FLATTEN),内存会随实例数线性膨胀;若完全不展开,某些跨层次的 DRC 检查又无法完成。因此需要按检查类型选择展开策略。

常见做法是:对纯层内检查(如宽度、间距)保持层次化;对需要跨单元边界的检查(如密度、天线)在指定层次展开。Calibre 提供 DFM 与 HIER 相关选项控制展开粒度。示例参数:设置 HIERARCHY DEPTH 8,表示展开到第 8 层,超过则保留引用。这样既保证检查正确性,又避免全扁平化带来的内存爆炸。

判断依据:若日志中出现 "flattening cell xxx" 且该单元实例数超过 10 万,说明展开策略过于激进,应提高展开深度阈值或改用层次化检查。

三、单元复用与数据库缓存机制

Calibre 在运行时会为每个唯一单元建立缓存(cell cache),缓存内容包括几何图形、层映射与中间结果。当同一单元被多次引用时,Calibre 直接复用缓存,避免重复计算。缓存命中率是影响性能的关键指标。若单元被频繁修改或展开,缓存会失效,导致重复计算。

提升缓存命中率的做法包括:保持单元命名稳定,避免在流程中重命名;对标准单元库使用 LAYOUT PRESERVE CELL YES 保留单元边界;对重复阵列(AREF)使用重复结构而非逐个实例。示例:一个 SRAM 阵列含 4096 个实例,若以 AREF 表达,Calibre 只需处理一次单元几何;若展开为 4096 个 SREF,缓存命中率下降,处理时间可能增加 3~5 倍。

GDS/OASIS 读入 → 层次化处理 → 单元缓存复用 数据流 GDSII 输入 顺序解析 / 12 GB OASIS 输入 随机访问 / 1.8 GB Calibre 读入引擎 LAYOUT SYSTEM PRIMARY / CASE 层次树重建 SREF / AREF 展开深度控制 DEPTH 8 单元缓存 cell cache 几何图形 层映射 中间结果 读入与处理策略对性能的影响(示例数据) 策略 读入时间 峰值内存 缓存命中率 GDS 全扁平化 约 95 min 约 320 GB 低 GDS 层次化 DEPTH 8 约 22 min 约 96 GB 中 OASIS + 层次化 + 缓存 约 6 min 约 38 GB 高

四、数据库缓存调优的实操要点

Calibre 提供若干与缓存相关的环境变量与选项。例如 MGC_CACHE_SIZE 控制缓存上限,CALIBRE_CACHE_DIR 指定缓存落盘目录。当内存充足时,应把缓存目录放在本地 SSD 而非网络盘,避免 I/O 成为瓶颈。示例:将缓存目录设为 /local_ssd/calibre_cache,相比 NFS 挂载点,缓存读写延迟可从毫秒级降至微秒级。

另一个关键点是增量读入。若版图只改动了少数单元,可使用 Calibre 的增量模式,仅重新读入被修改的单元,其余从缓存加载。这要求上游流程保留单元级校验信息(如时间戳或哈希)。示例:某次 ECO 只改动 3 个标准单元,增量读入耗时约 40 秒,而全量读入需约 6 分钟。

注意:增量模式依赖缓存一致性。若上游工具重命名了单元或改变了层号映射,必须清除旧缓存,否则会读到过期几何,导致 DRC 漏报。建议在每次全量流程前执行一次缓存清理。

五、参数配置示例与结果判读

下面给出一份可直接参考的 Calibre 版图读入配置片段,涵盖 OASIS 输入、层次化展开与缓存目录设置:

# 版图数据库读入配置示例
LAYOUT PATH "soc_top.oas"
LAYOUT PRIMARY "soc_top"
LAYOUT SYSTEM OASIS
LAYOUT CASE YES
LAYOUT PRESERVE CELL YES

# 层次化展开控制
HIERARCHY DEPTH 8
HIERARCHY PRESERVE YES

# 缓存设置
MGC_CACHE_SIZE 64G
CALIBRE_CACHE_DIR "/local_ssd/calibre_cache"

# 增量读入(需上游提供单元校验)
LAYOUT INCREMENTAL YES

运行后应重点观察日志中的三项指标:读入耗时、峰值内存、缓存命中率。若读入耗时远高于预期,先检查是否误用了全扁平化;若内存接近上限,检查展开深度是否过大;若缓存命中率低于 60%,检查是否存在大量重复实例被展开为独立 SREF。通过这些指标可以快速定位是格式问题、展开策略问题还是缓存配置问题。

综合来看,版图数据库管理的性能调优可以归纳为一条主线:优先用 OASIS 降低读入量,用层次化展开控制内存,用单元缓存复用减少重复计算,再用增量读入缩短迭代周期。四者配合,才能让 Calibre 在超大规模 SoC 上保持可接受的运行时间与资源占用。