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. 验证¶
- 无头自检(上面步骤 5)
VERDICT PASS; - 磁盘落盘证据:
stat -c %y /projects/design/rain01/proj1/design/pll45/vco5/schematic/sch.oa的 mtime 晚于本次生成时刻; - 用户在 GUI 中打开
pll45/vco5,确认 5 级结构、上下母线、左下尾管、外圈反馈环, 并执行Check(预期无 error); - 端口标签可见性:当前 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 一并复制,回滚后按需删除该锁文件。
风险说明:
- 改 net 名牵动 label 绑定 —— 已用
chk_vco5.il(几何 + 连通性)与sch.oamtime 双重确认;GUI 侧Check and Save待用户复看。 R1..R4未动、环拓扑不变(INSTS/NETS/instTerms与 §13 一致:11 / 9 / 44)。pll_top里 vco5 实例经 symbol 视图引用,端口名一直是OUT,因此上游与 ADE-XL test 无需改动。- 首次执行被 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同步,请勿在站点侧修改)