# HPM5301:25/30 MHz 时序资格测试(2026-09-13) 本套 MKLINK V4 + HPM5301 接线下,修正时序后的 30 MHz 开发路径通过两次 30 秒单变量采集,分别为 **109.236、108.955 kSa/s**。25 MHz 为 **95.654 kSa/s**。这是带真实 probe 时间戳、包含批间间隔的 `mem_dump` 平均采样率,不是按单个短间隔倒数推算的峰值。 没有测试普通 `mem_read` / `mem_write` 或 RTT 性能,没有修改目标程序或写目标存储器。本记录不构成全部 V4、其他接线、温度或目标系列的高频资格声明,也没有把 30 MHz 添加为正式 GUI/CLI/MCP 档位。 ## 环境与最终固件 - 探针 USB serial:`2411953D4BB4FB02`,命令口 `COM488`;UF2 磁盘核对同一 serial 和 Board-ID 后升级。 - 目标 IDCODE:`0x1000563d`。HPM5301 运行 RTOS 测试程序;RAM 单变量地址 `0x82a40`。 - 目标镜像:`hello_world/hpm5301evklite_flash_xip_rtos/output/demo.bin`,78464 B,基址 `0x80000400`,SHA256 `e1cd3528a4de56f903cc3e6a0b2ac59e77e8280435b739bf12d12a298830576a`。 - 已知内容校验:4 B 使用 `0x80003000`,字节 `97 e1 07 80`,特意包含 data bit31=1;64 B 和 4 KB 使用 `0x80001420`,逐块对照上述镜像。 - LA5032 / KingstVIS,本机 TCP CLI,500 MSa/s;CH0=TDI、CH1=TMS、CH2=TCK、CH3=TDO。保存原始 KV DAT、数字边沿 CSV、JTAG 解码 CSV。没有用界面标称频率代替测量。 - 最终已安装 UF2:`751049018b8cf90150d55f857b367a846af99b8e11961c73192c4c8e0e65f717`,1,563,648 B;升级回执 `.build/stage8/final30sep13/upgrade.json`。注释整理后重新构建得到相同摘要。 - 25 MHz 合格候选 UF2:`7a8989b8d6148610759b2ca2661a7ef56407048a9f80fa42a920d2ffebbeff05`。 - 原始稳定基线 UF2:`9a3380469ca2e92a816656805df1e941ce69a9eaa7896602fcc50c2a2090384a`,保留于 `.build/stage12/baseline/HPMLink.uf2`。 SES 8.24 Debug 构建和 post-build 生成 HPMLink.uf2,未改 UF2 family/base。最终链接 ILM 使用 127932 B、空余 3046 B(另有 94 B 对齐损耗);DLM 使用 129345 B、空余 911 B,未缩小堆或增加采样缓存。 现有 4/10/20 MHz 内核与正式上位机三档保留。`JTAG_DMI_TRIAL_HZ` 在这份开发源码中为 30000000;改为 25000000 并重新构建可复现 25 MHz 候选。为避免挤占 ILM,只驻留一个额外实验内核。开发路径继续限制 HPM5301 单 TAP、41 位 DMI、5 位 IR、probe CPU 360 MHz,其他配置走兼容路径。 ## 修复内容及失败证据 1. 直接减少延时到约 25.58 MHz 的第一版失败,高电平约 8 ns。USB CRC 正常不能证明采样值正确;发现错值或错误帧立即停止采样。 2. 把下一位 TDI 地址计算移到高电平期间,高/低电平调整为约 20/20 ns 后仍失败,线上 DMI 也出现异常。最后一位的 TMS 切换后原先立即升 TCK,退出 Shift-DR 的建立时间不足。25 MHz 内核在该处单独保留 PAD 4;这只增加每次扫描的一次过渡成本。 3. 修正退出 TMS 后,线上返回正确,但探针读值仍可变成 `2e c3 0f 00`,即期待值 `0x8007e197` 左移一位后的低 32 位。TDO 输入延迟必须单独处理,不能通过 CRC 或 DMI 状态替代数据内容校验。 4. 25 MHz 最终在下降沿后 PAD 3 再读取 GPIO 输入,利用输入同步延迟取回本位;每一位的移位与打包指令均保留。PAD 2 的前一候选仍得到旧位。 5. 30 MHz 简单继续减延时仍失败(实测 29.586 MHz)。最终改成明确的一位流水线:首位预移入;后续时钟读取上一位的 GPIO 输入;停钟并充分等待后收尾第 40 位。41 个请求位和 41 个响应位全部保留,包含状态与地址位。不是读错后对数据做经验性移位纠正。 6. 30 MHz 的退出 TMS 在倒数第二位上升沿之后提前设置,为最后一位提供建立时间,同时保持最后一位采样窗口。保留关中断范围、ABI、原有 TAP 进入/退出与 additional-idle 时钟数。 `scripts/test_jtag_dmi_fast.py` 对 SES 实际汇编对象执行 **6976** 个扫描模型用例,覆盖所有 41 位、TAP/idle、GPIO 掩码、中断、ABI、C 路由/状态及关闭功能时的回退;30 MHz 模型另外验证预移入和最终收尾,共 42 次 GPIO 读取。模型只验证一位流水线的数字逻辑,物理输入窗口以本轮 LA 和已知数据校验为依据。 ## 实测 TCK 只统计 JTAG 解码确认的完整 41 位 Shift-DR 内相邻上升沿,排除 IR、TAP 过渡和普通 C 时钟。500 MSa/s 的 2 ns 量化不支持把下面小数视为校准仪表精度。 | 路径 | 平均移位时钟 | 高电平中位数 | 低电平中位数 | 完整 DMI 响应 | 非零线上状态 | |---|---:|---:|---:|---:|---:| | 原始 20 MHz | 19.909 MHz | 18 ns | 34 ns | 3027 | 0 | | 修正后 25 MHz | 25.393 MHz | 14 ns | 24 ns | 2879 | 0 | | 修正后 30 MHz | 29.810 MHz | 18 ns | 16 ns | 2811 | 0 | 25 MHz 扫描最后一位有额外 TMS 建立时间,因此其最大位周期不能当作持续移位频率。 ## 单变量持续采样 请求周期 1 µs,进入既有满速模式,不保证 1 MHz 定时。排除采样开始后的前 200 ms,使用 probe 时间戳计算平均速率;所有列出的采样时间均保留批间间隔。RAM 为运行中变化的变量;确定性数据完整性另用 Flash 镜像检验。 | 固件/路径 | 测试时长 | 有效样本数 | kSa/s | p99 间隔 | 最大间隔 | |---|---:|---:|---:|---:|---:| | 原始稳定固件 20 MHz 基线 | 3 s | 256560 | 94.559 | 78 µs | 279 µs | | 最终候选固件 20 MHz 对照 | 30 s | 2571720 | 86.842 | 96 µs | 300 µs | | 25 MHz 候选 | 30 s | 2837664 | 95.654 | 91 µs | 301 µs | | 30 MHz 候选,第 1 次 | 30 s | 3240912 | 109.236 | 71 µs | 274 µs | | 30 MHz 候选,第 2 次 | 30 s | 3232488 | 108.955 | 70 µs | 277 µs | 30 MHz 两次长测共 **6473400** 个有效单变量样本,CRC、解析丢帧、固件错误标志、DMI reserved/failed/busy 增量全部为 0;均无超过 1 ms 的单变量间隔。USB 队列 full、errors 和 blocked_us 未增长为非零;不能据此保证任意主机冻结下无阻塞。 解析器启动时丢弃的 44–50 B 命令回显另行记录,不计为协议丢帧。最终采集停止后,已设置 10 MHz 并关闭连接,状态保存在证据根目录 `final_idle.json`。 必须保留基线区别:相对原始 20 MHz 短测,30 MHz 收益约 **15.2%–15.5%**;相对同一候选固件的 20 MHz 长测约 **25.5%–25.8%**。候选固件 20 MHz 比原始短基线低,不能把两者混写成同一基线,更不能宣称原有三档性能完全无回退。时长/固件布局/批间调度影响尚未独立归因,正式推广前应继续等时 A/B 测试。 ## 多变量与 4 KB 周期块采样 64 B 是 16 个连续 32 位 word,走小块批采样;4 KB 每个逻辑样本由两个 2048 B B1 帧组成,走大块路径。并非普通单次内存读取。 | 路径 | 64 B,30 秒已知内容校验 | 完整 64 B 样本 | 4 KB 周期样本/s | 4 KB 有效载荷 MiB/s | 4 KB 完整样本数 | |---|---:|---:|---:|---:|---:| | 20 MHz 候选内对照 | — | — | 206.187 | 0.805 | 561 | | 25 MHz | 8.675 kSa/s / 0.529 MiB/s | 256848 | 230.845 | 0.902 | 623 | | 30 MHz | 9.122 kSa/s / 0.557 MiB/s | 270312 | 242.682 | 0.948 | 663 | 4 KB 各采集 3 秒,周期取相邻逻辑样本首块的 probe 时间戳;有效完整样本按收到最后一块计数,停止时的末尾半个样本不计为完整样本。MiB/s 为周期频率 × 4096 / 1048576,不含帧头/CRC,不把两个 B1 帧算成两个 4 KB 样本。4 KB 本身需要约 4–5 ms,不能把此间隔算作异常长采样停顿。 上述已知内容逐块校验全部相等,CRC、DMI、固件错误标志为 0。最终 UF2 重新升级后还在 4 MHz、10 MHz 做了各 3 秒 64 B 内容回归,分别验证 6672、13392 个完整样本,均通过。 ## 剩余瓶颈与应用边界 30 MHz 单变量批内间隔中位数为 6 µs,24 个样本之间的批边界间隔中位数约 57 µs。按批边界对齐统计,该间隔约占总时间的 30%;这包含逐样本帧编码/CRC、任务调度和 USB 交接,不能全部归为 USB 阻塞。 链接 map 仍把 `riscv_debug_sample_batch`、`riscv_stream_short_exchange` 和 `dump_cycle_now` 放在 XIP(0x800...),只有底层移位内核等在 ILM。这是下一轮可以单独 A/B 的方向;本轮没有扩大缓存、改变 USB 协议、删掉数据校验或继续升到 30 MHz 以上。 本轮通过的是 probe `mem_dump` 实机流与 LA 测量,不是新增 GUI 档位的点击验收。正式 GUI/CLI/MCP 默认 10 MHz、低/中/高为 4/10/20 MHz 的约定继续保留;实验 30 MHz 使用开发固件命令 `cmd.set_swd_clock(30000000)`,必须在空闲命令会话设置,流停止后再切档。25 MHz 需要对应的独立候选固件,不能在当前 30 MHz 候选中假定两者同时驻留。 ## 证据索引 采集根目录: `E:/software/HPM5300/sdk_env_v1.11.0/hpm_sdk/samples/hello_world/.mklink/perf_hpm5301_20260910/stage12` - `summary.json`:主要成功用例、频率、内容校验和批间统计。 - `baseline20-released`、`control20-long`:两种明确区分的 20 MHz 基线。 - `trial25delay3-ram4-long`、`trial25delay3-flash64-long`、`trial25delay3-flash4096`。 - `trial30lag-ram4-long`、`trial30lag-ram4-repeat`、`trial30lag-flash64-long`、`trial30lag-flash4096`。 - `baseline20-logic`、`trial25delay3-logic`、`trial30lag-logic`、`final30-logic`:LA 原始文件、解码和 JSON。 - 失败版本保留在 `trial25-logic`、`trial25-pipe-logic`、`trial25balanced-logic`、`trial25deferredtms-logic`、`trial25tms-logic`、`trial30delay1-logic`,不得将其数据混入成功样本。 - `bench.py`、`logic.py`、`analyze_dmi.py`:可复现实验入口,均串行独占同一探针。`bench.py 30000000 30 <新目录名> ram4`;换 `flash64` / `flash4096` 测已知镜像内容。 - 固件目录 `.build/stage12/model-final30.log`、`.build/stage12/build-final30.log`;UF2 和源码快照在 `.build/stage12/qualified25` / `qualified30`。