一种微引擎及其处理报文的方法

xiaoxiao2020-10-23  5

一种微引擎及其处理报文的方法
【技术领域】
[0001]本发明涉及网络处理器技术,尤其涉及一种微引擎(ME,Micro Engine)及其处理报文的方法。
【背景技术】
[0002]为了满足未来网络发展的需要,提高路由器的性能,处于因特网(Internet)骨干位置的核心路由器进行了一个又一个的技术变革。尤其在高端路由器市场,网络处理器以其杰出的报文处理性能及可编程性已经成为构成路由转发引擎不可替代的部分。目前业界基本使用多线程的网络处理器结构,而多线程的管理和调度是影响多线程网络处理器性能的一个关键因素。
[0003]在网络处理器系统中,ME是网络处理器的核心部件。多线程结构是提高网络处理器ME性能的一种有效方法,但是也会带来线程管理的复杂性和系统频率瓶颈等问题。因此需要设计一个合理的方案来实现高频高效的ME线程调度管理,同时使ME有较高的处理性倉泛。
[0004]一些传统的多线程网络处理器采用了基于粗粒度调度的ME,这样的ME虽然可以保证一个线程的指令全速执行,但是在每一次线程切换时,数据的加载和保存都会造成内核流水线的空闲,从而导致ME性能的下降。
[0005]另外,由于ME的流水线中只有一条线程在执行,所以设计方案时需要解决数据冒险的问题。当采用数据前推的设计时,将增加逻辑的复杂度,并在连续处理两个结果相关的报文指令时造成组合逻辑路径的增加,导致系统频率的下降。

【发明内容】

[0006]有鉴于此,本发明实施例期望提供一种ME及其处理报文的方法,能够在克服现有的ME频率与性能不高的问题。
[0007]本发明的技术方案是这样实现的:
[0008]本发明提供了一种ME处理报文的方法,所述方法包括:ME通过至少五个线程管理队列对接收到的报文进行线程分配,根据所分配的线程将所述报文存储在具有双读写端口的报文存储器中,并采用八级流水线的方式控制所分配的线程对存储在所述报文存储器中的报文进行处理。
[0009]上述方案中,所述ME通过至少五个线程管理队列对接收到的报文进行线程分配为:ME接收到新的报文时,由空闲队列free_queue以先进先出的方式为报文分配线程号,并将分配的线程号和报文自身携带的取指地址写到待处理队列rdy_qUeUe,当ME中具有空闲的流水线资源时,ME从rdy_qUeUe中调度一个待处理的报文的线程号和所述线程号对应的取指地址写到操作队列work_queue, work_queue中存储的都是ME正在处理的报文的线程号和取指地址,当一个报文需要查表时,将所述报文的线程号和取指地址写入到查表队列Srh_qUeUe中,当一个报文处理完毕时,将所述报文的线程号和取指地址写入到报文输出队列pkt_out_queue中;其中,当一个报文需要查表或处理完毕时,从work_queue中删除所述报文对应的线程号和取指地址。
[0010]上述方案中,所述采用八级流水线的方式控制所分配的线程对存储在所述报文存储器中的报文进行处理为:八级流水线支持八个线程同时工作,八级流水线中每一级对应一个线程;其中,第一级,线程根据报文的取指地址发送报文指令的获取请求;第二级,线程接收报文指令;第三级,线程解析报文指令并获取报文指令的源操作数;第四级,线程对源操作数进行位调整;第五级,线程根据所述位调整后的源操作数执行报文指令对应的算术运算和对应的存储地址的计算;第六级,线程根据所述存储地址发出读写操作请求;第七级,线程获得所述操作请求的响应;第八级,线程将所述算术运算的结果或所述操作请求的响应作为报文指令的处理结果回写;其中,在第八级之后,确定报文不需要查表且包括有未处理的报文指令时,根据所述报文的线程号返回第一级处理所述报文中未处理的报文指令。
[0011]上述方案中,在所述报文处理完成后,将所述报文的线程号释放。
[0012]本发明提供了一种ME,所述ME包括:线程管理模块、具有双读写端口的报文存储模块、内核模块;其中,所述线程管理模块,用于通过至少五个线程管理队列对接收到的报文进行线程分配;所述报文存储模块,用于根据所分配的线程存储所述报文;所述内核模块,用于采用八级流水线的方式控制所分配的线程对存储在所述报文存储模块中的报文进行处理。
[0013]上述方案中,所述线程管理模块,具体用于通过空闲队列free_qUeUe以先进先出的方式为报文分配线程号,并将分配的线程号和报文自身携带的取指地址写到待处理队列rdy_queue,当有空闲的流水线资源时,从rdy_queue中调度一个待处理的报文的线程号和所述线程号对应的取指地址写到操作队列work_queue, work_queue中存储的都是正在处理的报文的线程号和取指地址,当一个报文需要查表时,将所述报文的线程号和取指地址写入到查表队列srh_qUeUe中,当一个报文处理完毕时,将所述报文的线程号和取指地址写入到报文输出队列pkt_out_queue中;其中,当一个报文需要查表或处理完毕时,从work_queue中删除所述报文对应的线程号和取指地址。
[0014]上述方案中,所述内核模块,具体用于将八级流水线中每一级对应一个线程;其中,第一级,线程根据报文的取指地址发送报文指令的获取请求;第二级,线程接收报文指令;第三级,线程解析报文指令并获取报文指令的源操作数;第四级,线程对源操作数进行位调整;第五级,线程根据所述位调整后的源操作数执行报文指令对应的算术运算和对应的存储地址的计算;第六级,线程根据所述存储地址发出读写操作请求;第七级,线程获得所述操作请求的响应;第八级,线程将所述算术运算的结果或所述操作请求的响应作为所述报文指令的处理结果回写;其中,在第八级之后,确定报文不需要查表且包括有未处理的报文指令时,根据所述报文的线程号返回第一级处理所述报文中未处理的报文指令。
[0015]上述方案中,所述线程管理模块还用于在所述报文处理完成后,将所述报文的线程号释放。
[0016]由此可见,本发明实施例提供一种ME及其处理报文的方法,ME通过至少五个线程管理队列对接收到报文进行线程分配,根据所分配的线程将所述报文存储在具有双读写端口的报文存储器中,并采用八级流水线的方式控制所分配的线程对存储在所述报文存储模块中的报文进行处理;从硬件结构上避免了数据冒险的产生,简化了逻辑,不需要进行与数据冒险相关判断逻辑,并避免了 ME内部资源访问冲突的产生,有效地提高ME工作频率和性能,保证ME高频率高性能的处理报文,并且方案实现相对简单,能够降低编码的复杂度,从而降低人力成本。
【附图说明】
[0017]图1为本发明实施例一提供的ME处理报文的方法的流程示意图;
[0018]图2为本发明实施例二提供的ME处理报文的方法的流程示意图;
[0019]图3为本发明实施例二提供的ME流水线处理一个报文的工作过程示意图;
[0020]图4为本发明实施例二提供的ME流水线处理多个个报文的工作过程示意图;
[0021]图5本发明实施例三提供的ME的结构示意图。
【具体实施方式】
[0022]在本发明实施例中,ME通过至少五个线程管理队列对接收到的报文进行线程分配,根据所分配的线程将所述报文存储在具有双读写端口的报文存储器中,并采用八级流水线的方式控制所分配的线程对存储在所述报文存储器中的报文进行处理。
[0023]下面结合附图及具体实施例对本发明的技术方案做进一步的详细说明。
[0024]实施例一
[0025]图1为本发明实施例一提供的ME处理报文的方式的流程示意图,如图1所示,该方法包括以下步骤:
[0026]步骤101,ME通过至少五个线程管理队列对接收到的报文进行线程分配;
[0027]具体的,以五个线程管理队列为例,ME接收到新的报文时,由空闲队列free_queue以先进先出的方式为报文分配线程号,并将分配的线程号和报文自身携带的取指地址写到待处理队列rdy_queue,当ME中具有空闲的流水线资源时,ME从rdy_queue中调度一个待处理的报文的线程号和所述线程号对应的取指地址写到操作队列work_qUeUe,work_queue中存储的都是ME正在处理的报文的线程号和取指地址,当一个报文需要查表时,将所述报文的线程号和取指地址写入到查表队列srh_qUeUe中,当一个报文处理完毕时,将所述报文的线程号和取指地址写入到报文输出队列pkt_0Ut_qUeUe中;其中,当一个报文需要查表或处理完毕时,将报文的线程号和取指地址写入srh_queue或pkt_out_queue的同时,从work_queue中删除该报文对应的线程号和取指地址。
[0028]其中,由free_queue为报文分配的线程号与报文本身--对应,通过所分配的线程号能确定其对应的报文。
[0029]当ME正在处理的报文少于8个时,ME具有空闲流水线资源,贝U从rdy_queue中调度一个待处理的报文的线程号和所述线程号对应的取指地址写到work_qUeUe中,将该空闲的流水线资源分配给此时调度进入worlqueue的线程号对应的报文,由该报文的线程号对应的线程利用空闲的流水线资源对该报文进行处理。这里,w0rk_qU eUe中存储的正在处理的报文的线程号的总数为8,与八级流水线对应;当worlqueue中存储的线程号的总数为8时,ME正在处理的报文的数量为8,其中每个报文对应一个线程,此时,ME的八级流水线中有8个线程在八级流水线中循环工作。
[0030]在八级流水线处理报文的过程中,八级流水线的每级对应一个线程,每个线程处理一个报文,因此,ME流水线可同时对8个报文进行处理,当8个报文中的一个报文处理完毕之后,将该处理完毕的报文对应的线程号写入pkt_0Ut_qUeUe中,并将该处理完毕的报文对应的线程号和取指地址从work_queue中删除,则work_queue中存储的线程号的总数小于8,相应的,由于该报文处理完毕,为该处理完毕的报文分配的流水线资源由于其处理过程执行完毕,置为空闲状态,被再次用于处理其他的报文。
[0031]在报文处理完毕后,ME将该报文的线程号以及该线程号对应的线程释放;这里,释放的线程号与其对应的线程被再次分配给ME在之后接收的报文。
[0032]步骤102,ME根据所分配的线程将所述报文存储在具有双读写端口的报文存储器中;
[0033]这里,在步骤101中ME为接收到的报文分配线程号之后,为报文分配了相应的线程,则ME根据所分配的线程将接收的报文先进行存储,将报文存储在具有双读端口的报文存储器中。
[0034]在实际应用中,报文存储器为具有双读写端口的随机存储器(RAM,Random AccessMemory)。
[0035]步骤103,ME釆用八级流水线的方式控制所分配的线程对存储在所述报文存储器中的报文进行处理;
[0036]具体的,当报文的线程号与对应的取指地址写入work_queue时,ME采用八级流水线的方式控制在步骤101中分配的线程对存储在报文存储器中的报文进行处理。
[0037]这里,八级流水线支持八个线程同时工作,八级流水线中每一级对应一个线程,其中,
[0038]第一级,线程根据报文的取指地址发送报文指令的获取请求;
[0039]第二级,线程接收报文指令;
[0040]第三级,线程解析报文指令并获取报文指令的源操作数;
[0041]第四级,线程对源操作数进行位调整;
[0042]第五级,线程根据所述位调整后的源操作数执行报文指令对应的算术运算和对应的存储地址的计算;
[0043]第六级,线程根据所述存储地址发出读写操作请求;
[0044]第七级,线程获得所述操作请求的响应;
[0045]第八级,线程将所述算术运算的结果或所述操作请求的响应作为报文指令的处理结果回写;
[0046]其中,在第八级之后,确定报文不需要查表且包括有未处理的报文指令时,根据所述报文的线程号返回第一级处理所述未处理的报文指令,直至所述报文的报文指令全部处理完成。
[0047]针对一个报文而言,对其一条报文指令的处理需要依次经过第一级至第八级的处理,一般情况下,一个报文包括多条报文指令,因此,在第一级-第八级执行完成后,需要判断该报文是否需要查表,并确定是否包括有未处理的报文指令,当确定该报文中不需要查表且包括未处理的报文指令时,将该报文对应的线程号以及该线程号对应的取指地址继续存储在work_queue中,并由该线程号对应的线程通过八级流水线继续对未处理的报文指令进行处理;当确定报文需要查表时,将该报文对应的线程号写入到srh_queue中,将该报文对应的线程挂起,直至ME收到该报文的查表响应,由该线程号对应的线程继续对该报文的报文指令进行处理;当报文处理完毕,即不需要查表且不存在未处理的报文指令时,将该报文对应的线程号写入到pkt_out_queue中。
[0048]在实际应用中,八级流水线的第六级在向双读写端口的RAM发送读写操作请求时,只使用两个读写端口中的一个,另一个读写端口在ME接收到报文加载或获取请求时,用于ME中报文的接收和发出。
[0049]实施例二
[0050]在实施例二中,ME通过以下5个队列完成报文的管理和线程的调度:
[0051]空闲队列free_queue,待处理队列rdy_queue,操作队列work_queue,查表队列srh_queue,报文输出队列pkt_out_queue ;其中,free_queue为新进入ME的报文分配线程号;rdy_queue存储待处理的报文的线程号和取指地址,其中,rdy_queue最多可存储8个待处理的线程号与取指地址;work_queue存储正在处理的报文的线程号和取指地址;srh_queue存储需要查表的报文的线程号和取指地址,pkt_out_queue存储处理完毕后需要发出的报文的线程号和取指地址;其中,报文在进入ME时,自身携带取指地址。
[0052]图2为本发明实施例二提供的一种ME处理报文的方法,如图2所示,包括以下步骤:
[0053]步骤201, ME由free_queue为报文分配线程号;
[0054]具体的,ME接收到新的报文时,由free_queue为报文分配线程号,其中,free_queue的深度为16, free_queue的深度决定了可分配线程号的数量,也就是说,free_queue为报文分配的线程号最多为16 ;ME中可用于处理报文的线程与free_queue可为报文分配的线程号的数量一致,也为16个;这里,free_queue的深度16是根据综合性能测试结果和资源的成本计算得出的。
[0055]free_queue以先进先出的方式为接收的报文分配线程号,free_queue的深度为16,16个线程号可为0-15 ;当接收到报文时,free_queue将排在队列最前面的线程号分配给接收到的报文。当报文完成处理完而输出后,则将完成处理的报文对应的线程号释放,并将该释放的线程号存储至free_queue, free_queue将释放的线程号放在队列的最前面,以待再接收到新的报文时,将该释放的线程号再次分配给新的报文。在ME上电或复位启动时,free_qUeUe的16个线程号都处于未分配状态,从排在队列最前面的线程号开始为接收的报文分配线程号,并采用先进先出的方式为之后接收的报文分配线程号。
[0056]ME通过给报文分配线程号,使报文与报文之间相互独立,并通过线程号将报文与ME分配给报文的存储资源建立对应的映射关系。
[0057]步骤202,ME为报文分配的线程号与对应的取指地址写入rdy_queue ;
[0058]这里,在为报文分配线程号之后,free_qUeUe将分配的线程号和取指地址写到rdy_queue,此时,进入rdy_queue的线程号对应的报文为待处理的报文;rdy_queue中存储待处理的报文的线程号与取指地址,并最多存储8个待处理的报文的线程号和取指地址。
[0059]步骤203,当具有空闲的流水线资源时,ME从rdy_queue调度一个待处理的报文的线程号与其对应的取指地址写入work_queue ;
[0060]具体的,当ME中具有空闲的流水线资源时,ME从rdy_queue中调度一个待处理的报文的线程号与该线程号对应的取指地址写入到Work_qUeUe,此时,由为该报文的分配的线程号对应的线程通过流水线中空闲的流水线资源对该报文进行处理;其中,work_queue中存储的都是ME正在处理的报文的线程号。当一个报文需要查表或处理完毕之后,ME从worlqueue中删除该报文对应的线程号与其对应的取指地址,将该报文对应的线程号与其对应的取指地址写入到srh_queue或pkt_out_queue中,从而使得work_queue允许rdy_queue中的待处理的报文的线程号与该线程号对应的取指地址进入到work_queue中。
[0061]这里,内核中线程对报文的处理的采用八级流水线结构,八级流水线根据work_queue中存储的线程号和该线程号对应的取指地址完成报文中报文指令的提取,报文指令提取完毕之后,解析报文指令,完成该报文指令的源操作数的提取。在提取源操作数之后,ME中的逻辑计算单元根据报文指令的要求完成对源操作数移位,拼接,加减等计算,将计算结果写入到目的寄存器或者存储器中。报文经过八级流水线的处理之后,具有以下三种情况:
[0062]第一、当报文不需要查表且包括有未处理的报文指令时,该报文未处理完毕,由八级流水线继续对该报文的下一条报文指令进行处理;
[0063]第二、当报文需要查表时,该报文未处理完毕,执行步骤204 ;
[0064]第三、当报文处理完毕时,执行步骤205。
[0065]步骤204,ME将需要查表的报文的线程号与其对应的取指地址写入srh_queue ;
[0066]具体的,当报文需要查表时,将报文的线程号和该线程号对应的取指地址写入srh_queue中,等待查表;此时,该报文未处理完毕,将其线程号写入srh_queue,在ME将该报文发送出去进行查表时,发出去的查表消息携带该报文的线程号,因此,该报文的线程号仍被占用;同时,用于处理该报文的线程被挂起,等待查表响应的返回;由于该查表的报文对应的线程被挂起,则八级流水线具有空闲的流水线 资源,空闲的流水线资源对rdy_queue中存储的线程号所对应的待处理的报文进行处理。
[0067]当ME接收到查表响应时,查表响应中携带该查表报文的线程号,通过该线程号在该线程对应的查表指令存储器srh_pC_ram中提取该报文的取指地址;在提取指令地址后返回步骤202 ;其中,在接收到查表响应时与接收到新报文时的两种情况下的步骤202的唯一区别是:当ME接收到报文的查表响应时,直接将该报文的线程号与提取的取指地址写入rdy_queue,不再由free_queue分配线程号;当ME接收到新报文时,由free_queue将为该报文分配的线程号与取指地址写入rdy_queue。
[0068]步骤205,ME将处理完毕的报文的线程号与对应的取指地址写入pkt_out_queue ;
[0069]具体的,当报文处理完毕时,将报文的线程号和该线程号对应的取指地址写入pkt_out_queue中,等待被输出;此时,该报文虽然已处理完毕,但其线程号被写入到pkt_out_queue中,该报文的线程号仍然被使用;在ME将该报文发送出去时,该报文的线程号被释放,使得该线程号可被分配给新的报文,从而不占用ME中的可分配线程号资源。
[0070]其中,在步骤205释放的线程号以队列的方式被写到free_qUeUe中,用于再次被分配。
[0071]需要说明的是,当rdy_qUeUe中存储的待处理的报对应的线程号的总数小于8时,在ME中自动生成空报文,保持rdy_queue与work_queue中存储的线程号的数量为8,并使得ME的八级流水线同时处理8个报文,从而使得八级流水线的各级能够正常执行。这里,对空报文的处理结果为步骤205。
[0072]ME在步骤201之后,根据步骤201中为报文分配的线程号,也就是根据为报文所分配的线程将报文保存在具有双读写端口的报文存储器pkt_ram中;这里,pkt_ram具有双读写端口,使得八级流水线应用双读写端口对存储在pkt_ram中的报文进行处理。
[0073]当ME的八级流水线正在处理报文指令时,需要访问pkt_ram,而此时,写入pkt_out_queue中等待被输出的报文也存储在pkt_ram中,当报文从ME输出时,也需要访问pkt_ram,由此,造成了 pkt_ram的读写冲突。为了避免这个冲突,需要暂停流水线的处理或者需要输出的报文的获取,使得ME的性能降低,本发明实施例三中,通过双读写端口的pkt_ram,使得因抢占pkt_ram的端口而导致流水线暂停的情况不会发生,流水线能全速运行,提高了 ME处理报文的性能。
[0074]图3为步骤203中的ME流水线处理一个报文的工作流程示意图,如图3所示,流水线对报文的处理过程如下:
[0075]当报文的线程号与报文自身携带的取指地址进入work_queue,流水线中空闲的流水线资源对报文进行处理。流水线最多可同时运行8个线程,即可同时处理8个报文。
[0076]报文首先进入流水线第一级,指令获取I (IFl, Instruct1n Fetchl)级,对报文进行处理的线程根据该报文存储在work_queue中的取指地址thread_pc发送报文指令的获取请求;其中,线程将报文指令的获取请求发送至用于存储报文指令的指令存储器instrmem中;这里,instrmem为与存储报文的RAM相互独立的RAM,使得指令的读写访问速度高,延迟小,不会出现访问不命中的情况。
[0077]第二级,指令获取2 (IF2, Instruct1n Fetch2)级,从instrmem中接收报文指令,将接收的报文指令保存在用于保存获取的报文指令的指令寄存器if_instr中。
[0078]第三级,指令译码(ID, Instruct1n Decode)级,对if_instr中接收的报文指令解析,进行译码,产生寄存器文件(RF, register file)读命令和读地址,从RF获取用于执行报文指令的各执行单元需要的源操作数,;这里,ME为流水线中的每个线程分配对应的RF,以存储与每个线程相关的数据。
[0079]第四级,执行I (EX1,executel)级,对源操作数进行位调整,由于ME支持的操作类型较多,比如,逻辑计算单元(ALU, Arithmetic Logical Unit)类计算,则需要将源操作数的数值进行对齐,为第五级的运算做准备。这一级主要是保证执行报文指令的算术运算单元不需要对源操作数进行计算,只需要根据获取的操作数和操作类型进行位调整以提高时序。
[0080]第五级,执行2 (EX2,execute2)级,通过ALU对第四级中位调整之后的源操作数进行计算,以执行报文指令对应的算术运算和对应的存储地址的计算;此部分为纯组合逻辑,根据源操作数完成报文指令对应的算术运算和存储器地址的计算。
[0081]第六级,内存访问I (MAl,Memory Accessl)级,这里的操作请求与报文指令对应,当报文指令为算术运算时,将算术运算结果写到结果(result)单元中;当报文指令为存储地址的运算时,通过pkt_ram的其中一个读写端口向pkt_ram发出读写操作请求。
[0082]第七级,内存访问2 (MA2, Memory Access2)级,获得读写操作请求从pkt_ram读出的数据,同时,将result单元和从pkt_ram读出的数据作为流水线的输出发送至数据判断单元Wb_mux,以在第八级回写之前根据流水线的输出判断经过流水线处理之后的报文具体为步骤203中三种情况的哪一种,流水线的输出也就是本次报文指令的处理结果。
[0083]第八级,回写(WB, Write Back)级,将经过Wb_mux判断的流水线输出回写到RF中,使报文指令的处理结果生效。
[0084]其中,IFl级与IF2级从instrmem提取报文指令,ID级解析报文指令,EXl级完成报文指令的源操作数的提取,EX2级由逻辑计算单元根据报文指令的要求完成对源操作数移位,拼接,加减等计算,MAl级、MA2级、WB级将报文指令的结果写入到报文指令的RF中,经过上述流水线的八级的操作执行,完成一条报文指令的处理。
[0085]在实际应用中,在IFl级发出报文指令获取请求时,当前取指地址对应的报文指令将被提取;在报文指令提取后,取指地址也相应的变化,向后偏移一位,以在获取下一条报文指令时能够正确提取报文指令。
[0086]如图4所示,后面每一个报文都按顺序依次进入流水线的每一级;流水线的每一级对应一个线程,流水线支持8个线程同时工作。第一个报文在IFl级取报文指令,在WB级完成处理结果的回写,完成一条报文指令的处理,后面的每一个报文依次落后于前一个报文一级流水线。8级流水线,在同一时间,每一级流水执行不同的操作,完成该级对应的功能。当8个线程同时工作时,每一个线程按顺序工作在不同的流水级。例如:Tl时刻,ThreadO线程工作在IFl级;T2时刻,ThreadO线程工作在IF2级,Threadl线程工作在IFl级;Τ3时刻,ThreadO线程工作在ID级,Threadl线程工作在IF2级,Thread2线程工作在IFl级,依次,当T8时刻时,ThreadO线程工作在WB级,Threadl工作在MA2级,Thread2线程工作在MAl级,Thread3工作在EX2级,Thread4工作在EXl级,Thread2线程工作在ID级,Thread3工作在IF2级,Thread7工作在IFl级。
[0087]一个报文走到WB级时,就代表完成了该报文一条指令的处理;此时,报文不需要查表且当前报文指令不是该报文的最后一条报文指令,则ME将该报文的线程号和取指地址继续存储在Work_qUeUe中,并通过处理该报文的线程处理该报文的下一条报文指令。
[0088]对于连续两条相关的ALU报文指令,也就是前一条报文指令计算的结果是后一条报文指令的源操作数,前一条报文指令在WB级回写的处理结果在RF的回写生效,下一条指令需要在ID级从RF获取该处理结果作为源操作数,其中,处理结果的回写与被获取中间隔了 5个周期,也就是说,下一条报文指令需要五个周期后才能使用上一条报文指令的处理结果,否则会产生数据冒险。而流水线级数是8级,每一级对应一个线程,一个线程执行完一条报文指令,到执行下一条报文指令中间间隔8个周期,该8个周期大于5个周期,避免了数据冒险的产生。
[0089]对于线程ThreadO来说,ThreadO执行的第一条报文指令在Tl时刻进入到流水线,需要经过8个周期第一条报文指令才会执行到WB级。这时ThreadO的第二条报文指令才会进入到流水线,即对于ThreadO而言,ThreadO所执行的前后两条报文指令进入流水线要间隔8个周期。而对于八级流水线来说,WB级是完成RF写入的操作,ID级是完成RF读取的操作,这两级之间相隔5个周期,后一条指令此时未执行到ID级,避免了数据冒险的产生。
[0090]实施例三
[0091]图5为本发明实施例三提供的一种ME的结构示意图,如图3所示,ME50包括线程管理模块51、具有双读写端口的报文存储模块52、以及内核模块53 ;
[0092]线程管理模块 51可由中央处理器(CPU, Central Processing Unit)与存储芯片配合实现,用于通过至少五个线程管理队列对接收到的报文进行线程分配;
[0093]具体的,以五个线程管理队列为例,线程管理模块51可以通过空闲队列free_queue以先进先出的方式为报文分配线程号,并将分配的线程号和报文自身携带的取指地址写到待处理队列rdy_queue,当有空闲的流水线资源时,从rdy_queue中调度一个待处理的报文的线程号和所述线程号对应的取指地址写到操作队列work_queue, work_queue中存储的都是正在处理的报文的线程号和取指地址,当一个报文需要查表时,将所述报文的线程号和取指地址写入到查表队列srh_qUeUe中,当一个报文处理完毕时,将所述报文的线程号和取指地址写入到报文输出队列pkt_0Ut_qUeUe中;其中,当一个报文需要查表或处理完毕时,从WOrk_qUeUe中删除所述报文对应的线程号和取指地址。
[0094]报文存储模块52可由RAM实现,用于根据所分配的线程存储所述报文。
[0095]内核模块53可由CPU与信号处理芯片配合实现,用于采用八级流水线的方式控制所分配的线程对报文进行处理;
[0096]具体的,内核模块53用于将八级流水线中每一级对应一个线程,其中,
[0097]第一级,线程根据报文的取指地址发送报文指令的获取请求;
[0098]第二级,线程接收报文指令;
[0099]第三级,线程解析报文指令并获取报文指令的源操作数;
[0100]第四级,线程对源操作数进行位调整;
[0101]第五级,线程根据所述位调整后的源操作数执行报文指令对应的算术运算和对应的存储地址的计算;
[0102]第六级,线程根据所述存储地址发出读写操作请求;
[0103]第七级,线程获得所述操作请求的响应;
[0104]第八级,线程将所述算术运算的结果或所述操作请求的响应作为所述报文指令的处理结果回写;
[0105]其中,在第八级之后,确定报文不需要查表且包括有未处理的报文指令时,根据所述报文的线程号返回第一级处理所述报文中未处理的报文指令。
[0106]线程管理模块51还用于在所述报文处理完成后,将所述报文的线程号释放。
[0107]本发明是根据本发明实施例一至实施例三中任一实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0108]这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0109]这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0110]相应的,本发明实施例一、二中任一实施例还提供一种计算机存储介质,其中存储有计算机程序,该计算机程序用于执行本发明实施例一、二中任一实施例的ME处理报文的方法。
[0111]以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
【主权项】
1.一种微引擎(ME)处理报文的方法,其特征在于,所述方法包括: ME通过至少五个线程管理队列对接收到的报文进行线程分配,根据所分配的线程将所述报文存储在具有双读写端口的报文存储器中,并采用八级流水线的方式控制所分配的线程对存储在所述报文存储器中的报文进行处理。2.根据权利要求1所述的方法,其特征在于,所述ME通过至少五个线程管理队列对接收到的报文进行线程分配为: ME接收到新的报文时,由空闲队列free_queue以先进先出的方式为报文分配线程号,并将分配的线程号和报文自身携带的取指地址写到待处理队列rdy_qUeUe,当ME中具有空闲的流水线资源时,ME从rdy_qUeUe中调度一个待处理的报文的线程号和所述线程号对应的取指地址写到操作队列work_queue, work_queue中存储的都是ME正在处理的报文的线程号和取指地址,当一个报文需要查表时,将所述报文的线程号和取指地址写入到查表队列Srh_qUeUe中,当一个报文处理完毕时,将所述报文的线程号和取指地址写入到报文输出队列pkt_out_queue中;其中,当一个报文需要查表或处理完毕时,从work_queue中删除所述报文对应的线程号和取指地址。3.根据权利要求2所述的方法,其特征在于,所述采用八级流水线的方式控制所分配的线程对存储在所述报文存储器中的报文进行处理为: 八级流水线支持八个线程同时工作,八级流水线中每一级对应一个线程;其中, 第一级,线程根据报文的取指地址发送报文指令的获取请求; 第二级,线程接收报文指令; 第三级,线程解析报文指令并获取报文指令的源操作数; 第四级,线程对源操作数进行位调整; 第五级,线程根据所述位调整后的源操作数执行报文指令对应的算术运算和对应的存储地址的计算; 第六级,线程根据所述存储地址发出读写操作请求; 第七级,线程获得所述操作请求的响应; 第八级,线程将所述算术运算的结果或所述操作请求的响应作为报文指令的处理结果回写; 其中,在第八级之后,确定报文不需要查表且包括有未处理的报文指令时,根据所述报文的线程号返回第一级处理所述报文中未处理的报文指令。4.根据权利要求3所述的方法,其特征在于,该方法还包括: 在所述报文处理完成后,将所述报文的线程号释放。5.一种ME,其特征在于,所述ME包括:线程管理模块、具有双读写端口的报文存储模块、内核模块;其中, 所述线程管理模块,用于通过至少五个线程管理队列对接收到的报文进行线程分配; 所述报文存储模块,用于根据所分配的线程存储所述报文; 所述内核模块,用于采用八级流水线的方式控制所分配的线程对存储在所述报文存储模块中的报文进行处理。6.根据权利要求5所述的ME,其特征在于,所述线程管理模块,具体用于通过空闲队列free_queue以先进先出的方式为报文分配线程号,并将分配的线程号和报文自身携带的取指地址写到待处理队列rdy_queue,当有空闲的流水线资源时,从rdy_queue中调度一个待处理的报文的线程号和所述线程号对应的取指地址写到操作队列work_queue,work_queue中存储的都是正在处理的报文的线程号和取指地址,当一个报文需要查表时,将所述报文的线程号和取指地址写入到查表队列srh_qUeUe中,当一个报文处理完毕时,将所述报文的线程号和取指地址写入到报文输出队列pkt_0Ut_qUeUe中;其中,当一个报文需要查表或处理完毕时,从w0rk_qUeUe中删除所述报文对应的线程号和取指地址。7.根据权利要求6所述的ME,其特征在于,所述内核模块,具体用于将八级流水线中每一级对应一个线程;其中, 第一级,线程根据报文的取指地址发送报文指令的获取请求; 第二级,线程接收报文指令; 第三级,线程解析报文指令并获取报文指令的源操作数; 第四级,线程对源操作数进行位调整; 第五级,线程根据所述位调整后的源操作数执行报文指令对应的算术运算和对应的存储地址的计算; 第六级,线程根据所述存储地址发出读写操作请求; 第七级,线程获得所述操作请求的响应; 第八级,线程将所述算术运算的结果或所述操作请求的响应作为所述报文指令的处理结果回写; 其中,在第八级之后,确定报文不需要查表且包括有未处理的报文指令时,根据所述报文的线程号返回第一级处理所述报文中未处理的报文指令。8.根据权利要求7所述的ME,其特征在于,所述线程管理模块,还用于在所述报文处理完成后,将所述报文的线程号释放。
【专利摘要】本发明公开了一种微引擎(ME)及其处理报文的方法,ME通过至少五个线程管理队列对接收到报文进行线程分配,根据所分配的线程将所述报文存储在具有双读写端口的报文存储器中,并采用八级流水线的方式控制所分配的线程对存储在所述报文存储器中的报文进行处理;本发明同时还公开了一种处理报文的ME。
【IPC分类】H04L12/863
【公开号】CN104901901
【申请号】CN201410084619
【发明人】周峰
【申请人】深圳市中兴微电子技术有限公司
【公开日】2015年9月9日
【申请日】2014年3月7日
【公告号】WO2015131445A1

最新回复(0)