跳转至

SOP — 阶段 1 标定:vco5 单点 1µs 瞬态(「单点 ≥1h」时长口径)

日期:2026-10-03 | 执行机:hpc-submit(192.168.31.28)| 工作区:/projects/design/rain01/proj1 方案工作区:/home/rain/Documents/eda_tools_ins/design/pll_cal_20261003 记录「用扁平 Spectre 网表对 pll45/vco5 做主 1µs 瞬态标定、外推 60µs 单点成本」的流程、坑与回滚。

1. 背景

阶段 1 首件 pll45/vco5 定稿、用户在 GUI 复看并 Check & Save 之后,进阶段 2(ADE-XL / HPC 派发)前必须先回答一个口径问题: 方案里写的「单点 ≥1h」是否成立——它同时决定 HPC 派发的必要性、test_lock 的 tran 设置与波形输出策略。

标定刻意不依赖 GUI:用扁平 Spectre 网表复刻 vco5 拓扑(11 管),与 ADE-XL 提取的网表器件规模等价,可直接对照。

2. 目标

项 判据 实际结果
参数复核 vco5 实例 W/L 与生成器契约逐项一致 PASS(6.1)
瞬时仿真 spectre completes with 0 errors 且 exit=0 PASS(0 errors / 5 warnings)
振荡确认 窗口内有稳定上升过零,摆幅非零 VERDICT OSCILLATES
实测成本 墙钟 / CPU / 峰值内存 / 波形体积 144.3 s / 141.8 s / 67 MB / 65 MB(6.3)
外推 60µs 单点成本与 200 点 MC 的规模 2.4 h/点、≈480 核时(6.4)

3. 前置条件

  • 本机 root → 192.168.31.28 免密 ssh(已通);
  • .28 上 module load cadence && module load virtuoso/IC06.17.700 可用;PDK_DIR=/pdk/FreePDK45;
  • 工作区已有阶段 0 的模型卡适配副本 proj1/verif/models/spectre_nom.include(绝对路径引用,不依赖 $PDK_DIR,见 smoke_20261003/SOP.md §5.2);
  • 只读 probe 与无头 SKILL 一律 runuser -u rain01(root 运行会让库文件属主错乱,BASELINE §2);
  • .28 没有 GNU /usr/bin/time(见 5.3 坑)。

4. 影响范围

单机(.28)、纯新增,不改任何 cell、不停服、无在跑作业:

  • 新增 proj1/verif/cal_0/(网表、脚本、日志、psfascii 波形);
  • 新增 proj1/verif/gen/probe_params.il(只读探针);
  • /pdk、/tools 全程只读;不触碰用户 GUI 打开的 vco5 编辑窗口。

窗口:随时可跑。1µs 单点占 1 个核 ≈145 s;无备份需求(纯新增,删除即回滚)。

5. 分步操作

步骤 1:同步脚本到 .28

四个文件(只读探针 1 个 + 标定 3 个)先落 /tmp,再用 install -o rain01 落位——直接用 root scp 会把属主写成 root。

cd /home/rain/Documents/eda_tools_ins/design/pll_cal_20261003
scp -q probe_params.il vco5_cal.sp cal_run.sh parse_cal.py root@192.168.31.28:/tmp/
ssh root@192.168.31.28 'install -d -o rain01 -g design /projects/design/rain01/proj1/verif/cal_0; \
  install -o rain01 -g design -m 644 /tmp/probe_params.il /projects/design/rain01/proj1/verif/gen/; \
  install -o rain01 -g design -m 644 /tmp/vco5_cal.sp /tmp/cal_run.sh /tmp/parse_cal.py /projects/design/rain01/proj1/verif/cal_0/'

预期:无输出即成功;ls -l 显示属主 rain01 design。

步骤 2:只读核对 vco5 实例参数

为什么:用户 GUI 截图里的器件参数显示为 w=50n / l=320n 两行,字段归属无法从像素判定,必须用数据库读回确认生成器契约真的落到了 CDF 上。

G=/projects/design/rain01/proj1/verif/gen
ssh root@192.168.31.28 "runuser -u rain01 -- bash $G/run_skill.sh $G/probe_params.il /tmp/r_params.log"
ssh root@192.168.31.28 "grep -E 'INSTS=|INST |NET |TERMS=' /tmp/r_params.log"

坑:virtuoso -nograph -replay 的 log 每行带输入/输出前缀 \i / \o,所以 grep 不能用 ^ 锚定——本轮首次执行时 ^INST 把 11 条实例明细全部漏掉,只剩汇总行(已修)。

预期:MP* master=PMOS_VTG w="320n" l="50n"、MN* master=NMOS_VTG w="200n" l="50n"、MT master=NMOS_VTG w="400n" l="200n",TERMS=("VDD" "GND" "VCTRL" "R0")。

步骤 3:跑 1µs 瞬态

cal_run.sh 内部:source /etc/profile → module load cadence / virtuoso/IC06.17.700 → cd cal_0 → 跑 spectre(psfascii 原始数据 + +log)→ 打印 exit / 关键告警 / 计时。

坑(本轮踩到,exit=127):GNU /usr/bin/time 在 .28 上不存在,脚本用 bash 内建 time + TIMEFORMAT 计时,不再依赖该包。

ssh root@192.168.31.28 'runuser -u rain01 -- bash /projects/design/rain01/proj1/verif/cal_0/cal_run.sh'

预期:SPECTRE_EXIT=0、spectre completes with 0 errors、一行 WALL=... USER=... SYS=...。

坑(本轮踩到,SFE-23):simulator lang=spectre 模式下 Spectre 不接受 HSPICE 风格的 measure tran <n> max v(R0) from=.. to=.. 语句——它被当成器件实例解析,报 The instance 'measure' is referencing an undefined model or subcircuit, 'R0',4 条错误致 read-in 阶段即退出。故频率不由 measure 语句产出,改由步骤 4 从 psfascii 波形离线解析。

步骤 4:解析波形取频率与摆幅

parse_cal.py 扫描 raw 目录里最大的文件,按 psfascii 的 "time" <t> / "<node>" <v> 逐点重建波形,在窗口内取中值电平的上升过零算周期。

ssh root@192.168.31.28 'cd /projects/design/rain01/proj1/verif/cal_0 && python3 parse_cal.py psf R0 900e-9'

预期:SAMPLES=786612、WAVE_OUT_MIN/MAX、RISING_CROSSINGS、PERIOD、FREQ、VERDICT OSCILLATES。 若格式不匹配,脚本打印 PARSE_FAIL 并 dump 文件头 30 行,据此修解析口径。

步骤 5:脚本落盘固化

方案工作区 pll_cal_20261003/ 与 .28:proj1/verif/cal_0/ 保留同源副本;换点标定(换 corner / 温度 / VCTRL / 时长)只需改 vco5_cal.sp 顶部的 parameters 与 tran1 语句。

6. 验证

6.1 参数与连通性(只读)

  • 实例参数与契约逐项一致(MP 320n/50n、MN 200n/50n、MT 400n/200n);
  • chk_vco5.il 在用户 GUI Check & Save 之后复跑仍为 insts=11 nets=9 terms=4 instTerms=44 mismatches=0 / VERDICT PASS —— 证明 GUI 保存没有破坏连通性与 net 名,阶段 1 首件真正闭环。

6.2 仿真判据

SPECTRE_EXIT=0、spectre completes with 0 errors;5 条 warning 中 2 条为初值计算告警(Initial condition computed for node R1/R3 is in error by 34.4 mV (3.13%),源自 ic 语句的 rforce 默认值),属初始化伪影,起振后无影响。

6.3 实测成本(1µs,nom corner,27 °C,conservative,maxstep=10ps)

项 数值
墙钟 / CPU 144.3 s / USER 141.8 s + SYS 0.6 s(单核)
峰值内存 67 MB
采样点数 786,612(等效 1.27 ps/点,远小于 maxstep=10ps,实际步长由 errpreset 支配)
波形体积 65 MB(psfascii,仅存 R0/VN 两节点)
频率 / 摆幅 7.868 GHz(周期 127.1 ps,781 次上升过零)/ 0.374→1.159 V

6.4 外推(线性,固定开销可忽略)

项 1µs 实测 60µs(test_lock 单点) 200 点 MC(60µs/点)
墙钟(单核串行) 144.3 s ≈2.4 h ≈480 核时 ≈20 天
波形体积 65 MB ≈3.9 GB/点 ≈780 GB ⚠

结论:「单点 ≥1h」口径成立且偏保守(实测 2.4 h);串行跑完 6 个 corner/温度组合的 lock 瞬态需 ≈14.4 h,200 点 MC 串行 ≈20 天 → HPC 派发不是优化项而是必需项。

6.5 调频范围与多线程对照(2026-10-03 追加,每点 100ns)

VCTRL 扫描(nom/27 °C/conservative,单核;100ns 只为取频率量级与相对耗时):

VCTRL 频率 墙钟(100ns) USER
0.5 V 2.021 GHz 4.33 s 4.06 s
0.6 V 4.791 GHz 10.15 s 9.81 s
0.7 V 7.868 GHz 14.48 s 14.07 s
0.8 V 10.551 GHz 19.56 s 19.06 s
0.9 V 12.234 GHz 23.66 s 23.18 s

调频范围 2.02 → 12.23 GHz(VCTRL 0.5→0.9 V,单调);频率越高耗时越长(步长由振荡周期支配,而非 maxstep)。若系统目标频率偏低,VCTRL 取 0.5 V 附近即可(再低能否起振需实测)。

多线程对照:+mt=4 @VCTRL=0.7 → 墙钟 13.84 s,对比单核 14.48 s 仅快 4.4%;USER 13.44 s ≈ 单核 14.07 s。 选项本身存在(spectre -h 明示 +multithread[=<N>],+mt 为缩写),但 对 11 管小电路几乎无收益(并行度不足,线程开销抵消)。

→ HPC 派发必须走「一核一点、点间并行」,而不是单点多核:6 计算节点 × 8 核 = 48 并发时,200 点 MC(60µs/点)约 10 h(若单点多核则无此收益)。

7. 回滚

纯新增,无备份:被改对象只有新增文件,删除即回到原状,不覆盖任何既有 cell 或配置。

ssh root@192.168.31.28 'rm -rf /projects/design/rain01/proj1/verif/cal_0; \
  rm -f /projects/design/rain01/proj1/verif/gen/probe_params.il'

由于本次无备份文件,backup/ 目录与 README.md 台账不适用(按全局规则「备份与留档」例外:未产生备份即无台账)。

8. 风险说明

风险 缓解
波形体积失控:psfascii 65 MB/µs,60µs×200 点≈780 GB,会打满 /projects(当前余量 1.1 T) 阶段 2 必须在 ADE-XL 里限制输出:只 save 关键节点、或改用 measurement 表达式代替全波形落盘;MC 批跑前先估容量
未测多线程:单核 141.8 s CPU 占满,+mt/APS 是否提速未验证 阶段 2 前补一次 +mt(8 核)对照,决定每节点并发策略
频率偏高(7.87 GHz @ VCTRL=0.7 V) 需在阶段 2 扫 VCTRL 定调频范围,并与 div8/cp 的速度目标对齐;若目标频率低,需增大尾管阻抗或加负载电容
ic 初始化告警 34 mV 初始化伪影,仅影响首个周期;如需干净起点,可减小 rforce 或改用短脉冲 kick
root 误跑导致属主错乱 一律 runuser -u rain01;派生物已验证属主 rain01 design

来源:/home/rain/Documents/eda_tools_ins/design/pll_cal_20261003/SOP.md | 最后更新:2026-10-03 21:15(由 build/sync.py 同步,请勿在站点侧修改)