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 支持“综合—布局—优化”的迭代收敛,但阶段划分与数据交接关系是理解流程的关键。下图给出主干数据流与各阶段的关键输入输出。
二、工艺库与 IP 准备
工艺库是数字实现的“原材料”,通常由晶圆厂或库供应商提供,包含标准单元库、I/O 库、存储器编译器、特殊单元(如 level shifter、isolation cell)等。常见文件类型与用途如下:
| 文件类型 | 典型后缀 | 用途 |
|---|---|---|
| 逻辑库 | .db / .lib | 综合与时序分析,描述单元功能、时序、功耗 |
| 物理库 | .lef | 布局布线,描述单元尺寸、pin 位置、金属层 |
| 寄生参数 | .tlup / .itf | StarRC 提取,描述工艺层与 RC 模型 |
| DRC/LVS 规则 | .drc / .lvs | IC 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,便于在不同机器或不同项目间迁移。
五、数据准备检查要点
- RTL filelist 是否完整,是否包含所有 IP 的行为模型或 black-box 声明。
- 库文件版本是否与工艺节点、IP 版本匹配,.db 与 .lef 是否同源。
- SDC 是否覆盖所有时钟、I/O、例外,UPF 是否与 RTL 电源域一致。
- 目录结构是否支持分阶段运行与结果归档,脚本是否可重复执行。