发明内容
根据本发明的第一方面,提供一种用于生成针对要由可编程处理器处理的指令的子集的各个指令精简方案的方法,其包括以下步骤:
a)接收代表要在可编程处理器上执行的软件的至少一个输入代码样本,所述输入代码包括用于定义第一指令集的多个指令,
b)将被移除指令集初始化为空,
c)确定第一指令集的最精简表示,
d)将最精简表示的大小与阈值进行比较,
e)如果所述大小大于阈值则执行步骤e1至e3,
e1)确定第一指令集的哪个指令具有最高的编码成本,
e2)从第一指令集中移除具有最高编码成本的指令,以及
e3)将所述指令添加到被移除指令集中,
f)重复步骤b-f,其中第一指令集由被移除指令集形成。
与公知方法相反的是,根据所述第一方面的该方法是通常可应用的。该方法有效地将具有大的互对应性的指令分组到公共群中。选择具有高编码成本的偏离指令(deviating instruction)来形成分离的群。该过程可以重复。
对于一些指令,最精简表示可能是原始(未精简)表示。这里使用的原始表示也将被称为“全视图”。
指令精简方案的数量以及针对每个指令精简方案的需求压缩可以是固定的。可替换地,可以通过计算考虑多个指令中不同指令的数量以及用于指示最小需求压缩因子的阈值来自动地确定指令精简方案的数量和每个指令精简方案的压缩。在一个实施例中,请求用户指定指令精简方案的数量以及每个指令精简方案的压缩,以便用户能够控制精简过程并试验哪个规范提供最好的结果。
在所述方法的实施例中,所述指令包括被单独精简的多个指令字段。通过精简单独的指令字段,与将指令作为整体进行精简的情况相比能够获得更高的压缩。如果两个指令在特定的指令字段中具有相同的值但以其他方式不同,则那个指令字段的值可以由公共代码精简,但是将指令作为整体的精简将需要不同的代码。关于指令字段的知识优选从处理器描述文件中获得。精简方案可以对应于可编程处理器的某个视图。处理器视图被定义为硅蜂窝(silicon hive)编译器的目标,在该编译器中仅处理器资源的子集才是可用的。关于处理器资源的知识从处理器描述文件中获得。
在所述实施例的变形中,被单独精简的指令字段至少包括操作码、用于指示写端口索引的字段以及用于指示读端口索引的字段。精简这些字段产生高的代码大小降低。另外,下面的字段也可以被单独精简:用于指示结果端口(总线)的字段、用于指示写端口选择的字段以及包括立即值的字段。
在一个实施例中,针对不同子集的指令精简方案具有互不相同的码字宽度,其中这些子集中的至少其中一个子集具有最小码字宽度。在子集被允许具有互不相同的大小的情况中,一些子集可以通过使用更小的码字进行精简,从而节省编码空间。一些子集可以具有互不相同的精简方案,但是可以由具有互相相同大小的码字进行编码。
在一个实施例中,针对每个子集的精简方案的码字的大小是大于或等于1的整数乘以最小码字宽度。通过该措施简化了指令的读取。部分指令可以不被精简。这些指令的长度可以等于从其中获取被精简或未被精简的指令的指令存储器的宽度,但是可以可替换地更小。优选地,指令不大于指令存储器的宽度以保持短的指令获取时间。
在一个实施例中,互不相同的子集以互不相同的方式进行精简。例如,根据第一视图而被精简的指令可以使用采用编译时间可编程寄存器的查找表解精简(扩展),而根据第二视图而被精简的指令可以使用采用硬连线查找表的查找表。如果子集中的至少一个子集被精简为可变长度代码,则是有利的。通过将可变长度代码(VLC)仅应用于指令的子集,一方面,优点在于能够在那个子集中获得高的指令压缩因子,而另一方面,能够保持适中的代码数量,从而该子集中的代码能够被容易地解精简(被扩展)。精简方案的唯一约束是同一视图中的精简后指令具有小于或等于特定最大长度的大小。因此,长度小于或等于“视图”长度的VLC精简后指令将适合于该视图。
根据本发明的第二方面,根据第一方面的方法进一步包括以下步骤:
-接收包括多个指令的程序,
-对于每个指令,确定如步骤a-f所确定的相应的指令精简方案,
-根据所述指令精简方案来压缩指令,
-提供精简后指令。
以此方式,被精简的程序可以与用于定义指令精简方案集的程序相同。
精简后指令可以存储在特定地址范围中,从而能够根据指令地址而清楚地知道使用什么类型的精简方案。
在一个实施例中,根据第二方面的方法进一步包括将精简后指令与用于指示使用的精简方案类型的至少一个指示符一起提供的步骤。这使得能够将精简后指令存储在与用于促成处理的原始程序相同的序列中。另外,精简后指令不需要被对准。
在一个实施例中,精简后指令存储在包括多个分段的字中,而且每个分段至少包括用于指示所述分段是否是精简后指令的第一分段的指示符。
在另一实施例中,精简后指令存储在包括多个分段的字中,其中每个精简后指令包括位于精简后指令内的预定位置处的指示符,所述指示符用于指示下一精简后指令的视图。其优点在于,即使根据不同视图的指令具有不同的大小,用于对精简后指令进行解精简的指令扩展器仍然能够准确和及时地预获取精简后指令的下一码字。
根据本发明的第三方面,提供一种被适当编程以执行根据第一方面或第二方面的方法的装置。
根据本发明的第四方面,提供一种包括程序的记录载体,所述程序促使装置执行根据第一方面或第二方面的方法。
根据本发明的第五方面,提供一种可编程处理器,其包括:
-程序存储器,该程序存储器包括被存储为精简后指令数据的指令序列,精简后指令数据至少包括根据第一精简方案而被精简为具有N个存储器字分段的第一码字的第一指令,以及根据第二精简方案而被精简为具有M个存储器字分段的第二码字的第二指令,
-指令解码器,
-至少一个寄存器文件,
-耦合到所述寄存器文件的至少一个发布槽(issue slot),
-指令扩展器,包括:
-精简方案识别器,用于识别针对从程序存储器中获取的精简后指令数据的指令精简方案,
-输入,用于接收程序计数器,
-存储设备,用于临时存储至少一段程序存储器字,
-选择设备,用于从程序存储器和存储设备中选择精简后指令数据,
-指令扩展单元,用于将所选择的精简后指令扩展成大小为K的扩展后指令,
-控制设备,用于响应于程序计数器来生成程序存储器的地址,并用于控制选择设备,
其中K、N、M是大于或等于1的整数,整数N、M不大于K,并且其中N、M中的至少一者小于K。
本发明的第一至第五方面是可以进一步包括设计和测试设备的环境的一部分。
具体实施方式
在下面的详细描述中,阐述了多个具体细节以提供对本发明的透彻理解。然而,本领域技术人员将理解,可以在没有这些具体细节的情况下实践本发明。在其他实例中,没有详细描述公知的方法、过程和部件,以便不模糊本发明的各个方面。
下文中,将参照示出了本发明的实施例的附图来更充分地描述本发明。然而,本发明可以被体现为许多不同的形式,并且不应当被解释为局限于本文阐述的实施例。相反地,提供这些实施例,以使得本公开将透彻和完整以及将向本领域技术人员充分地传达本发明的范围。应当理解,当提及一个元件“连接”或“耦合”到另一元件时,该元件能够直接连接或耦合到其他元件,或者可以存在中间元件。相对地,当提及一个元件“直接连接到”或“直接耦合到”另一元件时,不存在中间元件。通篇中,类似的标号指代类似的元件。如本文使用的,术语“和/或”包括被关联列出的项中的一个或多个的项的任意和所有组合。
应当理解,虽然术语“第一”、“第二”、“第三”等在本文中可以用于描述各种元件、部件和/或部分,但是这些元件、部件和/或部分不应当受到这些术语的限制。这些术语仅用于将一个元件、部件或部分与另一元件、部件和/或部分相区分。因此,下面讨论的第一元件、部件和/或部分能够用第二元件、部件和/或部分来表述,但是并不背离本发明的教导。
除非另有定义,否则本文使用的所有术语(包括技术和科技术语)都具有与本发明所属技术领域中的普通技术人员所通常理解的相同的意义。还应当理解,诸如在普通使用的字典中所定义的那些术语之类的术语应当被解释为具有与它们在相关领域的上下文中所具有的意义相一致的意义,并且不应当以理想或过于正式的意义进行解释,除非在本文中明确地如此定义。本文提到的所有出版物、专利申请、专利和其他参考都通过引用而被全部合并到本文。万一冲突,包括定义的本说明书将进行控制。另外,材料、方法和示例仅是说明性的,而且并非意欲进行限制。
图1示意性地示出了可编程处理器。在图1所示的示例中,可编程处理器是VLIW处理器。VLIW处理器并行地处理被分组成VLIW指令字的多个指令字。这些通常由软件开发工具来产生。图1所示的VLIW处理器包括程序存储器10和耦合到程序存储器的指令解码器20。程序存储器10包含VLIW指令字。VLIW处理器还包括经由第一选择元件30a,...,30m耦合到多个总线70的多个寄存器文件40a,...,40n。寄存器文件具有一个或多个输入端口和一个或多个输出端口。寄存器端口由数据输入或输出和地址输入构成。
清楚起见,图1仅示出了单个发布槽50。实际上,VLIW处理器将具有多个发布槽。多个发布槽中的每个发布槽处理来自VLIW指令字的特定的指令字。发布槽包括能够对输入数据执行有限操作集的一个或多个功能单元。发布槽50具有指令解码器51和多个功能单元FU 53a,...,53k,例如乘法器、加法器、移位器等。发布槽50还具有第二选择元件52a,....,52k,用于选择来自各种源(例如寄存器文件)的输入数据和来自解码器20的用于提供立即值的输出。功能单元53a,...,53k和第二选择元件52a,...,52k的操作由操作解码器51控制。处理器还包括多个第三选择元件60a,...,60k,用于选择性地将功能单元53a,...,53k耦合到总线70。
指令通常包括多个指令字段。每个字段控制可编程处理器的数据路径的具体项。在该特别示例中,指令可以包括下面的用于操作码、结果端口选择的选择(bus_select)、写端口的选择(wp_select)、写端口的索引的规范(wp_index)、读端口的索引的选择(rp_index)和立即的规范等6种指令字段。
通常,每个发布槽具有一个操作码指令字段。该字段选择要由发布槽执行哪个操作。该操作由发布槽的其中一个功能单元执行。操作码被解码成功能单元选择信号和操作类型(optype),以激活特定的FU和那个FU的特定操作。在一些情况中,操作码可以不存在,例如如果发布槽专用于处理仅一个操作,例如加载立即值。
具有不止一个发布槽输出的每个总线具有单独的用于指示哪个发布槽输出被连接到总线的bus_select字段。
每个寄存器文件输入端口连接到一个或多个总线。如果存在连接到一个写端口的不止一个总线,则多路复用器选择到寄存器文件的输入端口的正确的总线。写端口选择(wp_sel)指令字段包含用于该多路复用器的选择值。专门的代码wp_sel=“11..11”用于指示在写端口上不应当发生写动作。
该指令字段包含被写入寄存器文件的寄存器地址。每个寄存器写端口都具有单独的wp_index。
该指令字段包含从寄存器文件读取的寄存器地址。每个寄存器读端口都具有单独的rp_index。
立即指令字段包含能够被用作发布槽中的其中一个功能单元的输入的值。
并非根据本发明的、被称为立即覆盖(immediate overlaying)的代码精简方式依赖于这样的事实,即发布槽中的功能单元的输入可以使用寄存器文件输出或立即字段作为输入。optype确定输入是什么,而且对于每个指令而言这可以不同。如果操作码指示寄存器文件输出被用于操作,则发布槽的立即字段是冗余的。因此,如果立即值被选择作为输入,则针对连接到发布槽的输入的寄存器输出端口的寄存器索引字段是冗余的。由于该立即字段和该寄存器索引字段从来不在同一指令中使用,所以两个字段可以组合。立即和寄存器索引字段(的一部分)的组合将被称为立即覆盖。
代码精简的另一方式利用不同视图的使用。处理器视图被定义为编译器的目标,在该编译器中仅处理器资源的子集才是可用的。子集可通过以下约束来定义:
-寄存器文件属性:输入/输出端口的数量、地址范围
-功能单元属性:立即范围、操作码的数量
-总线的数量
-完整的发布槽、功能单元、寄存器文件,...等。
就代码精简而言,如果用于控制子集的指令比特的数量明显小于用于完整处理器的指令比特的数量,则处理器视图是有用的。处理器能够具有不止一个视图。
用于支持视图机制的硬件如图2所示。在第一视图(视图0)中,所有的处理器资源都是可用的。程序存储器字包括单个指令。在第二视图(视图1)中,每个程序存储器字包括2个精简后指令。在第三视图(视图2)中,每个程序存储器字包括4个精简后指令,如图3所示意性示出的那样。
注意,全视图并非必须等于程序存储器宽度。有时,选择更宽的程序存储器以使得更小视图能够更好的压缩是有意义的。例如,假设处理器具有60比特的全宽,而且最小视图具有16比特的宽度。通过采取60的程序存储器宽度,最小视图具有60/16=3.75的压缩。这必须被四舍五入成2的一次幂,这导致压缩因子2。如果程序存储器的宽度等于64,则压缩变为因子4。
在图3中,针对视图0的指令以常规方式放置,从而从地址0开始。对于视图0指令,PC等于程序存储器地址。针对视图1的指令从程序存储器地址0x1B开始。针对视图1的第一指令的程序计数器由具有值0的一个LSB(表明程序存储器字0x1B的下半区包含指令)、具有值“01”的两个MSB(表明该指令是视图1指令)以及接着等于程序存储器地址0x1B的中间比特形成。对于PC而言,结果是0x1036。随后指令的PC值能够通过递增该PC而找到。从地址0x2A开始,针对视图2的指令被布置。针对第一视图2指令的PC值由具有值“00”的2个lsb(用于从所述字中的4个精简后指令中选出存储器地址为“0x2A”的第一个精简后指令)和具有值2的2个MSB(表示视图号)形成。结果是0x2150。
如图2所示,用于支持视图机制的硬件包括第一精简后指令选择器22和第二精简后指令选择器23、第一指令解精简单元24和第二指令解精简单元25和全指令选择器26。当运行程序时,处理器指示将用它的程序计数器(PC)12来执行指令。程序计数器12的输出具有第一部分12a、第二部分12b和第三部分12c,其中第一部分12a用于控制第一指令解精简单元24和第二指令解精简单元25,第二部分12b用于处理所需的程序存储器字,以及第三部分12c用于控制全指令选择器26。部分12c指示视图选择。在全视图模式中,PC等于程序存储器地址。针对全视图(视图0)的程序存储器字确切地包含一个全指令。全指令选择器26仅将该指令传递给指令解码器20。
在“精简后视图”模式中,PC不能直接被映射到程序存储器地址。在那种情况中,PC的部分12a指示程序存储器字中的哪个指令需要被选择。如果由部分12b中的地址所指示的程序存储器字被读取,则由被程序计数器的部分12a所控制的第一精简后指令选择器22和第二精简后指令选择器23所选择的精简后指令在指令解精简单元24和25中被提取。
指令解精简单元24、25将精简指令转换成全指令。
对于每个被实施的精简方案而言,对应于处理器的特定视图来实施指令解精简器24、25。解精简器24、25的输出是全指令选择器26的输入。PC的部分12c(view_select)确定全指令选择器26的哪些输入被选择作为指令选择器26的输出。
在参照图2和图3所描述的代码精简方法中,编程器定义需要在哪个视图中运行哪个代码。基本构件块的所有指令应当以一个视图为目标。视图的切换仅能够通过跳转操作(jump operation)的方式来实现。这仅通过跳转指令来实现。在指令选择和调度之后,汇编器定义精简后指令并确定多个精简后指令如何被放置在一个程序存储器字中。链接器定义每个被构建的字的程序存储器地址。通常,针对一个视图的指令被分组在一起。一个组的第一指令总是从程序存储器字的比特0开始。同一基本构件块中的随后指令随后被放置在程序存储器字中,如果乘以压缩因子的精简后指令大小小于程序存储器宽度,则在它们之间留下伪比特(dummy bit)。如果字满了,则在下一程序存储器字的比特零处放置下一指令。
图4示意性地示出了根据本发明的用于生成针对要由可编程处理器处理的指令子集的各个指令精简方案的方法。该方法包括用于接收代表将在可编程处理器上执行的软件的至少一个输入代码样本的第一步骤S1,所述输入代码包括用于定义第一指令集的多个指令(S1)。
在所示的实施例中,该方法包括第二步骤S2,其中要求用户指定指令精简方案的数量以及针对每个指令精简方案的最小需求压缩。这样,用户能够控制精简过程,并试验哪个规范提供最好的结果。步骤S2不是关键的。可替换地,指令精简方案的数量以及每个指令精简方案的需求压缩可以是固定的。在再一实施例中,可以通过计算考虑多个指令中不同指令的数量以及阈值来自动地确定指令精简方案的数量和每个指令精简方案的压缩。
在第三步骤(S3)中,定义被移除指令集,而且该被移除指令集被初始化为空集。
之后在步骤S4中,确定第一指令集的最精简表示。
在步骤S5中,将所述最精简表示的大小与阈值进行比较。依赖于该比较的结果,在步骤S5之后执行步骤S6至S8或者执行步骤S9至S10。如果最精简表示的大小大于所述阈值,则执行步骤S6至S8,否则执行步骤S9至S10。
在步骤S6中,确定第一指令集的哪个指令具有最高的编码成本。随后在步骤S7中,从第一指令集中移除该指令并且在步骤S8中将其添加到移除指令集中。之后程序流转到步骤S4。
在确定最精简表示的大小不大于所述阈值的情况中,第一指令集被重新定义为移除指令集(步骤S9),而且移除指令集被重新定义为空(步骤S10)。
根据本发明第一方面的该方法可以在如图5所示的视图生成工具VG中使用。如图所示,视图生成工具从例如ELF(执行语言格式)的视图无关可再定位对象文件115开始。视图无关可再定位对象文件115能够从必须由处理器执行的典型软件应用程序中获得。可再定位对象文件115在压缩之后理想地确切容纳在所选程序存储器中。对象文件115是链接步骤的结果,其中在链接步骤中程序所需的所有模块被合并。文件115包含针对跳转目标和数据对象的符号。视图生成工具VG应当将符号作为单独值进行处理。应当假设两个不同的符号总是指代不同的值,虽然这或许是不对的。在一个实施例中,视图生成工具VG能够执行预再定位,以便识别具有相同值的符号。潜在地,这降低了表中的条目的数量,从而改善了压缩因子。
在所示的实施例中,另外地,还提供了处理器描述文件105。处理器描述文件105便于降低用于搜索最佳指令精简方案集的搜索空间,因为其提供了关于能够被单独精简的指令如何被划分成指令字段的信息。处理器的处理器描述文件105由第一架构参数提取(APEX)模块120转换成时间静止指令格式(TSIF)数据结构125。APEX模块120提供用于提取在处理器的硬件描述中定义的参数的应用编程接口(API)。当使用硬件构件块库来构建处理器的硬件时使用该API。TSIF数据结构125和视图无关可再定位对象文件115被提供给视图生成模块130,这将在下面更详细描述。视图生成模块130生成视图定义文件135。
视图生成模块130的实施例的典型实现方式在下面的伪代码中示出。在该实施例中,唯一地根据可再定位对象文件115来确定指令精简方案集。
视图定义文件135优选包括下面的信息。
图5所示的视图生成工具VG定义了用于可编程处理器的视图,从而对于意欲在该可编程处理器上运行的代表性程序而言能够达到高压缩因子。用于解精简的硬件应当是不太昂贵的,即没有过多的门数量和/或时序图。
视图生成工具生成指令精简方案集。在下面的描述中,假设每个指令精简方案对应于处理器的特定视图。可替换地,可以独立于处理器的视图来确定指令精简方案。
工具VG使用由用户提供的软件内核115来生成视图。假定该软件内核代表处理器的(未来)使用。其应当足够大,而且其应当处理处理器的所有方面。例如,如果处理器包含定制操作,则推荐提供用于实际使用这些定制操作的内核。用户能够通过指示视图的数量和每个视图的压缩来调节(tweak)视图生成过程。视图生成工具VG的目的在于生成针对运行所提供的软件内核的处理器的最佳视图。最佳视图被认为是提供最高压缩因子的视图。通过采用针对跳转目标的符号,内核应当被提供为例如ELF(执行语言格式)的单个文件。
工具VG读取所有指令并存储每个单独的指令字段。之后其确定所谓的最小视图。该最小视图被定义为能够在其中运行所有程序指令的最小视图。通常,最小视图的宽度小于原始全视图的宽度。最小视图由针对每个指令字段的具有一定数量的条目的表构成。log2个条目等于那个指令字段的精简宽度。精简后指令字段的宽度的和等于精简后指令的宽度。现在,用户能够通过定义压缩因子来对视图的大小设置约束。在给定该压缩因子和指令集的情况下,视图生成工具VG的目的是用于定义最佳视图。最佳视图被定义为来自供应集的最大数量的指令能够被映射于其上的视图。
在创建了最小视图之后,移除供应集中的一个指令并再次创建最小视图。之后,移除下一指令,并再次再创建最小视图。指令的移除会导致更小的最小视图。移除指令并再次计算最小视图的过程继续,直到最小视图大小达到用户所指示的目标。之后,可以从没有位于第一视图的指令开始来生成下一视图。该过程的主要问题是:“哪个指令是移除候选?”。
可以通过计算每个指令的成本标准并选择具有最高移除成本的一个指令来回答该问题。由于算法的目的是降低最小视图的比特的数量,所以也用比特数量来表示成本。最小视图所需的比特的数量是位于该视图上的所有指令的结果。这些指令具有用于产生表中的不同条目的不同的指令字段值。表中不同条目的数量定义了比特的数量。现在,依赖于指令的指令字段,相对于所有其他指令的指令字段,指令消耗或多或少。
根据定义,所有指令的成本等于最小视图所需的比特的数量。单个指令的成本等于其指令字段的成本的和。考虑所有指令中的字段值,指令字段的成本依赖于指令字段的值的频率。如果字段值稀有(频率低),则成本高,因为该字段的表条目被很少的指令使用。如果字段值常见(频率高),则成本低,因为许多其他指令使用同一表条目。这两种情况中一个表条目的成本相等,但是对于常见值,该成本与许多指令共享,而在稀有值的情况中,该成本与低数量的指令共享,从而对于每个指令而言,该成本更高。
根据定义,所有指令中一个指令字段的成本等于指令字段的宽度。如果一个指令字段值的成本依赖于频率的倒数(reciproke),则必须用乘数因子进行补偿,该乘数因子对于所有指令上的一个指令字段而言是恒定的。
在公式形式中:
NDif–所有指令中指令字段if的不同值的数量。
fifv–所有指令中指令字段值ifv的频率。
bif–指令字段if的比特数量。
costifv-指令字段值ifv的成本。
用下面的表1A、1B中的示例来解释指令字段值成本函数。
表1A:指令字段值成本 表1B:指令字段值成本
该示例基于由11个指令(instr_nr)构成的小程序。第一个表1A示出了针对这11个指令的指令字段值。第二个表1B指示在列“表条目”中所指示的哪些指令字段值(instr_fld_vl)将被存储在该表中。第二个表还示出了指令字段值的频率(频率2),即在该程序中多长时间使用一次该条目。第一个表中的频率列(频率1)是在第二个表中的列“表条目”中查找指令字段值(instr_fld_vl)的频率(频率2)的结果。通过采用频率(频率2),能够计算不同条目的数量和字段宽度、每个指令字段的成本,如在第一个表的列“成本”中示出的那样。在这种情况中,至少出现1次的不同条目的数量ND是4。字段宽度即字段的比特的数量是3,因为存在着8个可能的指令字段值。第一个表的最后一行示出所有指令字段成本的和。根据定义,这等于字段宽度。
如所预期的,具有低频率的指令字段值比具有高频率的值对成本的贡献更大。这两个表还示出每个表条目的成本相同。表条目5出现了2次,即出现在指令3和指令6中。两者的成本都等于0.375,因此该条目的成本等于2*0.375=0.75。表条目2出现了3次,即出现在指令5、8和9中。每个指令的成本是0.25,从而该条目的成本是3*0.25=0.75,与条目5的成本相同。
根据本发明,没有在基本块级上执行视图选择,而是在指令级上执行视图选择。因此,可以单独地为每个指令选择下一视图。通过引入基于指令的视图选择,用于生成视图的搜索空间变得更宽。其中,编程者之前应当对于在哪个视图上编程什么内容有清楚的认识,而现在编程者不再受视图的困扰。这将处理器设计者从生成“逻辑”视图的任务中解脱出来。替代地,能够通过根据本发明第一方面的方法来自动执行视图的生成。
在已经生成指令精简方案集之后,针对可编程处理器的程序能够如图6所示那样进行精简。
通常,程序由不止一个模块组成。对于每个模块而言,汇编(.s)文件165a,...,165n由调度器生成。这些汇编文件被汇编器170转换成ELF格式的可再定位对象文件175a,...,175n。汇编器170需要用于定义指令的指令字段值的处理器描述105和APEX TSIF数据结构125。汇编器170的输出包含针对除了立即字段之外的所有指令字段的固定值。立即字段可以包含固定值以及符号。这些符号可以称为分支目标或数据对象。
链接器180将由汇编器生成的可再定位对象文件175a,...,175n合并成一个可再定位对象文件185。立即字段的可再定位符号仍为符号,仅这些符号的定义可以被修改。
精简工具190将可再定位对象文件185形式的未精简程序转换成精简程序。未精简程序185以ELF可再定位对象文件的形式进入精简工具190。精简工具190通过APEX获得视图定义和全指令格式。APEX从处理器描述文件105收集信息,并形成视图描述文件。类似于视图生成工具VG,精简工具190应当将可再定位符号作为单独值进行处理。在一个实施例中,假设互不同的符号总是指代互不同的值。在优选实施例中,精简工具190应用预再定位,以便识别具有相同值的符号。通常,这将改善程序的精简因子。
在精简程序时,精简工具190将符号放置在表中,好像它们是标准值一样。工具190应当对此进行支持。精简过程以两种结果结束:
1、精简后程序195包含视图id和每个指令的(精简后)指令值。
2、针对该程序的视图表内容197。
视图表197可以包含可再定位符号,而精简后程序195则不能。
精简后程序195被放置在程序存储器映射中。它们的示例随后给出。结果应当被转换成ELF对象文件。视图表内容还应当被放置在该对象文件中。
链接器200执行表内容中的符号的再定位,并将该对象文件传递给二进制表示205。
为了便于可编程处理器识别根据其精简指令的视图,精简后指令数据优选包括视图识别数据。下面描述两个示例。
在第一实施例中,向程序存储器字的每个分段中添加额外比特。分段具有最小视图的大小。将被添加的比特的数量依赖于具有相同大小的视图的数量。一个比特(S)指示该分段是否是指令的开始(S=1)。能够基于一系列分段的开始比特来确定精简指令的长度。如果具有相同大小的多个视图被用于软件的精简,则可以添加额外比特来识别正确的视图id。假设处理器具有大小为1/8全视图大小的最小视图,而且最大的两个视图具有相同的大小。则每个分段需要添加2个比特。所需要的总的程序存储器比特数量等于PMsize*8*2=16*PMsize,其中PMsize是程序存储器中的存储器字的数量。当视图信息现在在指令中可用时,程序计数器不再需要包括视图信息。替代地,程序计数器等于程序存储器中的开始分段地址。
这参照下面的表而被示出。在其中所示的示例中,最小视图具有1/4的压缩因子,而最大的两个视图具有相同的大小。而且,在这里,每个分段被添加了两个比特S、V。表2示出针对11个指令的序列的一部分的指令信息。第一列示出序列中指令的位置,第二列示出与指令相对应的视图,第三列示出指令的长度,而第四列示出视图比特。在该示例中,处理器促成包括全视图在内的6个视图(0,...,5)。视图3和4两者都具有相同的长度(3个分段),视图1和5也具有相同的长度(1个分段)。指令的长度可以从开始分段比特获得,对于视图0和2而言,该长度直接确定了视图。对于该长度之后的视图1、3、4和5,需要视图比特来确定视图。
表2:指令信息
表3示出如何在程序存储器中布置指令。每个分段具有开始分段比特S,用于指示该分段是否是新指令的开始(1)或者该分段是否包含其开始位于之前分段处的指令的一部分。开始分段比特之后,每个分段具有视图比特V,用于在指令长度不是总提供指令的视图的情况下指示指令的视图。注意,仅对于开始分段而言才需要该视图比特。对于长于一个分段的指令,可以通过每个分段的视图比特来划分视图信息。如果两个以上的视图具有相同的长度,这会是有用的。
表3:程序存储器映射
图7示意性地示出了根据本发明的可编程处理器。图7所示的可编程处理器包括用于存储如上所述的指令序列的程序存储器10。精简后指令数据至少包括作为具有N个存储器字分段的第一码字的第一指令和作为具有M个存储器字分段的第二码字的第二指令,其中第一指令根据第一指令精简方案进行精简,第二指令根据第二指令精简方案进行精简,N和M是大于或等于1的互不相同的整数。在这种情况中,精简后指令数据包括根据6种不同的格式进行精简的指令。
可编程处理器还包括指令解码器20、至少一个寄存器文件40和耦合到寄存器文件40的至少一个发布槽50。另外,可编程处理器包括数据选择元件30。数据选择元件30、寄存器文件40和至少一个发布槽50由指令解码器20控制。可编程处理器可以包括更多发布槽,并且每个发布槽可以包括多个功能单元。还可以存在其他的数据处理元件,类似于存储元件、处理元件和选择元件。
可编程处理器还包括指令扩展器80。指令扩展器80包括精简方案识别器17,用于识别哪个指令精简方案被用于从程序存储器10中获取的每个精简后指令数据。指令扩展器80具有用于接收由指令解码器20生成的程序计数器PC的输入。可编程处理器还包括存储设备14和选择设备(多路复用器单元)27,存储设备14用于临时存储至少程序存储器字的分段,而选择设备27用于从程序存储器10和存储设备14中选择精简后指令数据。所选择的精简后指令由指令扩展单元87扩展。指令扩展器80还包括控制设备85,该控制设备85用于响应于程序计数器PC来生成用于程序存储器10的地址AD。控制设备85还用信号Sel来控制选择设备27以及用读取使能信号Ren来控制存储设备14。
在根据本发明的可编程处理器中,优选地,针对每个视图的任何(精简)指令能够在存储器字中的任何分段处开始。这通过布置在程序存储器与指令扩展单元87之间的存储元件14来实现。在这种方式中,支持被存储在两个顺序存储器字上的指令。
图7中的包括指令扩展器80的可编程处理器的第一实施例的一部分在图8中更详细地示出。
在第一实施例中,程序存储器10分别在输出P0、P1、P2和P3处为分段0、分段1、分段2和分段3提供程序数据。存储元件14将由程序存储器10提供的程序数据的一部分延迟。在这种情况中,存储元件14分别提供来自程序存储器10的输出P3、P2和P1的延迟后程序数据R2、R1、R0。多路复用单元27可控制地选择由程序存储器10和存储元件14提供的程序数据的一部分。在所示的该实施例中,多路复用器单元27包括多个多路复用器模块27a、27b、27c、27d。多路复用器模块27a、27b、27c、27d分别由选择信号sel0、sel1、sel2、sel3控制。每个多路复用器模块27a、27b、27c、27d耦合到程序存储器10的每个输出P0、P1、P2、P3。第一多路复用器模块27a附加地耦合到存储元件14的输出R0、R1、R2。第二多路复用器模块27b附加地耦合到存储元件14的输出R1和R2。第三多路复用器模块27c附加地耦合到存储元件14的输出R2。
在所示的实施例中,精简方案识别器17直接耦合到程序存储器10。
指令扩展单元87的输入由包含(精简后)指令的一个或多个分段形成。该指令被存储在程序存储器10中的某个位置处。程序存储器字包含n个(这里为4个)分段。指令长可以是一个或多个分段,而且一个指令的分段可以位于不同的(但随后的)程序存储器字中。多路复用器单元27允许指令扩展单元87从程序存储器字中直接读取(其间没有寄存器)。为了支持跨越指令的程序存储器字,寄存器14可以存储之前的存储器字。由于最大指令长度是n个分段,所以仅需要存储n-1个分段。
如图9所示,输出O0...On-2连接到指令扩展单元87中的各种指令扩展模块871-878。O0被所有指令扩展模块使用,O1...On-2仅在视图大小需要它时才被连接。On-1仅用于未精简指令。
例如如图10中的指令扩展模块873所示,指令扩展模块871-878中的每个指令扩展模块包括多个指令解精简分段873a,...,873f。其中,解精简模块873包括用于将精简后操作码opcode-s转换成解精简后操作码opcode-w的操作码解精简分段873a、用于将精简后立即immediate-s转换成解精简后immediate-s的立即解精简分段873b、用于将精简后写端口选择wp_select-s转换成解精简后wp_select-w的写端口选择解精简分段873c、用于将精简后总线选择“bus_select-s”解精简成解精简后“bus_select-w”的总线选择解精简分段873d、用于将精简后写端口索引“wp_index-s”解精简成解精简后“wp_index-w”的写端口索引解精简分段873e以及用于将精简后读端口索引“rp_index-s”解精简成解精简后“rp_index-w”的读端口索引解精简分段873f。
操作码解精简分段873a、总线选择解精简分段873d和写端口选择解精简分段873e例如通过使用查找表(LUT)来实施。写端口索引解精简分段873e和读端口索引解精简分段873f可以通过用于在指令字段的最高有效侧处添加一个或多个0比特的零扩展分段来实施。立即解精简分段873b依赖于针对指令的操作码来执行记号(sign)扩展或零扩展。
寄存器14中的寄存器分段Rn-2...R0仅存储在两个存储器字上进行划分的指令的lsb分段。
由于根据最小视图的指令的大小等于分段的大小,所以这些指令总是被完全存储在一个单个的程序存储器字中。因此,用于最小视图的多路复用器模块27d仅具有直接耦合到程序存储器10的输出的输入。针对其指令大小为两个或更多分段的视图的多路复用器27a、27b、27c也具有源自寄存器14的输入。这是因为这样的事实:这些指令能够在两个程序存储器字上进行划分。多路复用器的寄存器分段输入的数量等于指令分段的数量减一。
多路复用器模块27a、27b、27c、27d的由控制设备85提供的选择信号sel0,...,seln依赖于它们的之前值以及之前指令的程序存储器使能信号,即程序存储器输出是新的还是之前已经被使用。指令的长度确定输出O0,...,On中的哪些输出被实际使用。该实施例的有利方面在于能够在指令被使用之前的周期中预计算选择信号。在该预计算周期中,能够从寄存器14中读取之前值,而且程序存储器使能信号等于用于控制程序存储器10的实际信号。如果当前指令表现为跳转指令,则针对下一指令的PC的LSB能够被认为是选择器的之前值。预计算使得能够使用针对sel0,...seln信号的流水线寄存器,以便指令选择的时序将改善。
如图11的流程图所示,可以从程序存储器10中获取指令。
在第一步骤S1中,将存储器地址AD初始化为例如值0。在第二步骤S2中,在这种情况中,将分段计数器SG初始化为0。之后,在第三步骤S3中,初始化指令开始地址BG。指令开始地址由存储器地址分量AD和分段分量SG构成。在每个存储器字包括n个分段的情况中,则将指令开始地址计算为BG=n*AD+SG。在步骤S4中,验证值SG是否等于最大值,例如n-1。如果等于,则在步骤S5中将存储器地址AD增加1,并在步骤S6中将分段数复位成0。否则,在步骤S7中将分段数增加1。在步骤S6或步骤S7之后,无论什么是可应用的,都在步骤S8中验证分段比特S以确定该分段是否从新的精简后指令开始。如果否,则指令流转到步骤S4。否则,在步骤S9中根据L=n*AD+SG–BG来计算之前指令的长度,并且在步骤S10中,再次根据BG=n*AD+SG来计算BG的值。之后,程序流转到步骤S4。根据长度L以及如果必要的话一个或多个附加视图比特V,确定应当根据哪个视图来精简指令并因此确定哪个视图解码器是可应用的。
下面描述如何根据上述表3中的程序来产生定序。假设指令4包括到指令9的跳转。程序从PC=0开始。程序存储器地址0被读取,并且精简方案识别器17识别程序存储器字中的四个分段中的开始分段比特S。根据这4个开始分段比特,精简方案识别器17确定该字包含两个指令,其中第一个指令(0)从分段0开始并具有1个分段的长度,而第二个指令(1)从分段1开始并具有3或4的长度。指令0被映射到视图1,因为分段0的视图比特V是“0”。其能够通过使用视图1指令扩展单元进行解精简,并随后被执行。指令1需要被存储,以便获取下一程序存储器字。一旦地址为1的下一程序存储器字可用,则精简方案识别器17就能够看到该字的分段0包含为“1”的开始分段比特S。这意味着指令1具有3个分段的长度,并且能够被解精简、解码和执行。另一分段开始比特指示指令2的长度为3。指令2和3需要被存储,而且地址2处的程序存储器字能够被获取。一旦接收到该字,指令2就能够被解精简、解码和执行,程序存储器字中的指令4和其他信息将被存储并且下一程序存储器字被读取。当指令4中的到指令9的跳转被执行时,程序计数器被加载有指令9的开始分段地址。程序存储器地址被设定为地址7,而且包含指令9的程序存储器字被读取。在下一周期中,表现为映射到全视图的指令9能够被执行。
在原理上,用于识别代码精简方案的该解决方案并不引入额外的失速周期或额外的分支延迟。如果分支目标在两个程序存储器字上被划分,则会因两个程序存储器字必须被读取以便获取分支目标指令而引入失速周期。但是这与精简方案/视图信息被获取的方式不相关。预期该解决方案的关键路径是相当长的,因为确定视图信息和开始分段、选择正确的分段以选择指令和解精简的序列都必须在一个时钟周期的时间内被执行。潜在地,需要在该路径中插入额外的流水线级,以便实现时序目标。
在另一实施例中,通过将下一视图id(nxt_vw_ID)添加到每一(精简后)指令中来识别视图信息。表4和5中给出了一个示例。该字段可从每个指令的预定位置处获得,例如从每个指令的lsb侧获得,而不管指令的长度。该字段的宽度等于视图数量的log2。当通过程序定序时,之前指令的下一视图id和当前指令的位置(其包含在当前PC中)确定下一指令在程序存储器中的位置。对于具有8个视图和最大压缩因子为1/8的处理器而言,如果下一视图id字段具有3比特的宽度就已经足够了。假设能够用因子3(所有指令上的每个指令的压缩的平均)来精简程序,则每个程序存储器字的指令的平均数量共计3个。所需要的用于识别下一视图id的比特的总数量则共计PMsize*3*3=9*PMsize个。与使用开始分段比特的解决方案中的16*PMsize相比,这是相当小的。
表4:指令信息
表5:程序存储器映射
表4示出示例性程序中的指令序列,以及表5示出现在如何在程序存储器中存储该示例性程序,如上面所讨论的,精简后指令现在包括下一视图id字段(nxt_vw_ID)。除了视图和长度列之外,指令表4还包含用于指示下一指令的视图id的额外的列。
图12示出根据本发明的可编程处理器的第二实施例的一部分,其用于处理被存储在程序存储器中的如上面的表5中所示的精简后程序。
第二实施例与第一实施例的不同之处在于,精简方案识别器17耦合到选择设备27的输出。
如图13的流程图所示,可以从程序存储器10中获取指令。
在第一步骤S20中,从程序存储器10中读取存储器字。在第二步骤S21中,精简方案识别器17识别用于下一指令的精简方案。假设第一指令的精简方案是已知的,而且其在存储器字中具有预定的对准。在第三步骤S22中从表中读取下一指令的长度,并在步骤S23中计算下一指令的结束地址。
该结束地址由存储器地址分量AD和分段分量SG构成。在步骤S24中,确定该结束地址是否位于下一程序字中。如果否,则将地址计数器AD维持在当前值,并在步骤S27中将相关分段选为将由可编程处理器解精简和执行的指令的精简后数据。如果在步骤S24中确定当前精简后指令的结束地址实际上位于下一程序字中,则在临时存储设备中存储当前程序字中的当前精简后指令的分段,并递增地址AD。
程序计数器由分段地址、程序存储器地址和当前指令的视图id构成。在程序执行的开始时,PC指向指令0,而且精简方案识别器17从PC知道第一指令是视图1指令,即根据基于第一视图的精简方案而被精简的指令。硬件查找表指示视图1指令具有1个分段的长度。当程序存储器字在输出处可用时,则能够读取指令0的下一字段id字段,从而产生值3。通过索引长度查找表,由精简方案识别器17确定被映射到视图3的下一指令具有3个分段的长度。该信息指示程序存储器10的读取能够保持一个时钟周期,因为指令1总是在当前程序存储器输出中完全可用。当扩展指令1时,程序存储器地址能够被设置成1,以便读取包含指令2和一部分指令3的程序存储器字。当指令2被扩展并被进一步处理时,控制设备85将决定读取下一程序存储器地址,因为指令2的下一视图id字段指示视图2意味着长度为2的指令。开始分段位于分段3处,这暗示着该下一指令扩展到下一程序存储器字中。指令4包含到指令9的跳转,指令9位于程序存储器地址7、分段3处。除了所述指令的地址之外,跳转指令还传递包括指令9的视图id 2的PC。通过采用该信息,控制设备85确定两个程序存储器字需要首先被读取,以便解精简指令9以进行进一步的执行。当跳转到分支目标时,分支目标9在两个程序存储器字上被划分的事实导致失速周期。
在条件分支的情况下,分支指令包括下一指令的视图ID的指示,而且另外地,所述分支地址包括分段地址、程序存储器地址和被有条件地分支到的地址处的指令的视图id。
如果希望,例如在关键环路中,能够通过将分支目标布置在程序存储器字的分段0处以便其永远不被划分在两个存储器字上来避免该失速周期。注意,这仅在分支目标指令被划分在两个程序存储器字上时才是必要的。如果目标不从分段0处开始,但是具有其仍然完全容纳在存储器字中的长度,则不需要替换它。
将分支目标布置在分段0处移除了失速周期但引入了另一问题。在存储器映射中创建了间隙。当不是通过跳转而是通过根据之前指令的定序来达到分支目标时,不得不通过该间隙。提出了可以避免该问题的5种解决方案:
1、预留下一视图id字段(nxt_vw_ID)的一个值,用于指示存储器间隙。如果指令的下一视图字段指示存储器间隙,则下一指令应当从下一程序存储器字处的分段0中读取。该指令的视图id由该间隙的第一分段的下一视图id字段指示。
2、将最小视图的“不可能”指令值插入该间隙的第一分段。“不可能”指令值是不能由编译器生成的指令值。一个示例是具有“非NOP”输入的NOP指令。可编程处理器具有用于监控该指令的出现的指令选择器。当被检测到时,其选择下一程序存储器字的分段0而非具有不可能指令的分段。分支目标的视图id由所添加的不可能指令的下一视图id识别。
3、全视图的不能由编译器生成的“不可能”指令值(诸如具有“非NOP”输入的NOP指令)如下那样被使用。该指令字段被调整,以便相关指令比特位于全指令的lsb分段。该间隙的第一分段用全指令的该lsb分段填充。该分段的下一视图id指示被对准的分支目标的视图id。间隙之前的最后指令具有类似于全视图id的下一视图id。基于该全视图id,控制设备85决定加载下一程序存储器字。当还检测到专用指令时,控制设备85决定跳转到下一被对准的分支目标。表7示出了该解决方案。在指令4之后,程序存储器包含两个分段的间隙。该间隙的第一分段用“不可能”指令(IMP)的lsb分段填充,该间隙的第二分段可以是任意值(X),因为其不被读取。
表6:指令信息
表7:程序存储器
4、所有关键分支目标被容纳在最小视图中。这可以通过用这些关键分支目标来开始压缩过程并用它们的指令字段值来填充表来实现。
5、每个程序存储器字都预留额外比特。如果该比特是“1”,则程序存储器字的msb分段指示该间隙的开始点。该间隙之前的最后指令包括被对准的分支目标的视图id。
如表8中所示,所呈现的5个解决方案可以影响被执行的程序的时序、链接器的复杂度、程序的精简因子和硬件的复杂度和(关键)时序路径。本领域技术人员可以依赖于给予这些因子的权重来选择这些解决方案中的其中一个解决方案。下面的表中示意性地指示了对这些因子的影响。第一列指示如上所述的解决方案,第二列指示该解决方案的可行性。其中,符号“-”、“0”和“+”分别指示可能不可行、不总是可行和可行。第三列指示对精简因子的影响。“-”指示精简因子被减小。“o”指示措施对精简因子没有实质性影响。最后一列指示就实现所需的门数量方面对硬件复杂度的影响,范围从用于指示相对复杂的硬件实现方式的“-”到用于指示具有相对低复杂度的硬件实现方式的“++”。一般而言,更复杂的硬件实现方式将暗示更长的组合路径,从而具有更慢的时序。
表8:所呈现的解决方案之间的比较
解决方案1是简练的解决方案,但是字段id的成本将减小精简因子。解决方案2并非总是可行。专门的“不可能”指令在最小视图中可能是不可用的。除此之外,到程序存储器的时序路径使得信号相当长。解决方案3没有这些问题,因此是优选的。尽管如此,它的缺陷是指令字段需要被调整。解决方案4潜在地降低了精简因子,因为最小视图具有非最优的表条目。解决方案5产生小的精简因子降低,但是其并不优于解决方案3。
鉴于上述内容,在全视图中使用专门指令的解决方案3是优选的。
对准所有分支目标将大大地降低程序的精简因子。为了避免该情况,应当在被对准的边界处仅放置时间关键的分支目标。通常,时间关键的分支目标是时间关键的环路的一部分。用户或调度器必须指示将其放置在哪里。汇编器必须在(ELF)对象文件中包括该信息,以便精简工具190(图6)能够看到哪些指令应当被放置在被对准的地址处。
下面的表9示出了针对图12的架构的程序执行的示例。在该示例中,程序存储器宽度等于4个分段。第一列(nr)指示哪个指令被解精简。如果程序存储器10的msb分段是在下一程序存储器字中继续的指令的一部分,则第二列(部分)包含“1”。列P3向下至P0指示程序存储器10的输出。每一列表示分段。数字指示指令数。精简后指令0表现为具有1个分段的宽度,指令1是2个分段宽等等。列R2、R1和R0表示存在于寄存器的输出处的指令(或它们的分段)的数量。列M和R指示程序存储器的地址AD是否被递增和/或寄存器是否需要被更新。输出分段列O3..O0指示从哪个存储器分段P0,..,P3或者从哪个寄存器分段R0,..,R2中读取指令分段,而且寄存器输入R2、R1和R0指示在寄存器14中存储从程序存储器10的哪一部分开始的相关数据。注意,寄存器分段R0、R1、R2总是分别从相同的程序存储器分段P1、P2、P3中获取它们的数据。列MS指示多路复用器27a,..,27d的选择值。由该选择值控制所有的多路复用器是有吸引力的。
该示例示出寄存器R0、R1和R2仅在需要是被写入。列O3,..O0示出多路复用器总是选择值,即使该值不被使用。仅反向标记的条目才被指令扩展单元87实际使用。
表9:
指令20是被划分在两个存储器字上的跳转目标。这导致失速周期。
图14示出了根据本发明的可编程处理器的第二实施例。该实施例与第一实施例的不同之处在于,寄存器14被移位寄存器15替换,该移位寄存器15经由输入多路复用器单元16耦合到程序存储器10。在所示的该实施例中,输入多路复用器单元16包括两个多路复用器模块16a、16b。在该图中,移位寄存器15还被标记为S2、S1和S0。移位寄存器15的输入连接到两个输入多路复用器16a、16b。移位寄存器15的一个输入由程序存储器10的分段P3的输出形成。其他输入连接到移位寄存器,也从lsb分段开始。为了避免额外的分支延迟,分支目标应当被放置在单个的程序存储器字中。当分支目标在程序存储器10的输出处可用时,其通过输出多路复用器单元27被馈送并被指令扩展单元87中的适当的指令扩展模块所扩展。之后程序存储器字的其余部分(排除刚被解码的指令)被移位到总地标记为15的移位寄存器(S2、S1和S0)中,以便下一指令从移位寄存器的lsb(ls分段)处开始。下一指令能够从寄存器15中读取,并从lsb侧开始。如果在移位寄存器15中指令仅部分可用,则剩余部分从程序存储器10的输出中读取。移位多路复用器16a、16b能够被再用于选择程序存储器的适当的分段。
在该实施例中,指令获取序列基本上与可编程处理器的第一实施例中的序列相同。用于输出多路复用器的选择信号能够被流水线处理,以便缩短时序路径。
下面的表10用于说明该设备的操作。
第一列中的数字nr等于程序计数器值PC。
如果当前PM字的P3分段是在下一PM字中继续的指令的一部分,则第二列包含“1”。
第三列指示被编址的程序存储器的存储器地址AD。
P0、P1、P2、P3指示被编址的存储器字的各个分段的指令id。
S0、S1、S2指示从其获取指令数据的程序存储器10的分段。
M指示下一周期中是否递增存储器地址AD。
R指示寄存器15是否被使能以接受来自程序存储器10的数据。
O0,...,O3分别指示程序存储器分段P0、P1、P2、P3和寄存器分段S0、S1、S2中的哪个在多路复用器模块27a,...,27d的输出处是可见的。
在参照下面的表描述的该示例中,观察到下面的内容。
在该表的第一行,指令扩展器80接收值为0的程序计数器,并假设该值为程序存储器地址。在所述存储器地址处,程序存储器在第一分段中包括针对第一指令字的精简后数据(0),在第二和第三分段中包括针对第二指令字的精简后数据(1)以及在第四分段中包括针对第三指令字的精简后数据的一部分(2)。包括精简后第一指令字的一个分段P0被选择并经由输出O0被提供给指令扩展单元87。由于在该情况中被编址的存储器字在分段P1、P2中包括完整的精简后第二指令,所以程序计数器PC的增加并不跟随有程序存储器地址AD的增加。替代地,包括第二指令(1)的两个分段P1、P2被选择并分别在输出O0和O1处被提供给指令扩展单元87。在同一周期中,在寄存器15的分段S0中读取输出分段P3。由于存储器地址0仅包括精简后的下一指令(2)的一部分,所以控制信号M现在允许存储器地址AD在下一周期中增加。因此,在下一周期中,存储器地址1被寻址,并且针对指令2的指令数据现在分别通过寄存器分段S0和程序存储器分段P0、P1、P2的选择而被提供在输出O0、O1、O2、O3处。在随后的周期中,每次在需要时获取和扩展精简后指令数据的一个或多个分段。
表10:
对于第一实施例(在图12中示出),下一指令的开始分段能够根据当前指令的开始分段和当前指令的长度进行计算。根据该开始分段,能够计算针对sel0的一个热字。sel0的LSB部分被复制到sel1,...seln。注意,输出分段O0..On总是包含数据。指令扩展单元87必须考虑依赖于指令长度,仅必须读取lsb分段。
对于第二实施例(图14中示出),开始分段的计算相同。针对o sel0的从开始分段到一个热选择器的转换稍微不同,因为一个热字更小,但是针对o sel1..o seln的信号不是仅被移位的版本。S0..Sn中可用分段的数量影响了o sel信号之间的关系。图12中所示的实施例使用2n-1比特的一个热字来控制多路复用器单元,而图14的实施例使用n+1比特的一个热字。然而,对于第二实施例,sh_sel信号也必须被生成。这并非必须被注册,因为从程序存储器10到输入移位寄存器Sn..S0的时序路径足够短。能够根据下一开始分段生成选择信号sh_sel0..sh_seln。
可以通过使用硬件生成工具来自动地生成根据本发明的可编程处理器的规范。图15示出了这样的工具PC。其中,常规处理器(例如,图1中所示的处理器)的视图定义文件135和处理器描述文件105被提供给第二APEX模块140。该第二APEX模块140从处理器描述文件105和视图定义文件135中收集信息,并提供用于提取在处理器的描述中所定义的参数的API 145。该API 145由用于生成规范155的硬件构件块库150使用。
在根据本发明的可编程处理器中,指令或指令字段的解精简典型地通过索引可编程表(这里也称为解精简表)来执行。提供写和读设备,以用于写入和读取解精简表。在一个实施例中,针对解精简表的寄存器仅在条目被写入时才被时钟控制。通常,这在处理器已经被加电之后立即发生。因此,针对解精简表寄存器的时钟门控导致功率使用的明显减小。
在一个实施例中,使用至少一个解精简表来根据多个视图来解精简指令。这将不需要位于解精简表上的多个读取端口,因为针对互不相同的精简方案的指令扩展模块并非必须被并行执行。
解精简表将总是包括针对指令字段的NOP值。为NOP代码预留每个表的地址0并使其为固定条目而非由寄存器来实施该条目是有意义的。
在权利要求中,措辞“包括”并不排除其他元件或步骤,而且不定冠词“一”或“一个”并不排除多个。单个部件或其他单元可以实现权利要求中所引用的若干项的功能。某些措施被引用在互不相同的权利要求中的事实并非指示这些措施的组合不能用于实现有益效果。权利要求中的任何参考标号不应当被解释为限制范围。另外,除非明确以相反地方式指出,否则“或者”指代包括性的“或”而非排他性的“或”。例如,下面各项中的任一项都满足“条件A或B”:A为真(或存在)而B为假(或不存在);A为假(或不存在)而B为真(或存在);以及A和B两者都为真(或存在)。