一种对cpld数据包进行有序存储的方法及系统的制作方法
【技术领域】
[0001]本发明涉及基于PCI Express高速总线的数据存储领域,尤其涉及一种针对由PCIExpress端点设备向主机内存发起DMA读请求而返回的CPLD (Complet1n Data)数据包有序存储的方法及系统。
【背景技术】
[0002]第一代I/O总线包括ISA、EISA、VESA和微通道(Micro Channel)总线,而第二代I/O总线则包括了 PC1、AGP和PC1-X。而PCI Express是用来互联诸如计算和通信平台应用中的外围设备的第三代高性能I/O总线。
[0003]前两代的I/O总线是并行总线,多台设备共享一条总线。而第三代总线PCIExpress继承了第二代总线体系结构最有用的特点,并且采用了计算机体系结构中新的研究成果,它能够实现用于两台设备之间通信的串行、点对点类型的互连。多台PCI Express设备可以使用交换器(Switch)实现互连。PCI Express总线规范目前已经得到了广泛的应用,规范也从初始的PC1-E 1.0发展到目前的PC1-E 3.0版本,总线数据传输速度,也从开始的 2Gbits/ 每通道(PC1-E 1.0),提高到目前的 8Gbits/s (PC1-E 3.0)。
[0004]PCI Express规范定义了一种分层的设备设计体系结构,分别是处理层(Transact1n Layer)、数据链路层(Data Link Layer)和物理层(Physical Layer)。对于绝大多数应用PCI Express芯片或者基于PCI Express IP核进行开发的设计者来说,主要关注的内容集中在处理层。处理层主要完成以下事务:存储器读或写,10读或写,配置读或写以及消息处理。
[0005]在目前很多高速数据处理应用场景中,针对存储器的读写事物处理占主导地位。在基于PCI Express的高速数据传输应用中,PCI Express端点(Endpoint)设备要发挥出最大的数据传输效能,同时尽可能的减少主机CPU的占用率,就要采用DMA方式,就是由PCI Express端点设备主动地向主机内存发起DMA读请求,然后接收传输进来的数据;或者由PCI Express端点设备主动地对主机内存发起DMA写请求,以完成数据传输功能。
[0006]PCI Express设备适合大数据量的高速传输,正常工作时DMA传输的数据量比较大,所以每次DMA读请求时的数据包也比较大。但是PCI Express规范有个限制,一次DMA读请求所能允许的最大数据传输量不能超过Max Request Size,而Max Request Size在PCI Express端点设备中一般为512,最大不能超过4096字节。但是很多应用中,要求DMA读传输的数据是这个参数的几十倍甚至上百倍。
【发明内容】
[0007]本发明所要解决的技术问题是针对现有技术的不足,提供一种针对由PCIExpress端点设备向主机内存发起DMA读请求而返回的CPLD (Complet1n Data)数据包有序存储的方法及系统。
[0008]本发明解决上述技术问题的技术方案如下:
[0009]—种对CPLD数据包进行有序存储的方法,包括如下步骤:
[0010]步骤1,利用标签有序分发体制将PCI Express端点设备向主机内存发起的DMA读请求分割成带有连续标签的多个子DMA读请求发送至主机;
[0011 ] 步骤2,接收主机返回的CPLD数据包,根据CPLD数据包的标签确定所述CPLD数据包在PCI Express端点设备的存储基址;
[0012]步骤3,对带有相同标签的CPLD数据包进行偏移地址计算,确定所述CPLD数据包的偏移地址;
[0013]步骤4,根据确定的所述CPLD数据包在PCI Express端点设备的存储基址和偏移地址对相应CPLD数据包进行存储。
[0014]本发明的有益效果是:本发明建立了标签有序分发体制,将大数据量DMA读请求分割成多个子DMA读请求,并以标签标记,实现大数据量的DMA读操作,但由于CPLD数据包的返回并非全部按照标签的顺序返回的,这样对于采用FIFO存储或者顺序RAM存储的方案就会存在数据存储地址乱序的问题,本发明建立了针对完成数据包(CPLD)的同一标签数据的偏移地址计算体制,实现了 PCI Express端点设备高速DMA读和CPLD数据在RAM中有序存储的高效高速无延迟存储方案,大大提高了数据吞吐率。
[0015]在上述技术方案的基础上,本发明还可以做如下改进。
[0016]进一步,步骤1的具体实现为:当PCI Express端点设备向主机内存发起DMA读请求时,根据DMA读请求包的大小和PCI Express总线规范中的Max Request Size的大小将DMA读请求包分割成多个子DMA读请求包,多个子DMA读请求包对内存的寻址地址前后衔接,每个子DMA读请求包按照发送顺序依次被标签有序分发体制分配以连续的标签号码Tag以区别不同的寻址空间。
[0017]采用上述进一步方案的有益效果:将一个大的DMA请求包分割成多个子DMA读请求包,实现了数据的分散传输,进而实现了大数据量的DMA读操作。
[0018]进一步,当PCI Express端点设备一次发起的DMA读的寻址范围超过所述标签有序分发体制所有标签的一次最大寻址量时,启动标签页指针体制,以区分不同的寻址空间,其中每个标签具有一个页指针;当启动所述标签页指针体制后,步骤2中根据CPLD数据包的标签及相应标签的页指针确定所述CPLD数据包在PCI Express端点设备的存储基址。
[0019]采用上述进一步方案的有益效果:基于标签有序分发体制中的标签数量有限,每一个标签代表一定数量的寻址范围,可能出现PCIE Express端点设备一次发起的DMA读的寻址范围超过了这一套标签分发体制所能分发的最大数量,通过建立一套标签页指针体制,来区分不同的寻址空间,以扩大寻址范围。
[0020]进一步,所述标签页指针体制具体为:如果一个标签未被使用时,将该标签对应的页指针为零,如果该标签被使用过一次,那么该标签对应的页指针自动加一。
[0021]进一步,所述步骤3的具体实现为:带有相同标签的第一个收到的CPLD数据包的偏移地址为0,第二个收到的CPLD数据包的偏移地址为第一收到的CPLD数据包的数据长度,第i个收到的CPLD的数据包的偏移地址为第一至第1-Ι个收到的CPLD数据包的数据长度之和,其中i为大于等于3的整数。
[0022]采用上述进一步方案的有益效果:每个标签对应的子DMA读请求获取的数据可能需要多次CPLD才能接收到全部数据,这些多次返回的CPLD数据对应的是同一个标签的DMA读请求,但这些CPLD数据并不能保证是按照标签的顺序返回的,因此需要对这些先后返回的带着相同标签的CPLD数据进行偏移地址计算以实现准确的存储。
[0023]—种对CPLD数据包进行有序存储的系统,包括DMA请求发送模块、存储基址计算模块、偏移地址计算模块和数据包存储模块;
[0024]所述DMA请求发送模块,其用于利用标签有序分发体制将PCI Express端点设备向主机内存发起的DMA读请求分割成带有连续标签的多个子DMA请求发送至主机;
[0025]所述存储基址计算模块,其用于接收主机返回的CPLD数据包,根据CPLD数据包的标签确定所述CPLD数据包在PCI Express端点设备的存储基址;
[0026]所述偏移地址计算模块,其用于对带有相同标签的CPLD数据包进行偏移地址计算,确定所述CPLD数据包的偏移地址;
[0027]所述数据包存储模块,其用于根据确定的所述CPLD数据包在PCI Express端点设备的存储基址和偏移地址对相应CPLD数据包进行存储。
[0028]在上述技术方案的基础上,本发明还可以做如下改进。
[0029]进一步,所述DMA请求发送模块包括DMA请求分割单元和标签分发单元;
[0030]所述DMA请求分割单元,其用于在PCI Express端点设备向主机内存发起DMA读请求时,根据DMA读请求包的大小和PCI Express总线规范中的Max Request Size的大小将DMA读请求包分割成多个子DMA读请求包,多个子DMA读请求包对内存的寻址地址前后衔接;
[0031]所述标签分发单元,其用于为子DMA读请求包按照发送顺序依次分配以连续的标签号码Tag以区别不同的寻址空间
[0032]进一步,还包括页指针触发模块,其用于在PCI Express端点设备一次发起的DMA读的寻址范围超过所述标签有序分发体制所有标签的最大寻址量时,启动标签页指针体制,以区分不同的寻址空间,其中每个标签具有一个页指针;当启动所述标签页指针体制后,所述存储基址计算模块根据CPLD数据包的标签及相应标签的页指针确定所述CPLD数据包的存储基址。
[0033]进一步,所述标签页指针体制具体为:如果一个标签未被使用时,将该标签对应的页指针为零,如果该标签被使用过一次,那么该标签对应的页指针自动加一。
[0034]进一步,所述偏移地址计算模块计算偏移地址具体为::带有相同标签的第一个收到的CPLD数据包的偏移地址为0,第二个收到的CPLD数据包的偏移地址为第一收到的CPLD数据包的数据长度,第i个收到的CPLD的数据包的偏移地址为第一至第1-Ι个收到的CPLD数据包的数据长度之和,其中i为大于