基于仲裁的多端口数据存储系统的制作方法

文档序号:23220256发布日期:2020-12-08 15:02阅读:128来源:国知局
基于仲裁的多端口数据存储系统的制作方法

本发明涉及存储领域,尤其涉及基于仲裁的多端口数据存储系统。



背景技术:

自集成电路诞生以来,存储芯片行业就在不断飞速发展。过去几十年来,集成电路的进步与发展一直遵循着摩尔定律。摩尔定律指出,半导体集成电路单位面积可集成的晶体管数目每隔18个月增长一倍,处理器的性能也提高一倍。集成电路工艺技术的进步为微处理器的设计带来了新的机遇,也为存储系统带来了巨大的挑战。随着工艺水平的进步,特别是处理器体系结构的发展,处理器的速度已远远超过存储器的速度。自从上世纪八十年代以来,微处理器性能持续快速增长,年平均增长速度达40%;存储器性能虽然也在不断提高,但其年平均增长速度只有7%,由此产生了著名的“存储墙”问题。

虽然多线程、前瞻、乱序执行、预取等处理器技术以及多级高速缓存等技术的采用有助于将存储器的访问延迟来隐藏,即使这样,在处理器中,访存延迟带来的停顿时间所占的比例越来越大,存储器的访问速度相对还是较慢。



技术实现要素:

为解决上述问题,本发明提出基于仲裁的多端口数据存储系统。

基于仲裁的多端口数据存储系统,包括用于输入用户请求的用户接口、用于为多端口读写存储管理的缓存管理模块以及用于为缓存管理模块和ddr控制器进行交互的控制器接口,所述缓存管理模块包括:

命令仲裁模块,用于采用bank轮询的方式从多个队列请求中仲裁出一个用户请求命令,并将该用户请求命令送往命令切割模块;

命令切割模块,用于根据要求将仲裁出来的用户请求命令切割成多个子命令;

接口模块,用于处理命令切割模块发送的子命令,并进行信息提取以及转换并翻译成ddr控制器可以执行的命令格式;

数据写入模块,用于将待写数据送入ddr控制器写数据缓存;

数据读取模块,用于处理用户接口读命令请求,将存储的数据回送用户接口;

自校验模块,用于检测数据在传输过程中是否出现错误。

优选的,所述命令仲裁模块包括:

一级仲裁模块,用于将上个命令操作的bank号锁存,在当前命令仲裁时将此锁存bank号和当前各队列请求操作的bank号进行比较,优先响应bank号不同的队列请求,只有在其它队列请求都没有请求的情况下才响应bank冲突的队列请求;

二级仲裁模块,用于对各队列请求进行译码,并得出一个仲裁结果。

优选的,所述命令切割模块包括:

命令切割子模块,用于当用户请求命令中的读写数据操作长度大于设定字节数,则进行命令切割;

切割计数模块,用于对命令切割子模块的切割操作进行计数以判断当前请求是否切割完毕。

优选的,所述接口模块包括:

信息提取模块,用于将命令信息从缓存中读出,并进行信息提取;

命令判断模块,用于若为写命令,则将写信息送入到数据写入模块,若为读命令,则将读信息送入到数据读取模块。

优选的,所述数据写入模块包括:

第一字节计数模块,用于在检测到控制器接口发送的命令信息数据有效指示且待写数据信号握手信号有效时,将用户请求命令的操作长度值加1后作为需要操作的字节数,当app_wdf_data_rdy信号有效时,字节计数值自减1,同时生成待写数据读基地址累加使能,字节计数值减1,待写数据读基地址加1;

第一操作信息存储模块,用于当读命令缓存非空且字节计数值减至0时,将操作信息锁存;

数据写入子模块,用于将待写数据读使能wrbuf_rdata_rden和对应端口读数据wrbuf_rdata送往控制器接口,作为控制器接口写数据缓存写使能app_wdf_wren和写数据app_wdf_data。

优选的,所述数据读取模块包括:

第二字节计数模块,用于在检测到读命令缓存非空时,将用户请求命令的操作长度值加1后作为需要操作的字节数,当接收到读数据指示时,字节计数值自减1;

第二操作信息存储模块,用于当读命令缓存非空且字节计数值减至0时,将操作信息锁存;

数据读取子模块,用于根据锁存的操作信息中的端口号生成相对应读端口回读数据写使能信号,当回送数据命令有效时,回读数据写使能置高,各端口回读数据的写基地址从锁存的地址中获取,数据回送至用户相应地址的数据缓存中。

优选的,所述自校验模块包括:

自校验数据写入模块,用于将自校验数据送入ddr控制器写数据缓存;

自校验数据读取模块,用于将存储的自校验数据回送用户接口;

错误检测子模块,用于比较写入的自校验数据和读取的自校验数据,若两者数据不同,则判断异常,若两者数据相同,则判断正常。

通过使用本发明,可以实现以下效果:命令仲裁模块,基于ddr芯片的bank轮询机制既提高了ddr芯片的读写效率,又解决了多端口读写同一片ddr芯片冲突问题,极大的提高ddr芯片的工作效率;命令切割模块,将用户端口操作ddr较长字节的数据命令切割成较短的操作长度,适用ddr芯片的突发burst模式,极大提用户端口操作ddr效率;数据读取模块、数据写入模块极大的简化用户端口的操作复杂度,用户只需产生简单的读写ddr请求并准备待写ddr的数据,维护自身端口的待写、回读数据缓存,就可以将待写数据写入ddr或者从ddr中回读数据;错误检测模块,可以周期性产生检测脉冲信号,不断产生自校验读写ddr请求,并对比写入和回读数据是否一致,极大提高读写ddr芯片的可靠性。

附图说明

下面结合附图和具体实施方式对本发明作进一步详细的说明。

图1是本发明实施例一种基于仲裁的多端口数据存储系统的示意结构图;

图2是本发明实施例一种基于仲裁的多端口数据存储系统中命令仲裁模块的示意结构图;

图3是本发明实施例一种基于仲裁的多端口数据存储系统中命令切割模块的示意结构图;

图4是本发明实施例一种基于仲裁的多端口数据存储系统中接口模块的示意结构图;

图5是本发明实施例一种基于仲裁的多端口数据存储系统中数据写入模块的示意结构图;

图6是本发明实施例一种基于仲裁的多端口数据存储系统中数据读取模块的示意结构图;

图7是本发明实施例一种基于仲裁的多端口数据存储系统中自校验模块的示意结构图。

具体实施方式

以下结合附图,对本发明的技术方案作进一步的描述,但本发明并不限于这些实施例。

本发明实施例提出一种基于仲裁的多端口数据存储系统,如图1所示,包括用户接口、缓存管理模块以及控制器接口。用户接口为用户请求端口,由各用户自行维护端口的数据读写、缓存基地址管理。缓存管理模块为多端口读写存储管理设计的核心,是命令生成和终结的地方,同时也需要对用户待读写的数据进行传输以及传输完成后信息反馈至各端口;控制器接口为缓存管理模块和ddr控制器硬核进行交互的接口,划分为命令系统和数据系统。

本发明主要针对缓存管理模块进行设计,完成多端口对ddr芯片读写操作。缓存管理模块主要包括命令仲裁模块、命令切割模块、接口模块、数据写入模块、数据读取模块、自校验模块。

命令仲裁模块执行多端口队列请求的调度,其内部维护1个已仲裁出来的命令,一旦检测到ddr控制器中的命令系统中app_rdy信号有效,则立即将已仲裁出来的命令送入切割模块。用户请求队列经过仲裁模块处理后,最终会调度出一个执行队列,仲裁出来的队列请求和请求信息将送往下命令切割模块,其中队列的请求信息包含用户读写数据缓存的基地址、ddr操作地址、读写数据操作长度、用户回告信息。命令仲裁模块基于ddr芯片的bank轮询机制既提高了ddr芯片的读写效率,又解决了多端口读写同一片ddr芯片冲突问题,极大的提高ddr芯片的工作效率。

如图2所示,命令仲裁模块包括:

一级仲裁模块,用于将上个命令操作的bank号锁存,在当前命令仲裁时将此锁存bank号和当前各队列请求操作的bank号进行比较,优先响应bank号不同的队列请求,只有在其它队列请求都没有请求的情况下才响应bank冲突的队列请求;

二级仲裁模块,用于对各队列请求进行译码,并得出一个仲裁结果。

用户请求队列指示有效后,命令仲裁模块。命令仲裁模块执行ddr芯片bank轮询原则,并最终仲裁出一个用户请求,用户请求信息送往命令切割模块。这些信息经过命令切割后,送往控制器接口并缓存,同时也进行用户信息提取以及命令判断。若为读命令,将读信息送往数据读取模块缓存中,同时将读命令送往控制器接口,数据读取模块将读信息解析后送入个端口,各端口按照解析的命令进行相应的数据搬运工作,数据搬运结束时将反馈信息至用户端口。若为写命令,将写命令送往数据写入模块,写信息经过命令解析后,各端口按照解析的命令进行相应的数据搬运工作,数据搬运结束后反馈至控制器接口,控制器接口将写命令送往命令系统。

在一实施例中,命令仲裁模块主要是管理12个用户的请求操作,其中主要有上行mac地址/acl查表(读)、下行mac地址查表/acl(读)、上行表项老化请求(读)、下行表项老化(读)、上行表项老化请求(写)、下行表项老化请求(写)、用户请求1(写)、用户请求2(写)、自检验(读)、自检验(写)、cpu(读)、cpu(写)等业务。在设计的过程中,cpu的读写公用一个端口、自检验(chk)的读写公用一个端口,所以12个用户请求可以简化为10个队列的调度请求。

将10个请求队列,按照读写操作的不同划分为两组。将上行mac地址/acl查表(读)、下行mac地址查表/acl(读)、上行表项老化请求(读)、下行表项老化(读)划分为组0;上行表项老化请求(写)、下行表项老化请求(写)、用户请求1(写)、用户请求2(写)划分为组1;cpu、自检验(chk)请求各自为一组,它们不参加一级查表仲裁,只参加二级译码仲裁,在仲裁的过程中,它们各自维护自身信息参与二级仲裁。

组0和组1通过一级仲裁模块进行一级仲裁,一级仲裁的规则配置在rom表中。对于ddr芯片而言,执行bank轮询操作效率最高。因此,在命令仲裁时要尽量避免当前仲裁的命令和上个命令操作同一bank。设计中,将上个命令操作的bank号锁存,在当前命令仲裁时将此锁存bank号和当前各队列操作的bank号进行比较,优先响应bank号不同的队列请求,只有在其它队列都没有请求的情况下才响应bank冲突的队列请求。

对组0成员操作ddrbank号和优先级划分:上行acl/mac查表(读)请求(对应bank0)即端口0;下行mac地址/acl查表(读)请求(对应bank1)即端口1;上行表项老化(读)请求操作(对应bank0)即端口2;下行表项老化(读)请求操作(对应bank1)即端口3。

一级仲裁的过程(假设同一bank中,查表操作优先级高)总原则如下:

当前操作的bank号为0时,则下一次操作轮到组0,bank1对应的请求队列优先操作;

当前操作的bank号为1时,则下一次操作轮到组0,bank0对应的请求队列优先操作;

当前操作的bank号既不为0也不为1,则下一次操作轮到组0,各请求队列按照预先设定的优先级进行仲裁操作。

以上4个队列的请求仲裁的规则配置在rom里面,rom表项里面。rom表项的地址是由上次操作的bank号bank_last(3bit)以及各个端口参与仲裁请求非空信号req(位宽为1bit,4个端口共4bit信号)排列组合。仲裁器输出结果为端口号req_port0[3:0]、bank冲突指示bank_conflict0、组0有效请求指示信号req_valid0(该信号组内所有队列请求有效指示信号的“或”操作)。由上可知,参与仲裁的所有信号的位宽为7bit,输出结果为5bit,使用rom查找表实现,查表地址寻址空间为128。

下面以上次操作的last_bank号0为例,当前4个请求队列都有效,即rom的地址为7’b0001111。此时由于上次操作的bank为0,所以此次操作的bank号尽量不要为0,与之对应的请求有下行mac地址/acl查表(读)请求(对应bank1)和下行表项老化(读)请求操作(对应bank1),假设查表的优先级高,则表项里面的内容为5’b00001。所以此次仲裁出的队列是下行acl/mac查表(读)请求。

组1仲裁原则与组0类似,不再赘述。

经过以上操作流程,组0、组1、cpu请求、chk请求将各自的信息(冲突指示信号bank_conflict、请求有效指示信号req_vaild、各自的端口号(中组0、组1为一级仲裁出来的端口号),其送入二级仲裁模块。二级仲裁模块为直接译码,并最终会得出一个仲裁结果。二级仲裁过程包括以下步骤:

步骤1;首先检查组0得出的请求有效指示req_valid0。若req_valid0无效,则直接进入步骤5,若有效,进入步骤2;

步骤2:检查冲突指示信号bank_conflict0信号是否为0;若bank_conflict0为0,说明bank不冲突,仲裁结果得出,即为组0得出的端口号req_port0[3:0];若bank_conflict0为1,则进入步骤3;

步骤3:检查组1得出的请求有效指示req_valid1,若无效,则直接进入步骤4;若req_valid1有效,检查bank_conflict1是否为0,若为0,说明bank不冲突,仲裁结果得出,即为组1得出的端口号req_port1[:3:0];若bank_conflict1为1,则进入步骤4;

步骤4:检查cpu端口的请求有效指示req_valid_cpu,若req_valid_cpu有效,检查bank_conflict_cpu是否为0,若为0,说明bank不冲突,仲裁结果得出,即为cpu得出的端口号;若bank_conflict_cpu为1,此次仲裁的结果为组0得出的端口号req_port0[3:0];若req_valid_cpu无效则,则此次仲裁的结果也为组0得出的端口号req_port0[3:0];

步骤5:检查组1得出的请求有效指示req_valid1,若无效,直接进入步骤7;若req_valid1有效,检查bank_conflict1是否为0,若为0,说明bank不冲突,仲裁结果得出,即为组1得出的端口号req_port1[:3:0];若bank_conflict1为1,则进入步骤6;

步骤6:检查cpu得出的请求有效指示req_valid_cpu,若req_valid_cpu有效,检查bank_conflict_cpu是否为0,若为0,说明bank不冲突,仲裁结果得出,即为cpu得出的端口号;若bank_conflict_cpu为1,此次仲裁的结果为组1得出的端口号req_port1[3:0];若req_valid_cpu无效,则此次仲裁的结果也为组1得出的端口号req_port1[3:0];

步骤7:检查cpu得出的请求有效指示req_valid_cpu,若无效则直接进入步骤8。若req_valid_cpu有效,检查bank_conflict_cpu是否为0,若为0,说明bank不冲突,仲裁结果得出,即为cpu得出的端口号;若bank_conflict_cpu是不为0,则仲裁出来的结果仍为cpu端口号;

步骤8:检查chk得出的请求有效指示req_valid_chk,若无效直接进入步骤9;若有效,则此次仲裁出来的结果为chk请求的端口号;

步骤9:此次仲裁无效。

命令切割模块主要是用来处理由仲裁模块裁决出来的一些用户命令信息,命令切割模块主要作用是将请求缓存中存储的不同ddr读写操作长度,切割为长度固定为32字节的操作命令,操作长度小于32字节,不进行命令切割操作,这样操作主要是为了适应ddr芯片的burstchop(突发突变)模式。命令切割模块,将用户端口操作ddr较长字节的数据命令切割成较短的操作长度,适用ddr芯片的突发burst模式,极大提用户端口操作ddr效率。

如图3所示,命令切割模块包括:

命令切割子模块,用于当用户请求命令中的读写数据操作长度大于设定字节数,则进行命令切割;

切割计数模块,用于对命令切割子模块的切割操作进行计数以判断当前请求是否切割完毕。

若请求操作读写ddr数据长度大于32字节,则进行命令切割,最大支持1024字节,最多可切割为32个命令,只有在控制器接口命令缓存不满且命令切割子模块中用户信息缓存非空时才开始下一个请求的切割。

切割计数模块进行切割命令计数,计数值为操作长度(操作长度指示,单位为16字节,最大操作长度为64乘16字节等于1024字节,0表示1个burst),左移后的数值也即操作长度除以2,其计数范围为1-32,值为0说明当前请求切割完毕,可将下一个请求读出。每切割生成一个32字节请求,则长度计数器自减1,同时将请求写入命令缓存,直至长度计数器减至1。由于切片的最小长度为32字节,而操作长度指示的单位为16字节,因此需将操作长度指示右移1位,并加1。若操作长度是16字节的整数倍,但不是32字节的整数倍,如16字节、48字节等,则经过上述处理后长度增加了16字节,因此对于这种情况,最后一次操作的长度必须设为16字节。

通过命令切割子模块,会将一个操作长度比较长的命令切割成为若干个操作长度短的命令去执行,并将切割之后的命令一部分送入命令缓存(fifo)中,另一部分命令送入读写命令缓存。

如图4所示,接口模块包括:

信息提取模块,用于将命令信息从缓存中读出,并进行信息提取;

命令判断模块,用于若为写命令,则将写信息送入到数据写入模块,若为读命令,则将读信息送入到数据读取模块。

从接口模块缓存中,将命令信息从缓存fifo中读出,并进行信息提取、命令形式判断。命令判断过程中,若为写命令,此时(接口模块缓存非空)将写信息送入到数据写入模块,待数据写入模块完全将数据从用户端口搬运至ddr控制器写数据缓存,再将写命令送往ddr控制器命令系统。命令判断过程中,若为读命令,此时(数据读取模块缓存不满)将读信息送入到数据读取模块命令缓存中;同时(接口模块缓存非空且ddr控制器命令系统app_rdy信号有效)将读命令送入ddr控制器命令系统中。

数据写入模块主要负责数据写入请求,将各端口待写数据送入ddr控制器写数据缓存,供mig控制器执行写操作时数据的读取。由于mig控制器写命令与写数据在时序上有一定的要求(写数据不能够晚于写命令2个周期),所设计模块对数据写入模块作些特殊的处理。整体上的处理原则是,将mig控制器接口模块送出来的命令信息写入到数据写入模块,数据写入模块对命令信息作相应的处理(即当用户端口按照命令信息里面的内容要求,将端口待写数据全部搬运至ddr控制器接口的写数据缓存后,mig控制器接口模块再将命令信息送往ddr控制器命令系统)。这样的操作,使得数据先于命令到达ddr控制器接口,原则就不会出现数据晚于命令的情况。

如图5所示,数据写入模块包括:

第一字节计数模块,用于在检测到控制器接口发送的命令信息数据有效指示且待写数据信号握手信号有效时,将用户请求命令的操作长度值加1后作为需要操作的字节数,当app_wdf_data_rdy信号有效时,字节计数值自减1,同时生成待写数据读基地址累加使能,字节计数值减1,待写数据读基地址加1;

第一操作信息存储模块,用于当读命令缓存非空且字节计数值减至0时,将操作信息锁存;

数据写入子模块,用于将待写数据读使能wrbuf_rdata_rden和对应端口读数据wrbuf_rdata送往控制器接口,作为控制器接口写数据缓存写使能app_wdf_wren和写数据app_wdf_data。

第一字节计数模块初始值为0。在检测到接口模块送过来的命令信息数据有效指示且migip核控制器待写数据信号握手信号有效时,将请求的操作长度值加1后赋给字节计数器,作为接下来需要操作的字节数。当mig数据系统中,app_wdf_data_rdy信号有效时,长度计数值自减1;与此同时生成待写数据读基地址累加使能,长度计数器值减1,待写数据读基地址加1。当前写命令的信息有效且长度计数器值为0时,将端口号、操作长度、读数据基地址、反馈信息锁存下来,操作信息在当前命令的处理周期内保持不变。

数据写入子模块将待写数据读使能wrbuf_rdata_rden由地址累加使能wdata_raddr_inc延时两个周期产生,送往待写数据端口。数据写入子模块将待写数据读使能wrbuf_rdata_rden和对应端口读数据wrbuf_rdata送往mig接口,作为mig接口写数据缓存写使能app_wdf_wren和写数据app_wdf_data。

数据读取模块主要处理控制器接口模块送过来的读命令信息,首先将命令信息作一级缓存,这样的处理主要原因是ddr控制器初始工作阶段,其命令缓存,会在短时间内生成大量读命令,而此时ddr芯片中的数据无法及时搬运ddr控制器读数据缓存。

同时为避免从该命令缓存读出命令造成的延迟,在命令缓存的出口处先缓存一个预取命令。当前命令一执行完毕,即将该预取命令作为当前命令执行,同时,从命令缓存中读取一个命令,作为新的预取命令。

数据读取模块、数据写入模块极大的简化用户端口的操作复杂度,用户只需产生简单的读写ddr请求并准备待写ddr的数据,维护自身端口的待写、回读数据缓存,就可以将待写数据写入ddr或者从ddr中回读数据。

如图6所示,数据读取模块包括:

第二字节计数模块,用于在检测到读命令缓存非空时,将用户请求命令的操作长度值加1后作为需要操作的字节数,当接收到读数据指示时,字节计数值自减1;

第二操作信息存储模块,用于当读命令缓存非空且字节计数值减至0时,将操作信息锁存;

数据读取子模块,用于根据锁存的操作信息中的端口号生成相对应读端口回读数据写使能信号,当回送数据命令有效时,回读数据写使能置高,各端口回读数据的写基地址从锁存的地址中获取,数据回送至用户相应地址的数据缓存中。

第二字节计数模块初始值为0。在检测到读命令缓存非空时,将用户请求的操作长度值加1后赋给第二字节计数模块,作为需要操作的字节数。当mig控制器送过来读数据指示时,字节计数值自减1(计数器每自减1次,代表从mig读数据缓存端口搬运至用户端口一次数据)。当读命令缓存非空且字节计数器值减至0时,将端口号、操作长度、读数据基地址、以及反馈信息锁存下来,这些操作信息在当前命令的处理周期内保持不变。

数据读取子模块根据锁存的端口号生成相对应读端口回读数据写使能信号,当migip回送数据指示有效时,回读数据写使能置高。各端口回读数据的写基地址可由锁存下来的地址中获取,第二字节计数模块自减1则基地址自加1。数据回送至用户相应地址的数据缓存中。

自校验模块主要将产生随机数据写入ddr芯片固定位置,一段时间后再将写进去的数据回读出来并作对比,来检测数据在传输是否出现错误。

如图7所示,自校验模块包括:

自校验数据写入模块,用于将自校验数据送入ddr控制器写数据缓存;

自校验数据读取模块,用于将存储的自校验数据回送用户接口;

错误检测子模块,用于比较写入的自校验数据和读取的自校验数据,若两者数据不同,则判断异常,若两者数据相同,则判断正常。

自校验模块可以周期性产生检测脉冲信号,不断产生自校验读写ddr请求,并对比写入和回读数据是否一致,极大提高读写ddr芯片的可靠性。

本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1