高级FPGA开发之基础协议PCIe
基础协议之PCIe部分
一、TLP包的包头
在PCIe的系统中,tlp包的包头的结构有许多部分是相似的,通过掌握这些常规的包头,能帮助理解在PCIe总线上各个设备之间如何进行数据的收发。

通用的字段
| 通用字段 | 作用 |
|---|---|
| Fmt | 决定了包头是3DW还是3DW,tlp包是否包含数据 |
| type | 决定tlp包的类型,比如Mrd、Mwr、Cfg、Msg、Cpl、Cpld |
| TC | traffic class,用于决定tlp包处理的优先级,3bit,数值越大优先级越高 |
| attr | 属性,3bit,需要注意3个bit不是连在一起,attr[2]表示的是ID的一种排序方法。attr[1]表示tlp包的传输是保序还是乱序,保序要求严格按照tlp的顺序。attr[0]表示是否需要cache一致性,在进行大量数据传输的时候,可以选择关闭cache,提高效率。 |
| TD | tlp Digest该字段为1的时候需要在tlp包的最末尾添加ecrc,0不需要添加 |
| EP | tlp包错误信号 |
| AT | address type,表示地址类型,是否需要进行地址的转换 |
| length | 用于Mwr,cpl,msg包,10bit,0-1024DW,1-1023表示对应数量的DW。tlp的起始地址和结束地址不能跨4K边界 |
| first/last DW BE | 用于表示第一个DW和最后一个DW有效的字节,每一位对应一个字节。 |

内存请求tlp包头结构


对于内存请求包的包头如上图所示,3DW和4DW对应的可访问的地址空间是不同的。
-
request ID
其中这个request id由3部分组成:分别是bus_num[7:0]、device_num[4:0]、func_num[2:0]决定。PCIe端点设备在上电时候会被RC进行枚举,并分配对应的ID,每个设备的ID在上电时确定。
-
tag
这个表示是由请求方产生的,可以和request ID组成一个唯一的ID,保证唯一性,可以用来识别应答信息,用于包过滤。
对于Mwr和Mrd tlp包,他们的包头信息基本是一致的,同样包括了常规字段和requester ID等。
但是读内存请求Mrd是一个非转发Non-posted的包,需要一个独立的反馈事务来获取反馈回来的数据。
Mwr tlp包是一个转发包posted,写tlp包中需要包含数据。
完成包cpl、cpld包头
完成包的包头结构如下:

除了第一个DW的常规字段外,还有一些特殊的字段,需要掌握一下:
| 字段 | 作用 |
|---|---|
| Completer ID | 指示是由谁反馈的数据 |
| Requester ID | 指示是谁请求的数据 |
| Completion Status | 3bit完成状态,000是成功,001是不支持,010是配置请求重试,100是忽略 |
| Byte Count | 指的是剩余未反馈数据的字节数量 |
| Routing Tag | 从请求包当中复制的表示信号 |
| Lower Address | 第一个有效字节地址的低7bit |
二. 具体的tlp组包分析
2.1 内存读请求Mwr
假设系统的一些参数如下:
- PCIe的最大负载为MPS=512 字节;
- 系统边界RCB=128字节
- 需要读取的地址起始地址:0x0010_00f8
- 需要读取的长度:272字节
- 请求ID号request ID:0x0001;
- 回复者ID号completer ID:0x1000;
- 标识tag:0x00;
基于上面的消息我们就能来模拟一个tlp包的传输了。

首先需要产生一个读请求包,所以可以确定ftm字段和type字段的值。
然后是tc,attr等字段,都保持为0就可以了。
然后需要注意的是要读取的数据长度为272字节,刚好是68个DW,所以在长度这里需要填入DW的长度,也就是0x44=0b00_0100_0100;由于读取的长度刚好是DW的整数倍,因为在first DW BE和last DW BE里面都填1,表示第一个和最后一个DW的数据中的每个字节都有效。
然后把tag、id填写到tlp包中,最后是填写入地址就可以了。
因此,得到的最终的这个Mrd包的结果如下:

当rc(root complex)接收到这个读请求包之后,就会从内存当中读取数据,并把这些数据组成一个一个的tlp包通过ID路由的方式,发送给端点的PCIe设备。
2.2 cpld
cpld包的包头结构如下:

第一个cpld包:
首先确定CPLD包的类型,确定FMT字段和TYPE字段的值。
然后看第一个包能够发送多少数据,因为要读取的数据的地址是0x0010_00F8。由于不能跨rc界,因此第一次能够读取的数据个数为8字节,所以第一个tlp包的长度为8/4=2DW。
然后是需要填写当前还剩下多少字节没有返回,由于第一个tlp还没有返回数据,因此还剩下272个字节没有发送,所以这里需要填入272。
status的值,需要根据返回的状态来确定,正确返回需要填写3’b000。
然后依次把请求者ID和回复者ID还有TAG进行一个填写。
最后还需要关心的是一个lower address字段,该字段应该填入第一个有效字节的地址的低7位,也就是0x0010_00F8的低7位,也就是0x78。
然后在cpld的包头后面,跟上从内存当中读出的数据就好了。
因此可以得到第一个cpld包的内容如下:

第二个cpld包:
第一个cpld包返回了8字节的数据,还剩下274字节的数据。
根据最大负载的mps=512字节,所以还剩下的数据小于最大负载。然后再考虑RCB,再保证不跨RCB的情况下能传输的最大长度就是两个RCB的长度也就是256字节。因此,本次传输的数据的长度就是256字节,换算成DW就是256/4=64=0x40。本次传输的起始地址是接着上一个包的结束地址,也就是0x0010_0100,可以构成第2个cpld包。
关键参数:
- 长度64DW
- 剩余的count 264字节
- lower address,第一个有效字节低7位也就是0x00

第三个cpld包:
在上一个包返回了256个字节后,还剩下8个字节的数据没有发送,因此在本包中,还需要完成最后的这8个字节的发送,本次发送的起始地址是0x0010_0200,发送的长度是2个DW

这样就完成了本次请求的全部的CPLD包的返回了。
三、未完待续
下章将继续介绍FPGA PCIe IP设置和使用。欢迎关注知乎:北京不北欢迎+V:beijing_bubei欢迎关注douyin:near.X (北京不北)获得免费答疑,长期技术交流。
四、参考文献
https://blog.csdn.net/qq_41332806/article/details/115338533
相关文章:
高级FPGA开发之基础协议PCIe
基础协议之PCIe部分 一、TLP包的包头 在PCIe的系统中,tlp包的包头的结构有许多部分是相似的,通过掌握这些常规的包头,能帮助理解在PCIe总线上各个设备之间如何进行数据的收发。 通用的字段 通用字段作用Fmt决定了包头是3DW还是3DWÿ…...
Vue核心基础1:数据代理
1 回顾Object.defineProperty方法 let str hello const person {name: 张三,age: 18 } Object.defineProperty(person, sex, {// value: 男,// enumerable: true, // 控制属性是否可以枚举,默认值是false// writable: true, // 控制属性是否可以被修改࿰…...
12 ABC串口接收原理与思路
1. 串口接收原理 基本原理:通过数据起始位判断要是否要开始接收的数据,通过采样的方式确定每一位数据是0还是1。 如何判断数据起始位到来:通过边沿检测电路检测起始信号的下降沿 如何采样:一位数据采多次,统计得到高…...
leetcode(二分查找)34.在排序数组中查找元素的第一个和最后一个位置(C++详细解释)DAY11
文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计…...
算法刷题框架
前言:最近积累了一些算法题量,正在刷东神的算法笔记,监督自己记录下读后启发,顺便帮助道友们阅读 数据结构 这一部分老生常谈,数据的存储方式只有顺序存储和链式存储。 最基本的数组和链表对应这两者,栈…...
跟着cherno手搓游戏引擎【24】开启2D引擎前的项目总结(包括前置知识汇总)
前置技术: c动态链接和静态链接: 隐藏的细节:编译与链接_哔哩哔哩_bilibili 【底层】动态链接库(dll)是如何工作的?_哔哩哔哩_bilibili 预编译,编译,汇编,链接 预编译头文件: 为…...
石子合并+环形石子合并+能量项链+凸多边形的划分——区间DP
一、石子合并 (经典例题) 设有 N 堆石子排成一排,其编号为 1,2,3,…,N。 每堆石子有一定的质量,可以用一个整数来描述,现在要将这 N 堆石子合并成为一堆。 每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,…...
IMX6ULL移植U-Boot 2022.04
目录 目录 1.编译环境以及uboot版本 2.默认编译测试 3.uboot中新增自己的开发板 3.编译测试 4.烧录测试 5.patch文件 1.编译环境以及uboot版本 宿主机Debian12u-boot版本lf_v2022.04 ; git 连接GitHub - nxp-imx/uboot-imx: i.MX U-Boot交叉编译工具gcc-arm-10.3-2021.0…...
ES实战-高级聚合
多桶型聚合 1.词条聚合–terms 2.范围聚合–range 3,直方图聚合–histogram/日期直方图 4.嵌套聚合 5.地理距离聚合 include(包含)exclude(不包含) GET /get-together/_search?pretty {"size": 0,"aggs": {"tags": {"terms": {"…...
网络安全产品之认识蜜罐
文章目录 一、什么是蜜罐二、蜜罐的主要类型三、蜜罐的主要功能四、蜜罐的主要组成及核心技术五、蜜罐的优缺点六、蜜罐如何与其他安全工具协同工作?七、什么是“蜜网”?与蜜罐的联系和区别是什么? 蜜罐的概念首次由Clifford Stoll在其1988年…...
推荐《架构探险:从零开始写Java Web框架》
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 春节读了《架构探险:从零开始写Java Web框架》,一本大概10年前的好书。 本书的作者是阿里巴巴架构师黄勇。黄勇对分布式服务架构与大数据技术有深入…...
Go教程-Go语言简介
这篇文章我们来聊聊Go语言。 Go语言发展历史 以下是Go语言发展的几个里程碑节点: Go一开始是Google内部的一个项目,由三位大佬Rob Pike、Robert Griesemer、Ken Thompson早2007年发起。在2009年11月,Go语言正式对外开源。在2010年…...
React + SpringBoot + Minio实现文件的预览
思路:后端提供接口,从minio获取文件的预览链接,返回给前端,前端使用组件进行渲染展示 这里我从minio获取文件预览地址用到了一个最近刚开源的项目,挺好用的,大伙可以试试,用法也很简单 官网&am…...
心法利器[107] onnx和tensorRT的bert加速方案记录
心法利器 本栏目主要和大家一起讨论近期自己学习的心得和体会,与大家一起成长。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。 2023年新一版的文章合集已经发布,获取方式看这里:又添十万字-CS的陋室2…...
AcWing 122 糖果传递(贪心)
[题目概述] 有 n 个小朋友坐成一圈,每人有 a[i] 个糖果。 每人只能给左右两人传递糖果。 每人每次传递一个糖果代价为 1。 求使所有人获得均等糖果的最小代价。 输入格式 第一行输入一个正整数 n,表示小朋友的个数。 接下来 n 行,每行一个…...
unity的重中之重:组件
检查器(Hierarchy)面板中的所有东西都是组件。日后多数工作都是和组件打交道,包括调参、自定义脚本组件。 文章目录 12 游戏的灵魂,脚本组件13 玩转脚本组件14 尽职的一生,了解组件的生命周期15 不能插队!…...
Linux释放内存
free -m是Linux上查看内存的指令,其中-m是以兆(MB)为单位,如果不加则以KB为单位。 如下图表示,(total)总物理内存是809MB,(used)已使用167MB,&…...
Python算法题集_翻转二叉树
Python算法题集_翻转二叉树 题226:翻转二叉树1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【DFS递归】2) 改进版一【BFS迭代,节点循环】3) 改进版二【BFS迭代,列表循环】 4. 最优算法 本文为Python算法题集…...
Git快速掌握,通俗易懂
Git分布式版本控制工具 介绍 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git是由Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Git可以帮助开发者们管理代码的版本,避免代码冲突&#…...
PHP毕业设计图片分享网站76t17
图片分享网站主要是为了提高工作人员的工作效率和更方便快捷的满足用户,更好存储所有数据信息及快速方便的检索功能,对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑用户的可操作性,遵循开发的系统优化的原则,…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
门静脉高压——表现
一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...
