1. SVF基本概述
SVF 是 Serial Vector Format 的缩写,常用于 JTAG (IEEE 1149.1) 场景。
它本质上是可读文本脚本,用于描述测试/烧录时序与向量数据,通常由开发工具生成,再由烧录或边界扫描工具执行。
在硬件升级流程中,SVF 常用于 FPGA/CPLD 等可编程器件的下载与验证,也可用于产线测试和板级调试。
说明:
SVF在不同领域有同名含义。本文默认指 JTAG 的Serial Vector Format,不是 Autodesk 生态中的Streaming Vector Format。
1.1 缩写与术语表
| 缩写或写法 | 英文全称 / 含义 | 说明 |
|---|---|---|
| SVF | Serial Vector Format | 串行向量格式,JTAG 场景下为文本化向量脚本(勿与 Autodesk 的 Streaming Vector Format 混淆) |
| JTAG | Joint Test Action Group | 业界通称;对应标准为 IEEE 1149.1,边界扫描 / 在线测试常用接口 |
| IEEE | Institute of Electrical and Electronics Engineers | 电气电子工程师学会;文中 IEEE Std 1149.1 即 JTAG 边界扫描标准 |
| TAP | Test Access Port | 测试访问端口;芯片内 JTAG 控制器对外接口,含状态机与 TCK/TMS/TDI/TDO 等信号 |
| IR | Instruction Register | 指令寄存器;SIR 扫描的对象,用于选择器件当前执行的 JTAG 指令 |
| DR | Data Register | 数据寄存器;SDR 扫描的对象,用于读写数据或配置位流 |
| TCK | Test Clock | JTAG 测试时钟 |
| TMS | Test Mode Select | 模式选择,配合 TCK 驱动 TAP 状态迁移 |
| TDI | Test Data In | 测试数据输入(移位链输入侧) |
| TDO | Test Data Out | 测试数据输出(移位链输出侧);可与期望值比对做校验 |
| TRST / TRST# | Test Reset(低有效常写作 #) | 可选硬件复位脚;未引出时可用 TMS 序列使 TAP 进入复位类状态 |
| LSB | Least Significant Bit | 最低有效位;本文约定扫描数据常从 LSB 一侧先移入/移出 |
| ASCII | American Standard Code for Information Interchange | 美国信息交换标准代码;SVF 文件为可读文本编码 |
| Hz | Hertz | 赫兹;FREQUENCY 中声明的时钟频率单位 |
SEC / TCK(RUNTEST 参数) | Second / Test Clock | RUNTEST 可按秒(SEC)或按 TCK 周期数等待 |
| BMC | Baseboard Management Controller | 基板管理控制器;可运行 SVF 解析并通过 GPIO 或专用硬件驱动 JTAG |
| CPLD | Complex Programmable Logic Device | 复杂可编程逻辑器件;文中为 SVF/JTAG 升级的典型目标之一 |
| FPGA | Field-Programmable Gate Array | 现场可编程门阵列;亦常用 SVF/JTAG 下载配置 |
| PC | Personal Computer | 个人计算机;可连接下载器运行 SVF |
| ATE | Automatic Test Equipment | 自动测试设备;产线或实验室批量执行 SVF 的常见宿主 |
| MCU | Microcontroller Unit | 单片机 / 微控制器;可作嵌入式 SVF 解析与 bit-bang JTAG 宿主 |
| GPIO | General-Purpose Input/Output | 通用输入输出;软件模拟 JTAG 时常用 GPIO 连接 TCK/TMS/TDI/TDO |
| IDCODE | Identification Code(Device ID) | 器件标识寄存器读回值;用于确认 JTAG 链路与器件型号 |
| UID | Unique Identifier | 唯一标识;升级包与固件对象匹配时常用 |
| HIR / HDR | Header Instruction / Data Register | 头部位:正式 SIR/SDR 前附加的移位前缀 |
| TIR / TDR | Trailer Instruction / Data Register | 尾部位:正式 SIR/SDR 后附加的移位后缀 |
| PIO | Parallel I/O | 并行 I/O;SVF 扩展指令,非所有工具实现 |
| PATHDATA | (扩展指令名) | 部分工具链扩展;非核心 JTAG/SVF 必备 |
| SVF_MISMATCH | (实现侧错误码示例) | 表示 TDO 等回读与期望不一致导致中止 |
2. SVF文件结构与常见指令
SVF 文件由一系列指令组成,每条指令以分号结尾,常见内容包括:
SIR:Shift Instruction Register,向 IR 移位指令SDR:Shift Data Register,向 DR 移位数据RUNTEST:保持一定时钟周期或时间,用于等待器件内部操作完成STATE:切换 TAP 状态机状态TRST:复位测试逻辑(按平台支持情况使用)ENDIR/ENDDR:设置 IR/DR 移位结束后的目标状态
SVF 语法规则补充说明:
- 文件形式:SVF 文件是由多条 SVF 语句构成的 ASCII 文本文件
- 语句结构:一条 SVF 语句由“指令 + 参数”组成,以
;作为结束标记 - 多行支持:单条 SVF 语句可跨多行书写;单行最大长度通常为 256 个字符
- 大小写规则:SVF 关键字大小写不敏感
- 注释规则:支持行内注释,以
!或//起始,起始符之后本行剩余内容视为注释(部分工具仅支持整行注释,不支持行尾注释,需以实际工具手册为准) - 扫描数据表示:扫描类语句的数据写在圆括号内,使用十六进制表示
- 位宽约束:扫描数据长度不能超过语句声明的比特长度;若超过,超出部分的高位会被丢弃
- 位序约定:扫描数据按最低有效位(最右侧)优先的顺序处理,适用于
TDI、TDO和MASK
示例(简化):
TRST OFF; // 关闭可选 TRST#,仅用 TMS 序列控制 TAP
ENDIR IDLE; // IR 扫描结束后进入 Run-Test/Idle(IDLE)
ENDDR IDLE; // DR 扫描结束后进入 Run-Test/Idle(IDLE)
SIR 8 TDI (AB); // 向指令寄存器移入 8 位指令 0xAB
SDR 32 TDI (12345678) TDO (XXXXXXXX) MASK (00000000); // 向数据寄存器移入 32 位;TDO/MASK 为占位示例(MASK 全 0 表示不校验 TDO)
RUNTEST 100 TCK; // 在 Run-Test/Idle 下输出 100 个 TCK 周期3. SVF核心指令介绍(按功能分组)
根据常见实践(含 IEEE Std 1149.1 相关约定与行业工具通用用法),可将 SVF 指令按功能分组理解为“状态控制、扫描执行、时序复位、扩展指令”四大类。
3.1 状态控制类(让 TAP 停在哪、走哪条路)
| 指令 | 作用(通俗版) | 常见示例 |
|---|---|---|
ENDDR | DR 扫描结束后,TAP 回到什么状态(常见 IDLE 或 PAUSE) | ENDDR IDLE; |
ENDIR | IR 扫描结束后,TAP 回到什么状态 | ENDIR IDLE; |
STATE | 让 TAP 进入指定状态(如复位、空闲) | STATE RESET; / STATE IDLE; |
RUNTEST | 在 Run-Test/Idle 保持一段时间或一定时钟周期 | RUNTEST 5000E-6 SEC; / RUNTEST 100 TCK; |
通俗理解:
ENDDR/ENDIR是“扫完后去哪里”STATE是“立刻去哪里”RUNTEST是“在空闲区等待多久”
3.2 扫描操作类(真正移位与校验)
| 指令 | 作用(通俗版) | 典型格式 | 格式解释 |
|---|---|---|---|
SIR | 扫描 IR,选择待执行 JTAG 指令 | SIR 8 TDI (55); | 8 表示扫描位宽为 8 bit;TDI(55) 表示移入的 IR 数据为 0x55。 |
SDR | 扫描 DR,执行读写数据与可选回读校验 | SDR 16 TDI (1234) TDO (ABCD) MASK (FFFF); | 16 为 DR 位宽;TDI 为移入值;TDO 为期望回读值;MASK 指定参与比较的位(1 参与,0 忽略)。 |
HIR / HDR | 在正式扫描前追加前导位(链路对齐/绕过) | HIR 4 TDI (0); | HIR 作用于 IR 链,HDR 作用于 DR 链;示例表示在正式扫描前先追加 4 bit 前导数据。 |
TIR / TDR | 在正式扫描后追加尾随位 | TDR 4 TDI (0); | TIR 作用于 IR 链,TDR 作用于 DR 链;示例表示在正式扫描后追加 4 bit 尾随数据。 |
通俗理解:
SIR负责“选命令”SDR负责“传数据 + 可选验证”HDR/HIR与TDR/TIR主要用于链路对齐与多器件场景
3.3 时序与复位控制类(速度与复位信号)
| 指令 | 作用(通俗版) | 示例 | 示例解释 |
|---|---|---|---|
FREQUENCY | 声明可用的 JTAG 时钟上限(Hz) | FREQUENCY 10E6 HZ; | 声明后续操作可使用不高于 10 MHz 的 TCK 频率(10E6 即 10,000,000 Hz)。 |
TRST | 控制可选 TRST# 复位信号 | TRST ON; / TRST OFF; | TRST ON 表示使能复位(通常将低有效 TRST# 拉低);TRST OFF 表示释放复位。 |
注意:
FREQUENCY常用于约束或提示执行工具按该上限工作TRST依赖硬件是否提供该引脚
3.4 扩展/并行类指令(工具相关,较少使用)
| 指令 | 说明 |
|---|---|
PIO | 并行读写一组引脚(非 JTAG 核心指令) |
PIOMAP | 将 PIO 通道映射到物理引脚 |
说明:PIO/PIOMAP 不属于通用 JTAG/SVF 核心流程,常见于特定测试平台。若目标是常规烧录/调试,可暂不使用。
3.5 简化片段示例(按执行顺序理解)
ENDDR IDLE; // 设置 DR 扫描结束行为
ENDIR IDLE; // 设置 IR 扫描结束行为
FREQUENCY 10E6 HZ; // 最高频率 10MHz
STATE RESET; // 进入复位状态
STATE IDLE; // 转入空闲状态
SIR 8 TDI (FF); // 扫描指令:示例值
SDR 16 TDI (1234) TDO (5678) MASK (FFFF); // 扫描数据:写入并校验返回值
RUNTEST 1E-3 SEC; // 等待 1ms
STATE IDLE; // 结束状态3.6 两个易混淆点
HDR/HIR与TDR/TIR不是必须项
在简单单器件场景中,常仅使用SIR/SDR;多器件链路或需要填充位时再引入头尾位。ENDDR/ENDIR只定义扫描后的目标状态
它们不改变当前扫描的数据本身,而是影响扫描结束时 TAP 停留位置。
4. 在升级流程中的使用方式
BMC 支持通过 SVF 对 CPLD 进行升级。其本质是:解析 SVF 中的扫描数据与控制指令(如 TDI 数据字段、SIR、SDR 等语句),并通过 JTAG 链路驱动 TDI、TMS、TCK 等信号,按既定时序将配置数据下发到目标 CPLD,最终完成升级。 是否需要控制 TRST 信号取决于硬件设计:若板级已引出并接入该引脚,可在流程中使用;若未引出,则通常通过 TMS 序列完成 TAP 复位。
典型流程如下:
- 由原厂工具或工程工具链导出 SVF 文件
- 使用支持 JTAG/SVF 的执行工具加载该文件
- 连接目标板卡并校验 JTAG 链路(器件顺序、IDCODE)
- 执行 SVF,完成烧录/配置
- 读取状态或回读关键寄存器进行结果确认
注意事项:
- 版本匹配:SVF 与目标器件型号、工程版本需严格一致
- 链路一致性:JTAG 链顺序变化会导致向量错位
- 时序要求:某些器件对
RUNTEST等等待时长敏感 - 供电与复位:升级前应确认电源、时钟、复位状态稳定
4.1 参考实现补充(general_hardware)
结合 general_hardware 的实现,BMC 侧基于 SVF 升级 CPLD 的工程化流程可进一步归纳为:
- 升级包匹配与解包
- 根据
Firmware包名匹配配置项(update.cfg),再按uid/system_id过滤目标 CPLD 对象 - 升级前先安全解包到临时目录,再按文件命名规则装载
- 根据
- 文件组织与命名约定
- 单厂商常见命名:
cpld.svf+valid.svf+bypass.svf - 多器件/多厂商常见命名:
cpld01.svf、valid01.svf、bypass01.svf(按file_id递增) valid文件用于后续生效阶段,bypass文件用于链路偏移/对齐场景
- 单厂商常见命名:
- 链路准备与串行执行
- 升级前切换到 firmware route(
switch_to_firmware_route) - 按需使能 bypass 模式,并通过
set_upg_cpld_chip选中目标链上器件 - 逐片执行升级,单片完成后短暂等待,再继续下一片
- 升级前切换到 firmware route(
- 总线锁与并发保护
- 升级与校验前尝试获取芯片锁(带重试和超时),避免并发访问同一硬件通道
- 成功后执行 SVF 写入流程,结束后立即解锁
- 校验与生效管理
- 升级成功后保存
valid_*(及bypass_*)文件,供后续生效任务使用 - 冷生效路径通常由系统在后续阶段统一执行;热生效路径可按 chip 粒度快速生效
- 失败场景应删除残留生效文件并清理标志,避免下次误生效
- 升级成功后保存
4.2 安全自检场景(verify.svf)
CPLD 通过 verify.svf 实现安全自检流程:
- 升级后可加载
verify.svf(或verify01.svf等)进行 JTAG 侧回归校验 - 多厂商场景下,按 chip 信息映射到对应
verifyXX.svf,逐片校验 - 若校验失败或锁获取失败,流程应立即返回错误并记录审计日志
上述做法可显著提升 SVF 升级在量产环境下的可追踪性、并发安全性与生效可靠性。
5. 常见问题与排查建议
5.1 扫链失败(扫链结果为空)
现象:
- BMC
app.log中出现:[cpld]get cpld device info failed - 同时
framework.log中出现:get cpld id:[] success id数组为空,表示业务流程成功调用了扫链接口,但返回的链路扫描结果为空
定位思路:
- 排查 CSR 中配置的硬件链路是否正确
- 排查实际硬件链路是否正常(连接、供电、时钟、复位、信号完整性等)
验证命令:
mdbctl call Cpld_1_010101 bmc.kepler.Chip.JtagTarget GetChipIdcode 0
5.2 升级失败(TDO 校验不通过)
现象:
linuxkernel_log中出现日志:verify TDO [0] expect:03b, mask: 0xff, sample:0x0
含义:
- 升级使用的 SVF 文件中,期望值(
expect)是0x3b - 实际从 CPLD 链路读到的 TDO 采样值(
sample)是0x0
定位思路:
- 先排查 CSR 配置的链路是否符合预期(例如应使用
jtag0还是jtag1) - 若日志中
sample值非 0,优先排查 SVF 文件本身是否有问题(指令/位宽/掩码/目标器件不匹配) - 若
sample值为 0,通常表示链路基本未读到有效值,需要从硬件侧观察 CPLD 的 TDO 波形
6. SVF文件加载与执行流程(深入)
SVF 的加载过程可以理解为:SVF 解析器(运行在 PC、ATE 或嵌入式 MCU)逐行读取文本指令,并翻译为 JTAG 硬件接口上的精确时序波形。
核心逻辑如下:
下面详细拆解关键步骤。
6.1 初始化阶段
在解析任何 SVF 命令之前,解析器需完成以下基础设置:
- 硬件接口初始化:配置 JTAG 引脚(
TCK、TMS、TDI、TDO),设置初始 TCK 频率(常见默认 1MHz 或更低,再由FREQUENCY动态调整) - 状态机复位:通过 TMS 序列将 TAP 强制复位到
Test-Logic-Reset,确保链上器件处于已知初态 - 参数初始化:清空内部上下文,如
HDR/HIR/TDR/TIR缓存与默认ENDDR/ENDIR状态
6.2 逐行解析与执行(核心循环)
解析器按顺序读取每条语句,忽略注释,识别命令与参数,调用底层 JTAG 驱动完成执行。
常见命令执行逻辑示例:
FREQUENCY 10000000 HZ;- 重新配置 TCK 频率
- 后续
SIR/SDR在新频率下执行
STATE RESET;- 通过 TMS 输出特定序列(例如保持高电平并给出 5 个 TCK)进入
Test-Logic-Reset
- 通过 TMS 输出特定序列(例如保持高电平并给出 5 个 TCK)进入
SIR 6 TDI(09);- 进入
Shift-IR - 按位序串行移入 6 位指令数据
- 退出到
Update-IR使指令生效 - 根据
ENDIR停留到目标状态(默认常见为Run-Test/Idle)
- 进入
SDR 32 TDI(00000000) TDO(0484a093) MASK(0fffffff);- 进入
Shift-DR - 在移入
TDI同时采集TDO - 按
MASK指定位对比采样值与期望TDO - 不匹配则立即报错并停止(
SDR既传输也验证) - 根据
ENDDR退出到目标状态
- 进入
RUNTEST 10000 TCK;- 保持
Run-Test/Idle状态,输出指定数量 TCK 周期
- 保持
6.3 错误处理与流程控制
- TDO 校验失败:
SIR/SDR期望值与实测值不一致时立即中止,并返回错误码(如SVF_MISMATCH) - 语法错误:命令无法识别、参数格式非法(如错误十六进制字符)时停止加载
- 超时/资源错误:
RUNTEST超出平台限制、内存分配失败等均可触发终止
6.4 实现注意事项(常见坑点)
- TAP 状态迁移精确性
STATE可指定中间态(如SELECT-DR-SCAN),解析器需从当前态计算合法路径并输出正确 TMS 序列。 HDR/HIR与TDR/TIR的拼接处理
这些前后缀会影响后续SIR/SDR的实际移位位流;若拼接错误会导致链路对齐失败。RUNTEST时间精度
使用SEC时需结合当前频率准确换算时钟数,并明确取整策略,避免累积时序偏差。- 长位流命令的内存管理
超长SDR(如 FPGA 配置位流)建议流式处理,边解析边下发,避免一次性分配大缓冲。
6.5 小结
SVF 加载本质是一个解释执行过程,关键在于:
- 正确实现 JTAG 底层时序与 TAP 状态机控制
- 稳健地解析文本命令并执行校验、错误中止与资源管理策略
这些细节处理到位,SVF 解析器才能稳定完成器件编程与测试任务。