SAED32 PDK —— 运行与使用手册(RUNBOOK)¶
- 面向:日常使用该 PDK 的工程师,以及被叫起来处理问题的值班人
- 交付日期:2026-09-29
- 相关文档:变更过程见
SOP.md;项目级状态见项目根docs/HANDOFF.md
1. 服务概览¶
是什么:SAED32(Synopsys 大学计划 32/28nm)教育设计套件,供数字设计全流程 (综合 → 时序 → 仿真 → 物理实现 → 寄生提取 / DRC-LVS)取用工艺库。
部署形态:纯数据服务,无守护进程。
| 组成 | 位置 | 说明 |
|---|---|---|
| 数据树 | 操作机 /data/nfs/pdk/SAED32_EDK → 客户端 /pdk/SAED32_EDK |
19G;客户端 ro 挂载 |
| module 文件 | 操作机 /data/nfs/modulefiles/pdk/saed32/1.0.lua → 客户端 /opt/modulefiles/pdk/saed32/1.0.lua |
只设环境变量,不注入 PATH |
| 提供方 | 操作机 192.168.31.249(NFS 服务端) |
数据唯一写入点 |
| 消费方 | 192.168.31.28 + 六台计算节点(.18/.19/.20/.25/.26/.27) |
经 NFS 只读消费 |
依赖:NFS 导出 /data/nfs/pdk 与 /data/nfs/modulefiles(见 /etc/exports)、
客户端 Lmod。/tools 与 license 不是本 PDK 的依赖,但工具使用它时需要(见项目根 HANDOFF)。
异常时的业务影响:所有依赖 SAED32 库的流程(综合、时序、仿真、P&R)立即失败或报 "库找不到"。数据本身是只读静态资产,正常不会被写坏。
重要性等级:中。不影响集群其他服务;影响的只是使用该工艺库的设计流程。
2. 接入与凭据¶
- 地址:数据在客户端固定为
/pdk/SAED32_EDK;module 树为/opt/modulefiles。 - 无需凭据:只读数据,账号沿用所在节点的登录身份;不存在口令类凭据。
- 加载方式(两步,务必按序):
module load pdk # 家族入口:把 /opt/modulefiles/pdk 加入 MODULEPATH
module load saed32 # 实体:设置 PDK / PDK_ROOT / SAED32_PATH
模块名是
saed32(不是pdk/saed32)——家族入口加载后,模块名即相对该家族树。 与既有pdk/sky130完全一致。
- 加载后可用变量:
echo $PDK # saed32
echo $PDK_ROOT # /pdk
echo $SAED32_PATH # /pdk/SAED32_EDK
- 客户端配置片段(Slurm 作业脚本示例):
#!/bin/bash
#SBATCH --job-name=demo
module load pdk && module load saed32
module load synopsys && module load eda2018/1.0 # 工具与 license(如需要)
3. 日常速查表¶
| 我想…… | 命令 |
|---|---|
| 加载 PDK | module load pdk && module load saed32 |
| 看有哪些 PDK | module load pdk && module avail |
| 确认库路径 | echo $SAED32_PATH; ls $SAED32_PATH |
| 确认关键库文件在 | ls -l $SAED32_PATH/lib/stdcell_rvt/db_ccs/saed32rvt_tt0p85v25c.db |
| 看某个库的全部视图 | ls $SAED32_PATH/lib/stdcell_rvt |
| 确认 /pdk 挂载正常 | mountpoint -q /pdk && echo OK |
| 刷新 module 缓存 | module --ignore_cache avail |
| 卸载 | module unload saed32 |
| 检查数据树是否与源一致(在操作机上) | cd synopsys_pdk_saed32_20260929 && .venv/bin/python main.py --config config/pdk.yaml drift |
4. 日常操作¶
4.1 数据树构成¶
$SAED32_PATH/
├── lib/ 8 个库,每个库结构一致
│ ├── stdcell_rvt/ 主用标准单元库(另见 stdcell_lvt / stdcell_hvt)
│ ├── sram/ sram_lp/ 存储器
│ ├── io_std/ io_sp/ IO
│ └── pll/ 锁相环
├── tech/ 工艺相关
│ ├── icv_drc/ icv_lvs/ ICV 规则(Synopsys 自研 DRC/LVS)
│ ├── hercules_drc/ hercules_lvs/ Hercules 规则
│ ├── star_rcxt/ StarRC 提取(.itf / .tluplus / .nxtgrd)
│ ├── hspice/ SPICE 模型(saed32nm.lib)
│ └── milkyway/ 物理技术文件(.tf、TLU+ map 等)
├── src/oa/ OpenAccess 视图
└── references/ 参考设计(chiptop / orca / flip_chip / wirebond)
每个库目录下的视图(以 lib/stdcell_rvt 为例):
| 子目录 | 内容 | 给谁用 |
|---|---|---|
db_ccs/ |
CCS 时序库 .db + .lib |
DC 综合、PT 时序 |
db_nldm/ |
NLDM 时序库 .db + .lib |
DC / PT(旧流程) |
verilog/ |
saed32nm.v 单元行为模型 |
VCS 仿真 |
milkyway/ |
Milkyway 物理库(CEL/FRAM/lib) | ICC(老)/ ICC2 转换 |
lef/ |
版图抽象 .lef |
ICC2 / 布线工具 |
gds/ |
版图 saed32nm_rvt_oa.gds |
流片 / DRC |
hspice/ |
单元 SPICE 网表 .spf |
HSPICE 仿真 |
lvs/ |
LVS 用 CDL .cdl |
LVS |
doc/ |
库数据手册 PDF | 查阅 |
标准单元库的四个变体(文件名前缀):
saed32rvt(平铺,单电压域)、saed32rvt_dlvl(双电压域)、
saed32rvt_ulvl、saed32rvt_pg(电源门控)。
4.2 DC 综合取库¶
set pdk $::env(SAED32_PATH)
set search_path [list . $pdk/lib/stdcell_rvt/db_ccs]
set target_library "saed32rvt_tt0p85v25c.db"
set link_library "* $target_library"
# 其余:read_verilog / current_design / link / compile
时序角命名规则:saed32rvt_<tt|ff|ss><电压>v<温度>c.db,
例 saed32rvt_tt0p85v25c.db(typical,0.85V,25℃)、saed32rvt_ss0p95v125c.db(worst,0.95V,125℃)。
4.3 PT 时序取库¶
set pdk $::env(SAED32_PATH)
set search_path [list . $pdk/lib/stdcell_rvt/db_ccs]
read_db saed32rvt_tt0p85v25c.db
set link_path "* saed32rvt_tt0p85v25c.db"
4.4 VCS 仿真取库¶
⚠️ Rocky 9 上 VCS 编译需额外加载
vcs-el7(el7 binutils +pthread_yieldshim), 否则会报ld: .symtab local symbol at index N (>= sh_info of M)。 该模块刻意独立(不并入eda2018),只在编译 VCS 时加载,用完module unload vcs-el7。
module load synopsys && module load eda2018/1.0 && module load pdk && module load saed32
module load vcs-el7 # 关键:Rocky 9 编译 VCS 必需
vcs -full64 -sverilog +notimingchecks -Mdir=csrc -o simv \
"$SAED32_PATH/lib/stdcell_rvt/verilog/saed32nm.v" tb.sv
./simv
+notimingchecks:saed32nm.v内含数百处specify时序检查,仿真期用不到, 跳过可显著缩短编译时间。 本组合已实测:编译rc=0、simv生成、运行输出PDK_VERIFY_OK(仿真打印AND2X1_RVT=1 OR2X1_RVT=1 INVX1_RVT=0)。
4.5 ICC2 物理取库¶
set pdk $::env(SAED32_PATH)
# 技术文件(.tf)+ 标准单元 LEF 作为参考库
create_lib -technology "$pdk/tech/milkyway/saed32nm_1p9m_mw.tf" \
-ref_libs [list "$pdk/lib/stdcell_rvt/lef/saed32nm_rvt_1p9m.lef"] work.nlib
Milkyway 库路线:老 ICC(
icc_shell)已于 2026-09-29 装入工具树(第 21 棵树/tools/synopsys/icc/O-2018.06-SP1,module load synopsys && module load eda2018/1.0后即在 PATH),LIB-090(icc_shell_exec缺失)已消除、MW→NDM 转换成功(LIB-094); 但随后的 NDM 分组仍失败(LIB-105,见第 8 章场景 5),该路线暂不可用 —— 物理取库请走上面的 LEF 路线。
4.6 StarRC / HSPICE / ICV 取库¶
# StarRC:技术文件
ls $SAED32_PATH/tech/star_rcxt/saed32nm_1p9m_nominal.{itf,tluplus,nxtgrd}
# HSPICE:模型
ls $SAED32_PATH/tech/hspice/saed32nm.lib
# ICV DRC/LVS:规则
ls $SAED32_PATH/tech/icv_drc/saed32nm_1p9m_drc_rules.rs
ls $SAED32_PATH/tech/icv_lvs/*.rs
5. 配置管理¶
| 配置对象 | 位置 | 修改方式 |
|---|---|---|
| modulefile | /data/nfs/modulefiles/pdk/saed32/1.0.lua |
不要手改:改工程 artifacts/modulefiles/saed32-1.0.lua.tpl 后重新 deploy(自动备份+幂等) |
| 数据树 | /data/nfs/pdk/SAED32_EDK |
只读资产;更新走工程 deploy(rsync 增量) |
| 装载参数 | synopsys_pdk_saed32_20260929/config/pdk.yaml |
改后跑 precheck 验证,再 --dry-run deploy |
| NFS 导出 | /etc/exports(操作机) |
已含 /data/nfs/pdk,本次变更未改;如需调整须按变更流程走 |
生效方式:modulefile 改动即时生效(客户端直接读 NFS),但 Lmod 目录缓存可能滞后
数秒到一分钟;急用时加 --ignore_cache。
6. 备份与恢复¶
- modulefile:每次覆盖前由实现体自动备份到
synopsys_pdk_saed32_20260929/backup/data/nfs/modulefiles/pdk/saed32/1.0.lua.bak.<时间戳>, 并登记backup/README.md。 - 数据树:不复制备份。唯一来源是操作机工程目录
/home/rain/Documents/eda_tools_ins/Synopsys/SAED32_EDK,可随时重新deploy落盘。
恢复 modulefile:
cd synopsys_pdk_saed32_20260929
sudo -n .venv/bin/python main.py --config config/pdk.yaml --rollback
恢复数据树(删除后重建):
# 删除(不可逆,需显式确认)
sudo -n .venv/bin/python main.py --config config/pdk.yaml --rollback --force
# 重建
.venv/bin/python main.py --config config/pdk.yaml deploy # 约 3 分钟(19G)
恢复后验证:
ssh root@192.168.31.18 'bash -lc "module load pdk && module load saed32 && echo $SAED32_PATH"'
7. 监控与告警¶
本 PDK 为静态数据,无需在线监控。建议纳入既有巡检的检查项:
| 检查 | 命令 | 期望 |
|---|---|---|
| 数据树可读 | test -r /pdk/SAED32_EDK/lib/stdcell_rvt/db_ccs/saed32rvt_tt0p85v25c.db |
返回 0 |
| 与源一致(操作机) | main.py --config config/pdk.yaml drift |
退出码 0、报告"无漂移" |
| 空间余量 | df -h /data |
可用 > 100G |
| module 可见 | module load pdk && module avail 2>&1 \| grep saed |
出现 saed32/1.0 |
8. 故障处置¶
场景 1:module load saed32 报 "unknown" 或 avail 里看不到 saed32¶
症状:Lmod has detected the following error: The following module(s) are unknown: "saed32"
诊断
ls -l /opt/modulefiles/pdk/saed32/1.0.lua # 文件在不在(应存在,root:root 0644)
mountpoint -q /opt/modulefiles && echo MOUNT_OK
module load pdk && echo $MODULEPATH # 首段应为 /opt/modulefiles/pdk
module --ignore_cache avail 2>&1 | grep saed
处置
- 文件不存在 → 在操作机上重跑
deploy(幂等,只补缺失)。 - 文件存在、
--ignore_cache能看到 → 是 Lmod 目录缓存滞后,属正常现象: 重新登录 shell,或日常加--ignore_cache(约一分钟后自动恢复)。 MODULEPATH首段不对 → 检查是否漏了module load pdk;顺序不可颠倒。
验证:module load pdk && module load saed32 && echo $SAED32_PATH 输出 /pdk/SAED32_EDK。
场景 2:加载成功但 SAED32_PATH 为空¶
症状:module load saed32 无报错,但 echo $SAED32_PATH 为空。
诊断
module load pdk && module load saed32
echo "MODULEPATH=$MODULEPATH"
echo "SAED32_PATH=$SAED32_PATH"
module list 2>&1 | grep -E "pdk|saed"
若 module list 里只有 pdk(没有 saed32),且加载时出现过
Lmod is automatically replacing "pdk" with "saed32" → 是家族冲突:
modulefile 内错误地声明了与家族入口相同的 family()。
处置:确认 /opt/modulefiles/pdk/saed32/1.0.lua 不含 family( 行:
grep -n "family" /opt/modulefiles/pdk/saed32/1.0.lua || echo "无 family 声明(正确)"
若含,说明该文件被错误修改:在操作机上重跑 deploy(会用模板重新渲染),或从
backup/ 恢复。
验证:同场景 1 的验证命令。
场景 3:工具报找不到库 / 库路径不存在¶
症状:DC/PT 报 Can't read 'xxx.db';VCS 报找不到 saed32nm.v;脚本里 $SAED32_PATH 为空。
诊断
echo "SAED32_PATH=[$SAED32_PATH]"
ls -ld /pdk && mountpoint -q /pdk && echo PDK_MOUNT_OK
ls /pdk/SAED32_EDK/lib/stdcell_rvt/db_ccs/ | head -3
id -u # 应能读(文件 0644 / 目录 0755)
处置
$SAED32_PATH为空 → 见场景 2。/pdk未挂载 → 挂载 NFS(mount -a或联系管理员;不要改动 fstab): 客户端/pdk由192.168.31.249:/data/nfs/pdk提供。- 挂载正常但目录为空 → 操作机侧数据树缺失 → 重跑
deploy。 - 权限报错 → 操作机上核对属主权限(应全树 root:root / 0755 / 0644),
异常则重跑
deploy(会修正)。
验证:test -r $SAED32_PATH/lib/stdcell_rvt/db_ccs/saed32rvt_tt0p85v25c.db && echo READ_OK
场景 4:工具级验证失败(DC/PT/VCS/ICC2 用例不通过)¶
症状:verify 报告某项为 ❌。
诊断
cd synopsys_pdk_saed32_20260929
ls -lt reports/verify-logs/ | head # 各用例末段输出
cat reports/tools-verify-*.md | tail -30
处置(按用例)
| 用例 | 常见原因 | 处置 |
|---|---|---|
| dc_synth | library 名与角位写错 | 核对 artifacts/dc/synth.tcl 中 target_library 与 db_ccs/ 下实际文件名 |
| pt_timing | 未先跑通 DC(网表缺失) | 该用例在无网表时会退化为"仅验证库加载",仍应输出 OK;若报错则查 pt_shell_command.log |
| vcs_sim | ① 节点缺 make/gcc/g++;② 未加载 vcs-el7 |
① 在操作机上重跑 deploy(缺包会被幂等安装);② module load vcs-el7 后重编译(见场景 7) |
| icc2_lib | 用了 Milkyway 参考库 | 见场景 5 |
VCS 编译失败专项(ld: ... .symtab local symbol at index N (>= sh_info of M) 或 pthread_yield 未定义):
- 含义:Rocky 9 的新 binutils 拒绝 VCS 自带的预编译目标文件;且 glibc ≥ 2.34 移除了
pthread_yield。 - 处置:加载独立模块
module load vcs-el7(el7 binutils 2.27 + shim),与 PDK 无关。 - 详见主题
vcs_el7_binutils_20260929/docs/SOP.md与下方场景 7。
验证:重跑 .venv/bin/python main.py --config config/pdk.yaml verify,目标用例显示 ✅。
场景 5:ICC2 取 Milkyway 库 —— LIB-090(已解)与 LIB-105(未解)¶
症状 A(已解决·2026-09-29):create_lib -ref_libs <Milkyway 目录> 报
App option 'lib.configuration.icc_shell_exec' must be specified: there are Milkyway library to convert。
原因:ICC2 转换 Milkyway 参考库需调用老 ICC 的 icc_shell,此前工具树内没有该可执行。
处置 A:老 ICC 已安装并登记进 module(主题 synopsys_icc_install_20260929/):
module load synopsys && module load eda2018/1.0
command -v icc_shell # 预期 /tools/synopsys/icc/O-2018.06-SP1/bin/icc_shell
set_app_options -name lib.configuration.icc_shell_exec \
-value /tools/synopsys/icc/O-2018.06-SP1/bin/icc_shell
症状 B(未解决):设好 icc_shell_exec 后,转换成功
(Information: Successfully converted 1 Milkyway libraries. (LIB-094)),
但紧接着 Error: Failed to group source data … (LIB-105)。
诊断
tail -40 <workdir>/CLIBs/log/<lib>_group_libs.log # 预期可见 "Created 0 lib groups"
根因:Milkyway 库为 physical-only(LIB-081),而 ICC2 自建的分组脚本对纯物理库设
lib.workspace.group_libs_combine_physical_only=false;该选项在 icc2_shell 层不可见
(报 Invalid option name),以 -ref_libs 直接传 CCS .db 亦无效(NDM-020)。
处置 B:取库改走 LEF 路线(4.5 已给出命令,verify 的 icc2_lib 用例通过)。
Milkyway 路线登记为已知限制;复现脚本见
synopsys_icc_install_20260929/artifacts/icc2/mw_lib_check.tcl(探针)。
验证:verify 中 icc2_lib 用例输出 PDK_VERIFY_OK(LEF 路线)。
场景 6:/data 空间不足¶
症状:df -h /data 可用空间告急,或有其他服务写入失败。
诊断
df -h /data
du -sh /data/nfs/pdk/SAED32_EDK
处置:SAED32 数据树固定占用约 19G,属预期。若确需释放,按 SOP 第 7 章删除
(源树仍在工程目录,可随时重建)。不要用通配删除 /data/nfs/pdk/*——该目录下还有
FreePDK15/45、ncsu-cdk 等其他资产。
场景 7:VCS 编译报 .symtab ... sh_info 或 pthread_yield 未定义¶
症状
ld: ...archive_1.a(amcQwB.o): .symtab local symbol at index 36 (>= sh_info of 2)
ld: ... error adding symbols: bad value
make: *** [Makefile:101: ...] Error 1
换用老 ld 之后还可能出现 undefined reference to 'pthread_yield'。
原因:Rocky 9 的 binutils 2.35 新增符号表严格校验,拒绝 VCS 自带的预编译目标文件;
且 glibc ≥ 2.34 移除了 pthread_yield。与 SAED32 / PDK 无关,任何用 VCS 的设计都会遇到。
诊断
which ld; ld --version | head -1 # 未加载 vcs-el7 时指向系统 /usr/bin/ld(2.35)
module avail 2>&1 | grep vcs-el7 # 兼容层模块是否存在
ls /opt/compat/bin/ld # 兼容层文件是否已部署
处置:加载独立模块 vcs-el7 后重新编译
module load synopsys && module load eda2018/1.0
module load vcs-el7 # el7 binutils 2.27 + pthread_yield shim
which ld # 预期 /opt/compat/bin/ld
若报 make: g++: No such file or directory → 节点缺 g++,装 gcc-c++ 即可
(synopsys_mirror_switch_20260929 已把七台补齐为 make/gcc/gcc-c++)。
验证
cd /tmp && printf 'module t; initial $display("OK"); endmodule\n' > x.sv
vcs -full64 -sverilog x.sv -o simv && ./simv # 预期输出 OK
注意:
vcs-el7会把 el7 的ld/ar/as置于 PATH 首位,该会话内所有编译都会用这套老工具链。 编译完 VCS 后建议module unload vcs-el7恢复系统工具链。
9. 安全与权限¶
- 数据树全树
root:root,目录 0755 / 文件 0644:所有用户可读,仅 root 可写。 - 客户端
/pdk为 ro 挂载:客户端无法修改,也无法误删。 - 无凭据、无密钥、无服务账号。
- 唯一写入点:操作机(NFS 服务端)且需 root 或免密 sudo。
Modulefile渲染模板在工程内,属代码资产,随工程纳入版本控制。
10. 容量与性能¶
| 指标 | 当前值 | 说明 |
|---|---|---|
| 数据树大小 | 19G(17742 文件 / 9603 目录) | 固定占用 |
/data 可用 |
约 1.2T(变更后) | 余量充足 |
| 装载耗时 | 约 3 分钟(19G,写速约 117 MB/s) | 仅首次/重建时发生 |
| 幂等探测耗时 | 秒级(rsync size+mtime 比对,不重算校验和) | deploy / drift 每次执行 |
| 深度核对 | 分钟级(-c 全量校验和) |
仅在怀疑数据损坏时人工执行 |
已知瓶颈:NFS 为单点(操作机),但本 PDK 是静态只读数据,客户端有属性/数据缓存, 对日常使用无影响。
扩容触发条件:新增工艺库(如 SAED14/其他 PDK)时按同一工程模式扩展 config/pdk.yaml
的 pdk 段或另建主题工程。
11. 附录¶
术语¶
| 术语 | 含义 |
|---|---|
| EDK | Educational Design Kit,Synopsys 大学计划工艺套件 |
| CCS / NLDM | 两种时序库建模格式(.db 的两种来源) |
| Milkyway | Synopsys 传统物理库格式(ICC 使用;ICC2 用 NDM) |
| LEF | 版图抽象格式(布线/物理实现用) |
| .tf | Milkyway 技术文件(层定义、单位、通孔规则) |
相关文件¶
| 文件 | 说明 |
|---|---|
synopsys_icc_install_20260929/ |
老 ICC 安装 + module 入口 + Milkyway 路线探针(LIB-105 已知限制) |
docs/SOP.md |
本次变更的实施、验证与回滚记录 |
backup/README.md |
备份台账 |
config/pdk.yaml |
站点配置(唯一真源) |
reports/ |
预检查 / 变更清单 / 漂移 / 验证报告 |
docs/HANDOFF.md(项目根) |
项目级状态与待办 |
修订记录¶
| 日期 | 修改人 | 变更内容 |
|---|---|---|
| 2026-09-29 | TraeCode 会话 | 初版:SAED32 装载上线 |
| 2026-09-29 | TraeCode 会话 | 4.5 与场景 5 更新:老 ICC 已装、LIB-090 解决;Milkyway 路线 LIB-105 未解,取库改走 LEF 路线 |
来源:
/home/rain/Documents/eda_tools_ins/Synopsys/synopsys_pdk_saed32_20260929/docs/RUNBOOK.md| 最后更新:2026-09-29 03:49(由build/sync.py同步,请勿在站点侧修改)