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 层,超过则保留引用。这样既保证检查正确性,又避免全扁平化带来的内存爆炸。
三、单元复用与数据库缓存机制
Calibre 在运行时会为每个唯一单元建立缓存(cell cache),缓存内容包括几何图形、层映射与中间结果。当同一单元被多次引用时,Calibre 直接复用缓存,避免重复计算。缓存命中率是影响性能的关键指标。若单元被频繁修改或展开,缓存会失效,导致重复计算。
提升缓存命中率的做法包括:保持单元命名稳定,避免在流程中重命名;对标准单元库使用 LAYOUT PRESERVE CELL YES 保留单元边界;对重复阵列(AREF)使用重复结构而非逐个实例。示例:一个 SRAM 阵列含 4096 个实例,若以 AREF 表达,Calibre 只需处理一次单元几何;若展开为 4096 个 SREF,缓存命中率下降,处理时间可能增加 3~5 倍。
四、数据库缓存调优的实操要点
Calibre 提供若干与缓存相关的环境变量与选项。例如 MGC_CACHE_SIZE 控制缓存上限,CALIBRE_CACHE_DIR 指定缓存落盘目录。当内存充足时,应把缓存目录放在本地 SSD 而非网络盘,避免 I/O 成为瓶颈。示例:将缓存目录设为 /local_ssd/calibre_cache,相比 NFS 挂载点,缓存读写延迟可从毫秒级降至微秒级。
另一个关键点是增量读入。若版图只改动了少数单元,可使用 Calibre 的增量模式,仅重新读入被修改的单元,其余从缓存加载。这要求上游流程保留单元级校验信息(如时间戳或哈希)。示例:某次 ECO 只改动 3 个标准单元,增量读入耗时约 40 秒,而全量读入需约 6 分钟。
五、参数配置示例与结果判读
下面给出一份可直接参考的 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 上保持可接受的运行时间与资源占用。