发明内容
本发明提供了一种实现小包访问内存高速线速的方法及装置,提高内存利用率,实现小包高速线速。
本发明提供了一种实现小包访问内存高速线速的方法,应用于包括接收模块、内存区域、内存控制器和发送模块的装置中,所述方法包括以下步骤:
所述内存控制器对需要写入的小包进行组包,并判断组合后的小包是否大于等于第一组包阈值,如果达到所述组合后的小包写入内存区域;
在所述内存区域中的包处理后,所述内存控制器对需要读出的包进行组包,当所述组包大于等于第二组包阈值时从所述内存区域中读出,并通过所述报文发送模块转发所述组包;
第一组包阈值为写入时需要达到的高速线速的组包长度,第二组包阈值为读出时需要达到的高速线速的组包长度。
所述从所述内存区域中读出,之前还包括:
判断所述组包中的相邻小包是否属于同一Bank,如果属于同一Bank,则通过缓存FIFO将后续相同Bank的小包进行调序,使其远离前一个相同Bank的小包。
所述对需要写入的小包进行组包,之后还包括:
检测到若干小包的组包长度达到包长门限,将所述组包发出,并启动超时判断;
如果后续又发生组包,结束上次超时判断,并开始新的超时判断;如果所述超时判断时间达到预设超时阀值而没发生组包,则自动触发内存写操作,将没有达到包长门限且待写入的小包组包写入到内存。
所述第一组包阈值和所述第二组包阈值根据内存时钟频率确定。
本发明还提供了一种实现小包访问内存高速线速的装置,包括:
接收模块,用于接收外部发送的小包报文;
内存控制模块,与所述接收模块连接,用于对需要写入的小包进行组包,并判断组合后的小包是否大于等于第一组包阈值,如果达到所述组合后的小包写入内存区域;在所述内存区域中的包处理后,对需要读出的包进行组包,当所述组包大于等于第二组包阈值时从所述内存区域中读出,并通过所述报文发送模块转发所述组包;第一组包阈值为写入时需要达到的高速线速的组包长度,第二组包阈值为读出时需要达到的高速线速的组包长度;
发送模块,与所述内存控制模块连接,用于将所述内存控制模块读取的组包发送到外部。
所述内存控制模块,还用于在读取组包时,判断所述组包中的相邻小包是否属于同一Bank,如果属于同一Bank,则通过缓存FIFO将后续相同Bank的小包进行调序,使其尽量远离前一个相同Bank的小包。
所述内存控制模块,还用于检测到若干小包的组包长度达到包长门限,将所述组包发出,并启动超时判断;如果后续又发生组包,结束上次超时判断,并开始新的超时判断;如果所述超时判断时间达到预设超时阀值而没发生组包,则自动触发内存写操作,将没有达到包长门限且待写入的小包组包写入到内存。
所述第一组包阈值和所述第二组包阈值根据内存时钟频率确定。
与现有技术相比,本发明具有以下优点:
本发明中,在读、写访问内存过程中基于内存的Bank Interleave特性采用组包方法,并可以在读访问内存时采用报文调序,达到提高内存的带宽利用率。
具体实施方式
SDRAM采用的是时钟驱动方式,其指令与数据输出之间的延时是可编程的。在SDRAM的内部有一个模式储存器可以设定一次存取的数据量及存取方式(Sequential或Interleave)以及CAS延时时间,因此,所有的SDRAM都能够以Interleave方式工作。
内存数据是以位(bit)为单位,以行(Row)、列(Column)方式储存在内存区域中,这样的数据阵称为Bank,目前的内存芯片规格有2~4个Bank。在内存区域中选定数据的方法是先选行再选列,进而准确地找到数据位置。在一个内存访问周期内包括Bank的预充电(Precharge,因为SDRAM需要恒电流以保存信息,一旦断电信息即丢失)、RAS(Row Address Strobe,行地址选通脉冲)、CAS(Column Address Strobe,列地址选通脉冲)三个周期。访问过程首先是对Bank进行充电,预充电周期是tRP;充电完成后使Bank行地址有效,由于在选择了Bank的同时也选择了相应的行,所以Bank有效和行地址有效是同一个意思。Bank行地址有效的周期是tRCD,指在经过tRCD的周期后就进入了列地址选通阶段。CAS有效后还要经过一定的周期才能开始数据的传输,这个周期就是CL(CAS Latency),经过CL的周期后,被选中的行与列的交叉格开始进行读取或写入的操作。
图3所示为DDR2SDRAM采用Bank interleave(分级交错)进行连续的读操作时序图,DDR2SDRAM每次的读、写操作配置为Burst 8模式(突发传输是指在一个限定的周期次数内,批量传输数据,只需对第一个数据位置进行定位,其后的数据可以依次自动进行操作,这样大幅提高了传输效率。)。图3中所示在时钟周期0发送读取Bank[0]的ACT(激活)和RD(读取,包括Auto precharge预冲电压)命令,周期4发送读取Bank[1]的ACT和RD(包括Auto precharge)命令,周期8发送读取Bank[2]的ACT和RD(包括Autoprecharge)命令,周期12发送读取Bank[3]的ACT和RD(包括Auto precharge)命令,在周期16又重新发送读取Bank[0]的ACT和RD(包括Auto precharge)命令,利用这种方法在时钟周期8以后数据连续不断的从DDR2SDRAM读出数据,总线效率为100%。在周期0发送读取Bank[0]的ACT和RD(包括Auto precharge)命令,同周期16发送读取Bank[0]的ACT和RD(包括Autoprecharge)命令,可以为分别读取Bank[0]任意Row的数据,Bank[1]、Bank[2]、Bank[3]同理。
本发明为实现访问内存小包高速线速处理,需要尽可能提高内存的带宽利用率,下面以64字节的包作为小包为例进行说明,高速线速以10G为例说明,实际应用中,小包可以为小于256字节的包,例如128字节小包等,高速线速也可以是其他速率,例如20G或40G等。
本发明在读、写访问内存过程中基于内存的Bank Interleave特性采用组包方法,并可以在读访问内存时采用报文调序,达到提高内存的带宽利用率。本发明中报文写访问内存过程如图4所示,包括以下步骤:
步骤401,根据内存时钟频率确定第一组包阈值;
对于任意报文都需要对内存进行两次操作,即收到报文后将报文写入内存中,当准备发送报文时将报文从内存中读出。比如64字节的小包,由于该小包速率为15Mpps(每秒15,000,000个包)时线速为10G,则每个包满足10G线速的读写处理时间为1/15Mpps=66ns,因此处理一个包的时间为66ns,即只有读写操作在66ns之内完成,才能实现10G线速。
由于接收报文的速度要小于内存的处理速率,将使得内存中的BIU(BusInterface Unit,总线接口单元,用于同外部联系,负责所有涉及外部总线的操作,包括取指令、读操作数、写操作数、地址转换和总线控制等)极快地处理完一个写操作后发现没有后续的写操作,而去进行读操作,且读写操作之间会产生切换时间,因此,无法利用上述Bank Interleave特性,使得内存带宽利用率下降,为此,需要能够一次处理几个小包的写操作以提高效率。
本发明通过将几次写操作进行组合的方式将几个小包组合,能够发起连续的Bank Interleave写操作。这种报文组合其实类似于收到了一个大包时的处理,节省了每个小包从写入到读出的切换时间,从而达到10G线速,就可以知道要组合多长的报文进行合并操作,该值和内存的时钟频率有关,以时钟为250M的DDR2SDRAM为例,选择组合包长大于等于256B作为组合条件,对于256B报文,满足10G线速的条件是读写内存的时间小于217ns,推导方式如下:
选定长度的组包实际读操作时间+写操作时间<=定长度的报文10G线速的时间; (公式1)
以太网的报文长度=以太网的IPG(Inter Packet Gap,帧间间隙)+前导码共20Bytes; (公式2)
64字节的小包长度=64字节+20字节; (公式3)
64字节的小包只有读写操作在66ns之内完成,才能实现10G线速;
因此,对于256字节的以太网报文,根据公式1实现定长度的报文10G线速的时间=(256+20)/(64+20)*66=217ns;
实际发起一次读或写操作在最坏情况下(在同一个BANK中):
读操作时间=tRCD(Time of RAS to CAS Delay,Bank/行有效的周期)+CL(column arrange select延迟)+256B读数据时间+tRP(Time of Row Precharge,预充电周期)
=15ns+16ns+64ns+4ns=99ns; (公式4)
写操作时间=tRCD(ACTIVE到READ或WRITE的延迟)+(CL-1)+256B写数据时间+写命令恢复时间(tWR+tRP)
=15ns+12ns+64ns+15ns+15ns=121ns; (公式5)
根据公式4和公式5,读写内存操作时间共需要220ns,略大于定长度的报文10G线速的时间217ns,但由于通常情况大部分情况下读写不会在同一个BANK,所以对于256字节的报文通常可以满足10G线速,所以当收到大于256B的报文,不需要在进行报文组合。
对于其他频率的DDR2SDRAM,tRCD、tWR(写恢复时间)和tRP(Timeof Row Precharge,预充电周期)参数值和略微不同,只需要按照上面的公式计算即可。
步骤402,所述内存控制器对需要写入的小包进行组包,并判断组合后的小包是否大于等于第一组包阈值,如果是则将所述组合后的小包写入内存区域。上述的小包通常情况下为相同大小的小包,此时每个组包的长度达到第一组包阈值时,可以作为一个大包写入内存区域;当小包的大小不同时,组包后长度有可能超出第一组包阈值,此时,可以作为一个大包写入内存区域。
以太网控制器接收到的报文,处理单元会向内存控制器申请空闲内存地址,然后向该内存地址发起内存写操作,将报文分级存放到内存中,如图5所示,向DDR2SDRAM中存储时是按BANK顺序存储的(Bank0、Bank1、Bank2、Bank3),这样可以基于图3所示的Bank Interleave特性大幅提高内存的带宽利用率。
另外,上述步骤401中还可以通过超时判断机制防止由于包长不够组包门限,导致长时间不能被发出。还是以5个小包为例,前四个小包的组包长度到达包长门限,将该组包发出,此操作结束后超时判断机制即时开始(一般通过计数器实现),如果后续又有组包发生,则结束上次超时判断,并开始新的一次超时判断(超时计数器清零后开始重新计数),如果一直没有后续组包的发生,像此例中的第五个包,由于包长不够门限且后续没有报文,在达到设定的超时阀值后会自动触发一次内存写操作,将这个最后一包写入到内存中,这里提到的超时阀值通常情况下是可以设置的,比如可以定为1ms,即前4个包组包完成后,过了1ms,第五个包在超时机制的帮助下写入到内存中。
本发明中,将组包写入内存区域后,FPGA对报文解析处理,随后会根据处理结果,将报文从内存中取出发往目的出接口,如图6所示,包括以下步骤:
步骤601,根据内存时钟频率确定第二组包阈值;在小包的情况下需要进行组包的操作,这样能够充分利用Bank Interleave特性,并能够减小读写的切换次数。
步骤602,在所述内存区域中的包处理后,所述内存控制器对需要读出的包进行组包,当所述组包大于第二组包阈值时从所述内存区域中读出,并通过所述报文发送模块转发所述组包。与写操作同理,读出的小包长度可以相同,也可以不同。
以太网控制器向该内存地址发起内存读操作,将报文分级读出,如图7所示,每次将内存中读出一个组包(Bank0、Bank1、Bank2、Bank3),这样可以基于图3所示的Bank Interleave特性大幅提高内存的带宽利用率。
还是以64字节小包的10G线速为例,任何包长的报文都会对内存进行一次读、一次写操作,为达到线速,这两次操作需要在66ns内完成操作。对于写操作,由于都能够实现Bank Interleave特性,使得写的效率很高,理论上在64ns可以完成256B的写操作,每个64字节的小包只需要16ns的时间(不考虑前后BANK相撞的问题)。对于读操作,由于出队的任意性,使得即使在组包的情况下,也无法完全实现Bank Interleave特性,比如连着到来的4个报文分别在1、1、2、3上,这样还是存在两次操作发生在相同BANK上,导致precharge时间无法被隐藏,使得性能下降,根据调度的随机性,可以简单的分成四种情况,4个小包均在同一个BANK上(最恶劣情况,每个64字节的小包需要64ns),3个小包在同一个BANK上(较恶劣情况,每个64字节的小包需要48ns),2个小包在同一个BANK上(每个64字节的小包需要32ns),4个小包均不在同一个BANK上(最好情况,每个64字节的小包需要16ns),按照概率分配,可以得到每个64字节的小包需要的平均时间为40ns。另外还要考虑读到写和写到读的切换时间,大致为(24+8)/4=8ns。由此可以得到一个64字节的小包需要的平均读、写时间为16+40+8=62ns,该值小于66ns,由此理论上可以达到线速。
上述第一组包阈值与第二组包阈值可以设置相同,也可以设置不同。
另外,在读操作时,可以调整报文的顺序,以增加Bank Interleave特性的效果,具体实现如图8所示:
图8中1、2、3、4为来包顺序,横条代表位于Bank0、竖条代表Bank1、左斜条代表Bank2、右斜条代表Bank3。如果两个相邻报文的BANK号相同,则后面那个先放入到缓存FIFO中,将该报文调序到远离BANK号相同的报文;否则入命令FIFO,直接读出。这种实现的基本初衷就是尽量在本次操作中岔开两次对相同BANK的操作。比如四次操作(报文顺序1、2、3、4)的BANK为“B0、B0、B2、B3”(图8中示例2),将调整为“B0、B2、B3、B0”这样大大减少第二次对BANK1操作的等待时间(precharge)。
本发明提供了一种实现小包访问内存高速线速的装置,如图9所示,包括:
接收模块910,用于接收外部发送的小包报文;
内存控制模块920,与接收模块910连接,用于对需要写入的小包进行组包,并判断组合后的小包是否大于等于第一组包阈值,如果达到所述组合后的小包写入内存区域。当接收模块910接收到的报文,向内存控制器申请空闲内存地址,然后向该内存地址发起内存写操作,将报文分级存放到内存中,向DDR2SDRAM中存储时是按BANK顺序存储的(Bank0、Bank1、Bank2、Bank3),这样可以基于Bank Interleave特性大幅提高内存的带宽利用率。
通过将几次写操作进行组合的方式将几个小包组合,能够发起连续的Bank Interleave写操作。这种报文组合其实类似于收到了一个大包时的处理,节省了每个小包从写入到读出的切换时间,从而达到10G线速,就可以知道要组合多长的报文进行合并操作,该值和内存的时钟频率有关,以时钟为250M的DDR2SDRAM为例,选择组合包长大于等于256B作为组合条件。
内存控制模块920在所述内存区域中的包处理后,对需要读出的包进行组包,当所述组包大于等于第二组包阈值时从所述内存区域中读出,并通过所述报文发送模块转发所述组包;第一组包阈值为写入时需要达到的高速线速的组包长度,第二组包阈值为读出时需要达到的高速线速的组包长度;内存控制模块920向该内存地址发起内存读操作,将报文分级读出,每次将内存中读出一个组包(Bank0、Bank1、Bank2、Bank3),这样可以基于BankInterleave特性大幅提高内存的带宽利用率。
发送模块930,与内存控制模块920连接,用于将所述内存控制模块读取的组包发送到外部。
其中,内存控制模块920,还用于在读取组包时,判断所述组包中的相邻小包是否属于同一Bank,如果属于同一Bank,则通过缓存FIFO将后续相同Bank的小包进行调序,使其尽量远离前一个相同Bank的小包。
其中,每次组合小包时除了判断包长以外,在每次发送完本次组包,如果还有小包没有发送,就启动定时。因此,内存控制模块920,还用于检测到若干小包的组包长度达到包长门限,将所述组包发出,并启动超时判断;如果后续又发生组包,结束上次超时判断,并开始新的超时判断;如果所述超时判断时间达到预设超时阀值而没达到包长门限,则自动触发内存写操作,将没有达到包长门限且待写入的小包组包写入到内存。
其中,内存控制模块920中所述第一组包阈值和所述第二组包阈值根据内存时钟频率确定。
本发明中,在读、写访问内存过程中基于内存的Bank Interleave特性采用组包方法,并可以在读访问内存时采用报文调序,达到提高内存的带宽利用率。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可以通过硬件实现,也可以借助软件加必要的通用硬件平台的方式来实现。基于这样的理解,本发明的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
本领域技术人员可以理解附图只是一个优选实施例的示意图,附图中的模块或流程并不一定是实施本发明所必须的。
本领域技术人员可以理解实施例中的装置中的模块可以按照实施例描述进行分布于实施例的装置中,也可以进行相应变化位于不同于本实施例的一个或多个装置中。上述实施例的模块可以合并为一个模块,也可以进一步拆分成多个子模块。
上述本发明序号仅仅为了描述,不代表实施例的优劣。
以上公开的仅为本发明的几个具体实施例,但是,本发明并非局限于此,任何本领域的技术人员能思之的变化都应落入本发明的保护范围。