SOP — 阶段 1 风险前置验证:div8 在 GHz 下能否分频¶
日期:2026-10-03 | 执行机:hpc-submit(192.168.31.28)| 工作区:
.28:/projects/design/rain01/proj1/verif/div8_0方案工作区:/home/rain/Documents/eda_tools_ins/design/div8_ghz_20261003上游:pll_sch_20261003/SOP.md§9(div8 生成);模型卡适配见smoke_20261003/SOP.md。
1. 背景¶
pll_sch_20261003/SOP.md §9.7 记的最大风险:div8 用通用静态 DFF(DFFPOSX1),而 vco5 空载可到 12 GHz——
若它跟不上,pll_top 的反馈链就得改结构。在画 cp/lpf/pfd/pll_top 之前先把它验掉,此刻返工成本最低。
2. 目标¶
可验证判据:OUT 频率 = CLK 频率 ÷ 8(误差 ≤1%)。
并设对照路:同一份 div8 结构由 1 GHz 理想脉冲驱动——若对照路也不分频,则问题是结构/网表而非速度。
3. 前置条件¶
.28上module load cadence && module load virtuoso/IC06.17.700(spectre/MMSIM151);- 模型卡适配副本
proj1/verif/models/spectre_nom.include(阶段 0 已验证); - 只读源:
/pdk/FreePDK45/osu_soc/lib/files/cells.sp; proj1/verif/div8_0/必须属rain01:root 建的目录会让脚本time.txt: Permission denied(本轮踩到,chown -R rain01:design修复)。
4. 影响范围¶
单机只读仿真:只在 proj1/verif/div8_0/ 下新建网表/波形/日志,不改任何 cell 与共享资源,无停服、无 GUI 窗口约束。
单点 40 ns 约 2–3 min;波形 8.5–11.9 MB。
5. 分步操作¶
步骤 1:从标准单元库抽子电路网表¶
cells.sp 是 HSPICE 风格(.subckt + 无括号器件行),而 tb 用 simulator lang=spectre;
把器件模型名换成项目模型名后,用 simulator lang=spice 包住即可两语混用。
S=/pdk/FreePDK45/osu_soc/lib/files/cells.sp
C=/projects/design/rain01/proj1/verif/div8_0
awk '/^\.subckt (DFFPOSX1|INVX1|CLKBUF1) /,/^\.ends/' $S \
| sed -e 's/ pmos / PMOS_VTL /' -e 's/ nmos / NMOS_VTL /' > /tmp/div8_cells.sp
{ echo 'simulator lang=spice'; cat /tmp/div8_cells.sp; echo 'simulator lang=spectre'; } > $C/div8_cells.sp
预期:3 个 .subckt、40 处模型名替换。坑:源库里器件写作 pmos/nmos,与项目模型卡(PMOS_VTL/NMOS_VTL)不同名,必须替换,否则报未定义模型。
步骤 2:顶层测试网表 tb_div8.sp¶
两路同一 div8 结构、只有时钟源不同:A 路时钟 = vco5(自由振荡,ic 打破对称解),B 路时钟 = 1 GHz 理想脉冲。
子电路端口顺序取自 cells.sp:CLKBUF1 A vdd gnd Y、DFFPOSX1 vdd D gnd Q CLK、INVX1 A Y vdd gnd。
步骤 3:运行¶
C=/projects/design/rain01/proj1/verif/div8_0
runuser -u rain01 -- bash $C/div8_run.sh 0.9 # 参数 = VCTRL 工作点,缺省 0.7
div8_run.sh 每次按 VCTRL 重新生成 tb_div8_v<tag>.sp(幂等),输出同名 .log 与 psf_v<tag>/。
实现体:div8_ghz_20261003/div8_run.sh(同步副本 $C/div8_run.sh)。
步骤 4:解析(复用 pll_cal_20261003/parse_cal.py)¶
cd $C
python3 parse_cal.py psf_v09 R0 1e-8 # VCO 输出
python3 parse_cal.py psf_v09 OUTA 1e-8 # div8(VCO 驱动)
python3 parse_cal.py psf_v09 OUTB 5e-9 # 1 GHz 对照组
坑:窗口参数是浮点秒(1e-8),写 10n 会报 PARSE_FAIL bad window_start。
6. 验证(2026-10-03 实测,nom corner / 27 °C)¶
| 工作点 | VCO R0 |
div8 OUTA |
OUTA×8 |
比值 | 结论 |
|---|---|---|---|---|---|
| VCTRL = 0.7 V | 4.8294 GHz | 603.68 MHz | 4829.4 MHz | 8.0004 | ÷8 ✓ |
| VCTRL = 0.9 V | 7.5656 GHz | 945.69 MHz | 7565.5 MHz | 8.0000 | ÷8 ✓ |
| 1 GHz 理想时钟(对照) | 1.000 GHz | 125.0018 MHz | 1000.0 MHz | 8.0000 | 结构正确 ✓ |
- 三路
SPECTRE_EXIT=0、0 error(2–8 warnings:ic初值误差提示、输出悬空,均无害); - 结论:GHz 分频风险关闭——
div8在 7.57 GHz 输入下仍精确 ÷8,无需改结构。
两条必须带走的实测事实
- 带载频率显著下降:
vco5接上div8负载后,VCTRL=0.7 V 由空载 7.87 → 4.83 GHz;0.9 V 由 12.23 → 7.57 GHz(约 −38%)。 ⇒pll_top的工作点与 VCTRL→频率曲线必须按带载数据取,不能沿用空载标定。 - 成本量级跳变:40 ns 瞬态 WALL 135 s(0.7 V)/ 186 s(0.9 V),波形 8.5 / 11.9 MB。
折算 ≈3400 s/µs(本网表含 2 个 div8、共 179 管),是
vco5单管级标定(144 s/µs、11 管)的 ≈24 倍。 ⇒test_lock若仍按 60 µs,单点 ≈56 核时(且尚未含 PFD/CP/LPF)。阶段 2 的时长与 HPC 派发口径必须据此重估。
7. 回滚¶
本验证不修改任何既有对象,删目录即回到原状(/pdk 源库与 pll45 各 cell 均未改动):
rm -rf /projects/design/rain01/proj1/verif/div8_0 # 高危:先确认路径
8. 风险说明¶
| 风险 | 缓解 |
|---|---|
| 单测不含 PFD/CP/LPF,不等于环路可跑 | 结论只覆盖"分频链能被 VCO 驱动到 7.57 GHz";环路行为待 pll_top 完成后验 |
OUT 悬空(无后级负载),比实际乐观 |
实际由 PFD 输入驱动,容性略增;结论按"至少到 7.57 GHz"取用 |
| 仅测 nom / 27 °C | ss/ff、85 °C 的速度边界未测;需要时用同一脚本换模型卡(spectre_{ss,ff}.include)重跑 |
| 40 ns 窗口较短(VCO 起振点在其内) | 解析窗口统一从 10 ns 起,落在稳态;每路 18–145 个周期,周期统计稳健 |
来源:
/home/rain/Documents/eda_tools_ins/design/div8_ghz_20261003/SOP.md| 最后更新:2026-10-03 23:08(由build/sync.py同步,请勿在站点侧修改)