SVF文件介绍
更新时间: 2026/04/27
在Gitcode上查看源码

1. SVF基本概述

SVF 是 Serial Vector Format 的缩写,常用于 JTAG (IEEE 1149.1) 场景。
它本质上是可读文本脚本,用于描述测试/烧录时序与向量数据,通常由开发工具生成,再由烧录或边界扫描工具执行。

在硬件升级流程中,SVF 常用于 FPGA/CPLD 等可编程器件的下载与验证,也可用于产线测试和板级调试。

说明:SVF 在不同领域有同名含义。本文默认指 JTAG 的 Serial Vector Format,不是 Autodesk 生态中的 Streaming Vector Format

1.1 缩写与术语表

缩写或写法英文全称 / 含义说明
SVFSerial Vector Format串行向量格式,JTAG 场景下为文本化向量脚本(勿与 Autodesk 的 Streaming Vector Format 混淆)
JTAGJoint Test Action Group业界通称;对应标准为 IEEE 1149.1,边界扫描 / 在线测试常用接口
IEEEInstitute of Electrical and Electronics Engineers电气电子工程师学会;文中 IEEE Std 1149.1 即 JTAG 边界扫描标准
TAPTest Access Port测试访问端口;芯片内 JTAG 控制器对外接口,含状态机与 TCK/TMS/TDI/TDO 等信号
IRInstruction Register指令寄存器;SIR 扫描的对象,用于选择器件当前执行的 JTAG 指令
DRData Register数据寄存器;SDR 扫描的对象,用于读写数据或配置位流
TCKTest ClockJTAG 测试时钟
TMSTest Mode Select模式选择,配合 TCK 驱动 TAP 状态迁移
TDITest Data In测试数据输入(移位链输入侧)
TDOTest Data Out测试数据输出(移位链输出侧);可与期望值比对做校验
TRST / TRST#Test Reset(低有效常写作 #可选硬件复位脚;未引出时可用 TMS 序列使 TAP 进入复位类状态
LSBLeast Significant Bit最低有效位;本文约定扫描数据常从 LSB 一侧先移入/移出
ASCIIAmerican Standard Code for Information Interchange美国信息交换标准代码;SVF 文件为可读文本编码
HzHertz赫兹;FREQUENCY 中声明的时钟频率单位
SEC / TCKRUNTEST 参数)Second / Test ClockRUNTEST 可按秒(SEC)或按 TCK 周期数等待
BMCBaseboard Management Controller基板管理控制器;可运行 SVF 解析并通过 GPIO 或专用硬件驱动 JTAG
CPLDComplex Programmable Logic Device复杂可编程逻辑器件;文中为 SVF/JTAG 升级的典型目标之一
FPGAField-Programmable Gate Array现场可编程门阵列;亦常用 SVF/JTAG 下载配置
PCPersonal Computer个人计算机;可连接下载器运行 SVF
ATEAutomatic Test Equipment自动测试设备;产线或实验室批量执行 SVF 的常见宿主
MCUMicrocontroller Unit单片机 / 微控制器;可作嵌入式 SVF 解析与 bit-bang JTAG 宿主
GPIOGeneral-Purpose Input/Output通用输入输出;软件模拟 JTAG 时常用 GPIO 连接 TCK/TMS/TDI/TDO
IDCODEIdentification Code(Device ID)器件标识寄存器读回值;用于确认 JTAG 链路与器件型号
UIDUnique Identifier唯一标识;升级包与固件对象匹配时常用
HIR / HDRHeader Instruction / Data Register头部位:正式 SIR/SDR 前附加的移位前缀
TIR / TDRTrailer Instruction / Data Register尾部位:正式 SIR/SDR 后附加的移位后缀
PIOParallel 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 关键字大小写不敏感
  • 注释规则:支持行内注释,以 !// 起始,起始符之后本行剩余内容视为注释(部分工具仅支持整行注释,不支持行尾注释,需以实际工具手册为准)
  • 扫描数据表示:扫描类语句的数据写在圆括号内,使用十六进制表示
  • 位宽约束:扫描数据长度不能超过语句声明的比特长度;若超过,超出部分的高位会被丢弃
  • 位序约定:扫描数据按最低有效位(最右侧)优先的顺序处理,适用于 TDITDOMASK

示例(简化):

svf
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 停在哪、走哪条路)

指令作用(通俗版)常见示例
ENDDRDR 扫描结束后,TAP 回到什么状态(常见 IDLEPAUSEENDDR IDLE;
ENDIRIR 扫描结束后,TAP 回到什么状态ENDIR IDLE;
STATE让 TAP 进入指定状态(如复位、空闲)STATE RESET; / STATE IDLE;
RUNTESTRun-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/HIRTDR/TIR 主要用于链路对齐与多器件场景

3.3 时序与复位控制类(速度与复位信号)

指令作用(通俗版)示例示例解释
FREQUENCY声明可用的 JTAG 时钟上限(Hz)FREQUENCY 10E6 HZ;声明后续操作可使用不高于 10 MHz 的 TCK 频率(10E610,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 简化片段示例(按执行顺序理解)

svf
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 两个易混淆点

  1. HDR/HIRTDR/TIR 不是必须项
    在简单单器件场景中,常仅使用 SIR/SDR;多器件链路或需要填充位时再引入头尾位。
  2. ENDDR/ENDIR 只定义扫描后的目标状态
    它们不改变当前扫描的数据本身,而是影响扫描结束时 TAP 停留位置。

4. 在升级流程中的使用方式

BMC 支持通过 SVF 对 CPLD 进行升级。其本质是:解析 SVF 中的扫描数据与控制指令(如 TDI 数据字段、SIRSDR 等语句),并通过 JTAG 链路驱动 TDITMSTCK 等信号,按既定时序将配置数据下发到目标 CPLD,最终完成升级。 是否需要控制 TRST 信号取决于硬件设计:若板级已引出并接入该引脚,可在流程中使用;若未引出,则通常通过 TMS 序列完成 TAP 复位。

典型流程如下:

  1. 由原厂工具或工程工具链导出 SVF 文件
  2. 使用支持 JTAG/SVF 的执行工具加载该文件
  3. 连接目标板卡并校验 JTAG 链路(器件顺序、IDCODE)
  4. 执行 SVF,完成烧录/配置
  5. 读取状态或回读关键寄存器进行结果确认

注意事项:

  • 版本匹配:SVF 与目标器件型号、工程版本需严格一致
  • 链路一致性:JTAG 链顺序变化会导致向量错位
  • 时序要求:某些器件对 RUNTEST 等等待时长敏感
  • 供电与复位:升级前应确认电源、时钟、复位状态稳定

4.1 参考实现补充(general_hardware)

结合 general_hardware 的实现,BMC 侧基于 SVF 升级 CPLD 的工程化流程可进一步归纳为:

  1. 升级包匹配与解包
    • 根据 Firmware 包名匹配配置项(update.cfg),再按 uid/system_id 过滤目标 CPLD 对象
    • 升级前先安全解包到临时目录,再按文件命名规则装载
  2. 文件组织与命名约定
    • 单厂商常见命名:cpld.svf + valid.svf + bypass.svf
    • 多器件/多厂商常见命名:cpld01.svfvalid01.svfbypass01.svf(按 file_id 递增)
    • valid 文件用于后续生效阶段,bypass 文件用于链路偏移/对齐场景
  3. 链路准备与串行执行
    • 升级前切换到 firmware route(switch_to_firmware_route
    • 按需使能 bypass 模式,并通过 set_upg_cpld_chip 选中目标链上器件
    • 逐片执行升级,单片完成后短暂等待,再继续下一片
  4. 总线锁与并发保护
    • 升级与校验前尝试获取芯片锁(带重试和超时),避免并发访问同一硬件通道
    • 成功后执行 SVF 写入流程,结束后立即解锁
  5. 校验与生效管理
    • 升级成功后保存 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 数组为空,表示业务流程成功调用了扫链接口,但返回的链路扫描结果为空

定位思路:

  1. 排查 CSR 中配置的硬件链路是否正确
  2. 排查实际硬件链路是否正常(连接、供电、时钟、复位、信号完整性等)

验证命令:

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

定位思路:

  1. 先排查 CSR 配置的链路是否符合预期(例如应使用 jtag0 还是 jtag1
  2. 若日志中 sample非 0,优先排查 SVF 文件本身是否有问题(指令/位宽/掩码/目标器件不匹配)
  3. sample 值为 0,通常表示链路基本未读到有效值,需要从硬件侧观察 CPLD 的 TDO 波形

6. SVF文件加载与执行流程(深入)

SVF 的加载过程可以理解为:SVF 解析器(运行在 PC、ATE 或嵌入式 MCU)逐行读取文本指令,并翻译为 JTAG 硬件接口上的精确时序波形。

核心逻辑如下:

下面详细拆解关键步骤。

6.1 初始化阶段

在解析任何 SVF 命令之前,解析器需完成以下基础设置:

  • 硬件接口初始化:配置 JTAG 引脚(TCKTMSTDITDO),设置初始 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
  • 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 实现注意事项(常见坑点)

  1. TAP 状态迁移精确性
    STATE 可指定中间态(如 SELECT-DR-SCAN),解析器需从当前态计算合法路径并输出正确 TMS 序列。
  2. HDR/HIRTDR/TIR 的拼接处理
    这些前后缀会影响后续 SIR/SDR 的实际移位位流;若拼接错误会导致链路对齐失败。
  3. RUNTEST 时间精度
    使用 SEC 时需结合当前频率准确换算时钟数,并明确取整策略,避免累积时序偏差。
  4. 长位流命令的内存管理
    超长 SDR(如 FPGA 配置位流)建议流式处理,边解析边下发,避免一次性分配大缓冲。

6.5 小结

SVF 加载本质是一个解释执行过程,关键在于:

  • 正确实现 JTAG 底层时序与 TAP 状态机控制
  • 稳健地解析文本命令并执行校验、错误中止与资源管理策略

这些细节处理到位,SVF 解析器才能稳定完成器件编程与测试任务。