RIFFA架构

用户侧通过Channel和Riffa交联,Channel是被用来处理异步时钟域,其含有FIFO来接收发送数据。

RX引擎用来提取和多路分解收到的PCIe负载数据。TX引擎用来将负载数据格式化为PCIe包,并且提供对PCIe链路的多路复用访问。

pcie链路配置决定了数据总线宽度。这个宽度可以是32,64,128bit。Riffa对其都支持。但是不同的宽度在提取和格式化pcie数据时要求不同的逻辑。

上层应用调用用户库函数fpga_send,线程进入内核驱动并且获得了一块预分配的buffer来暂存用户数据。一旦获取了buffer,数据就会被复制到buffer中,以便Endpoint可以访问它。

对Endpoint配置空间的写入触发一个新的下行传输。写入包含len、offset、last参数,以及包含数据的buffer地址。

数据通过大量PCIe TLP包被从缓冲区读取到通道中。如果数据大小超过了单个buffer,driver会获取另一个buffer,将数据拷贝到新的buffer中。

为了提高传输性能,Endpoint只要认为它需要,就请求下一个buffer。这个流程持续直到所有数据被传输。

Endpoint释放最后一个buffer标志到驱动程序的传输结束。然后,驱动程序释放最后一个buffer并解锁用户线程。

Upstream transfer的主要不同在于,Endpoint Core 向内核buffer写入数据,由驱动将数据拷贝到用户提供的字节数组中。

此外,Upstream transfer的发起者是User core,而不是软件线程。这就意味着数据传输可以在上层应用调用fpga_recv之前开始。

内核缓冲区在系统启动时预先分配,以避免动态内存分配造成的延迟

相关推荐
xhyu6117 分钟前
【学习笔记】推荐系统 (4.召回:Deep Retrieval、其他召回通道、曝光过滤)
笔记·学习
两万五千个小时1 小时前
构建mini Claude Code:08 - Fire and Forget:用后台线程解锁 Multi-Agent 并行执行
人工智能·python·架构
桂花很香,旭很美2 小时前
Anthropic Agent 工程实战笔记(一)架构与选型
笔记·架构·language model
Aliex_git2 小时前
Sentry 私有部署和配置笔记
笔记·学习·sentry
qq_24218863322 小时前
金融AI反欺诈系统构建指南
人工智能·笔记·金融·课程设计
四谎真好看2 小时前
SSM学习笔记(SpringBoot篇)
spring boot·笔记·学习·学习笔记·ssm
郝学胜-神的一滴3 小时前
Effective Modern C++ 条款40:深入理解 Atomic 与 Volatile 的多线程语义
开发语言·c++·学习·算法·设计模式·架构
正宗咸豆花3 小时前
Gemini 3.1 Pro架构深度解析与AGI能力评测
人工智能·架构·agi
宇木灵3 小时前
考研数学-高中数学回顾函数的微分day8(完结)
笔记·学习·考研·数学·函数·导数·微分
一个人旅程~3 小时前
《七重时间的织锦》-致初七
windows·经验分享·笔记·微信公众平台