专利名称:在可扩展的处理器架构中增加高级指令所用的方法和装置的制作方法
技术领域:
一般说来,本发明涉及微处理器,更确切地说,涉及对微处理器增加高级指令扩展所用的方法和装置。
背景技术:
新的着重应用的芯片系统平台促进了新的专用处理器。可配置的和可扩展的处理器架构提供了优化逻辑解决方案的效率,同时具有标准的高级编程方法的灵活性。处理器的自动化扩展和相关联的软件工具(编译器、调试器、模拟器和实时操作系统)使得使用装置可配置的和可扩展的处理器成为现实。同时,在软件和指令集架构的级别进行设计,显著地缩短了设计周期,而且降低了验证工作量和风险。
2001年8月28日发布的标题为“High Data Density RISCProcessor”的6,282,633号美国专利、1999年2月5日提交的标题为“Automated Processor Generation System for Designing aConfigurable Processor and Software”的09/246,047号美国专利申请、1999年5月28日提交的标题为“System for Adding ComplexInstruction Extensions to a Microprecessor”的09/322,735号美国专利申请以及2000年2月17日提交的标题为“Improved AutomatedProcessor Generation System for Designing a Configurable Processorand Software”的09/506,502号美国专利申请——均由本受让人共同拥有并在此引用作为参考——引人注目地推进了微处理器架构和设计的前沿技术。
更确切地说,这些在先专利和专利申请详细介绍了高性能的RISC处理器,以及能够根据用户的指标(如中断的数目、处理器接口的带宽、指令/数据高速缓存的规模、包括MAC或乘法器)和实施目标(如目标ASIC技术、速度、门数、功率消耗、优先化)产生这种高性能RISC处理器之定制版本的系统。所述系统产生所述处理器的寄存器传输级(RTL)的表达,以及所述处理器所用的所述软件工具(编译器、逻辑器、汇编器、调试器、模拟器、代码剖视器等),合成与位置与路由的集合把所述RTL表达变换为可制造的几何图案。所述系统进一步包括若干评价工具,它们使处理器扩展能够为所述应用中共同使用的函数提供硬件支持,以便实现软件灵活性和硬件性能之间的理想折衷。
一般说来,如
图1所示,所述系统产生的所述处理器102可以包括可配置的内核104,它实质上是6,282,633号美国专利中介绍的处理器,以及可选的专用处理器扩展的集合106,这些扩展可以由Tensilica指令扩展(TIE)语言指令和/或其他高级硬件描述语言指令来描述,正如以上引用的专利申请中的详细介绍。引用的专利和专利申请中的所述处理器和生成系统包含在加利福尼亚州Santa Clara的Tensilica公司的已面市的若干产品中。
尽管上述处理器和生成系统提供了许多优点,但是所述处理器受限于一条指令局限于执行单一的计算任务,无论它有多复杂。增加能够同时执行之计算任务的数目,是进一步改进嵌入系统性能的关键。为了达到这个目标,已经发明了几种现有技术的微处理器(如IntelIA-64架构)——典型情况下称为VLIW机——使多个操作能够封装在单一的指令中以便并发执行。在这样一种微处理器中,一条指令包含着多个操作时隙,每个时隙都能够执行一组与其他操作独立的操作。由C/C++编译器检测并行计算操作并把所述操作封装在VLIW指令中以便同时执行,或者由程序员手工把若干操作组合在VLIW指令中,实现了所述并发性。不过,所有这些现有技术的VLIW机都受限于具有固定的指令集,因而无法配置为支持专用扩展。
发明内容
本发明致力于向微处理器增加高级指令所用的系统。所述系统包括正式地吸收所述新指令的语言,以及为所述扩展的处理器产生硬件实施方案和软件工具的方法。所述扩展语言提供了新的VLIW指令、复杂的加载/存储指令、使用函数的更强有力的描述风格、更强有力的寄存器操作码、产生异常的指令以及新的内建模块组。所述方法能够为所述新指令产生全流水线的微架构实施方案,形式为标准的CAD工具能够处理的可合成的HDL描述。所述方法也能够为具有新指令的所述微处理器产生软件组件,以便扩展软件开发工具。
根据一个方面,本发明中介绍的所述处理器生成系统通过使系统设计者能够设计专用的定制VLIW微处理器,以便实现更高的性能、更低的硬件成本和更低的功耗,对现有专利和专利申请中介绍的所述处理器生成系统的可配置和可扩展方面都有改进,同时也改进了固定指令集的VLIW机。
附图简要说明连同附图阅读了本发明之若干特定实施例的以下说明之后,本发明的这些和其他方面和特性对于本领域的普通技术人员将变得显而易见,其中图1是一幅框图,展示了一个高性能处理器;图2是一幅框图,展示了根据本发明的原理产生的一个高性能处理器;图3A和图3B展示了根据本发明的一个方面产生的实例VLIW指令格式以及相关联的解码和执行逻辑;
图4是一幅示意图,展示了根据本发明的一个方面如何处理VLIW指令;图5展示了判断已定义指令长度的方法;图6展示了判断新定义指令解码长度的方法;图7展示了根据本发明产生长度表的方法;图8展示了根据本发明产生格式表的方法;图9展示了根据本发明判断指令格式表的方法;图10展示了根据本发明为格式表产生软件工具的方法;图11展示了根据本发明为加载/存储单元提供字节禁用逻辑;图12是一幅框图,展示了根据本发明为加载/存储单元所用的回转逻辑;图13展示了根据本发明把加载/存储单元关联到指令的方法;图14展示了根据本发明提供共享函数;图15展示了根据本发明执行迭代指令的共享函数实例;图16展示了根据本发明的处理器中有用的流水线延迟逻辑;图17展示了根据本发明的增强操作码寄存器文件语义;图18展示了根据本发明的增强操作码寄存器文件接口;图19是一幅框图,展示了根据本发明一个方面的异常处理。
具体实施例方式
现在将参考附图,详细介绍本发明,这些附图提供为本发明的展示性实例,以便使本领域的技术人员能够实践本发明。值得注意的是,以下的附图和实例并不意味着限制本发明的范围。此外,在使用公知部件能够部分地或完全地实施本发明的一定要素之处,将仅仅介绍这些公知部件中对理解本发明必需的部分,这些公知部件其他部分的详细描述将被略去,以便使本发明更加清晰。另外,本发明包含了本文中为了展示而引用的公知部件的当前和将来公知的等效品。所述Tensilica指令扩展(TIE)语言参考手册形成了本公开材料的一部分,附带为其附录C并在此引用作为参考。
图2是一幅顶层示意图,展示了根据本发明的指令扩展能够产生的处理器实例。如图2所示,一般说来,所产生的处理器包括指令取出单元210,它能够对高级指令比如VLIW指令进行解码。所述系统包括增强的扩展语言(TIE),用于正式吸收VLIW协处理器208执行的新指令以及所述TIE数据路径204所用的其他定制指令。所述扩展语言进一步提供了使用可配置数目的加载/存储单元212的复杂加载/存储指令、包括共享函数206的更强有力的描述风格、为了充分利用寄存器文件214的更强有力的寄存器操作码、在运行操作期间定义处理器异常的新方法以及新的内建模块组。
本发明建立在现有专利和专利申请所介绍的技术之上,其中介绍了基本的TIE语言及其编译器和其他工具,用于产生定制的高性能处理器,以及支持硬件描述和所述定制处理器所用的软件工具。本发明以新的构造扩展了所述TIE语言,用于产生另外的处理器硬件和相关联的工具,本公开材料介绍了所述新的用于构造的内容以及所述TIE编译器支持这些构造的方式。所以,现有公开材料的内容在此引用作为参考,将仅仅提供所述新特点的细节。不过总而言之,所述结合的公开材料将使本领域的技术人员能够实践一种方法,用于产生硬件实施方案和所述扩展的处理器所用的软件工具。
如上所述,以及如图2所示,本发明的一个方面是对高级指令比如VLIW指令进行解码,以便由VLIW协处理器执行。在共同待批准的10/145,380号专利申请(TEN-014)中,更详细地介绍了本发明实现的能够利用所述VLIW指令的一种可能的VLIW协处理器实施方案。在这样的实例实施方案中,除了由处理器内核202执行的16位和24位指令以外,还提供了所述VLIW指令(为了使本发明更加清楚,没有详细显示执行所述内核指令的结构,但是可以由例如6,282,633号美国专利中介绍的结构来实施)。
图3A中展示了根据本发明的实例VLIW指令302。在这个实例中,所述VLIW指令是64位。不过,本发明不限于这种规模的VLIW指令。对于低位在前系统,最好是从所述指令的最低位开始确定指令长度。对于图3中的实例,指令302的最低半字节(0-3位)指定了所述指令长度。对于高位在前系统,所述规模指标最好处于最高位。
在根据本发明一个实例的VLIW指令集中,操作(op)是由执行单元执行的计算任务。如图3所示,由本发明的所述TIE定义的VLIW指令包括若干时隙的特定组合,在这个实例中的三个。由于可以有许多指令格式,一个时隙可以可以属于多种格式。VLIW指令中的这些时隙定义了独立运行的分开的流水线执行单元。不过,一个指令时隙也可以执行多个op,一个op也可以属于多个时隙。
如图3B进一步所示,如何使用TIE来定义VLIW指令和格式将导致所述处理器中定制硬件的产生。例如,所述VLIW和其他指令规模的定义将确定指令取出单元210中长度解码器的结构。另外,所述多种指令格式将导致指令取出单元210中特定格式解码器306的产生。最后,对每个时隙定义的操作组将确定VLIW协处理器208中每个分开的流水线执行单元308的结构。
一般说来,图4中显示了在根据本发明的一个实例定义的处理器中,对于VLIW指令确定所述操作组的过程。如图4所示,由程序计数器(PC)指向所述指令的起点。通过查看所述长度解码位(LD)中的数值,确定下一条指令的长度(位数)。在本发明的一个实例中,所述LD字段中的数值14表明当前指令的长度是64位。通过查看所述格式解码位(FD)中的数值,可以进一步把给定的格式解码为几种格式。在一个实例实施方案中,所述FD字段中的数值2表明格式f64b。每种格式都包含一组操作时隙。一旦格式已知,就能够提取这些时隙,能够提取这些时隙中的字段,能够对操作码进行解码,以及能够对操作数进行计算。对于识别将要执行的操作组,这些是基本步骤。在后续的若干节中介绍这些步骤的细节。
以下的若干节介绍所述新的TIE构造,以便吸收VLIW指令以及产生相关联的硬件描述和软件工具。
描述VLIW指令扩展的初始步骤是指定其长度。在一个实例实施方案中,由以下TIE语句可以定义新指令的长度
length[i-name][i-length]{expression}其中i-name是能够用于引用所述长度的唯一标识符,i-length以位数指定了所述指令的长度,可选地使用expression来指定在可变的InstBuf中确定所述指令长度所用的解码逻辑。在一个实例实施方案中,i-length必须指定为8位的倍数,而且(对于低位在前系统)仅有最低的半字节用于所述expression中。
如果在所述TIE程序中已经包括了指令长度定义,就由所述TIE编译器来处理所述程序。在所述TIE编译器中所述硬件逻辑和软件工具产生函数共享公用的方法。这个方法创建一个长度表,把所述长度解码字段中的最小项映射至指令长度。仅仅涉及所述长度表达式所引用的指令位。此表对于这些位中数值的每一种可能的组合,都包含一个条目。位数值的这些组合类似于逻辑表达式中的最小项,所述TIE编译器也如此看待它们。图5中介绍了从TIE长度语句产生所述长度表的一种方法。例如假若所述TIE程序包含着以下的长度表达式length l24 24{InstBuf[3]==0}length l16a 16{InstBuf[3:2]==2'b10}length l16b 16{InstBuf[3:1]==3'b110}length l64 64{InstBuf[3:1]==3'b111}将产生以下的长度表InstBuf[3:1] 长度名称----------------------------------000 l24001 l24010 l24011 l24100 l16a101 l16a110 l16b111 l64
使用以上构建的长度表,就能够由图6中介绍的过程构建所述硬件解码逻辑。使用以上的实例,所产生的硬件可以是length_24=InstBuf[3:1]==3'b000|InstBuf[3:1]==3'b001|InstBuf[3:1]==3'b010|InstBuf[3:1]==3'b011;
length_16=InstBuf[3:1]==3'b100|InstBuf[3:1]==3'b101|InstBuf[3:1]==3'b110;
length_64=InstBuf[3:1]==3'b111;
使用以上构建的长度表,就能够由图7中介绍的过程构建所述软件解码例程。使用以上的实例,所产生的软件解码例程可以是switch(InstBuf[3:1]){case 0:return 24;
case 1:return 24;
case 2:return 24;
case 3:return 24;
case 4:return 16;
case 5:return 16;
case 6:return 16;
case 7:return 64;
}应当注意,在以上实例中,所述解码字段限制为4位宽。这是一个产生高效硬件解码逻辑的优选实施例。不过,一般的方法在所述解码逻辑中允许任何的位数,本发明包括此类替代实施例。
应当进一步注意,以上实例对所述解码逻辑表达式也作出了限制。同样,这是用于高效解码逻辑的优选实施例。一般的方法优选所述解码逻辑的任意指标。
在增加VLIW扩展中的另一个步骤是定义这些指令的格式。在一个实例实施方案中,新VLIW指令的格式可以使用以下TIE语句来定义format[name][length]{decoding}
其中name是对于所述格式的唯一标识符,length是过去定义之长度的名称,可选的decoding是为所述指令格式指定所述解码逻辑的表达式。
在创建包含这些格式语句的TIE程序时,所述硬件逻辑和所述TIE编译器的软件工具产生函数共享公用的方法。为每种指令长度创建一个格式表,把所述格式解码字段的所述最小项映射至指令格式代码。图8中介绍了从TIE格式语句产生所述格式表的所述过程。例如假若所述TIE程序包含着以下的格式表达式format four_slots l64{InstBuf[63]==1'b0}format three_slots l64{InstBuf[63:62]==2'b10}format two_slots l64{InstBuf[63:62]==2'b11}对于长度l64将创建比如以下的格式表InstBuf[63:62] 格式代码-------------------------------------------------00 format_four_slots01 format_four_slots10 format_three_slots11 format_two_slots使用以上构建的格式表,就能够由图9中介绍的过程构建所述硬件格式解码逻辑。使用以上的实例,所产生的硬件可以是format_four_slots=(InstBuf[63:62]==2'b00|InstBuf[63:62]==2'b01)&l64;
format_three_slots=(InstBuf[63:62]==2'b10)&l64;
format_two_slots=(InstBuf[63:62]==2'b11)&l64;
使用以上构建的格式表,就能够由图10中介绍的过程构建所述软件格式解码例程。使用以上的实例,所产生的软件解码例程可以是switch(InstBuf[63:62]){case 0:return format_four_slots;
case 1:return format_four_slots;
case 2:return format_three_slots;
case 3:return format_two_slots;
}在增加VLIW扩展中的另一个步骤是定义操作时隙的格式。在一个实例实施方案中,VLIW指令的新操作时隙的格式可以使用以下TIE语句来定义slot[name][format-name[index:index]]其中name是对于所述时隙的唯一标识符,format-name是过去定义之格式的名称。所述位索引应当是所述格式的有效索引,即它们必须在所述格式的所述指令长度之内。尽管时隙名称能够以相同的或不同的格式定义多次,但是所有定义都包含着相同的位数。
在创建包含这些时隙语句的TIE程序时,所述硬件逻辑和所述TIE编译器的软件工具产生函数将产生能够提取所述时隙的逻辑。例如,所述TIE程序可以包括以下语句length l64 64{InstBuf[3:0]==15}format f64 l64slot alu{f64[23:4],f64[27:24]}slot mac f64[43:28]slot s1 f64[53:44]slot s1 f64[63:54]在硬件实施方案中,为了方便往往使用变量来表示时隙的所述内容。所述时隙变量的数值从所述定义直接得出。使用以上的实例,令slot_alu为所述alu时隙的变量,所述HDL语句可以是assign slot_alu={InstBuf[23:4],InstBuf[27:24]}从所述TIE时隙语句仅仅以所述指令缓冲区(“InstBuf”)替代所述格式名称(如“f64”),就产生了这句HDL。
在软件工具中,使用一个变量来表示时隙的所述内容也是有用的。使用相同的实例并令slot_alu为所述alu时隙的变量,所述C语句可以是
slot_alu=InstBuf&0xfffff0|(InstBuf>>24)&0xf;
(为了提取及组合所述时隙字段而在C中产生一个移位和掩码操作序列是直接了当的,而且所述方法应当极为显而易见。)在增加VLIW扩展中的下一个步骤是为操作时隙定义字段。在一个实例实施方案中,VLIW指令的新操作时隙的格式可以包括若干字段,而字段可以用于不同的时隙。新操作字段可以使用以下TIE语句来定义field[name][field-name[index:index]或者slot-name[index:index]]其中name是对于所述字段的唯一标识符,field-name和slot-name分别是过去定义之字段或时隙的名称。所述位索引是相对于所述字段或时隙,不是所述指令缓冲区之内的绝对索引,并且应当是所述字段或时隙的有效索引。
在创建包含这些字段语句的TIE程序时,所述硬件逻辑和所述TIE编译器的软件工具产生函数将产生能够提取所述字段的逻辑。尤其是所述TIE编译器将为每个创建的字段确定若干所述时隙组。例如,所述TIE程序可以包括以下语句field f1 s1[3:0]//s1 is a slotfield f1 s2[4:1]//s2 is a slotfield f2 s1[7:4]//s1 is a slotfield f2 s3[2:0]//s3 is a slotfield f3{f2
,f1}然后所述编译器将产生以下时隙组f1的时隙组{s1,s2}f2的时隙组{s1,s3}f3的时隙组{s1}(即字段f3仅仅定义在时隙s1中)在增加VLIW扩展中的另一个步骤是定义操作码。在一个实例实施方案中,对于VLIW指令,新操作码可以用于不同的时隙中。新操作码可以使用以下TIE语句来定义opcode[name][field-name=大小确定的常数]
其中name是对于所述操作码的唯一标识符,field-name是过去定义之字段的名称。优选情况下,所述指令扩展定义为以用户定义之加载和存储指令预定义的操作码名称CUST0或CUST1的子操作码。
在创建包含这些操作码语句的TIE程序时,所述硬件逻辑和所述TIE编译器的软件工具产生函数将产生能够识别所述操作码的解码器逻辑。作为其一个方面,所述TIE编译器将为每个创建的操作码确定若干所述时隙组,而对于一个操作码的时隙组就是包含着指定此操作码之所述字段的时隙组。例如,所述TIE程序可以包括以下语句field f1 s1[3:0]//s1 is a slotfield f1 s2[4:1]//s2 is a slotfield f2 s1[7:4]//s1 is a slotfield f2 s3[2:0]//s3 is a slotopcode o1 f1=3opcode o2 f2=0 o1然后将确定以下时隙组f1的时隙组{s1,s2}o1的时隙组{s1,s2}f2的时隙组{s1,s3}o2的时隙组s1可见,操作码o1在时隙s1和s2中都有定义,而操作码o2仅仅在时隙s1中有定义。
指令(操作)类——它们把操作码关联到操作数——以TIE的iclass语句定义。其中定义了一个iclass的时隙组称为所述iclass的时隙组。由于iclass是按照操作码和操作数定义的,对于所述iclass的时隙组可能并非一目了然。确定iclass之时隙组的一种实例方法是在所述iclass定义中,确定全体操作码的所述时隙组与操作数所用字段的所述时隙组的交集。
给定了每种iclass的时隙组之后,为了识别每个时隙中操作码而产生的所述解码逻辑,其产生方法就与上述应用中所介绍的方法相同。如同在上述应用中利用所述TIE描述,所述操作码的所述iclass、语义和引用定义将确定包括所述操作码之指令的行为,由此也确定了对于所述操作码所确定的VLIW时隙组,与所述执行单元相关联的所述硬件和软件。
回去参考图2,以及共同待批准的10/146,651号专利申请(TEN-015)中更全面的讲解,本发明的另一个方面是操作可配置数目的加载/存储单元的能力。另外一个方面是对所述加载/存储单元提供增强的接口。为了允许多个加载/存储指令扩展共享一定的公用逻辑,本发明向所述TIE语言增加了某些新构造。本文下面介绍这些构造的定义和用途。
使用现有专利和专利申请的处理器产生系统,加载指令从所述存储器读取整个字(多个字节)。为了读取所述字中若干字节的一个子集,无法不读取其他部分。对于一定的存储器映射设备,读取一个数值的效果是从所述设备中去除了所述数据。对于这些设备,读取不需要的数据(字节)是极不期望的,并可能会耗费大量的附加硬件来解决所述问题。同样,现有系统中的存储指令总是把整个字写入所述存储器。不可能仅仅写入所述字中若干字节的一个子集。本发明通过使用新提供的LoadByteDisable和StoreByteDisable接口信号提供了一般的方法,用于在加载或存储操作期间指定要读取或写入的各个字节。
利用这种方案,所述字节禁用逻辑在所述加载/存储单元中实施一次,并在所有加载/存储指令之间共享,包括所有的处理器内核202指令以及所有用户定义的TIE数据路径204指令。图11显示了如何组合不同的加载/存储指令语义,以便为所述公用的加载/存储单元产生共享的加载字节禁用和存储字节禁用信号。
在现有系统的另一个实例限制中,按照读出所述数据的虚拟地址的低阶位,从所述存储器读取的数据以一种特定的方式回转。写入所述存储器的数据根本不回转。如果加载或存储指令需要所述数据以某种其他的方式回转,就必须使用附加的逻辑。本发明为所述读取和写入数据指定所述回转量提供了更一般的方式,在所述各个指令语义逻辑中不再需要额外的回转逻辑,而且允许多条指令共享所述回转逻辑。
这种新的能力以RotateAmount接口信号提供。利用这种方案,所述回转逻辑在所述加载/存储单元中实施一次,并在所有加载/存储指令之间共享,包括所有的处理器内核202指令以及所有用户定义的TIE指令。图12显示了如何组合不同的加载/存储指令语义,以便为所述公用的加载/存储单元产生单一的共享回转量信号。
作为另一个实例,对于涉及带符号数据的许多加载指令,常见的是对从存储器读取的数据进行符号扩展。使用现有的系统,可以在所述指令语义中做到这一点。不过,典型情况下所述符号扩展逻辑包括多次复制所述符号位,所以增加了所述符号位的输出负载,而且潜在地使它成为所述语义逻辑中计时紧迫的路径。共同待批准的10/146,651号专利申请(TEN-015)介绍了一种方法,通过把所述操作移出所述加载/存储单元中计时紧迫的路径来进行这种符号扩展。本发明提供了一种方法,使用户定义的指令使用所述加载/存储单元中的而不是所述指令语义中的所述符号扩展逻辑,从而在设计中避免了潜在的计时问题。为了吸收所述符号扩展需求,本发明向TIE语言增加了两个新信号——SignExtendFrom和SignExtendTo。SignExtendFrom指定了包含所述符号位之字节的位置,典型情况下它是所述加载数据的最高位。SignExtendTo指定了所述符号扩展后数据最高字节的位置。例如,假若所述读取数据是8’b10001111,SignExtendFrom是1,SignExtendTo是2,所述扩展后数据将是16’b1111111110001111。
利用这种新的能力,所述用户TIE指令就能够从存储器加载符号扩展后的数据而无须任何额外的硬件。以下是如何使用这个特点的实例----------interface SignExtendFrom 5 core outinterface SignExtendTo 5 core outiclass sign_load{SL}{out art,in ars,m imm8}{}{out SignExtendFrom,out SignExtendTo,in MemDataIn32,outVAddr}reference SL{assign VAddr=ars+imm8;assign SignExtendFrom=5'd2;assign SignExtendTo=5'd4;assign art=MemDataIn32;}-----------------这项描述指定了一条符号扩展的加载指令,它从“ars+imm8”指定的存储器位置读取16位数据,符号扩展到32位,并把所述符号扩展后的数据放到“art”。
在几乎所有应用中,都存在着仅仅当一定的条件满足时才进行的加载/存储操作。使用多条指令来进行所述条件加载/存储操作往往是低效的。例如,以下代码序列-------------------if(cond){x=load(addr);
}--------------------典型情况下就产生几条指令所述条件判断、转移和加载。进一步的低效来自与典型的转移指令相关联的额外延迟。期望在能够按照条件加载所述数据的单一指令中计算这项任务。不过,在现有系统中,如果发出了加载或存储指令,就无法取消所述加载或存储操作,所以不可能实施条件加载/存储指令。本发明通过使用前面介绍的LoadByteDisable和StoreByteDisable接口信号,使之成为可能。LoadByteDisable/StoreByteDisable的定义指出,如果全部字节被禁用,相关联的加载/存储操作就被取消。以下的实例展示了如何使用这个特点-----------------------interface LoadByteDisable 5 core outiclass cond_load{CL}{out art,in ars,in imm8}{in cond}{out LoadByteDisable,in MemDataIn32,out VAddr}reference SL{assign VAddr=ars+imm8;
assign art=MemDataIn32;
assign LoadByteDisable={5{VAddr
==1'b1}};}--------------------------这项描述实施了一条加载指令,当所述地址为偶数时它条件地加载所述数据。
允许由一条指令进行多个并行的操作是提高所述系统性能的一个关键措施。由本发明支持的所述VLIW架构通过如上所述在一条指令中提供多个操作时隙而做到了这一点。这使得它可能并发地进行几个存储器的操作。共同待批准的10/146,651号专利申请(TEN-015)介绍了多个加载/存储单元的实施方案。本发明在TIE中增加了附加的能力,是用户把加载/存储指令与特定的加载/存储硬件单元相关联。不仅如此,本发明还提供了指定一条加载/存储指令独立于任何特定的加载/存储单元的一种方法,以及把所述单元独立的操作自动地映射至可用硬件加载/存储单元的一种方法。
对于指定为使用单元独立的存储器接口的任何加载/存储操作,都可以使用一种自动过程来把特定硬件加载/存储单元的所述操作指定为优化一定的条件,比如所需要的单元总数,或者最高应用性能。图13展示了一个优选实施例。把加载/存储单元分配给单元独立的加载/存储操作的过程开始于寻找一个加载/存储单元,它已经用于该指令的相同时隙位置。由于在每个周期中每个时隙位置只能发出不多于一项操作,这样一种分配将不会导致任何资源(加载/存储单元)争夺。如果无法找到这样一个加载/存储单元,所述分配过程就寻找一个没有任何使用的加载/存储单元。当第二个步骤失败时,所述过程就向用户发出一条错误消息。
回去参考图2,本发明的另一个方面是定义共享函数的能力。在现有的处理器产生系统中,TIE指令的语义表达为以逻辑表达式对变量赋值的集合。即使对于指定任何指令语义这已经足够,但是却无法表达一组指令之间公共的计算过程。例如,以下是两条TIE指令Load和Store的语义描述reference Load{wire[31:0]buf;assign VAddr=ars+imm8;assign buf=MemDataIn32;assign art = swap {buf[7:0], buf[15:8], buf[23:16],buf[31:24]}:buf;}reference Store{wire[31:0]buf;assign VAddr=ars+imm8;assign buf=swap {art[7:0],art[15:8],art[23:16],art[31:24]}:art;assign MemDataIn32=buf;}---------------------所述“Load”指令从存储器加载32位,并且根据状态寄存器“swap”的数值条件地交换所述字节。同样,所述“Store”指令在根据状态寄存器“swap”的数值条件地交换所述字节之前把32位存储到存储器。虽然所述字节交换计算在两种语义中都有,但是必须指定两次。使用TIE函数构建,这种描述可以变得更加结构化和易理解如下--------------------function[31:0]byteswap(S,[31:0]D){assign byteswap=S {D[7:0],D[15:8],D[23:16],D[31:24]}:D;}reference Load{assign VAddr=ars+imm8;assign art=byteswap(swap,MemDataIn32);}reference Store{assign VAddr=ars+imm8;assign MemDataIn32=byteswap(swap,art);}----------------即使在单指令并行地进行几次相同的计算时,本发明的所述TIE函数构建也能够用于构造单指令语义。在以下的实例中,指令addsub4x8进行两个8位的加或减,取决于状态寄存器“sub”的数值。----------------------semantics addsub4x8{addsub4x8}{wire[7:0]t0=ars[7:0]+(sub ~art[7:0]:art[7:0])+sub;wire[15:8]t1=ars[15:8]+(sub ~art[15:8]:art[15:8])+sub;wire[23:16]t2=ars[23:16]+(sub ~art[23:16]:art[23:16])+sub;wire[31:24]t3=ars[31:24]+(sub ~art[31:24]:art[31:24])+sub;assign arr={t3,t2,t1,t0};}------------------------------显然,所述8位加减单元指定了四次。使用本发明的所述新TIE函数构造,相同的描述可以变得更加结构化和易理解如下-----------------------------function[7:0]addsub8(sub,[7:0]a,[7:0]b){assign addsub8=a+(sub ~b:b)+sub;}semantics addsub4x8{addsub4x8}{wire[7:0] t0=addsub8(sub,ars[7:0],art[7:0]);wire[15:8] t1=addsub8(sub,ars[15:8],art[15:8]);wire[23:16]t2=addsub8(sub,ars[23:16],art[23:16]);wire[31:24]t3=addsub8(sub,ars[31:24],art[31:24]);assign arr={t3,t2,t1,t0};}-----------------------现有的处理器产生系统允许几种指令语义共享公用的硬件。但是为了实现共享,用户就必须把所述指令的描述合并到单一的语义段中并且手工指定共享。例如,令ADD2、ADD3和ADD4为加两个、三个和四个数的三条指令。使用现有的发明,描述可以是--------------------------semantic add{ADD2,ADD3,ADD4}{assign sum=D0+D1+(ADD2 0:D2)+((ADD2|ADD3) 0:D3);}-----------------------使用本发明的所述共享函数构造,所述指令语义可以分开指定如下----------------------function[31:0]a4([31:0]d0,[31:0]d1,[31:0]d2,[31:0]d3)shared{assign a4=d0+d1+d2+d3;}semantic add2{ADD2}{assign sum=a4(D0,D1,0,0);}semantic add3{ADD3}{assign sum=a4(D0,D1,D2,0);}semantic add4{ADD4}{assign sum=a4(D0,D1,D2,D3);}-----------------与软件不同,硬件描述语言不提供两个不同的模块共享一个逻辑块的直接方式。本发明提供了一个过程,通过它所述TIE编译器就能够自动产生所述RTL实施方案,以便多个语义模块共享一个函数。所述过程包括以下步骤(1)为所述共享函数创建一个模块(2)为所述共享函数模块创建一个交换模块(3)为所述共享模块的每个输入(a)使用所述共享函数创建具有N个输入的多路转换器,N为语义模块的数目(b)把所述多路转换器的输出送入所述共享函数(4)使用一个共享函数对每个语义模块
(a)对所述共享函数的每个输入创建一个输出(b)对所述共享函数的所述输出创建一个输入(c)把所述语义输出送入所述交换模块作为输入(d)把所述交换模块的输出送入所述语义作为输入(5)为所述共享函数的调用者在所述解码器中创建一个信号并且把所述信号传送到所述交换模块(6)在所述交换模块中使用所述解码信号来选择适当的输入使用这个过程,为以上实例产生的RTL见图14所示。
本发明中的所述共享函数提供了以描述指令的能力提供了TIE,该指令几次使用一个硬件计算单元(因此为术语迭代指令)。在现有产生系统中这是不可能的。由于这个特点,所述计算硬件将不得不复制多次,导致额外的硬件成本。例如,假若想要使用现有的系统实施两个16位相乘的指令,唯一的方法是使用两个16位乘法器来做到这一点,如以下描述所示---------------------semantics mul2{MUL2}{wire[15:0]lo=ars[15:0]*art[15:0];wire[15:0]hi=ars[31:16]*art[31:16];assign arr={hi,lo};------------------------------使用本发明的TIE共享函数构造,所述指令可以使用以下语句描述--------------------function[15:0]mul16([15:0]a,[15:0]b)shared{assign mul16=a*b;}semantics mul2{MUL2}{wire[15:0]hi=mul16(ars[31:16],art[31:16]);wire[15:0]lo=mul16(ars[15:0],art[15:0]);assign arr={hi,lo};}schedule mul2_sch{MUL2}{def arr 2;}-------------------------利用这种描述,在硬件中所述16位乘法器仅仅实施一次而在所述指令MUL2的所述单一执行期间使用两次。在单一的迭代指令中几次使用一个共享函数的所述RTL实施方案非常类似于在几条不同的指令中使用一个共享函数。图15显示了以上实例所用的RTL结构。由于迭代指令在多个周期中使用共享函数,重要的是发出所述指令的逻辑明白使用共享函数所施加的资源约束。确切地说,无论何时只要检测到这样一种资源冲突,所述处理器都需要延迟。使用以上的实例,如果所述程序具有连续的MUL2指令,第二个就必须延迟一个周期。没有所述延迟的话,所述处理器就会发现第一个MUL2处于第二阶段而第二个MUL2处于第一阶段,二者同时都试图使用所述共享函数mul16。为了通知所述处理器任何将要来到的资源争夺,每个共享函数都产生一个延迟信号,它告诉所述处理器控制当前的指令是否需要延迟。实施所述延迟逻辑的方式可以有任意多种。在一个实施例中,所述共享函数RTL提供了一个接口作为使用请求的一个输入,并且告诉所述处理器控制所述请求是否能够得到保证(即当所述延迟信号为真时为是)。它在内部保存着全部过去接受的尚未完成的请求,并且使用它们与任何新请求进行对比。图16显示了由多条指令在不同的周期中使用的一个共享函数所用的延迟逻辑。
正如以上参考图2所陈述的,本发明的另一个方面是更高效和更灵活地使用寄存器文件。一条指令的寄存器操作数指定了在所述寄存器文件中哪个寄存器用作所述计算的输入或输出。在现有的处理器产生系统中,仅有一种方式来指定所述寄存器操作数把实际的寄存器号编码在所述指令的寄存器操作数字段中。例如,以下是使用现有的发明进行的寄存器操作数TIE描述------------operand art t{AR[t]}------------这个寄存器操作数定义指明了,在所述AR寄存器文件中实际的寄存器号是所述指令字段“t”中存储的数值。本发明提供了通用得多的方式来指定寄存器操作数。
增加一条指令所执行的计算量的一个重要方面是增加输入和输出数据的数目。不过,由于指令中的位数有限,指令可以使用多少寄存器操作数有一个限制。本发明提供了一种方式,使单一的寄存器操作数指定所述寄存器文件中多个相邻的寄存器。这种新的能力是基于一种增强的寄存器文件和寄存器操作数描述。一个实例描述可以是--------------regfile INT8 8 16s INT16=2 INT32=4--------------这个TIE代码实例宣布,一个寄存器文件INT8包含着32个8位寄存器。当每两个入口组合时,所述寄存器文件可以用作包含8个16位寄存器。当每四个入口组合时,所述寄存器文件可以用作包含4个32位寄存器。图17显示了这个寄存器文件的多种用途。
有两种方式使用这种新的能力来提高指令的计算效率。第一种是把几个相邻的寄存器组合在一起,作为传递更多的数据往返于所述指令语义(所述计算逻辑)的方式。如以下的实例所示-------------refile RFS 32 16 r RFD=2 RFQ=4field rd r[3:1]field sd s[3:1]field td t[3:1]field rq r[3:2]field sq s[3:2]field tq t[3:2]operand rfss s{RFS[s]}/*single entry operand*/operand rfst t{RFS[t]}/*single entry operand*/operand rfsr r{RFS[r]}/*single entry operand*/operand rfds sd{RFD[sd]}/*double entry operand*/operand rfdt td{RFD[td]}/*double entry operand*/operand rfdr rd{RFD[rd]}/*double entry operand*/operand rfqs sq{RFQ[sq]}/*quad entry operand*/operand rfqt tq{RFQ[tq]}/*quad entry operand*/operand rfqr rq{RFQ[rq]}/*quad entry operand*/iclass adds{ADDS}{out rfsr,in rfss,in rfst}iclass addd{ADDD}{out rfdr,in rfds,in rfdt}iclass addq{ADDQ}{out rfqr,in rfqs,in rfqt}reference ADDS{assign rfsr=rfss+rfst;}reference ADDD{wire[31:0]t0=rfds[31:0]+rfdt[31:0];
wire[31:0]t1=rfds[63:32]+rfdt[63:32];
assign rfdr={t1,t0};}reference ADDQ{
wire[31:0]t0=rfqs[31:0]+rfqt[31:0];
wire[31:0]t1=rfqs[63:32]+rfqt[63:32];
wire[31:0]t2=rfqs[95:64]+rfqt[95:64];
wire[31:0]t3=rfqs[128:96]+rfqt[128:96];
assign rfdr={t3,t2,t1,t0};
}--------------所述“regfile”语句定义了16个入口的一个基寄存器,每个入口都是32位宽。因为64位宽的寄存器仅有8个入口,就使用3位字段rd、sd和td来存取它。同样,4入口128位宽的寄存器文件使用2位字段rq、sq和tq来存取。这种描述能力能够定义更高效的指令ADDD和ADDQ,它们分别执行两个和四个相加。
使用所述宽寄存器文件的第二种方式是使用多个寄存器入口来表示更宽的数据。例如,单精度浮点寄存器文件也可以视为具有一半入口的双精度寄存器文件。
作为另一个实例,对于笛卡尔点数据类型,考虑宽寄存器操作数的以下使用--------------regfile SCALAR 32 16 x POINT=2ctype point 64 64 POINTfield sc s[2:0]field rc r[2:0]field tc t[2:0]operand cs sc{POINT[sc]}operand cr rc{POINT[rc]}operand ct tc{POINT[tc]}iclass point_arith{CADD}{out cr,in cs,in ct}reference CADD{
wire[31:0]t1=rfds[63:32]+rfdt[63:32];
assign cr={cs[63:32]+ct[63:32],cs[31:0]+ct[31:0]};}----------------这个实例定义了一个32位16入口的基寄存器文件“SCALAR”和一个“POINT”视图,它把每两个基寄存器组合出一个宽寄存器。然后它宣布一个ctype“point”,所以能够在应用代码中用于宣布点数据类型。由于宽寄存器文件“POINT”仅有一半的寄存器(8个),它仅需要3位来指定寄存器地址,因此是字段“sc”、“rc”和“rt”的定义。使用所述字段“sc”、“rc”和“tc”来定义所述宽操作数“cs”、“cr”和“ct”,以便存取所述宽寄存器文件“POINT”。最后,定义了所述笛卡尔点加指令“CADD”。这种描述能够写成应用代码如下----------------point C1,C2,C3;...C3=CADD(C1,C2);...----------------有多种方式来实施寄存器文件的多种组合。一种优选的方式是分层次建立,概述如下步骤1把所述寄存器文件划分为若干簇。对所述基寄存器建立多个簇。通过把所述基寄存器文件中入口数目除以最大组号,获得每簇寄存器文件中入口的数目。对于以上实例,每簇将有8个入口。要建立的簇数与最大组号相同。对于以上实例,将建立两个簇。
步骤2建立读取端口。通过把所述基寄存器文件的宽度乘以最大组号,确定所述读取端口的宽度。对于以上实例,所述宽度为64。所述读取端口由按照所述读取地址的低位从多个簇中选择所述读取数据的多路复用器驱动。对于以上实例,如果所述读取地址的低位为0,就从簇0选择所述读取端口的低32位,如果该位为1,就从簇1选择。
步骤3建立写入端口。所述寄存器文件对每个组宽都有一个写入数据端口。根据当前的写入组号,从适当的写入数据中选择所述写入到每个簇的数据。对于以上实例,如果所述写入组号为1,所述写入到簇0的数据是单宽度写入数据,如果所述写入组号为2,则是所述双写入数据的低32位。
步骤4建立延迟逻辑。所述寄存器文件延迟逻辑仅仅是来自每个簇之延迟信号的逻辑或。附录A附带的代码显示了以上实例的RTL实施方案。附录B附带的代码显示了以上过程的一个实施方案。
在所述RTL实施方案中,每个输入/输出寄存器操作数都映射到对应寄存器文件的一个读取/写入端口。在现有的系统中,由所述TIE编译器自动进行这种映射。无法超越所述映射过程的结果。由于寄存器文件中读取和写入端口的数目既影响所述实施方案的芯片面积,又影响其时钟速度,所以期望在试图优化设计的一定方面时,能够在所述TIE描述中手工指定所述操作数与寄存器文件端口的关联关系。本发明对TIE增加了这种新的能力。
以多个寄存器操作数映射到单一的有形寄存器文件端口(读取或写入),就需要附加的多路交换逻辑来产生所述读取或写入地址。输入到所述多路复用器的数据,来自分配给所述端口的每个操作数。所述解码器产生至所述多路复用器的选择信号。图18展示了所述逻辑的电路结构。
在操作数定义中,所述操作数语义为从指令字段中存储的数值计算实际寄存器号的逻辑。在现有的系统中,所述寄存器操作数语义必须是简单等同函数,也就是所述寄存器号必须直接出现在指令字段中。即使这仅有简单的优点,但是它有时限制性太强。本发明扩展了所述TIE语言,允许任意的操作数语义描述。“operand”语言构造用于吸收操作数语义。
句法
operandoperand operand-name field-name regfile-name{computation}operand关键字operand-name唯一的操作数名称field-name过去定义的字段名称regfile-name过去定义的寄存器文件名称computation操作数语义逻辑operand-name是要定义之操作数的名称。field-name是用作所述操作数语义逻辑输入的过去定义之字段的名称。regfile-name是与这个操作数相关联的过去定义之寄存器文件的名称。computation是所述操作数语义所用的任何逻辑描述。所述field-name必须用作所述computation中的输入。此外,所述computation也可以使用其他处理器状态和常数。所述computation最终对操作数名称赋值。此外,它也可以对其他处理器状态赋值。
例如,考虑定义一个操作数以存取寄存器文件中所述寄存器的子集。由于指令中给定了位数的限制,在需要存取所述寄存器的子集时,有时期望减少寄存器操作数专用的位数。这由以下TIE描述来展示----------------state BANK 2state COUNT 16regfile XR 32 16 xfield t3 t[2:0]field t2 t[1:0]field t1 t
operand xeven t3 XR{assign xeven={t3,1'b0};}operand xhigh t3 XR{assign xhigh={1'b1,t3};}operand xfirst t1 XR{assign xfirst={3'b0,t1};}operand xbanked t2{assign xbanked={BANK,t2};}operand xtracked t XR{assign xtracked=t;assign COUNT=COUNT+1'b1;}-------------------在这个实例中,所述寄存器文件XR能够以许多不同的方式存取。
“xeven”可以用于存取任何偶数寄存器。“xhigh”可以用于存取所述寄存器文件的上半部。“xfirst”可以用于存取前两个寄存器之一。
“xbanked”可以用于存取XR寄存器的四簇中由所述状态BANK指定的任何一簇中的寄存器。“xtracked”可以用于存取所述16个寄存器中的任何一个,但是具有副作用——在所述状态COUNT中保存它被使用的次数。对于一般寄存器操作数,实施硬件的过程概述如下-为每个操作数创建一个模块-为所述操作数所用的所述指令字段创建一个输入-为所述操作数语义所用的每种状态创建一个输入-为所述操作数语义所用的每个接口信号创建一个输入-为每个操作数创建一个输出-为所述操作数语义定义的每种状态创建一个输出-为所述操作数语义定义的每种接口信号创建一个输出-为所述操作数语义定义的每种异常信号创建一个输出-把所述操作数语义复制到所述模块例如,以下操作数描述operand ars s AR{wire[3:0]wb1=WindowBase+1;wire[3:0]wb2=WindowBase+2;wire[3:0]wb3=WindowBase+3;assign WindowOverflow4=(s[3:2]!=2'b00) (((PSWOE&&!PSEXCM))&&(WindowStart[wb1])):0;assign WindowOverflow8=(s[3]==1'b1) (((PSWOE&&!PSEXCM))&&(WindowStart[wb2])):0;assign WindowOverflow12=(s[3:2]!=2'b11) (((PSWOE&&!PSEXCM))&&(WindowStart[wb3])):0;assign ars=s+{WindowBase,2'b00};}将用下列语句产生verilog模块--------------------input s /*operand field*/input WindowStart/*used state*/input WindowBase /*used state*/input PSWOE /*used state*/input PSEXCM /*used state*/output WindowOverflow4 /*exception*/output WindowOverflow8 /*exception*/output WindowOverflow12 /*exception*/output ars/*operand output*/----------------------在现有的处理器产生系统中,寄存器操作数必须定义为指令字段的函数。本发明允许寄存器操作数的所述定义独立于任何指令字段。不依赖于任何指令字段的操作数称为“隐含”操作数。本发明向所述TIE语言增加了以下构造以吸收所述隐含操作数。
句法implicit-operand-defimplicit-operand operand-name regfile-name{computation}implicit-operand关键字operand-name唯一的操作数名称regfile-name过去定义的寄存器文件名称computation操作数语义逻辑其中operand-name是要定义之操作数的唯一名称。regfile-name是与这个操作数相关联的过去定义之寄存器文件的名称。computation是任何逻辑描述并最终对操作数名称赋值。
考虑定义隐含操作数以存取寄存器文件的以下实例------------------state INDEX 4regfile XR 32 16 ximplicit_operand x0 XR{assign x0=0;}implicit_operand xr XR{assign xr=INDEX;}--------------------这个实例定义了两个隐含操作数。“x0”可以用于存取所述寄存器文件XR中的第一个寄存器。“xr”可以用于存取所述状态INDEX指定号码的任何寄存器。这两个操作数都是隐含的,因为它们不依赖于任何指令字段。所述隐含操作数的所述RTL实施方案非常类似于所述一般操作数的实施方案,只是省略了输入到所述操作数模块的所述字段,因为隐含操作数不依赖于任何指令字段。
在现有的处理器产生系统中,TIE指令不能引起异常。例如,不可能定义一条执行除法的TIE指令,如果除数为零时引起被零除异常。同样,当地址未对齐时一条TIE加载指令也不可能引起未对齐加载异常。本发明增加了这种新的能力。定义一个异常的过程具有两个步骤定义一个异常以及指定要引起所述异常的条件。它们在以下介绍。
处理器异常可以使用所述TIE异常构造来定义。一个异常具有若干语义,它们是提取所述异常时要求值的逻辑。一个异常可以由指令在其语义逻辑或操作数逻辑中引起。一个异常也可以作为对另一个异常的语义进行求值的结果而引起。异常具有优先级。如果一条指令引起了几个异常,所述处理器将提取优先级最高的一个。
句法exception-defexception name{higher-priority-list}{computation}exception关键字name唯一的异常名称higher-priority-list具有更高优先级之异常名称的列表computation提取这个异常时要做的异常逻辑其中name是所述异常的唯一名称。higher-priority-list是具有更高优先级之异常名称的一个列表。如果一个异常的优先级比所述列表中至少一个其他异常高,它也不一定处于所述列表中。例如,假若异常A的优先级比异常B高,而异常B的优先级又比异常C高,那么仅仅把B放入C的higher-priority-list就够了。“computation”指定了提取所述异常时要求值的逻辑。它可以读取处理器状态和接口信号,以及对处理器状态和接口信号赋值。另外,它也可以在一定的条件下引起另一个异常。所述异常语义逻辑必须包含对处理器接口信号“ExceptionVector”的赋值。它可以可选地对处理器状态EXCCAUSE赋一定的值,作为向异常应对装置传递某些信息的一种方式,以便说明所述异常的原因。
考虑为一条加指令定义溢出异常的实例------------------exception add_overflow{WindowOverflow4,WindowOverflow8,WindowOverflow12}{assign ExceptionVector=32'h40000810;}------------------这个实例定义了一个新的异常“add_overflow”。它的优先级比WindowOverflow4、WindowOverflow8和WindowOverflow12低。提取这个异常时,所述处理器将跳至位置32’h40000810,它应当加载着这个异常的应对装置。
为了允许一条指令有条件地引起一个异常,所述TIE的iclass构造已经被扩展至具有附加的从句,以便指定异常名称的列表。利用所述iclass定义,所述指令语义可以对所述异常名称赋值。所述iclass中异常的列表界定了所述iclass中的操作码能够引起的所述异常。例如,假若一条加指令能够引起前一节中定义的溢出异常,其iclass可以是--------------iclas add{ADD}{out arr,in ars,in art}{}{}{out add_overflow}------------------利用这种iclass定义,在所述加期间发生溢出时,所述语义逻辑可以把“add_overflow”赋值1。---------------reference ADD{wire[31:0]tmp=ars+art;assign arr=tmp;wire ss=ars[31];wire st=art[31];wire sr=tmp[31];assign add_overflow=~ss&~st&sr|ss&st&~sr;}--------------在操作数语义中引起一个异常被本发明允许,而且能够由赋予所述异常一个逻辑表达式而指定。当所述表达式的值为1时,以及所述异常包括在所述操作码的所述iclass的异常表中时,就引起了所述异常。例如-----------------regfile XR 32 16 xoperand xr x XR{assign xr=r;assign last_exception=r==4'b1111;}-----------------当一条指令试图存取所述寄存器文件中最后的入口时就引起了所述“last_exception”。
由指令或操作数语义引起的异常称为主异常。由另一个异常引起的异常称为次异常。在异常语义中引起次异常也是本发明允许的,而且能够由由赋予所述异常一个逻辑表达式而指定。当所述表达式的值为1时,就引起了所述异常。例如-----------------exception exc_s{}{assign ExceptionVector=...}exception exc_p{}{assign ExceptionVector=...assign exc_s=COND==4'b1011;}------------------当一条指令引起异常“exc_p”时,如果状态“COND”具有数值“4’b1011”,它将引起异常“exc_s”。
此处介绍的实例实施方案应对了主次异常。不过,所述方法是一般的,而且应对任何固定深度的异常嵌套。对于本领域的技术人员,从所述实例实施方案进行扩展完全是顺理成章和显而易见的。
当引起了多个主异常时,则选择优先级最高的一个。然后,对该异常的语义求值。如果所述语义引起了一个或多个次异常,就提取所述次异常中优先级最高的一个。在没有次异常时,就提取所选定的主异常。图19显示了实施所述异常逻辑的一种方式。界定器1块从所有指令语义块和操作数语义块接受异常信号。它使用来自解码器的解码信号,根据所述异常是否处于当前指令引起的异常列表中,选择性地关断所述异常。界定之后,所述逻辑产生一个TIE_Exception信号,送到外部逻辑。所述外部逻辑也向所述异常产生逻辑发送外部异常信号的列表。然后,结合的异常信号送入优先级逻辑块,使得除了优先级最高的信号以外,其他的信号全部关断。在所述优先级逻辑之后,活化的异常就不多于一个。与所述主异常信号优先级选择相并行的是在所述异常语义块中产生次异常信号的逻辑。次异常信号与优先级选择后的主异常信号一起送入次优先级逻辑块。在这个块中,与当前活化的主信号不相关联的任何次异常信号都被关断。剩余的次信号进行优先级选择,除了优先级最高的一个以外,其他的信号全部关断。最后,如果活化的主信号的次异常中有活化的,就把活化的主信号关断。在次优先级逻辑之后,所述异常信号用于选择所述异常语义产生的状态和接口信号。仅仅选择所述活化的异常对应者。所述异常语义定义的所述接口信号之一就是所述异常向量。如果一个异常发生时,这个异常就被选为下一个PC。
如上所述,本发明的另一个方面是增加了一定的内建模块。在这方面应当注意,某些常用的计算没有语言定义的运算符。不过,使用其他语言构造或者描述非常冗长乏味,或者实施中非常难以高效。TIE提供了一组常用的运算符,作为内建模块,其调用方式类似于函数调用。以下是所有内建模块公用的规则每个内建模块都具有其自身的计算宽度定义。所述定义不受环境需求宽度的影响。对所述内建模块的输入没有需求宽度。在输入的位数不满足所述内建模块需要的情况下,将以0补足。
以下内建模块的描述根据本发明的一个优选实施例。
TIEadd提要sum=TIEadd(a,b,cin)定义sum=a+b+cin说明带有进位的加法。如果所述TIEadd不具有三个变元,而且最后一个变元的计算宽度不是1,就会出错。如果a和b的计算宽度不同,较窄的输入就在其计算宽度求值然后以0补足。
TIEaddn提要sum=TIEaddn(A0,A1,...,An-1)定义sum=A0+A1+...+An-1说明N个数的加法。所述内建模块必须有至少三个变元。如果这些输入的计算宽度不同,较窄的输入就在其计算宽度求值然后以0补足。使用所述TIEaddn内建模块的优点在于,基本的RTL实施方案将比简单地使用+运算符在计时和面积方面效率高得多。
TIEcsa提要{carry,sum}=TIEcsa(a,b,c)定义carry=a&b|a&c|b&csum=a^b^c说明进位存储加法器。TIEcsa必须有刚好三个变元。如果这些输入的计算宽度不同,较窄的输入就在其计算宽度求值然后以0补足。TIEcsa的计算宽度是输入宽度的两倍。结果的低位一半表示求和位,高位一半表示进位。为了把求和与进位相加,进位必须左移一位。提供了这个模块,就能够高效地实施加或减几个数,由一系列csa简化和随后的单一加法器来完成。
TIEcmp提要{lt,le,eq,ge,gt}=TIEcmp(a,b,signed)
定义{lt,le,eq,ge,gt}={a<b,a<=b,a==b,a>=b,a>b}说明有符号和无符号比较。如果所述TIEcmp不具有三个变元,而且最后一个变元的计算宽度不是1,就会出错。如果a和b的计算宽度不同,较窄的输入就在其计算宽度求值然后以0补足。如果输入signed为真,所述比较就是对于有符号数据。否则所述比较就是对于无符号数据。
TIEmac提要o=TIEmac(a,b,c,signed,negate)定义o=negate?c-a*bc+a*b说明乘累加。如果signed为真,所述乘法就是有符号的,否则就是无符号的。如果negate为真,所述乘法结果就从累加器c减去,否则加入累加器c。如果所述乘法的计算宽度小于所述累加器的宽度,若signed为真所述乘法结果就进行有符号扩展,否则进行0扩展。signed和negate的计算宽度必须为1。为了避免减慢Xtensa的时钟频率,使用TIEmac的任何指令都应当分配至少两个周期。然而通过仔细地选择指令安排,有可能实现每个周期一项TIEmac操作的吞吐量。
TIEmul提要prod=TIEmul(a,b,signed)定义prod=a*b说明相乘。如果signed为真,所述乘法就是有符号的,否则就是无符号的。signed的计算宽度必须为1。为了避免减慢Xtensa的时钟频率,使用TIEmul的任何指令都应当分配至少两个周期。
TIEmulpp提要{p0,p1}=TIEmulpp(a,b,signed,negate)定义p0+p1=negate?-a*ba*b说明部分积相乘。这个模块返回所述乘法的两个部分积。如果signed为真,所述乘法就是有符号的,否则就是无符号的。这两个部分积的和等于乘积。如果negate为真,所述和等于所述乘积的相反数。所述定义没有给出各个部分积的确切意义。signed和negate的计算宽度必须为1。提供了这个模块,就能够高效地实施包括乘、加和减的某些代数表达式。
TIEmux提要o=TIEmux(s,D0,D1,...,Dn-1)定义o=s==0?D0s==1?D1...s==n-2?Dn-2Dn-1说明n路多路复用器。这个模块按照选择信号的数值,返回n个数据之一。数据的数目n必须是2的幂。所述选择信号的宽度必须是log2(n)。
TIEpsel提要o=TIEpsel(S0,D0,S1,D1,...,Sn-1,Dn-1)定义o=S0?D0S1?D1...Sn-1Dn-10说明n路优先级选择器。这个模块按照选择信号的数值和优先级,选择n个输入数据之一。第一个选择信号具有最高的优先级,最后一个具有最低的优先级。如果没有选择信号活化,结果为0。选择信号的宽度必须是1。
TIEsel提要o=TIEsel(S0,D0,S1,D1,...,Sn-1,Dn-1)定义o=S0?D0S1?D1...Sn-1Dn-10说明n路1-hot选择器。这个模块按照选择信号的数值,选择n个输入数据之一。期望所述选择信号为1-hot。如果没有选择信号活化,结果为0。如果活化的选择信号多于1个,结果不定。选择信号的宽度必须是1。
虽然已经参考其若干优选实施例,具体地介绍了本发明,但是对本领域的技术人员应当非常明显,在不脱离本发明实质和范围的情况下,在形式和细节上可以作出若干改变和修改。例如,本领域的技术人员将会理解,在以上流程图中展示的处理步骤的数目和次序可以作出改变。附带的权利要求书意在包括此类改变和修改。
权利要求书(按照条约第19条的修改)1.一种向微处理器增加高级指令扩展指令的方法,包括除了微处理器中的内核指令以外,还实现对由对应的逻辑执行的VLIW指令的描述,所述描述包括VLIW指令的可配置的特征。
2.根据权利要求1的方法,其中所述可配置的特征包括指令长度。
3.根据权利要求1的方法,其中所述可配置的特征包括指令格式。
4.根据权利要求1的方法,其中所述可配置的特征包括每条指令的操作时隙数目。
5.根据权利要求1的方法,其中所述可配置的特征包括若干指令字段。
6.根据权利要求1的方法,其中所述可配置的特征包括若干指令操作码。
7.根据权利要求1的方法,其中所述可配置的特征包括若干指令操作。
8.一种向微处理器增加高级指令扩展指令的方法,包括实现对由与微处理器中内核指令共享的对应逻辑执行的加载/存储指令的描述,所述共享的对应逻辑包括加载/存储单元接口,它连同所述加载/存储指令,自动地进行可配置的字操作。
9.根据权利要求8的方法,其中所述可配置的字操作包括加载/存储字节禁用。
10.根据权利要求8的方法,其中所述可配置的字操作包括回转量。
11.根据权利要求8的方法,其中所述可配置的字操作包括符号扩展。
12.根据权利要求8的方法,其中所述可配置的字操作包括条件加载/存储。
13.一种向微处理器增加高级指令扩展指令的方法,包括实现对由微处理器中对应逻辑执行的可配置函数的识别,其中所述对应逻辑由与所述微处理器执行的多条不同指令共享。
14.一种向微处理器增加高级指令扩展指令的方法,包括实现对由微处理器中对应逻辑执行的可配置函数的识别,其中所述对应逻辑由单一指令迭代地使用。
15.一种向微处理器增加高级指令扩展指令的方法,包括实现对可配置的操作数寄存器接口的描述,以便灵活地指定由微处理器执行的指令所引用的操作数寄存器,所述可配置的操作数寄存器接口包括多个读/写宽度。
16.一种向微处理器增加高级指令扩展指令的方法,包括实现对可配置的操作数寄存器接口的描述,以便灵活地指定由微处理器执行的指令所引用的操作数寄存器,所述可配置的操作数寄存器接口包括把若干操作数手工绑定到寄存器文件端口。
17.一种向微处理器增加高级指令扩展指令的方法,包括实现对可配置的操作数寄存器接口的描述,以便灵活地指定由微处理器执行的指令所引用的操作数寄存器,所述可配置的操作数寄存器接口包括产生寄存器号的寄存器文件操作数语义。
18.一种向微处理器增加高级指令扩展指令的方法,包括实现对可配置的操作数寄存器接口的描述,以便灵活地指定由微处理器执行的指令所引用的操作数寄存器,所述可配置的操作数寄存器接口包括隐含的寄存器文件操作数。
19.一种向微处理器增加高级指令扩展指令的方法,包括实现对在微处理器中由对应的扩展逻辑执行指令期间所引起的若干异常的描述。
20.根据权利要求19的方法,其中所述描述包括异常定义。
21.根据权利要求19的方法,其中所述描述包括指令语义。
22.根据权利要求19的方法,其中所述描述包括操作数语义。
23.根据权利要求19的方法,其中所述描述包括异常语义。
24.根据权利要求19的方法,其中所述描述包括对解决多个异常的支持。
25.一种向微处理器增加高级指令扩展指令的方法,包括实现对由微处理器中对应的硬件逻辑执行的指令的描述,其中所述描述包括内建模块定义,它是所述处理器扩展语言的一部分,所述模块定义是以下模块之一带进位加模块、N个数字加模块、进位存储加法器模块、有符号和无符号比较模块、乘累加模块、有符号和无符号相乘模块、部分积相乘模块、n路多路复用器模块、n路优先级选择器模块以及n路1-hot选择器模块。
26.根据权利要求1的方法,进一步包括除所述内核指令以外,还实现对非VLIW指令的描述,所述非VLIW指令能够被所述微处理器独立地执行,所述非VLIW指令进一步能够被包括为所述VLIW指令之一的一部分。
27.一种向微处理器增加高级指令扩展指令的方法,包括实现对由多个加载/存储单元执行的加载/存储指令的描述。
28.根据权利要求27的方法,进一步包括实现将某些加载/存储指令与所述加载/存储单元中特定的一个相关联。
29.根据权利要求27的方法,进一步包括实现对某些加载/存储指令的标识,所述加载/存储指令可以被自动地映射到所述加载/存储单元中可用的单元。
权利要求
1.一种处理器扩展语言,除了微处理器中的内核指令以外,还实现对由对应的逻辑执行的VLIW指令的描述,所述描述包括VLIW指令的可配置的特征。
2.根据权利要求1的处理器扩展语言,其中所述可配置的特征包括指令长度。
3.根据权利要求1的处理器扩展语言,其中所述可配置的特征包括指令格式。
4.根据权利要求1的处理器扩展语言,其中所述可配置的特征包括每条指令的操作时隙数目。
5.根据权利要求1的处理器扩展语言,其中所述可配置的特征包括若干指令字段。
6.根据权利要求1的处理器扩展语言,其中所述可配置的特征包括若干指令操作码。
7.根据权利要求1的处理器扩展语言,其中所述可配置的特征包括若干指令操作。
8.一种处理器扩展语言,实现对由与微处理器中内核指令共享的对应逻辑执行的加载/存储指令的描述,所述共享的对应逻辑包括加载/存储单元接口,它连同所述加载/存储指令,自动地进行可配置的字操作。
9.根据权利要求8的处理器扩展语言,其中所述可配置的字操作包括加载/存储字节禁用。
10.根据权利要求8的处理器扩展语言,其中所述可配置的字操作包括回转量。
11.根据权利要求8的处理器扩展语言,其中所述可配置的字操作包括符号扩展。
12.根据权利要求8的处理器扩展语言,其中所述可配置的字操作包括条件加载/存储。
13.一种处理器扩展语言,实现对由微处理器中对应逻辑执行的可配置函数的识别,其中所述对应逻辑由与所述微处理器执行的多条不同指令共享。
14.一种处理器扩展语言,实现对由微处理器中对应逻辑执行的可配置函数的识别,其中所述对应逻辑由单一指令迭代地使用。
15.一种处理器扩展语言,实现对可配置的操作数寄存器接口的描述,以便灵活地指定由微处理器执行的指令所引用的操作数寄存器,所述可配置的操作数寄存器接口包括多个读/写宽度。
16.一种处理器扩展语言,实现对可配置的操作数寄存器接口的描述,以便灵活地指定由微处理器执行的指令所引用的操作数寄存器,所述可配置的操作数寄存器接口包括把若干操作数手工绑定到寄存器文件的若干端口。
17.一种处理器扩展语言,实现对可配置的操作数寄存器接口的描述,以便灵活地指定由微处理器执行的指令所引用的操作数寄存器,所述可配置的操作数寄存器接口包括产生寄存器号的寄存器文件操作数语义。
18.一种处理器扩展语言,实现对可配置的操作数寄存器接口的描述,以便灵活地指定由微处理器执行的指令所引用的操作数寄存器,所述可配置的操作数寄存器接口包括隐含的寄存器文件操作数。
19.一种处理器扩展语言,实现对在微处理器中由对应的扩展逻辑执行指令期间所引起的若干异常的描述。
20.根据权利要求19的处理器扩展语言,其中所述描述包括异常定义。
21.根据权利要求19的处理器扩展语言,其中所述描述包括指令语义。
22.根据权利要求19的处理器扩展语言,其中所述描述包括操作数语义。
23.根据权利要求19的处理器扩展语言,其中所述描述包括异常语义。
24.根据权利要求19的处理器扩展语言,其中所述描述包括对解决多个异常的支持。
25.一种处理器扩展语言,实现对由微处理器中对应的硬件逻辑执行的指令的描述,其中所述描述包括内建模块定义,它是所述处理器扩展语言的一部分,所述模块定义是以下模块之一带进位加模块、N个数字加模块、进位存储加法器模块、有符号和无符号比较模块、乘累加模块、有符号和无符号相乘模块、部分积相乘模块、n路多路复用器模块、n路优先级选择器模块以及n路1-hot选择器模块。
26.根据权利要求1的处理器扩展语言,进一步包括除所述内核指令以外,还实现对非VLIW指令的描述,所述非VLIW指令能够被所述微处理器独立地执行,所述非VLIW指令进一步能够被包括为所述VLIW指令之一的一部分。
27.一种处理器扩展语言,实现对由多个加载/存储单元执行的加载/存储指令的描述。
28.根据权利要求27的处理器扩展语言,进一步包括实现将某些加载/存储指令与所述加载/存储单元中特定的一个相关联。
29.根据权利要求27的处理器扩展语言,进一步包括实现对某些加载/存储指令的标识,所述加载/存储指令可以被自动地映射到所述加载/存储单元中可用的单元。
全文摘要
一种向微处理器增加高级指令所用的系统包括正式地吸收所述新指令的语言,以及为所述扩展的处理器产生硬件实施方案和软件工具的方法。所述扩展语言提供了新的VLIW指令、复杂的加载/存储指令、使用函数的更强有力的描述风格、更强有力的寄存器操作码以及新的内建模块组。所述方法能够为所述新指令产生全流水线的微架构实施方案,形式为标准的CAD工具能够处理的可合成的HDL描述。所述方法也能够为具有新指令的所述微处理器产生软件组件,以便扩展软件开发工具。
文档编号G06F9/312GK1886744SQ03813871
公开日2006年12月27日 申请日期2003年4月14日 优先权日2002年5月13日
发明者汪人瑞, 厄尔·A·基利安, 里卡多·E·冈萨雷斯, 罗博特·P·威尔森 申请人:坦斯利卡公司