跳转至

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_yield shim), 否则会报 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

处置

  1. 文件不存在 → 在操作机上重跑 deploy(幂等,只补缺失)。
  2. 文件存在、--ignore_cache 能看到 → 是 Lmod 目录缓存滞后,属正常现象: 重新登录 shell,或日常加 --ignore_cache(约一分钟后自动恢复)。
  3. 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)

处置

  1. $SAED32_PATH 为空 → 见场景 2。
  2. /pdk 未挂载 → 挂载 NFS(mount -a 或联系管理员;不要改动 fstab): 客户端 /pdk 由 192.168.31.249:/data/nfs/pdk 提供。
  3. 挂载正常但目录为空 → 操作机侧数据树缺失 → 重跑 deploy。
  4. 权限报错 → 操作机上核对属主权限(应全树 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 同步,请勿在站点侧修改)