2. 数字实现流程与数据准备

数字实现(Digital Implementation)是把可综合的 RTL 代码,经过综合、布局、时钟树综合、布线、签核等阶段,最终生成可交付晶圆厂的 GDSII 版图数据。Synopsys 的 Fusion Compiler、IC Compiler II、PrimeTime、StarRC、IC Validator 等工具覆盖了这条链路的主要环节。理解这条链路的阶段划分、每阶段的输入输出,以及工艺库、IP、约束、目录结构如何组织,是后续所有自动化脚本与交付工程的基础。

一、RTL 到 GDSII 的主干流程

从 RTL 到 GDSII 通常划分为若干阶段,每个阶段都有明确的输入、输出和验收判据。以 Fusion Compiler 的典型流程为例:

  • 综合(Synthesis):输入 RTL、工艺库(.db)、时序约束(SDC),输出门级网表与初步时序报告。此阶段把行为描述映射到标准单元,得到面积、时序的初步估计。
  • 布局规划(Floorplan):确定 die/core 尺寸、宏单元(SRAM、IP)摆放、电源网络(PG mesh)、I/O pin 位置。输出 DEF 与 floorplan 数据库。
  • 布局(Placement):标准单元合法化摆放,优化时序与拥塞。输出 placed DEF。
  • 时钟树综合(CTS):构建时钟网络,插入缓冲器平衡 skew,输出带时钟树的网表与 CTS 后的时序。
  • 布线(Routing):全局布线、详细布线、后布线优化,输出 routed DEF 与提取用的寄生参数。
  • 签核(Signoff):用 PrimeTime 做时序签核、StarRC 提取寄生、IC Validator 做 DRC/LVS,最终输出 GDSII。

这些阶段并非严格串行,Fusion Compiler 支持“综合—布局—优化”的迭代收敛,但阶段划分与数据交接关系是理解流程的关键。下图给出主干数据流与各阶段的关键输入输出。

RTL 源码 .v / .sv 工艺库 .db / .lib / .lef IP / 宏单元 SRAM / PLL / PHY 约束文件 SDC / UPF 脚本与配置 .tcl / Makefile 综合 Synthesis 布局规划 Floorplan 布局 Placement 时钟树综合 CTS 布线 Routing 签核 STA / DRC / LVS GDSII 交付数据 时序/拥塞反馈迭代 主干数据流:RTL + 库 + IP + 约束 → 综合 → 布局规划 → 布局 → CTS → 布线 → 签核 → GDSII

二、工艺库与 IP 准备

工艺库是数字实现的“原材料”,通常由晶圆厂或库供应商提供,包含标准单元库、I/O 库、存储器编译器、特殊单元(如 level shifter、isolation cell)等。常见文件类型与用途如下:

文件类型典型后缀用途
逻辑库.db / .lib综合与时序分析,描述单元功能、时序、功耗
物理库.lef布局布线,描述单元尺寸、pin 位置、金属层
寄生参数.tlup / .itfStarRC 提取,描述工艺层与 RC 模型
DRC/LVS 规则.drc / .lvsIC Validator 签核
GDS 参考.gds单元版图,用于最终合并

IP 准备同样关键。硬核 IP(如 SRAM、PLL、DDR PHY)通常提供 .lef、.lib、.gds、Verilog 行为模型和 .db;软核 IP 则以 RTL 形式交付。集成前需确认:IP 的工艺节点与库版本是否匹配、电源域与 UPF 是否一致、是否有 black-box 时序模型、pin 的 LEF 与网表是否一致。一个常见错误是 IP 的 .lib 与 .lef 版本不一致,导致布局后时序与物理信息对不上。

三、设计约束文件组织

约束文件主要分两类:时序约束 SDC 和电源意图 UPF。SDC 描述时钟定义、输入输出延迟、时序例外(false path、multicycle path)、case analysis 等。UPF 描述电源域、电源开关、隔离、电平转换、保持寄存器等。约束的组织方式直接影响可维护性,推荐按功能拆分而非全部塞进一个文件:

constraints/
├── top.sdc              # 顶层入口,source 其余文件
├── clocks.sdc           # create_clock / create_generated_clock
├── io.sdc               # set_input_delay / set_output_delay
├── exceptions.sdc       # false_path / multicycle_path
├── case_analysis.sdc    # set_case_analysis
└── power.upf            # 电源域与低功耗策略

SDC 中时钟定义必须与 CTS 阶段一致,否则时序签核会出现偏差。例如:

create_clock -name clk_core -period 2.0 [get_ports clk_core]
set_clock_uncertainty -setup 0.15 [get_clocks clk_core]
set_input_delay -clock clk_core -max 0.8 [get_ports data_in*]
set_false_path -from [get_ports rst_n]

这里 period 2.0 ns 对应 500 MHz,uncertainty 0.15 ns 是留给 jitter 与 skew 的余量。约束文件应纳入版本管理,并与 RTL、库版本一起打标签,保证可复现。

四、项目目录结构规划

一个可维护的数字实现项目目录,应把输入、脚本、运行目录、输出、报告、签核数据分开。推荐结构如下:

project/
├── rtl/                 # RTL 源码与 filelist
├── lib/                 # 工艺库 .db/.lef/.lib
├── ip/                  # IP 交付件
├── constraints/         # SDC / UPF
├── scripts/             # tcl 脚本、Makefile
│   ├── syn/
│   ├── floorplan/
│   ├── place/
│   ├── cts/
│   ├── route/
│   └── signoff/
├── run/                 # 各阶段运行目录(可清理)
├── output/              # 网表、DEF、GDS
├── reports/             # 时序、面积、功耗报告
└── signoff/             # DRC/LVS/STA 签核结果

这种划分让脚本可以按阶段独立运行,run 目录可随时重建,output 与 reports 作为交付物保留。脚本中应避免硬编码绝对路径,改用变量或环境变量指向 lib、ip、constraints,便于在不同机器或不同项目间迁移。

建议在项目根目录放置一个 config.tcl,集中定义工艺节点、库路径、IP 列表、时钟频率等参数,各阶段脚本 source 该文件,避免参数散落。

五、数据准备检查要点

  • RTL filelist 是否完整,是否包含所有 IP 的行为模型或 black-box 声明。
  • 库文件版本是否与工艺节点、IP 版本匹配,.db 与 .lef 是否同源。
  • SDC 是否覆盖所有时钟、I/O、例外,UPF 是否与 RTL 电源域一致。
  • 目录结构是否支持分阶段运行与结果归档,脚本是否可重复执行。