CN103049240B - Pci-e设备及其接收数据重排序方法 - Google Patents
Pci-e设备及其接收数据重排序方法 Download PDFInfo
- Publication number
- CN103049240B CN103049240B CN201110309764.5A CN201110309764A CN103049240B CN 103049240 B CN103049240 B CN 103049240B CN 201110309764 A CN201110309764 A CN 201110309764A CN 103049240 B CN103049240 B CN 103049240B
- Authority
- CN
- China
- Prior art keywords
- request
- read
- label
- bag
- sequence table
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
- 238000000034 method Methods 0.000 title claims abstract description 92
- 230000008569 process Effects 0.000 claims description 56
- 230000000694 effects Effects 0.000 claims description 40
- 230000005540 biological transmission Effects 0.000 claims description 32
- 238000012545 processing Methods 0.000 claims description 18
- 230000002093 peripheral effect Effects 0.000 claims description 4
- 230000015572 biosynthetic process Effects 0.000 description 7
- 238000004891 communication Methods 0.000 description 4
- 230000008707 rearrangement Effects 0.000 description 4
- 230000004044 response Effects 0.000 description 4
- 238000012163 sequencing technique Methods 0.000 description 4
- 230000008859 change Effects 0.000 description 3
- 238000006243 chemical reaction Methods 0.000 description 3
- 238000010586 diagram Methods 0.000 description 3
- 238000012546 transfer Methods 0.000 description 2
- 238000012508 change request Methods 0.000 description 1
- 239000012141 concentrate Substances 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000005538 encapsulation Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000004064 recycling Methods 0.000 description 1
- 230000011218 segmentation Effects 0.000 description 1
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
本发明公开了一种PCI-E设备及其接收数据重排序方法,其中,PCI-E设备的接收数据重排序方法,包括:接收读完成包;将接收到的针对同一个读请求的读完成包的数据,依次暂存到排序缓存器中与该读请求对应的存储块中,其中,排序缓存器被预先划分成至少一个存储块,每一个存储块用于存储一个读请求的读完成包的数据;按照读请求发送的先后次序,从排序缓存器的各个存储块中,将已完成的读请求的读完成包的数据读出,并写入到FIFO存储器。本发明避免了从FIFO存储器中读出的接收数据次序有误的问题,使得从FIFO存储器中读出的接收数据的先后次序与请求数据的先后次序是一致的。
Description
技术领域
本发明涉及通信技术领域,更具体地,涉及一种PCI-E设备及其接收数据重排序方法。
背景技术
PCIExpress(快速外围组件互连,简称为PCI-E或者PCIe)是第三代高性能的计算机及通信平台的外设I/O总线标准。PCIExpress架构抛弃了上一代PCI(PeripheralComponentInterconnect,外围组件互连)以及PCI-X总线的并联共享结构,采用了串行的、点对点的通讯方式。多个PCIExpress设备通过开关进行互联。
PCIExpress使用基于包的协议在两个设备之间传输信息,协议的最上层为传输层,负责传输层包(TransactionLayerPacket,TLP)的封装与拆封。通讯双方的数据传输是通过交换TLP(包括请求包和完成包)来完成的,即,PCIExpress设备之间通过发送TLP来传输信息。每个传输层包中包含唯一的传输ID,以保证系统可以对所有的传输层包进行正确的路由。具体的,请求者发送请求包给完成者,如果需要响应数据,则完成者通过完成包将响应的数据发送给请求者。其中,对读请求包的响应是通过分割传输(SplitTransaction)的形式实现的,即,将针对于一个读请求包的响应数据分割成多个读完成包来发送。
为了提高传输层包的传输效率和系统性能,PCIExpress允许单个请求者同时并发地处理多个请求,即允许请求者在一个请求还未完成的情况下,发送下一个请求。因此,传输ID中除了包括标识请求者身份的请求者ID外,还包括一个标签ID(TagID),以区分同一个请求者的请求包以及该请求包所对应的完成包。
另外,传输层包在传输的过程中有可能遇到阻塞,为了提高系统性能,PCIExpress还定义了一系列传输层包的次序处理规则,其中包括:允许一个请求包在传输过程中超越被阻塞的来自同一个请求者的请求包,以及允许一个完成包在传输的过程中超越发往同一个请求者的被阻塞的完成包。例如,PCIExpress允许一个读请求包在传输过程中超越在它之前发往同一个完成者的受到阻塞的读请求包,以及,允许完成者发出的读完成包可以超越在它之前发往同一个请求者的受到阻塞的读完成包,这将导致请求者完成读请求的顺序与发送读请求的顺序(即请求者收到读完成包的次序与发送的读请求包请求数据的次序)不一致,即,在后发送的读请求有可能先于在先发送的读请求完成。
目前,在如图1所示的使用PCIExpress总线的高速数据传输系统中,作为请求者的PCI-E设备A(例如可以为扩展卡)中包括:包收发模块和FIFO存储器,采用DMA(DirectMemoryAccess,直接存储器访问)方式从PCI-E设备B(例如可以为主机)向PCI-E设备A传输数据。当PCI-E设备A向PCI-E设备B先后发送了两个读请求包R1、R2(其中R1对应读完成包C11、C12、C13,R2对应读完成包C21、C22)时,根据上述的传输层包的次序处理规则,PCI-E设备A接收读完成包的次序可能会与发送读请求包的次序不同,例如接收到读完成包的次序可能为:C11、C12、C21、C13、C22。则此时,如果将接收到的读完成包中的数据直接写入FIFO存储器,由于FIFO存储器的输出次序与写入次序相同,因此将导致FIFO存储器输出的数据次序出错。
发明内容
有鉴于此,本发明的主要目的在于提供一种PCI-E设备及其接收数据重排序方法,能够解决现有技术中存在的接收数据的次序可能会出错的问题。
为达到上述目的,本发明的技术方案是这样实现的:
一方面,提供了一种PCI-E设备的接收数据重排序方法,包括:接收读完成包;将接收到的针对同一个读请求的读完成包的数据,依次暂存到排序缓存器中与该读请求对应的存储块中,其中,排序缓存器被预先划分成至少一个存储块,每一个存储块用于存储一个读请求的读完成包的数据;按照读请求发送的先后次序,从排序缓存器的各个存储块中,将已完成的读请求的读完成包的数据读出,并写入到FIFO存储器。
另一方面,还提供了一种PCI-E设备,包括:包收发模块,用于发送读请求以及接收读完成包;排序缓存器,包含有被预先划分成的至少一个存储块,每一个存储块用于存储一个读请求的读完成包的数据,排序缓存器用于暂存包收发模块所接收到的读完成包的数据,其中,针对同一个读请求的读完成包的数据,依次暂存到与该读请求对应的存储块中;控制器,用于按照读请求发出的先后次序,从排序缓存器的各个存储块中,将已完成的读请求的读完成包的数据读出,并写入到FIFO存储器;FIFO存储器,用于存储读完成包的数据。
本发明的技术效果:在接收到读完成包之后、将读完成包的数据写入FIFO存储器之前,先使用排序缓存器对读完成包的数据进行暂存,并且,通过将针对同一个读请求的读完成包的数据存放到排序缓存器的对应存储块中,并按照读请求发送的先后顺序将已经接收完全的读请求的读完成包的数据写入到FIFO存储器中,从而在将接收到的读完成包的数据写到FIFO存储器之前,按照读请求发送的先后次序对不同读请求的读完成包的数据进行了重排序,从而避免了从FIFO存储器中读出的接收数据次序有误的问题,使得从FIFO存储器中读出的接收数据的先后次序与请求数据的先后次序是一致的。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1示出了根据现有技术的使用PCI-E总线的高速数据传输系统的示意图;
图2示出了根据本发明实施例一的PCI-E设备的接收数据重排序方法的流程图;
图3示出了根据本发明实施例二的PCI-E设备的接收数据重排序方法中,PCI-E设备的初始化过程的具体处理流程图;
图4示出了根据本发明实施例二的PCI-E设备的接收数据重排序方法中,PCI-E设备发送读请求的过程的具体处理流程图;
图5示出了根据本发明实施例二的PCI-E设备的接收数据重排序方法中,PCI-E设备接收读完成包并将读完成包的数据缓存到排序缓存器中的对应存储块的过程的具体处理流程图;
图6示出了根据本发明实施例二的PCI-E设备的接收数据重排序方法中,PCI-E设备将已完成的读请求的读完成包数据转存至FIFO存储器中的过程的具体处理流程图;
图7示出了根据本发明实施例三的PCI-E设备的结构示意图;
图8示出了根据本发明实施例四的PCI-E设备的结构示意图;
图9示出了根据本发明实施例五的PCI-E设备的结构示意图。
具体实施方式
下面将参考附图并结合实施例,来详细说明本发明。
实施例一
图2示出了根据本发明实施例一的PCI-E设备的接收数据重排序方法的流程图,包括:
步骤S202,接收读完成包;
步骤S204,将接收到的针对同一个读请求的读完成包的数据,依次暂存到排序缓存器中与该读请求对应的存储块,其中,排序缓存器被预先划分成至少一个存储块,每一个存储块用于存储一个读请求的读完成包的数据;
例如,排序缓存器为可随机寻址的存储器。
步骤S206,按照读请求发送的先后次序(即读请求包的发送次序),从排序缓存器的各个存储块中,将已完成的读请求的读完成包的数据读出,并写入到FIFO存储器。
本发明实施例在接收到读完成包之后、将读完成包的数据写入FIFO存储器之前,先使用排序缓存器对读完成包的数据进行暂存,并且,通过将针对同一个读请求的读完成包的数据存放到排序缓存器的对应存储块中,并按照读请求发送的先后顺序将已经接收完全的读请求的读完成包的数据(即该读请求所请求的数据已经全部接收完毕)写入到FIFO存储器中,从而在将接收到的读完成包的数据写到FIFO存储器之前,按照读请求发送的先后次序对不同读请求的读完成包的数据进行了重排序,使得从FIFO存储器中读出的接收数据的先后次序与请求数据的先后次序是一致的。
通过在读完成包的接收端(即数据的请求者这一端)引入读完成包的数据重排序系统,使得读完成包的接收设备(即请求者)可以使用FIFO存储器作为数据缓存。而设计读完成包的数据重排序系统的要点在于,找到实现简便的重排序方法,使用尽量少的存储器资源,并且在某一个读完成包接收超时时,能够报错并放弃超时的读请求,使传输继续进行。因此,需要一种可以在将读完成包的数据写入FIFO存储器之前对读完成包数据的次序进行重排序之后再写入FIFO存储器的方法。
实施例二
如图3所示,在根据本发明实施例二的PCI-E设备的数据重排方法中,PCI-E设备的初始化过程如下:
步骤S302、初始化活动请求表;
如表1所示,活动请求表中的每一行包括三列:标签ID、请求序列表指针、和标签ID状态。每一行的标签ID是唯一的,标签ID的数量为PCI-E设备最多能支持的同时处理的读请求的数量。例如,如果最多可以同时处理4个读请求,则活动请求表包含4行,每行的标签ID可以分别为1、2、3、4。请求序列表指针为该行的标签ID对应的读请求的处理信息在请求序列表中的存放位置,用请求序列表的行号表示。标签ID状态有三种可能:使用中、空闲、超时。
表1
标签ID | 请求序列表指针 | 标签ID状态 |
步骤S304、初始化请求序列表;
请求序列表按发送读请求的顺序保存读请求的处理信息,每一行存储一个读请求的处理信息。请求序列表具有一个读指针和一个写指针,读指针供排序缓存读出逻辑(或模块)从请求序列表中读取出待读出的读请求的处理信息,写指针供读请求生成逻辑存放生成的读请求的处理信息。读指针和写指针的位置都初始化为1(即读指针和写指针初始均指向请求序列表中行号为1的行)。当进行读操作后,读指针加1;当进行写操作后,写指针加1。如表2所示,请求序列表的每一行包括5列,分别为:标签ID、排序缓存器块内偏移量、请求长度、请求状态、和超时计数值。可随机寻址的排序缓存器被划分为长度大小为最大读请求长度的等长的多个存储块(或缓存块),每个缓存块具有唯一的序号,缓存块的总块数与请求序列表的总行数相同,请求序列表中某一行的行号与该行对应的读请求的读完成包数据所要存储的缓存块的序号一致,即,请求序列表中行号为N的行所对应的读请求的读完成包数据将存放在排序缓存器中序号为N的存储块中。
表2
其中,标签ID表示该行对应的读请求使用的标签ID;
排序缓存器块内偏移量表示该行对应的读请求所对应的存储块的写指针的块内偏移量,排序缓存器块内偏移量的初始化值为0,当接收完该读请求的一个读完成包后,根据该读完成包的数据的大小更新排序缓存器块内偏移量的值(更新为排序缓存器块内偏移量的当前值与接收到的读完成包的数据长度之和);
请求长度表示该行对应的读请求所请求的数据的长度;
超时计数值由减一计数的超时计数器进行控制,当超时计数值减为零时,如果该读请求的读完成包仍未完成传输(即请求状态为超时),则向应用层通知该读请求无法处理完成;
请求状态表示该行对应的读请求当前的处理状态,可以为以下五种状态之一:空闲、传输中、传输完成、已读、超时。其中,请求状态初始化为“空闲”,“传输中”表示该读请求的读完成包数据还没有全部接收至排序缓存器;“传输完成”表示该读请求的读完成包数据已经全部接收至排序缓存器;“已读”表示该读请求的读完成包数据已经从排序缓存器中读出,并写入后级的FIFO存储器中;“超时”表示该读请求已经超时。
初始化完成之后,就可以进入如图4所示的读请求的发送过程。
如图4所示,在根据本发明实施例二的PCI-E设备的数据重排方法中,PCI-E设备(例如为PCI-E设备A)发送读请求的过程如下:
步骤402、PCI-E设备A需要向PCI-E设备B请求数据时,首先向读请求生成逻辑发送请求,该请求的内容包括:被请求数据的首地址以及数据长度;
步骤S404、读请求生成逻辑判断请求序列表的写指针当前所指向的位置(即所指向的行)是否可用,若否,则通知应用层等待,并返回步骤S404,继续判断;若是,则进入步骤S406;
判断请求序列表的写指针当前所指向的位置(即所指向的行)是否可用的方式具体可以为:判断请求序列表的写指针当前所指向的行中的请求状态是否为“空闲”、“已读”或“超时”,若是,则确定该行可用,否则,确定该行不可用。
步骤S406、读请求生成逻辑开始生成新的读请求;
步骤S408、读请求生成逻辑从活动请求表中取得标签ID状态为“空闲”的最小的标签ID,更新该标签ID的标签ID状态为“使用中”,然后将对应的请求序列表指针更新为请求序列表的写指针的当前值;
步骤S410、读请求生成逻辑将取得的标签ID、读请求所请求的数据的长度和首地址,发送给外部的包收发模块。同时,读请求生成逻辑将需要发送的读请求的处理信息写入到请求序列表的写指针当前所指向的行中:将标签ID写入请求序列表中当前写指针位置,将排序缓存器块内偏移量置为0,将请求长度置为需要发送的读请求所请求的数据的长度,并初始化该行的超时计数值,置请求状态为“传输中”;
步骤S412、判断请求序列表的写指针是否小于最大指针(即写指针的值是否大于最大值,最大值即为请求序列表的行数),若是,则进入步骤S414,若否,即写指针等于最大指针,则进入步骤S416;
步骤S414、请求序列表的写指针加1;
步骤S416、请求序列表的写指针置为1。
如图5所示,在根据本发明实施例二的PCI-E设备的数据重排方法中,PCI-E设备接收读完成包并将读完成包的数据缓存到排序缓存器中的对应存储块的过程如下:
步骤S502、判断是否接收到读完成包,若是,则进入步骤S504,若否,则返回步骤S502;
步骤S504、外部的包收发模块将接收到的读完成包中携带的标签ID传送给包缓存逻辑,如果活动请求表中该标签ID的状态不是“超时”(即状态为“使用中”),则包缓存逻辑从活动请求表中读取该标签ID对应的读请求的请求序列表指针,然后,从请求序列表中该指针的位置读取该读请求的排序缓存器块内偏移量的值。包缓存逻辑计算序号等于所读取出的请求序列表指针的值的存储块的首地址,再将该首地址与读取出的排序缓存器块内偏移量的值相加,将两者之和作为接收到的读完成包的数据在排序缓存器中的存储首地址;然后从该存储首地址开始,将读完成包的数据依序存储至对应的存储块中;
如果标签ID的状态为超时,则包缓存逻辑放弃对此读完成包的数据的接收。如果此读完成包是一个超时的读请求的最后一个读完成包,则包缓存逻辑将对应标签ID的状态更改为“空闲”。
步骤S506、外部的包收发模块可以得知一个读完成包是不是一个读请求的最后一个读完成包,并通知包缓存逻辑。判断接收到的读完成包是否是一个读请求的最后一个读完成包,若是,则进入步骤S508,若否,则返回步骤S502;
步骤S508、在接收完该读完成包的数据后,包缓存逻辑将请求序列表中对应该读请求的请求状态改为“传输完成”,并更新活动请求表中该标签ID的状态为“空闲”,使该标签ID可以在下一个读请求中使用。步骤S508结束后,返回步骤S502继续接收新的读完成包。
上述步骤S502-S508对应于实施例一中的步骤S202-S204。
如图6所示,在根据本发明实施例二的PCI-E设备的数据重排方法中,PCI-E设备将已完成的读请求的读完成包数据转存至FIFO存储器中的过程(对应于实施例一中的步骤S206)如下:
步骤S602、排序缓存读出逻辑判断请求序列表的读指针的当前位置的请求状态,若为“传输完成”,则进入步骤S604;若为“传输中”、“空闲”、或“已读”,则排序缓存读出逻辑等待,直至请求状态变为“传输完成”或“超时”;若为“超时”,则进入步骤S606;
步骤S604、排序缓存读出逻辑以请求序列表的读指针所指向的行中的请求长度的值作为读取长度,从排序缓存器中的序号为请求序列表的读指针的值的存储块中读出一个读请求的全部读完成包数据,写入后级的FIFO存储器中,并将请求状态更改为已读。然后,若请求序列表的读指针小于最大指针,则读指针加1,若等于最大指针,则重新置为1。返回步骤S602处理下一行;
步骤S606,排序缓存读出逻辑向应用层报告该读请求处理超时,并将当前读请求计数器(该读请求计数器用于对已经发送的读请求进行计数,每发送一个读请求,该计数器加1)的计数值、超时的读请求所请求的数据的长度以及首地址传递给应用层。然后,排序缓存读出逻辑读出排序缓存器中相应缓存块中的数据,写入后级的FIFO存储器,并更改请求状态为“已读”。此读请求的数据接收长度和次序正确,但数据内容因接收超时而被抛弃。应用层可以要求重新发送超时的读请求,或者不重新发送超时的读请求,而仅对数据流中出错数据的位置和长度进行记录,生成错误报告。其中,请求序列表中各请求的超时计数值始终进行减一计数,直至计数到零。超时计数值减为零后,停止计数,更改该读请求的状态为“超时”。然后,若请求序列表的读指针小于最大指针,则读指针加1,若等于最大指针,则重新置为1。返回步骤S602处理下一行。
显然,在实际实施过程中,上述如图4所示的发送读请求的过程、如图5所示的接收读完成包并将读完成包数据缓存到排序缓存器中的对应存储块的过程、以及如图6所示的将已完成的读请求的读完成包数据转存至FIFO存储器中的过程,这三个过程是并行进行的。
本发明实施例二中,将接收到的读完成包的数据重排序后再写入FIFO存储器,避免了从FIFO存储器中读出的接收数据次序有误的问题。本实施例可以使用一个可随机寻址的小容量的存储器来作为包收发模块与FIFO存储器之间的缓存,本发明中称为排序缓存器。按照读请求的发送次序,顺序地为各个读请求的读完成包数据分配存储块。在使用一个标签ID发送读请求的同时,将标签ID、计算所得的相应的读完成包的数据的存放地址、以及读请求的处理状态,存储在一个请求序列表中。当接收一个读完成包时,将该读完成包中的数据存储在排序缓存器相应的存储块中,并根据包的数据大小更新该读请求的读完成包数据的存放首地址。当接收到一个读请求的最后一个读完成包后,更改请求序列表中的请求状态。请求序列表以及排序缓冲器的大小通过读请求处理的最大延时时间、最大包大小等参数确定。按照读请求的发送顺序,检查读请求的完成状态,并按照相应的顺序将已完成的读请求的读完成包数据读出,写入FIFO存储器中。从而使FIFO存储器写入的读完成包数据的次序与读请求请求数据的次序一致,达到对读完成包数据重排序的目的。当排序缓存器以及相应的请求序列表写满后,排序缓存器以及请求序列表的写入指针归零,新的读请求的处理信息及接收数据会覆盖已经转存入FIFO存储器的旧数据。如果因为某个读请求的完成包接收延时过长,造成数据传输中断时间过长,则放弃继续接收该读请求的读完成包数据,标记此读请求为处理超时,并向应用层通报该超时的读请求的序列号(或读请求计数器的计数值)以及首地址和请求长度,供应用层生成错误报告,或重新发送处理超时的读请求。
实施例三
图7示出了根据本发明实施例三的PCI-E设备的结构示意图,如图7所示,该PCI-E设备包括以下模块:
包收发模块10,用于发送读请求以及接收读完成包;
排序缓存器20,包含有被预先划分成的至少一个存储块,每一个存储块用于存储一个读请求的读完成包的数据,排序缓存器20用于暂存包收发模块10所接收到的读完成包的数据,其中,针对同一个读请求的读完成包的数据,依次暂存到与该读请求对应的存储块中;
控制器30,用于将包收发模块10接收到的读完成包的数据写入到与相应读请求对应的排序缓存器的存储块中,以及按照读请求发送的先后次序,从排序缓存器的各个存储块中,将已完成的读请求的读完成包的数据读出,并写入到FIFO存储器;
FIFO存储器40,用于存储读完成包的数据。
本发明实施例的PCI-E设备在接收到读完成包之后、将读完成包的数据写入FIFO存储器之前,先使用排序缓存器对读完成包的数据进行暂存,并且,通过将针对同一个读请求的读完成包的数据存放到排序缓存器的对应存储块中,并按照读请求发送的先后顺序将已经接收完全的读请求的读完成包的数据写入到FIFO存储器中,从而在将接收到的读完成包的数据写到FIFO存储器之前,按照读请求发送的先后次序对不同读请求的读完成包数据进行了重排序,从而避免了从FIFO存储器中读出的接收数据次序有误的问题,使得从FIFO存储器中读出的接收数据的先后次序与请求数据的先后次序是一致的。
实施例四
如图8所示,控制器30进一步可以包括:初始化模块302和处理模块304,其中:
初始化模块302用于在包收发模块10开始发送读请求以及接收读完成包之前,初始化活动请求表;其中,活动请求表中的每一行包括:标签ID和标签ID状态,其中,标签ID状态表示对应的标签ID当前是否正在被使用,标签ID状态的初始化值为空闲;活动请求表的行数等于PCI-E设备能同时处理的读请求的最大数量;
处理模块304用于在需要发送读请求时,从活动请求表中获取标签ID状态为空闲、且最小的标签ID,并更新所获取的标签ID的标签ID状态为使用中;
则,包收发模块10具体用于在处理模块304获取到标签ID状态为空闲、且最小的标签ID之后,发送读请求,其中,该读请求中携带有所获取的标签ID、请求的数据的长度、以及请求的数据的首地址。
为了实现读完成包数据的重排序,初始化模块302还可以用于在包收发模块10开始发送读请求以及接收读完成包之前,初始化请求序列表;其中,请求序列表具有读指针和写指针,读指针和写指针的初始化值为1,读指针和写指针的值分别表示其所指向的请求序列表的行的行号(即当读指针或写指针的值为1时,表示读指针或写指针指向请求序列表中行号为1的行);请求序列表中的每一行用于保存一个读请求的处理信息;此时,活动请求表(可参见表1)中的每一行还可以包括:请求序列表指针,其中,请求序列表指针表示对应的标签ID所标识的读请求在请求序列表中的存放位置(即存放在哪一行);
则,处理模块304还用于在需要发送读请求时,在从活动请求表中获取标签ID状态为空闲、且最小的标签ID之前,确定请求序列表的写指针当前所指向的行可用;并在从活动请求表中获取标签ID状态为空闲、且最小的标签ID之后,将活动请求表中与所获取的标签ID相对应的请求序列表指针的值更新为请求序列表的写指针当前所指向的行的行号;将需要发送的读请求的处理信息写入到请求序列表的写指针当前所指向的行中;在请求序列表的写指针的当前值小于最大值时,将写指针的值加1,在等于最大值时,将写指针的当前值重新置为1,其中,最大值为请求序列表的行数,请求序列表的行数等于排序缓存器中的存储块的总数。
这样,请求序列表的写指针可以依次轮询表中的各行,实现循环利用表中可用的行,从而节约了资源。
实施例五
当读请求的处理信息包括:标签ID、排序缓存器块内偏移量、请求长度、以及请求状态的时候,为了能够保存读请求的处理信息,则请求序列表中的每一行也应该包括:标签ID、排序缓存器块内偏移量、请求长度、以及请求状态,其中,标签ID为该行对应的读请求所使用的标签ID,且该行的行号等于针对该读请求的读完成包的数据所要存储的存储块的序号(即,假设某一行的行号为N,则该行对应的读请求的读完成包数据就存储到序号为N的存储块中);排序缓存器块内偏移量表示该读请求对应的存储块的写指针的块内偏移量;请求长度表示该读请求所请求的数据的长度;请求状态表示该读请求的当前处理状态,请求状态的初始化值为空闲。
处理模块304进一步用于在请求序列表的写指针当前所指向的行中,将标签ID的值置为所获取的标签ID,将排序缓存器块内偏移量的值置为0,将请求长度的值置为需要发送的读请求所请求的数据的长度,并将请求状态更新为传输中。从而,将一个读请求的处理信息写入了对应的行中。
为了实现将接收到的针对同一个读请求的读完成包的数据,依次暂存到排序缓存器中与该读请求对应的存储块的目的,如图9所示,控制器30还可以包括:
读取模块306,用于在包收发模块10接收到一个读完成包时,从活动请求表中,判定与该读完成包中携带的标签ID相对应的标签ID状态为使用中之后,读取出相对应的请求序列表指针的值;以及,在请求序列表中,从所读取出的请求序列表指针的值所指示的行中,读取出排序缓存器块内偏移量的值;
计算模块307,用于计算出序号等于读取模块306所读取出的请求序列表指针的值的存储块的首地址,并将所计算出的存储块的首地址与读取模块306所读取出的排序缓存器块内偏移量的值之和,作为接收到的读完成包的数据在排序缓存器中的存储首地址;
写入模块308,用于从计算模块307计算出的存储首地址开始,将包收发模块10接收到的读完成包的数据,依序存储至排序缓存器20中,将排序缓存器块内偏移量的值更新为排序缓存器块内偏移量的当前值与接收到的读完成包的数据长度之和;并在包收发模块10接收到的读完成包是对应的读请求的最后一个读完成包时,在请求序列表中,将所读取出的请求序列表指针的值所指示的行中的请求状态的值更新为传输完成,在活动请求表中,将与接收到的读完成包中携带的标签ID相对应的标签ID状态更新为空闲。
这样,在接收到一个读完成包后,由其中携带的标签ID可以获知其所针对的读请求,并从请求序列表中得到该读请求的处理信息,其中包括该读请求所对应的存储块,以及存储偏移量,将该读完成包的数据写入到相应存储块中之后,若该读完成包是对应读请求的最后一个读完成包,则就完成了该读请求的读完成包的传输。从而,实现了将针对同一个读请求的所有读完成包数据依序存储到同一个存储块。
本发明实施例还考虑到了某个读请求的读完成包接收延时可能过长的问题,此时,为了处理这个问题,还可以在请求序列表中的每一行增加一列:超时计数值,该超时计数值由减1计数的超时计数器控制;并且,活动请求表中的标签ID状态除了“空闲”和“使用中”以外,还定义了一个“超时”。则,处理模块304在将需要发送的读请求的处理信息写入到所述请求序列表的写指针当前所指向的行中时还需要在请求序列表的写指针当前所指向的行中,初始化超时计数值,并启动对应的超时计数器从该超时计数值的初始化值(初始化值可以根据实验数据来确定,也可以根据系统情况来确定,如系统传输延时较小,则初始化值可以设置得较小)开始减1计数,直至减为0,此时若对应读请求的读完成包仍未接收完全,则认为该读请求处理超时。具体的,在请求序列表中,判断各行中的超时计数值是否已经减为0,若为0,则判断该行中的请求状态是否为“传输中”,如果是“传输中”,则将请求状态更新为“超时”,同时将活动请求表中与该行中的标签ID相对应的标签ID状态也更新为“超时”。
同时,控制模块30为了实现按照读请求发送的先后次序(即读请求包的发送次序),从排序缓存器20的各个存储块中,将已完成的读请求的读完成包的数据读出,读取模块306还用于在请求序列表的读指针当前所指向的行中的请求状态为传输完成时,读取出该行中的请求长度的值,以及,从序号等于所述请求序列表的读指针的值的存储块中读出数据,其中,所读出的数据的长度为所读取出的请求长度的值。写入模块308还用于将请求序列表中该读指针当前所指向的行中的请求状态更新为已读,并在请求序列表的读指针的当前值小于最大值时,将请求序列表的读指针的当前值加1,在等于最大值时,将读指针的当前值重新置为1。
若请求序列表的读指针当前所指向的行中的请求状态为以下之一:传输中、空闲、已读,则读取模块306等待直至该行中的请求状态的值变为传输完成或超时。
若请求序列表的读指针当前所指向的行中的请求状态为超时,则向应用层报告对应的读请求处理超时,写入模块308将该行中的请求状态的值更新为已读,以及读取模块306读取出该行中的请求长度的值,从序号为请求序列表的读指针的值的存储块中读出数据,其中,所读出的数据的长度为所读取出的请求长度的值;写入模块308在请求序列表的读指针的当前值小于最大值时,将请求序列表的读指针的当前值加1,等于最大值时,将读指针的当前值重新置为1。
上面详细描述了读请求的状态在各种情况时,控制器的不同处理方法。
由此,处理模块304确定请求序列表的写指针当前所指向的行可用具体通过:判断请求序列表的写指针当前所指向的行中的请求状态是否为以下状态之一:空闲、已读、超时,若是,则确定该行可用。在以上情况下,该行可以用来写入新的读请求的处理信息。
从以上的描述中,可以看出,本发明上述的实施例实现了如下技术效果:
在接收到读完成包之后、将读完成包的数据写入FIFO存储器之前,先使用排序缓存器对读完成包的数据进行暂存,并且,通过将针对同一个读请求的读完成包的数据存放到排序缓存器的对应存储块中,并按照读请求发送的先后顺序将已经接收完全的读请求的读完成包的数据写入到FIFO存储器中,从而在将接收到的读完成包的数据写到FIFO存储器之前,按照读请求发送的先后次序对不同读请求的读完成包数据进行了重排序,从而避免了从FIFO存储器中读出的接收数据次序有误的问题,使得从FIFO存储器中读出的接收数据的先后次序与请求数据的先后次序是一致的。
显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (11)
1.一种快速外围组件互连PCI-E设备的接收数据重排序方法,其特征在于,包括:
初始化活动请求表;其中,所述活动请求表中的每一行包括:标签ID和标签ID状态,其中,标签ID状态表示对应的标签ID当前是否正在被使用,标签ID状态的初始化值为空闲;所述活动请求表的行数等于所述PCI-E设备能同时处理的读请求的最大数量;
当需要发送请求时,从所述活动请求表中获取标签ID状态为空闲、且最小的标签ID,并更新所获取的标签ID的标签ID状态为使用中;
发送读请求,其中,该读请求中携带有所获取的标签ID、请求的数据的长度、以及请求的数据的首地址;
接收读完成包;
将接收到的针对同一个读请求的读完成包的数据,依次暂存到排序缓存器中与该读请求对应的存储块中,其中,所述排序缓存器被预先划分成至少一个存储块,每一个存储块用于存储一个读请求的读完成包的数据;
按照读请求发送的先后次序,从所述排序缓存器的各个存储块中,将已完成的读请求的读完成包的数据读出,并写入到先入先出FIFO存储器。
2.根据权利要求1所述的方法,其特征在于,
在从所述活动请求表中获取标签ID状态为空闲、且最小的标签ID之前,还包括:
初始化请求序列表;其中,所述请求序列表具有读指针和写指针,所述读指针和所述写指针的初始化值为1,所述读指针和所述写指针的值分别表示其所指向的所述请求序列表的行的行号;所述请求序列表中的每一行用于保存一个读请求的处理信息;所述活动请求表中的每一行还包括:请求序列表指针,其中,请求序列表指针表示对应的标签ID所标识的读请求的处理信息在所述请求序列表中的存放位置;
当需要发送读请求时,确定所述请求序列表的写指针当前所指向的行可用;
在从所述活动请求表中获取标签ID状态为空闲、且最小的标签ID之后,还包括:
将所述活动请求表中与所述所获取的标签ID相对应的请求序列表指针的值更新为所述请求序列表的写指针当前所指向的行的行号;
将需要发送的读请求的处理信息写入到所述请求序列表的写指针当前所指向的行中;
若所述请求序列表的写指针的当前值小于最大值,则将写指针的值加1,否则,将写指针的当前值重新置为1,其中,所述最大值为所述请求序列表的行数,所述请求序列表的行数等于所述排序缓存器中的存储块的总数。
3.根据权利要求2所述的方法,其特征在于,所述处理信息包括:标签ID、排序缓存器块内偏移量、请求长度、以及请求状态;则所述请求序列表中的每一行包括:标签ID、排序缓存器块内偏移量、请求长度、以及请求状态,其中,标签ID为该行对应的读请求所使用的标签ID,且该行的行号等于针对该读请求的读完成包的数据所要存储的存储块的序号;排序缓存器块内偏移量表示该读请求对应的存储块的写指针的块内偏移量;请求长度表示该读请求所请求的数据的长度;请求状态表示该读请求的当前处理状态,请求状态的初始化值为空闲;
将需要发送的读请求的处理信息写入到所述请求序列表的写指针当前所指向的行中包括:在所述请求序列表的写指针当前所指向的行中,将标签ID的值置为所述所获取的标签ID,将排序缓存器块内偏移量的值置为零,将请求长度置为所述需要发送的读请求所请求的数据的长度,并将请求状态更新为传输中。
4.根据权利要求3所述的方法,其特征在于,将接收到的针对同一个读请求的读完成包的数据,依次暂存到排序缓存器中与该读请求对应的存储块包括:每次接收到读完成包时,均执行的操作包括:
从所述活动请求表中,判定与接收到的读完成包中携带的标签ID相对应的标签ID状态为使用中之后,读取出与该标签ID相对应的请求序列表指针的值;
在所述请求序列表中,从所读取出的请求序列表指针的值所指示的行中,读取出排序缓存器块内偏移量的值;
计算出序号等于所述所读取出的请求序列表指针的值的存储块的首地址;
将所计算出的存储块的首地址与所读取出的排序缓存器块内偏移量的值之和,作为接收到的读完成包的数据在所述排序缓存器中的存储首地址;
从计算出的存储首地址开始,将所述接收到的读完成包的数据,依序存储至所述排序缓存器中,将排序缓存器块内偏移量的值更新为排序缓存器块内偏移量的当前值与接收到的读完成包的数据长度之和;
若所述接收到的读完成包是对应的读请求的最后一个读完成包,则在所述请求序列表中,将所述所读取出的请求序列表指针的值所指示的行中的请求状态的值更新为传输完成,并在所述活动请求表中,将与接收到的读完成包中携带的标签ID相对应的标签ID状态更新为空闲。
5.根据权利要求3所述的方法,其特征在于,所述请求序列表中的每一行还包括:超时计数值,所述超时计数值由减1计数的超时计数器控制;则,
将需要发送的读请求的处理信息写入到所述请求序列表的写指针当前所指向的行中还包括:在所述请求序列表的写指针当前所指向的行中,初始化超时计数值,并启动对应的超时计数器从该超时计数值的初始化值开始减1计数;
所述方法还包括:在所述请求序列表中,判断各行中的超时计数值是否为0,若为0,则判断该行中的请求状态是否为传输中;如果是传输中,则将请求状态更新为超时,同时将所述活动请求表中与该行中的标签ID相对应的标签ID状态也更新为超时。
6.根据权利要求5所述的方法,其特征在于,按照读请求发送的先后次序,从所述排序缓存器的各个存储块中,将已完成的读请求的读完成包的数据读出包括:
若所述请求序列表的读指针当前所指向的行中的请求状态为传输完成,则读取出该行中的请求长度的值;
从序号等于所述请求序列表的读指针的值的存储块中读出数据,其中,所读出的数据的长度为所读取出的请求长度的值;
将所述请求序列表中该读指针当前所指向的行中的请求状态更新为已读;
若所述请求序列表的读指针的当前值小于所述最大值,则将所述请求序列表的读指针的当前值加1,否则,将读指针的当前值重新置为1。
7.根据权利要求6所述的方法,其特征在于,按照读请求发出的先后次序,从所述排序缓存器的各个存储块中,将已完成的读请求的读完成包的数据读出还包括:
若所述请求序列表的读指针当前所指向的行中的请求状态为以下之一:传输中、空闲、已读,则等待直至该行中的请求状态的值变为传输完成或超时。
8.根据权利要求6所述的方法,其特征在于,按照读请求发出的先后次序,从所述排序缓存器的各个存储块中,将已完成的读请求的读完成包的数据读出还包括:
若所述请求序列表的读指针当前所指向的行中的请求状态为超时,则向应用层报告对应的读请求处理超时,将该行中的请求状态的值更新为已读,以及读取出该行中的请求长度的值;
从序号为所述请求序列表的读指针的值的存储块中读出数据,其中,所读出的数据的长度为所读取出的请求长度的值;
若所述请求序列表的读指针的当前值小于所述最大值,则将所述请求序列表的读指针的当前值加1,否则,将读指针的当前值重新置为1。
9.根据权利要求5所述的方法,其特征在于,确定所述请求序列表的写指针当前所指向的行可用包括:
判断所述请求序列表的写指针当前所指向的行中的请求状态是否为以下状态之一:空闲、已读、超时,若是,则确定该行可用。
10.一种快速外围组件互连PCI-E设备,其特征在于,包括:
包收发模块,用于发送读请求以及接收读完成包;
排序缓存器,包含有被预先划分成的至少一个存储块,每一个存储块用于存储一个读请求的读完成包的数据,所述排序缓存器用于暂存所述包收发模块所接收到的读完成包的数据,其中,针对同一个读请求的读完成包的数据,依次暂存到与该读请求对应的存储块中;
控制器,用于按照读请求发出的先后次序,从所述排序缓存器的各个存储块中,将已完成的读请求的读完成包的数据读出,并写入到先入先出FIFO存储器;
所述FIFO存储器,用于存储读完成包的数据;
其中,所述控制器包括:
初始化模块,用于在所述包收发模块开始发送读请求以及接收读完成包之前,初始化活动请求表;其中,所述活动请求表中的每一行包括:标签ID和标签ID状态,其中,标签ID状态表示对应的标签ID当前是否正在被使用,标签ID状态的初始化值为空闲;所述活动请求表的行数等于所述PCI-E设备能同时处理的读请求的最大数量;
处理模块,用于在需要发送读请求时,从所述活动请求表中获取标签ID状态为空闲、且最小的标签ID,并更新所获取的标签ID的标签ID状态为使用中;
所述包收发模块,具体用于在所述处理模块获取到标签ID状态为空闲、且最小的标签ID之后,发送读请求,其中,该读请求中携带有所获取的标签ID、请求的数据的长度、以及请求的数据的首地址。
11.根据权利要求10所述的设备,其特征在于,
所述初始化模块还用于在所述包收发模块开始发送读请求以及接收读完成包之前,初始化请求序列表;其中,所述请求序列表具有读指针和写指针,所述读指针和所述写指针的初始化值为1,所述读指针和所述写指针的值分别表示其所指向的所述请求序列表的行的行号;所述请求序列表中的每一行用于保存一个读请求的处理信息;所述活动请求表中的每一行还包括:请求序列表指针,其中,请求序列表指针表示对应的标签ID所标识的读请求在所述请求序列表中的存放位置;
所述处理模块还用于在需要发送读请求时,在从所述活动请求表中获取标签ID状态为空闲、且最小的标签ID之前,确定所述请求序列表的写指针当前所指向的行可用;并在从所述活动请求表中获取标签ID状态为空闲、且最小的标签ID之后,将所述活动请求表中与所述所获取的标签ID相对应的请求序列表指针的值更新为所述请求序列表的写指针当前所指向的行的行号;将需要发送的读请求的处理信息写入到所述请求序列表的写指针当前所指向的行中;在所述请求序列表的写指针的当前值小于最大值时,将写指针的值加1,在大于或等于所述最大值时,将写指针的当前值重新置为1,其中,所述最大值为所述请求序列表的行数,所述请求序列表的行数等于所述排序缓存器中的存储块的总数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110309764.5A CN103049240B (zh) | 2011-10-13 | 2011-10-13 | Pci-e设备及其接收数据重排序方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110309764.5A CN103049240B (zh) | 2011-10-13 | 2011-10-13 | Pci-e设备及其接收数据重排序方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103049240A CN103049240A (zh) | 2013-04-17 |
CN103049240B true CN103049240B (zh) | 2016-03-02 |
Family
ID=48061893
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201110309764.5A Expired - Fee Related CN103049240B (zh) | 2011-10-13 | 2011-10-13 | Pci-e设备及其接收数据重排序方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103049240B (zh) |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103532875B (zh) * | 2013-10-12 | 2017-11-03 | 丁贤根 | 一种用于pcie应用层接口的重排序方法 |
CN105721338B (zh) * | 2016-01-29 | 2019-08-02 | 浪潮(北京)电子信息产业有限公司 | 一种接收数据的处理方法及装置 |
CN105681222A (zh) * | 2016-03-03 | 2016-06-15 | 深圳市同创国芯电子有限公司 | 一种数据接收缓存方法、装置及通信系统 |
TWI621946B (zh) * | 2017-06-28 | 2018-04-21 | 緯創資通股份有限公司 | 排程方法、PCIe控制器及其相關電子系統 |
CN107590088B (zh) * | 2017-09-27 | 2018-08-21 | 山东渔翁信息技术股份有限公司 | 一种dma读操作的处理方法、系统及相关装置 |
WO2021207919A1 (zh) * | 2020-04-14 | 2021-10-21 | 深圳市大疆创新科技有限公司 | 控制器、存储器件访问系统、电子设备和数据传输方法 |
CN112328519B (zh) * | 2020-09-30 | 2022-02-18 | 郑州信大捷安信息技术股份有限公司 | 一种pcie设备、基于sr-iov的数据包有序传输方法和系统 |
CN112328520B (zh) * | 2020-09-30 | 2022-02-11 | 郑州信大捷安信息技术股份有限公司 | 一种pcie设备、基于pcie设备的数据传输方法和系统 |
CN114691571B (zh) * | 2020-12-28 | 2024-05-28 | 上海寒武纪信息科技有限公司 | 数据处理方法、重排序缓存器及互联设备 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1953461A (zh) * | 2005-10-19 | 2007-04-25 | 辉达公司 | 编码数据包头以启用PCIe链路高带宽效率的系统和方法 |
CN101882126A (zh) * | 2010-07-13 | 2010-11-10 | 中国科学院计算技术研究所 | 多个HT总线到单个PCIe总线的桥接装置及其方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7228362B2 (en) * | 2004-03-31 | 2007-06-05 | Intel Corporation | Out-of-order servicing of read requests with minimal additional storage |
-
2011
- 2011-10-13 CN CN201110309764.5A patent/CN103049240B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1953461A (zh) * | 2005-10-19 | 2007-04-25 | 辉达公司 | 编码数据包头以启用PCIe链路高带宽效率的系统和方法 |
CN101882126A (zh) * | 2010-07-13 | 2010-11-10 | 中国科学院计算技术研究所 | 多个HT总线到单个PCIe总线的桥接装置及其方法 |
Also Published As
Publication number | Publication date |
---|---|
CN103049240A (zh) | 2013-04-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103049240B (zh) | Pci-e设备及其接收数据重排序方法 | |
CN100592273C (zh) | 执行dma数据传输的设备和方法 | |
CN110083461B (zh) | 一种基于fpga的多任务处理系统及方法 | |
US20080162860A1 (en) | Dynamic allocation of message buffers | |
CN101636721B (zh) | 用于处理未知长度传输的dmac | |
CN104484295B (zh) | 并行计算机系统中基于接收方滑动窗口的数据传输方法 | |
CN100445975C (zh) | 数据传输控制装置、图像处理装置和数据传输控制方法 | |
US20050240688A1 (en) | Efficient data transfer from an ASIC to a host using DMA | |
CN101707565B (zh) | 零拷贝网络报文发送、接收方法和装置 | |
CN111641566B (zh) | 数据处理的方法、网卡和服务器 | |
CN101227388B (zh) | 操作计算机系统的方法和具有网络接口重发的计算机系统 | |
CN107728936A (zh) | 用于传输数据处理请求的方法和装置 | |
CN103685578B (zh) | 主从设备的数据传输方法 | |
CN101158936A (zh) | 一种节点之间的数据传输系统和装置及方法 | |
CN101877666A (zh) | 基于零拷贝方式的多应用程序报文接收方法和装置 | |
CN115718711A (zh) | 一种dma数据传输的系统和方法 | |
CN111538694B (zh) | 一种用于网络接口支持多链接和重传的数据缓存方法 | |
CN113590512A (zh) | 可直连外设设备的自启动dma装置及应用 | |
CN112035898A (zh) | 多节点多通道高速并行处理方法及系统 | |
CN101901199A (zh) | 一种数据透明传输的方法及系统 | |
CN109857553A (zh) | 内存管理方法及装置 | |
US10095643B2 (en) | Direct memory access control device for at least one computing unit having a working memory | |
CN101576865B (zh) | 保证存储器读交易带宽的方法和装置 | |
CN110659143A (zh) | 一种容器间的通讯方法、装置及电子设备 | |
CN105721338A (zh) | 一种接收数据的处理方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20160302 |