具体实施方式
下面描述用于解析包并将数据封装形成包的可编微程序的控制器。在一个实施例中,载入微控制器内的指令。指令字具有多个指令段。微控制器并行处理多个指令字段。每个指令字段与解析包或将数据封装形成包的具体指令相关。通过根据为解析和封装具体设计的指令系统编程一个模板,将具体的例行程序排列在一起,可编程的微控制器可以编程用以处理支持新型协议的包。
这里所述的解析和封装技术,使解析包或将数据封装形成包的处理等待时间缩短。特别是,通过载入微控制器内的指令,微控制器避免访问外部存储器来载入指令,从而缩短了处理的等待时间。并且,这里所述的解析和封装技术通过并行处理指令内的多个指令字段,缩短了解析包并将数据封装形成包的处理时间。
这里所述的解析和封装技术是通过能够编程的微控制器(“可编程微控制器”)实现的,从而适于并且灵活地支持目前的以及新的协议类型。可编程的微控制器使用可编程的模板,其中特定的例行程序捆绑在一起处理包的特定协议。通过将例行程序捆绑在一起应用于特定的协议(当前的或新型的),模板可以有效地使用存储器空间。并且,为了支持新型协议,可以容易地下载新的例行程序并将其加入模板中。
可编程微控制器使用解析和封装专用的微指令系统。通过使用解析和封装专用的微指令系统,可编程微控制器能非常快地执行解析和封装功能。可编程微控制器能处理例行程序内的指令系统,这些例行程序一起捆绑在模板中,从而允许高效地传输每个例行程序的控制。
图1表示可以实施本发明的典型网络环境100。参看图1,网络环境100包括网络设备105,它通过网络101连接到路由器110。路由器110也通过网络102连接到网络设备115上。为了说明的目的,图中示出了两套网络和设备。但是,网络环境100可以包括任意数量的具有路由器的网络和设备。路由器110可以从网络设备105和115接收包以及将包转发到网络设备105和115。
在一个实施例中,网络设备105和115可以是一般用途的计算引擎、服务器或工作站。在另一个实施例中,网络设备105和115可以是路由器、网关、集线器、桥接器或转换器。但是,网络设备105和115并不限定于任何特定类型的网络设备。网络101和102可以代表任意类型的网络。例如,网络101和102可以是局域网LAN,如以太网;或者广域网WAN,如异步传输方式(ATM)网络,帧中继网络或互联网。
在一个实施例中,路由器110是执行网际协议(IP)第3层服务的网络设备。即,路由器110执行IP第3层服务,提供发送和转发功能,从而包可以利用互联网上的最佳路径到达其目的地。在其他实施例中,路由器110可以执行其它网络设备服务,例如多协议标签转换(MPLS)服务。MPLS使用标签和索引转换网络上的包。路由器110也能支持用于网络通讯的标准7层结构的模型应用程序和服务。即,路由器110可以作为IP路由器使用。路由器110也可以是与网络设备105和115类型相同的设备。
在一个实施例中,路由器110可以是网络路由器,用于在相同的管理权限和控制下在一个特殊的网络组中转发包,这通常称为自治系统(AS)。同样地,路由器110可以代表“内部路由器”,运行并支持内部网关协议(IGP),交换AS内的信息。
如果运行并支持IGP,则路由器110能运行发送协议,例如中间系统—中间系统协议(IS-IS),开放最短路径优先协议(OSPF)以及路由选择信息协议(RIP)。IS-IS协议和OSPF协议是连接状态协议。连接状态协议使用连接状态包维持网络的统一视图。RIP协议是基于使用最短路径计算的距离矢量的简单协议。路由器110解析包并将数据封装形成支持上述IGP协议的包。
在另一个实施例中,路由器110代表用于在自治系统(AS)之间转发包的网络路由器,此时的路由器被称为“外部路由器”,并且运行和支持外部网关协议(EGP)。如果运行并支持EGP,路由器110运行发送协议,例如边界网关协议(BGP)。BGP协议通过可靠的传输协议如传输控制协议(TCP)交换连接信息,这是因为BGP协议没有错误控制能力。路由器110解析包并将数据封装形成支持上述EGP协议的包。
路由器110包括解析和封装引擎112,用于在提取有效负载时解析包(如包200),或者将有效负载与协议报头(如发送协议报头)封装形成包。在一个实施例中,解析和封装引擎112是可编程微控制器,它包括解析包或者封装数据形成包专用的指令系统。在其他实施例中,可编程微控制器可以是可编程微处理器或者芯片上的可编程系统或子系统。
如同下面将要详细描述的,解析和封装引擎112是可编微程序的,用于处理支持当前和新型协议的包。例如,新的例行程序可以下载到路由器110,对解析和封装引擎112编程,将例行程序添加到模板,以便支持新的协议。这样,不必为新协议的每个不同变化书写新的程序,应用于包内当前协议。
图1B表示根据一个实施例解析和封装引擎112的简化框图。在一个实施例中,解析和封装引擎112是同时执行解析和封装功能的单一系统。在另外的实施例中,解析和封装引擎112可以是两个单独的系统,其中解析系统在接收端执行解析功能,封装系统在输出端执行封装功能。为了解释的目的,解析和封装引擎112称为单处理系统。在一个实施例中,解析和封装引擎112是芯片上的系统或子系统,它被设计为可编程微控制器或微处理器。
参看图1B,解析和封装引擎112包括多个超长指令字(VLIW)引擎150-1到150-N。在图1B的实施例中,VLIW引擎150-1到150-N连接到相同的存储单个协议代码的嵌入存储器300以及存储模板350的嵌入存储器350。但是,VLIW引擎150-1到150-N可以连接到单独的嵌入存储设备。嵌入存储器300和350是指包含在解析和封装引擎112中的存储设备。例如,嵌入存储器300和350是嵌入到芯片上的相同系统或子系统或者相同微控制器或微处理器的存储设备。这样,解析和封装引擎112不需要为了指令而访问外部存储器。
VLIW引擎150-1到150-N可以是提供有逻辑电路的专用集成电路(ASIC),其中的逻辑电路基于VLIW结构或水平微代码指令结构可编微程序。VLIW引擎150-1到150-N用于执行解析或封装功能。例如,VLIW引擎150-1可以设计成解析包,VLIW引擎150-N可以设计成将数据封装形成包。作为选择,VLIW引擎150-1和150-N可以设计成同时执行解析和封装功能。VLIW引擎150-1到150-N中的每一个可以并行运行解析或封装功能。
VLIW引擎150-1到150-N可以处理存储在嵌入存储器300中的单独协议的代码,这是基于VLIW指令结构或微代码指令结构。特别是,单独协议的代码包括具有多个指令字段的指令。VLIW引擎150-1到150-N设计为并行处理多个指令字段,这将在下面详细解释。
VLIW引擎150-1到150-N设计成根据例行程序在存储于嵌入存储器350的模板内的排列来判断在嵌入存储器300中处理哪个指令。例如,模板将特殊的例行程序排列或捆绑在一起,处理包的特殊协议(当前的或新型的)。为了处理新协议,解析和封装引擎112下载或编程嵌入存储器350内的模板,通过根据如同附录中作为例子给出的特殊指令增添新的例行程序。
图2表示根据一个实施例具有协议报头202和有效负载部分207的包200的框图。协议报头202包括多个特殊的协议报头P1(203)到PN(206),其中包200支持。例如,包200可以包括如下的具有有效负荷(Payload)部分的协议报头,如表1所示。
表1
在表1的例子中,PPP指点对点协议报头,用于两个系统在第2层或物理层之间进行通讯。例如,PPP定义有多少比特的信息在物理链路上传输。UDP是指通过网际协议(IP)传送数据报的用户数据报协议报头。这样,IP指向用于在互联网上传送包的报头。IP报头包括用于转发包的IP地址。但包200能包括任意数量的当前协议的当前协议报头组合,以及包括用于新型协议的协议报头。例如,BGP路由协议报头可用于包200中。
路由器110使用解析和封装引擎112解析包200,根据协议报头202,确定包200内包括的哪个协议报头提取有效负载207。同样地,路由器110使用解析和封装引擎112,将有效负载207与协议报头202封装形成包200进行传输。例如,IP协议报头可以将传输控制协议(TCP)的协议报头进行封装,用以传输包200。
图3A表示根据一个实施例存储例行程序用以解析包和将数据封装形成包的例行程序存储器300。例行程序存储器300可以代表图1B所示的相同的嵌入存储器300。参看图3A,例行程序存储器300将多个协议程序存储为P1例行程序(302)到PN例行程序(308)。每个例行程序包括基于特定指令系统的多个微指令,用以解析或封装,如图4及附录所示。
例如,再看表1,P1例行程序(302)可以是用于解析具有PPP报头的包的例行程序,或者是用于将数据与PPP报头封装的例行程序;P2例行程序(304)可以是用于解析具有IP报头的包的例行程序,或者是用于将数据与IP报头封装的例行程序;P3例行程序(306)可以是用于解析具有UDP报头的包的例行程序,或者是用于将数据与UDP报头封装的例行程序。
用于当前或新协议报头的任意数量的例行程序可以存储在例行程序存储器300中。例行程序可以在模板350中捆绑在一起,如图3B所示。模板350可以代表图1B所示的嵌入存储器350。如图3B所示,模板300包括将P1到P3捆绑或排列在一起的请求352到356。这样,尽管包内包括不同类型的协议报头,但通过使用模板300,例行程序可以捆绑在一起对包进行处理。
并且,如果包使用了新协议,则新例行程序可以存储在例行程序存储器300中。例如,可以通过网络101或105或从外部设备将PN例行程序308下载到路由器110,并存储在例行程序存储器300中。这里,如图3B所示,“新”请求358可以增加或编程在模板350中,用以请求PN例行程序308处理用于解析或封装的新的协议,从而得到灵活的和适用的包解析程序和封装程序。另外,通过使用模板300,可以高效地利用存储器空间,这是因为例行程序存储一次,并且例行程序可以被请求或与模板300捆绑在一起组合很多次,用于具有不同的或新协议报头的不同类型的包。
在另一个实施例中,协议报头链具有ID,并且ID可以存储在模板中。例如,模板可以表示为48位,其中6位表示特定的ID。这样,在上述实施例中,模板可以包括8个特定的ID。ID可以请求例行程序存储器300中的特定例行程序。这样,解析和封装引擎112可以使用模板350解析包,取出数据,或将数据封装形成包。
图3C表示解析和封装引擎112使用的寄存器组360。参看图3C,寄存器组360包括:校验和寄存器362、缓冲器指针寄存器364、微程序寄存器366、分支支程序寄存器368、微指令寄存器370、标志寄存器372、暂存寄存器(S0-S5)374、常数表376和字段寄存器378。寄存器组360可以是一个单寄存器文件,或者也可以是多个单独的寄存器。
校验和寄存器362存储用于确定数据中正确位数的校验和值。校验和寄存器362可以包括多个位(如16位)以存储校验和计算值。缓冲器指针寄存器364将指针或地址存储在包缓冲存储器中特定的位置,包缓冲存储器在解析和封装引擎112内存储待解析的包或存储待封装形成包的数据。例如,如果解析包200,缓冲器指针寄存器364将位置存储在包缓冲存储器中,其中的下一个字节是将要解析的。如果将数据封装,缓冲器指针寄存器364存储在形成包时将数据添加到包中的位置。
微程序寄存器366在判断执行例行程序中的哪个指令时将指针或位置存储到例行程序存储器300。例如,微程序寄存器366可以指向用于处理存储在例行程序存储器300中P1例行程序(302)的指令的位置。微指令寄存器370存储在微程序寄存器366中存储的位置的实际指令或内容。微指令寄存器370可以存储将由解析和封装引擎112执行的当前的微指令或随后的微指令。分支程序寄存器368存储将由解析和封装引擎112执行的可能分支微指令的指针或位置。
标志(LGE)寄存器372存储比较值,用于表示,例如,根据比较功能得到的小于、大于或等于。暂存寄存器(S0-S5)存储解析和封装引擎112使用的中间计算值或数据(例如,用于执行比较功能)。虽然在图3C中示出了9个寄存器,但可以使用任意数量的暂存寄存器。常数表376存储与协议有关的常数或固定值或数据,这可以用于判断某些数据是否与常数值或数据匹配。例如,某个协议报头可以具有4字节的固定数据,常数表376可以在判断解析的报头是否匹配那个特定协议报头的固定字节时存储这些固定的字节。字段寄存器378在解析包或字段用于将数据封装形成包时存储字段。
图4表示根据一个实施例具有多个指令或操作字段或槽的指令400的框图。参看图4,指令400包括用于微操作的6个槽。这6个槽包括M槽402、C槽404、T槽406、X槽408、A槽410和B槽412。6个槽中的每一个包括如附录所示的微操作组。指令400中的所有微操作是使用图3C寄存器组360的信息并行执行的。如表2所示,下面说明6个微操作中的每一个。
表2
槽 |
说明 |
M |
存储器载入和存储操作 |
C |
校验和计算操作 |
T |
测试和比较操作 |
X |
数据提取和插入操作 |
A |
分支目标地址操作 |
B |
分支触发操作 |
M槽存储器载入和存储操作用于从包中提取或得到数据或者将数据加入形成包。C槽校验和计算操作用于判断数据是否包含正确的位数。这个计算操作可以通过并行处理所有的槽快速计算。T槽测试和比较操作用于比较进入的校验和与计算的校验和,并根据比较设定标志。例如,比较可以在标志(LGE)寄存器372中设定小于标志、大于标志或等于标志。X槽数据提取和插入操作用于实际的解析和封装过程。即,在一组数据中提取一定数量的数据(例如,一个字节)时,此操作是唯一的。同样地,一定数量的数据(例如,一个字节)可以插入一组数据中形成包。
A槽分支目标地址操作和B槽分支触发操作用于特殊目的,即通过将分支过程分成两个部分将指令的例行程序插入。第一部分与A槽操作相关,其中对例行程序内的目标微指令产生分支。目标微指令可以存储在分支程序寄存器368中。第二部分与B槽操作相关,用于指示是产生目标微指令的分支,还是执行下一个微指令。
在一个实施例中,在一个循环中同时取出两个微指令。例如,微指令寄存器366存储下一个待执行的微指令,分支程序寄存器368存储可能用于分支处理的目标微指令。这样,可以同时取出下一个微指令以及分支目标微指令,提供有效的例行程序分支。
在一个实施例中,指令400可以在一个流水线中处理。例如,如下面的表3所示,指令400可以在四个阶段处理:预取阶段、取出阶段、解码阶段以及执行阶段。
在预取阶段,下一个连续的微指令和可能的分支目标微指令分别存储在微程序寄存器366和分支程序寄存器368中,如同上述对A槽操作和B槽操作所作的描述。在取出阶段,取出存储在微指令寄存器366和分支程序寄存器368中的两个微指令,并选择一个寄存器的内容用于解码阶段。
在解码阶段,微指令被解码,用于解析或者封装处理,其中缓冲指针寄存器364的数值被相应地调节。例如,如果已经解析了2个字节的数据,则缓冲指针寄存器364存储一个调节了两个字节的位置。在执行阶段,例行程序内的所有微指令都完成了,适当的结果存储在寄存器组360的各个寄存器中。
图5表示根据一个实施例的图1B中解析和封装引擎112中VLIW的高层次结构。但图5的高层次结构包括其它的部分,例如图3C所示的寄存器组360。参看图5,VLIW引擎包括6个槽402到412的每一个指令400的执行单元。具体地,M单元513执行M槽402指令,C单元511执行C槽404指令,T单元502执行T槽406指令,X单元501执行X槽408指令,A/B单元509执行A槽和B槽指令。通过使6槽操作中的每一个具有执行单元,多槽指令可以在执行循环中并行处理。
图5所示的结构实施例可以用于解析和封装操作,其中使用图3C寄存器组360中的寄存器。在一个实施例中,具有图5所示结构的单独VLIW引擎可用于解析包。在另一个实施例中,具有图5所示结构的单独VLIW引擎可用于将数据封装形成包。为了便于解释,图中的结构以单引擎代表。下面详细解释图5所示结构的操作。
在下面对图5所示的结构实施例的详细操作进行描述时,下面的标志具有以下的意思。标志“Imm(M)”、“Imm(X)”和“Imm(T)”是指分别输入M单元513、X单元501和T单元502的编程数值。标志“CHK”指校验和数值。M单元513是执行存储器或包缓冲存储器载入并存储操作的处理单元。M单元513用于处理M槽402操作,执行解析和封装功能。例如,M单元513可以用于执行这里详细描述的代表性微指令,用以执行解析和封装功能。为了执行解析功能,M单元513根据缓冲器指针寄存器364的信息从包缓冲存储器(未图示)接收数据,并根据CHK或Imm(M)输入将接收的数据存储在字段寄存器378。为了执行封装功能,M单元513根据缓冲器指针寄存器364的信息从字段寄存器378接收数据,并根据CHK或Imm(M)输入将数据存储在包缓冲存储器中。
C单元511是执行校验和计算操作的处理单元。C单元511用于处理这里所述的C槽404操作,执行校验和计算。在一个实施例中,C单元511是用于计算校验和数值的算术逻辑单元(ALU)。为了执行校验和计算,C单元511可以接收M单元513得到的数据以及字段寄存器378或暂存寄存器374的数据和校验和寄存器362的校验和数值,作为输入。C单元511将校验和计算的输出存储在校验和寄存器362中。并且,C单元511能找出与M单元513之间的载入路径或存储路径。例如,随着若干字节信息从M单元513载入或存储到M单元513,这些信息送入C单元511,从而提高处理效率。
T单元502是执行测试和比较操作的处理单元。T单元502用于处理T槽406的操作,如下所述。在一个实施例中,T单元502是执行测试和比较操作的ALU。为了执行测试和比较操作,T单元502接收暂存寄存器374的输出以及校验寄存器362存储的校验和数值,作为输入Imm(T)。T单元502将校验和数值与Imm(T)指示的预期数值或暂存寄存器374中的数值进行对比。对比的结果用于将标志存储于LGE寄存器372中,指示T单元502的结果小于、大于或等于预期的数值。LGE寄存器372中的标志位用于分支操作。
X单元501是执行数据取出和插入操作的处理单元。X单元用于这里所述的X槽408操作。在一个实施例中,X单元501是执行取出和插入操作的ALU。为了执行数据取出,X单元501接收字段寄存器378的数据、校验和(CHK)和Imm(X)值,作为输入。X单元501执行的操作结果临时存储在暂存寄存器374中或字段寄存器360中。存储在暂存寄存器374或字段寄存器360中的数据用于取出数据或将数据添加到包缓冲存储器。
A/B单元509是执行分支目标地址和触发操作的处理单元。A/B单元509用于处理这里所述的A槽410和B槽412的操作。在一个实施例中,A/B单元509接收分支程序寄存器368和微程序寄存器366中的数据或信息。A/B单元509根据LGE寄存器372中的比较标志,将基于分支程序寄存器368的分支微指令存储在微指令寄存器370中。例如如果比较的条件为真,产生分支,则A/B单元509将分支目标微指令存储到微指令寄存器366中,这将是解析和封装引擎112执行的下一个微指令。
在另一个实施例中,对于图5的结构实现中断机构,用以处理多个缓冲器的解析。在一个实施例中,这里所述的指令系统忽略包缓冲器的大小。载入和存储的包缓冲器的有效偏移(offset)是通过对缓冲器指针寄存器366Bp(存储器基址寄存器)增加偏移计算的。如果对于任何载入或存储的包缓冲器偏移超过包缓冲器的大小,可以触发异常或中断,使解析和封装引擎112以联接状态(CS)数据结构保存所有的有效状态,这可以包括在寄存器组360中。在这种情况下,在存储预中断状态之前从缓冲器指针寄存器364中的数值减去包缓冲器的大小。这样,缓冲器指针寄存器将包含负偏移。如果在存储状态之前从缓冲器指针寄存器364中减去新的包,则缓冲器指针寄存器364将包含负偏移。如果接收新的包缓冲器,CS数据结构的恢复状态重新进行载入或存储,引起异常或中断。包缓冲器的有效偏移现在是根据缓冲器指针寄存器364的数值。下面的表4表示微操作字段处理的作用。
表4
微操作字段 |
中断动作 |
M槽 |
允许部分完成、重新启动和组合数据 |
C槽 |
允许在中断时完成 |
T槽 |
在中断时放弃执行,在重新启动时重新执行 |
X槽 |
允许在中断时结束 |
A槽 |
在中断时放弃执行,在重新启动时重新执行 |
B槽 |
在重新启动D状态过程中存储T位并使用T位 |
图6表示根据一个实施例解析包的操作600的流程图。最初,操作600在操作602开始。
在操作602接收包。例如,包接收到路由器110的包缓冲存储器内。
在操作604,对于包内的每个协议报头,使用具有各个例行程序的模板解析包。例如,图5的结构可以从请求的例行程序接收指令,即从模板350接收指令,用以解析接收的包。
图7表示根据一个实施例封装操作700的流程图。最初,操作700开始于操作702。
在操作702存储有效负载数据。例如,有效负荷数据存储在包缓冲存储器中,用于将包传输到网络。
在操作704,对于每个被加入形成包的协议报头,使用具有各个例行程序的模板将有效负载数据封装。例如,图5的结构可以从请求的例行程序接收指令,即从模板350接收指令,将有效负载数据封装形成包用于传输。图8表示对图1的解析和封装引擎112编程的操作800的流程图。最初,操作800开始于操作802。
在操作802,下载新的例行程序。例如,新的例行程序可以通过网络服务器下载到路由器110。另外,连接到路由器110的外部设备可以下载新的例行程序。
在操作804,存储新的例行程序。例如,路由器110将新的例行程序存储在例行程序存储器300中。
在操作806,将新例行程序的请求加入到模板中。例如,模板350将新请求加入到新的例行程序中。这样,具有新请求的模板350用于使用新协议报头解析包,并将数据与新的协议报头封装。
上述协议包解析程序和封装程序的操作可以使用图5的代表性结构实现。例如,代表性结构可以用于执行附录中描述的代表性微操作。在这种结构中,操作被存储在存储设备中,例如嵌入随机存取存储器(RAM)。
对于另外的实施例,协议包解析程序和封装程序的操作可以用不连续的硬件或固件实现。例如,一个或多个专用集成电路(ASIC)可以编程执行上述的解析和封装操作。在另一个实施例中,解析和封装操作可以在另外电路板上的一个或多个ASIC实现,电路板可以插入上述的路由器。在另一个实施例中,字段可编程门阵列(FPGA)或静态可编程门阵列(SPGA)可以用于实现上述的解析和封装的操作。在再一个实施例中,组合使用硬件和软件可用于实现上述的冗余操作。
这样,描述了可编微程序的协议包解析程序和封装程序。在上面的描述中,参考特殊的代表性实施例描述了本发明。但是很明显,在不偏离权利要求限定的本发明宽广的精神和范围的情况下,可以做出多种修改和变化。因此,说明书和附图是用作说明的目的,而不是限定的目的。
附录
(代表性微操作槽说明)
M槽微操作系统 |
类别 |
助记忆 |
Src |
Dest |
Nop | | | |
|
Nop | | |
|
Halt | | |
缓冲器指针Mgmt | | | |
|
Add_Bp Rm |
Rm,Bp |
Bp |
|
Add_Bp_I Imm |
Imm |
Bp |
|
Sub_Bp,Rm |
Rm,Bp |
Bp |
|
Sub_Bp_I,Rm |
Imm |
Bp |
|
Sub_Bp,Rm |
Rm |
Bp |
|
Sub_Bp_I,Rm |
Imm |
Bp |
|
Sub_Bp,Rn |
Bp |
Rn |
载入(PostIncrement) | | | |
| Load8@(bp)+,Rn |
Bp,Mem |
Rn |
| Load16@(bp)+,Rn |
Bp,Mem |
Rn |
| Load32@(bp)+,Rn |
Bp,Mem |
Rn |
载入(Immediate) | | | |
| Load8_I@(<offset>,bp)+,Rn |
Imm,Bp,Mem |
Rn |
| Load16_I@(<offset>,bp)+,Rn |
Imm,Bp,Mem |
Rn |
| Load32_I@(<offset>,bp)+,Rn |
Imm,Bp,Mem |
Rn |
载入(Register) | | | |
| Load8_R@(Rm,bp),Rn |
Imm,Bp,Mem |
Rn |
| Load16_R@(Rm,bp),Rn |
Imm,Bp,Mem |
Rn |
| Load32_R@(Rm,bp),Rn |
Imm,Bp,Mem |
Rn |
| | | |
存储(PreDecrement) | | | |
|
Store8 Rm,@-(bp) |
Rm,Bp |
Mem |
|
Store16 Rm,@-(bp) |
Rm,Bp |
Mem |
|
Store32 Rm,@-(bp) |
Rm,Bp |
Mem |
| | | |
存储(Immediate) | | | |
|
Store8_I Rm,@(<offset>,bp) |
Imm,Rm,Bp |
Mem |
|
Store16_I Rm,@(<offset>,bp) |
Imm,Rm,Bp |
Mem |
|
Store32_I Rm,@(<offset>,bp) |
Imm,Rm,Bp |
Mem |
|
Store16 Chk I@(<offset>,bp) |
Imm,Chk,Bp |
Mem |
存储(Register) | | | |
|
Store8 Rm,@(Rn,bp) |
Rm,Rn,Bp |
Mem |
|
Store16 Rm,@(Rn,bp) |
Rm,Rn,Bp |
Mem |
|
Store32 Rm,@(Rn,bp) |
Rm,Rn,Bp |
Mem |
X槽微操作系统 |
类别 |
助记忆 |
Src |
Dest |
Nop |
|
|
|
|
Nop |
|
|
移动 |
|
|
|
|
Mov Rm,Rn |
Rm |
Rn |
|
Mov_I<value>,Rn |
Imm |
Rn |
|
Mov_C<index>,Rn |
Const |
Rn |
条件移动 |
|
|
|
|
Cmov.e Rm,Rn |
Rm,LGE |
Rn |
|
Cmov.ne Rm,Rn |
Rm,LGE |
Rn |
|
Cmov_I.e<value>,Rn |
Imm,LGE |
Rn |
|
Cmov_I.ne<value>,Rn |
Imm,LGE |
Rn |
|
Cmov_C.e<index>,Rn |
Const,LGE |
Rn |
|
Cmov_I.ne<value>,Rn |
Const,LGE |
Rn |
取出 |
|
|
|
|
Extract4.k Rm,Rn(k=0,1,2,...,7) |
Rm |
Rn |
|
Extract8.k Rm,Rn(k=0,1,2,3) |
Rm |
Rn |
|
Extract16.k Rm,Rn(k=0,1) |
Rm |
Rn |
插入 |
|
|
|
|
Insert4.k Rm,Rn(k=0,1,2,...,7) |
Rm,Rn |
Rn |
|
Insert8.k Rm,Rn(k=0,1,2,3) |
Rm,Rn |
Rn |
|
Insert16.k Rm,Rn(k=0,1) |
Rm,Rn |
Rn |
校验寄存器存取 |
|
|
|
|
Rstore_Chk Rn |
Chk |
Rn |
运算 |
|
|
|
|
Add Rm,Rn |
Rm,Rn |
Rn |
|
Add_I<value>,Rn |
Imm,Rn |
Rn |
|
Sub Rm,Rn |
Rm,Rn |
Rn |
|
Sub_I<value>,Rn |
Imm,Rn |
Rn |
逻辑 |
|
|
|
|
Or Rm,Rn |
Rm,Rn |
Rn |
|
Or_I<value>,Rn |
Imm,Rn |
Rn |
|
And Rm,Rn |
Rm,Rn |
Rn |
|
And_I<value>,Rn |
Imm,Rn |
Rn |
|
Xor Rm,Rn |
Rm |
Rn |
|
Xor_I<value>,Rn |
Imm,Rn |
Rn |
|
Set<position>,Rn |
Imm,Rn |
Rn |
|
Clr<position>,Rn |
Imm,Rn |
Rn |
移位 |
|
|
|
|
Lshift1 Rn |
Rn |
Rn |
|
Lshift2 Rn |
Rn |
Rn |
|
Lshift8 Rn |
Rn |
Rn |
|
Rshift1 Rn |
Rn |
Rn |
|
Rshift2 Rn |
Rn |
Rn |
|
Rshift8 Rn |
Rn |
Rn |
C槽微操作系统 |
类别 |
助记忆 |
Src |
Dest |
校验和初始化 |
|
|
|
|
Lchk |
L input |
Chk |
|
Schk |
S input |
Chk |
|
Rchk |
R input |
Chk |
校验和累加 |
|
|
|
|
Lchk_acc |
L input,Chk |
Chk |
|
Schk_acc |
S input,Chk |
Chk |
|
Rchk_acc |
R input,Chk |
Chk |
T槽微操作系统 |
类别 |
助记忆 |
Src |
Dest |
Nop |
|
|
|
|
Nop |
|
|
比较 |
|
|
|
|
Cmp Rn,Rm |
Rm,Rn |
LGE |
|
Cmp_I Imm,Rm |
Rm,Imm |
LGE |
|
Cmp_Chk Rm |
Chk,Rm |
LGE |
测试 |
|
|
|
|
Test_I Imm,Rm |
Rm,Imm |
LGE |
A槽微操作系统 |
类别 |
助记忆 |
Src |
Dest |
Nop |
|
|
|
|
Nop |
|
|
载入目标地址 |
|
|
|
|
Bra<label> |
Imm |
BrPC |
|
Bra_Next_protocol |
Template |
BrPC |
B槽微操作系统 |
类别 |
助记忆 |
Src |
Dest |
分支触发 |
|
|
|
|
Br.e |
BrPC,LGE |
μPC |
|
Br.ne |
BrPC,LGE |
μPC |
|
Br.l |
BrPC,LGE |
μPC |
|
Br.le |
BrPC,LGE |
μPC |
|
Br.g |
BrPC,LGE |
μPC |
|
Br.ge |
BrPC,LGE |
μPC |
|
Jmp |
BrPC |
μPC |
代表性微操作说明
Add_Bp Rm
将Bp指令加到寄存器 M槽
Bp←Bp+Rm1
1.来自Rm的低字节字节,Bp=1字节
Add_Bp_I<Imm>
将Bp指令加上Immediate M槽
1.(Imm=1字节,Bp=1字节)
Add Rm,Rn
累加指令 X槽
Rn←Rn+Immediate1
1.4字节操作
Add_I<Imm>,Rn
累加Immediate指令 X槽
Rn←Rn+Immediate1
1.Immediate=1字节,Rn=4字节
And Rm,Rn
逻辑和指令 X槽
Rn←Rn & Rm1
1.Imm=1字节,Rn=4字节
And_I<Imm>,Rn
逻辑和Immediate指令 X槽
Rn←Rn & Immediate1
1.Immediate=1字节,Rn=4字节
Br.e
相等触发指令分支 B槽
If(E)μPC←BrPC
Br.g
大于触发指令分支 B槽
If(G)μPC←BrPC
Br.ge
大于或等于触发指令分支 B槽
If(G\\E)μPC←BrPC
Br.l
小于触发指令分支 B槽
If(L)μPC←BrPC
Br.le
小于或等于触发指令分支 B槽
If(L\\E)μPC←BrPC
Br.ne不等于触发指令分支 B槽
If(~E)μPC←BrPC←
Bra<Imm>
分支地址指令 A槽
BrPC←Immediate
Bra_Next_Protocol
分支到下一个协议 B槽
BrPC←f(template[next_protocol])1,2
1.下一个协议等于=在连接状态下将指针加入到协议链模板内。
2.f=从协议id到微程序存储进入点的协议地图功能。(左移位结构位数)
Clr.k Rn(k=0,1,...,31)
清除位指令 X槽
Rn←Rn &(~(0x1<<k))
Cmov.e Rm,Rn等于指令时条件移动 X槽
If(~E)Rn←Immediate1
1.4字节操作
Cmov_I.e<Imm>,Rn
不等于指令时条件移动 X槽
If(E)Rn←Immediate1
1.4字节操作
Cmov_I.e<Imm>,Rn
等于指令时条件移动Immediate X槽
If(E)Rn←Immediate1
1.Rn中的低字节(字节3)得到数据,其它3个字节清零
Cmov_I.ne<Imm>,Rn
不等于指令时条件移动Immediate X槽
If(~E)Rn←Immediate1
1.Rn中的低字节(字节3)得到数据,其它个字节清除
Cmov_C.ne<Index>,Rn
等于指令时条件移动constant X槽
If(E)Rn←ConstantTable[index]Cmov_C.ne<Index>,Rn
不等于指令时条件移动constant X槽
If(~E)Rn←ConstantTable[index]
Cmp Rm,Rn
比较指令 T槽
If(Rn==Rm)E←true1
If(Rn>Rm)G←true
If(Rn<Rm)L←true
1.32位比较操作
Cmp_I<Imm>,Rm
比较Immediate指令 T槽
If(Rm==Immediate)E←true1
If(Rm>Immediate)G←true
If(Rm<Immediate)L←true
1.8位比较指令(Rm中低位字节,字节3,具有Immediate)
Cmp_Chk Rm
比较校验和寄存器 T槽
If(Rm==Chk)E←true1
If(gm>Chk)G←true
If(Rm<Chk)L←true
1.16位比较操作(Rm中低位字节,字节2和3,具有Immediate)
Extract4.k Rm,Rn(k=0,1,2,3,4,5,6,7)
取出半字节指令 X槽
Rn←((Rm>>(7-k)*4)&0xF)1
1.半字节插入最不重要位置(位3:0),其它3.5字节在目的地清除
Extract8.k Rm,Rn(k=0,1,2,3)
取出字节指令 X槽
Rn←((Rm>>(3.k)*8)&0xFF)1
1.1字节插入最不重要位置(字节3),其它3字节在目的地清除
Extract16.k Rm,Rn(k=0,1)
取出双字节指令 X槽
Rn←((Rm>>(1-k)*16)&0xFFFF)1
1.2字节插入最不重要位置(字节2和3),其它2字节在目的地清除
Halt
中止指令 M槽
结束处理
Insert4.k Rm,Rn(k=0,1,2,3,4,5,6,7)
插入半字节指令 X槽
Rn←((Rn &(~0xF<<((7-k)*4)))|((Rm & 0xF)<<((7-k)*4)))1
1.半字节插入半字节位置k,其它3.5字节保持不变
Insert8.k Rm,Rn(k=0,1,2,3)
插入字节指令 X槽
Rn←((Rn &(~0xF<<((3-k)*8)))|((Rm & 0xF)<<((3-k)*8)))1
1.1字节插入字节位置k,其它3字节保持不变
Insert16.k Rm,Rn(k=0,1)
插入双字节指令 X槽
Rn←((Rn &(~0xF<<((3-k)*8)))|((Rm & 0xF)<<((3-k)*8)))1
1.2字节插入双字节位置k,其它2字节保持不变
Jmp
Jump指令 B槽
μPC←BrPC
Lchk
载入数据的校验和 C槽
Chk←低8位+高8位
1.增加补码(互联网校验和算法)
Lchk_acc
累加载入数据的校验和 C槽
Chk←Chk+低8位+高8位
Load8@(bp)+,Rn
载入具有后增量寻址指令的字节 M槽
Rn←Memtory[Bp]1
Bp←Bp+1
1.1字节数据到达目的地寄存器最不重要的字节,其它字节清除,8位偏移
Load8
I@(<Imm>Bp),Rn
载入具有Immediate寻址指令的字节 M槽
Rn←Memtory[Immediate+Bp]1
1.字节数据到达目的地寄存器最不重要的字节,其它字节清除,8位偏移
Load8
R@(Rm,Bp)<Rn
载入具有寄存器寻址指令的字节 M槽
Rn←Memtory[Register+Bp]1
1.1字节数据到达目的地寄存器最不重要的字节,其它字节清除,8位偏移—仅仅使用地址寄存器最低字节
Load16@(Bp)+,Rn
载入具有后增量寻址指令的未调整双字节 M槽
Rn←Memtory[Rm+Bp]1,2
Rn←Bp+2←←←
1.16位数据到达目的地寄存器中的较低次序的两个字节,其它字节清除
2.字节调整的偏移
Load16@(<Imm>,Bp),Rn
直接载入未调整的双字节指令 M槽
Rn←Memtory[Immediate+Bp]1,2
1.16位数据到达目的地寄存器中的较低次序的两个字节,其它字节清除
2.字节调整的偏移
Load16@(<Imm>,Bp),Rn
直接载入未调整的双字节指令 M槽
Rn←Memtory[Immediate+Bp]1,2
1.16位数据到达目的地寄存器较低次序的两个字节,其它字节清除
2.字节调整的偏移
Load32@(<Imm>,Bp),Rn
直接载入未调整的四字节指令 M槽
Rn←Memtory[Immediate+Bp](32位)
Load32@(Bp)+,Rn
寄存器间接载入未调整的四字节指令 M槽
Bp←Bp+4
Lshift1 Rn
左移位1个指令 X槽
Rn←Rn<<1
Lshift2 Rn
左移位2个指令 X槽
Rn←Rn<<2
Lshift8 Rn
左移位8个指令 X槽
Rn←Rn<<8
Mov Rm,Rn
移动指令 X槽
Rn←Rm
Mov_C<Index>,Rn
移动constant指令 X槽
Rn←ConstantTable[Index](4字节)
Mov_I<Imm>,Rn
移动Immediate指令 X槽
Rn←Immediate
Nop
无操作指令 所有槽
无操作
Or Rm,Rn
或指令X槽
Rn←Rn or Rm(4字节)
Or_I<Imm>,Rn
或Immediate指令 X槽
Rn←Rn|Immediate(Immediate=1个字节,Rn=04个字节)
Rchk
X槽数据校验和 C槽
Chk←低位字节+高位字节1
1.One’s Completion Addition(互联网校验和算法)
Rchk_acc
累加X槽数据的校验和 C槽
Chk←Chk+低位字节+高位字节1
1.One’s Completion Addition(互联网校验和算法)
Rload_Bp Rm
载入存储器基址寄存器 X槽
Bp←Pm(低字节)
Rload_Bp_I<Imm>
将Immediate载入存储器基址寄存器 X槽
Bp←Immediate(1字节)
Rshift1 Rn
左移1个指令 X槽
Rn←Rn>>1
Rshift2 Rn
左移2个指令 X槽
Rn←Rn>>2
Rshift8 Rn
左移8指令 X槽
Rn←Rn>>8
Rstore_Bp,Rn
存储存储器基址寄存器 M槽
Rn←Bp(Rn的低字节得到Bp,其余字节清除)
Rstore_Chk,Rn
存储存储器基址寄存器 X槽
Rn←~Chk1,2
1.Rn的低2位字节得到Chk,其余字节清零
2.Rn得到Chk补码
Schk
计数数据校验和 C槽
Chk←低位字节+高位字节1
1.增加补码(互联网校验和算法)
Set.k Rn(k=0,1,...,31)
设定位指令 X槽
Rn←Rn|(0x1<<k)
Store8 Rm,@<Imm>
存储字节指令 M槽
存储器[Immediate+Bp]←Rm(8位)
Store16 Rm,@<Imm>
存储未调整的双字节指令 M槽
存储器[Immediate+Bp]←Rm(16位)
Store32 Rm,@<Imm>存储未调整的双字节指令 M槽
存储器[Immediate+Bp]←Rm(32位)
Sub_Bp Rm
从Bp指令中减去寄存器 M槽
Bp←Bp-Rm(来自Rm的低字节,Bp=1字节)
Sub_Bp_I<Imm>
从Bp指令中减去Immediate M槽
Bp←Bp-<Imm>(Imm=1字节,Bp=1字节)
Sub Rm,Rn
减法指令 X槽
Rn←Rn-Rm(4字节)
Sub_I<Imm>,Rn
减Immediate指令
Rn←Rn-Immediate(Imm=1字节,Rn=4字节)
Test_I<Imm>,Rm
相对伪指令测试寄存器 T槽
If((Rm & Immediate)==0)E←0 Else E←1
Xor Rm,Rn
Or指令 X槽
Rn←Rn^Rm(4字节)
Xor_I Rm,Rn
Xor_I Rm,Rn
或Immediate指令 X槽
Rn←Rn^Immediate(Immediate=1字节,Rn=4字节)