博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PCIe扫盲——一个Memory Read操作的例子
阅读量:6584 次
发布时间:2019-06-24

本文共 2449 字,大约阅读时间需要 8 分钟。

连载目录篇:

 

前面的一系列文章简要地介绍了PCIe总线的结构、事务层、数据链路层和物理层。下面我们用一个简单地的例子来回顾并总结一下。

如下图所示,Requester的应用层(软件层)首先向其事务层发送如下信息:32位(或者64位)的Memory地址,事务类型(Transaction Type),数据量(以DW为单位),TC(Traffic Class,即优先级),字节使能(Byte Enable)和属性信息(Attributes)等。

blob.png

然后接收端的事务层使用这些信息创建了一个Mrd TLP(Memory Read的事务层包),并将Requester的ID(BDF,Bus & Device & Function)写入到该TLP的Header中,以便Completer根据这一BDF将Completion信息返回给Requester。然后这个TLP会根据其TC的值被放到对应的VC Buffer中,Flow Control逻辑便会检车接收端的对应的接收VC Buffer空间是否充足。一旦接收端的VC Buffer空间充足,TLP便会准备被向接收端发送。

注:TLP的Header实际上有两种,32位的地址对应的是3DW的Header,64为的地址对应的是4DW的Header。这在后续的文章中会详细介绍。

当TLP到达数据链路层(Data Link Layer)时候,数据链路层会为其添加上12位的序列号(Sequence Number)和32位的LCRC。并将添加上这些信息之后的TLP(即DLLP)在Replay Buffer中做一个备份,并随后将其发送至物理层。

物理层接收到DLLP之后,为其添加上起始字符(Start & End Characters,又叫帧字符,Frame Characters),然后依次进行解字节(Strip Byte)、扰码(Scramble)、8b/10b编码并进行串行化,随后发送至相邻的PCIe设备的物理层。

接收端PCIe设备(即Completer)的物理层接收到数据之后,依次执行与发送端相反的操作。并从数据中恢复出时钟,然后将恢复出来的DLLP发送至数据链路层。

Completer的数据链路层首先检查DLLP中的LCRC,如果存在错误,则向Requester发送一个Nak类型的DLLP,该DLLP包含了其接受到的DLLP中的序列号(Sequence Number)。Requester的数据链路层接收到来自Completer的Nak DLLP之后,从中找到序列号(Sequence Number),并根据序列号在Replay Buffer找到对应的DLLP,然后将其重新发送至Completer。如果Completer的数据链路层没有检查到LCRC的错误,也会向Requester发送一个Ack类型的DLLP,该DLLP同样包含了其接收到的DLLP中的序列号。Requester的数据链路层接收到之一Ack DLLP之后,便会根据其中的序列号在Replay Buffer中找到对应的DLLP的备份,并将其丢弃(Discard)。

当接收端PCIe涉笔(即Completer)的数据链路层正确的接收到了来自Requester的DLLP(包含TLP的)时,随后将其进一步发送至事务层,事务层检查ECRC(可选的),并对TLP进行解析,然后将解析后的信息发送至应用层(软件层)。

如下图所示,Completer的应用层会根据接受到的信息进行相应的处理,处理完成后会将数据发送至事务层,事务层根据这一信息创建一个新的TLP(即CplD,Completion with data)。并根据先前接收到的TLP中的BDF信息,找到原来的Requester,然后将CplD发送至该Requester。这一发送过程与Requester向Completer发送TLP(Mrd Request)的过程基本是一致的。所以这里就不在重复了。

注:如果Completer不能够返回有效数据给Requester,或者遇到错误,则其返回的就不是CplD了,而是Cpl(Completion without data),Requester接收到Cpl的TLP之后便会知道发生了错误,其应用层(软件层)会进行相应的处理。

blob.png

 

转载:

 

 

 

本文为PCIe扫盲系列博文连载目录篇(第一阶段),所谓第一阶段就是说后面还有第二阶段和第三阶段……第一阶段主要是介绍PCIe总线的发展历史与展望,PCI总线和PCI-X总线的简要回顾,PCIe总线的体系结构入门,PCIe总线的事务层、数据链路层,物理层入门;最后以一个简单的例子进行总结与回顾。

 

目录如下:

1、前言篇:PCIe扫盲——PCIe简介:

2、PCIe扫盲——PCI总线基本概念:

3、PCIe扫盲——一个典型的PCI总线周期:

4、PCIe扫盲——PCI总线中的Reflected-Wave Signaling:

5、PCIe扫盲——PCI总线的三种传输模式:

6、PCIe扫盲——PCI总线的中断和错误处理:

7、PCIe扫盲——PCI总线的地址空间分配:

8、PCIe扫盲——PCI总线配置周期产生和配置寄存器:

9、PCIe扫盲——66MHz的PCI总线与其技术瓶颈:

10、PCIe扫盲——PCI-X总线基本概念:

11、PCIe扫盲——PCIe总线基本概念:

12、PCIe扫盲——PCIe总线怎样做到在软件上兼容PCI总线:

13、PCIe扫盲——PCIe总线体系结构入门:

14、PCIe扫盲——PCIe总线事务层入门(一):

15、PCIe扫盲——PCIe总线事务层入门(二):

16、PCIe扫盲——PCIe总线事务层入门(三):

17、PCIe扫盲——PCIe总线数据链路层入门:

18、PCIe扫盲——PCIe总线物理层入门:

19、PCIe扫盲——一个Memory Read操作的例子:

 

第二阶段目录篇地址:

你可能感兴趣的文章
通过url获取bitmap
查看>>
索引/代码块目录
查看>>
[c++]指针创建数组不会调用构造函数
查看>>
SCAU 10691 ACM 光环
查看>>
win7 php nginx 启动命令
查看>>
Android独立交叉编译环境搭建
查看>>
架设Hmailserver+webmail邮件服务器
查看>>
Python学习之二:Python 与 C 区别
查看>>
java中解析excel 批量插入数据库
查看>>
python模块
查看>>
RocketMQ最佳实践
查看>>
Kafka最佳实践
查看>>
STAR法则
查看>>
Ubuntu 16.04 LTS 安装Mongodb 3.4
查看>>
10-JavaScript之DOM的事件操作
查看>>
[ZJb417]区间众数
查看>>
陶哲轩实分析习题8.5.12
查看>>
陶哲轩实分析 命题7.2.5 证明
查看>>
UIImageView02
查看>>
WebRTC开发者必备 | 《WebRTC1.0: 浏览器间实时通讯》中文版免费下载
查看>>