VDMI 读通道:异构计算中的高效数据获取机制(三)
扫描二维码
随时随地手机看文章
一、VDMI 读通道的关键技术特性
1. 低延迟优化技术
VDMI 读通道采用多种技术降低访问延迟:
零等待状态传输:预取命中时,数据可立即传输,无需等待存储器响应
地址 - 数据重叠:新地址请求可与上一次数据传输重叠进行
短路径优化:对小数据块访问提供专用短路径,减少处理步骤
时序优化:物理层采用源同步时钟,数据与时钟边沿精确对齐
实测数据显示,对于预取命中的访问,VDMI 读通道的端到端延迟可低至 10ns 以内,这一指标比传统 AXI_HP 接口降低了 70% 以上,大幅提升了实时应用的响应速度。
2. 缓存一致性支持
VDMI 读通道提供灵活的缓存一致性选项:
完全一致性模式:严格维护与 PS 缓存的一致性,适合共享数据访问
流模式:不维护一致性,适合一次性使用的流式数据,降低开销
按需一致性:通过软件指令显式控制一致性操作
在完全一致性模式下,VDMI 读通道通过以下机制维护一致性:
与 PS 侧的缓存控制器交换窥探请求
在数据被修改时更新缓存行
确保 PL 和 PS 看到的数据视图一致
这一特性显著简化了需要共享数据的异构应用编程模型,使开发者无需手动管理缓存刷新。
3. 错误处理与可靠性
VDMI 读通道提供完善的错误检测与恢复机制:
ECC 保护:对内部缓冲区和数据路径提供 ECC(错误校正码)保护
地址范围检查:检测并报告超出允许范围的地址访问
访问权限验证:确保 PL 访问符合存储器保护策略
超时监控:检测无响应的存储器访问并触发恢复流程
错误隔离:单个通道的错误不会影响其他 VDMI 通道的正常工作
错误信息通过专用寄存器和中断信号通知软件,使系统能够采取适当的恢复措施,提高整体可靠性。
二、VDMI 读通道的系统集成
1. 硬件配置流程
在 Vitis 设计套件中配置 VDMI 读通道的典型步骤:
接口启用:在 Block Design 中启用所需数量的 VDMI 读通道
set_property CONFIG.PCW_VDMI_NUM_READ_CHANNELS 2 [get_bd_cells ps7_0]
参数配置:设置数据宽度、缓存大小和预取策略
set_property CONFIG.VDMI_READ_CH0_DATA_WIDTH 256 [get_bd_cells ps7_0]
set_property CONFIG.VDMI_READ_CH0_PREFETCH_DEPTH 1024 [get_bd_cells ps7_0]
地址映射:配置 PL 可访问的存储器地址范围
assign_bd_address [get_bd_addr_segs {pl_accelerator_0/VDMI_READ/SEG_DDR_0}]
set_property offset 0x0000000000000000 [get_bd_addr_segs {pl_accelerator_0/VDMI_READ/SEG_DDR_0}]
set_property range 0x0000000100000000 [get_bd_addr_segs {pl_accelerator_0/VDMI_READ/SEG_DDR_0}]
时序约束:添加适当的时序约束确保信号完整性
create_clock -name vdmi_clk -period 1.0 [get_ports VDMI_CLK]
set_input_delay -clock vdmi_clk -max 0.2 [get_ports VDMI_READ_ARADDR*]
set_output_delay -clock vdmi_clk -max 0.2 [get_ports VDMI_READ_RDATA*]
生成输出产品:生成比特流和硬件平台文件
2. 软件编程模型
VDMI 读通道的软件编程通过设备树配置和专用驱动 API 实现:
设备树配置:描述 VDMI 读通道的硬件特性
vdmi_read: vdmi-read@f8000000 {
compatible = "xlnx,versal-vdmi-read";
reg = <0x0 0xf8000000 0x0 0x1000>;
xlnx,num-channels = <2>;
xlnx,data-width = <256>;
interrupts = <0 89 4>;
};
初始化代码:初始化 VDMI 读通道并配置参数
#include "xvdmi_read.h"
XVdmiRead VdmiRead;
XVdmiRead_Config *VdmiCfg;
// 查找设备配置
VdmiCfg = XVdmiRead_LookupConfig(VDMI_READ_DEVICE_ID);
// 初始化设备
XVdmiRead_CfgInitialize(&VdmiRead, VdmiCfg, VdmiCfg->BaseAddress);
// 配置预取策略
XVdmiRead_SetPrefetchPolicy(&VdmiRead, 0, VDMI_PREFETCH_LINEAR);
// 设置缓存大小
XVdmiRead_SetBufferSize(&VdmiRead, 0, 0x10000); // 64KB缓存
数据读取操作:发起和管理数据读取事务
// 发起读事务
XVdmiRead_StartTransfer(&VdmiRead, 0,
(u64)DDR_BUFFER_ADDR, // 目标地址
0x100000, // 传输大小(1MB)
256); // 突发长度
// 等待传输完成
while(!XVdmiRead_IsTransferDone(&VdmiRead, 0));
这种编程模型抽象了底层硬件细节,使开发者能够专注于应用逻辑而非接口细节。
3. 与 PL 加速器的接口设计
PL 加速器与 VDMI 读通道接口的关键设计考虑:
数据宽度匹配:确保加速器的输出宽度与 VDMI 读通道的数据宽度匹配,或添加宽度转换器
流量控制:正确实现 AXI4-Stream 的 TVALID/TREADY 握手机制
预取提示:利用 ARUSER 信号提供访问模式提示,优化预取效率
错误处理:设计错误检测和恢复逻辑,响应 VDMI 读通道的错误信号
对于视频处理等流式应用,通常采用直接连接方式:
[视频解码器] → [AXI4-Stream FIFO] → [VDMI读通道] → [DDR存储器]