2. 设计导入与库设置
ICC2 的物理实现流程从“设计导入”开始,这一步决定了后续布局布线能否在正确的工艺、时序和物理环境下运行。ICC2 使用统一的 NDM(New Data Model)库作为数据底座,把逻辑库、物理库、寄生参数、时序约束和电源意图都挂接到同一个设计视图上。理解各输入文件的作用与配置顺序,是避免后续反复返工的关键。
一、NDM 库:ICC2 的统一数据底座
NDM 是 ICC2 的原生库格式,它把传统 Milkyway 时代的 .db、.lef、.tluplus、.gds 等分散数据整合为可被工具直接读取的库单元。一个完整的 NDM 通常包含:标准单元的逻辑功能与时序信息(来自 .db 或 .lib)、物理版图抽象(来自 LEF)、金属层与通孔定义、以及寄生参数模型(TLU+ 转换而来)。
生成 NDM 的常用方式有两种:一是用 lc_shell 的 read_db + read_lef + write_ndm 流程;二是用 icc2_lm_shell 的 create_ndm 命令。典型脚本如下:
# 在 icc2_lm_shell 中创建 NDM
create_ndm -name saed32_ndm \
-tech tech.tf \
-lef {saed32_stdcell.lef saed32_io.lef} \
-lib {saed32_stdcell.db saed32_io.db} \
-tluplus saed32_1p9m.tluplus \
-map_file saed32.map
其中 -tech 指定工艺文件,-lef 提供物理抽象,-lib 提供时序逻辑,-tluplus 与 -map_file 共同完成寄生参数到金属层的映射。若 TLU+ 的层名与 LEF 不一致,必须通过 map 文件显式对应,否则会报“layer not found”类错误。
二、读入 Verilog 网表与 SDC 约束
设计导入的核心命令是 read_verilog 与 read_sdc。Verilog 网表提供设计的逻辑连接关系,SDC 提供时钟、输入输出延迟、时序例外等约束。两者必须在同一 current_design 下读入,且 SDC 中的时钟定义要与网表中的时钟端口名严格一致。
read_verilog ./rtl/top.v
current_design top
link
read_sdc ./constraints/top.sdc
注意 link 必须在读 SDC 之前执行,否则 SDC 中引用的单元和端口无法解析。若网表使用了多个库中的单元,需确保所有相关 NDM 已通过 set_app_options -name lib.setup_lib -value ... 或 set link_library 正确加载。
三、LEF/DEF 与 TLU+ 的配置
LEF 分为 tech LEF 和 cell LEF:tech LEF 定义金属层、通孔、单位等工艺信息;cell LEF 定义每个标准单元的 pin 位置、形状和阻塞区。DEF 则描述设计的物理布局信息,通常在导入已有布局或进行增量流程时使用。ICC2 中通过 read_def 读入 DEF,通过 NDM 中的 LEF 信息自动获取物理抽象。
TLU+ 是寄生参数模型,用于估算互连电阻电容。它必须与工艺角对应,例如 saed32_1p9m_Cmax.tluplus 对应最差电容角,Cmin 对应最好电容角。配置时通过 set_app_options -name rc.tluplus_file -value ... 指定,或直接在 NDM 创建阶段嵌入。
四、多电压域与 UPF 导入
低功耗设计需要导入 UPF(Unified Power Format)来描述电源域、电源开关、隔离单元和电平转换器。ICC2 通过 read_upf 读入 UPF,并用 commit_upf 将其应用到设计中。UPF 中的电源域边界必须与网表中的电源引脚一致,否则会出现“power domain not found”错误。
read_upf ./upf/top.upf
commit_upf
check_mv_design -verbose
check_mv_design 会检查隔离、电平转换、电源开关等低功耗规则是否满足,是导入后必须执行的验证步骤。
五、常见导入错误与排查
导入阶段最常见的错误包括:
- 未解析的引用:
link报 “unresolved reference”,通常是库未加载或单元名拼写不一致。检查link_library与 NDM 中的单元名。 - SDC 时钟未定义:
read_sdc后report_clock为空,说明时钟端口名与网表不匹配,或 SDC 读入顺序有误。 - TLU+ 层映射失败:报 “cannot find layer”,需检查 map 文件中金属层名称与 LEF 是否一致。
- UPF 电源域不匹配:
commit_upf报错,检查 UPF 中 domain 的边界端口是否在网表中存在。
check_design、check_timing、check_mv_design,把问题暴露在流程早期,避免在布局阶段才发现库或约束缺失。导入完成后,建议用 report_lib 确认所有库已正确加载,用 report_clock 确认时钟定义完整,用 check_mv_design 确认低功耗规则满足。只有这些检查全部通过,才能进入布局规划阶段,否则后续的时序收敛和物理验证都会建立在错误的基础上。