1背景
在FPGA开发过程中,板载软件版本管理是一个容易被忽视但至关重要的环节。随着项目迭代推进,固件版本会不断更新,从最初的v1.0到后续的v1.1、v2.0乃至更多版本,每个版本可能对应不同的功能特性、Bug修复或硬件适配。
传统做法是在RTL代码中手动定义一个版本寄存器,例如:
reg [31:0] version = 32'h20240601; // 手动定义版本号这种方式虽然直观,但存在几个明显的痛点:
- 容易遗忘:每次编译前需要手动修改版本号,开发人员常常忘记更新,导致烧录后无法准确区分当前运行的固件版本。
- 容易出错:多人协作时,不同开发者可能使用不同的版本号格式,或者忘记同步版本信息,造成版本混乱。
- 缺乏自动化:版本号与编译时间没有关联,无法通过版本号反推固件是何时编译的,给问题追溯带来困难。
为了解决这些问题,Xilinx FPGA 提供了USR_ACCESS 原语(User Access Primitive),它可以在不占用额外逻辑资源的情况下,自动将版本信息嵌入到比特流(bitstream)中,并在FPGA运行时通过专用数据接口读取出来。USR_ACCESS 支持两种使用方式:
- 手动设置版本:在XDC约束文件中指定一个自定义的32位十六进制值,适合有固定版本号管理规范的项目。
- 自动获取编译时间戳:利用Vivado的TIMESTAMP功能,自动将编译时间(月日年时分秒)编码为版本数据,无需人工干预,适合快速迭代和自动化构建流程。
本文将通过实际案例,详细介绍这两种方式的具体实现步骤、ILA抓取验证方法以及数据解析技巧,帮助FPGA开发者高效管理板载版本信息。
2原语使用及测试
在原语列表中搜索,USR_ACCESS,XAPP497手册有详细介绍,XAPP497链接
在源文件中调用,USR_ACCESS原语,CFGCLK和DATAVALID接口未使用,DATA接口是版本信息。
USR_ACCESSE2 USR_ACCESSE2_inst ( .CFGCLK(), // 1-bit output: Configuration Clock .DATA(w_Data), // 32-bit output: Configuration Data reflecting the contents of the AXSS register .DATAVALID(w_Data_v) // 1-bit output: Active-High Data Valid );手动设置版本
# 方式一:在XDC文件中添加约束 # set_property BITSTREAM.CONFIG.USR_ACCESS 0x12345678 [current_design]ila抓取
DATA与约束文件中设置相同
设置为:TIMESTAMP
# 方式二:利用Vivado自动生成TIMESTAMP set_property BITSTREAM.CONFIG.USR_ACCESS TIMESTAMP [current_design]
时间戳模式下,数据格式为:月日年时分秒
ila抓取
数据转换后为:9日6月26年,10点14分53秒