RUNBOOK — div8_0:vco5 × div8 联合瞬态验证环境¶
用途:随时复跑 / 换工作点 / 换 corner,回答"分频链在这个频率上还工作吗"。 定位:
.28:/projects/design/rain01/proj1/verif/div8_0;方案副本div8_ghz_20261003。
1. 服务概览¶
| 项 | 内容 |
|---|---|
| 干什么 | 用 Spectre 跑 vco5 + div8 的联合瞬态,量 OUT 是否为 CLK 的 1/8 |
| 组成 | tb_div8.sp(拓扑)、div8_cells.sp(标准单元子电路)、div8_run.sh(运行器)、parse_cal.py(解析器)、psf_*/(波形) |
| 依赖 | .28 的 spectre(MMSIM151)、模型卡 verif/models/spectre_nom.include、只读 cells.sp |
| 异常影响 | 仅影响本验证环境,不涉及任何服务;最坏是白跑一次仿真 |
| 重要性 | 中(阶段 2 前的工作点/时长依据来源之一) |
2. 接入与凭据¶
ssh root@192.168.31.28 # 本机 rain 用户已免密;仿真一律以 rain01 身份跑
C=/projects/design/rain01/proj1/verif/div8_0
无独立凭据;复用系统账号(rain01)。目录属主必须是 rain01,否则写 time.txt 报 Permission denied。
3. 日常速查表¶
ssh root@192.168.31.28 # 登录
ls -l $C # 看产物
runuser -u rain01 -- bash $C/div8_run.sh 0.7 # 跑 VCTRL=0.7 点(缺省)
runuser -u rain01 -- bash $C/div8_run.sh 0.9 # 跑 VCTRL=0.9 点
cd $C && python3 parse_cal.py psf_v09 R0 1e-8 # 解析 VCO
cd $C && python3 parse_cal.py psf_v09 OUTA 1e-8 # 解析 div8 输出
cd $C && python3 parse_cal.py psf_v09 OUTB 5e-9 # 解析 1 GHz 对照
grep -h "completes with" $C/tb_div8_v09.log # 看错误数
4. 日常操作¶
跑一个工作点(幂等:重跑即重算,波形目录按 tag 独立)
runuser -u rain01 -- bash $C/div8_run.sh 0.9
# 预期:SPECTRE_EXIT=0 / "completes with 0 errors" / WALL≈186s / RAW_DIR=...psf_v09
换 corner:把 tb_div8.sp 里的 include ".../spectre_nom.include" 换成 spectre_ss.include / spectre_ff.include(副本在 verif/models/),再跑;建议同时把 TAG 标识写进网表注释,避免与 nom 产物混淆。
换时长:改 tb_div8.sp 末行 tran1 tran stop=40n。注意成本:≈3400 s/µs(179 管),不要照搬 test_lock 的 60 µs。
看波形:psf_*/tran1.tran.tran 是 psfascii 文本;用 parse_cal.py <raw_dir> <node> <window_start_秒> 取频率/摆幅。
5. 配置管理¶
| 文件 | 作用 | 改动注意 |
|---|---|---|
tb_div8.sp |
顶层:VCO + 两路 div8 + 电源/分析语句 | 端口顺序必须与 cells.sp 一致(CLKBUF1 A vdd gnd Y、DFFPOSX1 vdd D gnd Q CLK、INVX1 A Y vdd gnd) |
div8_cells.sp |
三个标准单元子电路(模型名已换 PMOS_VTL/NMOS_VTL) |
来自只读库;换单元时重跑抽取命令,勿手改 |
div8_run.sh |
运行器:bash div8_run.sh [vctrl] |
每次按参数重生成网表 ⇒ 幂等 |
parse_cal.py |
波形解析(复用 pll_cal_20261003) |
窗口参数用浮点秒(1e-8),写 10n 会报 bad window_start |
生效方式:脚本即改即用(无服务需重启)。
6. 备份与恢复¶
本环境无状态:产物全在 div8_0/ 内,源库只读。回滚 = 删目录:
rm -rf /projects/design/rain01/proj1/verif/div8_0 # 高危:先确认路径
方案侧源文件在 div8_ghz_20261003/(tb_div8.sp、div8_run.sh、SOP.md),可随时重新下发。
7. 监控与告警¶
| 指标 | 看哪 | 阈值/判据 |
|---|---|---|
| 仿真是否成功 | grep "completes with" tb_div8_v*.log |
必须 0 errors(warnings 允许:ic 提示、悬空输出) |
| 分频是否正确 | 解析 OUTA×8 vs R0 |
二者差 >1% 即异常 |
| 墙钟 | cat time.txt |
40 ns 约 135–190 s;明显变慢查机器负载 |
| 波形体量 | ls -l psf_v*/ |
40 ns 约 8–12 MB;异常增大说明步长设置被改 |
8. 故障处置¶
场景 1:time.txt: Permission denied
- 症状:脚本第 17 行报错、SPECTRE_EXIT=1、无 psf。
- 诊断:ls -ld $C 看属主。
- 处置:chown -R rain01:design $C,重跑。
- 验证:脚本输出 RAW_DIR=... 且 psf 非空。
场景 2:PARSE_FAIL bad window_start
- 症状:解析器立刻退出。
- 诊断:窗口参数写成了 10n。
- 处置:改浮点秒,如 1e-8(10 ns)。
- 验证:输出 PERIOD=... / FREQ=... / VERDICT OSCILLATES。
场景 3:OUTA 不分频(OUTA×8 ≠ R0)
- 症状:OUT 周期与 R0 无关,或 VERDICT TOO_FEW_CROSSINGS。
- 诊断顺序:① 先看 OUTB(1 GHz 对照组)—— 若正常,则问题是速度;若也不正常,则是结构/网表(回到 pll_sch_20261003/SOP.md §9 核对端口顺序与拓扑)。
- 处置:速度问题 → 提高 VCTRL 上限以下降 VCO 频率,或改分频结构;结构问题 → 修 tb_div8.sp 实例端口后重跑。
- 验证:三路频率比值回到 8.00。
场景 4:起振失败(VERDICT NO_OSCILLATION)
- 诊断:先确认 VCO 自身(空载)在 pll_cal_20261003/cal_0 能起振。
- 处置:检查 ic R0=... R5 那一行是否被改动(它负责打破对称解)。
- 验证:R0 摆幅 >0.4 V。
9. 安全与权限¶
/pdk、/tools为只读共享挂载,禁止写入;本环境只读引用cells.sp与模型卡。- 一律
runuser -u rain01跑仿真,避免 root 属主。 - 无凭据落盘。
10. 容量与性能¶
| 项 | 实测(2026-10-03,nom/27 °C) |
|---|---|
| 规模 | 179 管(VCO 11 + 2×div8 84) |
| 时长 40 ns | WALL 135 s(VCTRL 0.7)/ 186 s(0.9);峰值内存 67 MB |
| 折算 | ≈3400 s/µs ⇒ 60 µs 单点 ≈56 核时(尚未含 PFD/CP/LPF) |
| 波形 | 8.5 MB / 11.9 MB per 40 ns(save 了 4 个节点) |
| 优化方向 | 缩短 stop、只 save 关注节点、必要时放宽 maxstep(会牺牲高频精度,慎用) |
11. 附录¶
- 相关文档:
div8_ghz_20261003/SOP.md(本次验证档案)、pll_cal_20261003/RUNBOOK.md(vco5 单管级标定)、pll_sch_20261003/SOP.md§9(div8 生成契约) - 交付物:
tb_div8.sp、div8_cells.sp、div8_run.sh、parse_cal.py(复用)、SOP.md、本文件 - 修订记录:2026-10-03 首版(div8 GHz 分频验证,风险关闭)
来源:
/home/rain/Documents/eda_tools_ins/design/div8_ghz_20261003/RUNBOOK.md| 最后更新:2026-10-03 23:08(由build/sync.py同步,请勿在站点侧修改)