1. VME基本概述
VME 文件(Virtual Machine Environment file)是莱迪思半导体(Lattice Semiconductor)在 ispVM Embedded 体系中定义并推广的专有文件格式。
从工程实现角度看,VME 可理解为将 SVF(Serial Vector Format,串行向量格式)中的文本指令与数据转换为面向执行侧的紧凑表示(常见为二进制化/编码化,并支持可选压缩)的结果文件,用于嵌入式处理器高效解析与执行 JTAG 编程流程。
因此,相比标准 SVF 文本,VME 的核心价值在于在资源受限场景下兼顾存储效率与执行效率。
在 general_hardware 代码中,如果 CPLD 升级需要使用 VME 文件,需要在 HPM 升级包的 update.cfg 配置文件中设置 UpdateFileType=vme。
该配置用于告知升级框架按 VME 路径解析与执行后续流程。 VME 文件在本项目中主要用于 CPLD 固件升级场景,可理解为一类用于 JTAG 升级流程的向量文件格式。
在工程实现上,BMC 会将 VME 文件封装后下发给底层驱动,由驱动执行实际链路操作与数据写入。
1.1 缩略语表
| 缩略语 | 英文全称 | 解释 |
|---|---|---|
VME | Virtual Machine Environment | Lattice ispVM Embedded 体系中的专有升级文件格式。 |
SVF | Serial Vector Format | 文本化 JTAG 向量脚本格式,常作为 VME 的输入来源。 |
JTAG | Joint Test Action Group | IEEE 1149.1 边界扫描接口,用于器件编程与测试。 |
BMC | Baseboard Management Controller | 服务器板级管理控制器,可执行固件升级流程。 |
CPLD | Complex Programmable Logic Device | 复杂可编程逻辑器件,本文主要升级对象。 |
FPGA | Field-Programmable Gate Array | 现场可编程门阵列,常与 CPLD 同属可编程逻辑器件。 |
ASCII | American Standard Code for Information Interchange | 文本编码标准,SVF 通常以 ASCII 文本形式存在。 |
ATE | Automatic Test Equipment | 自动测试设备,常用于生产测试与烧录。 |
MCU | Microcontroller Unit | 微控制器,常作为嵌入式执行 VME 的处理器。 |
DSP | Digital Signal Processor | 数字信号处理器,部分嵌入式编程场景会使用。 |
HPM | Hardware Platform Management | 服务器固件升级常用封装格式(.hpm)。 |
ISP | In-System Programming | 在系统编程,指器件在板内完成下载/升级。 |
TMS/TCK/TDI/TDO | JTAG Signals | JTAG 四个核心信号:模式、时钟、数据输入、数据输出。 |
UID | Unique Identifier | 升级对象唯一标识,用于匹配固件与目标器件。 |
2. VME与SVF的关系
VME 文件的主要用途之一是对 SVF 文件进行简化与优化:SVF 通常是包含算法与数据的 ASCII 文本格式,而 VME 可视为其面向执行侧的二进制优化版本。
与 SVF 相比,VME 通常占用更少的存储空间用于保存码流文件,并对编码长度进行了优化,更适合资源受限场景。
简单来说,你可以把 SVF 想象成一份文本格式的说明书(人可读,但体积大),而 VME 文件则是这份说明书被编译成二进制代码后的版本(机器更易执行)。二者都能用于 JTAG 升级流程。
进一步对比如下表所示:
| 对比维度 | SVF文件 | VME文件 |
|---|---|---|
| 文件格式 | 文本(ASCII),人类可读 | 二进制,机器可读 |
| 文件体积 | 大(文本描述冗长) | 小(二进制 + 压缩) |
| 解析方式 | 需逐行解析文本指令 | 直接按二进制结构执行 |
| 处理效率 | 需要文本解析,执行开销较高 | 可按预定义结构快速解析与执行 |
| 主要用途 | PC 端 ATE/调试器 | 嵌入式微处理器编程 |
| 可移植性 | 通常跨工具可读性更好 | 往往与具体平台/工具链绑定更紧 |
| 形态定位 | 更偏标准化文本脚本 | 更偏工程工具链产物 |
3. 文件格式与结构
从工程视角看,VME 文件可理解为“结构化执行载体 + 两类效率优化”的组合:
- 存储形式
VME 常以机器高效解析为目标,实际交付中可表现为二进制文件或十六进制编码载体(取决于工具链与发布方式)。 - 数据结构
- 算法部分(Algo):描述编程控制流程(如进入编程模式、擦除、校验)
- 数据部分(Data):承载实际待烧录数据(例如由设计文件转换得到的器件配置数据)
- 内容来源
通常由上位机工具结合 JTAG 链路拓扑信息、器件信息与用户设计数据打包生成。
3.1 压缩格式与循环格式
“压缩格式”和“循环格式”的 VME 文件,是 Lattice 为提升 ispVM Embedded 编程效率而设计的两种优化策略。
简单理解:压缩格式主要优化文件“体积”,循环格式主要优化执行“流程”。
3.1.1 压缩格式(Compressed VME)
核心目标是最小化文件体积。
- 特点与原理:将标准 SVF 指令/数据转换为更紧凑表示,并结合压缩算法(如游程编码)减少冗余;对大量重复数据场景效果明显。
- 应用场景:适用于存储资源紧张的嵌入式设备(如 MCU Flash 空间有限)。
- 差异点:执行前或执行时通常需要解压步骤,会带来一定 CPU/RAM 开销,属于“以算力换空间”的策略。
3.1.2 循环格式(Looped VME)
核心目标是优化执行效率。
- 特点与原理:通过可重复执行的块结构(循环/子流程)描述高重复操作,避免把同类指令逐条展开。
- 应用场景:适用于对编程速度敏感,或处理器主频/RAM 受限但需高效执行的场景。
- 差异点:要求执行引擎支持循环控制码解析,属于“以结构换速度”的策略。
3.1.3 选型建议
在实际应用中两者通常可组合使用:
- 追求最小体积:优先压缩格式
- 追求最快编程速度:优先循环格式
- 通用嵌入式场景:建议“压缩 + 循环”组合,通常能在体积与效率间取得更好平衡
4. VME命令集
SVF 的 SIR、SDR、RUNTEST 等命令是文本可读的;VME 侧通常不是以同样的文本命令直接呈现。
在嵌入式场景中,更常见做法是由配套解析器/库读取 VME 内部算法与数据,再翻译为底层 JTAG 信号序列(TMS、TCK、TDI、TDO)执行。
可简化理解为:SVF 更偏“人可读脚本”,VME 更偏“机器可执行载荷”。
VME 在指令组织上还引入了一些用于减少重复结构的机制(如 BEGIN_REPEAT、CONTINUE、END_FRAME、END_REPEAT、DATA、PROGRAM、VERIFY、ENDVME、DTDI、DTDO)。
这类结构化能力在标准 SVF 文本中通常没有一一对应的同名特性。
其中:
CONTINUE常出现在每个SIR/SDR逻辑段之后,用于标识该段结束并继续后续流程END_FRAME常出现在每个 VME 数据帧之后,用于标识当前数据帧结束
4.1 指令映射汇总表
| 指令 | 指令码 | 指令说明 |
|---|---|---|
STATE | 0x10 | 控制 TAP 状态机跳转到目标状态(如 RESET、IDLE)。 |
SIR | 0x11 | 执行 IR 扫描,向指令寄存器移入指令位流。 |
SDR | 0x12 | 执行 DR 扫描,进行数据移入/移出与可选校验。 |
TCK | 0x1B | 产生指定数量的测试时钟脉冲。 |
WAIT | 0x1A | 执行等待动作(按时间或时钟周期等待)。 |
ENDDR | 0x02 | 指定 DR 扫描结束后 TAP 停留状态。 |
ENDIR | 0x03 | 指定 IR 扫描结束后 TAP 停留状态。 |
HIR | 0x06 | 定义 IR 扫描前导位(Header-IR)。 |
TIR | 0x07 | 定义 IR 扫描尾随位(Trailer-IR)。 |
HDR | 0x08 | 定义 DR 扫描前导位(Header-DR)。 |
TDR | 0x09 | 定义 DR 扫描尾随位(Trailer-DR)。 |
BEGIN_REPEAT | 0xA0 | 重复块起始标记,用于压缩重复执行结构。 |
TDI | 0x13 | 指定移入链路的测试数据(Test Data In)。 |
CONTINUE | 0x70 | 当前 SIR/SDR 逻辑段结束并继续后续流程。 |
END_FRAME | 0xA2 | 当前 VME 数据帧结束标记。 |
TDO | 0x14 | 指定期望回读数据(Test Data Out)用于比对。 |
MASK | 0x15 | 指定回读校验掩码位(1 参与比较,0 忽略)。 |
END_REPEAT | 0xA1 | 重复块结束标记。 |
DATA | 0xA3 | 数据段标记,表示后续为待处理数据载荷。 |
PROGRAM | 0xA4 | 进入或执行编程动作流程。 |
VERIFY | 0xA5 | 进入或执行校验动作流程。 |
ENDVME | 0x7F | VME 文件/流程结束标记。 |
DTDI | 0xA6 | 压缩/差分 TDI 数据段(用于减少重复编码)。 |
DTDO | 0xA7 | 压缩/差分 TDO 数据段(用于减少重复编码)。 |
从 SVF 文件到 VME 文件的翻译通常按“逐条指令映射”的方式进行。示例如下:
- SVF 指令:
SIR 8 TDI (16) - 翻译后的 VME 字节序列:
0x02 0x08 0x0E 0x68
5. 工程中的 VME 文件组织方式
结合现网实现,VME 相关文件通常按以下命名组织:
5.1 单文件(单厂商)模式
cpld.vme:升级主文件valid.vme:后续生效文件bypass.vme:链路偏移/对齐相关辅助文件
5.2 多文件(多器件/多厂商)模式
cpld01.vme、cpld02.vme...valid01.vme、valid02.vme...bypass01.vme、bypass02.vme...
其中 XX 文件序号可由链路设备信息与芯片映射规则计算得到,用于多器件按片升级。
6. BMC侧VME升级流程
在服务器 BMC 领域,VME 文件是用于升级 CPLD(复杂可编程逻辑器件)的核心文件格式。为更好理解其应用位置,可先看端到端流程:
6.1 HPM包:VME文件的标准包装形态
服务器场景中的 VME 文件通常不会以“裸文件”直接交付,而是作为 HPM 包中的组成部分。
- 是什么:HPM 是标准化固件升级容器,可理解为服务器固件升级“安装包”
- 为什么需要它:可统一封装 CPLD/BIOS/BMC 等多类固件,并提供版本管理、签名校验等机制
- 怎么做:研发阶段通常使用
hpmimage等工具,将.vme、配置与脚本打包为.hpm
6.2 BMC如何执行VME升级
当通过 Web 或 CLI 上传包含 VME 的 HPM 包后,BMC 内部流程通常包括:
- 解析与验证:解包并校验签名/完整性,确认来源可信且未被篡改
- 驱动 JTAG:BMC 作为 JTAG 控制端,通过
TMS/TCK/TDI/TDO与 CPLD 交互 - 执行 VME:升级引擎按 VME 内容执行擦除、编程、校验等步骤
6.3 平滑升级(无感升级)机制
为降低业务影响,工程上常采用“两阶段”策略:
- 阶段一:后台烧录
将新固件写入 CPLD 外挂/片上 Flash,不立即切换运行镜像,业务侧通常无感知。 - 阶段二:择机生效
在业务低峰、计划维护窗或受控重启时执行加载生效。必要时先锁定输出,再完成固件加载与复位,最后释放输出。
这种“后台烧录 + 择机生效”模式可显著降低在线升级风险。
6.4 行业实践(简要)
- openUBMC 场景:支持 VME 相关升级能力,并可通过 API 形式对接上层管理系统
- 主流服务器平台:普遍采用 “BMC + JTAG + VME/HPM” 的 CPLD 升级技术路线
- 平台差异:早期平台可能采用 I2C 流程,现有主流多收敛到 JTAG 方案
6.5 常见风险点(服务器场景)
- 文件兼容性:不同 BMC 版本/硬件平台对 VME 支持可能存在差异
- 升级中断:升级过程掉电或链路中断可能导致器件状态异常
- 方案代际差异:老平台与新平台在链路和生效策略上可能不同,需按平台文档确认
6.6 与当前项目实现的流程映射
结合当前项目(general_hardware)实现,VME 升级可映射为以下工程步骤:
- 解析升级包(
update.cfg+ 固件包)并匹配目标组件(uid/system_id) - 根据配置确定
file_type=vme,选择对应cpld*.vme文件 - 切换固件路由(firmware route),必要时使能 bypass 并选中目标 chip
- 获取芯片锁(带重试和超时)后执行升级写入
- 升级成功后保存
valid*.vme/bypass*.vme供后续生效 - 解锁并恢复默认路由,进入生效或校验阶段
说明:升级写入阶段本质是将文件描述信息(文件类型、路径、长度等)按约定结构打包并传给底层接口执行;成功后进入 valid/bypass 生效链路。
7. 总结
VME 在本项目中是 CPLD 升级链路的核心输入格式,重点价值在于面向嵌入式执行场景的效率优化。
从工程落地看,应同时关注格式理解(SVF 关系、指令与结构)与流程闭环(打包、执行、生效、回归校验),以确保升级过程稳定可控。