发明内容
本发明所要解决的技术问题是针对现有技术的不足,提供一种针对由PCIExpress端点设备向主机内存发起DMA读请求而返回的CPLD(CompletionData)数据包有序存储的方法及系统。
本发明解决上述技术问题的技术方案如下:
一种对CPLD数据包进行有序存储的方法,包括如下步骤:
步骤1,利用标签有序分发体制将PCIExpress端点设备向主机内存发起的DMA读请求分割成带有连续标签的多个子DMA读请求发送至主机;
步骤2,接收主机返回的CPLD数据包,根据CPLD数据包的标签确定所述CPLD数据包在PCIExpress端点设备的存储基址;
步骤3,对带有相同标签的CPLD数据包进行偏移地址计算,确定所述CPLD数据包的偏移地址;
步骤4,根据确定的所述CPLD数据包在PCIExpress端点设备的存储基址和偏移地址对相应CPLD数据包进行存储。
本发明的有益效果是:本发明建立了标签有序分发体制,将大数据量DMA读请求分割成多个子DMA读请求,并以标签标记,实现大数据量的DMA读操作,但由于CPLD数据包的返回并非全部按照标签的顺序返回的,这样对于采用FIFO存储或者顺序RAM存储的方案就会存在数据存储地址乱序的问题,本发明建立了针对完成数据包(CPLD)的同一标签数据的偏移地址计算体制,实现了PCIExpress端点设备高速DMA读和CPLD数据在RAM中有序存储的高效高速无延迟存储方案,大大提高了数据吞吐率。
在上述技术方案的基础上,本发明还可以做如下改进。
进一步,步骤1的具体实现为:当PCIExpress端点设备向主机内存发起DMA读请求时,根据DMA读请求包的大小和PCIExpress总线规范中的MaxRequestSize的大小将DMA读请求包分割成多个子DMA读请求包,多个子DMA读请求包对内存的寻址地址前后衔接,每个子DMA读请求包按照发送顺序依次被标签有序分发体制分配以连续的标签号码Tag以区别不同的寻址空间。
采用上述进一步方案的有益效果:将一个大的DMA请求包分割成多个子DMA读请求包,实现了数据的分散传输,进而实现了大数据量的DMA读操作。
进一步,当PCIExpress端点设备一次发起的DMA读的寻址范围超过所述标签有序分发体制所有标签的一次最大寻址量时,启动标签页指针体制,以区分不同的寻址空间,其中每个标签具有一个页指针;当启动所述标签页指针体制后,步骤2中根据CPLD数据包的标签及相应标签的页指针确定所述CPLD数据包在PCIExpress端点设备的存储基址。
采用上述进一步方案的有益效果:基于标签有序分发体制中的标签数量有限,每一个标签代表一定数量的寻址范围,可能出现PCIEExpress端点设备一次发起的DMA读的寻址范围超过了这一套标签分发体制所能分发的最大数量,通过建立一套标签页指针体制,来区分不同的寻址空间,以扩大寻址范围。
进一步,所述标签页指针体制具体为:如果一个标签未被使用时,将该标签对应的页指针为零,如果该标签被使用过一次,那么该标签对应的页指针自动加一。
进一步,所述步骤3的具体实现为:带有相同标签的第一个收到的CPLD数据包的偏移地址为0,第二个收到的CPLD数据包的偏移地址为第一收到的CPLD数据包的数据长度,第i个收到的CPLD的数据包的偏移地址为第一至第i-1个收到的CPLD数据包的数据长度之和,其中i为大于等于3的整数。
采用上述进一步方案的有益效果:每个标签对应的子DMA读请求获取的数据可能需要多次CPLD才能接收到全部数据,这些多次返回的CPLD数据对应的是同一个标签的DMA读请求,但这些CPLD数据并不能保证是按照标签的顺序返回的,因此需要对这些先后返回的带着相同标签的CPLD数据进行偏移地址计算以实现准确的存储。
一种对CPLD数据包进行有序存储的系统,包括DMA请求发送模块、存储基址计算模块、偏移地址计算模块和数据包存储模块;
所述DMA请求发送模块,其用于利用标签有序分发体制将PCIExpress端点设备向主机内存发起的DMA读请求分割成带有连续标签的多个子DMA请求发送至主机;
所述存储基址计算模块,其用于接收主机返回的CPLD数据包,根据CPLD数据包的标签确定所述CPLD数据包在PCIExpress端点设备的存储基址;
所述偏移地址计算模块,其用于对带有相同标签的CPLD数据包进行偏移地址计算,确定所述CPLD数据包的偏移地址;
所述数据包存储模块,其用于根据确定的所述CPLD数据包在PCIExpress端点设备的存储基址和偏移地址对相应CPLD数据包进行存储。
在上述技术方案的基础上,本发明还可以做如下改进。
进一步,所述DMA请求发送模块包括DMA请求分割单元和标签分发单元;
所述DMA请求分割单元,其用于在PCIExpress端点设备向主机内存发起DMA读请求时,根据DMA读请求包的大小和PCIExpress总线规范中的MaxRequestSize的大小将DMA读请求包分割成多个子DMA读请求包,多个子DMA读请求包对内存的寻址地址前后衔接;
所述标签分发单元,其用于为子DMA读请求包按照发送顺序依次分配以连续的标签号码Tag以区别不同的寻址空间
进一步,还包括页指针触发模块,其用于在PCIExpress端点设备一次发起的DMA读的寻址范围超过所述标签有序分发体制所有标签的最大寻址量时,启动标签页指针体制,以区分不同的寻址空间,其中每个标签具有一个页指针;当启动所述标签页指针体制后,所述存储基址计算模块根据CPLD数据包的标签及相应标签的页指针确定所述CPLD数据包的存储基址。
进一步,所述标签页指针体制具体为:如果一个标签未被使用时,将该标签对应的页指针为零,如果该标签被使用过一次,那么该标签对应的页指针自动加一。
进一步,所述偏移地址计算模块计算偏移地址具体为::带有相同标签的第一个收到的CPLD数据包的偏移地址为0,第二个收到的CPLD数据包的偏移地址为第一收到的CPLD数据包的数据长度,第i个收到的CPLD的数据包的偏移地址为第一至第i-1个收到的CPLD数据包的数据长度之和,其中i为大于等于3的整数。
具体实施方式
以下结合附图对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。
本发明针对因PCIExpress端点设备发起的DMA读而返回的完成数据包(CPLD)存在乱序的问题,提出了一种基于Tag的寻址方案,从而实现对完成数据包CPLD的有序存储。为了实现大数据量的DMA读操作,需要将整个DMA读传输分割成连续的多个小的DMA读操作来组合完成,每个DMA读数据传输长度为MaxRequestSize大小,连续的小的DMA读操作,分别以连续的Tag来区分。
基本上大多数每个DMA读请求而返回的数据CPLD是依顺序返回的(依Tag顺序),但是也存在后发的DMA读请求返回的数据领先于前一个DMA读请求的返回数据,这样对于一个采用FIFO存储或者顺序RAM存储的方案就会存在数据存储地址乱序的问题,本发明就是针对这种乱序问题,提出一种基于Tag的方案,来实现对DMA读请求而返回的CPLD数据的有序存储。
PCIExpress端点设备往主机内存发起DMA读请求时,首先要向主机发起DMA读数据包,这个数据包包括如下内容:访问目标内存的物理地址、目标内存需要传回的数据长度,请求者ID号和标记Tag等内容。主机内存返回给PCIExpress端点设备完成数据包CPLD(CompletionData),PCIExpress端点设备接收到该数据包后,对数据包进行解析,然后将有效数据进行存储。
本发明技术方案如下:
一、建立一套标签(Tag)有序分发体制。
当PCIExpress端点设备向主机内存发起DMA读请求时,根据DMA请求包的大小和PCIExpress总线规范中的MaxRequestSize的大小将DMA请求包分割成多个子DMA请求包,多个子DMA请求包对内存的寻址地址前后衔接,每个子DMA请求包按照发送顺序依次被标签有序分发体制分配以连续的标签号码Tag以区别不同的寻址空间。
如图1所示,当主机对一个PCIExpress端点设备发送一个DMA读命令时,这个读命令要求端点设备主动发起对系统内存的某一区域进行读访问,然后把那一区域的数据传送入端点设备内部的存储器。为了增加有效数据吞吐效率,这个读命令一般都是要求访问比较大的区域。但是受制于PCIExpress总线规范的约束,PCIExpress端点设备一次读请求包所能访问的区域不能超过MaxRequestSize的大小。通常MaxRequestSize等于512,也就是说,端点设备一次读请求所能访问的空间也就是512字节。这样一个8K字节的DMA读访问命令,要在PCIExpress端点设备里要拆分成16个DMA读请求包(每个512字节)连续发送出去。
每个DMA读请求包都需要一个独立的标签(Tag)来区分不同的访问地址,本发明中设计了一套标签有序分发机制,该机制总共有16个标签,从0到15。0赋给第一个子DMA读请求,要求访问目标地址的第一个512字节,1赋给第二个DMA读请求,对应目标地址紧邻的第二个512字节,15赋给最后一个DMA读请求包,去访问目标地址的最后一个512字节。
二、建立一套标签(Tag)页指针体制。
根据PCIExpress规范的要求,标签(Tag)的个数是有限的,每一个标签代表一定数量的寻址范围,如果PCIExpress端点设备一次发起的DMA读的寻址范围超过了这一套标签分发体制所能寻址的最大数量,就需要引入一套标签页指针体制,来区分不同的寻址空间,以扩大寻址范围。具体来说,如果一个标签(Tag)未被使用的话,那么该标签对应的页指针即为零,如果该标签被使用过一次,那么该标签对应的页指针就会自动加一以进行区别。这样,标签有序分发体制有多少个标签,就对应多少个标签页指针。
图2为标签页指针体制示意图。当端点设备接收的DMA读的命令在8K字节以内,标签是足够用的。但是当接收的读命令是访问超过8K字节的空间时,这16个标签就不够用了。因此需要增加一套机制来处理访问目标大于8K字节的访问。于是引入了一套标签页指针体制,每个标签对应一个页指针,当该标签未被使用时,该标签对应的页指针为0,当该标签被使用过一次后,其对应的页指针就自动加一。这样通过标签(Tag)以及该标签所对应的标签页指针Tagrepeat可以实现对大包DMA读访问而返回的CPLD数据的有序存储。
三、建立一套针对完成数据包(CPLD)的同一标签数据的偏移地址计算体制
PCIExpress端点设备进行DMA读时,依据MaxRequestSize的大小,将整个DMA读分割成多个子DMA读请求分别发送出去,一般来说每个子DMA读的数据大小就是MaxRequestSize大小,比如512字节,返回的CPLD数据包一般受制于PCIExpress链路上分配的MaxPayload的大小,大多数主板的MaxPayload的大小不超过256字节,或为128,或为256。这样一个PCIExpress端点设备的DMA读(比如512字节的读),至少需要2次CPLD才能接收到全部数据(每次CPLD的数据为256字节)。在某些慢速主板或者系统繁忙时需要更多次CPLD才能接收到全部数据。这些多次返回的CPLD数据对应的是同一个标签(Tag)的DMA读请求,因此需要对这些先后返回的带着相同标签的CPLD数据进行偏移地址计算以实现准确的存储。
图3为CPLD返回数据包乱序示意图。PCIExpress端点设备发起DMA读请求时,如图所示,端点设备将DMA读拆分成多个子DMA读请求,比如两个连续的512字节读请求,分别用Tag0、Tag1来标识。相应的,对应于这些用Tag标识的DMA读请求,相应的返回数据CPLD也以相应的Tag标识,比如对应于Tag0的DMA读请求,返回的CPLD由三个TLP组成(有效数据分别为256字节、128字节、128字节);对应于Tag1的DMA读请求,其返回的CPLD数据由2个TLP组成(有效数据分别为256字节、256字节)。从图上可以看到,Tag1的CPLD数据先于Tag0的CPLD返回,而不是按照先返回Tag0数据再返回Tag1的数据的顺序,这在PCIExpress总线上是经常发生的现象,因此对这些数据进行有序存储是非常重要的事情。
PCIExpress端点设备发送DMA请求时,通过标签Tag将不同地址的DMA读访问用以标识,当CPLD数据返回时,根据返回CPLD的Tag以及其对应的页指针Tagrepeat决定某一特定标签Tag的CPLD在PCIExpress端点设备的内部存储基址。从图3中可以看到,某个Tag(比如Tag0)的CPLD往往由多个CPLD组成,这些相同Tag的CPLD对应于内部存储的基址是相同的,但是他们相对于基址的偏移地址是不同的,因此需要计算这些相同Tag的CPLD对应于基址的偏移地址,以实现正确存储。
如图4所示,一种对CPLD数据包进行有序存储的方法,包括如下步骤:
步骤1,利用标签有序分发体制将PCIExpress端点设备向主机内存发起的DMA读请求以分割的带有连续标签的多个子DMA请求发送至主机。
步骤2,接收主机返回的CPLD数据包,根据CPLD数据包的标签确定所述CPLD数据包在PCIExpress端点设备的存储基址。
其中,带有相同标签的CPLD数据包具有相同的在PCIExpress端点设备的存储基址。当启动标签页指针体制后,则根据CPLD数据包的标签及相应标签的页指针确定所述CPLD数据包在PCIExpress端点设备的存储基址。
步骤3,对带有相同标签的CPLD数据包进行偏移地址计算,确定所述CPLD数据包的偏移地址;
具体地,带有相同标签的第一个收到的CPLD数据包的偏移地址为0,第二个收到的CPLD数据包的偏移地址为第一收到的CPLD数据包的数据长度,第i个收到的CPLD的数据包的偏移地址为第一至第i-1个收到的CPLD数据包的数据长度之和,其中i为大于等于3的整数。
步骤4,根据确定的所述CPLD数据包在PCIExpress端点设备的存储基址和偏移地址对相应CPLD数据包进行存储。
如对于带有相同标签的CPLD,第一个接收到的CPLD对应的内部存储首地址为基地址+偏移地址0,第二个CPLD对应的内部存储首地址为基地址+第一个CPLD包的数据长度,第三个CPLD对应的内部存储首地址为基地址+前两个CPLD包的数据长度之和。不管针对某个特定标签Tag的DMA读请求而返回的CPLD数据包有多少个,都是用类似原理来计算该CPLD存储的地址。
当一个子DMA请求包发出去以后(对应的标签假若为Tag0),目标地址所返回的完成数据包(CPLD),往往由多个CPLD组成,图3中Tag0标识的DMA读请求分成3个CPLD来完成DMA读请求所需要的数据。第一个接收到的CPLD对应的内部存储首地址为基地址+偏移地址0,第二个CPLD对应的内部存储首地址为基地址+第一个CPLD包的数据长度,第三个CPLD对应的内部存储首地址为基地址+前两个CPLD包的数据长度之和。不管针对某个特定Tag的DMA读请求而返回的CPLD数据包有多少个,都是用类似原理来计算该CPLD存储的地址。
以上实施过程在已经在XilinxKC705开发板上已经进行了验证,并取得高数据吞吐率的指标。本发明建立了标签有序分发体制,建立了标签页指针体制,建立了针对完成数据包(CPLD)的同一标签数据的偏移地址计算体制,并成为一套完整实现了PCIExpress端点设备高速DMA读和CPLD数据在RAM中有序存储的高效高速无延迟存储方案。
如图5所示,一种对CPLD数据包进行有序存储的系统,包括DMA请求发送模块、存储基址计算模块、偏移地址计算模块和数据包存储模块;
所述DMA请求发送模块,其用于利用标签有序分发体制将PCIExpress端点设备向主机内存发起的DMA读请求以分割的带有连续标签的多个子DMA请求发送至主机;
所述存储基址计算模块,其用于接收主机返回的CPLD数据包,根据CPLD数据包的标签确定所述CPLD数据包在PCIExpress端点设备的存储基址;
所述偏移地址计算模块,其用于对带有相同标签的CPLD数据包进行偏移地址计算,确定所述CPLD数据包的偏移地址;
所述数据包存储模块,其用于根据确定的所述CPLD数据包在PCIExpress端点设备的存储基址和偏移地址对相应CPLD数据包进行存储。
具体地,所述DMA请求发送模块包括DMA请求分割单元和标签分发单元;所述DMA请求分割单元,其用于在PCIExpress端点设备向主机内存发起DMA读请求时,根据DMA请求包的大小和PCIExpress总线规范中的MaxRequestSize的大小将DMA请求包分割成多个子DMA请求包,多个子DMA请求包对内存的寻址地址前后衔接;所述标签分发单元,其用于为子DMA请求包按照发送顺序依次分配以连续的标签号码Tag以区别不同的寻址空间
上述技术方案还包括页指针触发模块,其用于在PCIExpress端点设备一次发起的DMA读的寻址范围超过所述标签有序分发体制所有标签的最大寻址量时,启动标签页指针体制,以区分不同的寻址空间,其中每个标签具有一个页指针;当启动所述标签页指针体制后,所述存储基址计算模块根据CPLD数据包的标签及相应标签的页指针确定所述CPLD数据包的存储基址。
所述标签页指针体制具体为:如果一个标签未被使用时,将该标签对应的页指针为零,如果该标签被使用过一次,那么该标签对应的页指针自动加一。
所述偏移地址计算模块计算偏移地址具体为:带有相同标签的第一个收到的CPLD数据包的偏移地址为0,第二个收到的CPLD数据包的偏移地址为第一收到的CPLD数据包的数据长度,第i个收到的CPLD的数据包的偏移地址为第一至第i-1个收到的CPLD数据包的数据长度之和,其中i为大于等于3的整数。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。