跳转至

SOP — 阶段 1:PLL 原理图生成(vco5 / div8 / pfd / cp / lpf / pll_top)

日期:2026-10-03 | 执行机:hpc-submit(192.168.31.28)| 工作区:/projects/design/rain01/proj1 方案工作区:/home/rain/Documents/eda_tools_ins/design/pll_sch_20261003 第 1–8 章记录首件 vco5(自绘晶体管级);第 9 章为追加变更 div8(标准单元路线); 第 10 章为追加变更 pfd / cp / lpf(标准单元 + 全 MOS 手绘混用); 第 11 章为追加变更 pll_top(顶层集成 + CP 偏置支路,含五个子 cell 的 symbol 视图)。

1. 背景

阶段 1 要按分层 cell(pll_top / pfd / cp / lpf / vco5 / div8)画 PLL 原理图。首件 pll45/vco5 是 5 级全 MOS 环形 VCO(11 管 = 5×PMOS_VTG + 5×NMOS_VTG + 1 尾管 MT),端口 VDD/GND/VCTRL/OUT。

上一轮(2026-10-03 早些时候)用 dbCreateTerm 建层次端口,两个问题:

  • dbCreateTerm 单独创建的 terminal 在 GUI 打开/同步时被删除(SCH-1216 ... no pin associated with itself), 用户在 GUI 里 Check&Save 后,磁盘版本变成 terminals = 0、net 名回落为自动名(net5/net11/…);
  • 反馈环原先想用一条 6 点折线画,报 SCH-2159(wire 只支持 2 点段),改为 5 段 2 点线拼接。

本轮变更:改用 dbCreatePin( net, fig )(fig 为 purpose "pin" 的 2 点线)——该 API 同时创建 pin 与 terminal,且两者都能在 reopen 后存活;并固化只读自检脚本 chk_vco5.il。

2. 目标

变更完成后应达到的可验证状态:

项 判据
实例 insts=11(MP0..MP4、MN0..MN4、MT)
网络 nets=9(VDD / GND / VCTRL / VN / R0..R4)
端口 terms=4(VDD / GND / VCTRL / R0),每个 terminal 有 1 个 pin 图形
连通性 instTerms=44,且逐条与期望拓扑一致(mismatches=0)→ VERDICT PASS
外观 GUI 中 Check 后无 error(端口标签可见性见第 6 章)

3. 前置条件

  • 本机(dell-R620)rain 用户 → root@192.168.31.28 免密 ssh 已通;
  • .28 上 module load cadence && module load virtuoso/IC06.17.700 可用,PDK_DIR=/pdk/FreePDK45;
  • 必须以 rain01 身份运行 virtuoso:root 运行生成的 cell 属主为 root:design, 用户(rain01)无法编辑,GUI 报 SCH-1217 Unable to lock。统一走 verif/gen/run_skill.sh(内部 runuser 由调用方包裹);
  • FreePDK45 双库已挂进 proj1/cdssetup/cds.lib;pll45 库位于 proj1/design/pll45;
  • 用户 GUI 中必须关闭目标 cell 的编辑窗口(否则 dbOpenCellViewByType(...,"a") 拿不到写权限, 生成器的护栏会打印 VERDICT LOCKED 并退出)。

4. 影响范围

单机(.28)变更,只动库 design/pll45 下的 cell,不涉及停服,无在跑作业依赖。 窗口:用户 GUI 关闭 vco5 编辑窗口期间即可执行(GUI 主进程可继续运行)。 被改对象:pll45/vco5(整 cell 重建);被删对象:pll45/probe_pin3(本会话探针 cell)。

5. 分步操作

步骤 1:同步脚本到 .28(本机写 → scp)

脚本在方案工作区 pll_sch_20261003/gen/,需同步到 .28 的 proj1/verif/gen/。 以 root scp 会带来 root 属主,故先落到 /tmp 再用 install -o rain01 落位。

cd /home/rain/Documents/eda_tools_ins/design/pll_sch_20261003/gen
scp -q clean_scratch.il gen_vco5.il chk_vco5.il root@192.168.31.28:/tmp/
ssh root@192.168.31.28 'install -o rain01 -g design -m 644 /tmp/clean_scratch.il /tmp/gen_vco5.il /tmp/chk_vco5.il /projects/design/rain01/proj1/verif/gen/'

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

步骤 2:备份现有 vco5 cell(高危前置)

坑:gen_vco5.il 是「先删 cell 再重建」,中途失败会丢掉现有 cell,故必须先做目录级备份。

P=/projects/design/rain01/proj1
B=$P/backup/pll_sch/vco5.bak.$(date +%Y%m%d-%H%M%S)
mkdir -p "$(dirname "$B")"
cp -a "$P/design/pll45/vco5" "$B" && echo "BACKUP=$B"

预期:打印备份路径;回滚方式见第 7 章,台账在 backup/pll_sch/README.md。

步骤 3:清理本会话探针 cell

G=/projects/design/rain01/proj1/verif/gen
runuser -u rain01 -- bash $G/run_skill.sh $G/clean_scratch.il /tmp/clean_scratch.log
grep -E "DELETED|ABSENT|CELLS=" /tmp/clean_scratch.log

预期:DELETED probe_pin3、ABSENT probe_dev/ABSENT probe_connB,CELLS=(...) 中不再含探针 cell。

步骤 4:重建 vco5(带层次 pin)

runuser -u rain01 -- bash $G/run_skill.sh $G/gen_vco5.il /tmp/gen_vco5.log
grep -E "TERM |INSTS=|REOPEN|RE_TERMS|VERDICT" /tmp/gen_vco5.log

预期:TERM VDD/GND/VCTRL/OUT pins=1,INSTS=11 NETS=9 TERMS=4 SHAPES=61, REOPEN insts=11 totalInstTerms=44,RE_TERMS=("VDD" "GND" "VCTRL" "OUT"),VERDICT vco5 generated。 (2026-10-05 起输出 pin/net 名统一为 OUT,见 §14;SHAPES 随 label 数浮动,不是判据。)

坑(本轮实际踩到):run_skill.sh 内部会 cd $proj1/cdssetup,因此 .il 路径必须传绝对路径。 传相对名时 virtuoso 找不到脚本会立刻退出,不产生新 log;若 /tmp 下留有同名旧 log, 后续 grep 会读到旧内容并误判成功(本轮据此把 19:12 的旧生成结果当成了本次结果)。 排查口径:看 stat -c %y <库>/vco5/schematic/sch.oa 的 mtime 是否落在本次运行时刻。

坑(2026-10-05 实际踩到):GUI 持有该 cell 的写锁时,无头重建会静默失败——cell 目录里出现 sch.oa.cdslck.<host>.<pid>(属主即 GUI 进程);此时 gen_vco5.il 的删除与重建全部不生效, 表现为 SKILLRC=255 且不产生新 log(与「路径错」同一表现,/tmp 旧 log 会被 grep 误判为成功), 且 fix_pin_dirs.il 会对该 cell 打印 LOCKFAIL。执行前先查锁:

ls /projects/design/rain01/proj1/design/pll45/*/schematic/*.cdslck

有输出即说明 GUI 正打开对应 cell,请用户在 GUI 关闭该 cell 的编辑窗口即可 (GUI 主进程可保留,不必退出 Virtuoso);重启执行前先 rm -f /tmp/gen_vco5.log 免误读。

步骤 5:只读自检

chk_vco5.il 以 "r" 打开 cell(不写盘),按规则表核对每个 instTerm 挂网: MPi : S,B→VDD ; G→R[(i+4)%5] ; D→R[i];MNi : S→VN ; B→GND ; G→R[(i+4)%5] ; D→R[i]; MT : D→VN ; S,B→GND ; G→VCTRL。

runuser -u rain01 -- bash $G/run_skill.sh $G/chk_vco5.il /tmp/chk_vco5.log
grep -E "MISMATCH|CHK insts|TERM |VERDICT" /tmp/chk_vco5.log

预期:无 MISMATCH 行,CHK insts=11 nets=9 terms=4 instTerms=44 mismatches=0,VERDICT PASS。

步骤 6:脚本落盘固化

生成器与自检脚本长期存放于 .28 的 proj1/verif/gen/(与 run_skill.sh 同目录,便于 GUI 侧 load()), 方案工作区 pll_sch_20261003/gen/ 保留同源副本;器件层契约写在 gen_vco5.il 头部注释。

步骤 7:net/pin 名与几何契约(2026-10-03 迭代定稿)

无头生成的原理图在 GUI 里 Check & Save 会出现三类"改名/漂移",均已定位修复:

现象 根因 修法
net 名被改成 netNN(VDD→net11) net 名必须由落在导线上的 ("wire" "label") 承载。("annotate" "drawing") / ("text" "drawing") 能创建但不绑定;("label" "drawing") 被直接拒绝(Invalid layer/purpose) dbCreateLabel( cv list("wire" "label") xy 名 "lowerLeft" "R0" "fixed" 0.0625 ),锚点必须精确落在该 net 的 wire 上(偏 0.3 µm 即失效)
端口标签看不见 terminal~>position 是只读派生属性(写它报 dbSetq: Invalid position) 用 ("pin" "label") 建 pin 名标签,锚点落在 pin 图形上
5 个 MN.B(bulk)被并入 VN(电气错误) schCheck 按几何重建连接,显式 dbCreateInstTerm 会被几何覆盖;VN 竖线起点落在 MN.B 的高度(y=-0.9)即视为同网 VN 竖线只从 MN.S 起(y=-1.0875);bulk 用独立母线几何接 GND(直连会穿过 VN 母线,故走 VN 母线右端 x>12.25 外侧绕行)

dbCreateLabel 参数顺序(模块模板 dglttttn):cv labelType xy text justify orient font height——height 数字在最后。

离线复现 GUI 的 Check & Save(关键手段,避免每次都占用户 GUI):

G=/projects/design/rain01/proj1/verif/gen
runuser -u rain01 -- bash $G/run_skill.sh $G/probe_gui_sync.il /tmp/r_gui.log
grep -E "AFTER_CHECK|REOPEN nets" /tmp/r_gui.log

schCheck( cv ) + dbSave 等价于 GUI 的 Check&Save。判定口径:AFTER_CHECK nets 必须完整保住 9 个名字 (VDD/GND/VCTRL/VN/R0..R4);若出现 netNN 或 net 数 > 9,即存在未绑定的 label 或悬空端子。 随后再跑 chk_vco5.il 应得 mismatches=0。

label 类型由 probe_label_bind.il 判定:15 种候选各建一根 wire+label,跑一次 schCheck,只有 ("wire" "label") 的名字存活。

6. 验证

  1. 无头自检(上面步骤 5)VERDICT PASS;
  2. 磁盘落盘证据:stat -c %y /projects/design/rain01/proj1/design/pll45/vco5/schematic/sch.oa 的 mtime 晚于本次生成时刻;
  3. 用户在 GUI 中打开 pll45/vco5,确认 5 级结构、上下母线、左下尾管、外圈反馈环, 并执行 Check(预期无 error);
  4. 端口标签可见性:当前 4 个 terminal 的 position 仍为 nil(chk_vco5.il 打印 TERM ... pos=(nil)),dbCreatePin 已使 pin 图形存在(pins=1)。若 GUI 中仍看不到端口标签, 需另找 API 补 position,属下一步事项,不阻塞连通性验收。

7. 回滚

备份位置:/projects/design/rain01/proj1/backup/pll_sch/vco5.bak.20261003-202450/(目录级快照), 台账见同目录 README.md(含原路径、产生原因、可删条件)。

P=/projects/design/rain01/proj1
rm -rf "$P/design/pll45/vco5"                                        # 高危:先确认路径
cp -a "$P/backup/pll_sch/vco5.bak.20261003-202450" "$P/design/pll45/vco5"
chown -R rain01:design "$P/design/pll45/vco5"

回滚后验证:重新执行步骤 5,应回到备份时状态(该备份为 GUI Check&Save 后的版本: terms=0、net 名为自动名、mismatches 非 0 —— 属预期,因为被检对象本身已不是脚本生成态)。

8. 风险说明

风险 缓解
重建中途失败导致 cell 丢失 步骤 2 目录级备份;生成器先试写权限、拿不到则 VERDICT LOCKED 退出
GUI 侧缓存旧结构,Check&Save 反向覆盖脚本产物(本轮已实测发生过一次) 生成后让 GUI 关闭并重新打开该 cell(勿在旧窗口上保存);写盘后用 sch.oa mtime 与 chk_vco5.il 复核
root 运行导致 cell 属主错乱(SCH-1217 Unable to lock) 一律 runuser -u rain01 -- bash run_skill.sh;必要时 chown -R rain01:design
相对路径跑脚本且 /tmp 有旧 log → 误判成功 传绝对路径;核对 sch.oa mtime;log 用新文件名(r_*.log)
脚本内的 printf 输出不落 stdout 断言一律 grep -log 文件

9. div8 追加变更(2026-10-03)

9.1 背景与目标

阶段 1 第 2 件:pll45/div8(÷8 反馈分频器,接口 CLK ← vco5.OUT、OUT → pfd)。 目标:分频器属数字逻辑,直接复用 FreePDK45 附带的标准单元,避免手绘几十管的锁存器与布局布线。

9.2 技术发现(决定路线,均为实测)

发现 判据
FreePDK45 附带 OSU 标准单元库 freepdk45_cells(/pdk/FreePDK45/osu_soc/lib/),含 DFFPOSX1/DFFNEGX1/INVX1..X8/NAND2X1/…,每个 cell 都有晶体管级 schematic 视图(DFFPOSX1 = 22×NCSU_Devices_FreePDK45/{PMOS_VTL,NMOS_VTL} + 5 个 basic/iopin) probe_stdcell.il:SCH DFFPOSX1 insts=27 nets=17 terms=("vdd" "D" "gnd" "Q" "CLK")
该库没有 symbol 视图,且 /pdk 只读,无法补 VIEWS DFFPOSX1 = ("schematic" "abstract" "layout" "abstract.pin" "abstract.ext")
把实例指向 abstract 视图不可行:schCheck 后实例 instTerms 归零、顶层裂成 22 个 netNN 孤岛 probe_div8_sync 首轮:AFTER_CHECK nets 含 net2..net23,CHK … instTerms=0
结论:把用到的 cell 复制进可写库并自建 symbol 见 9.3 步骤 2–3

9.3 分步操作

步骤 1:挂标准单元库(可回滚)

P=/projects/design/rain01/proj1
cp -a $P/cdssetup/cds.lib $P/backup/pll_sch/cds.lib.bak.$(date +%Y%m%d-%H%M%S)   # 先备份
printf 'DEFINE freepdk45_cells /pdk/FreePDK45/osu_soc/lib/freepdk45_cells\n' >> $P/cdssetup/cds.lib

预期:tail -1 出现该 DEFINE。生效需重启 Virtuoso(GUI 侧)。

步骤 2:复制所需标准单元进 pll45(只读源库不动、未改)

L=$P/design/pll45; S=/pdk/FreePDK45/osu_soc/lib/freepdk45_cells
for c in DFFPOSX1 INVX1 CLKBUF1; do
  runuser -u rain01 -- cp -a $S/$c $L/ && runuser -u rain01 -- chmod -R u+w $L/$c
done

步骤 3:为复制的 cell 生成 symbol 视图(gen_std_symbols.il)

symbol 视图的合法 layer/purpose 与 layout/abstract 不同——实测只有 ("instance"|"device" "drawing")(body)、("pin" "drawing")(pin 图形)、 ("annotate" "drawing")(文字,如 pin 名);("package" "drawing") 报 dbCreateRect: Invalid layer/purpose。pin 位置(外端即连接点): DFFPOSX1:D(-1.6 0.6) CLK(-1.6 -0.6) Q(1.6 0) vdd(0 1.8) gnd(0 -1.8);INVX1/CLKBUF1 同形。

G=$P/verif/gen
runuser -u rain01 -- bash $G/run_skill.sh $G/gen_std_symbols.il /tmp/r_syms.log
grep -E "^.o SYM " /tmp/r_syms.log      # 预期 SYM DFFPOSX1 terms=("D" "CLK" "Q" "vdd" "gnd")

步骤 4:生成 div8(gen_div8.il)

拓扑:3 级 DFFPOSX1 接成翻转触发器(Q → INVX1 → D)串成 ÷8;CLK --CLKBUF1--> DFF0.CLK, 级间用上一级 Q 当时钟;端口 VDD/GND/CLK/OUT。 连线:信号用真实导线,VDD/GND 走同名 label(每个电源脚一段带 label 的短 stub), 因此没有电源轨横穿信号网;每个 net 另在导线上落一个 ("wire" "label") 名字标签(沿用第 7 章契约)。

runuser -u rain01 -- bash $G/run_skill.sh $G/gen_div8.il /tmp/r_gen_div8.log
grep -E "^.o .*(INSTS=|REOPEN insts|VERDICT)" /tmp/r_gen_div8.log
# 预期:INSTS=7 NETS=10 TERMS=4 SHAPES=71 / REOPEN insts=7 nets=10 terms=("CLK" "OUT" "VDD" "GND")

步骤 5:离线复现 GUI 的 Check & Save,再只读自检

runuser -u rain01 -- bash $G/run_skill.sh $G/probe_div8_sync.il /tmp/r_sync_div8.log
grep -E "^.o (SCHCHECK|AFTER_CHECK)" /tmp/r_sync_div8.log
runuser -u rain01 -- bash $G/run_skill.sh $G/chk_div8.il /tmp/r_chk_div8.log
grep -E "^.o (  INST|MISMATCH|CHK |VERDICT)" /tmp/r_chk_div8.log

9.4 验证(2026-10-03 实测)

项 结果
结构 INSTS=7(CKBUF、DFF0-2、INV0-2)、NETS=10、TERMS=4、SHAPES=71
连通性 chk_div8.il → instTerms=31 mismatches=0 → VERDICT PASS(31 个端子逐条比对期望网名)
抗 Check&Save schCheck+dbSave 后 10 个 net 名全部保住(Q0 Q1 OUT DN0 DN1 DN2 CKB CLK VDD GND),无 netNN
幂等 生成器复跑一次结果完全一致,再次自检仍 PASS

schCheck 最终返回 (0 0)(0 error / 0 warning;首轮为 (0 1),见 9.5「实例名冲突」一条)。层实例的连接由实例的 instTerms 承载, 本 cell 的 net~>conns 为空,故自检按 instance → instTerms 遍历。

9.5 坑(本轮实际踩到)

现象 根因 / 修法
GUI Check 报 Warning: Instance name collides with signal name - "CKB" 实例名与 net 名同名:时钟缓冲实例原叫 CKB,其输出网也叫 CKB。实例改名 CKBUF 后,离线 schCheck 由 (0 1) 变 (0 0)(命名约定:实例名不得与本 cell 任何 net 名相同)
*Error* setq/set: Variable is protected and cannot be assigned to - t SKILL 中 t 是受保护常量,量词变量不能取名 t:exists( t lst … ) 必报错,改用 tt/qt
*Error* return: return can only be used within a prog return() 只能出现在 prog(...) 内,不能放在 let(...) 里(对照 chk_vco5.il)
自检 want=nil / atoi: argument #1 should be a string - nil atoi( substring( "CKB" 4 ) ):CKB 无数字后缀,substring 越界返回 nil → 用 errset 兜底;期望网表不要用"靠 return 返回的辅助函数"计算(实测静默返回 nil),直接在循环内用 cond 展开
abstract 视图当 symbol 用 → 连接全丢 schCheck 不认 abstract 的 pin:instTerms 归零、net 碎成 netNN;必须复制 cell 并自建 symbol

9.6 回滚

P=/projects/design/rain01/proj1
rm -rf $P/design/pll45/div8                                    # 高危:先确认路径
rm -rf $P/design/pll45/{DFFPOSX1,INVX1,CLKBUF1}                # 仅删复制来的标准单元
cp -a $P/backup/pll_sch/cds.lib.bak.20261003-212330 $P/cdssetup/cds.lib
chown -R rain01:design $P/design/pll45

/pdk 原库全程只读未改。备份台账:.28:/projects/design/rain01/proj1/backup/pll_sch/README.md。

9.7 风险

风险 说明 / 缓解
~~分频器速度~~ 风险已关闭(2026-10-03) 联合瞬态实测:vco5 带 div8 负载后在 4.8294 GHz / 7.5656 GHz 两个工作点均精确 ÷8(1 GHz 理想时钟对照组同样精确),详见 ../div8_ghz_20261003/SOP.md。关注点转为成本:179 管网表 ≈3400 s/µs,test_lock 时长与 HPC 口径须重估
库副本漂移 pll45 内三家标准单元是副本;PDK 升级或需改单元时应重跑步骤 2–3,不要在同一份上手改
GUI 观感 实例显示为自建 symbol(方框 + 引脚),非 PDK 原样式;功能与网表不受影响

10. pfd / cp / lpf 追加变更(2026-10-03)

10.1 背景与目标

阶段 1 第 3 批:补齐 pll_top 所需的其余三个子 cell。至此除顶层集成外,分层 cell 全部就位。

cell 路线 目标结构 端口
pfd 标准单元 经典 DFF-PFD:DFFSR×2(D=VDD,CLK=REF/FB,异步 R 复位)+ AND2X1(UP·DN → RST) VDD GND REF FB UP DN
cp 全 MOS 手绘 电流舵:PMOS 源(MP1)+PMOS 开关(MP2) / NMOS 开关(MN2)+NMOS 源(MN1);UP 经 INVX1 反相驱动 PMOS 开关 VDD GND UP DN VBP VBN VCTRL
lpf 全 MOS 手绘 二阶无源:R1–C1 极点 + R2–C2 零点;R 用三极管区 MOS,C 用 MOS-cap VDD GND VIN VCTRL
项 判据(变更完成后应达到)
pfd insts=3 nets=7 terms=6,instTerms=19,mismatches=0 → PASS
cp insts=5 nets=10 terms=7,instTerms=20,mismatches=0 → PASS
lpf insts=4 nets=5 terms=4,instTerms=16,mismatches=0 → PASS
三 cell 共同 离线 schCheck 返回 (0 0)(0 error / 0 warning);Check&Save 后 net 名无一被改写成 netNN

LPF 全 MOS 化的理由(沿用 §10.2 实测):FreePDK45 符号器件库无 R/C/BJT/二极管, Calibre LVS 也只声明 8 个 MOS,用真无源件会断掉 LVS/PEX 链路。

CP 偏置端口外露的理由:VBP/VBN 是参考支路产物,属顶层职责(pll_top 内实现, 或 test_lock 阶段由理想源直驱)。放在 cp 里会让该 cell 无法同时服务"真实环路"与"台架"两种接法。

10.2 技术发现(决定路线,均为实测)

发现 判据
DFFPOSX1 没有复位端,经典 DFF 型 PFD 无法用它搭建 probe_pfd_cells.il:SCH DFFPOSX1 ... terms=("vdd" "D" "gnd" "Q" "CLK")
库内有 DFFSR(异步置位/复位),正好充当两个相频检测触发器 同探测:SCH DFFSR ... terms=("gnd" "vdd" "D" "S" "R" "Q" "CLK"),39 MOS
AND2X1 可作 UP·DN 复位项(A/B 进,Y 出) 同探测:terms=("Y" "B" "vdd" "gnd" "A")
§9 的标准单元复用流程(复制进 pll45 → 自建 symbol)可直接扩展,无需新机制 见 10.4 步骤 1–2;gen_std_symbols.il 追加两行 ssSym 即得 15/11 图形的 symbol

10.3 前置条件与影响范围

前置条件同 §3(rain → root@192.168.31.28 免密、module load cadence && module load virtuoso/IC06.17.700、 一律 runuser -u rain01 -- bash run_skill.sh <绝对路径>.il <log>、GUI 中关闭目标 cell 编辑窗口)。

影响范围:单机(.28),只动可写库 design/pll45。新增对象:DFFSR、AND2X1(自只读库复制 + 自建 symbol) 与三个新 cell pfd / cp / lpf;未覆盖任何既有 cell 数据。不停服、无在跑作业依赖。 窗口:用户在 GUI 中关闭同名 cell 编辑窗口期间(/pdk 全程只读未改)。

10.4 分步操作

步骤 1:扩展 symbol 生成器并复制两个标准单元

gen_std_symbols.il 追加 DFFSR(含 S/D/CLK/R/Q/vdd/gnd 七脚)与 AND2X1 两组 ssSym 调用; 复制前先判目录是否已存在,避免 cp -a 嵌套。

P=/projects/design/rain01/proj1; L=$P/design/pll45; S=/pdk/FreePDK45/osu_soc/lib/freepdk45_cells
for c in DFFSR AND2X1; do
  [ -d "$L/$c" ] || { runuser -u rain01 -- cp -a "$S/$c" "$L/"; runuser -u rain01 -- chmod -R u+w "$L/$c"; }
done
runuser -u rain01 -- bash $P/verif/gen/run_skill.sh $P/verif/gen/gen_std_symbols.il /tmp/r_syms2.log
grep -E "^.o SYM" /tmp/r_syms2.log

预期(实测):SYM DFFSR terms=("S" "D" "CLK" "R" "Q" "vdd" "gnd") shapes=15、 SYM AND2X1 terms=("A" "B" "Y" "vdd" "gnd") shapes=11;其余三个 cell 仍为原有值。

步骤 2:生成三个 cell 并只读自检

三个生成器与三个自检脚本同源存放于 gen/(清单见附录)。生成器均为「先删 cell 再重建」, 带写权限护栏(拿不到写锁则打印 VERDICT LOCKED 退出)。

G=/projects/design/rain01/proj1/verif/gen
for c in pfd cp lpf; do
  runuser -u rain01 -- bash $G/run_skill.sh $G/gen_$c.il /tmp/r_gen_$c.log
  grep -E "^.o (INSTS=|REOPEN|VERDICT)" /tmp/r_gen_$c.log
  runuser -u rain01 -- bash $G/run_skill.sh $G/chk_$c.il /tmp/r_chk_$c.log
  grep -E "^.o (MISMATCH|CHK |VERDICT)" /tmp/r_chk_$c.log
done

步骤 3:离线复现 GUI 的 Check & Save

probe_pll_sync.il 对三个 cell 依次 schCheck + dbSave + 重开, 一次性验证 net 名在几何重建后是否存活(避免逐个占用户 GUI)。

runuser -u rain01 -- bash $G/run_skill.sh $G/probe_pll_sync.il /tmp/r_pll_sync.log
grep -E "^.o (SCHCHECK|AFTER_CHECK|Warning: Pin)" /tmp/r_pll_sync.log

预期:三个 cell 均 -> ((0 0)),且 AFTER_CHECK <cell> nets=(...) 列出完整预期名集合、 无 netNN;随后复跑 chk_*.il 仍 mismatches=0。

10.5 验证(2026-10-03 实测)

项 pfd cp lpf
结构 INSTS=3 NETS=7 TERMS=6 SHAPES=58 INSTS=5 NETS=10 TERMS=7 SHAPES=54 INSTS=4 NETS=5 TERMS=4 SHAPES=31
连通性 instTerms=19 mismatches=0 instTerms=20 mismatches=0 instTerms=16 mismatches=0
抗 Check&Save schCheck (0 0);net 名 REF FB UP DN VDD GND RST 全保住 schCheck (0 0);10 个 net 名全保住(含 UPB NUP NDN) schCheck (0 0);5 个 net 名全保住(含 N2)
幂等 复跑生成器 INSTS/NETS/TERMS/SHAPES 完全一致 同左 同左

落盘证据:pll45/{pfd,cp,lpf}/schematic/sch.oa 的 mtime 晚于本次生成时刻 (2026-10-03 23:20:25 / 23:20:33 / 23:20:42,属主 rain01:design)。

10.6 坑(本轮实际踩到)

现象 根因 / 修法
MP1.B / MN1.B 在 Check&Save 后报 floating input/output,net 数由 10 涨到 12、多出 net13/net14,复检 mismatches=2 电源纵向 riser 从 bulk pin 起画(bulk 落在 riser 端点)时,schCheck 的几何重建不认这条连接;而从 pin 水平引出的 stub 能绑定(同 cell 内 MP2.B/MN2.B 正是这么接的,未报错)。修法:riser 只从 S 起(不碰 B),B 另走一条水平 stub 接电源 —— 与 §7 记录的 vco5 做法(VN 竖线只从 MN.S 起、bulk 走独立母线)同源。规律:不要让电源轨的端点落在 bulk pin 上
PFD 无法用 DFFPOSX1 搭 该单元无复位端(探测见 10.2);改用 DFFSR
cp 内混用标准单元 INVX1 与手绘 MOS 可行,无需特殊处理;两者都在同一 pll45 库、都用 <cell>/symbol,schCheck 与自检均正常

10.7 回滚

新增对象均可直接删除即回到变更前状态(全程未覆盖既有数据):

P=/projects/design/rain01/proj1
rm -rf $P/design/pll45/pfd $P/design/pll45/cp $P/design/pll45/lpf        # 高危:先确认路径
rm -rf $P/design/pll45/{DFFSR,AND2X1}                                    # 仅删本轮复制来的标准单元
chown -R rain01:design $P/design/pll45

/pdk 原库全程只读未改;cds.lib 本轮未改动(freepdk45_cells 的 DEFINE 属 §9)。 备份台账:.28:/projects/design/rain01/proj1/backup/pll_sch/README.md。

10.8 风险

风险 说明 / 缓解
库副本漂移 pll45 内的 DFFSR/AND2X1 是从 /pdk 复制的副本;PDK 升级或需改单元时应重跑步骤 1,不要在同一份上手改
CP 偏置未定 VBP/VBN 目前悬空(顶层未接),cp 单独不能工作;参考支路与偏置值在 pll_top(下一轮)确定
LPF 元件值未优化 R/C 的 W/L 为初值(R:1u/50n,C:10u/1u),环路带宽与相位裕度未做仿真标定,留待阶段 2
GUI 观感 标准单元显示为自建 symbol(方框 + 引脚),非 PDK 原样式;功能与网表不受影响

11. pll_top 顶层集成(2026-10-03)

11.1 背景与目标

阶段 1 收口件:把 pfd / cp / lpf / vco5 / div8 五个子 cell 连成 pll45/pll_top, 并在顶层实现 CP 偏置支路(cp 的 VBP/VBN 按 §10 的决定外露,参考支路归顶层)。

项 判据(变更完成后应达到)
结构 insts=9(XPFD XCP XLPF XVCO XDIV MPB MRBP MRBN MNB)、nets=11、terms=3、instTerms=41
连通性 chk_pll_top.il 逐条比对 41 个 instTerm → mismatches=0 → VERDICT PASS
抗 Check&Save 离线 schCheck 返回 (0 0),11 个 net 名(REF VDD GND UP DN VCTL VTUNE VCOCK FB VBP VBN)无一被改写成 netNN
端口 VDD GND REF(3 个),每个 terminal 有 1 个 pin 图形

顶层连接(REF 为参考时钟输入):

REF -> XPFD.REF
XPFD.UP -> XCP.UP        XPFD.DN -> XCP.DN
XCP.VCTRL -> XLPF.VIN                       (net VCTL)
XLPF.VCTRL -> XVCO.VCTRL                    (net VTUNE)
XVCO.OUT -> XDIV.CLK                        (net VCOCK)
XDIV.OUT -> XPFD.FB                         (net FB,反馈)

CP 偏置支路(两条独立的「二极管 + 电阻」支路,跨 VDD–GND):

branch P : VDD - MPB(PMOS 二极管接法 G=D) - VBP - MRBP(三极管区 NMOS 电阻,G=VDD) - GND
branch N : VDD - MRBN(三极管区 NMOS 电阻,G=VDD) - VBN - MNB(NMOS 二极管接法 G=D) - GND
  • MPB 与 cp 的源管 MP1 同尺寸(1u/200n)→ 1:1 镜像;MNB 与 MN1 同尺寸(500n/200n)→ 1:1 镜像, 故 VBP/VBN 决定电荷泵电流;
  • 为什么用两条独立支路而不是一条串联堆叠:VDD = 1.1 V,单条堆叠要在一个 VDD 内同时容下 |Vgs_p| + Vgs_n + I·R,而两端二极管压降之和本身已超过 1.1 V;两条支路各自「二极管 + 电阻」跨电源, 静态必导通,不需要启动电路;
  • 元件值为初值(同 §10.8 的 LPF R/C),参考电流与环路带宽的标定属阶段 2;
  • 两条支路与 XCP 的 VBP/VBN 之间按 net 名桥接(各自一段带 label 的短线),不拉长线、不穿区。

11.2 技术发现(决定路线,均为实测)

发现 判据
五个子 cell 只有 schematic、没有 symbol 视图,顶层无法例化 生成器只建 schematic(用 dbCreatePin 画层次 pin);§9.2 已实测「指向非 symbol 视图(abstract)会让 schCheck 清空 instTerm、net 碎成 netNN」
结论:先为五个子 cell 各建一个 symbol 视图,再例化 新增 gen_pll_symbols.il(与 gen_std_symbols.il 同法,仅补 body/pin/annotate 三类 layer)
信号走线会与相邻块的「引脚图形」短路——引脚线从连接点一直画到体边,比带 label 的 stub 更长 首版 FB 返回线走 y=8.0,穿过 XDIV 的 GND 引脚图形(y=7.6..8.2),schCheck 报 Error: Net "FB" shorted to net "GND"(返回 (2 0))。改到 y=6.5 后返回 (0 0)

11.3 前置条件与影响范围

前置条件同 §3(rain → root@192.168.31.28 免密、module load cadence && module load virtuoso/IC06.17.700、 一律 runuser -u rain01 -- bash run_skill.sh <绝对路径>.il <log>、GUI 中关闭目标 cell 编辑窗口)。

影响范围:单机(.28),只动可写库 design/pll45。新增对象:5 个 symbol 视图 + pll_top; 未覆盖任何既有 cell 数据(pll_top 先前不存在)。不停服、无在跑作业依赖。/pdk 全程只读未改。

11.4 分步操作

步骤 1:为五个子 cell 建 symbol 视图(gen_pll_symbols.il,幂等重建)

端子名必须与子 cell 的 schematic 逐字一致(大小写敏感),否则层次连接为空: pfd=VDD GND REF FB UP DN;cp=VDD GND UP DN VBP VBN VCTRL;lpf=VDD GND VIN VCTRL; vco5=VDD GND VCTRL OUT;div8=VDD GND CLK OUT。引脚线外端即连接点,顶层的走线坐标与该表必须同步维护。

G=/projects/design/rain01/proj1/verif/gen
runuser -u rain01 -- bash $G/run_skill.sh $G/gen_pll_symbols.il /tmp/r_pll_syms.log
grep -E "^.o (SYM|VERDICT)" /tmp/r_pll_syms.log

预期(实测):SYM pfd terms=("REF" "FB" "UP" "DN" "VDD" "GND") shapes=13、 SYM cp … 7 脚 shapes=15、SYM lpf … shapes=9、SYM vco5 … shapes=9、SYM div8 … shapes=9。

步骤 2:生成 pll_top(gen_pll_top.il,「先删 cell 再重建」+ 写权限护栏)

runuser -u rain01 -- bash $G/run_skill.sh $G/gen_pll_top.il /tmp/r_gen_pll_top.log
grep -E "^.o (INSTS=|REOPEN insts|VERDICT)" /tmp/r_gen_pll_top.log

预期(实测):INSTS=9 NETS=11 TERMS=3 SHAPES=88、 REOPEN insts=9 nets=11 terms=("REF" "VDD" "GND")、VERDICT pll_top generated。

步骤 3:只读自检 + 离线复现 GUI 的 Check & Save

runuser -u rain01 -- bash $G/run_skill.sh $G/chk_pll_top.il /tmp/r_chk_pll_top.log
grep -E "^.o (MISMATCH|CHK |VERDICT)" /tmp/r_chk_pll_top.log
runuser -u rain01 -- bash $G/run_skill.sh $G/probe_pll_top_sync.il /tmp/r_pll_top_sync.log
grep -E "^.o (SCHCHECK|AFTER_CHECK)" /tmp/r_pll_top_sync.log

预期(实测):CHK insts=9 nets=11 terms=3 instTerms=41 mismatches=0 → VERDICT PASS; SCHCHECK pll_top -> ((0 0));AFTER_CHECK pll_top nets=(…) 列出全部 11 个名字、无 netNN。 随后复跑一次 chk_pll_top.il 仍须 mismatches=0(证明 Check&Save 未改动连通性)。

11.5 验证(2026-10-03 实测)

项 结果
结构 INSTS=9 NETS=11 TERMS=3 SHAPES=88;9 个实例的 instTerm 数为 6+7+4+4+4+4+4+4+4=41
连通性 chk_pll_top.il → mismatches=0 → VERDICT PASS(41 条逐条比对期望网名)
抗 Check&Save schCheck 返回 (0 0),日志中 Error: 行数为 0;11 个 net 名全保住(含 VCTL VTUNE VCOCK FB VBP VBN)
幂等 生成器复跑一次 INSTS/NETS/TERMS/SHAPES 完全一致,随后再自检仍 PASS
落盘 pll45/pll_top/schematic/sch.oa mtime 2026-10-03 23:34:32,属主 rain01:design;5 个 symbol 视图 mtime 23:32:14,属主同

11.6 坑(本轮实际踩到)

现象 根因 / 修法
schCheck pll_top -> ((2 0)),日志 Error: Net "FB" shorted to net "GND" FB 返回线首版走 y=8.0,与 XDIV 的 GND 引脚图形相交——符号里的引脚线从连接点(y=7.6)一直画到体边(y=8.2),比带 label 的 stub 更长。规律:信号走线不仅要避开 stub,还要避开相邻块的引脚线本身;改到 y=6.5(上下各留 0.5 余量)后 (0 0)。同一改动也顺带说明了为什么「按名分发电源 + 短线 stub」比拉电源轨更抗短路
子 cell 无 symbol 视图 → 顶层无法例化 新建 gen_pll_symbols.il;端子名与 schematic 必须逐字一致
其余:terminal~>position 仍为 nil(pins=1) 与 §6 第 4 条同源(GUI 端口标签可见性),不阻塞连通性验收

11.7 回滚

新增对象均可直接删除即回到变更前状态(全程未覆盖既有数据,故未产生备份文件):

P=/projects/design/rain01/proj1
rm -rf $P/design/pll45/pll_top                       # 高危:先确认路径
for c in pfd cp lpf vco5 div8; do rm -rf $P/design/pll45/$c/symbol; done   # 仅删本轮新建的 symbol 视图
chown -R rain01:design $P/design/pll45

/pdk 原库全程只读未改;cds.lib 本轮未改动。备份台账:.28:/projects/design/rain01/proj1/backup/pll_sch/README.md。

11.8 风险

风险 说明 / 缓解
偏置支路未标定 MPB/MRBP/MRBN/MNB 的 W/L 为初值,参考电流与 CP 电流未做仿真标定,留待阶段 2
无启动电路 两条支路均为「二极管 + 电阻」跨电源,静态必导通,故无零电流简并态;若后续改成自偏置型参考,须重评启动
符号/走线坐标耦合 pll_top 的走线端点硬编码了子 cell 的引脚坐标;子 cell 若改引脚位置,须同步改 gen_pll_top.il(两文件均在 gen/)
台架需要理想偏置时 顶层 VBP/VBN 为内部节点;test_lock 若要用理想源直驱偏置,应改从 cp 单独搭台架,而不是在 pll_top 上覆盖
GUI 观感 子 cell 显示为自建 symbol(方框 + 引脚),非 PDK 原样式;功能与网表不受影响

12. 引脚方向补丁(2026-10-04)

背景:阶段 2 要把 cell 交给 ADE-XL 仿真,但 gen_*.il 用 dbCreatePin 建 pin 时未设方向,6 个 cell 的全部 terminal 方向均为 unused。ADE-XL 的 Setup → Stimuli 只认 input / inputOutput pin 或 global net,故报 ADE (G)XL Message 2804 / No input pins, bi-directional pins or global nets were found,无法给 VDD/VCTRL 加源。

影响范围:pll45 下 6 个 cell(pfd/cp/lpf/vco5/div8/pll_top)的 schematic terminal 与 symbol pin 方向;不改拓扑、不改 net 名。

处置:新增幂等脚本 gen/fix_pin_dirs.il(生成后跑一次即可)。

备份(.28):

ssh root@192.168.31.28 'B=/projects/design/rain01/proj1/backup/pll_pindir_$(date +%Y%m%d-%H%M%S); mkdir -p "$B" && tar czf "$B/pll45_cells_before_pindir.tgz" -C /projects/design/rain01/proj1/design/pll45 pfd cp lpf vco5 div8 pll_top'

执行:

ssh root@192.168.31.28 'runuser -u rain01 -- bash /projects/design/rain01/proj1/verif/gen/run_skill.sh /projects/design/rain01/proj1/verif/gen/fix_pin_dirs.il /tmp/fix_pin_dirs.log'

预期:逐行 SET sch <cell>.<pin> = <input|output>,无 MISS / LOCKFAIL。 坑:cell 正被 GUI 打开时 dbOpenCellViewByType(...,"a") 返回 nil(打印 LOCKFAIL)——须先关闭 Virtuoso 再跑。

方向表:

cell input output
pfd REF FB VDD GND UP DN
cp UP DN VBP VBN VDD GND VCTRL
lpf VIN VDD GND VCTRL
vco5 VDD GND VCTRL OUT(2026-10-05 前为 R0,见 §14)
div8 CLK VDD GND OUT
pll_top REF VDD GND —(无 symbol 视图)

验证(2026-10-04 实测): - 探针(schematic + symbol)方向全部生效; - schCheck:pfd/cp/lpf/div8/pll_top = (0 0);vco5 当时为 (0 2),两条 warning 即命名不一致——Terminal "R0" in view schematic not found in "vco5 symbol" / Terminal "OUT" in view symbol not found in "vco5 schematic"(2026-10-05 已修复,见 §14); - 幂等:重跑脚本输出相同 SET、无报错。

回滚:解包备份 tgz 覆盖 6 个 cell 目录;本机文档备份见 backup/README.md(*.bak.20261004-022059)。

风险 / 遗留: 1. ~~vco5 schematic pin 名 R0 与 symbol pin 名 OUT 不一致(schCheck (0 2))~~ 已于 2026-10-05 修复——统一为 OUT,见 §14; 2. 生成器 gen_*.il 未内置 direction 设置,重新生成后须再跑一次 fix_pin_dirs.il(已写入流程)。

13. pll_top 全链复跑与两处回归缺陷修复(2026-10-04)

触发:pll_loop_cal_20261004 附录 G「未做」项 ④——LPF 两次改尺寸后 pll_top 未复跑全链。

复跑含义(本章定死):按 §11.4 的验证链在库上重跑并核验—— gen_pll_symbols.il → gen_pll_top.il → chk_pll_top.il → probe_pll_top_sync.il → chk_pll_top.il(复跑)→ fix_pin_dirs.il → probe_pin_dirs.il(验收)。

复跑前取证(新增只读探针 gen/probe_pin_dirs.il,fix_pin_dirs.il 只打印 SET、无法证明改前状态)——发现两处真实回归缺陷:

对象 复跑前实测 影响
lpf 的 4 个 schematic pin 方向全为 unused ADE-XL Setup → Stimuli 报 2804 No input pins…,无法给 VDD/VCTRL 加源
lpf 的 symbol 视图 缺失(NOSYM lpf) pll_top 里的 lpf 实例无图形
pll_top 的 3 个 pin 方向全为 unused 同上(顶层加源)

根因:gen_lpf.il 头部即写明「idempotent: deletes the cell, then rebuilds it」,其 ddDeleteObj(cid) 删除整个 cell(含全部视图)——故 2026-10-04 05:48 / 06:03 两次重建 LPF 时把 symbol 视图一并删掉,且生成器不设 direction ⇒ 方向回到 unused。gen_pll_symbols.il 无删除逻辑,故它能补回 symbol。

处置(幂等,未改拓扑 / 端口 / net 名):① gen_pll_symbols.il 补回 5 个 symbol(含 lpf terms=("VIN" "VCTRL" "VDD" "GND") shapes=9);② gen_pll_top.il 重建 pll45/pll_top;③ fix_pin_dirs.il 恢复方向(28 行 SET,无 MISS/LOCKFAIL)。

验证(2026-10-04 实测,与 §11.5 基线逐项一致):

检查 结果
gen_pll_symbols.il 5 个 SYM 全出(pfd 13 / cp 15 / lpf 9 / vco5 9 / div8 9 shapes)
gen_pll_top.il INSTS=9 NETS=11 TERMS=3 SHAPES=88、REOPEN … terms=("REF" "VDD" "GND")、VERDICT pll_top generated
chk_pll_top.il CHK insts=9 nets=11 terms=3 instTerms=41 mismatches=0 → VERDICT PASS
probe_pll_top_sync.il SCHCHECK pll_top -> ((0 0));AFTER_CHECK nets= 11 名全保留、无 netNN
chk_pll_top.il 复跑 仍 mismatches=0 → VERDICT PASS(Check&Save 未改连通性)
probe_pin_dirs.il 验收 53 个 terminal 输出行中 unused = 0;lpf 的 symbol 视图已恢复
幂等复跑 全链第二次:INSTS / CHK / SET 数值行数全部一致
GUI 复看(用户,2026-10-04) 图面核对通过:lpf 的 symbol 视图已回来(Library Manager 的 View 列表可见);四器件尺寸与类型全对——MR1 PMOS l=50n w=1u、MC1 NMOS l=1u w=4.54u、MR2 PMOS l=1u w=1.68u、MC2 NMOS l=1u w=59u;拓扑 = VIN—MR1—VCTRL,VCTRL 上 MC1 分流到 GND、MR2→N2→MC2 串联到 GND;5 个 net(VIN VCTRL N2 VDD GND)齐全;Check and Save 成功、无报错

跑法(可复现):

G=/projects/design/rain01/proj1/verif/gen
for s in gen_pll_symbols gen_pll_top chk_pll_top probe_pll_top_sync chk_pll_top fix_pin_dirs probe_pin_dirs; do
  runuser -u rain01 -- bash $G/run_skill.sh $G/$s.il /tmp/r_$s.log
done

回滚:.28:/projects/design/rain01/proj1/backup/pll_top_rerun_20261004-153650/pll45_cells_before.tgz(pll_top + lpf 两 cell);解包覆盖后重跑 chk_pll_top.il 与 probe_pin_dirs.il 复核。

新固化判据(→ BASELINE §5):① 凡「先删 cell 再重建」写法的生成器(gen_lpf.il 等)会连 symbol 视图一起删,重建后必须补跑 gen_pll_symbols.il;② 任何 (re)generation 之后必须补跑 fix_pin_dirs.il,并以 probe_pin_dirs.il 验收。

14. vco5 pin 名统一(R0 → OUT,2026-10-05)

背景:阶段 2 ADE-XL 出网表报 OSSHNL-912——pll45/vco5 的 schematic pin 名 R0 与 symbol 端口 OUT 不一致(§12 遗留项 1;schCheck 报 (0 2)),网表阶段无法把两个视图对上。

目标:vco5 schematic 对外 pin 名 = OUT;chk_vco5.il 连通性检查 mismatches=0; fix_pin_dirs.il 仍能把 OUT 打成 output。

前置条件:GUI 侧关闭 vco5 编辑窗口(否则 cell 被锁,见 §5 步骤 4 新增坑);.28 可 ssh(root)。

影响范围:仅 pll45/vco5 一个 cell —— 第 0 级环节点 net 由 R0 改名为 OUT,R1..R4 不动, 环拓扑不变(INSTS=11 NETS=9 instTerms=44 与 §13 一致)。无需停服; 窗口 = 用户 GUI 关闭 vco5 编辑窗口期间(GUI 主进程可保留)。

分步操作:

同步脚本到 .28(方案侧为源,/tmp 中转以避开 root 属主):

cd /home/rain/Documents/eda_tools_ins/design/pll_sch_20261003/gen
scp -q gen_vco5.il chk_vco5.il fix_pin_dirs.il root@192.168.31.28:/tmp/
ssh root@192.168.31.28 'install -o rain01 -g design -m 644 /tmp/gen_vco5.il /tmp/chk_vco5.il /tmp/fix_pin_dirs.il /projects/design/rain01/proj1/verif/gen/'

查锁 → 备份 → 重建 → 打方向 → 自检:

P=/projects/design/rain01/proj1; L=$P/design/pll45; G=$P/verif/gen
ls $L/*/schematic/*.cdslck          # 有输出 = GUI 正打开该 cell,先请其关闭
rm -f /tmp/gen_vco5.log             # 旧 log 残留会把失败误判成成功
B=$P/backup/pll_sch/vco5.bak.$(date +%Y%m%d-%H%M%S); mkdir -p "$(dirname "$B")"
cp -a $L/vco5 "$B" && echo "BACKUP=$B"
runuser -u rain01 -- bash $G/run_skill.sh $G/gen_vco5.il /tmp/gen_vco5.log
runuser -u rain01 -- bash $G/run_skill.sh $G/fix_pin_dirs.il /tmp/fix_pin_dirs.log
runuser -u rain01 -- bash $G/run_skill.sh $G/chk_vco5.il /tmp/chk_vco5.log
stat -c "%y %n" $L/vco5/schematic/sch.oa      # mtime 须落在本次运行时刻

实现体:无独立脚本,即上述命令序列;生成器与自检脚本长期存放于方案侧 gen/ 与 .28:proj1/verif/gen/(同源副本)。

改动清单:

文件 改动
gen_vco5.il ① 建网循环 i==0 时 net 名取 OUT(原 sprintf "R%d");② 同名 label 同步取 OUT;③ pin 名标签 pgPinLabel 由 "R0" 改 "OUT"
chk_vco5.il 新增 chkName( k )(k==0 → "OUT"),期望表改用它;头部规则注释注明 index 0 = OUT
fix_pin_dirs.il vco5 条目 schematic 侧 "R0" → "OUT"(symbol 侧本就是 OUT),头部注释同步

验证(2026-10-05 实测):

检查 结果
gen_vco5.il TERM VDD/GND/VCTRL/OUT pins=1;INSTS=11 NETS=9 TERMS=4 SHAPES=61;RE_TERMS=("VDD" "GND" "VCTRL" "OUT");VERDICT vco5 generated
fix_pin_dirs.il SET sch vco5.OUT = output,无 MISS / LOCKFAIL
chk_vco5.il CHK insts=11 nets=9 terms=4 instTerms=44 mismatches=0 → VERDICT PASS
落盘 sch.oa mtime = 2026-10-05 00:37:32(本轮)
幂等复跑 gen_vco5 + fix_pin_dirs + chk_vco5 再跑一次:INSTS=11 NETS=9 TERMS=4 SHAPES=61、TERM … OUT、SET sch vco5.OUT = output、CHK … mismatches=0 → VERDICT PASS,与首轮逐项一致;sch.oa mtime 00:41:51
待用户 GUI 关闭重开 vco5 后 Check and Save 无报错;ADE-XL 重跑网表确认 OSSHNL-912 消失

回滚:

P=/projects/design/rain01/proj1
rm -rf "$P/design/pll45/vco5"
cp -a "$P/backup/pll_sch/vco5.bak.20261005-003715" "$P/design/pll45/vco5"

回滚后复跑 chk_vco5.il(此时应报 want=OUT got=R0 的 mismatch,属预期旧状态); 脚本侧回滚见方案侧 pll_sch_20261003/backup/README.md。 备份位置:.28:proj1/backup/pll_sch/(登记于该目录 README.md)。 注意 cp -a 会把备份时刻的 sch.oa.cdslck 一并复制,回滚后按需删除该锁文件。

风险说明:

  1. 改 net 名牵动 label 绑定 —— 已用 chk_vco5.il(几何 + 连通性)与 sch.oa mtime 双重确认;GUI 侧 Check and Save 待用户复看。
  2. R1..R4 未动、环拓扑不变(INSTS/NETS/instTerms 与 §13 一致:11 / 9 / 44)。
  3. pll_top 里 vco5 实例经 symbol 视图引用,端口名一直是 OUT,因此上游与 ADE-XL test 无需改动。
  4. 首次执行被 GUI 写锁挡住(SKILLRC=255、无新 log),已把查锁步骤固化进 §5 步骤 4 与本节的命令序列。

附录:交付物清单

交付物 位置
生成器(含器件层契约) pll_sch_20261003/gen/gen_vco5.il(同步副本:.28:proj1/verif/gen/)
div8 生成器与其前置 pll_sch_20261003/gen/gen_div8.il、gen_std_symbols.il(同步副本同上;见第 9 章)
div8 只读自检 / Check&Save 复现 pll_sch_20261003/gen/chk_div8.il、probe_div8_sync.il
pfd / cp / lpf 生成器(见第 10 章) pll_sch_20261003/gen/gen_{pfd,cp,lpf}.il(同步副本:.28:proj1/verif/gen/)
pfd / cp / lpf 只读自检 pll_sch_20261003/gen/chk_{pfd,cp,lpf}.il(同步副本同上)
三 cell 的 Check&Save 离线复现 pll_sch_20261003/gen/probe_pll_sync.il
五个子 cell 的 symbol 生成器(第 11 章) pll_sch_20261003/gen/gen_pll_symbols.il(同步副本:.28:proj1/verif/gen/)
pll_top 生成器(第 11 章) pll_sch_20261003/gen/gen_pll_top.il(同步副本同上)
pll_top 只读自检 pll_sch_20261003/gen/chk_pll_top.il(同步副本同上)
pll_top 的 Check&Save 离线复现 pll_sch_20261003/gen/probe_pll_top_sync.il
标准单元可用性与端子探测(第 10 章) pll_sch_20261003/gen/probe_pfd_cells.il
标准单元探测脚本(本次取证) pll_sch_20261003/gen/probe_stdcell.il、probe_sym_layer.il、probe_div8_conns.il
只读自检 pll_sch_20261003/gen/chk_vco5.il(同步副本同上)
pin 方向补丁 / 只读验收探针(§12、§13) pll_sch_20261003/gen/{fix_pin_dirs,probe_pin_dirs}.il(同步副本同上)
scratch 清理 pll_sch_20261003/gen/clean_scratch.il
无头运行器 .28:proj1/verif/gen/run_skill.sh(必须 runuser -u rain01 且传绝对路径)
取证脚本 pll_sch_20261003/gen/probe_{dev,pin,pin2,pin3,conn}.il
备份台账 .28:proj1/backup/pll_sch/README.md

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