跳转至

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,无需改结构。

两条必须带走的实测事实

  1. 带载频率显著下降:vco5 接上 div8 负载后,VCTRL=0.7 V 由空载 7.87 → 4.83 GHz;0.9 V 由 12.23 → 7.57 GHz(约 −38%)。 ⇒ pll_top 的工作点与 VCTRL→频率曲线必须按带载数据取,不能沿用空载标定。
  2. 成本量级跳变: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 同步,请勿在站点侧修改)