首页 / 专利库 / 专利权 / 专利合作条约 / 第I章 / 国际申请 / 请求书 / 声明 / 优先权要求 / 基于指令读缓冲的缓存系统和方法

基于指令读缓冲的缓存系统和方法

阅读:683发布:2022-05-04

专利汇可以提供基于指令读缓冲的缓存系统和方法专利检索,专利查询,专利分析的服务。并且本 发明 提供了一种基于指令读缓冲的缓存系统和方法,应用于处理器领域时能在处理器核执行指令前,将所述指令填充到所述处理器核能直接 访问 的指令读缓冲中,并由指令读缓冲主动向处理器核输出指令供执行,达到极高的缓存命中率。,下面是基于指令读缓冲的缓存系统和方法专利的具体信息内容。

1.一种缓存系统,包括:
处理器核,所述处理器核用以执行指令;
指令存储器,所述指令存储器用以存储指令;
指令读缓冲,所述指令读缓冲主动向处理器输出指令供执行;
所述指令读缓冲根据处理器核对指令的执行结果,主动向处理器核输出指令供执行;
所述缓存系统进一步包括:第一循迹器,所述第一循迹器的读指针前行到处理器核当前正在执行的指令之后第一条指令,并输出从所述第一条指令开始的复数条指令中的分支指令的目标指令的地址;
当所述第一条指令或所述目标指令尚未存储在指令读缓冲中时,控制指令存储器向指令读缓冲填充所述一条指令或所述目标指令;和
控制指令读缓冲输出从所述第一条指令开始的复数条指令;
其特征在于,由相关性检测模对所述复数条指令进行相关性检测,并根据相关性检测结果确定第一循迹器读指针的增量以更新读指针,以及根据相关性检测结果由处理器核执行所述复数条指令中的部分或全部。
2.如权利要求1所述的缓存系统,其特征在于,由第一循迹器向指令读缓冲输出所述第一条指令地址和下块指令地址,以控制指令读缓冲输出从所述第一条指令开始的连续地址复数条指令。
3.如权利要求2所述的缓存系统,其特征在于,指令读缓冲根据接收到所述第一条指令地址,将相应的锯齿字线设为有效,使能其经过的读口以输出从所述复数条指令。
4.如权利要求3所述的缓存系统,其特征在于,当所述锯齿字线上的有效信号到达指令块边界时,被发射到总线上,并由根据下块指令地址确定的指令块上的锯齿总线接收,使能其经过的读口以继续输出相应指令。
5.如权利要求1所述的缓存系统,其特征在于,由第一循迹器向指令读缓冲输出所述第一条指令地址及其下块指令地址和目标指令地址及其下块指令地址,以控制指令读缓冲输出从所述第一条指令开始直到第一条分支指令,以及从所述分支指令的分支目标指令开始的连续地址复数条指令。
6.如权利要求5所述的缓存系统,其特征在于,指令读缓冲根据接收到所述第一条指令地址,将相应的锯齿字线设为有效,使能其经过的读口以输出所述第一条指令开始直到第一条分支指令,并在所述锯齿字线上的有效信号到达所述第一条分支指令时,被发射到目标总线上,并由根据目标指令地址确定的指令块上的锯齿总线接收,使能其经过的读口以继续输出相应指令;和
当所述锯齿字线上的有效信号到达指令块边界时,被发射到总线上,并由根据下块指令地址确定的指令块上的锯齿总线接收,使能其经过的读口以继续输出相应指令。
7.如权利要求1所述的缓存系统,其特征在于,所述处理器核具有两组前端流线和一组后端流水线;
所述第一循迹器向指令读缓冲输出所述第一条指令地址及其下块指令地址和目标指令地址及其下块指令地址,以控制指令读缓冲输出从所述第一条指令的连续地址复数条指令到一组前端流水线执行;并控制指令读缓冲输出从所述第一条指令开始的第一条分支指令的分支目标指令开始的连续地址复数条指令到另一组前端流水线执行;和根据分支指令的执行结果选择所述两组前端流水线中的一组的执行结果供后端流水线执行。
8.如权利要求1所述的缓存系统,其特征在于,所述处理器核具有两组前端流水线和一组后端流水线;所述系统还包括一个第二循迹器;所述第一循迹器向指令读缓冲输出所述第一条指令地址及其下块指令地址和目标指令地址,以控制指令读缓冲输出从所述第一条指令的连续地址复数条指令到一组前端流水线执行;
所述第二循迹器向指令读缓冲输出所述目标指令的下块指令地址,以控制指令读缓冲输出从所述第一条分支指令的分支目标指令开始的连续地址复数条指令到另一组前端流水线执行;和
根据分支指令的执行结果选择所述两组前端流水线中的一组的执行结果供后端流水线执行。
9.如权利要求1所述的缓存系统,其特征在于,所述处理器核具有复数组前端流水线和一组后端流水线;
所述第一循迹器向指令读缓冲输出所述第一条指令地址及其下块指令地址,以控制指令读缓冲输出从所述第一条指令开始的连续地址复数条指令到一组前端流水线执行;
所述第一循迹器还向指令读缓冲输出从所述第一条指令开始的连续地址复数条指令中所有分支指令的目标指令地址及其下块指令地址,分别控制指令读缓冲输出从每个目标指令开始的连续地址复数条指令到其他不同的前端流水线执行;所述分支指令的总数小于前端流水线的组数。
10.如权利要求1所述的缓存系统,其特征在于,所述处理器核具有复数组前端流水线和一组后端流水线;
所述第一循迹器向指令读缓冲输出所述第一条指令地址及其下块指令地址,以控制指令读缓冲输出从所述第一条指令开始的连续地址复数条指令到一组前端流水线执行;
所述第一循迹器还向指令读缓冲输出从所述第一条指令开始的连续地址复数条指令中所有层次的分支指令的目标指令地址及其下块指令地址,分别控制指令读缓冲输出从所述所有层次分支指令的目标指令开始的连续地址复数条指令到其他不同的前端流水线执行;所述所有层次的分支指令的总数小于前端流水线的组数。
11.如权利要求9、10任一项所述的缓存系统,其特征在于,每组前端流水线构成一路,各组前端流水线中对应的执行单元构成一槽;
由相关性检测模块对从所述第一条指令开始的各路指令分别进行相关性检测,并根据各路相关性检测结果产生各路相应的读指针增量,以及根据各路相关性检测结果由相应路的前端流水线执行相应复数条指令中的部分或全部;
根据各路中分支指令的执行结果选择这些路中一路对应的前端流水线的执行结果供相应的后端流水线执行;和
根据各路中分支指令的执行结果选择这些路中一路对应的指令地址及读指针增量更新循迹器读指针。
12.如权利要求11所述的缓存系统,其特征在于,按路组织指令读缓冲;或按槽组织指令读缓冲。
13.如权利要求11所述的缓存系统,其特征在于,所述相关性检测模块可配置,可以根据配置减少系统的最大发射数。
14.如权利要求1所述的缓存系统,其特征在于,所述系统还包括数据读缓冲和数据引擎;所述数据引擎将指令读缓冲中数据读取指令可能用到的数据事先填充到数据读缓冲中。
15.如权利要求14所述的缓存系统,其特征在于,所述数据读缓冲的表项与指令读缓冲中的表项一一对应,可以直接由数据读取指令在指令读缓冲中的位置信息直接在数据读缓冲中找到该数据读取指令对应的数据;或
所述数据读缓冲的表项数目少于指令读缓冲的表项数目,且指令读缓冲的每个表项包含一个指针;可以数据读取指令所在的指令读缓冲表项中的所述指针经译码器译码后确定对应数据在数据读缓冲中的位置,以找到对应数据。
16.如权利要求11所述的缓存系统,其特征在于,进一步包括:将从指令地址a开始的n条顺序指令同时发射,以相关性检测模块检测该复数条指令间的相关性,两条有相关关系的指令中顺序后面一条的位置为相关指令位置,根据相关指令位置反馈一个地址增量i;下一周期从指令地址a=a+i开始发射n条指令。
17.如权利要求16所述的缓存系统,其特征在于,进一步包括:使用锯齿字线控制一个对单一条指令或数据有复数个由相互独立的位线相连接的读口的存储器,使一段连续的指令或数据同时沿各自独立的复数条位线被送到与位线相连的复数个处理单元并行执行;
上述存储器的字线可由译码器对地址译码注入令牌,通过令牌传递以控制或由译码器对地址译码直接控制。
18.如权利要求17所述的缓存系统,其特征在于,进一步包括:每个令牌传递器至少含有一个n输入选择器,选择器的输出使能一条锯齿字线及连接至令牌传递器的输出,选择器的n个输入分别连接前1至n个令牌选择器;由相关性检测单元产生的地址增量控制各令牌传递器中的n输入选择器接受其前1至n个令牌选择器的输出。
19.如权利要求16所述的缓存系统,其特征在于,进一步包括:将一段指令中的所有可能分支路径视为二叉树,按所述二叉树组织多层次的二输入选择器树,每层对应一个发射槽,以代表各路径的路优先码作为二输入选择器树的输入;以独立执行每条分支指令产生的分支判断控制位于其对应二叉树节点上的二输入选择器,以二输入选择器树最终输出的路优先码控制对路径的选择。
20.如权利要求19所述的缓存系统,其特征在于,进一步包括:令读缓冲被分为多个指令读缓冲块,每块存储一个指令块,按程序的顺序排列;指令读缓冲结构为一种矩阵形式或阵列形式,其中每行存储一条指令,每列至少有一个读口;一条总线连接列中不同行所有同一读口至相应的执行单元以及相关性检测模块;执行单元按列排列;列间有令牌总线;按对线或锯齿线方向放置的字线,可以打开其所经过的读口读出复数条连续指令。
21.如权利要求20所述的缓存系统,其特征在于,进一步包括:无缝拼接当前指令块与顺序下块指令块中指令,使每个执行单元都被使用;当字线到达指令读缓冲块的水平边界时令牌被注入到列间下块令牌总线,下块令牌总线将令牌传递到经过顺序下一列中由下块地址指定的指令读缓冲块中第一条指令的锯齿字线上,打开该锯齿字线经过的所有读口,向执行单元输出相应指令。
22.如权利要求20所述的缓存系统,其特征在于,进一步包括:无缝拼接当前指令块与分支目标指令块中指令,使每个执行单元都被使用;控制器进一步为指令读缓冲提供分支指令地址以及分支目标地址;当分支预测为发生时,分支指令地址阻断锯齿字线,使分支指令的后续指令不被输出,令牌被注入到列间分支令牌总线,分支令牌总线将令牌传递到经过顺序下一列中由分支目标指令地址指定的指令的锯齿字线上,打开该锯齿字线经过的所有读口,向执行单元输出相应指令。
23.如权利要求20所述的缓存系统,其特征在于,进一步包括:由指令读缓冲和执行单元构成一个列,每一列有相应的控制器;在指令读缓冲的每个读口前增加一个选择器对字线来源进行选择以改变读口使能信号传递方向;所述使能信号来源包括:该列对应的控制模块送来的对应多指令多数据流处理模式的使能信号、该列的前一列同一行读口送来的对应单指令多数据流处理模式的使能信号、和该列的前一列上一行读口送来的对应指令级并行模式的使能信号;所述读口使能信号的产生方式是由指令读缓冲中译码器译码控制器送来的地址,或令牌传递。
24.一种缓存方法,将处理器核可能执行到的指令预先存储到指令读缓冲中,并根据处理器核对指令的执行结果,由指令读缓冲主动向处理器核输出指令供执行;
所述缓存方法进一步包括:由第一循迹指针前行到处理器核当前正在执行的指令之后第一条指令,并输出从所述第一条指令开始的复数条指令中的分支指令的目标指令的地址;
当所述第一条指令或所述目标指令尚未存储在指令读缓冲中时,控制指令存储器向指令读缓冲填充所述第一条指令或所述目标指令;和
控制指令读缓冲输出从所述第一条指令开始的复数条指令;
其特征在于,对所述复数条指令进行相关性检测,并根据相关性检测结果确定第一循迹指针的增量以更新读指针,以及根据相关性检测结果由处理器核执行所述复数条指令中的部分或全部。
25.如权利要求24所述的缓存方法,其特征在于,根据第一循迹指针向指令读缓冲输出所述第一条指令地址和下块指令地址,以控制指令读缓冲输出从所述第一条指令开始的连续地址复数条指令。
26.如权利要求25所述的缓存方法,其特征在于,指令读缓冲根据接收到所述第一条指令地址,将相应的锯齿字线设为有效,使能其经过的读口以输出从所述复数条指令。
27.如权利要求26所述的缓存方法,其特征在于,当所述锯齿字线上的有效信号到达指令块边界时,被发射到总线上,并由根据下块指令地址确定的指令块上的锯齿总线接收,使能其经过的读口以继续输出相应指令。
28.如权利要求24所述的缓存方法,其特征在于,根据第一循迹指针向指令读缓冲输出所述第一条指令地址及其下块指令地址和目标指令地址及其下块指令地址,以控制指令读缓冲输出从所述第一条指令开始直到第一条分支指令,以及从所述分支指令的分支目标指令开始的连续地址复数条指令。
29.如权利要求28所述的缓存方法,其特征在于,指令读缓冲根据接收到所述第一条指令地址,将相应的锯齿字线设为有效,使能其经过的读口以输出所述第一条指令开始直到第一条分支指令,并在所述锯齿字线上的有效信号到达所述第一条分支指令时,被发射到目标总线上,并由根据目标指令地址确定的指令块上的锯齿总线接收,使能其经过的读口以继续输出相应指令;和
当所述锯齿字线上的有效信号到达指令块边界时,被发射到总线上,并由根据下块指令地址确定的指令块上的锯齿总线接收,使能其经过的读口以继续输出相应指令。
30.如权利要求24所述的缓存方法,其特征在于,所述处理器核具有两组前端流水线和一组后端流水线;
根据所述第一循迹指针向指令读缓冲输出所述第一条指令地址及其下块指令地址和目标指令地址及其下块指令地址,以控制指令读缓冲输出从所述第一条指令的连续地址复数条指令到一组前端流水线执行;并控制指令读缓冲输出从所述第一条指令开始的第一条分支指令的分支目标指令开始的连续地址复数条指令到另一组前端流水线执行;和根据分支指令的执行结果选择所述两组前端流水线中的一组的执行结果供后端流水线执行。
31.如权利要求24所述的缓存方法,其特征在于,所述处理器核具有两组前端流水线和一组后端流水线;
根据第一循迹指针向指令读缓冲输出所述第一条指令地址及其下块指令地址和目标指令地址,以控制指令读缓冲输出从所述第一条指令的连续地址复数条指令到一组前端流水线执行;
根据第二循迹器向指令读缓冲输出所述目标指令的下块指令地址,以控制指令读缓冲输出从所述第一条分支指令的分支目标指令开始的连续地址复数条指令到另一组前端流水线执行;和
根据分支指令的执行结果选择所述两组前端流水线中的一组的执行结果供后端流水线执行。
32.如权利要求24所述的缓存方法,其特征在于,所述处理器核具有复数组前端流水线和一组后端流水线;
根据第一循迹指针向指令读缓冲输出所述第一条指令地址及其下块指令地址,以控制指令读缓冲输出从所述第一条指令开始的连续地址复数条指令到一组前端流水线执行;
根据第一循迹指针向指令读缓冲输出从所述第一条指令开始的连续地址复数条指令中所有分支指令的目标指令地址及其下块指令地址,分别控制指令读缓冲输出从每个目标指令开始的连续地址复数条指令到其他不同的前端流水线执行;所述分支指令的总数小于前端流水线的组数。
33.如权利要求24所述的缓存方法,其特征在于,所述处理器核具有复数组前端流水线和一组后端流水线;
根据第一循迹指针向指令读缓冲输出所述第一条指令地址及其下块指令地址,以控制指令读缓冲输出从所述第一条指令开始的连续地址复数条指令到一组前端流水线执行;
根据第一循迹指针向指令读缓冲输出从所述第一条指令开始的连续地址复数条指令中所有层次的分支指令的目标指令地址及其下块指令地址,分别控制指令读缓冲输出从所述所有层次分支指令的目标指令开始的连续地址复数条指令到其他不同的前端流水线执行;所述所有层次的分支指令的总数小于前端流水线的组数。
34.如权利要求32、33任一项所述的缓存方法,其特征在于,每组前端流水线构成一路,各组前端流水线中对应的执行单元构成一槽;
对从所述第一条指令开始的各路指令分别进行相关性检测,并根据各路相关性检测结果产生各路相应的读指针增量,以及根据各路相关性检测结果由相应路的前端流水线执行相应复数条指令中的部分或全部;
根据各路中分支指令的执行结果选择这些路中一路对应的前端流水线的执行结果供相应的后端流水线执行;和
根据各路中分支指令的执行结果选择这些路中一路对应的指令地址及读指针增量更新循迹器读指针。
35.如权利要求34所述的缓存方法,其特征在于,按路组织指令读缓冲;或按槽组织指令读缓冲。
36.如权利要求34所述的缓存方法,其特征在于,可以通过对相关性检测进行配置减少系统的最大发射数。
37.如权利要求24所述的缓存方法,其特征在于,将指令读缓冲中数据读取指令可能用到的数据事先填充到数据读缓冲中。
38.如权利要求37所述的缓存方法,其特征在于,所述数据读缓冲的表项与指令读缓冲中的表项一一对应,可以直接由数据读取指令在指令读缓冲中的位置信息直接在数据读缓冲中找到该数据读取指令对应的数据;或
所述数据读缓冲的表项数目少于指令读缓冲的表项数目,且指令读缓冲的每个表项包含一个指针;可以数据读取指令所在的指令读缓冲表项中的所述指针经译码器译码后确定对应数据在数据读缓冲中的位置,以找到对应数据。
39.如权利要求34所述的缓存方法,其特征在于,独立执行发射的复数条指令中的各分支指令以产生分支判断,按指令顺序排列所述分支判断以获得路径选择信号,以控制对执行路径的选择。
40.如权利要求39所述的缓存方法,其特征在于,进一步包括:将一段指令中的所有可能分支路径视为二叉树;以执行每条分支指令产生的分支判断在其对应二叉树节点上选择路径,以产生路径选择信号。
41.如权利要求39所述的缓存方法,其特征在于,进一步包括:下块指令字线由下块地址指定的当前或分支指令的特定顺序下个指令块中的顺序第一条指令,Z地址指定的指令发射槽开始发射一段连续指令直到最后一条指令发射槽;
定义每个指令读缓冲块的行数为n;块内偏移地址为BNY,其值范围为0-n-1,最上一行为0行;共有m列,列地址为BNZ,范围为0-m-1,最左面一列为0列,Z是当前地址发射时的列地址;则Z地址为:BNZ=n-BNY+Z,BNZ等于或大于m时无效。
42.如权利要求41所述的缓存方法,其特征在于,进一步包括:配置各指令相关性检测模块及将不需用的前端流水线,后端流水线置于无效,可以实现可调的发射宽度以适应不同程序对性能和功耗的要求。
43.如权利要求41所述的缓存方法,其特征在于,进一步包括:使用由锯齿总线控制的指令读缓冲,同时发射复数条顺序指令;使用轨道表中存储的将被执行的指令的分支目标信息及下块地址信息,控制多组上述指令读缓冲,平行发射指令由前端流水线初步处理因分支指令而导致的多条程序执行路径;检测上述多条程序执行路径的指令相关性以确定该多条路径在下一周期的地址增量;对被处理的分支指令进行分支判断,根据分支指令先后顺序,产生判断结果;对上述多组指令读缓冲提供的路径中被判断结果选定的路径的一组初步处理中间结果作进一步的处理,最后结合该组的指令之间的相关性,决定将该组中部分或全部指令正常完成,其余指令中断执行。
44.如权利要求43所述的缓存方法,其特征在于,进一步包括:将分支判断结果选定路径的起始第二地址与该路径的地址增量相加,如其和没有溢出指令读缓冲块边界,则其作为下一周期的第二地址,该路径起始地址中的第一地址作为下一周期的第一地址;如其和溢出了指令读缓冲块边界,则将其和中在指令读缓冲块界内部分作为下一周期的第二地址,该路径起始地址的下块地址作为下一周期的第一地址。
45.一种缓存方法,包括处理器核、指令缓存器和指令读缓冲,其中:
所述指令读缓冲存储复数个指令块及其对应的指令块地址;
将当前指令、顺序下一条指令以及分支目标指令的地址与指令读缓冲中所存储的指令块地址匹配,根据匹配结果输出相应指令供处理器执行;
如果分支目标指令块或顺序下一个指令块在指令读缓冲中不存在,则从指令缓存器中读取分支目标指令块或顺序下一个指令块,并写入到指令读缓冲中;
其特征在于,所述缓存系统进一步包含一个轨道表和一个循迹器,从指令缓存器的指令块中提取指令信息,存储到轨道表中对应该指令块的轨道中;
轨道表中的轨道与指令缓存器中的指令块一一对应,分支指令的轨道表项由分支指令的指令缓存器地址寻址,并存储分支目标指令的指令缓存器地址;
循迹器从轨道表中读取一个轨道,以该轨道的地址为当前指令块地址、以循迹器所指向的轨道表项地址作为当前块内偏移量,当前指令块地址和当前块内偏移量构成当前指令地址,并将当前指令地址提供给指令读缓冲;
根据所述轨道的结束表项为处理器核提供正在执行的指令块的顺序下一指令块地址;
循迹器读取当前执行指令之后的第一条分支指令对应轨道表项,并把该轨道表项的内容作为分支目标指令的地址;
下一时钟周期的当前地址由循迹器当前所指向的轨道表中分支类型以及处理器核所提供的分支判断确定。
46.如权利要求45所述缓存方法,其特征在于:
指令读缓冲按指令顺序在每个时钟周期向处理器核提供一条指令供其执行;
指令的顺序输出由指令读缓冲中各指令块的块内偏移量译码器对当前地址译码实现,或由令牌传递机制实现,其中令牌按照指令顺序排放并存储在指令读缓冲中对应的指令块中;
根据顺序下一个指令块地址,指令读缓冲在输出当前指令块最后一条指令的下一个时钟周期,自动输出顺序下一个指令块中的第一条指令;
根据分支预测或分支判断,指令读缓冲在输出分支指令的下一个时钟周期,自动输出顺序下一条指令或分支目标指令。
47.如权利要求46所述缓存方法,其特征在于:
指令读缓冲可以选择性地跳过指令,直接输出后续指令给执行单元,从而实现指令折叠;
指令跳越操作由令牌传递机制实现,其中令牌信号跳过被跳越指令对应的令牌传递器,直接传递到顺序下一个令牌传递器,或由一个增量来更新循迹器指针实现,使循迹器指针指向被跳越指令的顺序下一条指令,被跳过的指令不会被指令读缓冲输出给执行单元;
被跳越的指令包含分支指令,其中指令读缓冲通过独立读口提前输出分支指令给预处理器,并且根据分支预测或分支判断,输出分支指令的顺序下一条指令或分支目标指令给执行单元;
被跳越的指令进一步包括数据装载/存储指令,其中指令读缓冲通过独立读口提前输出数据装载/存储指令给数据引擎,并且输出数据装载/存储指令的顺序下一条指令给执行单元,由数据引擎执行装载/存储操作。
48.如权利要求45所述缓存方法,其特征在于:
指令读缓冲中的每一条指令构成一行,包含复数个相互独立的读口,指令可以按照需求从任意一个读口中读出;
位线连接指令读缓冲各指令的一个读口到执行单元,构成一列;
复数列构成多发射处理器结构,发射的最大指令数即为列数;
锯齿字线控制复数列中复数个读口输出复数条连续指令供并行执行;
复数列中的复数个执行单元共享数据存储器。
49.如权利要求48所述缓存方法,其特征在于:
如果一个指令块中可执行的指令数少于列数,指令读缓冲在同一时钟周期内同时输出顺序下一个指令块中的指令以充分利用处理器资源;
如果指令块中存在可执行的分支指令,并且该分支指令预测为分支成功,则指令读缓冲输出分支目标指令以及其后续指令以充分利用处理器资源,而不输出分支指令的后续指令。
50.如权利要求47所述缓存方法,进一步包含:
对每一列中的复数条指令进行相关性检测,根据相关性检测的结果和相关指令的位置反馈一个地址增量;
根据该地址增量确定指令读缓冲下次输出连续指令的起始地址;
执行单元根据相关性检查结果执行复数条顺序指令中的一部分或全部;
通过对相关性检测的配置,控制最大指令发射数以调节功耗。
51.如权利要求45所述缓存方法,其特征在于:
处理器中的流水线可以分为前端流水线和后端流水线,前端流水线包含产生分支判断的流水线段,后端流水线包含产生分支判断后的流水线段;
处理器含有两组前端流水线和一组后端流水线,每组前端流水线都对应一个指令读缓冲;
每一组前端流水线执行单条或复数条顺序指令;
一个指令读缓冲输出从当前地址起的单条或复数条顺序指令到对应的前端流水线以供执行;
另一个指令读缓冲输出从当前地址之后第一条分支指令的分支目标指令起的单条或复数条顺序指令到另一前端流水线执行;
根据上述第一条分支指令的分支判断,选择两个前端流水线执行结果中的一个送往后端流水线继续执行;
根据所述分支判断确定指令读缓冲下次的起始地址。
52.如权利要求45所述缓存方法,其特征在于:
指令读缓冲含有独立读口,提前输出数据装载指令到数据引擎;
数据引擎提前装载数据到数据读缓冲;
数据读缓冲中的表项与指令读缓冲中的表项相互关联、一一对应,或数据装载指令对应的指令读缓冲表项中存储其对应数据读缓冲表项的地址;
指令由指令引擎推送给处理器核,指令引擎包含轨道表、循迹器以及指令读缓冲;
当指令读缓冲推送数据装载指令给执行单元时,与该数据装载指令相关的数据也被推送到执行单元。
53.如权利要求50所述缓存方法,其特征在于:
指令读缓冲含有令牌传递机制,令牌信号可以通过对角字线控制输出复数条顺序指令;
当令牌信号通过对角字线到达预测为分支成功的分支指令所在的列时,使对角字线的剩余部分失效并将令牌信号传递到含有分支目标指令的指令块,使能从分支目标指令开始的对角字线,从而指令读缓冲可以在一个时钟周期内同时发射分支指令和分支目标指令及其后续指令;
当令牌信号通过对角字线在某一列到达一个指令块的最后一条指令时,将令牌信号传递到指令顺序下一个指令块,使能从该指令块下一列第一行开始的对角字线,从而指令读缓冲可以在同一个时钟周期内同时发射位于不同指令块内的顺序指令;
根据相关性检查的结果控制令牌传递和复数条顺序指令的输出。
54.如权利要求50所述缓存方法,其特征在于:
循迹器控制指令读缓冲同时输出复数条指令供处理器核执行;
根据指令块的行数、指令读缓冲的列数、起始地址或分支目标指令地址,生成顺序下一条指令或分支目标指令的列地址;
通过将起始地址与指令读缓冲中的指令块匹配来选中一个指令块,选中的指令块译码块内偏移量和起始地址中的列地址来使能对应块内偏移量和列地址的对角字线,输出复数条指令供处理器核执行;
下一时钟周期的起始地址通过对分支判断所确定的地址增量和起始地址求和得到。
55.如权利要求48所述缓存方法,其特征在于:
将从起始指令地址开始的n条顺序指令,及该n条顺序指令的可能分支目标指令及其分支目标指令,根据分支指令在指令二叉树所处的位置将指令分为不同的路,同时发射;独立执行上述同时发射的复数条指令;检测指令之间的相关性,终止执行有相关性的指令及同一路的后续指令;并根据指令间有无相关性及相关指令的位置为每路反馈一个路地址增量;对被执行的各分支指令独立做出分支判断;根据所有各独立分支判断按指令顺序优先权决定本周期执行的路;根据决定的路选择上述同时发射的指令中n条完整执行并正常退出,其余指令终止执行;以决定的路本周地址与该路的增量相加的和为下周的起始块内地址,如果和未超出块边界,则以该决定的路的本周地址为下周的起始块地址,如果和超出了块边界,则以该决定的路的下块地址为下周的起始块地址;以从下周的起始块地址与下周的起始块内地址开始的n条顺序指令,及该n条顺序指令的可能分支目标指令及其分支目标指令同时发射,如此周而复始。
56.如权利要求55所述缓存方法,并行执行复数条顺序指令及此复数条指令中各分支指令的分支目标指令及分支目标指令的后续指令,其特征在于:
将所述指令中因分支指令而导致的可能不同程序执行路径定义为“路”,将所述指令按指令执行顺序定义“指令发射槽”;
各指令发射槽依其对应的指令顺序有递增数目的路,其中一路从第一槽起始,每一槽以分支目标指令开始的路从其分支指令的顺序下一槽起始;
指令读缓冲对应各槽中每一路的指令都有独立的位线连接该路专用的读口至前端流水线,对角字线控制同一路中各槽的读口,各槽都有其专用的后端流水线;
循迹器提供起始地址,轨道表提供相应各路分支目标地址;
根据起始地址及各路分支目标地址,结束轨道表项存储器提供各路的下块地址,指令读缓存计算各路下块地址的开始槽位置;
上述各路地址及各路下块地址使能指令读缓冲中的各相应对角字线,控制各读口输出每一槽中各有效的路指令供相应的前端流水线处理;
检测每一路中各指令之间的相关性,并根据指令间有无相关性及相关指令的位置为每路反馈一个路地址增量;
对被执行的各分支指令独立作出分支判断,根据各独立分支判断按分支指令顺序优先选定本周期及下一周期执行的路;
根据所述选定的路选择各指令槽中该路前端流水线的无相关中间结果供各槽的后端流水线完整执行并正常退出,也选择从顺序第一槽开始直到产生该路的分支指令路径上的前端流水线的无相关中间结果供各槽的后端流水线完整执行并正常退出,其余指令终止执行;
对所述选定的路的本周起始地址与该路地址增量相加得到下一周期的起始地址;
当所述相关性检测可配置时,可以根据配置减少系统的最大指令发射数。
57.如权利要求55所述的缓存方法,其特征在于:
并行执行复数条顺序指令及此复数指令中各分支指令的分支目标指令及分支目标指令的后续指令,以及各分支目标指令及分支目标指令的后续指令中所有分支指令的分支目标指令及其后续指令;
执行路径按照二叉树组织,每一个指令发射槽中的路数是其顺序前一个发射槽路数的两倍,从分支目标指令开始的路与分支指令之后的路相对应;
根据起始地址,多端口轨道表提供相应各路分支目标地址;
根据各路分支目标地址,多端口轨道表提供所述各路分支目标指令及其后续指令中的分支指令的相应各路分支目标地址;
根据起始地址及各路分支目标地址,结束轨道表项存储器提供各路的下块地址,指令读缓存计算各路下块地址的开始槽位置;
上述各路地址及各路下块地址使能指令读缓冲中的各相应对角字线,控制各读口输出每一槽中各有效的路指令供相应的前端流水线处理;
检测每一路中各指令之间的相关性,并根据指令间有无相关性及相关指令的位置为每路反馈一个路地址增量;
对被执行的各分支指令独立作出分支判断,根据各独立分支判断按分支指令顺序优先选定本周期及下一周期执行的路;
根据所述选定的路选择各指令槽中该路前端流水线的无相关中间结果供各槽的后端流水线完整执行并正常退出,也选择从顺序第一槽开始直到产生该路的分支指令路径上的前端流水线的无相关中间结果供各槽的后端流水线完整执行并正常退出,其余指令终止执行;
对所述选定的路的本周起始地址与该路地址增量相加得到下一周期的起始地址;
当所述相关性检测可配置时,可以根据配置减少系统的最大指令发射数。
58.如权利要求55、56、57任一项所述的缓存方法,其特征在于:
联合缓冲器存储指令及从指令中提取得到的指令信息,所存指令信息与所存指令一一对应;
根据起始地址,联合缓冲器提供相应各路指令,各路中的分支目标地址及提供各路的下块地址;
根据所述各路分支地址,联合缓冲器进一步提供相应指令,各路分支中的分支目标地址及提供各路分支的下块地址;
上述起始地址,分支目标地址,及下块地址分别使能联合缓冲器中各相应指令对角字线,向相应前端流水线输出指令。
59.如权利要求55、56、57任一项所述的缓存方法,其特征在于:
指令读缓冲及执行单元可以按路组织;或
按执行槽组织。
60.如权利要求55、56、57任一项所述的缓存方法,其特征在于,还包括:根据起始块内偏移地址与块内指令条数确定下块指令的发射槽;具体地定义每个指令读缓冲块的行数为n;块内偏移地址为BNY,其值范围为0~n-1,最上一行为0行;共有m槽,范围为0~m-1,最左面为0槽;共有w路,范围为0~w-1,最左面为0路;根据((m-w)-(n-BNY)-1)所得的值作为下块指令的起始发射槽,将下块地址送至该槽使能一条对角字线,所述对角字线至少控制下块地址对应的指令读缓冲块中第一条指令读出。

说明书全文

基于指令读缓冲的缓存系统和方法

技术领域

[0001] 本发明涉及计算机,通讯及集成电路领域。

背景技术

[0002] 通常缓存的作用是将更低级存储器中的部分内容复制在其中,使这些内容能被更高级存储器或处理器核快速存取,以保证流线的持续运行。
[0003] 现行缓存的寻址都基于以下方式,用地址中的索引段寻址读出标签存储器中的标签与地址中的标签段进行匹配;用地址中索引段与内位移段共同寻址读出缓存中的内容。如果从标签存储器中读出的标签与地址中的标签段相同,那么从缓存中读出的内容有效,称为缓存命中。否则,如果从标签存储器中读出的标签与地址中的标签段不相同,称为缓存缺失,从缓存中读出的内容无效。对于多路组相联的缓存,同时对各个路组并行进行上述操作,以检测哪个路组缓存命中。命中路组对应的读出内容为有效内容。若所有路组都为缺失,则所有读出内容都无效。缓存缺失之后,缓存控制逻辑将低级存储媒介中的内容填充到缓存中。
[0004] 缓存缺失可分为三类状况:强制缺失、冲突缺失和容量缺失。在现有缓存结构中,除了预取成功的小部分内容外,强制缺失是不可避免的。但是,现有的预取操作会带来不小的代价。此外,虽然多路组相联缓存可以降低冲突缺失,但受制于功耗及速度限制(如因为多路组相联缓存结构要求将所有路组由同一索引寻址的内容及标签同时读出并比较),路组数难以超过一定数目。
[0005] 现代的缓存系统通常由多路组相连的多层次缓存构成。新的缓存结构,如:牺牲缓存、跟踪缓存以及预取等都是基于上述基本缓存结构并改善上述结构。然而,随着日渐扩大的处理器/存储器速度鸿沟,现行体系结构,特别是多种缓存缺失,已成为是制约现代处理器性能提升的最严重瓶颈
[0006] 本发明提出的方法与系统装置能直接解决上述或其他的一个或多个困难。

发明内容

[0007] 本发明提出了一种指令缓存系统,其特征在于,包括:处理器核,所述处理器核用以执行指令;指令存储器,所述指令存储器用以存储指令;指令读缓冲,所述指令读缓冲主动向处理器输出指令供执行。
[0008] 可选的,所述指令读缓冲根据处理器核对指令的执行结果,主动向处理器核输出指令供执行。
[0009] 可选的,所述指令读缓冲中的每一条指令对应一个令牌传递器,所述令牌传递器用于传递令牌;所述指令读缓冲主动向处理器核输出令牌所在的令牌传递器对应的指令供处理器核执行。
[0010] 可选的,当按地址顺序执行同一指令块内的指令时,所述令牌从当前令牌传递器向地址相邻的下一个令牌传递器传递。
[0011] 可选的,当执行不同指令块中的指令时,所述令牌通过全局总线当前令牌传递器向相应的令牌传递器传递。
[0012] 可选的,当执行不同指令块中的指令时,对所有令牌传递器复位,并将令牌注入分支目标指令对应的令牌传递器。
[0013] 可选的,所述指令读缓冲主动向处理器核输出包含令牌所在的令牌传递器对应的指令在内的复数条指令供处理器核同时执行。
[0014] 可选的,所述复数条指令位于同一个指令块。
[0015] 可选的,所述复数条指令位于不同指令块。
[0016] 可选的,对所述复数条指令进行相关性检测,并根据相关性检测结果将令牌传递到相应的令牌传递器,以及根据相关性检测结果由处理器核执行所述复数条指令中的部分或全部。
[0017] 可选的,所述指令缓存系统进一步包括:循迹器,所述循迹器前行到处理器核当前正在执行的指令之后的第一个分支指令,并输出该分支指令的下一指令的地址和目标指令的地址;和当所述下一指令或目标指令尚未存储在指令读缓冲中时,控制指令存储器向指令读缓冲填充所述下一指令或目标指令。
[0018] 可选的,所述循迹器前行到处理器核当前正在执行的指令之后的若干个分支指令,并输出所述若干分支指令的所有下一指令的地址和目标指令的地址; 和当所述所有下一指令或目标指令尚未存储在指令读缓冲中时,控制指令存储器向指令读缓冲填充所述下一指令或目标指令。
[0019] 可选的,所述处理器核具有两个前端流水线和一个后端流水线;所述指令读缓冲同时向处理器核输出所述分支指令的下一指令和目标指令供所述两个前端流水线同时执行;和根据分支指令的执行结果选择所述两个前端流水线中的一个的执行结果供后端流水线执行。
[0020] 本发明提出了一种指令缓存方法,其特征在于,将处理器核可能执行到的指令预先存储到指令读缓冲中,并根据处理器核对指令的执行结果,由指令读缓冲主动向处理器核输出指令供执行。
[0021] 可选的,根据处理器核对指令的执行结果传递令牌,并向处理器核输出所述令牌对应的指令供执行。
[0022] 可选的,根据处理器核对指令的执行结果传递令牌,并向处理器核输出包含所述令牌对应的指令在内的复数条指令供执行。
[0023] 可选的,对所述复数条指令进行相关性检测,并根据相关性检测结果传递令牌,以及根据相关性检测结果由处理器核执行所述复数条指令中的部分或全部。
[0024] 可选的,在处理器核执行到分支指令之前,提前将所述分支指令的下一指令和目标指令填充到指令读缓冲中。
[0025] 可选的,所述处理器核具有两个前端流水线和一个后端流水线;由所述两个前端流水线同时执行所述分支指令的下一指令和目标指令;和根据分支指令的执行结果选择所述两个前端流水线中的一个的执行结果供后端流水线执行。
[0026] 可选的,所述系统进一步包括:第一循迹器,所述第一循迹器的读指针前行到处理器核当前正在执行的指令之后第一条指令,并输出从所述第一条指令开始的复数条指令中的分支指令的目标指令的地址;当所述第一条指令或所述目标指令尚未存储在指令读缓冲中时,控制指令存储器向指令读缓冲填充所述所述第一条指令或所述目标指令;控制指令读缓冲输出从所述第一条指令开始的复数条指令。
[0027] 可选的,在所述系统中,由相关性检测模块对所述复数条指令进行相关性检测,并根据相关性检测结果确定第一循迹器读指针的增量以更新读指针,以 及根据相关性检测结果由处理器核执行所述复数条指令中的部分或全部。
[0028] 可选的,在所述系统中,由第一循迹器向指令读缓冲输出所述第一条指令地址和下块指令地址,以控制指令读缓冲输出从所述第一条指令开始的连续地址复数条指令。
[0029] 可选的,在所述系统中,指令读缓冲根据接收到所述第一条指令地址,将相应的锯齿字线设为有效,使能其经过的读口以输出从所述复数条指令。
[0030] 可选的,在所述系统中,当所述锯齿字线上的有效信号到达指令块边界时,被发射到总线上,并由根据下块指令地址确定的指令块上的锯齿总线接收,使能其经过的读口以继续输出相应指令。
[0031] 可选的,在所述系统中,由第一循迹器向指令读缓冲输出所述第一条指令地址及其下块指令地址和目标指令地址及其下块指令地址,以控制指令读缓冲输出从所述第一条指令开始直到第一条分支指令,以及从所述分支指令的分支目标指令开始的连续地址复数条指令。
[0032] 可选的,在所述系统中,指令读缓冲根据接收到所述第一条指令地址,将相应的锯齿字线设为有效,使能其经过的读口以输出所述第一条指令开始直到第一条分支指令,并在所述锯齿字线上的有效信号到达所述第一条分支指令时,被发射到目标总线上,并由根据目标指令地址确定的指令块上的锯齿总线接收,使能其经过的读口以继续输出相应指令;在上述过程中,当所述锯齿字线上的有效信号到达指令块边界时,被发射到总线上,并由根据下块指令地址确定的指令块上的锯齿总线接收,使能其经过的读口以继续输出相应指令。
[0033] 可选的,在所述系统中,所述处理器核具有两组前端流水线和一组后端流水线;所述第一循迹器向指令读缓冲输出所述第一条指令地址及其下块指令地址和目标指令地址及其下块指令地址,以控制指令读缓冲输出从所述第一条指令的连续地址复数条指令到一组前端流水线执行;并控制指令读缓冲输出从所述第一条指令开始的第一条分支指令的分支目标指令开始的连续地址复数条指令到另一组前端流水线执行;根据分支指令的执行结果选择所述两组前端流水线中的一组的执行结果供后端流水线执行。
[0034] 可选的,在所述系统中,所述处理器核具有两组前端流水线和一组后端流水线;所述系统还可以包括一个第二循迹器;所述第一循迹器向指令读缓冲输 出所述第一条指令地址及其下块指令地址和目标指令地址,以控制指令读缓冲输出从所述第一条指令的连续地址复数条指令到一组前端流水线执行;所述第二循迹器向指令读缓冲输出所述目标指令的下块指令地址,以控制指令读缓冲输出从所述第一条分支指令的分支目标指令开始的连续地址复数条指令到另一组前端流水线执行;根据分支指令的执行结果选择所述两组前端流水线中的一组的执行结果供后端流水线执行。
[0035] 可选的,在所述系统中,所述处理器核具有复数组前端流水线和一组后端流水线;所述第一循迹器向指令读缓冲输出所述第一条指令地址及其下块指令地址,以控制指令读缓冲输出从所述第一条指令开始的连续地址复数条指令到一组前端流水线执行;所述第一循迹器还向指令读缓冲输出从所述第一条指令开始的连续地址复数条指令中所有分支指令的目标指令地址及其下块指令地址,分别控制指令读缓冲输出从每个目标指令开始的连续地址复数条指令到其他不同的前端流水线执行;所述分支指令的总数小于前端流水线的组数。
[0036] 可选的,在所述系统中,所述处理器核具有复数组前端流水线和一组后端流水线;所述第一循迹器向指令读缓冲输出所述第一条指令地址及其下块指令地址,以控制指令读缓冲输出从所述第一条指令开始的连续地址复数条指令到一组前端流水线执行;所述第一循迹器还向指令读缓冲输出从所述第一条指令开始的连续地址复数条指令中所有层次的分支指令的目标指令地址及其下块指令地址,分别控制指令读缓冲输出从所述所有层次分支指令的目标指令开始的连续地址复数条指令到其他不同的前端流水线执行;所述所有层次的分支指令的总数小于前端流水线的组数。
[0037] 可选的,在所述系统中,每组前端流水线构成一路(way),各组前端流水线中对应的执行单元构成一槽(slot);由相关性检测模块对从所述第一条指令开始的各路指令分别进行相关性检测,并根据各路相关性检测结果产生各路相应的读指针增量,以及根据各路相关性检测结果由相应路的前端流水线执行相应复数条指令中的部分或全部;根据各路中分支指令的执行结果选择这些路中一路对应的前端流水线的执行结果供相应的后端流水线执行;根据各路中分支指令的执行结果选择这些路中一路对应的指令地址及读指针增量更新循迹器读指针。
[0038] 可选的,在所述系统中,按路组织指令读缓冲;或按槽组织指令读缓冲。
[0039] 可选的,在所述系统中,所述相关性检测模块是可配置的,可以根据配置减少系统的最大发射数。
[0040] 可选的,所述系统还包括数据读缓冲和数据引擎;所述数据引擎将指令读缓冲中数据读取指令可能用到的数据事先填充到数据读缓冲中。
[0041] 可选的,在所述系统中,所述数据读缓冲的表项与指令读缓冲中的表项一一对应,可以直接由数据读取指令在指令读缓冲中的位置信息直接在数据读缓冲中找到该数据读取指令对应的数据;或所述数据读缓冲的表项数目少于指令读缓冲的表项数目,且指令读缓冲的每个表项包含一个指针;可以数据读取指令所在的指令读缓冲表项中的所述指针经译码器译码后确定对应数据在数据读缓冲中的位置,以找到对应数据。
[0042] 可选的,所述方法进一步包括:由第一循迹指针前行到处理器核当前正在执行的指令之后第一条指令,并输出从所述第一条指令开始的复数条指令中的分支指令的目标指令的地址;当所述第一条指令或所述目标指令尚未存储在指令读缓冲中时,控制指令存储器向指令读缓冲填充所述所述第一条指令或所述目标指令;控制指令读缓冲输出从所述第一条指令开始的复数条指令。
[0043] 可选的,在所述方法中,对所述复数条指令进行相关性检测,并根据相关性检测结果确定第一循迹指针的增量以更新读指针,以及根据相关性检测结果由处理器核执行所述复数条指令中的部分或全部。
[0044] 可选的,在所述方法中,根据第一循迹指针向指令读缓冲输出所述第一条指令地址和下块指令地址,以控制指令读缓冲输出从所述第一条指令开始的连续地址复数条指令。
[0045] 可选的,在所述方法中,指令读缓冲根据接收到所述第一条指令地址,将相应的锯齿字线设为有效,使能其经过的读口以输出从所述复数条指令。
[0046] 可选的,在所述方法中,当所述锯齿字线上的有效信号到达指令块边界时,被发射到总线上,并由根据下块指令地址确定的指令块上的锯齿总线接收,使能其经过的读口以继续输出相应指令。
[0047] 可选的,在所述方法中,根据第一循迹指针向指令读缓冲输出所述第一条指令地址及其下块指令地址和目标指令地址及其下块指令地址,以控制指令读 缓冲输出从所述第一条指令开始直到第一条分支指令,以及从所述分支指令的分支目标指令开始的连续地址复数条指令。
[0048] 可选的,在所述方法中,指令读缓冲根据接收到所述第一条指令地址,将相应的锯齿字线设为有效,使能其经过的读口以输出所述第一条指令开始直到第一条分支指令,并在所述锯齿字线上的有效信号到达所述第一条分支指令时,被发射到目标总线上,并由根据目标指令地址确定的指令块上的锯齿总线接收,使能其经过的读口以继续输出相应指令;在上述过程中,当所述锯齿字线上的有效信号到达指令块边界时,被发射到总线上,并由根据下块指令地址确定的指令块上的锯齿总线接收,使能其经过的读口以继续输出相应指令。
[0049] 可选的,在所述方法中,所述处理器核具有两组前端流水线和一组后端流水线;根据所述第一循迹指针向指令读缓冲输出所述第一条指令地址及其下块指令地址和目标指令地址及其下块指令地址,以控制指令读缓冲输出从所述第一条指令的连续地址复数条指令到一组前端流水线执行;并控制指令读缓冲输出从所述第一条指令开始的第一条分支指令的分支目标指令开始的连续地址复数条指令到另一组前端流水线执行;根据分支指令的执行结果选择所述两组前端流水线中的一组的执行结果供后端流水线执行。
[0050] 可选的,在所述方法中,所述处理器核具有两组前端流水线和一组后端流水线;根据第一循迹指针向指令读缓冲输出所述第一条指令地址及其下块指令地址和目标指令地址,以控制指令读缓冲输出从所述第一条指令的连续地址复数条指令到一组前端流水线执行;根据第二循迹器向指令读缓冲输出所述目标指令的下块指令地址,以控制指令读缓冲输出从所述第一条分支指令的分支目标指令开始的连续地址复数条指令到另一组前端流水线执行;根据分支指令的执行结果选择所述两组前端流水线中的一组的执行结果供后端流水线执行。
[0051] 可选的,在所述方法中,所述处理器核具有复数组前端流水线和一组后端流水线;根据第一循迹指针向指令读缓冲输出所述第一条指令地址及其下块指令地址,以控制指令读缓冲输出从所述第一条指令开始的连续地址复数条指令到一组前端流水线执行;根据第一循迹指针向指令读缓冲输出从所述第一条指令开始的连续地址复数条指令中所有分支指令的目标指令地址及其下块指令地址,分别控制指令读缓冲输出从每个目标指令开始的连续地址复数条指令到其 他不同的前端流水线执行;所述分支指令的总数小于前端流水线的组数。
[0052] 可选的,在所述方法中,所述处理器核具有复数组前端流水线和一组后端流水线;根据第一循迹指针向指令读缓冲输出所述第一条指令地址及其下块指令地址,以控制指令读缓冲输出从所述第一条指令开始的连续地址复数条指令到一组前端流水线执行;根据第一循迹指针向指令读缓冲输出从所述第一条指令开始的连续地址复数条指令中所有层次的分支指令的目标指令地址及其下块指令地址,分别控制指令读缓冲输出从所述所有层次分支指令的目标指令开始的连续地址复数条指令到其他不同的前端流水线执行;所述所有层次的分支指令的总数小于前端流水线的组数。
[0053] 可选的,在所述方法中,每组前端流水线构成一路(way),各组前端流水线中对应的执行单元构成一槽(slot);对从所述第一条指令开始的各路指令分别进行相关性检测,并根据各路相关性检测结果产生各路相应的读指针增量,以及根据各路相关性检测结果由相应路的前端流水线执行相应复数条指令中的部分或全部;根据各路中分支指令的执行结果选择这些路中一路对应的前端流水线的执行结果供相应的后端流水线执行;根据各路中分支指令的执行结果选择这些路中一路对应的指令地址及读指针增量更新循迹器读指针。
[0054] 可选的,在所述方法中,按路组织指令读缓冲;或按槽组织指令读缓冲。
[0055] 可选的,在所述方法中,可以通过对相关性检测进行配置减少系统的最大发射数。
[0056] 可选的,在所述方法中,将指令读缓冲中数据读取指令可能用到的数据事先填充到数据读缓冲中。
[0057] 可选的,在所述方法中,所述数据读缓冲的表项与指令读缓冲中的表项一一对应,可以直接由数据读取指令在指令读缓冲中的位置信息直接在数据读缓冲中找到该数据读取指令对应的数据;或所述数据读缓冲的表项数目少于指令读缓冲的表项数目,且指令读缓冲的每个表项包含一个指针;可以数据读取指令所在的指令读缓冲表项中的所述指针经译码器译码后确定对应数据在数据读缓冲中的位置,以找到对应数据。
[0058] 对于本领域专业人士,还可以在本发明的说明、权利要求附图的启发下,理解、领会本发明所包含其他方面内容。
[0059] 有益效果
[0060] 本发明所述系统和方法可以为数字系统使用的缓存结构提供基本的解决方案。与传统缓存系统仅在缓存缺失后才填充的机制不同,本发明所述的系统和方法在处理器执行一条指令之前就对指令缓存系统中的指令读缓冲进行填充,可以避免或充分地隐藏强制缺失。本发明所述系统和方法在本质上提供了一个全相联的缓存结构,避免了或充分隐藏了冲突缺失和容量缺失。此外,本发明所述的系统和方法能由指令读缓冲主动向处理器核输出指令供执行,避免了在读取缓存的时延关键路径上的标签匹配,所以能运行在较高的时钟频率,且功耗也比传统缓存系统显著降低。对于本领域专业人士而言,本发明的其他优点和应用是显见的。

附图说明

[0061] 图1A是包含本发明所述指令缓存系统的一个基本处理器系统;
[0062] 图1B是本发明所述改进的程序计数器;
[0063] 图2是包含本发明所述指令缓存系统的一个处理器系统;
[0064] 图3A是本发明所述主动表的实施例
[0065] 图3B是本发明所述轨迹点格式的实施例;
[0066] 图3C是根据本发明技术方案使用轨道表建立新轨道的方法的一个实施例;
[0067] 图3D是确定基地址寄存器值更新指令位置的实施例;
[0068] 图3E是本发明所述循迹器读指针移动的实施例;
[0069] 图4A是本发明所述填充指令读缓冲及由指令读缓冲直接向处理器核提供指令以供执行的示意图;
[0070] 图4B是本发明所述填充指令读缓冲及由指令读缓冲直接向处理器核提供指令以供执行的实施例;
[0071] 图4C是本发明所述控制单元进行匹配的一个实施例;
[0072] 图5A是本发明所述指令读缓冲中除第一条指令和最后一条指令对应的令牌传递器的一个实施例;
[0073] 图5B是本发明所述指令读缓冲中指令块的最后一条指令对应的令牌传递器的实施例;
[0074] 图5C是本发明所述指令读缓冲中指令块的第一条指令对应的令牌传递器的实施例;
[0075] 图6A是本发明所述向指令读缓冲填充两层分支目标指令块的实施例;
[0076] 图6B是本发明所述向指令读缓冲填充的两层分支目标指令块的示意图;
[0077] 图7A是令牌传递机制及轨道表、循迹器结合由指令缓冲向处理器核提供指令供其执行的实施例;
[0078] 图7B是本发明所述源译码器的一个实施例;
[0079] 图8是本发明所述动态预测的一种实施例;
[0080] 图9A是指令读缓冲中每一条指令对应的改进的令牌传递器的一个实施例;
[0081] 图9B是用从指令缓冲器中提前流出的指令译码控制指令折叠的一个实施例;
[0082] 图9C是用从指令缓冲器中提前流出的指令译码控制指令折叠的另一个实施例;
[0083] 图10A是本发明所述传递令牌信号的另一种实施例;
[0084] 图10B是本发明所述无分支损失的处理器环境实施例的一个示意图;
[0085] 图11是本发明所述指令级并行结构中指令读缓冲同时输出顺序多条指令供处理器核执行的实施例;
[0086] 图12A和图12B是本发明所述无损失分支转移的实施例;
[0087] 图13是本发明所述处理器系统的另一个实施例;
[0088] 图14是本发明所述指令地址产生模块的一个实施例;
[0089] 图15是支持多种指令集的基于指令读缓冲的多核处理器的实施例;
[0090] 图16A是本发明所述指令级并行结构中指令读缓冲同时输出顺序多条指令供处理器核执行的另一个实施例;
[0091] 图16B是本发明所述分支目标选择模块的一个实施例;
[0092] 图17是本发明所述指令级并行结构中指令读缓冲同时输出顺序多条指令供处理器核执行的另一个实施例;
[0093] 图18A是本发明所述包含数据读缓冲的处理器系统的一个实施例;
[0094] 图18B是本发明所述包含数据读缓冲的处理器系统的另一个实施例;
[0095] 图18C是本发明所述包含数据读缓冲的处理器系统的另一个实施例;
[0096] 图18D是本发明所述包含数据读缓冲的处理器系统的另一个实施例;
[0097] 图19A是本发明所述多发射指令读缓冲的一个实施例;
[0098] 图19B是本发明所述多发射指令读缓冲的另一个实施例;
[0099] 图20A是本发明所述令牌选择器的一个实施例;
[0100] 图20B是本发明所述以多指令多数据流处理模式运行的车道处理器的一个实施例;
[0101] 图20C是本发明所述以单指令多数据流处理模式运行的车道处理器的一个实施例;
[0102] 图20D是本发明所述以指令级并行模式运行的车道处理器的一个实施例;
[0103] 图21是本发明所述实现无损失分支处理的指令读缓冲结构;
[0104] 图22是本发明所述实现无损失分支处理的包含指令读缓冲的系统的一个实施例;
[0105] 图23是本发明所述实现无损失分支处理的包含指令读缓冲的系统的另一个实施例;
[0106] 图24A是本发明所述地址译码控制方法的指令读缓冲的一个实施例;
[0107] 图24B是本发明所述地址译码控制方法的指令读缓冲的另一个实施例;
[0108] 图24C是用于本发明所述指令读缓冲结构的指令序列的一个实施例;
[0109] 图24D是以指令地址为轴线显示的指令序列的一个实施例;
[0110] 图25是使用本发明所述地址译码控制方法的处理器的一个实施例;
[0111] 图26A是一段指令中的各分支路径以二叉数表示的示意图;
[0112] 图26B是一段指令中的所有可能分支路径以完整二叉数表示的示意图;
[0113] 图26C是二叉树图的扩展示意图;
[0114] 图26D是优先权编码器2596的一种实现方式;
[0115] 图27是使用本发明所述地址译码控制方法的处理器的另一个实施例;
[0116] 图28是本发明所述可配置的相关性检测模块的一个实施例;
[0117] 图29是按本发明所述发射槽组织的指令读缓冲器的结构;
[0118] 图30是使用本发明所述地址译码控制方法的处理器的另一个实施例;
[0119] 图31是使用本发明所述地址译码控制方法的处理器的另一个实施例;
[0120] 图32是本发明所述联合缓冲器的一个实施例;
[0121] 图33是本发明所述处理器系统完整结构的一个实施例。

具体实施方式

[0122] 以下结合附图和具体实施例对本发明提出的高性能缓存系统和方法作进一步详细说明。根据下面说明和权利要求书,本发明的优点和特征将更清楚。需说明的是,附图均采用非常简化的形式且均使用非精准的比例,仅用以方便、明晰地辅助说明本发明实施例的目的。
[0123] 需说明的是,为了清楚地说明本发明的内容,本发明特举多个实施例以进一步阐释本发明的不同实现方式,其中,该多个实施例是列举式并非穷举式。此外,为了说明的简洁,前实施例中已提及的内容往往在后实施例中予以省略,因此,后实施例中未提及的内容可相应参考前实施例。
[0124] 虽然该发明可以以多种形式的修改和替换来扩展,说明书中也列出了一些具体的实施图例并进行详细阐述。应当理解的是,发明者的出发点不是将该发明限于所阐述的特定实施例,正相反,发明者的出发点在于保护所有基于由本权利声明定义的精神或范围内进行的改进、等效转换和修改。同样的元器件号码可能被用于所有附图以代表相同的或类似的部分。
[0125] 此外,在本说明书中以包含处理器核的缓存系统为例进行说明,但本发明技术方案也可以被应用于包含任何合适的处理器(Processor)的缓存系统。例如,所述处理器可以是通用处理器(General Processor)中央处理器(CPU)、微控制器(MCU)、数字信号处理器(DSP)、图象处理器(GPU)、片上系统(SOC)、专用集成电路(ASIC)等。
[0126] 本发明所述的指令地址(Instruction Address)指的是指令在主存储器中的存储地址,即可以根据该地址在主存储器中找到这条指令;而数据地址(Data Address)指的是数据在主存储器中的存储地址,即可以根据该地址在主存储器中找到这个数据。在此为简单明了起见,均假设虚拟地址等于物理地址,对于需要进行地址映射的情况,本发明所述方法也可适用。在本发明中,当前指令可以指当前正在被处理器核执行或获取的指令;当前指令块可以指含有当前正被处理器执行的指令的指令块。
[0127] 请参考图1A,其为包含本发明所述指令缓存系统的一个基本处理器系统。在图1A中,指令缓存系统101包含用于存储指令的指令存储器(Instruction Memory)103和用于存储地址标签(TAG)的标签存储器105。应当理解的是,这里列出各种部件的目的是为了便于描述,还可以包含其他部件,而某些部件可以被省略。这里的各种部件可以分布在多个系统中,可以是物理上存在的或是虚拟的,可以是硬件实现(如:集成电路)、软件实现或由硬件和软件组合实现。
[0128] 当处理器核(CPU Core)111执行一条指令时,处理器核111首先需要从更低层次的存储器中读入指令。在这里,存储器的层次指的是存储器与处理器核111之间的接近程度。越接近处理器核111的层次越高。此外,一个高层次的存储器通常比低层次的存储器速度快但容量小。
[0129] 在本实施例中,与传统的包含指令缓存的处理器系统不同的是,指令缓存系统101与处理器核111之间含包含指令读缓冲(Instruction Read Buffer)107及相应的地址标签存储匹配器109。其中,指令读缓冲107的容量比指令存储器103小,访问时延也更短。指令存储器103和指令读缓冲107可以包含任何合适的存储设备,如:寄存器(register)或寄存器堆(register file)、静态存储器(SRAM)、动态存储器(DRAM)、闪存存储器(flash memory)、硬盘、固态磁盘(Solid State Disk)以及任何一种合适的存储器件或未来的新形态存储器。指令存储器103可以作为系统的一个缓存工作,或当有其他缓存存在时作为一级缓存工作;且可以被分割成复数个被称为存储块(Memory Block)的存储片段的用于存储处理器核111要访问的数据,如在指令块(Instruction Block)中的指令。
[0130] 具体地,处理器核111向地址标签存储匹配器109发送当前指令的地址进行匹配。若匹配成功,则说明当前指令已经存储在指令读缓冲107中,可以经较短的时延从指令读缓冲获取;否则,说明当前指令尚未存储在指令读缓冲107中,则地址标签存储匹配器109将该当前指令的指令地址送往标签存储器105进行匹配。此时,若在标签存储器105中匹配成功,则可以从指令存储器103中找到包含当前指令的指令块,并将该指令块填充到指令读缓冲
107中,同时将当前指令送往处理器核111;若在标签存储器105中匹配不成功,则标签存储器105将当前指令的指令地址送往更外层存储器以获取包含当前指令的指令块, 并在获取到所述指令块时,同时填充指令存储器103和指令读缓冲107,以及将当前指令送往处理器核111。
[0131] 在这个过程中,当处理器核111可以直接从指令读缓冲中获取当前指令时,所需的等待时间最少。根据本发明技术方案,可以事先将尽量多的可能被处理器核111用到指令填充到指令读缓冲107中,以备处理器核111取用。
[0132] 具体地,除了将当前指令所在的指令块填充到指令读缓冲107之外,还可以将该指令块之后的一个或多个顺序指令块填充到指令读缓冲107中。这样,当处理器核111完成对当前指令块的最后一条指令的获取后,即可从指令读缓冲107中获取到下一条指令(该指令位于所述当前指令块的下一指令块中),从而减少获取指令所需的等待时间。
[0133] 此外,还可以将指令读缓冲107中部分或全部分支指令的分支目标指令所在的指令块填充到指令读缓冲107中。例如,可以将当前指令块中分支指令的分支目标指令所在的指令块填充到指令读缓冲107中,也可以将当前指令块中及至少一个后续指令块中的分支指令的分支目标指令所在的指令块填充到指令读缓冲107中,以备处理器核111取用。在本发明中,分支指令(Branch Instrutrion)或分支点(Branch Point)指的是任何适当的能导致处理器核116改变执行流(Execution Flow)(如:非按顺序执行一条指令)的指令形式。分支指令或分支源(Branch Source)指一条进行分支操作的指令,分支源地址(Branch Souce Address)可以是分支指令本身的指令地址;分支目标(Branch Target)指的是分支指令造成的分支转移所转向的目标指令,分支目标地址(Branch Target Address)可以指当分支指令的分支转移成功发生时转移进入的地址,也就是分支目标指令的指令地址。
[0134] 在本实施例中,可以采用与现有技术相同的方法确定分支指令的分支目标指令地址,从而找到分支目标指令块并填充到指令读缓冲107中。例如,在处理器核111执行分支指令计算得到分支目标地址后,将相应的分支目标指令块填充到指令读缓冲107中,也可以根据分支目标缓冲(Branch Target Buffer)中记录的分支目标地址将相应的分支目标指令块填充到指令读缓冲107中。这样,一旦当前指令块上的分支指令经处理器核111执行后发生分支转移,则可以直接从指令读缓冲107中获取到对应的分支目标指令,从而减少获取指令所需的 等待时间。
[0135] 根据本发明所述技术方案,还可以对处理器核内部的程序计数器模块作一定的改进,使得处理器核除了可以按程序执行顺序从指令读缓冲中获取指令,还可以忽略(skip)部分指令、只读取部分指令,从而实现有选择地获取指令。请参考图1B,其为本发明所述改进的程序计数器。
[0136] 如图1B所示,在程序计数器150中,加法器153用于计算分支目标地址,即对输入的当前指令地址161与分支转移偏移量163相加以得到分支目标地址。加法器155用于计算当前指令之后顺序执行的第一条指令的指令地址,即对当前指令地址161加上一条指令的长度以得到的指令地址。加法器157用于计算当前指令之后顺序执行的第二条指令的指令地址,即对当前指令地址161加上两条指令的长度以得到的指令地址。寄存器151中存储了待忽略的指令之前一条指令的指令地址,而比较器159则将存储在寄存器器151中的指令地址与当前指令地址161进行比较,并控制选择器165。
[0137] 若分支转移发生,则选择器165选择来源于加法器153的输出,即分支目标指令地址;否则,根据比较器159的比较结果选择加法器155或加法器157的输出。具体地,当寄存器151中存储的指令地址与当前指令地址不一致时,表示当前指令之后顺序执行的那条指令并不是要被忽略的指令,因此,比较器159的输出控制选择器165选择来源于加法器155的输出,即当前指令之后顺序执行的第一条指令的指令地址,使得处理器核可以获取当前指令的后一条指令。当寄存器151中存储的指令地址与当前指令地址一致时,表示当前指令之后顺序执行的那条指令就是要被忽略的指令,因此,比较器159的输出控制选择器165选择来源于加法器157的输出,即当前指令之后顺序执行的第两条指令的指令地址,使得处理器核可以跳过当前指令的后一条指令,直接获取再后一条指令。这样,就实现了有选择地获取指令的功能。
[0138] 根据本发明所述技术方案,还可以在处理器核111尚未执行到分支指令时即事先计算出该分支指令的分支目标地址,并预先将相应的分支目标指令块填充到指令读缓冲107中。请参考图2,其为包含本发明所述指令缓存系统的一个处理器系统。
[0139] 如图2所示,处理器环境200包含一个填充器202、一个主动表(Active list) 204、一个扫描器208、一个轨道表(Track table)210、一个循迹器(Tracker)214、一个指令存储器206、一个指令读缓冲107和一个处理器核111。
[0140] 填充器202根据主动表204提供的地址从更低层次的存储器获取指令或指令块并填充到指令存储器206中。之后,根据具体执行情况,相应指令块被从指令存储器206填充指令读缓冲107中,以备处理器核111读取。在这里,术语“填充(Fill)”表示将指令从较低层次的存储器移动到较高层次的存储器中,术语“存储器访问”(Memory Access)表示处理器核111从存储器(指令读缓冲107)中读取指令。
[0141] 主动表204中的表项与指令存储器206中的存储块(Memory Block)一一对应。主动表204中的每个表项存储了一个指令块地址(Instruction Block Address)与一个块号(Block Number,BN)的匹配对,指明了该指令块地址对应的指令块存储在指令存储器206中的哪个存储块中。本发明所述的块号指的就是存储块在指令存储器206中的位置。可以通过将扫描器208审查、计算得到的分支目标指令地址与主动表204中存储的指令块地址匹配确定该分支目标指令是否已经存储在指令存储器206中。如果分支目标信息所在的指令块尚未被填充到指令存储器206中,那么在将该指令块填充到指令存储器206中的同时,在主动表204中建立相应的指令块地址与块号码的匹配对。本发明所述的匹配(Match),指的是对两个值进行比较,当两者相同或相等时为‘匹配成功(Match)’,否则为‘匹配不成功(Not Match)’。
[0142] 扫描器208可以对从更低层次的存储器填充到指令存储器206的每一条指令进行审查,并提取出某些信息,如:指令类型、指令源地址和分支指令的分支增量(Branch Offset),并基于这些信息计算出分支目标地址。例如,指令类型可以包括条件分支指令、无条件分支指令和其他指令等。指令类别还可以包括条件分支指令的子类别,如相等时分支转移、大于时分支转移等。在某些情况下,可以认为无条件分支指令是条件分支指令的一种特例,即条件总是成立。此外,还可以包括其他信息。扫描器208也将上述信息及地址送到其他模块,如主动表204和轨道表210。
[0143] 指令读缓冲107中至少存储了包含当前指令块在内一个指令块。需要说明的是,指令读缓冲107中的每一行与指令存储器206的指令块可以含有相同数 目或较少数目条指令。如果指令读缓冲107中的每行含有与存储器指令块同样数目的指令,即一个行等于一个指令块,则该行可以用对应的指令块块号表示。如果指令读缓冲107中的每行含有含有比存储器指令块少的指令,即多个行等于一个指令块,则指令读缓冲107中的每一行可以用相应的指令块的块号BN的最低位(Lsb)再低一位的位置处(1ess significant)加上至少一个地址位;此地址位指出该行在一个指令块中的位置,也即同一指令块中的行偏移地址。例如一个块号BN为‘111’的指令行含有指令读缓冲107中的两个行,则其中占据低位地址的行对应的号码为‘1110’;占据高位地址的行对应的号码为‘1111’。
[0144] 为了便于说明,在之后的描述中以指令读缓冲107中的每一行与指令存储器206的指令块可以含有相同数目的指令为例进行说明。
[0145] 在本发明中,指令读缓冲107可以根据当前处理器核111执行指令的执行情况,主动提供指令给处理器核111执行。
[0146] 轨道表210含有复数个轨迹点(Track Point)。一个轨迹点是轨道表中的一个表项,可含有至少一条指令的信息,比如指令类别信息、分支目标地址等。在本发明中轨迹点本身的轨迹表地址与该轨迹点所代表指令的指令地址相关(Correspond);而分支指令轨迹点中含有分支目标的轨迹表地址,且该轨迹表地址与分支目标指令地址相关。与指令存储器206中一系列连续指令所构成的一个指令块相对应的复数个连续的轨迹点称为一条轨道。该指令块与相应的轨道由同一个块号指示。轨道表含有至少一条轨道。一条轨道中的总的轨迹点数可以等于轨道表210中一行中的表项总数。轨道表210也可以有其它的组织形式。
[0147] 可以用第一地址(BNX)和第二地址(BNY)来表示轨迹点(指令)在轨道表中的位置信息;其中第一地址表示该轨迹点对应指令的块号(指向轨道表中一条轨道及指令缓冲器中相应的一个指令块),第二地址表示该轨迹点(及对应指令)在该轨道(存储块)中的相对位置(偏移量,Adress Offset)。一套第一地址及第二地址对应轨道表中的一个轨迹点,即可以根据一套第一地址及第二地址从轨道表中找到对应的轨迹点。如果该轨迹点的类型代表一条分支指令,可以根据内容中含的第一地址(目标块号)确定分支目标的轨道,并根据第二地址(偏移量)确定目标轨道中的一个特定的轨迹点(表项)。这样,轨道表就 成为一个以轨道表项地址对应分支源地址、表项内容对应分支目标地址来代表一条分支指令的表。
[0148] 相应地,扫描器208将提取出存储到指令存储器206中指令的指令信息,并将这些信息存储到轨道表210由这些指令对应的第一地址指出的轨道中由第二地址指出的表项。如果该指令是分支指令时则计算其中分支指令的分支目标指令地址送到主动表204匹配以得到分支目标指令所在存储行的块号(BN)。如果分支目标地址未与存在主动表204中的任何地址匹配,则该分支目标地址被送到填充器202从低层存储器读出指令行。同时主动表中的存储块替换逻辑分配一个存储块号(BN)给该指令行;该指令地址高位被存进主动表204中该块号指示的表项,填充器202取得的指令块被填充到该块号指示的存储块,并将该块号产生的第一地址及从指令地址抽取的第二地址写进轨道表。
[0149] 轨道表210中的轨道和指令存储器206中的存储块一一对应,且都由同一指针指向。处理器核111将要执行的任何指令,都可以在执行前被填充到指令存储器206及指令读缓冲107中。为了在一条轨道中建立与下一条轨道的联系,在每条轨道代表最后一条指令的轨迹点后再设一个结束轨迹点,其中存放顺序执行下一条轨道(指令块)的第一地址。如果指令存储器206中可以存储多个指令块,在当前指令块被执行时,把顺序执行下一个指令块也取到指令存储器206中及指令读缓冲107中,以备提供给处理器核206执行。下一指令块的指令地址可以用当前指令块的指令地址加上一个指令块的地址长度来求得。该地址如前述被送到主动表204匹配,获得的指令块被填进指令存储器206由存储块替换逻辑所指示的指令块;且该指令块及相应的轨道由匹配获得的BNX标示。同时该BNX被存进当前轨道的结束轨迹点。新存进指令存储器206的下一指令块中的指令也被扫描器208扫描,提取信息填充由该BNX指出的轨道如前所述。
[0150] 循迹器214的读指针指向轨道表210中当前指令所在轨道中位于当前指令之后的第一个分支指令轨迹点;或在该轨道上当前指令后没有分支轨迹点的情况下指向该轨道的结束轨迹点。循迹器214的读指针由第一地址指针和第二地址指针组成,其中第一地址指针的值为当前指令所在指令块的块号,第二指针指向该轨道上当前指令后的第一个分支指令轨迹点或结束轨迹点。由该读指针指示的轨迹点内容中的分支目标第一地址被用于对指令存储器206寻址,可以 读出包含该分支目标指令在内的指令块。该指令块可以被填充到指令读缓冲107中,以备分支转移发生后提供相应分支目标指令给处理器核111执行。
[0151] 若循迹器214指向的分支指令没有发生分支转移,则循迹器214的读指针指向该分支指令后的第一个分支指令轨迹点,或在该分支指令后的轨迹点中没有分支指令轨迹点的情况下指向该轨道的结束轨迹点。指令读缓冲107提供该分支指令之后的顺序指令给处理器核111执行。
[0152] 若循迹器214指向的分支指令成功发生分支转移,上述分支目标第一地址和第二地址成为新的循迹器地址指针,指向轨道表中的分支目标对应的轨迹点。该新循迹器地址指针也指向新填充的分支指令块,使其成为新的当前指令块。指令读缓冲107提供该分支指令的分支目标指令及其之后的顺序指令给处理器核111执行。此后循迹器214移动读指针指向新的当前指令块对应轨道中该分支目标指令之后的第一个分支指令轨迹点,或在该分支目标指令后的轨迹点中没有分支指令轨迹点的情况下指向该轨道的结束轨迹点。
[0153] 若循迹器214指向的是轨道中的结束轨迹点,循迹器214的读指针更新为该最后轨迹点中的位置内容值,即指向下一轨道的第一个轨迹点,从而指向新的当前指令块。之后循迹器214移动读指针指向新的当前指令块对应轨道中的第一个分支指令轨迹点,或在该轨道没有分支指令轨迹点的情况下指向该轨道的结束轨迹点。依次重复上述过程,即可在处理器核111执行指令前将该指令填充到指令存储器206及指令读缓冲107中,使得处理器核111在对该指令的取指时延最短,从而提高处理器性能。
[0154] 请参考图3A,其为本发明所述主动表的实施例。在本实施例中主动表的主体部分由数据地址寻址器302构成。
[0155] 数据地址寻址器302中包含多个表项(entry)304。每个表项304包含一个存储器、标志位V位320、标志位A位322、标志位U位324和一个比较器。所有比较结果被送入编码器306产生匹配表项号,即块号。控制线314用于输入读写状态控制信号。所有V位320初始值均为零。所有A位322的值由外部激活(Active)信号通过A位信号输入线328写入。
[0156] 写地址指针(Write Pointer)310指向的表项地址由循环自增装置(Wrap Around Increment)318产生,循环自增装置318的输出最大值为最大表项号, 输出为此值时再自增一次则输出为零,循环自增继续。如果写地址指针310当前指向表项的V位和A位的值均为零,则表示该表项可以被新数据写入,待写入完成后,循环自增装置318的输出值增加一,写地址指针310指向下一个表项;如果这两个值中至少有一个为一,则表示该表项当前不能被新数据写入,此时写入循环自增装置318的输出值增加一,写地址指针310指向下一个表项,继续进行判断。
[0157] 写入时,通过写入数据总线308输入的写入数据先与所有表项所存储的数据进行比较,如有匹配,则从匹配表项号输出线316输出匹配表项号,且不进行写入操作;如没有匹配,则写入数据被写入由写地址指针310指向的表项,同时该表项中V位值被置为‘0’,该表项的表项号通过匹配表项号输出线316输出,写地址指针310指向下一个表项;读出时,读地址线312指向的表项的内容通过读出数据总线330被读出,表项号通过匹配表项号输出线316输出,同时该表项中V位也被置为‘1’。
[0158] 标志位U位324表示使用情况。当写地址指针310指向一个表项304时,该表项U位324被置零。当一个表项304被读取时,其U位324被置一。循环自增装置318产生的写地址指针310指向一个新的表项时,U位会先被读取,若此时U位为零,则该表项可被替换,写地址指针310停在该表项以备写入数据,若U位为一,则将写地址指针310指向下一个表项。一种置换方法是另增一窗口指针326负责将U位置零,所述窗口指针326所指表项比写地址指针310提前N个表项。通过写地址指针310的值模加N即可得到窗口指针326的值。这N个表项即成为一个窗口,该窗口指向写地址指针310与窗口指针326间的表项。在写地址指针310移动N个表项时间内所经过的未被读取之表项可被置换。改变N值即改变窗口大小,从而改变替换率。另外一个置换方法是U位为复数位。写地址指针310或窗口指针326将表项置零,每次读取给表项U位加一。每次写之前将U位读出与预设值做比较,若小于所述预设值,则该表项可被置换;若大于或等于所述预设值,则将写地址指针310移向下一个表项。
[0159] 回到图2,当从扫描器208送来的地址在主动表204中匹配不成功时,该地址被送到填充器202等待从更低层次存储器取得该地址对应的指令块,同时在主动表204中分配一个表项存储该指令块对应的块地址,从而形成一个块号/块 地址对。本发明所述的指令块的块地址指的是该指令块起始指令的地址。本发明所述的指令存储器在逻辑上被分为复数个存储块,每个存储块对应主动表中的一个表项,存储了该表项中行地址对应的指令块。当该块地址对应的指令块被取来后,填充器202将其送到指令存储器206写入以该块地址对应的块号索引的存储块中。
[0160] 扫描器208可以对从低层存储器送来的每一条指令进行审查,提取出指令类型并输出到轨道表210,同时计算出分支指令的分支目标地址。所述目标地址可以由包含该分支指令的指令块起始地址加上该分支指令的偏移量,并再加上分支转移到目标指令的距离得到。该目标地址的高位部分被用于与主动表204中的内容匹配以获得该分支目标指令对应轨迹点的行号,并通过拼接指令块地址的最低位形成第一地址或块号,低位部分就是该分支目标指令对应轨迹点的第二地址,即该分支目标指令在其行中的偏移量。
[0161] 对于结束轨迹点,则只需要将指令块地址加上指令块长度,就可以得到下一指令块的指令块地址,之后可以将该下一指令块地址视为目标地址按同样方法进行匹配。
[0162] 如果该目标地址的高位部分在主动表204中匹配成功,那么主动表204输出该高位地址对应的块号到轨道表210;如果该目标地址的高位部分在主动表204中匹配不成功,那么主动表204就把这个值通过总线244送到填充器202以实现填充操作,同时分配一个块号给该高位地址,并输出到轨道表210。
[0163] 当新轨道被建立时,可以将新建轨道放置在轨道表210中的一个可被替换的行中。如果所述新轨道包含一个分支轨迹点(对应一条分支源指令),那么在所述行中的一个表项内建立一个分支轨迹点。可以根据分支源地址确定所述分支点在轨道表210中的行及表项的位置。举例而言,可以根据分支源地址的高位地址确定行,并根据分支源地址的偏移量确定该行中的一个表项。
[0164] 此外,轨道表行中的每个表项或轨迹点可以包含一种内容格式,所述格式包括类型区域、第一地址(XADDR)区域和第二地址(YADDR)区域。此外还可以包含其他区域。类型区域可以表示轨迹点对应的指令的类型。如之前所述,指令类型可以包括条件分支指令、无条件分支指令和其他指令。XADDR区域也被称为第一维地址或简称为第一地址。YADDR区域也被称为第二维地址或 简称为第二地址。
[0165] 此外,新轨迹点的内容可以对应分支目标指令。换句话说,分支轨迹点的内容存储了分支目标地址信息。举例而言,轨道表210中的对应与一条分支目标指令的特定的行的相应块号被作为第一地址存储到所述分支轨迹点的内容中。此外,所述分支目标的在其所在的指令块中的偏移量被作为第二地址存储到所述分支轨迹点的内容中。所述偏移量可以根据分支源指令地址和分支转移位移(距离)计算得到。
[0166] 轨道表中所有轨道的结束轨迹点都被标记为一个特殊的轨迹点,其内容包含了一个必定分支转移的类别信息,以及按顺序执行指令时的下一指令所在的下一轨道的位置信息。由于该下一指令对应于下一轨道的第一个轨迹点,因此该特殊轨迹点的内容可以只包含类型区域和第一地址(XADDR)信息,或除了包含类型区域和第一地址(XADDR)信息,还包含一个常数(如:‘0’)。
[0167] 请参考图3B,其为本发明所述轨迹点格式的实施例。在本实施例中,对于非结束轨迹点,其轨迹点格式可以包括指令类型332、第一地址334和第二地址336,其中一条轨道的至少两个轨迹点的指令类型能被同时读出。因此,在实际存储时,可以将轨道中所有非结束轨迹点的指令类型存储在一起,而将这些非结束轨迹点的第一地址和第二地址存储在一起。对于结束轨迹点,其轨迹点格式可以包括指令类型332、第一地址334和值为‘0’的常数338。同样地,结束轨迹点的指令类型332也可以和非结束轨迹点的指令类型存储在一起,而第一地址334和常数338则可以存储在该轨道所有非结束轨迹点的第一地址、第二地址之后。此外,由于结束轨迹点的第二地址就是常数338的值‘0’,因此可以不存储该常数,当循迹器214指向结束轨迹点时直接产生第二地址‘0’。
[0168] 图3C是根据本发明技术方案使用轨道表建立新轨道的方法的一个实施例。如图3C所示,一个已建立的轨道340(用BNX0表示)可以包含三条分支指令或分支点342、344和346。当审查分支点342时,一条新轨道348(用BNX1表示的下一个可用行)被建立起来用于存储分支点342的目标指令,且轨道表210中的所述轨道的号码或所述行号(即BNX1)被记录在分支点342中作为第一地址。类似地,当审查分支点344时,在轨道表210中另一条新轨道350(用BNX2)表示被建立起来,且轨道号码被记录在分支点344中;当审查分支点346 时,在轨道表
210中另一条新轨道352(用BNX3)表示被建立起来,且轨道号码被记录在分支点346中。这样,单条轨道中对应全部分支点的新轨道可以被建立起来。
[0169] 根据本发明技术方案,每条分支指令的轨迹点中存储的第二地址就是该分支指令的分支目标指令在该分支目标指令所在指令块中的偏移量。
[0170] 上述各个实施例采用直接寻址的方式计算分支目标地址并实现指令预取。然而,也可以使用间接寻址的方式。当采用间接寻址方式时,需要首先确定寄存器值(如:基地址寄存器值),从而计算分支目标地址。由于寄存器的值是因指令执行的结果而改变的,因此对于一条间接寻址分支指令来说,在最后更新其基地址寄存器值的指令已计算得到新值、但尚未将该值写入基地址寄存器时可以根据需要通过旁路(bypass)路径取得该新值进行目标地址的计算及后续操作。图3D是确定基地址寄存器值更新指令位置的实施例。
[0171] 在图3D中,轨道362包含了由扫描器208和主动表204送来的信息所构成的一系列轨迹点。在本实施例中,一条轨道由16个轨迹点组成。一个轨迹点对应一条指令。假设第6号轨迹点366和第14号轨迹点374各对应一条直接寻址分支指令,第10号轨迹点370对应一条以BP1寄存器为基地址寄存器的间接寻址分支指令。在扫描器208对该指令块指令审查时,可以找到该指令块中所有更新BP1寄存器值的指令,即第3号轨迹点364、第8号轨迹点368和第12号轨迹点372对应的指令。因此可以确定在间接寻址分支指令370之前最后更新基地址寄存器BP1的指令对应轨迹点368,该轨迹点368与间接寻址分支指令370相隔两个轨迹点,即相隔两条指令。这样,可以将该相隔指令的条数(即数值‘-2’)记录在间接寻址分支轨迹点370的内容中。
[0172] 根据本发明所述技术方案,当轨迹点366对应的分支指令未发生分支转移时,循迹器214的第二地址读指针指向轨迹点370。此时读出轨迹点370的内容,其中包含了相隔指令的条数‘2’。这样,当处理器当前执行的指令在该轨道中的位置值(即程序计数器PC的低位地址偏移量)比循迹器214的第二地址读指针的值小于等于‘2’时,该基地址寄存器的值被更新,此时可以从处理器核111中取得基地址寄存器BP1的值,进行分支目标地址计算及后续操作。
[0173] 根据本发明技术方案,可以通过多种途径获得该基地址寄存器值,如:通 过处理器核111中寄存器额外的读端口获得、采用时分复用读口的方式从处理器核111中寄存器获得、通过处理器核111中的旁路路径获得、或通过一个专供数据预取使用的额外寄存器堆获得。
[0174] 图3E是本发明所述循迹器读指针移动的实施例。在本实施例中,循迹器读指针越过轨道表中的非分支指令,移动到轨道表中下一分支点并等待处理器核111分支判断结果。为便于说明,图3E中省略了与本实施例说明内容无关的部分或部件。在本实施例中,假设轨道表210中存储的指令类型等指令信息均按指令地址从小到大从左到右排列,即当按顺序执行这些指令时,各个指令信息及相应指令类型的访问顺序为从左向右。另假设轨道表210中指令类型为‘0’代表相应的指令为非分支指令,指令类型为‘1’代表相应的指令为分支指令。
[0175] 在本实施例中,任一时刻可以读出轨道表210中由第一地址394(块号,BNX)指出的一条轨道中由第二地址396(块内地址偏移量,BNY)指出的代表指令的表项,也可以读出轨道表210中由第一地址394指出的一条轨道中代表指令类型的复数个表项甚至所有表项。
[0176] 在轨道表210中每一行中指令地址最大的一条指令的表项的右方再增设一个结束表项以存放顺序执行下一条指令的地址。结束表项的指令类型总是被设定为‘1’。结束表项中指令信息的第一地址是下一条指令的指令块号,第二地址(BNY)恒定为零,指向该指令轨道的第一项。结束表项被定义为等同于一个无条件分支指令。当循迹器指向一个结束表项时总会产生一个内部控制信号使选择器388选择轨道表210的输出380;也会产生一个内部控制信号使寄存器390更新。该内部信号可以由轨道表210中结束表项中含有的特殊位触发;也可以由第二地址396指向结束表项来触发。
[0177] 在图3E中,循迹器214中主要包括了移位器382、前导零计数器384、加法器386、选择器388和寄存器390。其中移位器382将从轨道表210读出的代表复数条指令的复数个指令类型398向左移位,其移动位数由寄存器390输出的第二地址指针396决定。移位器382输出的移位后指令类型399的最左边一位是步进位(STEP Bit)。该步进位的信号与从处理器核来的BRANCH信号共同决定寄存器390的更新。选择器388由控制信号TAKEN控制,其输出391为下一地址(Next Address),其中含有第一地址部分及第二地址部分。当TAKEN 为‘1’(分支成功)时,选择器388选择轨道表210的输出380(含有分支目标的第一地址及第二地址)做为输出391。当TAKEN为‘0’(分支不成功)时,选择器388选择现第一地址394作为输出391第一地址部分,加法器输出397做为输出391第二地址部分。指令类型399被送到前导零计数器384以计算下一个‘1’指令类型(代表相应指令为分支指令)前有多少个‘0’指令类型(代表相应指令为非分支指令),其中不管步进位是‘0’或‘1’都被计算为一位‘0’。得出的前导‘0’的数目395(步进数STEP Number)则被送到加法器386与寄存器390输出的第二地址396相加以得出下一分支源地址(Next Branch Address)397。请注意此下一分支源地址就是当前指令下一条分支指令的第二地址,而在此之前的非分支指令则会被循迹器214跳(Skip)过。
[0178] 当第二地址指向代表一条指令的表项时,受第二地址控制的移位器也将轨道表210输出的复数条指令类型统一向左移位。此时代表轨道表210所读出指令的指令类型被移位到指令类型399中的最左面的步进位。移位指令类型399被送入前导零计数器计算下一条分支指令之前指令的条数。此时前导零计数器384的输出395即是循迹器应该前进的步长。
此步长与第二地址396由加法器386相加后即得出下一分支指令地址397。
[0179] 当移位后指令类型399中的步进位信号为‘0’时,这表示第二地址396所指向的轨道表210中的表项为非分支指令,此时该步进位信号控制寄存器390更新,而选择器388在为‘0’的TAKEN信号392控制下选择下一分支源地址397成为第二地址396,第一地址394保持不变。此时新的第一第二地址指向同一轨道中的下一条分支指令,此分支指令前的非分支指令均被越过。新的第二地址控制移位器396将指令类型398移位,使代表此分支指令的指令类型位落到399的步进位上供下一步操作。
[0180] 当移位后指令类型399中的步进位信号为‘1’时,这表示第二地址所指向的轨道表210中的表项代表分支指令。此时该步进位信号不影响寄存器390更新,寄存器390由处理器核来的BRANCH信号393控制更新。此时加法器输出397是当前分支指令同一轨道上的下一条分支指令的地址,同时存储器输出380是当前分支指令的目标地址。
[0181] 当BRANCH信号为‘1’时,选择器388的输出391更新寄存器390。如果 此时处理器核来的TAKEN信号392为‘0’时,代表处理器核决定在这个分支点选择顺序执行,此时选择器388选择下一分支源地址397。此时寄存器390输出的第一地址394不变,下一分支源地址397成为新的第二地址396。此时新的第一第二地址指向同一轨道中的下一条分支指令。新的第二地址控制移位器396将指令类型398移位,使代表此分支指令的指令类型位落到399的步进位上供下一步操作。
[0182] 如果此时处理器核来的TAKEN信号392为‘1’时,代表处理器核决定在这个分支点选择程序跳转到分支目标,此时选择器选择从轨道表210中读出的分支目标地址380成为由寄存器390输出的第一地址394及未来第二地址395。此时BRANCH信号393控制寄存器390存上述第一第二地址成为新的第一第二地址。该新的第一第二地址指向可能不在同一轨道上的分支目标地址。新的第二地址控制移位器396将指令类型398移位,使代表此分支指令的指令类型位落到399的步进位上供下一步操作。
[0183] 当第二地址指向轨迹表结束表项(下一行表项)时,如前所述内部控制信号控制选择器388选择轨道表210的输出380,并更新寄存器390。此时新的第一地址394为轨道表210的结束表项中记载的下一轨道的第一地址,第二地址为零。此时第二地址控制控制移位器396将指令类型398移零位,开始下一步操作。如此周而复始,循迹器214与轨道表210配合,会跳过轨道表中的非分支指令而总是指向分支指令。
[0184] 根据本发明所述技术方案,当主动表104表项已满且需要建立新的行地址/行号匹配对时,需要对主动表104进行替换,即从主动表104中移除一个已有的行地址/行号匹配对,代以新的行地址/行号匹配对;从指令存储器106中移除相应的指令块,代以新的指令块。轨道表110中每个分支轨迹点的内容包含了其分支目标轨迹点的块号(即第一地址)和块内偏移量(即第二地址)。如果尚在轨道表110中存储的分支目标轨迹点的块号对应的主动表104中匹配对及相应的指令缓存块被替换,则会产生块号未变、但块号所代表的存储内容已改变的情况,导致该轨迹点将指向错误的指令块。可以增加一个相关表(correlation table),记录主动表104中每个匹配对是否在轨道表中作为轨迹点中分支目标的相关信息。主动表(或指令存储器)根据相关表中记录的信息,只替换没有作 为分支目标的轨道为新的轨道。
[0185] 请参考图4A,其为本发明所述填充指令读缓冲107及由指令读缓冲107直接向处理器核111提供指令以供执行的示意图。指令读缓冲107中存放单数或复数个指令块,指令缓存中的一行可以放置单数或地址连续的复数个指令块。
[0186] 本发明所述技术方案使用令牌(Token)控制指令的流出。请参考图4A,其中461,463,及465是指令读缓冲中储存由上至下按程序顺序3条指令的存储器,叉号表示是上述存储器上的读口,分别由令牌传递器407,403,405,经由字线411,413,415控制将存储器内存储的指令经总线431流出送至处理器核111。令牌是存在上述寄存器中的使能(enable)状态。在单指令发射时,只有一个寄存器中有令牌。当令牌从上至下,每一个时钟周期传递给下一个寄存器时,相应的指令就从指令读缓冲器经总线431流出。处理器核111可以通过停止时钟421的方式来暂停指令的流出。
[0187] 当执行分支成功的分支指令时,本发明所述技术方案停止向分支指令的下一条指令传递令牌,而将令牌传递至分支目标所在的令牌传递器。为此需要对图4A的令牌传递器进行修改。请参考图5A,前一级令牌传递器传来的令牌在控制时钟的上升沿从623经逻辑603、607传进令牌传递器601储存传递至输出621。当此令牌传递器相应的指令读缓冲存有程序将要跳转至的分支目标指令时,由分支目标地址译码所得到的控制线525控制在总线
721上的令牌经逻辑605、607传递至寄存器601使相应的分支目标指令从指令读缓冲流出。
当此令牌传递器相应的存储器存有是处于程序中确定要跳转的分支源指令的下一条指令时,由分支源地址译码所得的控制线523经反相器611反相后将输入623关断以阻止令牌从分支源所在令牌传递器向本级令牌传递器传递。当601所在令牌传递器相应的指令缓冲存储器存有分支源指令且确定分支跳转时,由分支源地址译码所得的控制线523控制传输
609开启送至总线721供分支目标指令相应的令牌传递器接收。为此也需要译码器将循迹器给出的分支指令地址及分支目标地址译码以指出分支源指令及分支目标指令。
[0188] 当执行一个指令块中的最后一条指令时,令牌将传递给顺序下一个指令块中的第一条指令所在的令牌传递器。为此需要机制指出指令块中的最后一条指令,也需要译码器将循迹器给出的下一指令块地址译码以指向该块。为此将一个 指令块上第一条指令和最后一条指令的令牌传递器作相应修改。请参考图5B显示的指令块中最后一个令牌传递器。其与图5A的令牌传递器相似,差别在于传输门609直接由信号621控制,当令牌传至621时会被自动放上总线721。图5C为指令块第一条指令相应的令牌传递器。其结构与图5A的令牌传递器相似,不同处在于其没有前一级的令牌传递器,唯一令牌来源是来自于总线721,来自分支目标译码器的控制线525及顺序下一指令块译码器的控制线663都能使能令牌从总线经逻辑653、657向本级令牌传递器传递。
[0189] 请参考图4B,其为本发明所述填充指令读缓冲107及由指令读缓冲107直接向处理器核111提供指令以供执行的实施例。为便于说明,在图4B中只显示了轨道表210、循迹器214、指令存储器206、指令读缓冲107、指令读缓冲相应的控制单元401和处理器核111,省略了其他部分。
[0190] 在图4B中,循迹器214的读指针231沿轨道表210中当前指令块对应的轨道移动并停止在当前指令对应轨迹点之后的第一个分支点处,将该点的轨迹点地址(即读指针231的值BNX,BNY)送往指令缓冲器中控制单元401的分支源地址译码器,同时读出该轨迹点的内容(即分支目标轨迹点的BN 233)送往控制单元401中分支目标译码器。此外,从当前轨道读出的结束轨迹点的内容(即下一指令块对应轨道的第一个轨迹点的BN 235)也被送到控制单元401中的下一指令块译码器。
[0191] 控制单元401中存储了指令读缓冲107中各指令块对应的块地址。在本实施例中,以指令读缓冲中的每一指令块存储了指令存储器206中一个指令块为例进行说明。控制单元401对接收到的分支源BN、分支目标BN和下一轨道第一个轨迹点的BN中的第一地址部分(BNX)与每个指令块的块地址分别进行匹配。由于当前指令块已经存储在指令读缓冲107中,因此与分支源BNX的匹配必定成功,且匹配项对应的指令读缓冲行就是当前指令块所在的行。若对分支目标BNX和/或下一轨道BNX的匹配成功,则说明对应的指令块已经存储在指令读缓冲107中;否则需要将相应BNX送往指令存储器206读出对应指令块并填充到指令读缓冲107的可用块中。指令读缓冲107需要替换时可用块的确定方法可以采用如主动表204替换时采用的可用行确定方法,在此不再赘述。
[0192] 进一步地,可以根据所述分支源BN和分支目标BN中的第二地址部分 (BNY)通过译码在指令读缓冲107中找到对应的分支指令和分支目标指令。请参考图4C,其为本发明所述控制单元进行匹配的一个实施例。在本实施例中,假设指令存储器206已经包含了所有需要的指令块。若指令存储器206中也没有存储该下一指令块,则可按之前实施例所述方法,由主动表204通过填充器202向更低层次的存储器输出相应指令地址并取回对应指令块,该过程在此不再赘述。
[0193] 此外,为了便于说明,图4C中显示了指令读缓冲107中的一个指令块501,及与该行对应的控制单元401中的一个子模块503。在本实施例中,指令块501由8条指令构成,按指令地址递增顺序从上向下分别对应指令块501中的每一行。控制单元子模块503包括第一地址存储器505、下一指令块比较器507、分支目标比较器511和分支源比较器509,以及目标译码器515和分支源译码器513。其中,第一地址存储器505中存储了指令块501对应的块号(BNX)。
[0194] 下一指令块比较器507将从总线235接收到的下一指令块BNX与第一地址存储器505中的BNX进行匹配,若匹配成功,则比较器507输出的匹配成功信号指向指令块501的第一条指令(即图4C中最上一条指令),表示指令块501就是当前正在执行指令块(也是指针
231指向的指令块)的下一指令块,且其指向的指令就是当前指令块执行完毕后处理器核
111所需的下一指令;若匹配不成功,则比较器507输出的信号无效,表示指令块501不是当前指令块的下一指令块。
[0195] 分支源比较器509将从总线231接收到的分支源指令BNX与第一地址存储器505中的BNX进行匹配,若匹配成功,表示指令块501就是所述分支源指令所在的指令块,将比较器509输出的匹配成功信号作为使能信号送往源译码器513,控制源译码器513对接收到的总线231上的分支源地址第二地址BNY进行译码,并根据译码结果由字线523指向指令块501中的一条指令,该指令就是所述分支源指令。若匹配不成功,则表示指令块501不是所述分支源指令所在的指令块,因此不向源译码器513输出使能信号,此时分支目标译码器513的所有字线输出523为零,不指向任何指令。
[0196] 分支目标比较器511将从总线233接收到的分支目标地址中的第一地址BNX与第一地址存储器505中的BNX进行匹配,若匹配成功,表示指令块501 就是所述分支目标指令所在的指令块,将比较器511输出的匹配成功信号作为使能信号送往目标译码器515,控制目标译码器515对接收到的总线233上的分支目标地址第二地址BNY进行译码,并根据译码结果通过字线523指向指令块501中的一条指令,该指令就是所述分支目标指令。所匹配不成功,则表示指令块501不是所述分支目标指令所在的指令块,因此不向目标译码器515输出使能信号,此时分支目标译码器515的所有字线输出525为零,不指向任何指令。
[0197] 回到图4B,当循迹器214的读指针231指向一个新的轨道时,先读出该轨道的结束轨迹点内容235并送往控制单元401进行匹配。若匹配不成功,则说明在指令读缓冲107中尚未存储该轨道对应的下一指令块,则控制单元401将该下一指令块BNX送往指令存储器206读出对应指令块并填充到指令读缓冲107中。所填充的位置即作为当前指令块的下一指令块在指令读缓冲107中的位置。若匹配成功,则说明在指令读缓冲107中已经存储了该轨道对应的下一指令块,可以直接确定所述下一指令块在指令读缓冲107中的位置。
[0198] 循迹器214的读指针231则按之前实施例所述方法提前移动并停止在当前指令对应的轨迹点之后的第一个分支点,并从轨道表210中读出分支目标轨迹点的BN。此时,分支点和分支目标轨迹点的BN被送往控制单元401并按图4C实施例所述方法进行匹配。其中,分支点所在的指令块必定已经存储在指令读缓冲107中,因此可以确定分支源指令在的指令读缓冲107中的位置。对于分支目标轨迹点的匹配而言,若匹配不成功,则说明在指令读缓冲107中尚未存储该分支目标指令所在的指令块,则控制单元401将分支目标轨迹点的BNX(即其所在指令块的BNX)送往指令存储器206读出对应指令块并填充到指令读缓冲107中,并确定所述分支目标指令在指令读缓冲107中的位置。若匹配成功,则说明在指令读缓冲107中已经存储了该分支目标指令所在的指令块,因此可以确定所述分支目标指令在指令读缓冲107中的位置。
[0199] 这样,通过控制单元401中的匹配,可以在指令读缓冲107中找到分支源指令、下一指令块的第一条指令和分支目标指令。
[0200] 根据本发明技术方案,控制单元401接收的时钟由系统时钟与处理器核111的流水线执行情况组合形成。即在任意一个系统时钟周期内,若处理器核111需要读取一条指令,则控制单元401接收到一个有效的时钟信号;若处理器核 111因流水线暂停等原因,暂时不需要读取新的指令,则控制单元401不会接收到时钟信号。这样,所述时钟信号表明了处理器核111当前是否需要获取指令,因此控制单元401可以根据该时钟信号,在每个有效的时钟周期向处理器核111提供一条指令。具体地,与指令读缓冲107相应的控制单元401中的一个令牌传递器存储了相应指令读缓冲107中的令牌(Token)信号。令牌信号对应的字线所控制的存储器中存放的指令就是处理器核111所需的当前指令。对于控制单元401而言,在每个有效时钟周期均对所述令牌传递器进行更新,从而将令牌传递到有效值传递到下一次处理器核111所需指令对应的令牌传递器中。这样,控制单元401可以根据令牌所在的位置控制指令读缓冲107主动向处理器核111输出相应的指令。
[0201] 需要注意的时,本实施例给出的仅是控制单元401向处理器核111主动按需提供指令的一个例子。从本发明的方案出发,可以采用其他各种合适的握手信号或通讯协议来保证控制单元401向处理器核111主动按需提供指令,对于本领域普通技术人员来说,这些都应属于本发明所附权利要求的保护范围。
[0202] 根据本发明所述方法,可以根据预定的分支指令的前瞻深度一次将更多的指令块填充到指令读缓冲中。请参考图6A,其为本发明所述向指令读缓冲填充两层分支目标指令块的实施例。为便于说明,在图6A中只显示了处理器核111、指令存储器206、指令读缓冲107、轨道表210、循迹器214和多指针寻址装置7001,省略了其他模块。
[0203] 多指针寻址装置7001包含自增器5003和7005、指针存储器5005、5007、5009和5011,多路选择器7015和分支判断逻辑5015。指针存储器5005、5007、5009和5011被用于存储从当前正在执行的指令开始对应的第二层的四个分支指令。
[0204] 自增器5003和7005分别用于将两组指针存储器(即:5005和5007、5009和5011)中各一个指针的第二地址(BNY)增一直至同一轨道中的下一个分支指令轨迹点。多路选择器7015用于从指针存储器5005、5007、5009和5011中选出一个指针,对轨道表210寻址。分支判断逻辑5015对处理器核送来的分支转移发生信号进行处理,译码得到用于同时控制四个指针存储器写入的写信号,以及控制多路选择器7015的选择信号。
[0205] 此外,若总线7009上从轨道表210中读出的是目标轨迹点的BN,则选择器5025或7017选择从总线7009来的输入,将该BN直接存储到指针存储器5011中;若总线7009上从轨道表210中读出的不是BN,则进行主动表查找、填充,并将对应的BN通过总线7011送到5025或选择器7017作为其输出,存储到指针存储器5011中。
[0206] 请参考图6B,其为本发明所述向指令读缓冲填充两层分支目标指令块的示意图。假设当前循迹器214读指针指向轨道W上的分支点A,则指针存储器5005指向轨道W上的分支点A之后的第一个分支点B的顺序执行的轨道(仍然是轨道W),指针存储器5009指向轨道W上的分支点B的分支目标(轨道X),指针存储器5007指向分支点A的分支目标上的第一个分支点C的顺序执行的轨道(轨道Y),而指针存储器5011指向分支点C的分支目标(轨道Z)。
[0207] 这样,从循迹器214读指针指向的分支点开始的两层后续指令块(共4个指令块,包括顺序执行的指令块和分支目标指令块)对应的BN被分别存储在指针存储器5005、5007、5009和5011中。可以通过总线5021将这四个指针存储器输出的BNX依次送到指令读缓冲107的控制单元进行匹配。若匹配成功,则说明该BNX对应的指令块已经存储在指令读缓冲107中,不需要从指令存储器206获取;否则,通过总线7013将该BNX送往指令存储器206获取相应指令块并填充在指令读缓冲107中由替换算法确定的存储块中,使得指令读缓冲107中包含了循迹器214读指针指向的分支点所在的指令块(如图6B中的轨道W对应的指令块)、所述分支点的分支目标指令块(如图6B中的轨道Y对应的指令块),及所述分支目标指令块上第一个分支点的分支目标指令块(如图6B中的轨道X对应的指令块),以及循迹器214读指针指向的分支点所在的指令块上的下一个分支点的分支目标指令块(如图6B中的轨道Z对应的指令块)。
[0208] 需要说明的是,以上实施例均只对两层分支点对应指令块的预取进行说明。但是,根据上述公开的技术方案和实施例,本领域专业人员应能很容易地通过增加类似部件、装置或软件,扩展、推广到更多层分支点对应指令块的预取,而这些也应属于本发明保护的范围。
[0209] 指令读缓冲的组织可以由当前指令块,下一指令块和分支目标指令块构成。此时各块按照固定位置放置,如分支成功将分支目标指令块复制进当前指令块, 因为分支成功前分支目标现在已经成为当前指令。新的分支指令块被写进分支指令块的位置。同理,当执行到下一指令块时也将下一指令块复制进当前指令块,而新的下一指令块填充进下一指令块的位置。
[0210] 指令读缓冲的组织也可以由多个指令块构成,由401中的译码器根据循迹器提供的分支源地址231确定当前指令块,根据分支目标地址233确定分支目标指令块,根据下一指令块地址235确定下一指令块。指令块的替换可以由如同主动表的替换方式或LRU等方式替换。
[0211] 以下以图7A为例说明令牌传递机制与轨道表,循迹器结合由指令缓冲107向处理器核111提供指令供其执行。为便于说明,图7A只显示了轨道表210、指令存储器206、循迹器214、控制单元401和包含了令牌传递器的指令缓冲存储器107。在指令存储器107中,指令
701与指令703属于同一个指令块,且指令703为该指令块的最后一条指令;指令705与指令
707属于同一个指令块,且指令705为该指令块的第一条指令。相应地,令牌传递器711和令牌传递器717分别对应指令701和指令707,其内部结构与图5A实施例相同;令牌传递器713对应指令703,其内部结构与图5B实施例相同;令牌传递器715对应指令705,其内部结构与图5C实施例相同。
[0212] 如之前实施例所述,随着令牌信号的传递,指令读缓冲107向处理器核111提供相应指令以供执行。循迹器214读指针231提前移动并停止在当前指令后的下一分支点,将该点的轨迹点地址中的BNX通过总线231送往控制单元401中的多个分支源比较器509,比较的结果是当前指令块是存储器701,703所在段,因此将总线231上的BNY送往该指令块上的分支源译码器513译出该分支指令在存储器701中。译码所得的字线751控制令牌传递器711中的传输门驱动令牌总线721。同时字线751也阻塞下一级令牌传递器713的输入途径。
[0213] 同时循迹器214读指针231指向的轨道表210中的分支目标也被读出,通过总线233送往控制单元401中的多个分支目标比较器511,比较的结果是分支目标指令是在存储器705,707所在段,因此将总线233上的BNY送往该指令块上的分支目标译码器511译出该分支指令在存储器707中。译码所得的字线767控制令牌传递器717可以接收总线721上传来的令牌。
[0214] 当令牌被传递到令牌传递器711时,令牌控制存储器701所存储的分支指 令从指令总线431送往处理器核111执行,同时令牌也经由已在字线751控制下的传输门被放上令牌总线721。连接到721的各令牌传递器只有717在字线767的控制下可接收输入。此时处理器核111译出接收到的指令是分支指令就控制到控制单元401的时钟使令牌暂停传递。
[0215] 如果分支指令的执行结果是执行分支,则处理器核111恢复给控制单元时钟,令牌就传递进令牌传递器717。存储器707中的分支目标指令就在令牌的控制下从指令总线431被送往处理器核111。同时,循迹器214的读指针231也指向轨道表210中与存储器707相应的轨道并指向存储器707中下一个分支点。如果存储器707中存储的分支目标指令本身不是一条分支指令,则下一时钟周期令牌将从令牌传递器717向顺序下一个令牌传递器传递。
[0216] 如果分支指令的执行结果是不执行分支,则处理器核111通过‘使无效(disable)’信号使控制单元401中的译码器513,515的输出为0。此时令牌传递器711中的传输门不驱动令牌总线721,令牌传递器713中的输入电路也允许令牌的传递。然后处理器核111恢复给控制单元401时钟,令牌就从令牌传递器711传递进令牌传递器713。分支源指令701的下一条指令703就在令牌的控制下从指令总线431被送往处理器核111。
[0217] 指令703是一个指令块中最后一条指令,因此令牌就被令牌传递器713自动放上令牌总线721。如果指令703是一个分支指令,循迹器的指针231会停在这个分支点上,按前述方式操作。如果指令703不是分支指令,则循迹器指针231不会在此停留,而会根据轨道末尾的下一轨道的信息迳行指向下一轨道中的第一个分支点。在此情况下循迹器会给出一个下一指令块寻址的使能信号,在此信号控制下,当前指令块的下一指令块地址也经由总线235被送往控制单元401中的多个下一指令块比较器507。比较结果是下一分支目标指令是在指令705,707所在指令块,并经由控制线795使令牌传递器715的输入开放接收令牌总线721上的令牌。下个时钟周期令牌被传递至令牌传递器715,指令705就经由指令总线431送往处理器核111。
[0218] 为提高处理器性能,可以不必等到分支转移是否发生的结果产生后再向处理器核111提供后续指令,而是通过预测的方法,在分支执行结果尚未产生时,猜测性地向处理器核111提供该分支指令之后的顺序指令或分支目标指令,并 在分支预测错误的情况下清除处理器核111中错误指令的执行结果或中间结果,并重新提供正确指令供处理器核111执行。
[0219] 静态预测根据分支指令的性质(如前跳或回跳)固定将分支预测预测为分支成功或不成功,关于本发明所述静态预测的一种实施例,请再参考图7A。此实施例中各模块的功能与前基本相同。但是源译码器除了可以实现之前实施例所述功能外,还能额外接收一个ALL信号。请参考图7B,其为本发明所述源译码器的一个实施例。
[0220] 在本图7B中,当分支源块号BNX匹配成功输出使能信号775时,若ALL信号771为无效(‘0’),则根据分支源BNY 773进行译码,此时译码器的输出只有一位为有效(‘1’);若ALL信号771为有效(‘1’),译码器的全部输出均为有效(‘1’)。
[0221] 回到图7A,首先以分支转移预测为不发生进行静态预测为例说明。如之前实施例所述,随着令牌信号的传递,指令读缓冲107向处理器核111提供相应指令以供执行。循迹器214读指针231提前移动并停止在当前下一分支点,将分支源地址与分支目标地址送往控制单元401与其中的地址比较,比较结果如前例分支源是指令701,分支目标是指令707的地址。亦如前例分支目标译码所得的字线767控制令牌传递器717可以接收总线721上传来的令牌。
[0222] 与前例不同的是,在本实施例中,由于分支转移被预测为不发生,因此控制单元401不对分支源BN进行匹配,从而不阻止分支源指令对应令牌传递器711将令牌信号传递给下一级令牌传递器713。这样,在分支指令已经被提供给处理器核111执行但尚未产生执行结果时,可以先将该分支指令之后顺序执行的指令提供给处理器核111继续执行,以起到静态分支预测为不发生的效果。此时,如之前实施例所述,一旦当前指令块的最后一条指令(在此为指令703)被提供给处理器核111执行,则令牌信号被传递到下一指令块的第一个令牌传递器(在此为715),从而保证源源不断地向处理器核111提供指令。
[0223] 当处理器核111执行所述分支指令的结果为分支转移没有发生时,即之前的预测是准确的,则循迹器214读指针231继续移动并停止在下一分支点。而指令读缓冲107中的令牌传递器继续依次传递令牌信号,从而继续向处理器核111提供指令以供执行。
[0224] 当处理器核111执行所述分支指令的结果为分支转移成功发生时,即之前的预测是错误的,则令牌信号所在的指令块对应的源译码器接收的ALL信号有效,该源译码器的输出为全‘1’。此时,无论令牌信号被传递到该指令块的哪条指令,均被阻止继续顺序传递,同时该令牌信号被送到全局总线721上。与此同时,分支目标指令块对应的目标译码器根据对目标指令BNY的译码输出对应的译码结果,控制该分支目标指令对应的令牌传递器从全局总线721上接收到令牌信号。至此,令牌信号被传递到分支目标指令对应的令牌传递器,从而向处理器核111输出分支目标指令以供执行。对于处理器核111而言,当分支预测错误时,可以按现有技术将错误指令的执行结果或中间结果清除,具体方法在此不再赘述。
[0225] 下面再以分支转移预测为发生进行静态预测为例说明。如之前实施例所述,随着令牌信号的传递,指令读缓冲107向处理器核111提供相应指令以供执行。循迹器214读指针231提前移动并停止在当前下一分支点,并读出分支目标BN。控制单元401对分支目标BN进行匹配,并根据相应目标译码器输出,在指令读缓冲107中找到该分支目标指令。
[0226] 控制单元401对分支源BNX进行匹配,并由匹配成功项对应的源译码器根据分支源BNY译码输出,阻止分支源指令对应令牌传递器将令牌信号传递给下一级令牌传递器,而是将令牌信号传递到全局总线721上。
[0227] 与此同时,控制单元401对分支目标BNX进行匹配,并由匹配成功项对应的目标译码器根据分支目标BNY译码输出,控制该分支目标指令对应的令牌传递器从全局总线721上接收到令牌信号。至此,令牌信号被传递到分支目标指令对应的令牌传递器,从而向处理器核111输出分支目标指令以供执行。此后,令牌信号被传递到该分支目标指令之后顺序执行的指令对应的令牌传递器,并依次输出对应的指令,以起到静态分支预测为发生的效果。同样地,一旦该分支目标指令所在指令块的最后一条指令被提供给处理器核111执行,则令牌信号被传递到下一指令块,从而保证源源不断地向处理器核111提供指令。
[0228] 当处理器核111执行所述分支指令的结果为分支转移成功发生时,即之前的预测是准确的,则更新循迹器214读指针231为所述分支目标BN值,即移动到所述分支目标轨迹点所在轨道,并以此轨道为当前轨道继续移动并停止在下 一分支点。而指令读缓冲107中的令牌传递器继续依次传递令牌信号,从而继续向处理器核111提供指令以供执行。
[0229] 当处理器核111执行所述分支指令的结果为分支转移没有发生时,即之前的预测是错误的,则此‘错误’信号使得所有源译码器的ALL输入信号有效,使所有源译码器的输出为全‘1’。此时,无论令牌信号在任何指令寄存器,均被阻止继续传递,同时该令牌信号被送到全局总线721上。此时只有令牌传递器717在分支目标译码字线767的控制下可接收令牌总线721上的令牌,因此令牌就被传入令牌传递器717。指令707在令牌的控制下经总线431向处理器核111传送。因为预测是错误,处理器核111要将分支指令之后在流水线上的指令与中间结果都清除,具体方法在此不再赘述。
[0230] 不论分支预测正确与否,循迹器的指针都停留在被预测的分支点上,待处理器核111提供分支决定后再继续移向下一个分支点。不论分支预测正确与否,指令读缓冲107均可以向处理器核111提供正确的指令。
[0231] 请参考图8,其为本发明所述动态预测的一种实施例。为便于说明,图8只显示了轨道表810、指令存储器206、循迹器214、控制单元801和包含了令牌传递器的指令读缓冲107。其中,指令存储器206、循迹器214、控制单元801和指令读缓冲107均与图7A实施例中的相同。不同之处在于,轨道表810中增加了一个读口提供分支预测信息811。轨道表810中包含了对应轨道表中每个分支点的分支转移预测位。分支预测信息在轨道表中储存于分支点的表项中,当循迹器的读指针231指向轨道表810中的一个分支源表项从233读出一个分支目标地址时,同时从所述读口读出相应的分支预测信息811。该分支预测被送往控制单元801比控制单元401新增的反相器809、与逻辑803、805和807,共同控制基于令牌传递的动态分支预测。该分支预测811如果是预测分支不成功,则与逻辑803允许下一指令块地址被送往控制单元801中的下一目标比较器匹配下一指令块并指向该块第一条指令;而与逻辑805及
807仅允许分支源地址231和分支目标地址233的BNX部分与801中的第一地址寄存器匹配,指明分支源指令块与分支目标指令块,但不允许其中的BNY部分在801中译码,使得分支源与分支目标的相应字线都无效。该分支预测811如果是预测分支成功,则与逻辑803不允许下一指令块地址被送往控制单元801中的下一目标比较器 匹配下一指令块,也就并不指出下一指令块的第一条指令;而与逻辑805及807则允许分支源地址231和分支目标地址233的BNX与BNY部分匹配及译码,使得分支源与分支目标的相应字线有效。
[0232] 如之前实施例所述,随着令牌信号的传递,指令读缓冲107向处理器核111提供相应指令以供执行。循迹器214读指针231提前移动并停止在当前下一分支点,并读出分支目标BN233以及该分支点分支转移是否发生的预测信息811。控制单元801对分支目标BN进行匹配,并根据相应目标译码器输出,在指令读缓冲107中找到该分支目标指令。
[0233] 当读出的预测信息为分支转移预测不发生(‘0’)时,所述预测为不发生(‘0’)的信息经反相器809反相后输出有效信号(‘1’)使能逻辑807。与逻辑807的另一个输入来源于当前轨道的结束轨迹点内容235。这样,与逻辑807将结束轨迹点内中的下一指令块块号送往控制单元801匹配,并在指令读缓冲107中找到对应的下一指令块。
[0234] 与逻辑803和805直接接收到预测为不发生(‘0’)的信息,从而禁止分支源地址231及分支目标地址233的传递,使控制单元801中的源译码器和目标译码器均输出全‘0’。这样,分支源指令对应令牌传递器将令牌信号传递给下一级令牌传递器,使得该分支指令之后顺序执行的指令被提供给处理器核111继续执行,以起到静态分支预测为不发生的效果。一旦当前指令块的最后一条指令被提供给处理器核111执行,令牌信号可以被传递到下一指令块,继续向处理器核111提供指令。
[0235] 此时,若处理器核111执行所述分支指令的结果为分支转移没有发生,即之前的预测是准确的,则循迹器214读指针231继续移动并停止在下一分支点。而指令读缓冲107中的令牌传递器继续依次传递令牌信号,从而继续向处理器核111提供指令以供执行。
[0236] 若处理器核111执行所述分支指令的结果为分支转移成功发生时,即之前的预测是错误的,则此‘错误’信号使ALL信号有效,所有源译码器的输出为全‘1’。此时,无论令牌信号被传递到该指令块的哪条指令,均被阻止继续顺序传递,同时该令牌信号被送到全局总线721上。同时,与逻辑805被使能(enable),分支目标地址233中的BNY被送往801中的分支目标指令块中的 BNY译码器输出对应的字线,控制该分支目标指令对应的令牌传递器从全局总线721上接收到令牌信号。至此,令牌信号被传递到分支目标指令对应的令牌传递器,从而向处理器核111输出分支目标指令以供执行。同时,处理器核111清除流水线上分支指令后指令及中间结果如前。
[0237] 另一方面,当读出的预测信息为分支转移预测为发生(‘1’)时,此时,所述预测为发生(‘1’)的信息经反相器809反相后输出无效信号(‘0’)到与逻辑807,使得结束轨迹点内中的下一指令块块号不被送往控制单元801匹配,以防止在向分支目标指令对应的令牌传递器传递令牌信号时同时将令牌信号传递到分支源指令所在指令块的下一指令块的第一条指令对应的令牌传递器。
[0238] 同时与逻辑803和805直接接收到预测为发生(‘1’)的信息,从而分别向源译码器和目标译码器输出有效的BNX和BNY信号。此时,控制单元801对分支源BNX进行匹配,并由匹配成功项对应的源译码器根据分支源BNY译码输出,阻止分支源指令对应令牌传递器将令牌信号传递给下一级令牌传递器,而是将令牌信号传递到全局总线721上。
[0239] 控制单元801对分支目标BNX进行匹配,并由匹配成功项对应的目标译码器根据分支目标BNY译码输出,控制该分支目标指令对应的令牌传递器从全局总线721上接收到令牌信号。至此,令牌信号被传递到分支目标指令对应的令牌传递器,从而向处理器核111输出分支目标指令以供执行。此后,令牌信号被传递到该分支目标指令之后顺序执行的指令对应的令牌传递器,并依次输出对应的指令,以起到静态分支预测为发生的效果。
[0240] 当令牌信号被传递到分支目标指令对应的令牌传递器时,此条件会使与逻辑807恢复传递接收轨迹点235(下一指令块地址)。该分支目标指令所在指令块的结束轨迹点内容被送到控制单元801匹配,从而在指令读缓冲107中找到对应的下一指令块。这样,一旦该分支目标指令所在指令块的最后一条指令被提供给处理器核111执行,则令牌信号被传递到下一指令块,以继续向处理器核111提供指令。
[0241] 当处理器核111执行所述分支指令的结果为分支转移成功发生时,即之前的预测是准确的,则更新循迹器214读指针231为所述分支目标BN值,即移动到所述分支目标轨迹点所在轨道,并以此轨道为当前轨道继续移动并停止在下 一分支点。而指令读缓冲107中的令牌传递器继续依次传递令牌信号,从而继续向处理器核111提供指令以供执行。
[0242] 当处理器核111执行所述分支指令的结果为分支转移没有发生时,即之前的预测是错误的,则令牌信号所在的指令块对应的源译码器接收的ALL信号有效,该源译码器的输出为全‘1’。此时,无论令牌信号被传递到该指令块的哪条指令,均被阻止继续传递,同时该令牌信号被送到全局总线721上。与此同时,将分支源指令地址231加‘1’送上分支目标地址总线233至控制单元801,将源指令地址送进分支目标译码器译出一根目标字线,此字线对应的是分支源指令后一条指令的令牌传递器。控制该令牌传递器从全局总线721上接收到令牌信号。至此,令牌信号被重新传递回分支源指令顺序执行的下一指令对应的令牌传递器,从而向处理器核111输出该分支源指令顺序执行的下一指令以供执行。此外,清除处理器核111中分支指令后的指令及中间结果。
[0243] 根据本发明所述技术方案,也可以对所述令牌传递器做改进,选择使某些指令不从指令总线431中流出,实现指令折叠,如分支折叠(branch folding)请参考图9A,其为指令读缓冲中每一条指令对应的改进的令牌传递器的一个实施例。
[0244] 图9A所示令牌传递器与图6A中的类似,其中,令牌信号寄存器601、与逻辑603和605、或逻辑607、传输门609以及反相器611均与图6A中的对应部件相同。不同之处在于图9A所示的令牌传递器中增加了选择器901和903,这两个选择器接收同一控制信号控制。所述控制信号的来源可以是如图1B中比较器159的输出,可以是循迹器根据轨道表中存储的信息发送而来的控制信号,也可以是由从指令缓冲器中提前流出的指令译码而产生。当控制信号906为有效时多路选择器901选择输入901,多路选择器903选择寄存器输出621,此时令牌传递器的工作方式与前例一样。当控制信号906为无效时选择器901选择‘0’,此时不管有没有令牌到达907,令牌传递器状态621都为0;使得与其相应的指令不会从指令缓冲中流出;而选择器903则选择输入信号907。如此,从907来的令牌信号会越过本级令牌传递器直接传递给下一级。
[0245] 图9B是用从指令缓冲器中提前流出的指令译码控制指令折叠的实施例。该实施例中令牌传递器981、983、985和987具有相同的结构,为易于说明,都 只用最简单的一个寄存器表达,此寄存器可以被复位置‘0’,以便从分支源处消除令牌;实际上,可以是任意能实现令牌传递功能的令牌传递器。在本实施例中,指令读缓冲中的每条指令存储器都有两个指令输出端口。其中输出端口431如前输出令牌所在的当前指令,输出端口953用于提前输出当前指令之后第二条指令的全部或部分信息(对应分支指令的处理器)。其余的令牌传递器与存储器的连接也与此一样。当令牌传递至令牌传递器981时,令牌状态位971将存储器961中指令从输出端口431流出供处理器核执行,同时也将存储器965中指令通过输出端口953流出供预处理器990预处理。
[0246] 预处理器990对提前流出的指令进行简单译码,发现965中指令是条分支指令,即控制将965中指令设为可跳过(skip)。其方式是向所有令牌传递器中的标记寄存器985送一个时钟信号使标记寄存器981,983,985,987更新标志。其中只有令牌传递器985中的标志寄存器995存进了令牌状态位971为有效标志表示指令存储器965中的指令可被越过。由于令牌不在相应的令牌状态位973,975,977,其余的标志寄存器991,993,997,其标志均为无效。当令牌被传至令牌传递器983时,控制线973为‘1’,此时令牌传递器983中的传输门在标志位995的控制下,将令牌信息传至总线999,此时根据预处理器990中存储的预译码结果为分支指令,根据这个结果,由分支预测机制决定令牌走向。如果预测是分支成功,则令牌总线
999上的令牌可被注入到由分支目标译码器指出的分支目标相应的令牌传递器。而983令牌传递器所在的指令块上的所有寄存器被复位清零。如此,令牌就被传送到分支目标。如果预测是分支不成功,则分支预测机制对不进行令牌对分支目标的注入,也不对983所在的指令块上令牌传递器清零。在这个情况下,受标志995控制的令牌传递器985中的两个二输入选择器就将令牌传递器983中的令牌直接传递到令牌传递器987,而令牌传递器985中被注入‘0’输入。如此,令牌越过了分支指令965。不管分支预测成功与否,存储器965中的分支指令都未被执行都不占据执行时间。
[0247] 预处理器990对提前流出的指令进行简单译码,发现965中指令是条装载/存储(Load/Store)指令,即控制将965中指令设为可跳过(skip)。其方式是向所有令牌传递器中的标记寄存器985送一个时钟信号使标记寄存器981,983,985,987更新标志。其中只有令牌传递器985中的标志寄存器995存进了令牌 状态位971为有效标志表示指令存储器965中的指令可被越过。由于令牌不在相应的令牌状态位973,975,977,其余的标志寄存器991,993,997,其标志均为无效。当令牌被传至令牌传递器983时,控制线973为‘1’,此时令牌传递器
983中的传输门在标志位995的控制下,将令牌信息传至总线999,此时根据预处理器990中存储的预译码结果为装载/存储指令,根据这个结果,预处理器忽略总线999上的令牌。由分支预测机制决定令牌走向。受标志995控制的令牌传递器985中的两个二输入选择器就将令牌传递器983中的令牌直接传递到令牌传递器987,而令牌传递器985中被注入‘0’输入。如此,令牌越过了装载/存储指令965,使其不占据执行时间。
[0248] 指令折叠还可以由轨道表、循迹器配合图9B中的令牌传递器来执行。请参见图9C,以分支指令为例。循迹器停留在目前正在执行的指令的下一条分支指令处,其指针被控制单元中的指令源地址译码器译码,用以控制每个令牌传递器中的两个二输入选择器。再以指令965是一条分支指令为例,指令源地址译码器对应令牌传递器985的控制线为‘1’,对应其他令牌传递器的控制线为‘0’,则令牌传递器983的令牌,如前例,在预测分支成功时被传递至分支目标,或当预测不分支成功时越过令牌传递器985直接传递至令牌传递器987。其他指令,如装载/存储指令也可以用此方法实现,只需在轨道表中对要折叠的指令建立一个表项,当循迹器如上例停止在该表项时,就能通过分支源地址译码器控制令牌传递器越过要折叠的指令,以节省执行时间。
[0249] 此外,通过控制本发明所述的令牌传递器,可以实现反复(Repeat)向处理器提供同一条指令的功能。具体地,可以关断令牌传递器中的所有令牌信号寄存器601的输入时钟信号,使得令牌信号的传递被暂停。这样,指令读缓冲在接下来的每个时钟周期内都输出当前令牌信号对应的同一条指令,从而实现反复提供同一条指令的功能。
[0250] 请参考图10A,其为本发明所述传递令牌信号的另一种实施例。为便于说明,图10A只显示了轨道表1010、指令存储器206、循迹器214、控制单元1001和包含了令牌传递器的指令读缓冲107,其中令牌传递器1011、1013、1015和1017分别对应指令701、703、705和707。指令存储器206和循迹器214均与图7A实施例中的相同。不同之处在于,令牌传递器中的令牌信号寄存器具有复 位(reset)端,所有令牌信号寄存器可以被同时清零;控制单元1001只包含了目标译码器(如目标译码器1021和1023),以及用于存储对应指令块BNX的寄存器(如寄存器1025和1027)用于匹配分支目标指令块BNX的目标BNX比较器(如比较器1029和1031)和用于匹配下一指令块BNX的下一BNX比较器(如比较器1033和1035)。其中,目标BNX比较器的功能与图5C实施例中的比较器511相同,下一BNX比较器的功能与图5C实施例中的比较器507相同。在本实施例中,当令牌信号在一个指令块中按指令顺序依次传递时,令牌传递器中的操作过程与图7(或图8)实施例相同。
[0251] 循迹器214的分支源指针231指向轨道表1010,从中读出分支目标地址233,其中BNX部分1043被送往控制单元1001中各个指令块的分支目标匹配器,如1033,1031与各个指令块的BNX地址,如1025,1027匹配。匹配成功则使能(enable)相应的分支目标译码器1021或1023。被使能的译码器接收分支目标地址233的BNY部分1045产生令牌注入与分支目标相应的令牌传递器。在控制单元1001中,一旦分支转移发生,则全部令牌传递器被置‘0’,清除对应于分支源指令块的令牌信号,并由目标译码器产生令牌信号直接注入到分支目标指令对应的令牌传递器。本实施例中,每个指令块对应的第一个令牌传递器中的令牌信号寄存器的输入均来源与一个与门,该与门的一个输入来源于全局总线1021,另一个输入来源于该指令块对应的下一指令块BNX比较器的输出。
[0252] 循迹器214也通过分支源指针231从轨道表1010中读出下一指令块地址235,送往控制单元1001中各个指令块的下一指令块匹配器,如1033,1035与各个指令块的BNX地址,如1025,1027匹配。匹配的结果被送进相应指令块第一个令牌传递器的与门,如1019。本实施例也以全局总线1021代替了图7实施例中的全局总线721,其产生方式是所有指令块的最后一个令牌传递器上的令牌状态都接至或门1007的一个输入。所以,当令牌到达任意一个指令块的最后一个令牌传递器时,或门1007的输出令牌总线1021均为‘1’。令牌总线1021连接至所有指令块的第一个令牌传递器上与门(如1019)的一个输入端。这些与门的另外一个输入端是连接于相应指令块的下一指令块匹配器。此时,与下一指令块地址235所匹配的指令块中的下一指令块匹配器(如1035)的输出也为‘1’,与1021上的状态共同作用使相应指令块中相应的与门(如1019)输出 为‘1’,将令牌传入相应指令块的第一个令牌传递器。
[0253] 进一步地,或逻辑1007的输出被送到指令读缓冲107中每个指令块对应第一个令牌传递器,如令牌传递器1015。每个指令块对应的第一个令牌传递器的另一个输入则来源于该指令块对应的用于确定下一指令块的比较器(如比较器1033和1035)。从轨道表1010中当前轨道的结束轨迹点中读出的下一指令块的BNX被经由总线235送到控制单元1001中的所有下一BNX比较器与相应的指令块的BNX进行匹配。由于指令705,707所在的指令块对应所述下一指令块,因此控制单元1001的所有所有下一BNX比较器中只有下一BNX比较器1035输出匹配成功的结果(即‘1’),其他的下一BNX比较器均输出匹配不成功的结果(即‘0’)。这样,令牌传递器1015中的与门1019输出‘1’并写入令牌信号寄存器1009中,而其他所有令牌传递器中的令牌信号寄存器的值均为‘0’,从而将令牌信号正确地传递到轨道表结束轨迹点指向的下一指令块第一条指令对应的令牌传递器中,以继续向处理器核输出正确的指令供执行。如此令牌就从当前指令块传递到下一指令块。
[0254] 另一方面,当分支转移发生、需要将令牌信号从当前指令对应的令牌传递器传递到分支目标指令对应的令牌传递器时,假设图10A中的令牌传递器1017是分支转移发生时令牌信号所在的令牌传递器,而指令701是所述分支转移对应的分支目标指令。在本实施例中,当处理器核111产生表示分支转移发生的TAKEN信号1037时,该信号也被送到所有令牌信号寄存器的复位端,从而清除令牌信号。同时从轨道表1010中读出的分支目标轨迹点BNX也被送到所有目标BNX比较器进行匹配。在本实施例中,由于指令701是所述分支转移对应的分支目标指令,因此只有该指令块对应的目标BNX比较器1029的比较结果为‘1’,从而控制目标译码器1021对分支目标轨迹点BNY进行译码。根据译码结果,目标译码器1021的输出字线1039为‘1’,通过或门1041产生令牌信号控制存储器701经由总线1003向处理器核111输出分支目标指令701。下一个时钟周期令牌信号被传进令牌传递器1013控制输出指令703。
[0255] 此外,还可以在本实施例中结合图7实施例中的静态分支预测或图8中的动态分支预测方法进一步提高处理器获取指令的效率。类似地,当分支预测为不发生时,指令读缓冲107不等待分支指令执行结果,继续向处理器核111提 供所述分支指令之后的指令。若所述分支指令的分支转移未发生,则指令读缓冲107继续向处理器核111提供当时指令之后的指令;否则,清除所述分支指令之后已被处理器核执行的指令的执行结果或中间结果,TAKEN信号1037将所有令牌传递器中的令牌信号寄存器复位,并根据轨道表1010中读出的分支目标轨迹点位置信息,按之前所述方法将令牌信号注入到分支目标指令处,以继续向处理器
111提供正确的指令(即分支目标指令)。
[0256] 当分支预测为发生时,指令读缓冲107不等待分支指令执行结果,使所有令牌传递器复位,并如前通过对循迹器提供的分支目标地址译码直接在分支目标的令牌传递器注入令牌向处理器核111提供所述分支指令的分支目标指令。此时需要一个机制来指出分支源的位置,比如对指令的译码(可以是对正常提供给处理器核的指令的译码,或是如图9例中通过提前从读缓冲107流出的指令的译码);还可以由循迹器提供的分支源地址,这需要在控制单元1001中设置分支源译码器。若所述分支指令的分支转移发生,则指令读缓冲107继续向处理器核111提供当时指令之后的指令;否则,清除所述分支指令之后已被处理器核执行的指令的执行结果或中间结果,将所有令牌传递器中的令牌信号寄存器复位,并以循迹器214中存储的所述分支指令本身轨迹点231(分支源地址)位置信息+1,按之前所述方法将令牌信号注入到所述分支指令之后的指令处,以继续向处理器111提供正确的指令(即分支指令之后的指令)。
[0257] 根据本发明技术方案,可以将处理器核中的按分支指令的TAKEN信号产生的时间点为界限将流水线分为前端流水线和后端流水线,并在处理器核中增加一条前端流水线。这样当指令读缓冲向处理器核输出分支源指令后,可以同时向处理器核输出所述分支源指令之后的指令,以及分支目标指令和其后的指令。处理器核中的两组前端流水线分别执行所述分支源指令之后的指令,和分支目标指令及其后指令。当所述分支指令的TAKEN信号产生时,根据TAKEN信号的值选择正确指令所在的前端流水线的执行结果送往后端流水线执行,从而无论分支指令的分支转移是否发生,都能保证处理器核中的流水线效率不因分支而导致损失。
[0258] 请参考图10B,其为本发明所述无分支损失的处理器环境实施例的一个示意图。在本实施例中,轨道表1010、指令存储器206和循迹器214与图10A实施 例的相同。循迹器214控制轨道表1010提供分支目标地址233供控制单元中分支目标译码器寻址,也控制轨道表1010提供下一指令块地址235供控制单元做下一目标寻址。
[0259] 与图10A实施例不同的是,本实施例中的处理器核1051包含两条前端流水线1080,1082和一条后端流水线1086,并根据执行分支指令产生的TAKEN信号从两组前端流水线中由选择器1084选择其中一条的中间执行结果送往后端流水线。此外,指令读缓冲中存储的的每条指令均对应两个令牌传递器及两条送往处理器核1051的输出总线1090,1092。每条指令另外还对应两条提前两周读出将指令送往数据引擎1069的总线1094和1096。当指令读缓冲中已经包含了分支指令所在的指令块和分支目标指令所在的指令块时,可以同时将分支指令之后的指令、分支目标指令或其后指令通过两条输出总线分别送往处理器核1051的两条前端流水线1080,1082,并根据所述分支指令执行结果选择其中一组的执行结果送往后端流水线1086继续执行。因为每个时钟一共可流出四条指令,则到下一指令块的令牌传递总线也有四条如1061,1063,驱动这些总线的或逻辑(如图10A中的1007)也有四组1059,
1057,1071与1073。相应的,每个指令块的相应令牌传递器也有四个与门如与图10B中下面指令块对应的与门1075,1077,1065,1067。此四个与门的一个端口都与本指令块的下一指令块匹配器1035的输出相连接,另一个端口分别与上述四条令牌总线相连接,其输出则是传递至该指令块的令牌状态。在本实施例中,指令读缓冲中的每个指令块对应两个结构相同的令牌传递器组及两个目标译码器,这两个令牌传递器交替用于对应当前指令块(即分支指令的后续指令所在的指令块)和分支目标指令块,每次分支成功时互换。以左边一组令牌传递器为例,其结构与图9实施例中的相应结构类似,能同时提供令牌信号对应的指令及其后第二条指令,分别用于正常执行及提前两周处理数据读取指令。其中,令牌信号对应的指令被送到处理器核1051供执行,其后二条指令被送到数据引擎1069以便提前进行相应的数据读取操作。需要说明的是,由于本实施例的结构能消除分支指令带来的性能损失,因此不需要提前预处理分支指令。
[0260] 在本实施例中,按图9实施例相同方法同时输出位于同一指令块中的当前指令及其后第二条指令。当所述两条指令位于不同指令块中时(及当前指令位 于当前指令块,而其后第二条指令位于下一指令块中时),则通过全局总线传递令牌信号。具体地,指令块对应的最后两个令牌传递器均能输出令牌信号寄存器的值,并分别通过总线1053和1055送往或逻辑1057和1059。在此,或逻辑1057和1059的功能与图10A实施例中的或逻辑1007相同。这样,当令牌信号位于当前指令块的倒数第二个令牌传递器、指令读缓冲输出对应指令时,令牌信号被同时通过总线1053传递到或逻辑1057,并经全局总线1061传递到与门1065(在此假设与门1065所在的令牌传递器对应下一指令块),则由于与门1065的另一个来源于下一BNX比较器的输入也为‘1’,则与门1065的输出为‘1’,这样所述下一指令块的第一条指令就能与所述当前指令块的倒数第二条指令同时输出。另一方面,当令牌信号位于当前指令块的最后一个令牌传递器、指令读缓冲输出对应指令时,令牌信号被同时通过总线1055传递到或逻辑1059,并经全局总线1063传递到与门1067,则由于与门1067的另一个来源于下一BNX比较器的输入也为‘1’,则与门1067的输出为‘1’,这样所述下一指令块的第二条指令就能与所述当前指令块的最后一条指令同时输出。
[0261] 对于右边一组令牌传递器,也按同样方法进行操作。其中,或逻辑1071对应逻辑1057,或逻辑1073对应或逻辑1059,与门1075对应与门1067,与门1077对应与门1065,使得右边一组令牌传递器也能同时输出当前指令及其后第二条指令。
[0262] 此外,翻转计数器1081根据分支转移TAKEN信号1098(分支成功)进行翻转,用于确定两组前端流水线中哪一组对应当前指令块,哪一组对应目标指令块。具体地,假设初始时左边一组前端流水线及令牌传递器对应当前指令块,即当前令牌在左边一组令牌传递器中传递,此时,翻转计数器1081的输出1083为‘1’,从而关断左边目标译码器对应的与门1085,并导通右边目标译码器对应的与门1087。而选择器1084也在信号1083的控制下选择前端流水线1080的中间结果送往后端流水线1086执行。右边一组令牌传递器根据循迹器214的分支目标地址233在分支目标处注入目标令牌,控制向处理器核1051输出目标指令及其后指令。这些指令在右边前端流水线1082中执行到分支目标指令抵达1082流水线的最后一级,在此处理器核1051停止右边令牌传递器组的时钟信号,使之停止从总线1092流出更多指令,等待分支判断的结果。当来自左边指令总 线1090的分支指令被执行得出分支判断时,则翻转计数器1081根据分支判断结果产生相应输出1083以控制系统运行。若分支转移没有发生,Taken信号1098为‘0’,则翻转计数器1081的输出1083仍为‘1’,继续选择左边前端流水线1080的执行结果送往后端流水线1086;左边前端流水线及令牌传递器依然对应当前指令块,而右边令牌传递器根据循迹器214的循迹向处理器核1051输出下一分支的目标指令及其后指令。若分支转移发生,Taken信号1098为‘1’,则翻转计数器1081的输出1083为‘0’,控制选择器1084选择右边前端流水线1082的执行结果送往后端流水线1086;此时处理器核1051也恢复了原来停止的右边令牌传递器组的时钟信号,原目标令牌成为了当前令牌,右边指令总线1092上依据令牌流出的指令成为当前指令供给右边前端流水线1082。信号1083为‘0’也通过与门1087将右边分支目标译码器的使能信号置‘0’,使右边目标译码器不产生令牌注入信号。同时信号1083为‘0’,也通过与门1085使能左边分支目标译码器,将分支目标令牌注入左边令牌传递器组,从左边指令总线1090流进左边前端流水线1080直到分支目标指令到达1080的最后一级,此时1080停止左边令牌传递器组的时钟,停止分支目标令牌的传递以及指令的流出,在此等待分支判断的结果。此时左边的令牌传递器指令总线1090和左边的前端流水线1080都对应于分支指令。右边的令牌传递器指令总线1092和右边的前端流水线1082都对应于当前指令。如此每一次成功分支的TAKEN信号1098为‘1’触发翻转计数器1081翻转一次,负责当前指令的模块与负责分支目标指令的模块对换一次。
[0263] 类似地,当右边一组前端流水线及令牌传递器对应当前指令块时,若分支转移没有发生,则翻转计数器1081的输出1083为‘0’,继续选择右边前端流水线1082的执行结果送往后端流水线1086;右边前端流水线1092及令牌传递器组依然对应当前指令块,而左边令牌传递器根据循迹器214的循迹向处理器核1051输出下一分支的目标指令及其后指令。若分支转移发生,则翻转计数器1081翻转,其输出1083为‘1’,选择左边前端流水线1080的执行结果送往后端流水线1086;并通过与门1085关闭左边目标译码器,而通过与门1087使能右边的分支目标译码器从而在正确分支目标位置注入目标令牌信号;此后左边一组前端流水线1080及令牌传递器对应当前指令块,右边一组前端流水线1082 及令牌传递器对应分支目标指令块。
[0264] 这样,无论分支转移是否发生,处理器核1051均可以接收到从指令读缓冲主动送来的指令,并不间断地执行,从而消除了分支转移带来的性能损失。
[0265] 请参考图11,其为本发明所述指令级并行结构中指令读缓冲同时输出顺序多条指令供处理器核执行的实施例。在图11中,目标译码器515与之前实施例所述的目标译码器相同。此外,本实施例中指令读缓冲中的每个指令存储器有4个读口,可以根据需要从4个读口当中的任意一个读出该指令存储器中的指令。也可以同时从指令读缓冲中上述4个读口中通过总线1461、1463、1465和1467输出4条顺序指令送往相关性检测单元和处理器核,且可以一次从外层存储器(如指令缓存)通过总线1471、1473、1475和1477向指令读缓冲写入多条指令。处理器核内有4个同样的执行单元,各自接收并执行总线1461、1463、1465和1467传来的不同指令。每个执行单元都能执行指令集中的所有指令,且4个执行单元共用数据存储,如寄存器堆。为了便于说明,在本实施例中只显示了令牌传递器的部分部件,省略了其他部分。以令牌传递器1431为例,其中寄存器1443用于存储令牌信号,或门1445用作接收分支转移发生时令牌信号的注入或经四输入选择器1447传递过来的令牌。令牌传递器中的这两个部件的功能与之前实施例所述相同。每个令牌传递器中的四输入选择器1447等由相关性检测单元控制,决定顺序执行指令时接收前一条,或前二条,或前三条或前四条指令相应的令牌传递器中的令牌。
[0266] 令牌信号可同时控制四条顺序指令的输出,如储存在寄存器1443中的令牌信号1444可以在同一时钟周期使指令1431从总线1461中输出,使指令1433从总线1463中输出,指令1435从总线1465中输出,指令1437从总线1467中输出。当该令牌信号1444被传递到下一级令牌传递器1446,令牌信号1448可以在同一周期使指令1433从总线1461中输出,使指令1435从总线1463中输出,指令1437从总线1465中输出,指令1439从总线1467中输出。令牌信号也可以从令牌传递器1431直接传递至令牌传递器1439,使指令1439及其后的三条指令在同一时钟周期输出。令牌的传递是由令牌传递器中的四输入选择器选择,如令牌信号
1444连接至令牌传递器1433中的四输入选择器的1号(最左面的)输入,连接至令牌传递器
1435中的四输入选择器的2号(左面第二个) 输入,连接至令牌传递器1437中的四输入选择器的3号(左面第三个)输入,及连接至令牌传递器1439中的四输入选择器的4号(最右面的)输入。所有四输入选择器的选择由相关性检测单元控制。如果选择1号输入,则令牌被传到下一条指令,如果选择2号输入,则令牌被传到下二条指令,如果选择3号输入,则令牌被传到下三条指令,如果选择4号输入,则令牌被传到下四条指令。
[0267] 相关性检测单元对指令读缓冲输出的四条指令之间的相关性进行检测,检测同时输出的4条指令之间的写后读(Read after Write,RAW)相关。即某一条指令的源(操作数)寄存器号与其之前的某条指令的目的寄存器号相同时会产生写后读相关,这两条指令不能并行执行。相关性检测单元也检测分支指令与之前影响分支判断条件的指令的相关性。即产生分支指令判断条件的指令不能与分支指令同时发射(从指令缓冲器流出)。
[0268] 从指令读缓冲中输出的4条指令为顺序指令,从左到右排列。即从总线1461输出的指令为第一条指令;从总线1463输出的指令为第一条指令的顺序下一条指令,称为第二条指令;从总线1465输出的指令为第二条指令的顺序下一条指令,称为第三条指令;从总线1467输出的指令为第三条指令的顺序下一条指令,称为第四条指令。在本实施例中,以每条指令最多用到两个源寄存器和一个目标寄存器为例进行说明,其他情况也可以此类推。在检测过程中,从前三条指令中提取出的目标寄存器号1481、1482和1485与其后指令中提取出的源寄存器号1483、1484、1486、1487、1488和1489相应比较。图11中空心圆表示比较器,其中第一条指令的源寄存器号不参与比较,第二条指令的两个源寄存器号都需与第一条指令的目的寄存器号比较,第三条指令的两个源寄存器号要与第一、第二条指令的目的寄存器号都进行比较,第四条指令的两个源寄存器号要与第一、第二、第三条指令的目的寄存器号都进行比较。具体地,第一条指令的目标寄存器号1481分别与第二条指令的源寄存器号
1483、1484,第三条指令的源寄存器号1486、1487,以及第四条指令的源寄存器号1488、1489进行比较;目标寄存器号1482分别与源寄存器号1486、1487、1488和1489进行比较;目标寄存器号1485分别与源寄存器号1488和1489进行比较。当一条指令的源寄存器号与其之前的(左边的)任意一条指令的目的寄存器号相同时,则本时钟周期此指令不能执行,要等到下一时钟周期从指令缓冲器中再次输出该指令 供执行单元执行。
[0269] 分支指令的相关检测也与写后读检测类似。一条分支指令的分支判据由该分支指令之前执行的某条指令更新,一般方法是某条指令更新了分支指令要用于作分支判断的寄存器,比如分支指令据以作分支判断的一个条件标志(flag)寄存器或者更新了一个分支指令用于作比较的目的寄存器。如果是用条件标志寄存器则前三条指令都译码出该指令有否更新标志寄存器,并将结果送到后三条指令与指令译码所得该指令是否分支指令的信号作比较。例如,当第一条指令更新了标志寄存器,而第四条指令是分支指令,则第四条指令不能在本时钟周期执行,需等本周内标志寄存器更新后下周再执行分支指令。如果是用条件目的寄存器则与上述写后读相关的检测方法一样,以后三条的源寄存器号与前三条的目的寄存器号作比较。这种比较已经包含在上述的写后读相关判断中,所以不需要另设比较逻辑。图11中是包含更新标志寄存器的实施例,既有写后读相关判断,也有另外的分支相关判断。
[0270] 在第二条、第三条、第四条指令中,各自将所有的比较结果作‘或’操作。或门输出的意义是本条指令与之前的指令有相关(harzard),不能在本时钟周期执行,需要在下周重新从指令读缓冲输出。当第二条指令有相关时,则当周所输出的4条指令只有第一条指令被执行,下一个周期要从上周有相关的第二条指令开始,输出4条指令供处理器核执行。当第二条指令无相关,而第三条指令有相关时,则当周所输出的4条指令第一、第二条指令被执行,下一个周期要从上周有相关的第三条指令开始,输出4条指令供处理器核执行。当第二、第三条指令无相关,而第四条指令有相关时,则当周所输出的4条指令第一、第二、第三条指令被执行,下一个周期要从上周有相关的第四条指令开始,输出4条指令供处理器核执行。当第二、三、四条指令无相关,则当周所输出的所有4条指令都被执行,下一个周期要从上周所输出的四条指令之后的一条指令开始,输出4条指令供处理器核执行。令牌的传递需满足以上规律。
[0271] 下一周从哪个指令开始输出取决于相关发生的位置,也取决于多个相关之间的优先权,即更靠前(左边)的指令的相关要优于靠后(右边)指令的相关性。本实施例用图中的优先权编码器实现这一功能。该优先权编码器对应每一条指令有一个结构相同的移位阻断逻辑。当一条指令有相关时,其对应的移位 阻断逻辑就将从右边移位阻断逻辑传过来的‘相关’位置信号阻断并产生该指令的‘相关’信号。当一条指令无相关时,则将右边移位阻断逻辑传来的‘相关’位置信号移一位后往左边移位阻断逻辑传递。
[0272] 假设令牌在1431令牌传递器,即控制线1444为‘1’,控制1431存储器中的指令(以下简称指令1431)从总线1461,指令1433从总线1463,指令从1435总线1465,指令从1437总线1467同时发射。如果发射的四条指令之间没有相关性。则移位阻断逻辑1452,1453与1454均不阻断信号的传递,1471,1472与1473上的信号为经移位传递的第二指令相关位1491,第三指令相关位1492与第四指令相关位1493上的‘0’(第二,第三,第四条指令未检测到相关),而固定接成‘1’的1494信号经四级移位传递到达信号1474。使得控制令牌传递器中所有4路选择器的控制信号为0001,选择所有4路选择器上第4个输入。各4路选择器的第4输入都为‘0’,除了令牌传递器1439中的4路选择器,该选择器的第4输入接到为‘1’的控制线1444。因此,令牌被传进令牌传递器1439。下一时钟周期,指令缓冲器输出从指令1439开始的4条指令供处理器核执行也供相关性检测单元检测。
[0273] 再回到从指令1431起的四条指令一起发射。如果仅有第四条指令(指令1437)有相关时,则第四条指令的相关位1493为‘1’,使移位阻断逻辑1454中的三个与门的输出都为‘0’,阻断了信号1494的传递,信号1493经三级移位到达信号1474。使得控制令牌传递器中所有4路选择器的控制信号为0010,选择所有4路选择器上第3个输入。各4路选择器的第3输入都为‘0’,除了令牌传递器1437中的4路选择器,该选择器的第3输入接到为‘1’的控制线1444。因此,令牌被传进令牌传递器1437。下一时钟周期,指令缓冲器输出从指令1437开始的4条指令供处理器核执行也供相关性检测单元检测。指令1437这次从第一道的1461总线输出(上一周从第4道的1467总线输出)。
[0274] 再回到从指令1431起的四条指令一起发射。如第二(1433)、第四(1437)条指令有相关时,则第四条指令的相关位信号1493为‘1’,使移位阻断逻辑1454中的三个与门的输出都为‘0’,阻断了信号1494的传递,信号1493移位往左传递。但此时第二条指令的相关位信号1491为‘1’,使移位阻断逻辑1452中的三个与门的输出都为‘0’,阻断了信号1493的传递,1491本身到达信号1471, 使得控制令牌传递器中所有4路选择器的控制信号为1000,选择所有4路选择器上第1个输入。各4路选择器的第1输入都为‘0’,除了令牌传递器1433中的4路选择器,该选择器的第1输入接到为‘1’的控制线1444。因此,令牌被传进令牌传递器
1433。下一时钟周期,指令缓冲器输出从指令1433开始的4条指令供处理器核执行也供相关性检测单元检测。指令1433这次从第二道的1463总线输出(上一周从第4道的1467总线输出)。
[0275] 当目标寄存器号1481与对应第二条指令的源寄存器号1483、1484中的任意一个相同时,经由逻辑1493产生的输出信号为‘1’,同时强制逻辑1491、1495和1497产生的输出信号均为‘0’;否则由逻辑1493产生的输出信号为‘0’。
[0276] 当目标寄存器号1481或1482与对应第三条指令的源寄存器号1486、1487中的任意一个相同,且逻辑1493产生的输出信号为‘0’时,经由逻辑1495产生的输出信号为‘1’,同时强制逻辑1491和1497产生的输出信号均为‘0’;否则由逻辑1495产生的输出信号为‘0’。
[0277] 当目标寄存器号1481、1482或1485与对应第四条指令的源寄存器号1488、1489中的任意一个相同,且逻辑1493和1495产生的输出信号均为‘0’时,经由逻辑1497产生的输出信号为‘1’,同时强制逻辑1491产生的输出信号为‘0’;否则由逻辑1497产生的输出信号为‘0’。
[0278] 只有当逻辑1493、1495和1497产生的输出信号均为‘0’时,逻辑1491产生的输出信号为‘1’;否则由逻辑1491产生的输出信号为‘0’。
[0279] 至此,由逻辑1493、1495、1497和1491产生的输出信号组合成选择信号1439共同用于控制图11中各个令牌传递器中的选择器。以令牌传递器1441为例,逻辑1493、1495、1497和1491产生的输出信号分别对应选择器1447中从左到右的四个输入(即输入A、输入B、输入C和输入D)。
[0280] 假设当前令牌信号位于令牌传递器1441,则令牌传递器1441、1431、1433和1435对应的四条指令分别经总线1461、1463、1465和1467被同时送往相关性检测单元及执行单元。执行单元根据相关性检测单元的检测结果决定这四条指令中的哪几条可以被并行执行。同时,相关性检测单元输出的选择信号1439被送到各个令牌传递器用于传递令牌信号。
[0281] 例如,若相关性检测单元检测到所述四条指令中的第一条和后三条中至少 一条指令有写后读相关,则所有令牌传递器中的选择器均选择输入A。由于当前的令牌信号位于令牌传递器1441,因此在令牌传递器1431、1433、1435和1437中,只有令牌传递器1431的选择器的输入A的值为‘1’,其他三个令牌传递器的选择器的输入A的值均为‘0’。因此,只有令牌传递器1431的选择器的输出为‘1’,其他三个令牌传递器的选择器的输出均为‘0’,即令牌信号被传递到令牌传递器1431,表示当前只有令牌传递器1441对应的指令可以通过总线1461被送到执行单元执行,下一周期指令读缓冲将令牌传递器1431对应指令开始的四条指令输出送往执行单元和相关性检测单元。
[0282] 又如,若相关性检测单元检测到所述四条指令中的前两条指令之间没有写后读相关,但和后两条中至少一条指令有写后读相关,则所有令牌传递器中的选择器均选择输入B。由于当前的令牌信号位于令牌传递器1441,因此在令牌传递器1431、1433、1435和1437中,只有令牌传递器1433的选择器的输入B的值为‘1’,其他三个令牌传递器的选择器的输入A的值均为‘0’。因此,只有令牌传递器1433的选择器的输出为‘1’,其他三个令牌传递器的选择器的输出均为‘0’,即令牌信号被传递到令牌传递器1433,表示当前只有令牌传递器1441和1431对应的指令可以分别通过总线1461和1463被送到执行单元并行执行,下一周期指令读缓冲将令牌传递器1433对应指令开始的四条指令输出送往执行单元和相关性检测单元。其他情况也可以依此类推,从而根据连续四条指令间的相关性将令牌信号传递到相应的令牌传递器,使得指令读缓冲能输出正确的指令。
[0283] 在本发发明中,对于所述不能同时执行的指令,可以关断对应的执行单元的时钟输入或电源输入,从而阻止该指令的执行;也可以清除所述指令的执行结果,以达到同样的效果。
[0284] 根据本发明技术方案,对相关性检测模块的阻断方式进行修改,就可以支持更少数目的发射;而增加令牌传递器中选择器的输入数目并对相关性检测模块的阻断方式进行相应修改,就可以支持更多数目的发射。例如,在图11中,若要进行3发射,则可以去除与门1191、1192和1193,并将相关位信号1493固定接为‘1’,使得控制信号1739中的信号1471、
1472和1473中有且仅有一个为‘1’,而信号1474为‘0’,即根据前三条指令(即总线1461、
1462和1463 上的指令)的相关性检测结果,令牌信号被相应传递到当前令牌信号传递器之后的第一个、第二个或第三个令牌信号传递器,从而实现3发射的指令级并行。对于其他任何合适的最大指令发射数目,也可以用类似的方式进行配置。这样,可以用固定连线的方式将相关性检测模块中的相应与门阻断,在不更改其他模块的情况下,即可实现更少数目的发射;或者去除相应逻辑(如相关或门、与门及相应连线),以达到同样的效果。
[0285] 图11中的指令级并行(ILP)多发射结构可以每个时钟周期发射多条指令(上述实施例中发射数为4)。当一条分支指令在第一、二或三道发射时,如分支预测是分支成功的情形,可以以分支源指令所占的道之后(右方)的道发射分支源指令的后续指令,待下一周期将分支目标指令在第一道及其后顺序指令在第二、三、四道发射。若分支指令的执行导致的分支判断为分支不成功,则可以将与分支指令同周期发射的分支指令的后续指令及其中间执行结果清除(如不写入寄存器堆)。
[0286] 根据本发明技术方案,可以在分支预测为分支成功时在同一个时钟周期内发射分支源指令和分支目标指令及其后续指令,实现适用于指令级并行的无性能损失的分支转移。请参考图12A和图12B,其为本发明所述无损失分支转移的实施例。图12A中显示了指令读缓冲的一个指令块中的两条指令1501和1503及其对应的令牌传递器1511和1513,其中指令1503为分支指令。图12B中显示了指令读缓冲的一个指令块中的两条指令1551和1553及其对应的令牌传递器1561和1563,其中指令1551为分支指令1503的分支目标指令。为了实现无性能损失的分支转移,此实施例中令牌传递器是图11与图7A中的传递器功能的组合,既有四输入选择器1580选择以上四级令牌传递器传递过来的令牌,其输出接入与或门1581传至寄存器1585保存。与非门1580也在分支目标译码器515的控制下接收从令牌总线1537上从分支源传来的令牌注入寄存器1585。其中寄存器1585的输出1521直接控制指令1501从第一道指令总线1505流出,但其接收的从分支源传来的令牌是来自于第四道的令牌总线1547,其意义为如果分支源是在第四道发射,则分支目标于下一时钟周期(经过寄存器1585延时一个周期)在第一道发射,且信号1521经与门1587、与或门1515等传递,使指令1503等后续三条指令依次在第二道1507、第三道1555、第四道1557发射, 其原理与图11中例相同。
与或门1582接收来源于第一道令牌总线1541从分支源传来的令牌产生控制线1522控制指令1501在第二道1507发射,也经传递控制指令1503在第三道1555发射,也经传递控制指令
1503后一条指令在第四道1557发射。与或门1583接收来源于第二道令牌总线1543从分支源传来的令牌控制指令1501在第三道1555发射,也经传递控制指令1503在第四道1557发射。
与或门1584接收来源于第三道令牌总线1547从分支源传来的令牌控制指令1501在第四道
1557发射。并且在本实施例中,令牌传递总线1541、1543、1545和1547贯穿所有令牌传递器,及指令输出总线1505、1507、1555和1557贯穿指令读缓冲中的所有存储器。
[0287] 另外,在令牌传递器中还有4个传输门与4个与门。以令牌传递器1513为例,在分支源地址译码器的控制下,传输门1530可将第一道的令牌信息传送至第一道令牌总线1541,传输门1531可将第二道的令牌信息传送至第二道令牌总线1543,传输门1532可将第三道的令牌信息传送至第三道令牌总线1545,传输门1534可将第四道的令牌信息传送至第四道令牌总线1547。与门1536、1537、1538、1539也可以在分支源译码器的控制下,将令牌传递器1503中的令牌信号阻断,使其不向其下一级令牌传递器传递。其操作方式与图7中实施例类似。
[0288] 在图12A中,对于分支指令1503所在的指令块而言,可以用图11实施例中的同样方法同时发射多条指令。假设本实施例中可以支持的最大指令发射数是4,且对分支指令1503预测为分支转移发生,则当所述包含分支指令1503的指令发射数没有达到4时,可以将剩余的指令发射数用于发射分支目标指令及其后指令。例如,当令牌在控制线1521上,而指令1503上的指令是分支指令,其分支目标在图12B中的指令1551时,指令读缓冲可以同时将指令1501从第一道总线1505,分支源指令1503从第二道总线1507,可能处于另一指令块的分支目标指令1551从第三道总线1555,指令1553从第四道总线1557在同一时钟周期一并发射至处理器核以及相关性检测模块。具体地,按之前实施例所述,令牌信号所在的辅助模块通过控制信号1521控制指令1501从总线1505输出。由于指令1501不是分支指令,因此从源译码器513输出的对应令牌传递器1511的控制信号1525为‘0’,经反相器1523反相后的值(即‘1’)作为与门1526、1527、1528和1529的一个输入。此时,只有与门1526的另一个输入为‘1’(来 源于令牌传递器1511中的令牌信号),而其他三个与门的另一个输入均为‘0’。这样,与门1526的输出为‘1’,与门1527、1528和1529的输出均为‘0’。因此,令牌传递器1513中与或门1515的输出为‘1’,与或门1514、1516和1517的输出均为‘0’。因此,与或门1515的输出控制指令1503从总线1507输出。
[0289] 在本实施例中,由于分支预测为分支成功,因此从源译码器513输出的对应令牌传递器1513的控制信号1535为‘1’,经反相器1533反相后的值(即‘0’)作为与门1536、1537、1538和1539的一个输入,使得与门1536、1537、1538和1539的输出均为‘0’,从而截断了令牌信号的继续传递。同时,传输门1530、1531、1532和1534受控制信号1535控制均打开,且只有传输门1531的输入为‘1’(来源于与或门1515的输出),使得总线1543上的值为‘1’,总线
1541、1545和1547上的值均为‘0’。这样,在分支指令1503所在的指令块中只输出了分支指令1503及其前一条指令1501到执行单元和相关性检测单元。
[0290] 在图12B中,由于指令1551是分支目标指令,因此从目标译码器515输出的对应令牌传递器1551的控制信号1574为‘1’,由于总线1543上的值为‘1’,总线1541、1545和1547上的值均为‘0’。因此,与或门1564、1565和1567的输出均为‘0’,而与或门1566的输出为‘1’,控制指令1551从总线1555输出。
[0291] 同样地,若指令1551不是分支指令,从源译码器513输出的对应令牌传递器1561的控制信号1575为‘0’,经反相器1573反相后的值(即‘1’)作为与门1576、1577、1578和1579的一个输入。此时,只有与门1578的另一个输入为‘1’(来源于令牌传递器1561中的与或门1566),而其他三个与门的另一个输入均为‘0’。这样,与门1578的输出为‘1’,与门1577、
1578和1579的输出均为‘0’。因此,令牌传递器1563中与或门1567的输出为‘1’,与或门
1564、1565和1566的输出均为‘0’。因此,与或门1567的输出控制指令1553从总线1557输出。
[0292] 这样,就实现了预测分支发生时在同一个时钟周期发射分支源指令和分支目标指令及其后续指令。此外,根据之前实施例所述方法可以直接实现当预测分支不发生时同时发射包含分支源指令在内的多条连续指令。因此,采用本发明所述结构和方法即可实现适用于指令级并行的无性能损失的分支转移。
[0293] 根据本发明技术方案,还可以对之前实施例中的部件进行组合,形成更多形式的处理器系统,以实现同样的功能。请参考图13,其为本发明所述处理器系统的另一个实施例。
[0294] 如图13所示,所述处理器系统包含一个标签存储器2305、一个指令存储器2306、一个指令读缓冲2307和一个处理器核2311。
[0295] 标签存储器2305的行与指令存储器2306的行一一对应,每一行用于存储指令存储器2306中对应的指令块的块地址。
[0296] 指令存储器2306和指令读缓冲2307的结构与功能与之前实施例中的指令存储器及指令读缓冲类似。不同之处在于,指令存储器2306中的存储块与标签存储器2305中的行一一对应,可以根据标签存储器2305中对块地址匹配成功项得到的BNX找到指令存储器2306中的对应微操作块。而指令读缓冲2307中的控制单元中的寄存器存储的不是对应指令块的BNX,而是该指令块的块地址。此外,在本实施例中,表示指令块最后一个指令的结束标志被存储在指令读缓冲2307中最后一个令牌传递器中。这样,当令牌信号被传递到指令块的最后一条指令时,指令读缓冲2307不但输出对应指令供处理器2311执行,还输出所述结束标志以更新指令块地址。
[0297] 处理器核2311为改进的处理器核,其指令地址产生模块只生成指令地址中的块地址部分。所述指令块地址表示指令块的块地址,经标签存储器2305匹配得到BNX后可以找到该块地址代表的指令块在指令存储器2306中的位置。请参考图14,其为本发明所述指令地址产生模块的一个实施例。
[0298] 根据本发明技术方案,可以由指令地址生成模块直接使用指令块地址和修正后的分支转移偏移量计算分支目标指令。此时,可以事先通过所述分支指令的指令块偏移地址与分支转移偏移量相加得到所述修正后的分支转移偏移量,并存储在指令存储器2306中的所述分支指令对应的存储单元中。由于分支目标地址等于分支指令地址加上分支转移偏移量,而分支指令地址等于分支指令块地址加上分支指令块内偏移量。因此,在本发明中,分支目标地址就等于分支指令块地址加上修正后的分支转移偏移量。
[0299] 在图14中,当执行顺序指令时,由寄存器2401输出指令块地址;当执行分支目标指令时,由寄存器2403输出指令块地址。选择器2417则由表示分支 转移是否发生的TAKEN信号控制。
[0300] 具体地,当处理器核2311执行顺序指令时,若处理器核2311当前执行的指令不是指令块中的最后一个指令,则选择器2417选择寄存器2401的输出反馈给寄存器2401,从而保持寄存器2401的值不变(即指令块地址不变),即从总线2409输出的是原指令块地址。
[0301] 若处理器核2311当前执行的指令是指令块中的最后一个指令,则,选择器2417选择来源于寄存器2401的值作为加法器2423的一个输入;加法器2423的另一个输入是来源于指令读缓冲2307的表示当前指令是所在指令块中的最后一个指令的信号2421(值为‘1’),从而对寄存器2401中存储的指令块地址进行增一操作,并将增一后的值存回寄存器1201作为新的指令块地址。这样,从总线2409输出的是下一指令块地址。
[0302] 若处理器核2311执行分支指令且分支转移发生,则此时由加法器2425对从寄存器2401送来的当前指令块地址和从指令读缓冲2307送来的修正后的分支转移偏移量的高位部分相加,得到新的指令块地址并存储在寄存器2403中。这样,从总线2411输出的是分支目标指令块地址。
[0303] 需要说明的是,在本实施例中,指令块地址产生模块位于处理器核2311内部,并分别通过总线2409和2411输出供选择后在标签存储器2305匹配。然而所述指令块地址产生模块也可以独立存在与处理器核2311之外,此情况下所有操作过程与该模块位于处理器核2311内的情况相同,在此不另行说明。
[0304] 回到图13,处理器核2311通过总线2409和2411输出的指令块地址经选择器2321选择后被被送到指令读缓冲2307的控制单元与存储在其中的指令块地址进行匹配,以确定所述块地址对应的指令块对应的指令块是否已经存储在指令读缓冲2307中。若尚未存储在指令读缓冲2307中则使用上述方法在被处理器核2311执行到所述指令块前将其存储到指令读缓冲2307中。所述指令块地址还被送到标签存储器2305中进行匹配以确定所述块地址对应的指令块对应的指令块是否已经存储在指令存储器2306中,以及当所述指令块已经存储在指令存储器2306中时其对应的块号BNX。指令读缓冲2307如之前实施例所述,随着令牌信号的传递,依次输出对应的指令供处理器核2311执行。
[0305] 具体地,当处理器核2311按地址顺序执行指令、且未执行到当前指令块最 后一个指令时,由于指令块地址没有改变,因此不需要进行指令块地址在指令读缓冲2307及标签存储器2305中的匹配;指令读缓冲2307中的令牌信号在当前指令块对应的令牌信号传递器中依次传递,并输出对应指令供处理器核2311执行。
[0306] 对于按地址顺序执行时的下一指令块,选择器2321选择来源于总线2409的指令块地址(即下一指令块对应的指令块地址),并在指令读缓冲2307对该指令块地址进行匹配。
[0307] 若指令块地址在指令读缓冲2307的控制单元中匹配成功,则对应的指令块就是所述下一指令块。
[0308] 若指令块地址在指令读缓冲2307的控制单元中匹配不成功,则将所述指令块地址送到标签存储器2305匹配。在这种情况下,若匹配成功,则得到BNX,并将指令存储器2306中由该BNX指向的指令块填充到指令读缓冲2307中由替换算法确定的存储块中,使得指令读缓冲2307包含所述下一指令块。
[0309] 若指令块地址在标签存储器2305匹配不成功,则对该指令块地址低位补‘0’,构成完整的指令地址(即所述指令块地址对应的第一条指令的指令地址),再如之前实施例所述,将所述指令地址送往外部存储器获取对应指令块。获取来的指令块填充到指令存储器2306中由替换算法确定的BNX指向的存储块中。同时,所述指令块也被填充到指令读缓冲
2307中由替换算法确定的存储块中,使得指令读缓冲2307包含所述下一指令块。
[0310] 这样,当令牌信号被传递到当前指令块的最后一个指令对应的令牌信号传递器时(即处理器核2311执行到所述最后一个指令时),令牌信号受结束标志的控制,从当前指令块最后一个指令对应的令牌传递器直接传递到所述下一指令块(即前述匹配成功的指令块)的第一个指令对应的令牌传递器,之后随着令牌信号的传递,依次输出对应的指令供处理器核2311执行的过程如前所述。
[0311] 当指令读缓冲2307向处理器核2311输出分支指令供执行时,可以如图14实施例所述通过对该分支指令的块地址加上修正后的分支转移偏移量的高位计算出分支目标指令块地址。所述指令块地址被送到指令读缓冲2307中的控制单元进行块地址匹配,并将所述指令块地址送到标签存储器2305进行块地址匹配。
[0312] 若指令块地址在指令读缓冲2307的控制单元中匹配成功,则匹配成功的指 令块就是所述分支目标指令对应的分支指令块。此时,由于指令存储器2306中包含了指令读缓冲2307中的所有指令块,因此在标签存储器2305中的指令块地址匹配必定成功并得到BNX。之后,所述修正后的分支转移偏移量中的低位部分作为指令偏移地址。根据该指令偏移地址即可在指令读缓冲2307中匹配成功的指令块中找到分支目标指令。
[0313] 若指令块地址在指令读缓冲2307的控制单元中匹配不成功,则将所述指令块地址送到标签存储器2305匹配。在这种情况下,若匹配成功,则得到BNX,并将指令存储器2306中由该BNX指向的指令块填充到指令读缓冲2307中由替换算法确定的存储块中,使得指令读缓冲2307包含所述分支目标指令块。同时,所述修正后的分支转移偏移量中的低位部分作为指令偏移地址。根据该指令偏移地址即可在指令读缓冲2307中的所述分支目标指令块中找到分支目标指令。
[0314] 这样,当处理器核2311尚未产生所述分支指令的执行结果时,令牌信号继续按地址顺序依次传递并输出指令供处理器核2311执行;当处理器核2311执行所述分支指令并产生执行结果时,若分支转移没有发生,则令牌信号继续逐级依次传递输出对应的指令供处理器核2311执行。若分支转移发生,则清除所述分支指令之后已经被执行的指令对应的执行结果及中间结果,并中止令牌信号的继续传递,并指令读缓冲2307中所述BNX、BNY对应的令牌信号传递器注入令牌信号,使得指令读缓冲2307输出相应的分支目标指令供处理器核2311执行。之后,随着令牌信号的传递,依次输出对应的指令供处理器核2311执行的过程如前所述。
[0315] 本发明所述的基于指令读缓冲处理器还可以被扩展为多核处理器,并支持多于一种的指令集。图15是支持多种指令集的基于指令读缓冲的多核处理器的实施例。图中206是指令存储器,209是扫描转换器,1811、1813、1815和1817是四个处理器核。其中车道1811、1813、1815和1817只执行A指令集的指令。扫描转换器209的扫描功能与图2中的扫描器208类似,但其还有转换功能,可以将其输入的指令集B的指令转换成指令集A的相应指令。因此,图15的实施例可以同时支持指令集A和指令集B。执行指令集A时,扫描转换器只执行扫描功能,不执行指令集转换的功能。仅当执行指令集B时扫描转换209不但执行扫描功能,也执行指令集转换的功能。指令的转换是发生在指令被存进指 令存储器206之前,指令存储器206中只有指令集A的指令。因此,当各车道调用指令时,只要在指令存储器206中命中,就不需要等待指令的转换。
[0316] 进一步,在扫描转换器209中有两套指令集转换机构,分别将指令集B和指令集C转换为指令集A。在此情况下,多车道处理器中不同车道,不同线程之间等效于在执行不同指令集的指令。
[0317] 需要说明的是,本发明所述全部技术方案还可以被扩展到更多层次的缓存系统中。
[0318] 根据本发明技术方案,还可以进一步改进指令读缓冲,在不使用令牌寄存器的情况下,由循迹器(Tracker)直接控制指令读缓冲(Instruction Read Buffer,IRB)同时输出多条指令供处理器核执行,从而实现与图11实施例相同的功能。请参考图16A,其为本发明所述指令级并行结构中指令读缓冲同时输出顺序多条指令供处理器核执行的另一个实施例。
[0319] 在本实施例中,轨道表210除了根据循迹器1607输出的读指针1631寻址,经分支目标选择模块1649选择后通过总线1633输出相应的目标轨迹点BN,还直接通过总线1635输出读指针1631指向的轨道中的结束轨迹点中包含的下一指令块地址。上述地址经总线1633、1635被送到指令读缓冲107和选择器1609。为了便于显示和说明,在图16A中指令读缓冲107只显示了3个指令块(分别是指令块1601、1603和1605),且指令块中1601中只显示了4条指令的表项(例如指令行1601中的指令1611、1613、1615和1617)。对于包含更多指令块的指令读缓冲和包含更多指令表项的指令块的情况,其操作原理和运行过程也可以根据本实施例所述技术方案推导得到。具体地,与图11实施例类似,处理器核内有3个同样的执行单元,各自接收并执行总线1661、1663和1665送来的指令。每个执行单元都能执行指令集中的所有指令,且这3个执行单元共用数据存储,如寄存器堆1629。
[0320] 指令读缓冲107中的每个指令存储单元可以从外层存储器(如指令存储器206)通过总线1667向指令读缓冲107中的指令存储单元写入指令。每个指令块中按程序顺序从上到下放置指令缓存206中一行指令。每个指令存储单元有3个独立的读口。每个读口向一个执行单元提供指令。
[0321] 指令读缓冲107的每个指令块均含有一个译码模块,以指令块1601对应的 译码模块1617为例,其中的第一地址存储器505、分支目标比较器511、当前第一地址比较器509和当前第二地址译码器513与之前实施例所述的相应部件(称为分支源比较器和分支源地址译码器)相同,其中第一地址存储器505中存储了该指令块对应的BNX值,在该指令块中被填入指令时同时写入。当前第一地址比较器509对循迹器1607送来的读指针1631中的BNX与第一地址存储器505中存储的BNX进行比较,若比较结果为相等,则表示对应的指令块为当前指令块。使能(enable)第二地址译码器513对读指针1631中的BNY进行译码,其输出信号1641、1643,1645和1647中有且仅有一个‘1’。当第一地址比较器509输出‘不相等’时,第二地址译码器513的输出为全‘0’。
[0322] 指令读缓冲块构成一个矩阵,其中的指令按程序顺序从上向下排列,每行一条指令;而每列则在各行都有对应一个执行单元的指令读口从左向右排列。指令读缓冲107中第二地址译码器513的输出通过从左上到右下延伸的同一字线(word line)控制各列的读口,按从左到右的顺序通过总线1661、1663和1665输出3条顺序指令送往相关性检测模块1627和处理器核中的3个执行单元1621、1623和1625。使顺序的复数条指令向从左到右的复数个执行单元在同一时钟周期发射。一条指令可以根据需要在任意一列的读口输出向该列的执行单元发射。
[0323] 类似地,轨道表210经分支目标选择模块1649选择后输出的分支目标BNX被送到分支目标比较器511与第一地址存储器505中存储的BNX进行比较,若比较结果为相等,则表示对应的指令块为分支目标所在的指令块。该比较结果仅用以判断分支目标是否已在指令读缓冲107中。
[0324] 而下块(next block)地址比较器1619则用于将轨道表210输出的当前指令块的顺序地址下一指令块的BNX与第一地址存储器505中存储的BNX进行比较,若比较结果为相等,则表示对应的指令块为顺序地址下一指令块。该比较结果直接控制每个指令读缓存中第一行的(除了最左一列,该列上各行的读口都由第二地址译码器513直接控制)与门,例如与门1637及1639,的一个输入端,这些与门的另一个输入端接至令牌总线(如总线1667)以接受另一个指令读缓冲块中最后一条指令的发射列位置以使得本指令读缓冲块的起始指令们填充剩余的列,使得执行单元得到充分的利用。而各个指令读缓冲块的最后一行(除最右面的一列外)的读口控制线都接至一个或门,如或门1647或1649,这 些或门的输出是令牌总线如1667及1669作为或门所在列右方的一列的与门如1637、1639的输入。与分支目标比较器511的目的相似,下块地址比较器1619的输出也被用以判断下一指令块是否已在指令读缓冲107中。
[0325] 在本实施例中,轨道表210由三部分组成:指令类型域1671、分支目标轨迹点域1673和下一指令块号1675。其中,指令类型域1671包含了该轨道上所有指令的类型信息,例如,当某条指令是分支指令时,其对应的指令类型为‘1’,否则为‘0’。分支目标轨迹点域
1673中的每一项则对应轨道中的一个轨迹点。当一个轨迹点为分支点时,其在分支目标轨迹点域1673中对应的项中包含了该分支点的分支目标轨迹点信息。在本实施例中,轨道表
210中根据循迹器1607读指针1631中的BNX寻址,输出该轨道中的下一指令块号1675的内容被读出并作为下一指令块BNX放上总线1635,并输出指令类型域1671和分支目标轨迹点域
1673中的全部内容到分支目标选择模块1649。
[0326] 请参考图16B,其为本发明所述分支目标选择模块的一个实施例。所述分支目标选择模块的作用是从轨道表210由循迹器1607读指针1631的BNX指向的行中,选出从读指针1631的BNY开始的第一个分支点的分支目标轨迹BN。在本实施例中,分支目标选择模块1649由译码器1681、掩码器1683、寄存器1685、优先逻辑1687和选择器1689构成。其中,寄存器
1685中存储了从轨道表210输出的指令类型域1673的内容(例如图中的‘01001001’),译码器1681接收循迹器1607读指针1631中的BNY(假设为‘2’,即从该BNY开始的第一个分支点位于轨道中的第3项),并译码使得从该BNY位置之前对应的值为‘0’,其余值为‘1’,构成一个掩码字(如图中的‘00111111’),该掩码字和寄存器1685中的内容在优先逻辑1687中首先被进行逻辑与操作,得到‘00001001’,之后根据从左向右优先级递减的关系,保留该结果中优先级最高的一个‘1’,并将其他位都设置为‘0’,得到‘00001000’,作为选择信号送往选择器
1689。选择器1689则根据该选择信号对轨道表210输出的分支目标轨迹点域1673中的所有项进行选择。在本例中,由于选择信号为‘00001000’,因此选择器1689选择分支目标轨迹点域1673中的第4项(即从该BNY开始的第一个分支点)中包含的分支目标轨迹点BN经总线
1633输出。
[0327] 回到图16A,分支目标BNX和下一指令块BNX分别通过总线1633和1635 被送到各个控制模块中的分支目标比较器和下块地址比较器中与该控制模块中的存储的BNX进行比较,指令读缓冲107的所有对应各分支目标比较器的比较结果经“逻辑或”后可以得到该分支目标指令块是否已经存储在指令读缓冲107中的结果。例如,如果所有分支目标比较器的比较结果经“逻辑或”后得到‘0’,则表示该分支目标指令块尚未存储在指令读缓冲107中,此时,总线1633上的分支目标BNX经选择器1609选择后对指令存储器206寻址,读出相应的分支目标指令块填充到指令读缓冲107由替换算法确定的指令缓冲块中,同时将该BNX填到该指令缓冲块中译码模块第一地址存储器505。类似地,所有下块地址比较器的比较结果经“逻辑或”后可以得到该下一指令块是否已经存储在指令读缓冲107中的结果。若该该下一指令块尚未存储在指令读缓冲107中,则总线1635上的下一指令块BNX经选择器1609选择后对指令存储器206寻址,读出相应的下一指令块填充到指令读缓冲107由替换算法确定的存储块中,BNX同时存入相应的存储器505。因此,在下面的说明中,可以假设处理器核即将执行到的下一指令块或分支指令的分支目标指令块都已经被存储在指令读缓冲107中。
[0328] 循迹器1607中包含了两个寄存器、四个选择器和一个加法器。其中寄存器1651用于存储读指针中的BNX,寄存器1653用于存储读指针中的BNY。选择器1656根据从相关性检测模块1627送来的指令间相关性检测结果,选择固定值‘1’、‘2’或‘3’作为地址增量送往加法器1655,与寄存器1653送来的当前读指针的BNY相加,得到的和就是新的读指针BNY值。例如,若指令读缓冲107输出的3条指令之间不存在相关性,则选择器1656选择‘3’作为输出送往加法器1655,相加后得到的值就是当前BNY之后的第3条指令对应的BNY。
[0329] 由执行单元送出的分支判断信号1657控制选择器1658对加法器1655的输出和分支目标选择模块1649输出的分支目标BNX进行选择。各执行单元1621,1623与1625都有其独立的分支判断逻辑。相关性判断模块1627中有对应于每个执行单元的独立指令译码器以控制相关性检测。对于某一类同时进行分支条件产生及根据指令中分支类型进行判断的分支指令,对于在同一周期中发射的复数条分支指令,只执行按程序顺序的第一条分支指令。该各指令译码器译出 的分支类型由一个优先权编码器控制使从左到右各列第一条分支指令(即按程序顺序第一条分支指令)对应的执行单元的分支判断成为信号1657。该优先权编码器的一个功能类似图16B中的1687,比如各列的分支类型信号为‘011’,其中‘1’表示该列的指令为分支指令,优先权编码器据此产生一个只有从左数起第一个‘1’为‘1’的第一控制字‘010’用于选择各执行单元的分支判断作为分支判断信号1657。优先权编码器也产生另一个从左数起直到第一个‘1’都为‘1’,其后皆为‘0’的第二控制字‘110’用于控制各执行单元对寄存器,存储器的写回,控制字为‘0’的列中执行单元的执行结果不写回。相关性判断模块1627中的或门(如或门1492)也添加一个输入以接受定义为仅顺序第二个分支指令为‘1’的第三控制字‘001’。该第三控制字的注入使得或门1492的输出为‘1’,在无其他指令间相关性影响的条件下,控制线1657选择‘2’作为加法器1655的增量输入与当前地址指针中BNY相加后作为下一周期的地址指针BNY。该在本周向执行单元1625发射过的顺序第二条分支指令在下一周期会向执行单元1621再次发射,其后顺序两条指令则被发射至执行单元1623及1625。
[0330] 当分支转移发生时,选择器1658选择分支目标选择模块1649输出的分支目标轨迹点的BNY写入寄存器1653以更新读指针的BNY。当分支转移没有发生时,选择器1658选择加法器1655输出的BNY更新寄存器1653。
[0331] 选择器1652在加法器1655的进位输出的控制下对寄存器1651输出的当前读指针BNX(即当前指令块BNX值)和轨道表210输出的下一指令块BNX值进行选择。当加法器1655有进位输出时,表示当前指令块中的所有指令已经被送往执行单元执行,因此选择轨道表210输出的下一指令块BNX值送往选择器1654。当加法器1655没有进位输出时,表示当前指令块的尚有指令未被送往执行单元执行,因此选择寄存器1651输出的当前指令块BNX值送往选择器1654。
[0332] 同样由分支判断信号1657控制的选择器1654则对选择器1652的输出和分支目标选择模块1649输出的分支目标BNX进行选择。当分支转移发生时,选择器1654选择分支目标选择模块1649输出的分支目标轨迹点的BNX写入寄存器1651以更新读指针的BNX。当分支转移没有发生时,选择器1654选择选择器1652输出的BNX更新寄存器1653。寄存器1651,1653每时钟周期更新,除 非发生异常,比如执行单元1621等停流水线或缓存缺失等,此时通过控制线1626停止寄存器1651及1653的更新。
[0333] 此外,也可以省略选择器1652,直接将总线1635上轨道表210输出的下一指令块BNX送到选择器1654,并由分支是否发生的TAKEN信号和加法器1655的进位输出信号一同控制寄存器1651的更新。此时,若有分支转移发生,则选择器1654选择分支目标选择模块输出的分支目标BNX输出到寄存器1651,而寄存器1651在TAKEN信号的控制更新为该分支目标BNX;若分支转移没有发生且加法器1655有进位输出,则选择器1654选择轨道表210输出的下一指令块BNX输出到寄存器1651,而寄存器1651在该进位输出新号的控制更新为该下一指令块BNX;若分支转移没有发生且加法器1655没有进位输出,则寄存器1651不更新,保持原BNX。
[0334] 这样,在每个时钟周期,循迹器1607都输出一个读指针1631送往各个指令读缓冲块对应的控制模块。以模块1617为例,若其对应的指令块是当前指令块,则当前第二地址译码器513在当前第一比较器509输出的“相等”信号控制下,对读指针1631中的BNY译码,并将相应的输出置为‘1’,其余输出置为‘0’。首先对没有发生分支转移的情况进行说明。例如,若读指针1631的BNY为‘0’,则当前第二地址译码器513的输出控制线1641为‘1’,控制线1643和1645均为‘0’。如图16A所示,在控制线1641的控制下,分别从总线1661、1663和1665输出指令存储单元1611、1613和1615中存储的指令,即同时输出连续的3条指令送往执行单元1621、1623、1625和相关性检测模块1627。循迹器1607则根据相关性检测模块1627的输出对读指针中的BNY增加‘1’、‘2’或‘3’,并保持BNX不变,得到新的读指针值,指向下次并行输出的连续3条指令的第一条。
[0335] 又如,若读指针1631的BNY为‘3’,则第二地址译码器513的输出控制线1647为‘1’,控制线1641,1643和1645均为‘0’。如图16A所示,在控制线1645的控制下,从总线1661输出指令存储单元1617中的指令,且控制线1647上的‘1’还被送到或门1647,使得或门1647输出‘1’并放上令牌总线1667。即进行跨读缓冲边界发射。
[0336] 此时,在下一指令块对应的控制模块中,比较器1619输出的‘1’被送到 与门1637和1639作为一个输入。与门1637和1639的另一个输入分别是总线1667和1669。与门1637的两个输入均为‘1’,因此输出的控制线1638值为‘1’,控制指令存储单元1611和1613分别输出指令经总线1663和1665输出。这样,总线1661上输出的是当前指令块的最后一条指令,而总线1663和1665上输出的分别是下一指令块中的第一、二条指令,即同时输出连续的3条指令送往执行单元1621、1623、1625和相关性检测模块1627。把指令读缓冲块视为一个矩阵的,则下块地址比较选择某个块的第一行(该块第一条指令),而上一指令块的最后一条指令所占用的执行单元的列信息(表示为已占用的列右方的一列)则通过令牌总线传递到所有的指令读缓冲块。从选定的行及列交叉出的读口开始,发射顺序的指令直到所有的列/执行单元都在同一时钟周期被使用。循迹器1607则根据相关性检测模块1627的输出对读指针中的BNY增加‘1’、‘2’或‘3’。在本例中,由于BNY至少加‘1’,因此加法器1655的进位输出一定为‘1’,使得轨道表210输出的下一指令块BNX被存储到寄存器1651中,且加法器1655输出的和被存储到寄存器1653中,从而得到新的读指针值,指向下一指令块中下次并行输出的连续3条指令的第一条。
[0337] 下面再对发生分支转移的情况进行说明。当发射的指令在相关性检测模块1627中译码含有含有分支指令时,优先权判断逻辑控制使按程序顺序第一条分支指令相应的执行单元对其进行分支判断,判断结果1622控制选择器1654与1658。当分支转移不发生时,选择器1654选择1652选择器的输出,选择器1658选择加法器1655的输出,下一周期执行状况一如上述非分支指令。
[0338] 当分支转移发生时,优先权判断逻辑控制该分支指令之后指令的相应执行单元不将执行结果写回寄存器如寄存器堆1629(执行无条件跳转指令时亦如此)。同时在‘有效’的判断结果1622控制下,选择器1654与1658都选择轨道表210经总线1633输出的分支目标轨迹点。循迹器1607的寄存器1651和1653分别被更新为分支目标轨迹点的BNX和BNY,作为新的当前读指针值,使指令缓冲器中的相应译码器使能(enable)相应字线(word line)控制分支目标指令所在指令存储单元最左一列的读口读取指令经总线1661送往执行单元1621执行;同时同一读口控制线使得其后的顺序指令沿从左到右依序向相应执行单元发射;同时该新的当前读指针值经总线1631送往轨道表210读取对应轨道。 分支目标所在轨道上的信息由轨道表210输出供循迹器1607及指令读缓冲107中的译码器使用。
[0339] 如果过程中需要跨过指令缓冲块边界,比如分支目标是一个指令读缓冲块的最后一条指令则该指令经由总线1661送往执行单元1621执行,同时令牌总线1667‘有效’,使得由此时从轨道表210中经总线1635输出的分支目标指令的下一指令块的地址匹配指向的指令读缓冲块的第一条指令沿总线1663向执行单元1623,第二条指令沿总线1665向执行单元1625发射。此后操作如同非分支指令。下一时钟周期该分支目标加上由相关性检测模块
1627确定的增量1659成为新的读指针,由读缓冲107中译码器译码以确定该周期发射的指令的位置。
[0340] 根据本发明技术方案,还可以对图16A实施例做进一步改进。请参考图17,其为本发明所述指令级并行结构中指令读缓冲同时输出顺序多条指令供处理器核执行的另一个实施例。在本实施例中,当从循迹器读指针指向的指令开始的连续发射的指令中存在分支指令,则指令读缓冲除了输出该分支指令及其之前的指令外,还根据记录在轨道表中的该分支指令的分支转移是否发生的预测信息,输出该指令的顺序地址后续指令或从分支目标指令开始的后续指令。
[0341] 在本实施例中,指令存储器206、相关性检测模块1627、执行单元1621、1623和1625、寄存器堆1629、循迹器1607和选择器1609均与图16A实施例中的相应部件相同。此外,为了便于显示,图17中的轨道表1710已经包含了图16A中的轨道表210及分支目标选择模块
1649。本实施例与图16A实施例的不同之处在于,控制模块中增加了预测判断器1709、选择器1711、1713、目标译码器1715和终止译码器1717。此外,在指令读缓冲107的每个指令存储单元中也增加了相应的控制逻辑。在此,每个指令存储单元中均含有三态门逻辑,每个指令块的第一个指令存储单元中还含有与门,而其他指令存储单元中含有复合门,如:指令存储单元1611中的与门1721、1723和三态门1725、1727,指令存储单元1613中的复合门1731、
1733和三态门1735、1737,以及指令存储单元1615中的复合门1771、1773和三态门1775、
1777。
[0342] 具体地,在控制模块1617中,第一地址存储器505、分支源比较器509、分支目标比较器511、下块地址比较器1619和分支源译码器513与图16A实施例中的相应部件相同。
[0343] 在本实施例中,分支源比较器509的输出除了如前所述控制分支源译码器513的使能外,还控制终止译码器1717的使能。预测判断器1709则根据轨道表1710中存储的当前轨道上分支点的分支预测信息和读指针1631中的BNY产生相应的控制信号送往终止译码器1717,产生清除信号1741、1743或1745送到相应的指令存储单元。在此,终止译码器1717输出的清除信号的缺省值为‘1’,表示不中断控制信号1641、1643或1645的传递;一旦清除信号为‘0’,则相应指令存储单元中的与门或复合门的输出为‘0’,且三态门被打开,使得相应控制信号上的‘1’不再被传递到下一个指令存储单元,而是被送上总线1763或1765传递到所有的指令块。
[0344] 此时,各个控制模块中的选择器1711和1713均选择与分支目标相关的输入(即分支目标比较器511的输出和总线1633上的分支目标BNY),使得分支目标指令块对应的控制模块中的分支目标译码器1715被使能,译码输出对应分支目标指令所在指令存储单元的控制信号,控制该指令存储单元中的与门或复合门将总线1763或1765上的‘1’传递到该指令存储单元中以控制输出相应指令,使得指令读缓冲107在分支预测为发生的情况下,能够同时输出分支指令及其分支目标指令。
[0345] 在下面的例子中,为了便于说明,假设一个指令块中的第2条指令是一条预测为分支转移发生的分支指令,且其分支目标指令为该指令块中的第0条指令,那么当读指针1631指向该指令块且BNY为‘2’时,如前所述分支源译码器513输出的控制信号1645为‘1’,控制指令存储单元1615输出指令到总线1661。由于该分支指令预测为分支转移发生,因此预测判断器1709将该分支指令的BNY(即‘2’)送到终止译码器1717,并在分支源比较器509输出的使能控制下,终止译码器1717输出的清除信号1741、1743和1745的值分别为‘1’、‘1’和‘0’,则三态门1775打开,控制信号1645上的‘1’传送到总线1763上(总线1765的值则为‘0’)。
[0346] 与此同时,选择器1711选择分支目标比较器511输出的比较结果对相应的目标译码器1715使能,选择器1713选择总线1633上的分支目标BNX作为输入送到目标译码器1715作为译码输入,使得分支目标BNX对应的控制模块中的目标译码器1715能对分支目标BNX进行译码,输出的控制信号1751、1753 和1755分别为‘1’、‘0’、‘0’。此时,指令存储单元1611中的与门1721的输出为‘1’,与门1723的输出为‘0’。指令存储单元1613中的复合门1731的输出为‘0’,复合门1733的输出为‘1’这样,指令存储单元1613和1615分别在与门1721和复合门1733输出的‘1’的控制下,将指令放上总线1663和1665。
[0347] 这样,在本实施例中,当循迹器1607读指针1631指向的连续3条指令中的分支指令被预测为分支转移发生时,指令读缓冲107将读指针1631指向的指令直到分支指令,以及该分支指令的分支目标指令及其后续指令一起发射给执行单元1621、1623、1625以及相关性检测模块1627。若该分支指令被预测为分支转移不发生,则如图16A实施例所述那样,指令读缓冲107将读指针1631指向的指令直到分支指令,以及该分支指令的顺序地址后续指令一起发射给执行单元1621、1623、1625以及相关性检测模块1627。
[0348] 在上述实施例中,每个周期指令读缓冲都能发射多条指令供执行单元执行,而这多条指令中可能包含多条数据访问指令,因此可以增加一个数据读缓冲用于暂存执行单元可能需要的指令,并可以同时向执行单元提供这些数据访问指令对应的数据,以减少或消除等待数据造成的流水线暂停时间。
[0349] 请参考图18A,其为本发明所述包含数据读缓冲的处理器系统的一个实施例。在图18A中,指令读缓冲1804对应的译码模块1802(结构和功能与图16A或图17中的译码模块
1617相同)接收总线1801上循迹器输出的BN,产生控制信号(即指令读缓冲地址1803)对指令读缓冲1804寻址。数据读缓冲1808中的表项(即存储单元)和指令读缓冲1804中的表项(即存储单元)一一对应,且受另一个同样接收总线1801上循迹器输出BN的译码模块1802输出的控制型号寻址。在本实施例中,数据读缓冲1808中的每个表项包含有效位和数据,并具有多个读口,每个读口对应一个执行单元1806。数据读缓冲1808的结构和功能与图16A或图
17实施例中的指令读缓冲107相同。即,每个表项都具有一个写口和多个读口,且每个读口为一个执行单元提供数据。当指令读缓冲1804的一个表项通过总线1805向执行单元1806发射数据读取(LOAD)指令时,该表项在数据读缓冲1808中的对应表项也向执行单元1806发射相应的数据。或者,可以根据特定的流水线体系结构,数据读缓冲1808中的该对应表项在另外的一个时钟周期向执行单元1806发射相应的数据。通常可以通过对总线1801送往 与数据读缓冲1808连接的译码器1802的地址进行延时发送以达到这种时序调整的目的。此外,也可以只使用一个译码器1802,并通过其输出总线1803同时向指令读缓冲1804和数据读缓冲1808送地址。
[0350] 请参考图18B,其为本发明所述包含数据读缓冲的处理器系统的另一个实施例。在此,数据读缓冲1818中的表项数目与指令读缓冲1814中的表项数目不同。数据读缓冲1818的结构和功能与图16A或图17实施例中的指令读缓冲107相同,但其表项数目并不与指令读缓冲1814一一对应。在本实施例中,指令读缓冲1814的每个表项都有一个额外的域1816用于存储一个数据读缓冲表项地址(DRBA),并由一个数据读缓冲地址译码器1820对所述DRBA进行译码以选择相应的数据读缓冲表项。当指令读缓冲1814的一个表项通过总线1805向执行单元1806发射数据读取指令时,存储在该表项中的数据读缓冲表项地址(DRBA)经总线1809被送往译码器1820译码后选择数据读缓冲1818中由该DRBA寻址的一个表项,并在一个合适的流水线周期(可以通过对总线1809上的地址进行延时发送来实现)通过总线1807将该表项中的数据送往执行单元1806。当一个指令读缓冲表项的内容被其他指令代替时,所述被代替的内容中的DRBA被读出并存储在一个替换模块中。
[0351] 请参考图18C,其为本发明所述包含数据读缓冲的处理器系统的另一个实施例。在此,由一个数据引擎1830对数据读缓冲表项进行填充。所述数据引擎1830包括一个加法器1832、一个步长(stride)存储器1836和选择器1838、1842。步长存储器1836中的每个表项包含一个数据地址1835、一个步长值1837和一个状态位1839。每当填充一个指令块时,对被填充的指令进行审查,并对每条数据读取指令在步长存储器及数据读缓冲中各分配一个表项。可以由替换逻辑将一个可用的DRBA填充到数据读取指令对应的指令读缓冲表项中,从而完成步长存储器表项和数据读缓冲表项的初始分配。在具体实现中,步长存储器的部分或全部内容(如数据地址1835、步长值1837或状态位1839)可以被存储在数据读缓冲1818中,甚至轨道表的相应表项中。然而,图18C实施例中显示了独立的数据读缓冲1818和步长存储器1836。与数据读缓冲1818类似,译码器1820对总线1809上的DRBA译码后对步长存储器1836寻址读出相应内容以计算数据地址。数据引擎1830则控制数据读缓冲1818和步长存储器1836的内 容写入与更新。在初始分配时,步长存储器被分配表项中的状态位1839和数据读缓冲1818被分配表项中的有效位均被设为‘0’。
[0352] 当一条数据读取指令第一次被指令读缓冲1814通过总线1805发射时,步长存储器1836和数据读缓冲1818中由总线1809上的DRBA寻址的表项内容被读出。此时,数据读缓冲表项的有效位值‘0’指示执行单元1806应该暂停流水线以等待数据。而步长存储器表项中的状态位1839的值‘0’控制数据引擎1830等待执行单元1806产生数据地址1831(或者,也可以由数据引擎本身计算产生所述数据地址,例如由数据引擎对数据读取指令对应的数据基地址加上数据偏移量得到数据地址)。数据引擎1830中的控制逻辑控制选择器1842选择数据地址1831经总线1843送往数据缓存1822,获取到数据经总线1823填充到数据读缓冲1818的相应表项中,并将该表项的有效位设为‘1’,同时将相应的步长存储器表项中的状态位
1839设为‘1’。当执行单元发现数据读缓冲表项中的有效位为‘1’时,通过总线1807从该表项中读出相应数据,并执行流水线的剩余部分。此时,该有效位被再次设为‘0’,且总线1843上的数据地址被填充到步长存储器1836中相应表项的数据地址域1835中。
[0353] 当该数据读取指令被再次发射时,数据读缓冲1818对应表项的该有效位中的‘0’再次使得执行单元的流水线暂停以等待数据被填充到数据读缓冲1818中。而步长存储器1836对应表项的状态位1839中的‘1’则再次使得数据引擎等待执行单元产生数据地址并通过总线1831输出,从数据缓存1822获取数据填充到数据读缓冲1818的对应表项中,并如前将有效位设为‘1’。这样,执行单元1806可以如前通过总线1807读出相应数据并继续执行。
之后,有效位‘1’和状态位‘1’触发数据引擎中的选择器1838选择本次的数据地址1831作为输出送往加法器1832,使得加法器1832执行从本次的数据地址1831中减去步长存储器1836中之前存储的旧数据地址1835的操作,得到的结果(差值)作为数据步长(stride)被存储到步长存储器1836中该表项的步长域1837中
[0354] 进一步地,所述步长域1837中的步长值被从步长存储器1836中读出并与选择器1838选出的总线1831上的本次数据地址相加,得到的结果1833就是下一次执行该数据读取指令时的可能数据地址。该地址被选择器1842选择后送上总线1843并存储在步长存储器
1836相应表项的数据地址域1837中。数据引擎 则根据总线1843上的数据地址提前从数据缓存1822获取数据并存储在数据读缓冲1818的相应表项中。此时,相应的状态位1839被设为‘2’且有效位被设为‘1’。请注意从此时开始,步长存储器1836的相应表项中存储的是事先计算好的下次数据地址,以及相应的数据步长值,而数据读缓冲1818的相应表项中存储的是事先获取到的下次数据,且数据读缓冲1818中的该表项和步长存储器1836中的该表项一同由指令读缓冲1814中该数据读取指令对应的表项中的DRBA所指向。
[0355] 因此,当下次该数据读取指令再次被执行时,需要获取的数据已经存储在数据读缓冲1818中由指令读缓冲1814中该数据读取指令所在表项中包含的DRBA所指向的表项中,且可以在合适的时间被送上总线1807。因此,执行单元1806不需要再等待从数据缓存中获取数据。当执行单元从总线1807上读取到所述数据并给出反馈(例如将数据读缓冲1818相应表项中的有效位设为‘0’)时,根据相应状态位1839的值‘2’,数据引擎1836再次通过将数据地址1835和数据步长1837相加产生下次数据地址、获取数据、如前更新步长存储器1836及数据读缓冲1818中的相应表项,并最终将该有效位设为‘1’。
[0356] 上述方法和装置能提高循环中的数据读取指令的执行效率。然而,由于根据可能的数据地址事先获取数据,因此需要对该可能数据地址的正确性进行判断。在图18C实施例中,用比较器1834对可能数据地址1835和执行单元执行数据读取指令时产生的实际数据地址1831进行比较以验证地址的正确性。如果这两个地址相同,则保留该预取数据进行后续操作,并保持状态位为‘2’。如果这两个地址不同,则将状态位设为‘1’,数据引擎重新计算数据步长,并从该状态开始重复上述过程。
[0357] 图18A实施例中的结构也可以与数据引擎一同工作。一种方法是使得步长存储器与数据读缓冲1808有相同的表项数,保持一一对应的关系(事实上此时指令读缓冲、数据读缓冲和步长存储器中的表项均各自一一对应)。因此,地址总线1803可以同时对数据读缓冲和步长存储器寻址。,另一种方法是使得步长存储器和书读缓冲的表项数目不同。此时,仍然可以用总线1803对步长存储器寻址。然而,步长存储器必须是全相联的,即由于总线1803上的地址不是连续的(并不是每条指令都是数据读取指令),因此需要一种地址机制用于检测出命 中的地址到底是哪个以进行后续的读或写操作。
[0358] 所述替换逻辑从本质上讲就是一个存储池,用于存储每个可用的数据读缓冲表项地址。当一条新的数据读取指令被填充到指令读缓冲表项中时,一个可用的DRBA被填充到该表项的域1816中。当一条已经存储在指令读缓冲表项中的数据读取指令被其他指令代替时,其对应的DRBA被送回该存储池。
[0359] 请参考图18D,其为本发明所述包含数据读缓冲的处理器系统的另一个实施例。在此采用了图18B实施例的方法由数据读缓冲向执行单元提供数据,不同之处在于本实施例中的数据读缓冲能同时提供多个数据。其中指令读缓冲1824与图16A或图17实施例中的指令读缓冲类似,数据读缓冲则与指令读缓冲在结构上类似,即每个表项有多个读口,可以同时分别向不同的执行单元提供数据。具体地,指令总线1805和1825分别向执行单元1806和1826提供指令。此外,总线1805对应的输出表项中的DRBA通过总线1809被送到译码器1820,以控制数据读缓冲1828输出相应数据放上总线1807向执行单元1806提供。总线1825对应的输出表项中的DRBA通过总线1829被送到译码器1822,以控制数据读缓冲1828输出相应数据放上总线1827向执行单元1826提供。这样,当一条数据读取指令被发射给执行单元时,相应的数据就会自动地由数据读缓冲送往执行单元。
[0360] 请参考图19A,其为本发明所述多发射指令读缓冲的一个实施例。本实施例中的指令读缓冲与图16A实施例中指令读缓冲的结构和功能相同。在此,指令读缓冲显示为一种矩阵形式或阵列形式,其中每一行对应一个指令存储单元,用于存储一条指令,且每一列至少有一个读口。此外,每一列还包含一条连接该列不同行中所有读口的总线,每一列的该总线被接至相应的一个执行单元,以及相关性检测模块。所述指令读缓冲可以被分为多个指令读缓冲块以便于寻址。每次从指令缓存中填充一个指令读缓冲块的内容到指令读缓冲中。在每个指令读缓冲块中,指令按程序的自然顺序排列,例如前述实施例中那样从上向下排列。执行单元也按程序自然顺序相应地排列以执行这些按顺序排列的指令。例如,在本实施例中,执行单元从左向右排列,在同一个时钟周期内,最左边的执行单元执行顺序指令中的第一条,其右边的执行单元执行所述顺序指令中的第二条,直至最右边的执行单元执行所述顺序指令中的最后一条。为了便于 描述,在本实施例中,所述最左边的执行单元、指令读缓冲的相应读口及总线被称为第0列,依次往右的执行单元、相应读口及总线分别被称为第
1、2、3列。
[0361] 在通常存储器中,字线(word-line)是直线形式的,其放置方向与地址线平行或垂直,从而读出一组存储单元的内容,如指令中的一系列位(bits)。然而在本实施例中,字线是按对线或锯齿线(zigzag)方向放置的,因此可以按一定的顺序读出多组存储单元的内容,如按程序自然顺序排列的多条指令。图19A实施例中的指令读缓冲是图16实施例所述指令读缓冲的一个抽象。其中指令读缓冲包含指令读缓冲块1901、1903、1905和1907。这些指令读缓冲块共享总线1910、1911、1912和1913,且每根所述总线分别可以传输完整的指令到位于相应的执行单元(第0列到第3列)。本例中的指令读缓冲是全相联结构的,因此每个指令块都可以被放置在任意一个指令读缓冲块中。图19A中的叉表示读口,即每行有4个读口,这4个读口均对应于同一个指令存储单元,但可以分别向相应的4列中的执行单元提供指令。此外,在本例中,一个指令读缓冲块包含4行,在指令读缓冲块左侧标记的数字表示相应指令存储单元中的指令的指令地址。图19A中对角线形式的的字线受左侧的译码器(图中未显示)驱动,如字线1920所示,从左上向右下斜跨指令读缓冲,直至到达上、下、左、右四个边界之一。在本实施例中,字线可以在指令读缓冲块的上边界接收令牌总线上的令牌。所述字线可以打开所有连接在该字线上的指令存储单元的相应读口,这样,无论令牌来源与左边还是右边,指令读缓冲都可以从接收到该令牌的位置开始按顺序输出连续的指令。
[0362] 图19A实施例所述指令读缓冲能在每个时钟周期向4个执行单元输出连续的4条指令(无论这4条指令是否位于同一个的指令读缓冲块中)。假设前一个时钟周期执行的最后一条指令的地址是‘1’,因此本周期从指令地址‘2’开始执行,如图19A中指令读缓冲块1901和1903所示。而下一个时钟周期的状态如图19A中的指令读缓冲块1905和1907所示。在本周期中,当前地址(以下简称为CU地址)是‘2’,而CU所在指令块的下一指令块地址(以下简称为NX地址)为‘4’,如图16A实施例所述,在控制模块的译码器的控制下,字线1922从指令读缓冲块1903的左边界地址‘2’对应处开始开启。同时,如图16A 实施例所述,下一指令块对应的指令读缓冲块1901中的下一指令块控制线1936被置为‘1’。在字线1922的使能下,总线1910和1911分别输出地址为‘2’的指令(以下简称为指令2)和地址为‘3’的指令(以下简称为指令3)。当字线1922到达指令读缓冲块1903的下边界时停止继续向右下方向的传递。由于,字线1922与结束控制线1934(以下简称为END控制线)相交,因此其上的令牌被发射(injection)到令牌总线1931(如图中实心箭头所示,所述相交和发射可以由图16A中的或门1647实现)。请注意在4列中一共有3根令牌总线,但是图中只显示了被用到的那根。令牌总线接收其左侧发射的令牌,并传递到其右侧。令牌总线的位置表示了的源指令块中最后一条指令对应哪一列,以及目标指令块中的第一条指令对应哪一列。在此,由第1列发射的令牌经令牌总线1931被传到第2列。在指令读缓冲中,只有块1901的下一指令块控制线1936为‘1’,因此由该块接收令牌。这样,当令牌总线1931和下一指令块控制线1936相交时,令牌被传递到字线1923上(如图中空心箭头所示,所述相交可以由图16A实施例中的与门1637实现)。之后,在字线1923的使能下,总线1912和1913分别输出指令4和指令5。执行单元对这4条指令译码后发现总线1911送来的指令3是一条分支指令(如图19A中读口处用圆圈表示),且分支目标是指令9。此后,执行单元执行指令3时产生分支转移不发生的判决,则在此判决控制下,执行单元完成指令2、3、4、5在流水线中的的全部操作。
[0363] 然而,如果执行单元产生了分支转移发生的判决,则位于分支指令之后的一同发射的指令被中断执行。在本例中第2、3列的指令4、5被中断执行,不再写回寄存器或存储器。执行单元只完成指令2、3在流水线中的的全部操作。在下一时钟周期,目标地址‘9’被作为CU地址送到控制模块以使能块1905,使得块1905中的字线1929有效;同时块1905的下一指令块的起始地址为‘12’,因此指令读缓冲块1907中的下一指令块控制线1938有效。在字线
1929的使能下,块1905的3个读口分别输出指令9、10和11。如前所述,字线1929到达END控制线1905时,令牌被发射到令牌总线1933上。当令牌总线1933与下一指令块控制线1938相交时,令牌被传递到字线1939上使能指令12的输出。这样,指令9、10、11和12一同被发射送往执行单元。
[0364] 这样,控制模块只需要提供CU地址和NX地址,图19A所述指令读缓冲 就可以自动地发射4条指令。在此基础上,无论如何改变发射宽度(如列的数目及执行单元的数目),都可以根据本发明的思路实现连续多条指令(这些指令可以在同一个指令读缓冲块中,也可以在不同的指令读缓冲块中)的同时发射。在本实施例中的END控制线固定放置在每个指令读缓冲块的底部,当令牌到达END控制线时,就会被发射到其右侧的令牌总线上。这在图16A实施例中通过将指令读缓冲块中到达底部的字线连接到相应的或门实现,所述或门被用于驱动其所在列及其右侧列之间的令牌总线。
[0365] 进一步地,图17实施例所述结构可以在同一个时钟周期内发射分支指令、分支目标指令及其后续指令。请参考图19B,其为本发明所述多发射指令读缓冲的另一个实施例。本实施例中的指令读缓冲是图17所述指令读缓冲的一种抽象。与图19A实施例中先将分支指令同其顺序地址的后续指令一起发射到执行单元,之后再当分支转移发生时清除这些后续指令的做法不同,本实施例所述的指令读缓冲可以根据分支指令的分支预测信息,选择分支指令的顺序地址后续指令或分支目标指令及其后续指令与该分支指令一同发射到执行单元,以进一步提高指令的并行发射效率。在本实施例中,若发射的指令中没有分支指令,或分支指令的分支预测为不发生,则与图19A的处理方法相同,在此不再赘述。
[0366] 然而,如果分支预测为发生,则除了之前所述的CU地址和NX地址外,还需要额外的两个地址。其中一个地址是分支源地址(以下简称为SO地址),即分支指令本身的地址。当SO地址对应的控制线与令牌所在的字线相交时,中断令牌向顺序地址后续指令的传递并发射到令牌总线上。另一个地址是分支目标地址(以下简称为TG地址),当TG地址对应的控制线与令牌所在的令牌总线相交时,可以从该令牌总线上接收令牌并放上相应的字线,如图17中的复合门1731所示。请注意在本实施例中,假设分支转移预测为发生,CU地址为‘5’、SO地址为‘6’(即指令6是分支指令)、TG地址为‘3’,以及NX地址为‘4’(在此的下一指令块指的是分支目标指令所在指令块的顺序地址下一指令块)。
[0367] 根据对分支目标指令块的下一指令块的不同对待,可以有两种不同的处理方法。在第一种方法中,为了避免TG控制线和NX控制线同时有效在令牌总线上造成冲突,指令读缓冲仅仅同时发射分支指令、分支目标指令及其后续直到该指令块结束的指令,而不发射分支目标指令所在指令块的顺序地址下一指令 块中的指令。如图17实施例所述,NX地址不会被送到控制模块,因此指令读缓冲的NX控制线均无效。第二种方法则在相邻的每两列之间增加一根独立的令牌总线。这样,一根令牌总线用于向TG地址传递令牌,而另一根则可以同时向NX地址传递令牌。此外,当分支转移预测为发生时,令牌在到达分支源指令之后(即与SO控制线相交时)终止在字线上的继续传递,并被发射到TG令牌总线上。此时,即使该分支源指令是一个指令块的最后一条指令,令牌也不会被发射到NX令牌总线上。这样,TG令牌总线只与TG控制线相关,而NX令牌总线只与NX控制线相关,消除了可能的冲突。下面将详细描述第二种情况。
[0368] 由于CU地址为‘5’,从指令读缓冲块的左边界开始字线1925有效。同时,根据相应的地址,SO控制线1942、TG控制线1946和NX控制线1948均有效。字线1925使能相应的读口,使得第0列输出指令5,第1列输出指令6(即图19B中用圆圈表示的分支指令)。由于字线1925与SO控制线1942相交,使得令牌被发射到TG令牌总线1962(可以由图17中的三态门实现)。SO控制线1942同时终止字线1925继续向右下传递令牌(可以由图17中的复合门的反向输入实现),因此,虽然该分支指令(指令6)的顺序地址后续指令7的读口也在字线1925上,但指令7不会被发射。NX控制线1948不会与TG令牌总线1962上的令牌发生作用。当TG令牌总线
1962与TG控制线1946相交时,其上的令牌被传递到字线1921上,使得第2列输出指令3。当字线1921到达块1957的下边界时停止,且由于字线1921与END控制线1955相交,其上的令牌被发射(在图19B中用实心箭头表示,可以由图16A中的三态门实现)到NX令牌总线1933上。当NX令牌总线1933与NX控制线1948相交时,其上的令牌被传递到字线1951上(在图19B中用空心箭头表示,可以由图17中的与门实现)。字线1951使能相应读端口,使得第3列输出指令4。
这样,在同一个时钟周期内,位于不同指令块中的指令5、6、3和4分别从第0、1、2和3列输出。
[0369] 进一步地,图19B中的指令读缓冲结构可以并行发射复数条指令(所述发射的数目等于该结构中列/执行单元的数目),无论这些指令中的分支指令及其分支目标指令是否位于同一个指令读缓冲块中。控制单元只需要在正确的时间点向指令读缓冲提供分支转移判定结果,CU地址、SO地址、TG地址和NX地址, 以引导指令读缓冲完成正确的操作。此外,当轨道表送出当前指令块的下一指令块地址,及当前指令块上的分支指令的分之目标指令地址时,控制单元还需要如图16A或图17实施例所述那样提前检查这些地址对应的指令块是否已经存储在指令读缓冲中。在本实施例中,字线按对角线方向从左上向右下传递。在图17实施例中,由字线传递方向上的逻辑门实现了上述功能。在图16A实施例中则通过在指令读缓冲的左边界或上边界注入令牌的方法实现上述功能。
[0370] 根据本发明所述技术方案,还可以对本实施例所述结构做细微改变以适用其他体系结构的用指令读缓冲发射指令的处理器系统。在下面的说明中,这种处理器系统简称为车道(lane)处理器,每个车道与之前实施例中的列类似,由指令读缓冲和执行单元构成,车道间还有相关性检测模块。不同之处在于,每个车道对应的指令读缓冲具有独立的存储单元、控制(译码)模块和控制器(如循迹器),而图16A或图17实施例中的处理器(以下简称为列处理器)中的所有列共享相同的控制模块和控制器。此外,不同车道的寄存器堆之间还具有可配置的车道间总线,使得任意车道中的寄存器堆接受或不接受从相邻车道送来的输入。
[0371] 根据本发明技术方案,可以通过在指令读缓冲的每个读口前增加一个令牌选择器对3个令牌来源进行选择以改变字线传递方向。所述令牌来源包括:该车道对应的控制模块送来的令牌(用于令牌注入)、该车道的左侧车道相同位置读口送来的令牌(使得该车道与其左侧车道输出同样的指令)、该车道的左侧车道上一位置读口送来的令牌(使得该车道输出其左侧车道指令的下一条指令)。相应地,上述三种令牌来源的选择分别对应多指令多数据流处理模式、单指令多数据流处理模式和指令级并行模式。
[0372] 请参考图20A,其为本发明所述令牌选择器的一个实施例。在此,每个读口都受一个令牌选择器的输出控制。以图20A中的令牌选择器1802为例,其第一个输入1804来源于其所在车道的控制模块中当前第二地址译码器1812,第二个输入1806来源于其左侧车道相同位置的读口,第三个输入1808来源于其左侧车道上一位置的读口。当每个车道中的令牌选择器都选择输入1804时,每个循迹器各自为相应车道提供相关地址(如:CU地址、SO地址、TG地址等,以下不再赘述),使得各个车道可以执行指令读缓冲中不同位置的指令,以下将令 牌选择器的这种配置模式简称为列相关。当每个车道中的令牌选择器都选择输入1806时,只有最左侧车道对应的循迹器对该车道提供相关地址,而其他车道均接受相应左侧车道同一位置读口送来的令牌,因此各个车道均执行指令读缓冲中相同位置的指令,以下将令牌选择器的这种配置模式简称为行相关。当每个车道中的令牌选择器都选择输入1808时,只有最左侧车道对应的循迹器对该车道提供相关地址,而其他车道均接受相应左侧车道上一位置读口送来的令牌,因此各个车道执行指令读缓冲中相邻的连续指令,以下将令牌选择器的这种配置模式简称为对角相关。根据本发明技术方案,可以通过对所述令牌选择器的选择信号进行配置,并对是否使用相关性检测模块,以及是否断开车道间总线进行配置,使得车道处理器运行在不同模式下。
[0373] 请参考图20B,其为本发明所述以多指令多数据流处理模式运行的车道处理器的一个实施例。在本实施例中,所述车道处理器系统包括四条车道2011、2013、2015和2017,每条车道包含执行单元、读取/存储单元、指令读缓冲和寄存器堆。其中,指令读缓冲2001、执行单元2011、寄存器堆2021、读取/存储单元2041与车道2011对应;指令读缓冲2003、执行单元2013、寄存器堆2023、读取/存储单元2043与车道2013对应;指令读缓冲2005、执行单元2015、寄存器堆2025、读取/存储单元2045与车道2015对应;指令读缓冲2007、执行单元
2017、寄存器堆2027、读取/存储单元2047与车道2017对应。
[0374] 当进行多指令多数据流处理时,令牌选择器被配置为列相关(即选择控制模块送来的令牌),相关性检测模块被配置为不检测,车道间总线被配置为不连接。四个车道的指令读缓冲中存储了不同的程序,在四个独立的循迹器控制下,每个车道对应的控制模块各自向相应车道提供相关地址,使得四个车道发射并执行不同的指令。相应地,四个车道对应的寄存器堆通过各自对应的读取/存储单元从数据缓存读取不同数据或将数据写回数据缓存。由于此模式下不使用车道间总线与相关性检测模块,因此四个车道可以分别基于不同的数据来源,同时执行不同的程序,即各个车道之间执行的程序与数据都互不相关,从而实现多指令多数据流处理器的功能。
[0375] 请参考图20C,其为本发明所述以单指令多数据流处理模式运行的车道处理器的一个实施例。在本实施例中,各个模块的结构及功能与图20B中的相应模 块相同。当进行单指令多数据流处理时,令牌选择器被配置为行相关(即选择左侧车道相同位置读口送来的令牌),相关性检测模块被配置为不检测,车道间总线被配置为不连接。四个车道的指令读缓冲中存储了相同的指令块,并在一个循迹器的控制下以行相关的方式向四个车道提供相同的指令。由于此模式下不使用车道间总线与相关性检测模块,因此寄存器堆中则可以存储不同的数据,且各个车道对应的读取/存储单元可以分别对不同的数据地址进行读/写操作。这样,四个车道执行同样的程序,但每个车道执行程序时用到的数据可以不同,从而实现与现有的单指令多数据流处理器相同的功能
[0376] 请参考图20D,其为本发明所述以指令级并行模式运行的车道处理器的一个实施例。在本实施例中,各个模块的结构及功能与图20B中的相应模块相同。当进行指令级并行处理时,令牌选择器被配置为对角相关(即选择左侧车道上一位置读口送来的令牌),相关性检测模块被配置为检测,车道间总线被配置为连接。四个车道的指令读缓冲中共同存储了同一个程序的相同指令块,并在一个循迹器的控制下以对角相关的方式分别向四个车道提供所述同一程序的连续4条指令,并由相关性检测模块判定这4条指令中有多少可以同时执行,并确定下一个时钟周期的CU地址。此外,四个车道中的执行单元都各自从本车道的寄存器堆取操作数,因此每个车道的执行单元产生的运算结果都要通过车道间总线传递及存储进所有四个车道的寄存器堆。如此,各执行单元取得的操作数就像从一个共用的寄存器堆取得的操作数一样。在此实施例中,每个车道的读取/存储单元都可并行从数据缓存中读取/存储不同地址的数据。在本模式下多车道处理器可以实现与现有的多发射指令级并行处理器类似的功能。此时,该车道处理器中的指令读缓冲的结构与功能与图19A、图19B实施例所述的多发射指令读缓冲相同,每个车道相当于之前实施例中的一个列。
[0377] 在图17实施例中依靠分支预测信息确定与分支指令一同发射顺序地址后续指令还是分支目标指令。根据本发明技术方案,还可以有另一种不依靠分支预测信息选择指令的无性能损失的分支处理方法,其基本思路是将执行单元中的流水线分为前端流水线和后端流水线,并使用两条前端流水线同时执行分支指令的顺序地址后续指令和分支目标指令及后续指令,直到执行单元产生分支转移判定结果后根据该结果选择上述两组指令中的一组的执行结果送往后端流水 线继续执行。在多发射情况下,前端流水线包括流水线的第一段直到产生分支转移判定结果的流水线段,后端流水线则包括其余的流水线段。
[0378] 请参考图21,其为本发明所述实现无损失分支处理的指令读缓冲结构。在此,每个列均有其自己的对应的流水线从而实现4条指令的并行执行。此外,这4列均包含2条前端流水线和1条后端流水线。具体地,在图21的指令读缓冲中,每个存储单元有8个读口,分为2组,分别对应前端流水线P和前端流水Q。每组有4个读口,用于同时发射4条指令。例如图21中的组2005和组2007,均包含指令块2001和2003上的各4个读口,分别向前端流水线P和Q提供指令。在本实施例中,组2005和组2007中只有相应列的TG令牌总线连接在一起,而NX令牌总线和其他控制线(如SO控制线、END控制线、TG控制线、NX控制线等)均不相连。
[0379] 在此,假设前端流水线P正在执行当前指令,若这些指令中没有分支指令,则与图19A的处理方法相同,在此不再赘述。然而,如果这些指令中有分支指令,则除了由组2005如图19A所述方法向前端流水线P提供指令外,还同时由组2007向前端流水线Q提供这些指令中第一条分支指令对应的分支目标指令及其后续指令。因此,控制模块除了需要向指令读缓冲提供CU地址、SO地址、TG地址外,还需要提供分支指令所在指令块的顺序地址下一指令块地址(以下简称为NXS地址)和分支目标指令所在指令块的顺序地址下一指令块地址(以下简称为NXT地址)。请注意,此处的NXS地址相当于图19A实施例中的NX地址,而NXT地址相当于图19B实施例中的NX地址。此外,为了使图21更便于阅读,没有显示END控制线。
[0380] 在本例中,CU地址为‘3’(该地址对应分支指令,如图21中圆圈所示,其分支目标为指令2),从指令读缓冲块2001的左边界开始字线2023有效,使能相应的读口,使得第0列输出指令3。同时,根据相应的地址,SO控制线2043、TG控制线2042、NXS控制线2044和NXT控制线2034均有效。由于字线2023与SO控制线2043相交,使得令牌被发射到TG令牌总线2030上。与之前实施例不同的是,SO控制线2042并不终止字线2023继续向右下传递令牌,但由于字线2023已经到达块2001的下边界并与如前所述与相应的END控制线相交,其上的令牌被发射(在图21中用实心箭头表示)到NXS令牌总线2050上。当 NXS令牌总线2050与NXS控制线
2044相交时,其上的令牌被传递到字线2024上(在图21中用空心箭头表示),使能相应读端口,第1、2、3列分别输出指令4、5、6,使得组2005同时向4个执行单元的前端流水线P分别输出指令3、4、5、6,即分支指令及其顺序地址后续指令。
[0381] 与此同时,当TG令牌总线2030与TG控制线2042相交时,其上的令牌被传递到字线2012上,使得第1、2列分别输出指令2、3。字线2012到达块2001的下边界时如前所述与相应的END控制线相交,其上的令牌被发射(在图21中用实心箭头表示)到NXT令牌总线2053上。
当NXT令牌总线2053与NXT控制线2034相交时,其上的令牌被传递到字线2014上(在图21中用空心箭头表示)。字线2014使能相应读端口,使得第3列输出指令4,使得组2007同时向后3个执行单元的前端流水线Q分别输出指令2、3、4,即分支指令的分支目标指令及其顺序地址后续指令。这样,在同一个时钟周期内,分支指令及其顺序地址后续指令被送到前端流水线P执行,其分支目标指令及其顺序地址后续指令被送到前端流水线Q执行。
[0382] 之后,若该分支指令的执行结果为分支转移不发生,则后端流水线选择前端流水线P的输出继续执行,并丢弃前端流水线Q的执行结果。若分支转移发生,则后端流水线选择前端流水线Q的输出继续指令,并丢弃前端流水线P的执行结果(此时分支指令已经执行完毕,不需要进入后端流水线继续执行)。
[0383] 请参考图22,其为本发明所述实现无损失分支处理的包含指令读缓冲的系统的一个实施例。在本实施例中,指令读缓冲2201的结构与功能和图21实施例中的指令读缓冲相同,在此不再赘述。在此主要对控制模块如何产生相关地址及如何选择前端流水线的执行结果供后端流水线使用进行说明。
[0384] 在图22中,轨道表210和分支目标选择模块1649的结构与功能与图16A中的相同,但增加了一行轨道读缓冲2210用于存储当前轨道。循迹器2207中除了图16A循迹器1607中的寄存器1651、1653和加法器1655外,还增加了选择器2258和寄存器2252,其中寄存器2252用于存储分支目标的BNX和BNY。在循迹器2207中选择器2256的输入为固定值‘0’、‘1’或‘2’,而不是图16A实施例中的‘1’、‘2’或‘3’。此外,在本实施例中共有两个执行单元,每个执行单元都具有2个前端流水线(P和Q)以及一个后端流水线,并根据前端流 水线最后一级对分支指令的执行结果选择两个前端流水线中的一个的执行结果送往后端流水线执行,并对选择器2211和2213的输入进行选择以更新循迹器2207读指针。
[0385] 在本实施例中,前端流水线P对应当前指令开始的连续两条指令。当这两条指令中的第一条是分支指令时,前端流水线Q对应该分支指令的目标指令,否则前端流水线Q不工作。需要注意的是,由于本例中指令读缓冲2201最大发射为‘2’,因此只有当第一条指令是分支指令时才会用到前端流水线Q。对于其他情况,如最大发射为‘4’时,只要前三条指令中有分支指令,都会用到前端流水线Q,具体操作过程与本例类似,在此不具体展开。此外,当指令读缓冲2201送往前端流水线P的指令中没有分支指令时,后续的操作过程与图19A相同,在此不再赘述,下面仅对送往前端流水线P的指令中包含分支指令的情况进行说明。
[0386] 循迹器2207的寄存器1651和1653中分别存储了当前指令地址(即CU地址)中的BNX和BNY。寄存器2252中存储了包含BNX和BNY的分支目标地址(即TG地址),该TG地址经选择器2213选择后,其中的BNX通过总线2214被送往轨道表210寻址找到相应的行,从而能够读出对应的NXT地址通过总线2232送往指令读缓冲2201。轨道读缓冲2210则可以直接输出NXS地址,通过总线2231送往指令读缓冲2201。指令读缓冲2201的控制模块如前检查TG地址、NXS地址和NXT地址对应的指令块是否以存在,若尚未存储在其中,则通过选择器2209选择尚未存储的指令块对应的地址送往指令缓存206读出相应指令块填充到指令读缓冲2201中。这样,指令读缓冲2201就可以在输出分支指令的情况下,如图21实施例所述那样同时输出分支指令的后续指令及分支目标指令。
[0387] 相关性检测模块2227对送往前端流水线P的两条指令之间的相关性进行判断,如前所述根据下一时钟周期CU地址可以增加的值输出控制信号2226供选择器2211选择。相关性检测模块2229在送往前端流水线P的指令中包含分支指令的情况下,对这些指令中的第一条分支指令及其之前的指令(在本例中就是第一条指令)以及送往前端流水线Q的指令及之间的相关性进行判断,如前所述根据下一时钟周期TG地址可以增加的值输出控制信号2228供选择器2211 选择。
[0388] 当前端流水线P执行分支指令产生分支转移不发生的结果时,选择器2211选择总线2226上相关性检测模块2227的输出作为选择器2256的控制信号以选出正确的CU地址增量送往加法器1655。此时可能的CU地址增量为‘1’或‘2’,即前端流水线P中两条指令不存在相关性时,增量为‘2’,否则增量为‘1’。选择器2213选择CU地址送往加法器1655从而计算得到下一周期的CU地址,并经选择器2658选择后写入寄存器1653以更新CU地址中的BNY。选择器2258则选择总线2231上的NXS地址中的BNX(即下一指令块BNX)送往寄存器1651。如前所述,此时若加法器1655有进位输出,则该进位输出控制寄存器1651的写使能,使得寄存器1651的值更新为选择器2258输出的下一指令块BNX,否则保持寄存器1651的值不变。这样,循迹器2207就产生了新的CU地址。此外,加法器1655的输出还被送往分支目标选择模块
1649以读出从该新的CU地址开始的第一个分支点的分支目标地址,即新的TG地址,之后重复上述操作即可。
[0389] 当前端流水线P执行分支指令产生分支转移发生的结果时,选择器2211选择总线2228上相关性检测模块2229的输出作为选择器2256的控制信号以选出正确的TG地址增量送往加法器1655。此时可能的TG地址增量为‘0’或‘1’,即前端流水线P中的分支指令与前端流水线Q中的指令不存在相关性时,增量为‘1’,否则增量为‘0’。选择器2213选择寄存器
2252输出的TG地址中的BNY送往加法器1655从而计算得到下一周期的TG地址的BNY,并写入寄存器1653,从而将CU地址中的BNY更新为所述下一周期的TG地址,使得下一周期时,以该TG地址作为当前指令地址提供指令。选择器2258根据加法器1655是否有进位输出进行选择。若有进位输出,选择总线2232上的NXT地址中的BNX送往寄存器1651,否则选择寄存器
2252输出的TG地址中的BNX送往寄存器1651。在分支转移发生时,寄存器1651的写使能有效,选择器2258的输出被写入寄存器1651中,从而将CU地址中的BNX更新为正确的BNX。之后重复上述操作即可。
[0390] 请参考图23,其为本发明所述实现无损失分支处理的包含指令读缓冲的系统的另一个实施例。在本实施例中,轨道表210、轨道读缓冲2210、分支目标 选择模块1649、选择器2209、指令缓存206、指令读缓冲2201、相关性检测模块2227、2229以及执行单元均与图22实施例中的相应部件相同,不同之处在于用两个循迹器2307和2309代替了图22中的循迹器
2207,并增加了一个控制器2305。
[0391] 循迹器2307和2309的结构完全相同,其中循迹器2307对应前端流水线P和相关性检测模块2227,循迹器2309对应前端流水线Q和相关性检测模块2229。这两个循迹器包含寄存器1651、1653、选择器1656、1658、2358,以及加法器1655。前端流水线P和Q中的一条对应NX地址开始的连续多条指令(在本例中指令数目为‘2’),且在这些指令中包含分支指令的情况下由另一条前端流水线对应从该分支指令的分支目标地址(TG地址)开始的连续指令,并在每次分支转移发生时交换该对应关系。为了便于说明,以下将对应CU地址的循迹器和前端流水线称为CU循迹器和CU前端流水线,将对应TG地址的循迹器和前端流水线称为TG循迹器和TG前端流水线。
[0392] 在本实施例中,当指令读缓冲2201送往CU前端流水线的指令中没有分支指令时,TG前端流水线不工作,而CU前端流水线的后续运行过程与图22实施例中前端流水线P的运行过程类似,在此不再赘述,下面仅对送往CU前端流水线的指令中包含分支指令的情况进行说明。
[0393] 控制器2305对前端流水线P和Q对分支指令的执行结果进行选择,并在每次分支转移发生时,翻转改变选择信号。具体地,控制器2305选择CU前端流水线对分支指令的执行结果控制前、后端流水线之间的选择器2331、2333的选择,当执行结果为分支转移不发生时,选择CU前端流水线的执行结果送后端流水线继续执行,当执行结果为分支转移发生时,选择TG前端流水线的执行结果送后端流水线继续执行。此外,每当CU前端流水线产生分支转移发生的信号时,两条前端流水线的对应关系发生变化,即原TG前端流水线成为新的CU前端流水线,原CU前端流水线成为新的TG前端流水线,同时原TG循迹器成为新的CU循迹器,原CU循迹器成为新的TG循迹器。此时,控制器2305也在该分支转移发生信号的控制下状态发生翻转,重新选择新的CU前端流水线对分支指令的执行结果控制前、后端流水线之间的选择器2331、2333的选择。
[0394] 首先假设当前的CU前端流水线为前端流水线P,其对应的CU循迹器2307 中的寄存器1651和1653分别存储了CU地址的BNX和BNY,其中BNY经选择器2305选择后被送往分支目标选择模块1649以读出从该CU地址开始的第一个分支点的分支目标地址,即TG地址,送往指令读缓冲2201和TG循迹器2309,使得TG循迹器2309中的寄存器1651和1653分别存储了TG地址的BNX和BNY。同时,该TG地址中的BNX被送往轨道表210以读出NXT地址。此外,可以直接从轨道读缓冲2210中读出NXS地址。这样,指令读缓冲2201接收到上述相关地址后,可以如前所述在同一个时钟周期内输出同时输出分支指令的后续指令及分支目标指令。具体地,指令读缓冲2201在CU循迹器2207送来的相关地址的控制下,输出分支指令及后续指令到前端流水线P及相关性检测模块2227,并在TG循迹器2209送来的相关地址的控制下,输出分支指令及后续指令到前端流水线Q及相关性检测模块2229。在本实施例中,由于使用了两个循迹器分别存储CU地址(如此时的循迹器2307)和TG地址(如此时的循迹器2309),则在分支转移结果尚未产生之前,这两个循迹器可以根据各自对应的相关性检测模块送来的控制信号2226和2228决定CU地址和TG地址的更新增量,在每个时钟周期同时输出更新后的CU地址和TG地址对应的连续多条指令,供前端流水线P和Q同时执行,直到分支转移结果产生。
[0395] 此时,假设前端流水线P中的分支指令的分支转移发生,则该结果经控制器2305选择后控制前、后端流水线之间的选择器2330和2331选择来源于前端流水线Q的执行结果送后端流水线继续执行。之后控制器2305在该分支转移发生的结果控制下状态翻转,在下次发生分支转移之前,选择前端流水线Q中执行分支指令的结果作为输出。同时,前端流水线Q成为CU前端流水线,前端流水线P成为TG前端流水线,循迹器2309成为CU循迹器,而循迹器2307则成为TG循迹器(若CU前端流水线Q中没有分支指令,则TG循迹器2307和TG前端流水线P不工作)。
[0396] 之后继续运行,再假设CU前端流水线Q中的分支指令的分支转移没有发生,则该结果经控制器2305选择后控制前、后端流水线之间的选择器2330和2331选择来源于前端流水线Q的执行结果送后端流水线继续执行。由于分支转移没有发生,因此控制器2305的状态不翻转,仍然选择前端流水线Q中执行分支指令的结果作为输出,并保持前端流水线Q为CU前端流水线,前端流水线P 为TG前端流水线,循迹器2309为CU循迹器,而循迹器2307为TG循迹器,继续执行指令。
[0397] 在之后的运行过程中,无论CU前端流水线中的分支指令的分支转移是否发生,均可以按如上方法操作,具体过程不再赘述。
[0398] 含有复数条前端流水线的处理器,其指令读缓冲中对应每条前端流水线有其专用的读口及位线。这些读口可以由对地址译码控制专用的字线使得其可以对不同的前端提供不同的指令流来实现如图21、22与23实施例中通过令牌总线实现的同样功能。请见图24与图25,其为对当前、下一、及目标地址译码驱动字线(word line)以控制指令读缓冲向复数条前端流水线提供复数条指令的处理器的实施例。其中图24描述地址译码控制方法所使用的指令读缓冲结构及作为例子的一段指令。图25为使用该方法的处理器的一个实施例。
[0399] 图24A为图25实施例使用的指令读缓冲的一种结构。如同图16A实施例,指令读缓冲2410的每个指令块均含有一个译码模块2417,其中的第一地址存储器505、当前第一地址比较器509和当前第二地址译码器513的结构及功能与图16A实施例所述的相应部件相同;一个当前地址2420由上述部件匹配与译码后驱动一条锯齿(即对角相关)字线2422开启总线上的读口2423、2425等,将一段顺序指令经位线2427、2429等送往执行单元处理。而下块(next block)地址比较器1619对下块地址总线2422的比较结果,如同在图16A实施例中,通过下块(NX)控制线2401直接控制每个指令读缓冲中第一行的除了最左一列以外的与门(如与门2402、2404等)上的一个输入端,这些与门的另一个输入端接至令牌总线(如总线2437、
2439等)使得本指令读缓冲块的起始指令填充上一指令读缓冲剩余的列,使执行单元得到充分的利用。不同的是本实施例中由所有指令读缓冲块共享的令牌总线由一个独立的列译码器2411驱动。本实施例中由处理器的控制单元经总线2415向列译码器2411传送下块地址的列地址,以供2411译码驱动令牌总线。列地址根据当前地址计算,或查表获得,在图25实施例中会详述。指令读缓冲块中第一行中两个输入(下块地址比较器1619与下块地址匹配产生的下块控制线与列译码器2411驱动的令牌总线)都为‘1’的与门使能(enable)其驱动的锯齿字线,控制其上的读口发射指令。如当下块控制线2401及令牌总线2437均为‘1’,则与门2402驱动总线2432,控制读口 2433、2435经位线2429、2431向执行单元发射指令。列地址是第一地址(块地址BNX)与第二地址(块内偏移量BNY)以外的第三个维度的地址,以下第三地址或BNZ均指列地址。
[0400] 图24B是本实施例中指令读缓冲的另一种结构,此结构中不使用令牌总线。每个指令读缓冲块的译码模块都含有一个列译码器2411。该译码器的列选择输出2461、2462、2463直接驱动从第一行开始的所有锯齿总线(但第一列除外)。此指令读缓冲处理当前指令地址的方式与图24A的实施例相同,不再赘述。如下块地址总线2422上的下块地址与译码模块中第一地址存储器505中存储的第一地址匹配,则下块地址比较器1619使能(enable)该译码模块中的列译码器2411。列译码器对列地址总线2415上的列地址BNZ译码,驱动相应列上的锯齿总线,从该总线控制的读口发射指令。此结构中的读口阵列不需使用逻辑门。第二地址译码器513直接驱动从最左一列开始的所有锯齿总线,列地址译码器2411驱动从最上一行开始的,除了最左一列以外的所有锯齿总线。图25中实施例使用如图24B结构的指令读缓冲。
[0401] 请看图24C,其为本实施例将执行的指令的例子。其中行2481为将同时发射的4条顺序指令,以各自本身的指令地址代表,其中画圈的指令代表该指令为分支指令。此例中所有4条指令都为分支指令,且同在一个指令读缓冲块(本例中每个指令读缓冲块包含8条指令)中,该缓冲块的第一地址为‘68’,其下块地址为‘23’。行2482则为行2481所示的4条指令的相应轨道表表项内容。如图所示,指令3的分支目标为‘68.0’,而指令4、5、6的分支目标各为‘68.7’,‘68.1’和‘68.2’(此处的地址格式为BNX.BNY)。而轨迹点2489为该轨道行的结束轨迹点,其中存有下块地址‘23’。为方便以下说明,特将上述在同一时间发射的4条不同指令,定义为依程序顺序在不同的指令发射槽(instruction issue slot)内,如行2486所示,其中指令3在A槽,指令4、5、6在B、C、D槽。图24D则以指令地址为轴线显示了如2481的指令段可能的执行轨迹。点2483指示了本周期发射的第一条指令3,阴影部分显示了同一周期发射的4条指令。图中圆圈代表分支指令与行2481中的圆圈对应;源于圆圈的弧线代表分支;而弧线末端的箭头则指向分支目标,与行2482中分支目标地址相应。其中指令地址为0~7的指令已被填入一个读指令缓冲块,其第一地址BNX为68;指令地 址为8~15的指令也已被填入另一个读指令缓冲块,其第一地址BNX为23。
[0402] 执行从指令3开始的这4条指令,根据对其中的前3条分支指令执行时的不同分支判断,在本周期内会有4种可能的程序执行途径;第4条分支指令影响下一周期,放到后面讨论。如果指令3的分支判断为成功,则执行的是分支指令3,分支目标0及其之后的指令1与2;即指令3、0、1、2。同理,如指令3分支判断为不成功,而指令4分支判断为成功;则执行的是指令3、4、7、8。同理,如指令3与4分支均判断为不成功,而指令5分支判断为成功;则执行的是指令3、4、5、1。最后,如所有指令分支均判断为不成功,则执行的是指令3、4、5、6。如指令6不分支,则下一周期执行后续指令7、8、9、10;如指令6分支,则下一周期执行分支目标指令2、
3、4、5。只要为当周可能的执行路径提供足够的执行单元及相应的指令缓冲器读口、位线,就可以将这些可能执行到的指令同时发射到复数个执行单元,由分支判断来决定那些指令应被执行。
[0403] 请看图25,其为能同时发射4条指令,并根据其中分支指令的分支判断决定程序执行走向的一个实施例。为便于说明,此实施例中执行单元的流水线为3段;指令译码D段,指令执行E段,以及指令写回W段。此实施例中的方法也可应用于其他形式,其他分段方式的流水线。指令读缓冲2505中的指令发射是在D段;指令译码,相关性检测,分支判断及寄存器堆读取均在D段。图18实施例中的数据引擎会向数据读缓冲DRB(图25中未显示)提前填充数据,在指令读缓冲的控制下DRB向E段(供旁路执行)及W段(供装载指令时填寄存器堆)提供数据;因此流水线不需要通常的数据访问M段。
[0404] 图25中轨道表2501与之前实施例不同,该轨道表可以同时输出读指针指向的表项及其后顺序的三个表项2511、2512、2513及2514,以提供4条顺序指令所指向的最多4个分支目标。从轨道表独立出来的结束轨迹点存储器2502仍按轨道表相应行的行地址存储地址,也与轨道表中相应的行同时更新;但是有4个读口,可以根据4个输入的BNX地址并行读出4个结束轨迹点。2503为列地址产生器,负责根据4个输入地址产生其下块地址(由结束轨迹点存储器提供)的相应列地址。上述4个下块地址被寄存器2530、2531、2532及2533储存,且这4个下块地址相应的列地址被寄存器2540,2541、2542及2543储存。寄 存器2530、2531、2532及2533输出的下块地址BNX被受路优先码2598控制的选择器2586选择,其输出经总线
2539送至循迹器2504中选择器2529的一个输入端以供计算下一周期的当前地址用。此外,寄存器2530、2531及2532输出的下块地址被送至读缓冲2550、2551及2553中的下块地址比较器1619,且寄存器2540,2541及2542输出的列地址被送至列地址控制器2411,共同控制其中复数个下块缓冲块中的锯齿字线。在本实施例中,寄存器2525、2530、2531、2532和2533中存储的是BNX,寄存器2526中存储的是BNY,寄存器2521、2522、2523和2524中存储的是BNX和BNY,寄存器2540、2541、2542和2543中存储的是BNZ。
[0405] 循迹器2504与前不同的是其同时可以提供当前指令地址,及从当前指令开始的4条指令中的所有分支指令的分支目标。具体地,寄存器2525、2526中分别存有当前指令的第一地址BNX与第二地址BNY;寄存器2521、2522、2523及2524接受轨道表输出2511、2512、2513、2514,存有当前指令段各条指令(此例中为四条)的分支目标地址(BNX与BNY)(此例中四个BNX均为68,四个BNY分别为0、7、1、2)。寄存器2525(BNX)和2526(BNY)的输出合并成总线2520(图中由圆圈和箭头表示两总线合并)。寄存器2521、2524、2523的输出被送至读缓冲
2504中的多个第一地址比较器509和当前第二地址译码器513以驱动多条锯齿字线。
[0406] 总线2520与寄存器2521、2522、2523、2524的输出由受分支判断结果控制的选择器2585选择。选择器2585的输出中的第一地址BNX部分2535被送往选择器2529的另一个输入端;第二地址BNY部分2536被送到加法器2528与相关性检测模块的检测结果2565控制选择器2527提供的增量相加,其结果作为新的当前第二地址BNY存入寄存器2526存储。加法器的进位输出(控制carry-out)2538控制选择器2529。当没有进位时,选择器2529选择当前第一地址2535;当有进位时,选择器2529选择下块第一地址2539;选择器2529的输出作为新的当前第一地址BNX存入寄存器2526存储。
[0407] 选择器2529的输出与加法器2528的输出也被合并成读指针2510以控制轨道表2501的读取。读指针2510(下一周的当前地址)以及轨道表2501的输出2511、2512、2513(下一周期第1、2、3条指令的分支目标地址)被送至结束 轨迹点存储器2503读取各该地址的下块地址;同时也被送至列地址产生器2503。列地址产生器产生相应的列地址。当前地址的下块地址被存入寄存器2530,其相应的列地址被存入寄存器2540。当前指令段上第1、2、3条指令的分支目标地址2511、2512及2513的相应下块地址被存入寄存器2531、2532及2533,其相应的列地址被存入寄存器2541、2542及2543。
[0408] 列地址产生器按下述方法依据输入的当前指令地址或分支目标地址产生相应的列地址。定义每个指令读缓冲块的行数(存储表项数)为n;块内偏移地址(即第二地址)为BNY,其值范围为0~n-1,最上一行为0行;共有m列,列地址为BNZ,范围为0~m-1,最左面一列为0列;则列地址可以用下列公式计算:BNZ=n-BNY,BNZ等于或大于m时结果无效。例如当n=8,m=4,Y=6时,BNZ=8-6=2。BNZ<4因此Z有效。其意义是当译码地址‘6’以驱动锯齿字线时,地址‘6’对应指令从‘0’列发射,地址‘7’对应指令从‘1’列发射,此时该锯齿字线因到达指令读缓冲块的边界而结束。同时对下块地址的译码已指出顺序下个指令读缓冲块的第一条指令,所需知道的只是这条指令应从哪一列发射,以充分利用处理器资源同时避免与当前指令读缓冲已发射的指令冲突。此时列地址BNZ=2经下一指令读缓冲块中列译码器2411驱动始于第二列的锯齿字线使该读缓冲块中的第一条指令(BNY=0)从第二列发射,第二条指令(BNY=1)从第三列发射。如果BNZ大于或m时,则产生器产生无效信号,该无效信号控制其驱动的所有列译码器2411使它们不驱动任何锯齿字线,因为在此条件下,当前指令读缓冲块向所有的列同时发射指令。可以将上述算法用一个查找表固化,以上例条件为例,当BNY=0~4,BNZ=无效;当BNY=5、6、7,BNZ=3、2、1。上述方法在n>m或n=m时有效。其他条件下的操作可以此类推。
[0409] 指令读缓冲2550、2551、2552及2553为4组如图24B结构的指令读缓冲。其中指令读缓冲2553不需要有下块地址译码器。相关性检测模块2560、2561、2562及2563根据指令间的相关性,向循迹器2504提供信号2565以选择增量以决定下一周期的当前起始地址。前端流水线2570~2579为十条前端流水线。选择器2581、2582及2583在分支判断控制下选择前端流水线的输出供后端流水线2590执行。共有四条后端流水线2590、2591、2592及2593以支持同时执行 四条指令。寄存器堆2595由所有前端流水线及后端流水线共享。方式是前端流水线2570由正在该前端流水线中处理的指令控制从寄存器堆2595中读取数据送往后端流水线2590继续处理。前端流水线2571~2579由正在各该前端流水线处理的指令控制从寄存器堆2595中分别读取数据连同译码所得的操作控制,由选择器2581、2582及2583选择送往后端流水线2591、2592及2593继续处理。被选择在后端流水线完成的指令,其执行结果被写回处理器堆2595。
[0410] 因为上述根据分支判断而确定的4条执行路径有部分是共同的,可以共享,所以前端流水线的数目共有10条;比如所有4条路径都需要执行第一顺序的指令(此例中为指令3),因此第一顺序指令只需要1条前端流水线处理而非4条前端流水线。而第二,三,四指令则各需要2、3、4个前端流水线。为便于说明,按程序执行顺序将同一周期处理的4条指令所占据的指令执行槽(instruction execution slot)按指令执行顺序分别命名为A,B,C及D槽(slot)指令。其中A槽只有一个选择,在图24C、D例中即为指令3;而B槽有两个选择,指令4(指令3不分支)或指令0(指令3分支);同理C槽有3个选择,D槽有4个选择。每个指令槽可能执行的指令都有其专用的前端流水线,如在图25中2570等前端流水线所标出的A,B,C,D,即指示该前端流水线是专门用于处理各该指令槽中指令。后端流水线2590、2591、2592和2593也以RA、RB、RC及RD来表明分别处理A、B、C、D指令槽中经分支判断选择后的指令。寄存器堆
2595由所有各指令槽的前端和后端流水线共享。
[0411] 由于同一指令槽中可能有多条指令发射,为便于描述,另将因分支指令而导致的可能不同程序执行路径定义为路(way)以资区分。现定义A、B、C槽指令都为非分支指令或虽为分支指令但假设其判断为不分支所需要的复数条指令命名为N路,在本周期内有4条指令;将A指令假设其判断为分支,其后所需要的指令命名为O路,在本周期内有3条指令;将A指令假设不分支,但B指令分支所需要的指令命名为P路,在本周期内有2条指令;将A、B指令不分支,但C指令分支所需要的指令命名为Q路,在本周期内有1条指令。A、B、C指令不分支,但D指令分支所需要的指令命名为E路,在本周期内有0条指令。请注意轨道表输出的2511、2512、2513、2514是N路中A、B、C、D槽指令的相应轨道表表项,其内容是各该指令的分支目标,也即O、P、Q、J路 的起始地址。
[0412] 第三地址BNZ可以用指令槽的字母号来标记,以有别于第一、第二地址中的数字。另外还要对上述第三地址产生的算法做一点修正以适应本实施例的指令槽定义。原来的公式得出的第三地址是相对于在当前地址发射的列号而言。若当前地址指向的指令不是在第
0列发射,则计算所得的第三地址需要补偿。其公式是BNZ=n-BNY+Z,此处Z是当前地址发射时的列号(列地址)。此处定义A槽的列号为‘0’,B、C、D槽的列号为‘1、2、3’,以便运算。但本实施例中的第三地址BNZ由字母标记。而列地址产生器2503的输入中每个输入都占据特定的发射槽,可以根据特定的输入以决定列地址Z。如输入2510上是下一周期的当前指令地址,属于N路,从A槽开始发射,因此对此输入的Z为‘0’。如输入2511上是下一周期的A槽指令的分支目标,属于O路,从B槽开始发射,因此对此输入的Z为‘1’。以此类推,输入2512,属于P路,其Z为‘2’。
[0413] 相关性检测模块2560~2563具有与图11实施例中的相关性检测模块相似的结构,但被检测相关性的指令的来源有所不同。N路相关性检测模块2560与图11实施例中相关性检测模块结构与连接完全相同,其被检测的寄存器堆地址来自于N路的4条连续指令。O路的相关性检测模块2561,其基本结构与相关性检测模块2560相似,其后三条指令来自O路的B、C、D槽,而第一条指令来自N路的A槽,图25中阴影部分显示出各相关性检测模块所要检测的各槽指令。P路相关性检测模块2562检测N路A、B槽与P路C、D槽中指令的相关关系。Q路检测器2563检测N路A、B、C槽与Q路D槽中指令的相关关系。各相关性检测模块的结果也要进行修正,例如O路发射的第一条指令是从B槽发射的,若相关性检测模块2561没有检测到相关性,则意味着增量应该为‘3’;若D槽指令检测有相关,则增量为‘2’;若C槽指令相关,则增量为‘1’;若B槽指令相关则增量为‘0’,下一周期要从B槽的指令开始发射。同理相关性检测模块2562的指令来源是N路的A、B槽与P路的C、D槽,其相应能产生的增量为‘2’(指令间无相关性)、‘1’(D槽相关)与‘0’(C槽相关)。同理相关性检测模块2563的指令来源是N路的A、B、C槽与Q路的D槽,其相应能产生的增量为‘1’(指令间无相关性),与‘0’(D槽相关)。此处假设分支 地址本身会改变处理器状态,对其后执行的指令有相关性。如并非如此,则将循迹器中寄存器2521、2522、2523中的指令类型引入相关性检测模块,禁止用分支指令的信息与其后发射槽中的指令进行相关性检测即可。所有4个相关性检测模块的增量控制输出被由分支判断控制的选择器2474选择,其输出2565控制循迹器中选择器2527,向加法器2528提供适当的增量。
[0414] 图25中的指令读缓冲按路组织,以便于说明。如果按执行槽(如车道处理器)组织,其原理与结果与按路组织一致,在此不再赘述。其中指令读缓冲2550对应N路,共有4条指令槽A、B、C、D,由各槽位线对应的前端流水线2570~2573上的标号所标识;每槽各有一列读口与位线(bitline)以将指令发射到对应的前端流水线。指令读缓冲2551对应O路的,共有3条指令槽B、C、D。指令读缓冲2552对应P路,共有2条指令槽C、D。指令读缓冲2553对应Q路,共有1条指令槽D。其中N路的指令读缓冲2550中译码器2417每次发射时均驱动其锯齿字线。而指令读缓冲2551、2552与2553是否驱动字线,均视N路发射的指令是否为分支指令而定。如果N路的A槽中为分支指令,则寄存器2521中指令类型标识为分支指令,O路指令读缓冲2551中译码器译码寄存器2521中的分支目标地址以驱动其字线;反之则不驱动字线。因为如果A槽中为非分支指令,则没有分支目标,所以O路不需发射。同理P、Q路中的字线驱动与否,视B、C槽中指令是否分支指令(寄存器2522、2523中的指令种类是否分支指令)而定。分支类型信息由轨道表中2410中读出的表项提供。本实施例中的读口由导线构成的锯齿字线直接控制,中间不需要如图16等实施例中的读口由逻辑门控制。
[0415] 当执行图24C中的指令段时,初始条件是指令地址为0~7的指令缓冲块已在指令读缓冲的一个块中,其第一地址存储器505中的地址为‘68’;指令地址为8~15的指令缓冲块已在指令读缓冲的另一个块中,其第一地址存储器505中的地址为‘23’。前一时钟周期读指针2510上的第一地址BNX为‘68’,第二地址为‘3’(图中由圆圈和箭头表示两总线合并)。以该读指针‘68.3'为地址从轨道表2501的63行第3表项开始读出连续4个表项;图24C中表项内容,即分支目标地址‘68.0’、‘68.7’、‘68.1’、‘68.2’分别从总线2511、2512、2513、2514读出送往寄存器2521、2522、2523及2524的输入,此处地址格式为 BNX.BNY。总线2510、2511与2512上的第一指令地址BNX被送至结束轨迹点存储器2502读取下块地址,第二地址BNY被送至列地址产生器2503以计算相应列地址。总线2510~2512总线上的BNX地址为‘68’,结束轨迹点存储器2502中68行的内容为‘23’,所以结束轨迹点存储器2502的3个输出都是‘23’。
送到列地址产生器2503的‘3’、‘0’,两个第二地址都产生无效的第三地址BNZ。第二地址‘7’应产生列地址‘1’,但从总线2512输入的地址其Z为‘2’,所以BNZ=8-7+2=3,因此其第三地址BNZ为‘D’。因此寄存器2530、2531及2532的输入分别为‘23’、‘23’及‘23’,寄存器格式为格式为BNX;寄存器2540、2541及2542的输入分别为‘x’、‘x’及‘D’,寄存器格式为BNZ,‘x’代表无效。
[0416] 在时钟信号更新了循迹器及下块地址寄存器后,在当前周期中,寄存器2525与2526的输出合并成的总线2520上的值‘68.3’被送往N路指令读缓冲2550,经译码器中第一地址比较器匹配及第二地址译码器译码后,驱动锯齿字线2555,沿N路的A、B、C、D槽发射指令3、4、5、6;N路的下块地址,即寄存器2530的输出‘23’和寄存器2540的输出‘x’,在N路的列译码器2411译码后不驱动任何字线。同时寄存器2521的输出‘68.0’被送到O路指令读缓冲
2551,经译码器匹配译码后,驱动锯齿字线2556,沿O路的B、C、D槽发射指令0、1、2;O路的下块地址,即寄存器2531的输出‘23’和寄存器2541的输出‘x’,在O路的译码器译码后不驱动任何字线。同时寄存器2522的输出‘68.7’被送到P路指令读缓冲2552,经译码器匹配译码后,驱动锯齿字线2557,沿P路的C槽发射指令7后字线到达当前指令读缓冲块的下边缘而终止;P路的下块地址,即寄存器2532的输出‘23’和寄存器2542的输出‘D’,在P路的译码器译码后驱动字线2558,在P路的下一指令读缓存块的‘0’行从D槽发射指令8。同时寄存器2523的输出‘68.1’被送到Q路指令读缓冲2553,经译码器匹配译码后,驱动字线2559,沿Q路的D槽发射指令1;Q路只有一个D发射槽,没有跨越读缓冲块边界的可能,因此不接受下块地址及列地址。
[0417] 分支指令3、4、5、6由N路中A、B、C、D各槽中前端流水线各自进行独立分支判断。仅当某指令槽中指令为分支指令且分支判断为分支,且该指令没有相关性时,该指令槽相应前端流水线输出的分支判断为‘分支’,其余条件 下输出的分支判断为‘不分支’。
[0418] N路各槽的4个分支判断结果被送到优先权编码器2596编为路优先码(way priority code)2598。优先权编码器2596根据指令顺序确定各相应分支判断的优先权。如果N路A槽分支判断为‘分支’,则不论B、C、D槽指令的分支判断结果,译码器输出的路优先码
2598其意义为选择O路。如果N路A槽中指令判断为‘不分支’且B槽分支判断为‘分支’的,则不论C、D槽指令的分支判断结果,译码器输出的路优先码2598其意义为选择P路。如果N路A、B槽中指令判断为‘不分支’且C槽分支判断为‘分支’的,则不论D槽指令的分支判断结果,译码器输出的路优先码2598其意义为选择Q路。如果N路A、B、C槽中指令判断为‘不分支’且D槽分支判断为‘分支’的,译码器输出的路优先码2598其意义为选择E路,E路的意义后面会解释。最后当所有A、B、C、D槽中指令判断均为‘不分支’时,译码器输出的路优先码2598其意义为选择N路。
[0419] 路优先码2598控制选择器2581、2582、2583、2584、2585与2586。并非所有选择器都需要路优先码中每种意义的控制,比如路优先码E路不控制选择器2576。先来看选择前端流水线输出以供后端流水线使用的情形。选择器2581、2582及2583选择前端流水线译码后送往后端流水线的操作控制信号及数据读缓冲送来的数据。如图18中实施例,由数据引擎填充的数据读缓冲DRB(图25中未显示),像本实施例中的指令读缓冲(IRB)2550~2553一样,组织成4路;其中N路有A、B、C、D共4槽,O路有B、C、D共3槽,P路有C、D共2槽,Q路有D槽。其槽组织与指令读缓冲2550~2553一样。DRB各槽在相应的指令读缓存器2550、2551、2552、2553各槽控制下,向后端处理器及寄存器堆提供数据。来自数据读缓冲中N路A槽的数据与N路A槽前端流水线2570产生的操作控制信号一同被送往后端流水线2580旁路执行及供给寄存器堆2595存储。来自数据读缓冲中其他各槽的数据与相应槽中前端流水线2571~2579由选择器2581、2582与2583选择供给后端流水线2591、2592、2593旁路执行及供给寄存器堆2595存储。
[0420] 如果路优先码意义是O路,则选择器2581、2582与2583均选择其O输入,即选择O路的3个前端流水线的输出作为选择器输出供后端流水线2591、2592 与2593继续处理。而前端流水线2470的输出不受分支判断影响,固定送至后端流水线2590。此时N路A槽前端流水线中的指令是指令3,而O路B、C、D槽前端流水线中是假设指令3的分支判断为‘分支’所执行的指令段,即指令3的分支目标指令0及随后两条指令(指令1与2)。即指令3、0、1、2被送往后端流水线2590、2591、2592及2593处理。
[0421] 同理当路优先码意义是P路,则选择器2581、2582与2583均选择其P输入,即N路的A、B槽前端流水线输出,以及P路所有的前端流水线(C与D槽)的输出作为选择器输出供后端流水线继续处理。即指令3、4、7、8被送往送往后端流水线2590、2591、2592及2593处理。同理当路优先码意义是Q路,则选择器2581、2582与2583均选择其Q输入,即N路的A、B、C槽前端流水线输出,以及Q路仅有的D槽前端流水线的输出作为选择器输出供后端流水线继续处理。即指令3、4、1、2被送往送往后端流水线2590、2591、2592及2593处理。同理当路优先码意义是N路,则选择器2581、2582与2583均选择其N输入,即N路的A、B、C、D槽前端流水线输出作为选择器输出供后端流水线继续处理。即指令3、4、5、6被送往送往后端流水线2590、2591、
2592及2593处理。当路优先码意义是E路时,则选择器2581、2582与2583均选择E输入,即输出指令3、4、5、6。E路与N路的选择在本周期相同,区别只有在下一周期才有意义。
[0422] 下一周期执行哪段指令也由路优先码2598来选定。路优先码控制选择器2584、2585与2586来决定程序的走向。根据由分支结果判断而形成的路优先码2598,选择器2584选择某路的增量,选择器2585选择同一路本周期执行的指令的起始地址,选择器2586选择同一路本周期的下块地址送到循迹器2504中运算以求出下一周期要执行的指令段的起始地址。具体方法是将选择器2585选出的该路在本周起始地址(存在寄存器2525、2526,或寄存器2521、2522、2523、2524中)之中的BNY地址2536与由选择器2584选择的同一路的增量控制(来自相关性检测模块2560、2561、2562或2563)经选择器2527产生的增量在加法器2528中相加,产生的和即作为下一周期指令的第二地址BNY。加法器2528的进位输出(carry-out)2538控制选择器2529;如进位输出为‘0’,则选择选择器2585输出的该路在本周期起始地址中的第一地址BNX2535;如进位输出 为‘1’,则选择选择器2586选择的该路在本周期的下块第一地址BNX 2539(来自寄存器2530、2531、2532或2533);选择器2529的输出即下一周期的第一地址BNX。此BNX,BNY合并而成的读指针2510如前被用于从轨道表2501中读取读指针指向的表项2511及其后3个表项2512、2513及2514。读指针2510等也被送往结束地址存储器2502及列地址产生器2503以获取相应的下块地址及列地址。如此,当时钟信号到来时,读指针2510上的BNX、BNY分别被锁存进寄存器2525及2526作为当前地址;轨道表输出2511至
2514被分别锁存进寄存器2521至2524作为分支目标地址;结束地址存储器2502的输出被锁存进寄存器2530~2533作为下块地址、列地址产生器2503的输出被锁存进寄存器2540~
2543作为相应列地址。处理器如前述,进行一个新的周期的操作。
[0423] 当路优先码2598为N路时,选择器2574选择指令相关检测单元2560的输出作为增量控制信号2597。当路优先码2598为O路、P路、Q路时,选择器2574相应选择指令相关检测单元2561、2562或2563的输出作为增量控制信号2597。当路优先码2591为E路时,选择器2574固定选择‘0’作为增量控制信号2597,该控制信号在选择器2527选择数值为‘0’的增量。
[0424] 以下看几个实际例子。假设分支判断为N路指令3、4、5、6都不分支,且此时相关性判断单元2560判断指令3、4、5、6之间没有相关性。此时分支优先权判断器2590输出的路优先码为N路。此时选择器2571、2572、2573选择N路的前端流水线输出送往后端流水线2581、2582、2583执行。因此指令3、4、5、6在后端流水线执行,其执行结果被写回各槽共享寄存器堆2586。选择器2574选择相关性判断单元2560输出的增量控制‘4’经2592送往加法器2528与经选择器2575选择的寄存器2526内容‘3’相加。其和为‘7’,进位为‘0’。因此选择器2529选择经选择器2575选择的寄存器2525内容‘68’。因此读指针为‘68.7’,下一周期N路执行指令7、8、9、10(其中指令8、9、10位于下一指令读缓冲块)。其他O、P、Q路从指令7、8、9的轨道表项中记载的分支目标开始执行。如果某条指令非分支指令,则相应路的指令读缓冲不会发射指令,最终分支判断时该路也不会被选中。
[0425] 假设分支判断为指令3、4、5不分支,但指令6分支,且此时相关性判断单元2560判断指令3、4、5、6之间没有相关性。此时分支优先权判断器2590 输出的路优先码为E路。此时选择器2571、2572、2573选择N路的前端流水线输出送往后端流水线2581、2582、2583执行。因此指令3、4、5、6在后端流水线执行。选择器2574选择E路的增量控制‘0’经2592送往加法器2528与经选择器2575选择的寄存器2524内容‘2’相加。其和为‘2’,进位为‘0’。因此选择器2529选择经选择器2575选择的寄存器2524内容中第一地址‘68’。因此读指针为‘68.2’,下一周期N路执行指令2、3、4、5。其他O、P、Q路从指令2、3、4的轨道表项中记载的分支目标开始执行。
[0426] 假设分支判断为A槽指令3不分支,但B槽指令4分支,且此时相关性判断单元2562判断指令3、4、7、8之间没有相关性。此时分支优先权判断器2590输出的路优先码为P路。此时选择器2571,选择N路B槽的前端流水线输出送往后端流水线2581执行。选择器2572、2573选择P路C、D槽的前端流水线输出送往后端流水线2582、2583执行。因此指令3、4、7、8在后端流水线执行。选择器2574选择相关性判断单元2562输出的增量控制‘2’经2592送往加法器2528与经选择器2575选择的寄存器2522内容‘7’相加。其和为‘1’,进位为‘1’。因此选择器
2529选择经选择器2576选择的寄存器2532内容中第一地址‘23’。因此读指针为‘23.1’,下一周期N路执行指令9、10、11、12(从下一指令块中地址为‘1’的指令开始的4条指令。其他O、P、Q路从指令9、10、11的轨道表项中记载的分支目标开始执行。
[0427] 假设分支判断为A槽指令3分支,且此时相关性判断单元2561判断O路B槽指令0与N路A槽指令3有相关性。此时分支优先权判断器2590输出的路优先码为O路。此时选择器2571、2572、2573选择O路B、C、D槽的前端流水线输出送往后端流水线2581、2582、2583执行。
因此指令3、0、1、2在后端流水线执行,但随后B、C、D槽中指令0、1、2因相关性被终止执行,只有A槽中指令3完成执行被存入各槽共享的寄存器堆2586。选择器2574选择相关性判断单元
2561输出的增量控制‘0’经2592送往加法器2528与经选择器2575选择的寄存器2521内容中第二地址‘0’相加。其和为‘0’,进位为‘0’。因此选择器2529选择经选择器2575选择的寄存器2521内容中第一地址‘68’。因此读指针为‘68.0’,下一周期N路执行指令0、1、2、3其他O、P、Q路从指令0、1、2的轨道表项中记载的分支目标开始执行。
[0428] 本实施例利用了由锯齿总线控制的指令读缓冲,可同时发射复数条顺序指令。本实施例充分利用了轨道表中存储的将被执行的指令的分支目标信息及下块地址信息,控制多组上述指令读缓冲,平行初步处理因分支指令而导致的多条程序执行路径。本实施例检测上述多条程序执行路径的指令相关性以确定该多条路径在下一周期的地址增量。本实施例对被处理的分支指令进行分支判断,根据分支指令先后顺序,产生判断结果。对上述多组指令读缓冲提供的路径中被判断结果选定的路径的一组初步处理中间结果作进一步的处理,最后结合该组的指令之间的相关性,决定将该组中部分或全部指令正常完成,其余指令中断执行(abort)。将分支判断结果选定路径的起始第二地址与该路径的地址增量相加,如其和没有溢出指令读缓冲块边界,则其作为下一周期的第二地址,该路径起始地址中的第一地址作为下一周期的第一地址;如其和溢出了指令读缓冲块边界,则将其和中在指令读缓冲块界内部分作为下一周期的第二地址,该路径起始地址的下块地址作为下一周期的第一地址。
[0429] 本发明公开了一种指令多发射的方法。其方法是将从指令地址a开始的n条顺序指令同时发射,以相关性检测模块检测该复数条指令间的相关性,根据指令间有无相关性及相关指令的位置反馈一个地址增量i;下一周期从指令地址a=a+i开始发射n条指令。定义顺序发射的指令其顺序位置为0,1,2,......,n-1;则i=p,其中p为顺序最前的相关指令位置;无相关定义指令定义为相关指令位置为n。此处定义两条有相关关系的指令中顺序后面一条的位置为相关指令位置。
[0430] 本发明所述处理器可以使用专用的数据读缓冲器。数据引擎根据指令提前将数据填充进与指令相应的数据缓冲器,指令发射时会自动从相应的数据缓冲器提取数据以执行。
[0431] 处理器的流水线可以不含通常的取指令段,从指令译码段开始;也可以不含数据访问段。指令由包含轨道表、循迹器、指令读缓冲器的指令引擎推送。数据由数据引擎预取填充数据读缓冲器,跟随发射的相关指令向处理单元推送。
[0432] 该方法的具体实施是使用斜或称锯齿字线控制一个对单一条指令(或者说广义的数据)有复数个由相互独立的位线相连接的读口的存储器,使一段连续的指令(或连续的数据)同时沿各自独立的复数条位线被送到与位线相连的复数个处理单元并行执行。上述存储器的字线可由译码器对地址译码注入令牌, 通过令牌传递以控制或由译码器对地址译码直接控制。
[0433] 上述由斜字线控制的多位线存储器在本发明中称为指令读缓冲(Instruction Read Buffer,IRB)。本发明中可以将IRB分为相同容量的指令缓冲块以便替换指令或数据。发射的一段指令可能分处不同的指令缓冲块。本发明将斜字线分为当前指令字线,与下块指令字线,分由不同的地址驱动。其中当前字线由循迹器的当前读指针驱动,或由轨道表中轨道上的分支目标地址驱动,从地址指定的特定指令缓冲块中的特定指令开始,从指令所述路(way)的顺序第一条指令发射槽(位线)开始发射一段指令直到最后一条指令发射槽(位线),或者该指令缓冲块中最后一条指令。其中下块指令字线由轨道上结束轨迹点中的下块地址与Z地址驱动,从由下块地址指定的当前或分支指令的特定顺序下个指令块中的顺序第一条指令,Z地址指定的指令发射槽开始发射一段连续指令直到最后一条指令发射槽;其中Z地址根据上述当前或分支目标指令地址中的缓冲块内地址与指令所属路的指令发射槽数求得。
[0434] 对图25公开的多发射处理器稍作修改,可以使其进一步处理分支目标及其后续指令为分支指令的分支嵌套。图27为支持同一时间内发射一段指令及其所有可能的分支的指令的一个实施例。图26为图27中实施例的原理解释及其中优先权编码器2596的结构。图27实施例在图25实施例基础上增添指令读缓冲读口、字线、前端流水线、相关检测器以及轨道表;循迹器也增添了更多寄存器、选择器以支持增添的指令路(way)。为便于理解,图27实施例中与图25实施例中功能相同或虽功能扩展了但还是执行同类功能的模块及连线仍沿用图25的标号。以26开头的标号则是新增的。请看图26A,其为图25中实施例所能处理的一段指令中的各分支路径以二叉数表示的示意图。图中每个圆点代表一条非分支指令,每个圆圈代表一条分支指令。从圆点或圆圈向下延伸的二叉树其左支代表分支指令不执行分支时,或执行非分支指令时的程序路径。该左支所连接的指令为上述圆点或圆圈的顺序下一(fall-through)指令。而圆圈的右支则代表分支指令执行分支时的程序路径。该右支连接的指令为分支目标指令。图中用虚线
[0435] 图中指令2603、2604、2605及2606即图24C中行2481所示的四条指令(指令地址3、4、5、6)。图中用虚线区隔出各指令发射槽,即指令2603从A槽发 射,指令2604、2605、2606各从B、C、D槽发射,与图25实施例一致。连接此四条指令的路径2610即为图25中的N路;从指令
2603分支的路径2611即为O路,在B、C、D槽各有一条指令;从指令2604分支的路径2612即为P路,在C、D槽各有一条指令;而从指令2604分支的路径2613即为Q路,在D槽有一条指令。如果O路、P路在B、C槽中的指令为分支指令,则图25的实施例可以将其按不分支猜测执行,然后根据分支判断决定下一周期从哪一条指令开始执行。
[0436] 图26A中N路是指令段中4条指令均为非分支指令时程序执行的路径;O路是指令2603分支,先经2603的右分支执行其分支目标指令2607,之后沿指令2607的左分支执行左分支上的两条顺序指令2608、2609。P路、Q路亦如O路一般,从分支指令出发先经右分支执行分支目标指令,其后沿分支目标指令的左分支执行其后顺序指令,直到D槽指令。本实施例中的其他路也是按此先右后左定义。
[0437] 图26B为图27中实施例所支持处理一段指令中的所有可能分支路径以完整二叉数表示的示意图。与图26A相比增添了从O路B槽中指令分支的S路2614,从O路C槽中指令分支的T路2615,从P路C槽中指令分支的U路2616,以及从S路分支的V路2617。为支持如图26B所示的所有指令都是分支指令的完整二叉树,一共需要15列指令读缓冲、位线总线以及15条前端流水线组织为八路。其中各路含有的指令发射槽不等;N路在A、B、C、D四槽都有指令发射,O路在B、C、D三槽都有指令发射,P路、S路在C、D两槽都有指令发射,Q路、T路、U路及V路只在D槽有指令发射。图25中实施例中指令读缓冲器中已有N、O、P、Q诸路,图27实施例中增添了S、T、U、V诸路。相应地循迹器/轨道表要提供驱动S、T、U、V各路的当前指令地址以及下块指令地址。
[0438] 又,当D槽中各指令为分支指令时,其各分支判断不影响本周期的指令执行,但会影响下一周期中程序执行的走向。如果在本周期内循迹器/轨道表将D槽中的分支指令的分支目标也准备好供分支判断选择,则在下一周期本实施例中处理器,在任何分支指令组合的情况下,可以根据分支判断自动选择正确的指令沿正确路径执行程序。如此则只要分支目标在轨道表中及指令读缓冲中, 则本处理器没有由分支而导致的性能损失。为达此目的,有必要为D槽的指令定义其分支路径。请看图26C,其为图26B中的二叉树图的扩展,包括D槽指令分支的示意图。为便于说明,下一周期内D槽中各指令的顺序下一(fall-through)指令(图中D槽虚线以下)仍以D槽中各指令所归属的路(way)以名之,而D槽中各指令的分支目标指令则以新增的分支路径命名。如D槽N路指令2606的顺序下一指令(左支)2601仍属N路,故该指令2601即以N名之;D槽N路指令2606的分支目标指令(右支)2602则以新增的E路命名。D槽其他指令的后续指令也按同样方式命名,由此得到在下一周期可能执行的16条路径,即图26C中D槽中指令的左分支,从左到右顺次为N、Q、P、U、O、T、S、V上述8路;及D槽中指令的右分支,从左到右顺次为E、F、G、H、I、J、K、L新增8路。请注意该新增8路不影响本周期的操作,处理器只是从存储器中取出该8路第一条指令的地址供分支判断选择,以供下一周期使用。同理,D槽指令左分支的8路,虽然用本周期中A、B、C、D各槽中指令的路名,也不影响本周期的操作。
[0439] 如此只要循迹器2504提供上述下一周期16条路径中各自第一条指令的16个地址供本周期的分支判断选择一个地址,以该地址作为下一周期的N路(不一定与本周N路同一路径)即可以执行N路上的指令段及该指令段的任何分支。以下结合图27与图26C说明。循迹器2504提供上述16个地址的方式已有一部分已在图25中说明,在图27中也完全一样,即以前一周期分支判断选择的指令地址2535、2536加上由指令相关检测器2560~2563并也由分支判断选择经总线2527控制的地址增量产生的地址作为N路地址。以该N路地址为地址在轨道表2501中读出O路、P路、Q路、E路的分支目标地址2511、2512、2513、2514在本周期起始时存入寄存器2521、2533、2523、2524,连同N路地址存入的寄存器2525(BNX)、2526(BNY)。N、O、P、Q路地址经地址总线分别送到指令读缓冲器2550、2551、2552,2553控制各该路的指令发射;而存入上述各寄存器的地址则等待本周分支判断结果的选择,加上增量后作为下一周期的N路地址。
[0440] 图26C中的各路,除上述诸路外,需要重复查表,即以轨道表的输出做为轨道表的输入地址,查询更深层次分支的目标。从图26C中可见N路为0层目 标,因其不需重新查表;O、P、Q、E诸路目标地址为1层目标地址,因其是以0层N路地址为轨道表地址从1层轨轨道表
2501读出。同理,以1层目标地址为轨道表输入地址可从2层轨道表2682、2683、2684读出2层目标地址,计有以O路地址2511从2层轨道2682读取的S、T、I路目标地址;以P路地址2512从2层轨道2683读取的U、G路目标地址;以Q路地址2513从2层轨道2684读取的F路目标地址。同理,以2层目标地址为轨道表输入地址可从3层轨道表2685,2686,2687读出3层目标地址,计有以S路地址2663从3层轨道表2685读取的V、K路目标地址;以T路地址2661从3层轨道表
2686读取的J路目标地址;以U路地址2662从3层轨道表2687读取的H路目标地址。最后,以3层V路目标地址2664为轨道表输入地址可从4层轨道表2688读出4层L路目标地址。如此获得的16个路地址被存入寄存器2511等寄存器等待前端流水线操作产生的路优先码2598控制选择器2585(在图27中是16输入,但仍沿用图25中标号以便于阅读)选择后,其中第二地址BNY经总线2536被送到加法器2528与指令相关检测器2560等产生的地址增量相加,其中第一地址BNX经总线2535被送到选择器2529以备加法器2528的进位输出2538选择作为下一周期的N路。其中N、O、P、Q、S、T、U、V诸路地址更经总线2660被送到指令读缓冲中的译码器控制各该路指令的发射,如同图25中实施例的操作一样。具体为寄存器2525、2526合并产生的N路当前地址被送到N路指令读缓冲器2550控制N路的指令发射。同理,寄存器2521、2522、
2624、2523、2625、2626、2627中的O、P、S、Q、T、U、V路目标指令地址被送到O、P、S、Q、T、U、V路指令读缓冲器2551、2552、2654、2553、2655、2656及2657以控制O、P、S、Q、T、U、V诸路指令的发射。本实施例及图25中实施例中的指令读缓冲不区分当前地址与分支目标地址,都由同样的第一地址比较器、第二地址译码器处理。
[0441] N、O、P、Q、S、T、U、V诸路指令在指令读缓冲器中都可能会遇到锯齿字线到达指令缓冲块下边缘的问题。因此必须为每一路都提供下块地址。N、O、P、Q诸路的下块地址读取与图25实施例相同。以上述从轨道表读出的N、O、P、Q、S、T、U、V诸路地址可从结束轨迹表2502中读出其相应的下块地址。其方式是将上述8路的指令地址2510、2511、2512、2513、2663、
2661、2662、 2664通过总线2641送往结束轨迹表2502,从2502中分别读取该8路的下块地址存入寄存器。其中N路的下块地址被存入寄存器2530,O、P、S路的下块地址分别被存入寄存器2531、2532及2636;而Q、T、U、V路的四个下块地址被存入寄存器2638。这8个寄存器的输出由路优先码2598控制选择器2586(在图27中是8输入,但仍沿用图25中标号以便于比较)选择一个由总线2539送往循迹器2504中的选择器2529,根据加法器2528的进位输出2538选用。
[0442] 路优先码2598一共可选择D槽指令的顺序指令N、O、P、Q、S、T、U、V八条路径及分支目标E、F、G、H、I、J、K、L八条路径共16路输入,如2585选择的16个当前及分支目标地址。但是下块地址是顺序指令地址,因此下块地址选择器2586只选择N、O、P、Q、S、T、U、V诸路的下块地址经总线2539送往选择器2529供加法器2528的进位输出选择。具体地,当路优先码2598为N路(D槽N路指令的循序下一指令),或E路(D槽N路指令的分支指令)时,下块地址选择器2586选择存放在寄存器2530的N路下块地址。同理路优先码2598为O路或I路时选择器2586选择存放在寄存器2531的O路下块地址;为P路或G路时选择器2586选择存放在寄存器2532的P路下块地址;为Q路或F路时选择器2586选择存放在寄存器2638的Q路下块地址;为S路或K路时选择器2586选择存放在寄存器2638的S路下块地址;为T路或J路时选择器2586选择存放在寄存器2638的T路下块地址;为U路时或H路时选择器2586选择存放在寄存器2638的U路下块地址;以及为V路或L路时选择器2586选择存放在寄存器2638的V路下块地址。
[0443] N、O、P、S路的指令地址也经总线2641送往列地址产生器2503。该列地址产生器与图25中列地址产生器2503相同结构,但增添了S路的计算/查找逻辑。其N、O、P路的列地址Z(以下简称为Z地址)如同图25实施例一般被存如寄存器2540、2541、2542,而新增的S路Z地址被存入寄存器2644。这四个寄存器的Z地址输出分别与下块地址组合后被放上下块地址总线2670后送往指令读缓冲器控制需要时从下块地址开始发射指令。具体是寄存器2530中的N路下块地址与寄存器2540中的N路Z地址一同被送到N路指令读缓冲2550控制N路的下块发射。同理,寄存器2531、2532及2634中的O、P、S路下块地址与寄存器2541、2542、2644中的O、P、S路Z地址各自被送到O、P、S路 指令读缓冲2551、2552、2654,控制O、P、S路的下块发射。
[0444] 在本实施例中,相关性检测模块是可配置的,即可以根据配置检测各槽指令间的相关性。请参考图28,其为本发明所述可配置的相关性检测模块的一个实施例。图28中相关性检测模块的结构与图11中的类似,不同之处在于本实施例中的或门的输出(如输出1491、1492和1493)可以被配置为‘1’,从而阻断相应槽中的与门。具体实现方法可以是将图28中的三输入或门换成四输入或门,增加的输入作为配置端,其值为‘0’时,所述四输入或门的功能与图11中三输入或门相同;为‘1’时,四输入或门的输出就为‘1’。
[0445] 例如在图28中,当或门1493的输出被配置为‘1’时,与门1193被阻断(输出为‘0’),因此与门1192和1191的输出均为‘0’,相当于图11实施例中所述的通过去除与门1191、1192和1193,同时相关位信号1493固定为‘1’,从而实现只对A、B、C三个槽中的3条指令进行相关性检测,而D槽指令对检测器而言不存在。若3条指令间均不相关,即输出1491和1492均为‘0’,则控制线1473为‘1’,控制线1472和1471为‘0’,选择地址增量‘3’;若只有C槽指令与A槽或B槽指令相关,即输出1491和1492分别为‘0’和‘1’,则控制线1472为‘1’,控制线1473和1471为‘0‘,选择地址增量‘2’;若B槽指令和A槽指令相关,输出1491为‘1’,则控制线1471为‘1’,控制线1473和1472为‘0’,选择地址增量‘1’。
[0446] 类似地,可以将输出1492配置为‘1’以配合2发射,使得只对A、B两槽同时发射的2条指令进行相关性检测,并根据‘相关’或‘不相关’的检测结果,分别选择地址增量‘2’或‘1’。具体操作过程如前,在此不再赘述。或者,还可以将输出1491配置为‘1’以配合单发射,使得相关性检测模块中对应A槽的与门全部被阻断,控制线1471、1472、1473和1474的值分别为‘1’、‘0’、‘0’、‘0’,固定选择地址增量‘1’。在本例中,由于至少要发射1条指令,因此无论相关性检测结果是什么,A槽指令总是会被发射执行的。
[0447] 结合对各指令相关性检测模块的配置及将相应前端流水线,后端流水线置于无效,可以实现可调的发射宽度以适应不同程序对性能和功耗的要求。比如可以将图25实施例中除N路以外的其各路相应资源置于无效,N路中前端流水线2571,2572,2573被置为无效,N路前端流水线2570及N路后端流水线2590 有效,指令读缓冲2550有效,指令相关性检测模块2560被如上设置成单发射,则处理器被配置成单指令发射。增加前端流水线2571,2574,P路后端流水线2591及相应的指令读缓冲器2551,将指令相关性检测模块2560,2561设置成双发射,则可实现双发射。三发射可以此类推。图25及其后的几个实施例都可以被配置成每周期发射1,2,3,或4条指令的多发射处理器。
[0448] 此外,在本实施例中,输出1491、1492和1493还被用于产生终止(abort)信号以在前端流水线中清除同时发射的指令中不可并行执行的指令执行结果。具体地,当输出1491为‘1’时,说明B槽指令与A槽指令相关,因此终止信号2810为‘1’,清除B槽前端流水线的执行结果。同时,输出1491经过或门2811、2813,使得终止信号2812和2814均为‘1’,清除C、D槽前端流水线的执行结果。这样,相当于本次只发射执行了A槽指令,且B、C、D槽的指令没有被执行,且B、C、D槽均不会有分支转移发生信号产生。
[0449] 又如,当输出1491为‘0’、输出1492为‘1’时,说明C槽指令与A或B槽指令相关且A、B槽指令不相关,因此终止信号2810为‘0’,使得B槽前端流水线正常执行。同时,输出1492的值‘1’经或门2811、2813使得终止信号2812和2814均为‘1’,清除C、D槽前端流水线的执行结果。这样,相当于本次只发射执行了A、B槽指令,且C、D槽的指令没有被执行,且C、D槽均不会有分支转移发生信号产生。
[0450] 又如,当输出1491、1492均为‘0’、输出1493为‘1’时,说明D槽指令与A、B或C槽指令相关且A、B、C槽指令均不相关,因此终止信号2810、2812均为‘0’,使得B、C槽前端流水线正常执行。同时,输出1493的值‘1’经或门2813使得终止信号2814为‘1’,清除D槽前端流水线的执行结果。这样,相当于本次只发射执行了A、B、C槽指令,且D槽的指令没有被执行,且D槽不会有分支转移发生信号产生。最后,当输出1491、1492和1493均为‘0’时,说明A、B、C、D槽指令均不相关,因此终止信号2810、2812和2814均为‘0’,使得B、C、D槽前端流水线均正常执行,相当于本次发射执行了A、B、C、D槽指令。
[0451] 此外各路相关性检测模块视其路自身有多少条指令,在同一发射槽中指令发生相关时,其设置产生的指令地址增量是不同的。如有4条指令的(只有N路), 其相关性检测模块2560为当4条指令都无相关时,其增量是‘4’;当D槽指令有相关时,其增量是‘3’;当C槽指令有相关时,其增量是‘2’;当B槽指令有相关时,其增量是‘1’。对有3条指令的(只有O路),其相关性检测模块2561设置为当3条指令都无相关时,其增量是‘3’;当D槽指令有相关时,其增量是‘2’;当C槽指令有相关时,其增量是‘1’;当B槽指令有相关时,其增量是‘0’。同理,对有2条指令的(P路,S路),其相关性检测模块2562,2563为当2条指令都无相关时,其增量是‘2’;当D槽指令有相关时,其增量是‘1’;当C槽指令有相关时,其增量是‘0’。对只有一条指令的Q,T,U,V诸路,其相关性检测模块2564-2567设置为当D槽指令无相关时,其增量是‘1’;当D槽指令有相关时,其增量是‘0’。其实施方式可以是将相关性检测模块内非本路的检测逻辑取消,并调整仍保留的检测逻辑产生的增量。
[0452] 因此图28中实际上是N路相关性检测模块2560的结构。以V路相关性检测模块2567为例,则图28中B、C槽的比较逻辑(图中由圆圈代表),或门1491、1492、2811、2813、与门1191及同列的其他与门,以及与门1192及同列的其他与门都可省去。定义或门1493的输出为‘1’时,地址增量为‘0’;当与门1193的输出为‘1’(此时或门1493的输出为‘0’时),地址增量为‘1’。图27中处理器如果最终选择V路作为下一周期的路径,则实际执行的A、B、C、D四槽指令其实分别是N、O、S、V路的。前面三路自有相应的各路相关性检测模块2560、2561、2654负责检测。2567只需负责V路的指令与前面发射槽中指令的相关性即可。其他Q、T、U路的相关性检测模块2563、2665、2666结构与此相同。其他2指令路的相关性检测模块2562、2664保留C、D槽的检测逻辑,结构可依上例类推。3指令路(O)的相关性检测模块2561保留B、C、D槽,与图28中实施例结构一样,但地址增量的定义在相同槽指令相关情况下较2560的四指令路相关性检测模块2560减‘1’。
[0453] 相关性检测逻辑的取消,也减少了终止(abort)信号如2810,2812的数目。使一个终止信号管理一条前段流水线。具体是N路相关性检测模块2560的B、C、D槽终止信号(图28中终止信号2810、2812、2814)管理N路B、C、D槽前端流水线2571、2572、2573。A槽指令不会发生相关,因此A槽前端流水线2570不需管理。O路相关性检测模块2561的B、C、D槽终止信号管理O路 B、C、D槽前端流水线2574、2575、2576。P路相关性检测模块2562的C、D槽终止信号管理P路C、D槽前端流水线2577、2578。S路相关性检测模块2664的C、D槽终止信号管理S路C、D槽前端流水线2579、2580。其余Q、T、U、V路相关性检测模块2563、2665、2666、2667的D槽终止信号分别管理各自路中的D槽前端流水线。
[0454] 回到图27,在本实施例中增加了4个指令相关性检测模块以支持新增的S、T、U、V四路。与图25稍有不同的是图27中各相关性检测模块中含有图25中增量选择器2527的功能使得图27更清晰易读,即在图27中总线2597上传递的就是地址增量本身,而非在图25中控制产生增量的控制信号。原有的支持N、O、P、Q路的检测器2560~2563与图25中相同标号的检测器其检测的范围及功能一致(除上述直接输出增量外),不再赘述。在图27中两条虚线间为一路指令的相关性检测模块,每个检测器都接受4条指令的输入,其中阴影部分显示该检测器接受的4条指令。其中新增的检测器2664支持S路指令的相关性检测,分别检测A、B、C、D四槽中的N、O、S、S路指令。即N路(指令读缓冲器2550)内与A槽前端流水线2570相应的检测器2664中阴影部分2691;O路(指令读缓冲器2551)内与B槽前端流水线2574对应的检测器2664中阴影部分2692;及S路(指令读缓冲器2654)内与C、D槽前端流水线2579、2680对应的检测器2664中阴影部分2693、2694。检测器输出的B、C、D槽终止信号控制对应的前端流水线产生的分支判断。例如:指令相关性检测模块2664的B槽终止信号(来自阴影部分2692)控制B槽前端流水线2574的分支判断;指令相关性检测模块2664的C、D槽相关信号(来自阴影部分2693、2694)分别控制C、D槽前端流水线2579、2680的分支判断;同理,检测器2665检测四槽中的N、O、O、T路指令以支持T路;检测器2666检测四槽中的N、N、P、U路指令以支持U路;检测器2667检测四槽中的N、O、S、V路指令以支持V路指令。所有8个指令相关性检测模块产生的8路地址增量由受路优先码2598控制的9输入选择器2584选择一路,选择器输出经地址增量总线2597送往循迹器2504中加法器2528与选择器2585选择的同一路的起始地址由加法器2528相加。当分支判断为E、F、G、H、I、J、K、L中一路时,选择器2584选择增量‘0’放上地址总线2597与选择器2585此时选择的该路的分支目标地址相加。
[0455] 如同在图25实施例中一样,前端流水线2570的中间处理结果由后端处理器2590继续处理。路优先码2598,如同在图25实施例中一样,亦控制选择器2581、2582、2583选择B、C、D指令发射槽中各选一路指令路径的指令供后端流水线2591、2592、2593继续处理。指令判断共有16路选择,但其实际作用是选择在16种可能路径中选择一条作为下一周期的N路,在本周期要实际执行的指令中A槽只有N路一种选择,B槽有N、O两条路径供选择,C槽有N、O、P、S四条选择路径供选择,最多的D槽有N、O、P、Q、S、T、U、V八条选择路径供选择。代表D槽分支指令的分支目标路径的路优先码与代表D槽分支指令的顺序下一条指令的路径的路优先码(亦即该D槽指令本身的路优先码)都使选择器2581等选择该D槽指令的前端流水线供后段流水线执行。具体地,当路优先码2598为N路(D槽N路指令的循序下一指令),或E路(D槽N路指令的分支指令)时,后端流水线2590、2591、2592、2593分别处理的四条发射槽的指令都来自N路,即NNNN;其中顺序第一条为来自前端流水线2570的N路A槽指令,第二条来自为前端流水线2571的N路B槽指令,第三条为来自前端流水线2572的N路C槽指令,第四条为来自前端流水线2573的N路D槽指令。此后各路都以此格式描述,即字母代表路,顺序表示发射槽A、B、C、D。同理路优先码2598为O路或I路时经选择器2581等选择后各后端流水线处理的指令为NOOO;为P路或G路时处理的指令为NOPP;为Q路或F路时处理的指令为NOPQ;为S路或K路时处理的指令为NOSS;为T路或J路时处理的指令为NOOT;为U路时或H路处理的指令为NNPU;以及为V路或L路时处理的指令为NOSV。
[0456] 综上所述,图27所示的处理器根据指令是否为分支指令,在一个时钟周期内最多可在4个发射槽中发射,由最多8路15条当前指令或最多4路7条下块指令混合而成的15条指令,到15条前端流水线处理;同时下一时钟周期可能执行的16条路径在本周的指令地址已在寄存器2521等的输出等待路优先码2598控制选择器2585选择;另外下一时钟周期可能执行的8条路径的下块指令地址已在寄存器2530等的输出等待路优先码2598控制选择器2586选择。本周期中8个指令相关性检测模块检测各路指令间相关性产生的增量输出及一个‘0’增量在选择器2584等待路优先码2598选择。15个前端流水线的输出,除了N 路A槽的2570以外,也在选择器2581、2582、2583等待路优先码2598选择。
[0457] 各前端流水线在执行分支指令时都会判断对该分支是否执行。该判断与同一路的指令相关检测器同一发射槽的终止信号,如图28中终止信号2810共同组成该前端流水线的分支判断信号。当终止信号意义为‘相关’时,前端流水线输出的分支判读信号为‘不分支’;当终止信号为‘不相关’时,前端流水线输出的分支判读信号为由前端流水线中的分支判断逻辑决定。另一种实施方法是用上述终止信号直接终止对应的前端流水线中指令的执行。
凡是指令被终止执行的前端流水线,其分支判断输出都被置为‘不分支’。所有15条前端流水线产生的分支判断经总线2689被送往优先权编码器2596以产生路优先码2598。
[0458] 路优先码2598根据各前端流水线的各自分支判断按各流水线上的指令在指令路径二叉树(图26C)上的节点位置按指令槽优先顺序生成。图26D为优先权编码器2596的一种实现方式,其结构由15个二输入选择器连接成的四层二叉选择树,每层对应一个指令发射槽,是图26C中二叉树上下翻转的镜像。最上层选择器对应D发射槽,其16个输入上各有一个编码对应下一时钟周期可能执行的16条路径,各路径在选择器树上的位置与图26C中下一周期可能执行的16条同路径指令的位置对应。例如N路编码2691与图26C中N路指令2601对应,E路编码2692与图26C中E路指令2602对应。
[0459] 图26D中每个二输入选择器对应图26C中代表指令的一个圆圈,且该选择器即由执行其相应圆圈代表的指令所得的分支判断控制,当该分支判断为不分支时,使选择器的左输入作为选择器的输出;当该分支判断为分支时,使右输入作为选择器的输出。例如选择器2696对应于图26C中圆圈2606代表的N路D槽指令,并由执行该指令产生的分支判断控制,即图27中N路D槽前端流水线2673的分支判断控制。同理,选择器2698对应图26C中O路B槽指令
2608,由图27中执行该指令的O路B槽前端流水线2574的分支判断控制;选择器2693对应图
26C中N路A槽指令2603,由图27中执行该指令的N路A槽前端流水线2570的分支判断控制;其他各选择器及控制依此类推,不再赘述。图27中的15个前端流水线产生的15个分支判断按各前端流水线在指令二叉树上的位置,各自控制15个选择器中相应的一个。最终从选择器
2603输出的编码就是路优先码2598。
[0460] 虽然图27中各选择器2581~2586的输入数目与图25中的对应选择器的输入数目有所不同,但路优先码2598控制各该选择器的操作及原理与图25实施例是一样的。试以N路A槽指令(图26C中指令2603)、O路B槽指令(指令2607)、S路C槽指令(指令2615)、S路D槽指令(指令2618)均为分支指令为例。此时寄存器2525、2526中的N路BNX、BNY地址经总线2660被送到指令读缓冲器2550控制发射N路的A、B、C、D槽指令。同理寄存器2521、2624中的O路、S路指令地址被送到指令读缓冲器2551及2654控制发射O路的B、C、D槽指令,及S路的C、D槽指令。如果寄存器2624中的S路指令地址中的第二地址是指令缓冲块中地址的最大值,则S路D槽中发射的指令是由寄存器2634中的S路下块地址在指令读缓存器2654中匹配的一个指令缓冲块中的第一条指令在寄存器2644中的Z地址控制下在S路D槽发射。所有被发射的指令在前端流水线中及指令相关性检测模块中处理。上述NOSS四条分支指令其中S路D槽指令与A、B、C槽中的NOS路三条指令中的单数或复数条指令有相关性,则S路指令相关检测器2664的B、C槽相关信号为‘不相关’,不影响相应前端流水线2574、2578的分支判读输出(A槽没有相关信号,因影响A槽指令的相关指令在前一周期);但D槽相关信号为‘相关’,要将对应的前端流水线2680的分支判断置为‘不分支’;且S路指令相关检测器2664的输出增量为‘1’。上述NOSS路四条分支指令被前端流水线2570、2574、2578、2680处理并作分支判断,其结果为N路A槽(图26C中指令2603)、O路B槽(图26C中指令2607)、S路C槽(图26C中指令2615)的分支判断(即前端流水线2570、2574、2578的分支判断输出)皆为分支;但S路D槽(图26C中指令
2618)的分支判断(即前端流水线2680的分支判断输出)为不分支。其时优先权编码器2596在上述各分支判断控制下选出图26D中S路编码2918作为路优先码2598输出。
[0461] 其时选择器2581、2582、2583在S路路优先码2598控制下分别选择前端流水线2574、2579及2680的输出送往后端流水线2591、2592及2590继续处理。连同后端流水线2590处理的前端流水线2570输出,共有NOSS路4条指令各在A、B、C、D四条发射槽的后端流水线继续处理。S路路优先码2598控制后端流水线相关性选择器(图27中未显示)选择S路指令相关检测器2664 的输出送往各后端流水线。其中A、B、C槽的‘不相关’信号使后端流水线2590、
2591、2592中的指令正常执行完毕,但D槽的‘相关’信号使后端流水线2593中指令停止执行,结果不写回。另一种实施方式是在各前端流水线中就将有‘相关’的指令的状态置为‘不执行’。如此当一条状态为‘不执行’的指令被选择送到后端流水线时,后端流水线不会执行该指令。这种实施方式不使用后端流水线相关性选择器。
[0462] S路路优先码2598控制选择器2584选择S路指令相关检测器2664的增量输出作为地址增量2597与S路路优先码2598控制的选择器2585选择的S路地址寄存器2624输出的S路地址中的第二地址(BNY)2536由加法器2528相加。加法器2528的和输出2521为‘0’,即为下一周期N路的第二地址。加法器2528的进位输出为‘进位’,该进位控制选择器2529不选S路分支第一地址2535(即本周S路C槽指令的第一地址),而选择已由路优先码2598控制选择器2586选择放上下块地址总线2539的,由S路下块地址寄存器2634提供的S路下块地址作为下一周的N路第一地址,并以此为地址在轨道表2501中读取该行轨道上的下周期OPQE诸路的分支目标地址,以及如前述用OPQ路地址进一步在轨道表2682、2683、2684中读取其余各路的分支目标地址。上述的诸指令地址如前述被存入分支目标寄存器2521等;其相应的下块地址,Z地址也如前述被存入下块地址寄存器2530等及Z地址寄存器2540等。这样下一周期图27中处理器即以本周期中的S路D槽指令为N路地址从N路指令缓冲器2550向前端流水线
2570发射,其相应各其他路的指令也依本周期的例子在各相应指令读缓冲器向相应的前端流水线发射。
[0463] 另一个指令执行的例子中含有与上例中执行的同样4条分支指令,但此例中所有4条指令的分支判断为‘分支’,且S路指令相关检测器2664的输出是A、B、C、D各槽均不相关,增量为‘2’。在此条件下路优先码2598为K路。此时选择器2581等如上例选择NOSS路指令在后端流水线正常执行完毕。K路路优先码2598控制选择器2584选择的‘0’作为地址增量2597与K路路优先码2598控制的选择器2585选择的K路地址寄存器2624输出的K路地址中的第二地址(BNY)2536由加法器2528相加。加法器2528的和输出为K路第二地址,即为下一周期N路的第二地址。加法器2528的进位输出为‘不进位’,该不进 位信号控制选择器2529选择在2535总线上的K路分支第一地址作为下一周期的N路第一地址。其余操作与前例同。
[0464] 另一个指令执行的例子中含有与上例中执行的同样4条分支指令,此例中所有4条指令的分支判断也是‘分支’,但O路指令相关检测器2561的判断B槽指令与A槽指令相关,此时B、C、D槽相关信号皆为‘相关’,增量输出为‘0’。该B、C、D槽相关信号将与其一一对应的前端流水线2574、2575、2576的分支判断信号置为‘不分支’。即A槽N路分支判断信号为‘分支’,B、C、D槽O路分支判断信号为‘不分支’。这些分支判断信号进入优先权编码器2596后,其选择是NOOO路,最后使代表O路的编码成为路优先码2598。其他各前端流水线的分支判断最终未被选择,其相应编码(如S路等)被屏蔽掉。
[0465] 在此条件下路优先码2598为O路。此时选择器2581等如上例选择NOOO路指令在后端流水线执行。O路路优先码2598选择O路指令相关检测器2561的B、C、D槽相关信号(皆为相关),控制后端流水线仅完成A槽指令的执行,而将B、C、D槽指令的中间执行结果抛弃。O路路优先码2598控制选择器2584选择指令相关检测器2561的增量输出‘0’作为地址增量2597与O路路优先码2598控制的选择器2585选择的O路地址寄存器2521输出的O路地址中的第二地址(BNY)2536由加法器2528相加。加法器2528的和输出为O路第二地址,即为下一周期N路的第二地址。加法器2528的进位输出为‘不进位’,该不进位信号控制选择器2529选择在2535总线上的O路分支第一地址作为下一周期的N路第一地址。及从本周期发生指令的B槽O路指令起执行。其余操作与前例同。
[0466] 本实施例可以处理如图26C中所示的每条指令都是分支指令的指令二叉树。如果某一条指令不是分支指令,则轨道表中对应于该指令的表项记录的是非分支指令类型。接收到非分支指令类型的指令读缓冲器不发射指令,与之相应的处理单元也不工作。循迹器接收到非分支指令类形也不以该表项中的地址作为轨道表地址向下一层轨道表读取在该路上的分支目标。本公开的其他实施例也遵循这个原则。
[0467] 本发明进一步公开了另一种指令多发射的方法。其方法是将从起始指令地址开始的n条顺序指令,及该n条指令的可能分支目标指令及其分支目标指令, 根据分支指令在指令二叉数所处的位置将指令分为不同的路,同时发射。上述同时发射的复数条指令被独立地执行。指令之间的相关性被检测,有相关性的指令及同一路的后续指令的执行被终止;并根据指令间有无相关性及相关指令的位置为每路反馈一个路地址增量。对被执行的各分支指令独立做出分支判断。根据所有各独立分支判断按指令顺序优先权决定本周期及下一周期执行的路。根据决定的路选择上述同时发射的指令中n条完整执行并正常退出(retire),其余指令终止执行。按选定的下周路径用该路的本周地址与该路的增量相加的和为下周的起始块内地址BNY,如果和未超出块边界,则以该选定路径的本周地址为下周的起始块地址BNX,如果和超出了块边界,则以该选定路径的下块地址为下周的起始块地址BNX。以从该起始地址开始的n条顺序指令,及该n条指令的可能分支目标指令及其分支目标指令同时发射,如此周而复始。
[0468] 根据本发明技术方案,还可以按执行槽组织指令读缓冲,因此指令读缓冲的组织形式及译码器结构与图25实施例中的指令读缓冲有所不同,相应地为指令读缓冲提供Z地址的逻辑(在图25中为列地址产生器2503)的结构也有所不同。请见图29,其为按发射槽组织的指令读缓冲器的结构。按槽组织的指令读缓冲每槽的结构稍有差异。图中译码器2901对应C指令发射槽,列2903、2905与2907分别为C槽N路,O路及P路指令的读口及位线构成的列。译码器2901中第一地址比较器509以及第二地址译码器513与图25实施例相同,不同处在于第二地址译码器513输出的字线2920、2921等不是控制最左面的一个读口列(在此为C槽N路的列)而是控制最右面的一个读口列。在按槽组织的指令读缓冲器中第二地址译码器控制从该指令发射槽开始的路的读口。因此A槽的第二地址译码器控制N路的读口;B槽的第二地址译码器控制O路的读口;C槽的第二地址译码器如本实施例所示控制P路的读口;而D槽的第二地址译码器控制Q路的读口。图中译码器2941为D槽的译码器,列2943、2945为D槽中N路及O路的读口及字线列,图中未显示D槽的P路及Q路的读口列。
[0469] 锯齿字线2920等不是连接同一槽中相邻的两列读口,而是从一个槽中的一个路的读口传递到右方一个槽中的同一路下一行的读口,这样使同一路的顺序指令在不同指令发射槽按发射槽顺序同时发射。因此驱动行2961中N列2093中的读口的字线来自其左面一个槽(此处是B槽)N列的行2960的读口。同理 驱动行2961中O列2095中的读口的字线来自是B槽O列的行2960的读口。C槽中凡是除指令缓冲块第一行2960,除P列2907中的所有读口都按此方式受来自B槽中同路号的上一行读口的锯齿字线控制。第一行的读口没有更上一行,因此除P列已由第二地址译码器513产生的字线2920控制外,其余N列2093及O列2905上的第一行2960读口均分别由下块地址比较器2973及2975直接控制。
[0470] 译码器2901中没有图25实施例译码器中的Z地址译码器。因为按发射槽组织的指令读缓冲中的相邻Z地址(实质上是指令槽地址)是落在不同的槽内,亦即根据一个下块地址BNX的相应Z地址,该下块地址可以被送到译码器2901或译码器2941中的一个。根据Z地址决定将下块地址送往哪一槽的逻辑会在图30中说明。各槽的译码器结构类似,但包含的比较器,译码器数目不同。译码器中共有总列数减一个下块地址比较器,如A槽只有N路,其译码器只有一套第一地址比较器如509及第二地址译码器如513,没有下块地址比较器如2973等;B槽有N路、O路两路,其译码器有一套第一地址比较器及第二地址译码器驱动O列的读口,有一个下块地址比较器驱动经过第一行N列的读口,N列的其他读口由来自A槽N列上一行读口的锯齿字线驱动。如C槽2901中有一套第一/第二地址比较器/译码器,有两个下块地址比较器,对应N路及O路;D槽译码器2941中有一套第一/第二地址比较器/译码器,3个下块地址比较器,对应N路、O路及Q路。如果同一时间槽内有多条路径从此槽中始发,则每条路径都有其独立的第一/第二地址比较器/译码器以驱动该路(列)上的读口。
[0471] 图29中C槽N路下块地址总线2420上输入的下块地址与第一地址存储器505中的地址相同,比较器2973驱动锯齿字线2980驱动使行2960中的指令从C槽N路发列2903发射,并使其顺序下条指令从D槽N路的列2943发射。行2960中的顺序上两条指令则是在这个指令读缓冲块的地址顺序上一个指令读缓冲块的A槽N路倒数第二行,及B槽N路最后一行发射。
[0472] 请看图30,其为能同时发射4条指令,并根据其中分支指令的分支判断决定程序执行走向的另一个实施例。在本例中使用了与图25实施例相同的指令段。图30中的轨道表2501、结束轨迹点存储器2502、循迹器2504、寄存器2521~2524、前端流水线2570~2579、后端流水线2590~2593均与图25实施例中的 相同。不同之处在于,本实施例中的指令读缓冲是按执行槽组织的,其结构如图29所述。其中指令读缓冲2550对应A槽,只有1路(N路),由位线对应的前端流水线2570上的标号所标识,并有一列读口与位线(bitline)以将指令发射到对应的前端流水线2570。指令读缓冲2551对应B槽O路的,共有2路(N路和O路)。指令读缓冲2552对应C槽,共有3路(N路、O路和P路)。指令读缓冲2553对应D槽,共有4路(N路、O路、P路和Q路)。其中A槽的指令读缓冲2550中译码器2417每次发射时均驱动其锯齿字线2555读出A、B、C、D四个槽中N路的指令并发射到相应的前端流水线。而指令读缓冲2550、2551与2552的相应译码器是否驱动字线,均视N路发射的指令是否为分支指令而定。如果A槽中的N路为分支指令,则寄存器2521中指令类型标识为分支指令,B槽指令读缓冲2550中译码器译码寄存器2521中的分支目标地址以驱动其字线2556读出B、C、D三个槽中O路的指令并发射到相应的前端流水线;反之则不驱动字线。因为如果A槽中为非分支指令,则没有分支目标,所以B、C、D槽中的O路不需发射。同理P、Q路中的字线驱动与否,视B、C槽中N路指令是否分支指令(寄存器2522、2523中的指令种类是否分支指令)而定。分支类型信息由轨道表中2410中读出的表项提供。本实施例中的读口由导线构成的锯齿字线直接控制。
[0473] 此外,如图25实施例所述,轨道表2501可以同时输出读指针指向的表项及其后顺序的三个表项2511、2512、2513及2514,以提供4条顺序指令所指向的最多4个分支目标。结束轨迹点存储器2502可以根据4个输入的BNX地址并行读出4个结束轨迹点。寄存器2530、2531、2532及2533专门用于存储下块地址。根据这4个输入的BNY可以确定其下块地址(由结束轨迹点存储器提供)有效或无效;移位器2546、2547和2548负责将这些下块地址(由结束轨迹点存储器提供)移至相应的槽。上述4个下块地址被寄存器2530、2531、2532及2533储存。在这4个下块地址中,第一个下块地址经移位器2546移位后,可以被寄存器2540、2541和
2542中的一个存储;第二个下块地址经移位器2547移位后,可以被寄存器2543和2544中的一个存储;第三个下块地址经移位器2548移位后,被寄存器2545存储。寄存器2530、2531及
2532输出的下块地址被送至读缓冲2550、2551及2552中的下块地址比较器2419,且寄存器
2540输 出的下块地址被送至指令读缓冲2551的列地址控制器2411,寄存器2541和2543输出的下块地址被送至指令读缓冲2552的列地址控制器2411,寄存器2542、2544和2545输出的下块地址被送至指令读缓冲2553的列地址控制器2411,共同控制其中复数个下块缓冲块中的锯齿字线。在本实施例中,寄存器2525、2530、2531、2532和2533中存储的是BNX,寄存器
2526中存储的是BNY,寄存器2521、2522、2523和2524中存储的是BNX和BNY。
[0474] 根据本发明技术方案,可以按下述方法依据输入的当前指令地址或分支目标地址产生相应下块地址并经移位存储到合适的寄存器中。定义每个指令读缓冲块的行数(存储表项数)为n;块内偏移地址(即第二地址)为BNY,其值范围为0~n-1,最上一行为0行;共有m槽,范围为0~m-1,最左面为0槽;共有w路,范围为0~w-1,最左面为O路。这样,当((m-w)-(n-BNY))大于0时,下块地址有效,否则无效。在本例中,对于N、O和P路,可以根据起始BNY产生相应的移位信号将相应的下块地址移至对应的槽,对于Q路则不需要所述下块地址。具体地,根据((m-w)-(n-BNY)-1)得到的值作为移位位数对下块地址进行向右移位。
[0475] 在本例中,n=8,m=4,w=4,其中N对应O路、O对应1路、P对应2路、Q对应3路。当N路的BNY=6时,((m-w)-(n-BNY))=((4-0)-(8-6))=2,大于0,因此下块地址有效。其意义是当译码地址‘6’以驱动锯齿字线时,地址‘6’对应指令从A槽N路发射,地址‘7’对应指令从B槽N路发射,此时该锯齿字线因到达指令读缓冲块的边界而结束。同时对下块地址的译码已指出顺序下个指令读缓冲块的第一条指令,所需知道的只是这条指令应从哪一槽的N路发射,以充分利用处理器资源同时避免与当前指令读缓冲已发射的指令冲突。此时移位位数((m-w)-(n-BNY)-1)=1,即移位器2546对所述有效的下块地址(即存进寄存器2530的N路下块地址)右移1位,存储到N路C槽对应的寄存器2541中(N路对应的寄存器2540和2542的值均无效)经下一指令读缓冲块中列译码器2411驱动始于第二列的锯齿字线使该读缓冲块中的第一条指令(BNY=0)从C槽的N路发射,第二条指令(BNY=1)从D槽的N路发射。如果((m-w)-(n-BNY))小于0,则下块地址无效,即N路对应的寄存器2540、2541和2542均无效,控制其驱动的所有列译码器2411 使它们不驱动任何锯齿字线,因为在此条件下,当前指令读缓冲块向所有的列同时发射指令。可以将上述算法用一个查找表固化。
[0476] 相关性检测模块2560等具有与图25实施例中的相关性检测模块相同的结构。不过,图25是按路组织的,而图30是按槽组织的,两个实施例中相应的相关性检测模块的输入来源是相同的。例如,图25中的相关性检测模块2560对N路的A、B、C、D槽指令进行检测,而图30中的相关性检测模块2560对A、B、C、D槽的N路进行检测;又如,图25中的相关性检测模块
2563对N路的A、B、C槽和Q路的D槽指令进行检测,而图30中的相关性检测模块2563对A、B、C槽的N路和D槽的Q路指令进行检测。
[0477] 本实施例与图25实施例在运行过程中的差别仅在于指令读缓冲2550、2551、2552和2553如何发射指令。同样以执行图24C中的指令段为例,初始条件与图25实施例相同。以读指针‘68.3’为地址从轨道表2501的63行第3表项开始读出连续4个表项内容,即分支目标地址‘68.0’、‘68.7’、‘68.1’、‘68.2’分别从总线2511、2512、2513、2514读出送往寄存器2521、2522、2523及2524的输入,此处地址格式为BNX.BNY。总线2510、2511与2512上的第一指令地址BNX被送至结束轨迹点存储器2502读取下块地址,第二地址BNY被如前用于产生移位信号。总线2510~2512总线上的BNX地址为‘68’,结束轨迹点存储器2502中68行的内容为‘23’,所以结束轨迹点存储器2502的3个输出都是‘23’。如前所述,当前地址的第二地址‘3’和O路的第二地址‘0’都产生无效的下块地址。P路的第二地址‘7’能产生有效的下块地址,且移位位数((m-w)-(n-BNY)-1)=((4-2)-(8-7)-1)=0,不需要移位,直接被存储到寄存器
2545中(此时寄存器2540、2541、2542、2543和2544都无效)。
[0478] 在时钟信号更新了循迹器及下块地址寄存器后,在当前周期中,寄存器2525与2526的输出合并成的总线2520上的值‘68.3’被送往A槽指令读缓冲2550,经译码器中第一地址比较器匹配及第二地址译码器译码后,驱动锯齿字线2555,沿A、B、C、D槽的N路发射指令3、4、5、6;寄存器2540、2541和2542中N路的下块地址均无效,因此分别在B、C、D槽的列译码器2411译码后不驱动任何字线。同时寄存器2521的输出‘68.0’被送到B槽指令读缓冲
2551,经译码器匹配译码后,驱动锯齿字线2556,沿B、C、D槽的O路发射指令0、1、 2;寄存器
2543和2544中O路的下块地址均无效,因此分别在C、D槽的列译码器2411译码后不驱动任何字线。同时寄存器2522的输出‘68.7’被送到P路指令读缓冲2552,经译码器匹配译码后,驱动锯齿字线2557,沿P路的C槽发射指令7后字线到达当前指令读缓冲块的下边缘而终止;寄存器2545中P路的下块地址有效,因此在D槽的译码器译码后驱动字线2558,在D槽P路的下一指令读缓存块的‘0’行发射指令8。同时寄存器2523的输出‘68.1’被送到Q路指令读缓冲
2553,经译码器匹配译码后,驱动字线2559,沿Q路的D槽发射指令1。后续操作与图25实施例相同,在此不再赘述。
[0479] 图27实施例中的多层次轨道表2501、2682、2683、2684、2685、2686、2687、2688可以由一个8个读口的存储器来实现,也可以由多个单读口的存储器实现。图31显示了一种实现方式,这种方式是建立一个与指令读缓冲块2701相应的微型轨道表2731,在填充一个指令读缓存块的时候将其相应的轨道填入微型读轨道表中以备循迹器读取。微型轨道表2731由一个如同指令读缓存块2701一样的由读口、位线、斜(锯齿)字线相连接形成的阵列结构(存储器、读口、位线宽度不同,是轨道表的表项数据宽度而非指令读缓冲块阵列2701中的指令宽度),加上一个供读出轨道上的结束轨迹点的下块地址读口2763及下块地址字线2741构成。以图25或图26中使用的N路指令读缓冲器为例,本实施里中指令读缓冲块阵列2701中的字线2703、2705、2707、2709分别是A、B、C、D指令发射槽的字线。相应的是微型轨道表2731中的字线2511、2512、2513、2514分别用以读出与A、B、C、D指令发射槽中指令对应的轨道表表项。因轨道表表项的内容是其对应分支指令的分支目标,故微型轨道表阵列中的上述四条字线上读出的内容是A、B、C、D四槽指令的分支目标地址,亦即O、P、Q、E四路的起始地址。该微型轨道表2731与指令读缓冲块2701共用译码器2751。
[0480] 译码器2751中第一地址寄存器505,第一地址比较器509,第二地址译码器513,下块地址比较器1619,Z地址译码器2411与图24B实施例译码器2417中的同标号功能块的功能相同。Z地址产生器2773是如同图27中2503同样功能的Z地址产生器,其功能是以当前指令地址2510中的第二地址计算或查表获得Z地址经总线2751提供给该指令读缓存器中所有指令读指令缓冲块中的Z地址译码器2411。第一地址比较器509比较当前地址总线2510上的当前第一地址 (此例中来自循迹器总线2510)与第一地址寄存器505中的地址,如匹配则控制读口2743将微型轨道表2731中的结束轨迹点内容放上下块地址字线2741,并使能(enable)第二地址译码器513。被使能的第二地址译码器对总线2510上的第二地址译码,其输出2761直接驱动从微型轨道表阵列2731中的阵列左边缘出发的斜字线,(称为当前字线,current word line),如字线2765等,将当前微轨道表中的相应表项经字线2511、2512、2513、2514读出。各指令读缓冲块中的下块地址比较器1619将下块地址字线2741上的地址(由上述与总线2510上的当前第一地址匹配的指令读缓冲块驱动),与各自的第一地址寄存器505中存储的第一地址相比较。如某块中的1619比较器匹配,则使能该块中的Z地址译码器2411,对总线2751上的Z地址进行译码以驱动该下块指令读缓冲块(与当前指令读缓冲块不是同一块)中微型轨道表阵列2731从上边缘出发(除最左面一列外)的斜字线,(称为下块字线,next word line),如字线2775等,将下一微轨道表中的相应表项经字线2512、2513、2514读出。
[0481] 当前指令读缓冲块中的第二地址译码器513的输出2761经寄存器2756暂存后,在下一周期驱动当前指令读缓冲块阵列中的当前字线,如2785等控制读口发射指令;下块指令读缓冲块中的Z地址译码器2411的输出2763经寄存器2756暂存后,也在下一周期驱动下块指令读缓冲块阵列中的下块字线,如2795等,控制读口发射指令。按图25实施例中的说明,该两个指令读缓冲块发射使用的指令槽是互补的,即顺序的4条指令从字线2703、2705、2707、2709发射,不管这些指令是来自一个或两个指令块。同理微轨道表阵列2731能够在在指令发射前一周从字线2511、2512、2513、2514,读出O路、P路、Q路、E路分支目标地址及从字线2741读出N路下块地址,不论这些指令地址来自一条或两条微轨道。如之前的实施例,当所有的指令读缓存块中第一地址寄存器505中的地址与总线2510上的当前地址都不匹配时;或者当Z地址译码器2723输出的Z地址2751有效(需要下块),且所有的指令读缓存块中第一地址寄存器505中的地址与字线2741上的下块地址都不匹配时,指令读缓冲器向轨道表及一级指令读缓存器分别以总线2510,或字线2741上的地址读取相应轨道及指令读缓冲块以填充微型轨道表及相应指令读缓冲块。
[0482] 本实施例中的联合轨道表/指令读缓冲(下称联合缓冲器,Joint Buffer,其 中每个块称为联合缓冲块,Joint Block)可以用于如图25、图27实施例的处理器中以代替轨道表2501、2682、2683、2684、2685、2686、2687、2688。进一步,本实施例中联合缓冲器还可以代替图27中结束轨迹点表2502以及Z地址产生器,因其功能已包含在联合缓冲器中。图30是以联合缓冲器实现图27中处理器的实施例,除了由联合缓存器取代了图27中的轨道表,指令缓冲器,结束轨迹表2502,Z地址产生器2503,Z地址寄存器2540-2543外,其他各功能块的功能以及整个处理器的操作与图27实施例中处理器完全一样,图上的标号也沿用了图27上的标号。图30中N路联合缓冲器2550除执行图27中指令读缓冲2550同样的指令发射功能以外,还执行图27中轨道表2501的功能。同理,O、P、S、Q、T、U、V路联合缓冲器2550、2551、2552、2654、2553、2655、2656、2657除执行图27中指令读缓冲2550同样的指令发射功能以外,分别还执行图27中轨道表2501、2682、2683、2684、2685、2686、2687、2688的功能。
[0483] 由循迹器2504中选择器2529输出的第一地址被送往寄存器2525,加法器2528输出的第二地址被送往寄存器2526。由该第一、第二地址合并形成的指令地址2510被送到N路联合缓冲器2550(在图27中此地址经总线2510被送到轨道表2501以读取O、P、Q、E路的分支目标地址,经总线2641被送到结束轨迹表2502以读取N路的下块地址,经总线2641被送到Z地址产生器2503以产生N路的Z地址)。联合缓冲器中产生的N路Z地址仅由其内部使用,因此并不输出;其余N路下块地址(第一地址)经总线2741送往N路下块地址寄存器2530;O、P、Q、E路分支目标地址(第一、第二地址)分由总线2511、2512、2513、2514输出送往当前地址寄存器2521、2522、2523、2524。总线2511上的O路分支目标地址并被送往O路联合缓冲器2551对其进行寻址;同样总线2512、2513上的P路、Q路分支目标地址也被送往P路、Q路联合缓冲器
2552、2553对其进行寻址。
[0484] 总线2511上的O路分支目标地址对O路联合缓冲器2551寻址;O路联合缓冲器2551输出的O路下块地址被送往O路下块地址寄存器2531;S、T、I路分支目标地址分由总线2663、2661等输出送往当前地址寄存器2624、2625、2729。总线2512上的P路分支目标地址对P路联合缓冲器2552寻址;P路联 合缓冲器2552输出的P路下块地址被送往P路下块地址寄存器
2532;U、G路分支目标地址分由总线2662等输出送往当前地址寄存器2626、2720。总线2513上的Q路分支目标地址对Q路联合缓冲器2553寻址;Q路联合缓冲器2553输出的Q路下块地址被送往Q路下块地址寄存器2638;K路分支目标地址被送往当前K路地址寄存器2722。
[0485] 同理,O路联合缓冲器2551输出的总线2663上的S路分支目标地址对S路联合缓冲器2654寻址;联合缓冲器2654输出的S路下块地址被送往S路下块地址寄存器2634;V路、K路分支目标地址被送往当前V路、K路地址寄存器2627、2721。O路联合缓冲器2551输出的总线2661上的T路分支目标地址对T路联合缓冲器2655寻址;联合缓冲器2655输出的T路下块地址被送往T路下块地址寄存器2726;J路分支目标地址被送往当前J路地址寄存器2723。P路联合缓冲器2552输出的总线2662上的U路分支目标地址对U路联合缓冲器2656寻址;联合缓冲器2656输出的U路下块地址被送往U路下块地址寄存器2727;H路分支目标地址被送往当前H路地址寄存器2724。S路联合缓冲器2654输出的总线2664上的V路分支目标地址对V路联合缓冲器2657寻址;联合缓冲器2657输出的V路下块地址被送往V路下块地址寄存器2728;L路分支目标地址被送往当前L路地址寄存器2725。
[0486] 下一周期,上述的所有16路分支目标被存入相应的上述17个当前地址寄存器2521等(N路为易于说明将第一、第二地址分由寄存器2525、2526寄存),等待选择器2585的选择。其中当2585选择N路时,选择寄存器2585、2586的合并输出作为N路的输入。同样上述的所有
8分支目标被存入相应的上述8个下块地址寄存器2530等,等待选择器2586的选择。各联合缓存器2550中各译码器2751中的各第二地址译码器的输出2761,及各Z地址译码器的输出被锁存进段间寄存器2756驱动指令读缓冲2701中的当前字线,如字线2785等;也驱动2701中的下块字线,如字线2795等(见图32)。将与上述N、O、P、S、Q、T、U、V路对应的最多8路、最多
15条指令向前端流水线2570等发射。如周图27实施例,优先权编码2596基于各前端流水线的分支判断产生一个路优先码2598。2598控制选择器2581、2582、2583选择适当的一路指令的中间结果供后端流水线2590-2593执行,也选择同一路的分支增量经总线2597送到加法 器2528的一个输入端。路优先码2598也控制选择器2586选出同一路的下块地址2539送到选择器2529的一个输入端等待选择。其中D槽的分支目标不需要在本周期提供下块目标地址,因此当选择器2586在路优先码代表D槽指令的分支目标时,选择该D槽指令的顺序指令地址,如当路优先码为E路时,选择器2586选择N路。路优先码2598也控制选择器2585选出同一路的当前地址,其中第一地址2535被送到选择器2529的另一个输入端等待选择,而第二地址2536被送到加法器2528的另一个输入端。加法器的和输出作为新的N路第二地址。加法器的进位输出控制选择器2529,如该输出为‘不进位’,选择当前第一地址作为新的N路第一地址;如该输出为‘进位’,则选择下块地址作为新的N路第一地址。选择器2529输出的该第一地址被送往寄存器2525,加法器2528输出的该第二地址被送往寄存器2526;第一第二地址合并成的N路地址2510被送到N路联合缓存器2550,开始新一周期的寻址,如此周而复始。
[0487] 指令读缓冲器可包含相应的微型轨道表,合称为联合缓冲器。因为轨道与指令块是对应的,因此填写联合缓冲器中的微型轨道表及指令读缓冲块可同时进行。两者还可共享同一套译码器。
[0488] 请参考图33,其为本发明所述处理器系统完整结构的一个实施例。在本实施例中,处理器系统由轨道表3301、循迹器3303、数据引擎3305、一级指令缓存3307、指令读缓冲3309、相关性检测模块3311、执行单元3313、数据读缓冲3315、写缓冲3317、一级数据缓存
3319、扫描器3321和二级缓存3323构成。其中,二级缓存3323中包含了指令和数据。如之前实施例所述,当循迹器3303发现分支目标指令尚未存储在一级指令缓存3307时,将相应的指令块从二级缓存3323填充到一级指令缓存3307中,同时由扫描器审查被填充的指令并在轨道表3301中建立相应轨道。而一旦数据引擎3305发现数据访问指令的数据地址对应的数据尚未存储在一级数据缓存3319时,将相应的数据块从二级缓存3323填充到一级数据缓存
3319中,同时将替换出一级数据缓存3319的数据块写回二级缓存3323。
[0489] 当所述处理器系统包含多个列(即:路或槽)时,每个列均有一套执行单元、指令读缓冲和数据读缓冲。相关性检测模块3311则可以根据配置,仅检测某些列中指令间的相关性,或检测所有列中指令间的相关性。循迹器3303则对 轨道表3301寻址,在处理器执行到分支指令之前,将尚未存储在指令读缓冲3309中的分支目标指令从一级指令缓冲3307中填充到指令读缓冲3309中。
[0490] 此外,循迹器3303还如图25实施例所述那样,可以同时为不同列的执行单元提供指令。此时,如图25实施例所述,循迹器3303根据执行单元3313输出的分支转移情况3314,选择起始BNX、BNY(如图25实施例中的当前BNX、BNY,或寄存器2521、2522、2523、2524中的分支目标BNX、BNY)和相关性检测模块3311输出的某路对应的增量,通过相加得到新的当前BNX和BNY。
[0491] 数据引擎3305则与图18实施例中的数据引擎类似,根据步长信息提前计算下次执行数据访问指令时可能用到的数据地址,并根据所述地址将尚未存储在数据读缓冲3315中的数据从一级数据缓存3319填充到数据读缓冲3315中。具体地,当指令读缓冲3309向执行单元3313发射数据访问指令时,同时通过总线3310对数据读缓冲3315寻址(例如图18C实施例中通过总线1815、译码器1820得到地址后对数据读缓冲1818寻址)读出该数据访问指令对应的数据供处理单元3309使用。
[0492] 此外,在本实施例所述处理器系统中,写缓冲3317用于暂存执行单元3313要写回一级数据缓存3319的数据,并在一级数据缓存3319不对数据读缓冲3315填充时(此时一级数据缓存3319的接口空闲),将暂存的数据写回一级数据缓存3319,以减少一级数据缓存3319的读写冲突,保证执行单元3313可能用到的数据能被尽早填充到数据读缓冲3317中。
[0493] 如前例所述,本实施例所述处理器系统在循迹器3303的引导下,无论分支指令的分支转移是否发生,都可以沿程序流不间断地控制指令读缓冲向执行单元提供即将执行的正确的指令,并通过指令读缓冲中存储的信息在找到数据读缓冲中找到相应数据。由于该处理器系统中的每一列均有其相应列的指令读缓冲和数据读缓冲提供指令和相应数据,因此能同时对不同列(即不同发射槽或路)同时提供指令和相应数据,提高处理器系统的效率。
[0494] 根据本发明技术方案和构思,还可以有其他任何合适的改动。对于本领域普通技术人员来说,所有这些替换、调整和改进都应属于本发明所附权利要求的保护范围。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈