一种缓存系统和方法与流程

文档序号:18814826发布日期:2019-10-08 23:44阅读:364来源:国知局
一种缓存系统和方法与流程

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



背景技术:

在包含流水线的处理器系统中,通常会因为缓存缺失(Cache Miss)、控制冒险(Control Hazard)、数据冒险(Data Hazard)等因素使得流水线暂停,从而影响处理器系统的性能。

缓存缺失一般分为三类状况:强制缺失、冲突缺失和容量缺失。采用组相联缓存结构并增加缓存的路组数可以降低冲突缺失,但受制于功耗及速度限制(如因为多路组相联缓存结构要求将所有路组由同一索引寻址的内容及标签同时读出并比较),路组数难以超过一定数目。现有的缓存预取技术通常以一定的代价可以解决一部分冲突缺失和容量缺失问题,但强制缺失依然是不可避免的。此外,新的缓存结构,如:牺牲缓存、跟踪缓存以及预取等都能在一定程度上改善缓存缺失问题。然而,随着日渐扩大的处理器/存储器速度鸿沟,缓存缺失已成为制约现代处理器性能提升的最严重瓶颈。

由执行分支指令引起的控制冒险是流水线性能损失的又一大原因。在处理分支指令时,传统处理器无法提前知道分支指令之后执行是哪一条指令,而是需要等到分支指令完成后(或至少等到执行该分支指令时产生是否发生转移的信号及分支目标指令地址后)才能知道。此外,即使采用分支目标缓冲(Branch Target Buffer)和跟踪缓存(Trace Cache)等技术,可以在再次执行同一条分支指令时直接获得分支目标地址并猜测分支转移发生的可能性,但这些技术通常根据处理器之前的运行结果进行预测,因此在第一次执行到该分支指令时无法得到分支目标地址且不能猜测分支转移发生的可能性。即使再次执行到该分支指令,仍然会有预测错误而导致的性能损失。此外,在传统的处理器系统中,分支转移造成的缓存缺失也会导致性能损失。

数据冒险则通常由指令间的写后读(Read After Write,RAW)相关引起。对于两条相邻或相近的指令,如果前一条指令的目标寄存器与后一条指令的源寄存器相同,那么在前一条指令的执行结果尚未被写入到寄存器时,后一条无法从该寄存器中获取到正确的操作数,只能通过插入气泡(Bubble)的方法暂停流水线,直至可以从寄存器读取正确操作数为止。使用旁路(Bypass)技术可以在一定程度上缓解数据冒险问题,即在处理器中增加若干旁路路径,使得前一条指令产生执行结果后,直接将该结果放上旁路路径,而后一条指令则不必从寄存器中获取操作数,而是可以从旁路路径上取得正确的操作数。然而,旁路技术并不能解决所有数据冒险问题。

请参考图1,其为现有流水线技术的一个示意图。在此以定长的7段流水线为例,7个流水线段分别为取指1(I1)、取指2(I2)、译码(D)、执行(E)、访存1(M1)、访存2(M2)和写回(W)。其中,I1和I2段用于获取指令。D段用于对该指令译码,并根据译码结果取操作数。所述操作数的来源可以是立即数、寄存器堆、基地址寄存器等。E段用于对操作数进行运算,如算术运算、逻辑运算等。对于数据访问指令,则在E段计算数据地址。M1和M2段用于访问存储器,即根据数据访问指令的数据地址对存储器进行读写访问。W段则用于将该指令的执行结果(算术、逻辑运算结果,或从存储器读取的数据)写回寄存器堆。

假设有五条指令被依次执行,第一条指令(SHIFT)为移位指令,第二条指令(OR)为‘逻辑或’指令,第三条指令(ADD)为加法指令,第四条指令(LOAD)为数据读取指令,第五条指令(SUB)为减法指令。其中,SUB指令的源寄存器与LOAD指令的目标寄存器相同,因此会产生旁路技术无法解决的写后读相关,即若该LOAD指令的M2段没有完成,则该SUB指令的E段无法开始。如图1所示,在第7个周期,LOAD指令和SUB指令分别进入E段和D段。在第8个周期,LOAD指令进入M1段,此时SUB指令无法进入E段,因此产生一个气泡(如图1中的‘-’所示)。在第9个周期,LOAD指令进入M2段,此时SUB指令仍然无法进行E段,因此再产生一个气泡。在第10个周期,LOAD指令进入W段(即M2段完毕),此时SUB指令可以进入E段。这样,SUB指令总共被延后了两个周期,即旁路技术无法解决图1中所示的数据冒险问题。

分支指令也存在类似的问题。即便采用了分支预测技术,一旦分支错误,然而会产生分支惩罚(branch penalty),即该分支指令后续的指令在流水线中产生气泡,使得所述后续指令被延后完成。

此外,现有的处理器体系结构在执行操作时,通常先用专门的数据读取指令将操作数从存储器中读取(load)到寄存器中,再送到运算单元执行相应操作;执行完毕后,先将执行结果保存在寄存器中,再用专门的数据存储指令将寄存器中的数据存储(store)到存储器中。根据统计,在传统处理器的程序中,数据读取指令和数据存储指令占程序中指令总数34%左右。由于数据读取指令和数据存储指令本身并不涉及算术逻辑运算,因此这类指令的比重越大,处理器运算单元的利用率越低,处理器的运算能力越无法得到充分的发挥。此外,分支指令本身也不涉及算术逻辑运算,且这类指令占程序中指令总数16%左右。如果能够隐藏数据数据读取指令、数据存储指令和分支指令,使之不占据单独的指令周期,就能进一步提高处理器的指令执行效率。

本发明提出的方法与系统装置能直接解决上述或其他的一个或多个困难。



技术实现要素:

本发明提出了一种缓存方法,所述方法根据存储在缓存系统中的程序流(program flow)信息调度(schedule)指令的发射(issue);所述程序流信息包含指令顺序(sequence)信息及指令距离(distance)信息;根据所述指令顺序及距离信息,确定指令发射的时间点,从而实现指令多发射。

可选的,在所述方法中,存储在指令存储器中的指令包含了所述程序流信息的部分或全部;或者从指令中提取出所述程序流信息并存储在程序流信息存储器中。

可选的,在所述方法中,所述指令存储器是指令缓存或指令读缓冲;所述程序流信息存储器是轨道表或轨道读缓冲。

可选的,在所述方法中,处理器系统包含主流水线和提前流水线;根据存储在指令存储器或程序流信息存储器中的指令顺序以及指令距离,提前将指令发射到提前流水线中。

可选的,在所述方法中,根据提前从指令存储器或程序流信息存储器中读出指令类型,提前发射所需执行周期数较多的指令。

可选的,在所述方法中,将指令至少分为两类:类型‘1’指令,即执行时所需周期数较多的指令,和类型‘0’指令,即执行时所需周期数较少的指令;且在提前流水线中执行类型‘1’指令;在主流水线中执行类型‘0’指令;根据程序流信息中的类型信息,提前在提前流水线中发射类型‘1’指令;或者,将指令分至少为三类:类型‘s’指令,即执行时所需周期数多的指令但不会和后续指令产生寄存相关性的指令;类型‘1’指令,即执行时所需周期数较多的指令且可能会和后续指令产生寄存相关性的指令;类型‘0’指令,即执行时所需周期数较少的指令;且在提前流水线中执行类型‘1’指令;在主流水线中执行类型‘0’指令;根据类型‘1’指令和类型‘0’指令的数目差,将类型‘s’指令视为类型‘1’指令或类型‘0’指令,从而平衡主流水线和提前流水线中执行的指令的数目;根据程序流信息中的类型信息,提前在提前流水线中发射类型‘1’指令和视为类型‘1’的类型‘s’指令。

可选的,在所述方法中,类型‘1’指令包括数据读取指令、分支指令。

可选的,在所述方法中,类型‘1’指令还包括数据存储指令、乘法指令和除法指令。

可选的,在所述方法中,类型‘s’指令包括数据存储指令。

可选的,在所述方法中,通过提前将类型‘1’指令在提前流水线中发射,使得所述类型‘1’指令的执行结果能早于后续指令获取该结果的时间点,从而消除所述类型‘1’指令造成的执行延迟。

可选的,在所述方法中,对从更低层次存储器填充到一级指令缓存的指令进行扫描,提取出所述程序流信息的部分或全部。

可选的,在所述方法中,所述提取出的信息包括:类型信息,用于区分该指令是类型‘1’指令还是类型‘0’指令,或用于区分该指令是类型‘1’指令、类型‘0’指令还是类型‘s’指令;指令类型,用于区分该指令是数据访问指令还是分支指令,或是其他指令。

可选的,在所述方法中,当所述指令是分支指令时,所述提取出的信息进一步包括:所述分支指令的分支目标指令地址信息;所述地址信息是指令地址或缓存地址;当所述指令是数据访问指令时,所述提取出的信息进一步包括:所述数据访问指令所访问的数据的地址信息;所述地址信息是数据地址或缓存地址(BN)。

可选的,在所述方法中,将提取出的信息存储在轨道表中;所述轨道表由轨迹点构成,每个轨迹点对应至少一条指令;所述轨道表中至少包含了填充到一级指令缓存中的所有分支指令对应的分支点及所有数据访问指令对应的数据点;所述分支点还进一步包含所述分支指令的分支转移结果;所述数据点还进一步包含:所述数据访问指令的数据步长,或步长指针;所述数据步长就是数据访问指令前后两次执行时对应的数据地址的差值;所述步长指针就是该数据访问指令对应的数据步长在步长表中的地址值;所述数据访问指令所处的状态;根据所述状态确定数据点中的数据步长或步长指针是否有效,以及确定数据点中的数据地址信息对应的是本次数据还是下次数据。

可选的,在所述方法中,通过将数据访问指令的前一次访问数据的数据地址和数据步长相加,得到下一次访问数据的预测数据地址后再转换为预测缓存地址;或通过将前一次访问数据的缓存地址和数据步长相加,得到下一次访问数据的预测缓存地址;以及根据所述预测缓存地址提前保证相应数据已经被存储在一级数据缓存中。

可选的,在所述方法中,根据所述预测缓存地址提前将相应数据读出;当数据流水线执行数据访问指令时,判断预测缓存地址是否正确;若正确,则处理器系统继续后续操作;若不正确,则根据所述实际缓存地址重新获取相应数据后,处理器核再继续后续操作。

可选的,在所述方法中,所述判断预测缓存地址是否正确的方法是,当数据流水线执行数据访问指令时:计算得到实际数据地址并转换为实际缓存地址后,将所述实际缓存地址和预测缓存地址比较;或者计算得到实际数据地址后,将所述实际数据地址和从预测缓存地址转换得到的预测数据地址比较;或者将此时的基地址寄存器值和预测数据地址减去地址偏移量得到的值比较;或者将此时的分支判别字和计算预测数据地址时的分支判别字比较;若比较结果为相等,则所述预测缓存地址是正确的;若比较结果为不相等,则所述预测缓存地址是错误的;。

可选的,在所述方法中,在所述步长表中存储了数据访问指令在不同循环层次下的相应数据步长;且根据数据访问指令之后的连续若干个反向跳转的分支指令的分支转移结果构成的分支判别字,从该数据访问指令对应的这些数据步长中读出该分支判别字对应的循环层次下的数据步长;可以根据所述数据访问指令前一次访问数据的地址信息和所述数据步长产生下一次访问数据的地址信息。

可选的,在所述方法中,在所述步长表中存储了数据访问指令对应不同的反向跳转的分支指令的相应数据步长;且当反向跳转的分支指令的分支转移发生时,读出步长表中该分支指令对应的所有数据步长,并根据所述数据步长对应的数据访问指令前一次访问数据的地址信息和所述数据步长产生所述数据访问指令的下一次访问数据的地址信息。

可选的,在所述方法中,所述方法包含:一个主循迹器读指针,用于对指令寻址,并向主流水线提供类型‘0’指令;一个数据循迹器读指针,用于对指令和轨迹点寻址,并向数据流水线提供类型‘1’指令;且所述数据循迹器读指针与主循迹器读指针指向相同指令,或所述数据循迹器读指针领先于所述主循迹器读指针;通过对主循迹器读指针或数据循迹器读指针增‘1’,使其指向下一指令或轨迹点。

可选的,在所述方法中,数据循迹器读指针提前指向主循迹器读指针之后的类型‘1’指令,并等到主循迹器读指针到达特定位置时,将该类型‘1’指令发射到领先流水线中,并对所述类型‘1’指令与其之前直至主循迹器读指针之间的所有指令的寄存器相关性进行检测,以确定所述类型‘1’指令在领先流水线中需要插入的气泡数目;可以通过以下方法对主循迹器读指针是否到达所述特定位置进行判断:当主循迹器读指针和数据循迹器读指针的距离之差小于最大提前量时,认为主循迹器读指针已经到达所述特定位置;或者提前计算所述数据循迹器读指针之前最大提前量位置对应的缓存地址,且当主循迹器读指针到达该缓存地址时,认为主循迹器读指针已经到达所述特定位置。

可选的,在所述方法中,根据所述寄存器相关性检测结果,对指令进行静态调度,从而分别在主流水线和领先流水线中同时发射类型‘0’指令和类型‘1’指令。

可选的,在所述方法中,当数据循迹器读指针指向的是类型‘1’指令时,对数据循迹器读指针当前经过的连续类型‘1’指令的数目进行计数得到一个计数值,且当主循迹器读指针和所述连续类型‘1’指令中的第一条的距离之差小于‘-1’时,主循迹器读指针除了增加‘1’以外,还增加所述计数值,使得主循迹器读指针越过数据循迹器读指针当前指向的指令;若主循迹器读指针指向类型‘0’指令,则将该类型‘0’指令发射到主流水线中;若主循迹器读指针指向类型‘1’指令,则不发射该类型‘1’指令。

可选的,在所述方法中,当数据循迹器读指针指向的是类型‘1’指令时,对数据循迹器读指针当前经过的连续类型‘1’指令的数目进行计数,直到指向第一个类型‘0’指令时结束计数,并得到一个计数值;当主循迹器读指针和所述连续类型‘1’指令中的第一条的距离之差小于‘-1’且所述计数尚未结束时,主循迹器读指针暂停增‘1’,停止移动,直到所述计数结束后,主循迹器读指针除了增加‘1’以外,还增加所述计数值,使得主循迹器读指针越过所述连续类型‘1’指令指向其之后的第一个类型‘0’指令。

可选的,在所述方法中,当所述类型‘1’指令与类型‘0’指令之间的距离小于关键距离(critical distance)时,在前的类型‘1’指令在领先流水线中的气泡会导致在后的类型‘0’指令在主流水线中产生气泡。

可选的,在所述方法中,当所述类型‘1’指令是分支指令时,若存在关键指令,则将关键指令的运算与分支判断结果产生合并进行,使得分支判断结果能提前产生。

可选的,在所述方法中,对所述关键指令和分支指令均译码,并将执行关键指令所需操作数与执行分支指令所需的其他操作数一同用于产生分支判断结果。

可选的,在所述方法中,当数据循迹器读指针指向类型‘1’指令或轨迹点时,暂存数据循迹器读指针值及根据该读指针对轨道表或轨道读缓冲寻址读出的轨迹点内容,使得数据循迹器读指针可以继续移动指向后续的类型‘1’指令或轨迹点。

可选的,在所述方法中,所述方法还包括一个领先循迹器读指针领先于数据循迹器读指针,提前指向后续的类型‘1’指令或轨迹点。

可选的,在所述方法中,一级指令缓存中的指令和轨道表中的轨迹点相互对应,可以通过由第一地址(BN1X)和第二地址(BN1Y)构成的一级指令缓存地址(BN1)对一级指令缓存和轨道表寻址,分别读出相应的指令和轨迹点;可以通过由第一地址(DBN1X)和第二地址(DBN1Y)构成的一级数据缓存地址(DBN1)对一级数据缓存寻址,读出相应的数据;二级缓存中的存储块和主动表的行相互对应,可以通过由第一地址(BN2X)和第二地址(BN2Y)构成的二级缓存地址(BN2)对二级缓存和主动表寻址,分别读出相应的存储块和主动表行。

可选的,在所述方法中,每个二级存储块包含若干个一级指令块或一级数据块,且所述二级存储块的第二地址(BN2Y)中的高位部分为子块号,每个子块号对应一级指令块或一级数据块,低位部分与所述一级指令块或一级数据块的第二地址(BN1Y或DBN1Y)相同;所述二级存储块的第一地址(BN2X)和子块号构成超级地址(BN2S),使得二级缓存地址可以由超级地址(BN2S)和相应的一级缓存第二地址(BN1Y或DBN1Y)构成。

可选的,在所述方法中,主动表的每行中还按子块号记录了该二级存储块对应的所述若干个一级存储块中的全部或部分一级存储块的一级缓存第一地址(BN1X);根据二级缓存地址(BN2)中的超级地址(BN2S)在主动表中找到该二级缓存地址对应的一级缓存第一地址(BN1X或DBN1X);所述一级缓存第一地址(BN1X或DBN1X)可以与二级缓存地址(BN2)中的一级缓存第二地址(BN1Y或DBN1Y)一同构成一级缓存地址(BN1或DBN1)。

可选的,在所述方法中,主动表的每行中还记录了该二级存储块的顺序地址前一个和后一个二级存储块的二级缓存第一地址(BN2);可以根据一个二级存储块的二级缓存地址(BN2)在主动表中找到该二级存储块的顺序地址前一个和后一个二级存储块的二级缓存地址(BN2)。

可选的,在所述方法中,轨道表的每行中记录了该行对应的超级地址(BN2S);根据一级指令缓存地址(BN1)中的第一地址(BN1X)在轨道表中找到相应的超级地址(BN2S);所述超级地址(BN2S)和一级指令缓存地址(BN1)中的第二地址(BN2Y)一同构成二级缓存地址(BN2)。

可选的,在所述方法中,所述方法还记录了一级数据缓存中每行对应的超级地址(BN2S);根据一级数据缓存地址(DBN1)中的第一地址(DBN1X)找到相应的超级地址(BN2S);所述超级地址(BN2S)和一级数据缓存地址(DBN1)中的第二地址(DBN2Y)一同构成二级缓存地址(BN2)。

可选的,在所述方法中,主流水线和领先流水线均包含两个前端流水线和一个后端流水线;所述两个前端流水线互为当前前端流水线和目标前端流水线;当所述当前前端流水线执行到分支指令时,将分支目标指令一级缓存地址(BN1)送到目标前端流水线,使得在当前前端流水线继续执行所述分支指令的顺序地址下一(fall through)指令及其后续指令的同时,由目标前端流水线执行所述分支指令的目标(target)指令及其后续指令;当所述分支指令的分支判断结果为分支转移不发生时,将所述当前前端流水线送往后端流水线执行;当所述分支指令的分支判断结果为分支转移发生时,将所述目标前端流水线送往后端流水线执行,并将所述目标前端流水线作为新的顺序目标前端流水线继续执行。

本发明还提出了一种缓存系统,所述系统包括:至少一个存储器,用于存储程序流信息;所述程序流信息包含指令顺序信息及指令距离信息;一个循迹模块,用于根据所述程序流信息中的指令顺序及距离信息,确定指令发射的时间点,从而实现指令多发射。

对于本领域专业人士,还可以在本发明的说明、权利要求和附图的启发下,理解、领会本发明所包含其他方面内容。

有益效果

本发明所述系统和方法可以为数字系统使用的缓存结构提供基本的解决方案。与传统缓存系统仅在缓存缺失后才填充的机制不同,本发明所述的系统和方法在处理器执行一条指令之前就对指令缓存及数据缓存进行填充,可以避免或充分地隐藏缓存缺失,提高了处理器系统的性能。

采用本发明所述系统和方法,可以根据执行周期数对指令进行分类,并提前发射将执行周期数较多的指令,使得各种指令的完成时间点尽可能一致,从而消除或部分掩盖了因指令间寄存器相关性导致的流水线等待。

进一步地,采用本发明所述系统和方法,可以分别在主流水线和领先流水线中发射不同执行周期数的指令,且主流水线中不处理执行周期数较多的指令,使得主流水线能够跳过周期数较多的指令,提高了主流水线的执行效率。

本发明所述的系统和方法还为分支处理提供了一种解决方法。通过在由两个前端流水线同时执行分支指令的顺序地址下一指令和分支目标指令,并根据执行分支指令产生的分支判断结果选择这两个前端流水线之一的结果送到后端流水线执行,消除了分支延迟槽,提高了分支指令的执行效率。

以上各点有益效果最终均体现为提高了处理器系统每周期执行的指令数(IPC)。

对于本领域专业人士而言,本发明的其他优点和应用是显见的。

附图说明

图1是现有流水线技术的一个示意图;

图2是本发明所述数据缓存结构的一个实施例;

图3A是本发明所述步长表的一个实施例;

图3B是本发明所述循环中的数据访问指令的一个示意图;

图4是本发明所述判断基地址寄存器是否更新完毕的实施例;

图5A是采用本发明所述提前基地址技术时的一个流水线示意图;

图5B是采用本发明所述提前基地址技术时的另一个流水线示意图;

图6是本发明所述数据缓存结构的一个改进实施例;

图7是本发明所述改进后的指令地址生成器的一个实施例;

图8是本发明所述两层缓存的缓存系统的一个实施例;

图9A是本发明所述缓存系统中用到的地址格式的示意图;

图9B是本发明所述轨迹点内容的一个示意图;

图10是本发明所述产生轨迹点内容的一个实施例;

图11是包含本发明所述处理器系统流水线结构的一个示意图;

图12是包含本发明所述处理器系统流水线的另一个示意图;

图13A是本发明所述有限状态机的一种状态转移图;

图13B是本发明所述有限状态机的另一种状态转移图;

图14A是本发明所述执行数据读取指令的一个实施例;

图14B是本发明所述执行数据读取指令的一个最差情况实施例;

图14C是本发明所述执行数据存储指令的一个最差情况实施例;

图15是本发明所述跳过分支指令时的流水线的一个示意图;

图16A是本发明所述处理器系统流水线结构的另一个示意图;

图16B是本发明所述分支模块的一个实施例;

图16C是本发明所述分支模块的另一个实施例;

图16D是本发明所述分支模块的另一个实施例;

图17是本发明所述两层缓存的缓存系统的另一个实施例;

图18是本发明所述两层缓存的缓存系统的另一个实施例;

图19A是本发明所述同步模块的另一个实施例;

图19B是本发明所述先入先出的一个实施例;

图20是本发明所述两层缓存的缓存系统的另一个实施例;

图21是本发明所述两层缓存的缓存系统的另一个实施例;

图22A是本发明所述包含两个前端流水线的流水线的一个示意图;

图22B是本发明所述包含两个前端流水线的流水线的另一个示意图;

图23是本发明所述调度器的一个实施例;

图24是本发明所述支持双前端流水线的处理器的一个结构图;

图25是本发明所述支持双前端流水线的处理器的流水线的一个示意图;

图26是本发明所述包含两个前端流水线的缓存系统执行程序的一个实施例;

图27是本发明所述包含两个前端流水线的流水线的另一个示意图。

具体实施方式

以下结合附图和具体实施例对本发明提出的缓存系统和方法作进一步详细说明。根据下面说明和权利要求书,本发明的优点和特征将更清楚。需说明的是,附图均采用非常简化的形式且均使用非精准的比例,仅用以方便、明晰地辅助说明本发明实施例的目的。

需要说明的是,为了清楚地说明本发明的内容,本发明特举多个实施例以进一步阐释本发明的不同实现方式,其中,该多个实施例是列举式并非穷举式。此外,为了说明的简洁,前实施例中已提及的内容往往在后实施例中予以省略,因此,后实施例中未提及的内容可相应参考前实施例。

虽然该发明可以以多种形式的修改和替换来扩展,说明书中也列出了一些具体的实施图例并进行详细阐述。应当理解的是,发明者的出发点不是将该发明限于所阐述的特定实施例,正相反,发明者的出发点在于保护所有基于由本权利声明定义的精神或范围内进行的改进、等效转换和修改。同样的元器件号码可能被用于所有附图以代表相同的或类似的部分。

本发明所述的指令地址(Instruction Address)指的是指令在主存储器中的存储地址,即可以根据该地址在主存储器中找到这条指令。在此为简单明了起见,均假设虚拟地址等于物理地址,对于需要进行地址映射的情况,本发明所述方法也可适用。在本发明中,当前指令可以指当前正在被处理器核执行或获取的指令;当前指令块可以指含有当前正被处理器执行的指令的指令块。

在本发明中,分支指令(Branch Instruction)代表任何适当的能导致处理器核改变执行流(Execution Flow)(如:非按顺序执行指令或微操作)的指令形式。分支指令地址代表分支指令本身的指令地址,该地址由指令块地址和指令偏移地址构成。分支目标指令代表分支指令造成的分支转移所转向的目标指令,分支目标指令地址代表分支目标指令的指令地址。本次数据地址代表正在被执行或执行完毕的数据访问指令产生的数据地址,该数据地址一定是正确的。下次数据地址代表数据访问指令下一次被执行时的预测数据地址,该数据地址可能正确,也可能错误。

根据本发明技术方案,可以根据同一数据访问指令前后两次执行时数据地址的差值,即数据步长(stride),计算下一次执行该数据访问指令时的预测数据地址(简称Stride数据地址),提前将对应数据填充的数据缓存中,以避免数据缓存缺失,甚至提前向处理器核提供数据,以掩盖读取数据缓存的时间。在本发明中,该技术被简称为Stride技术。

请参考图2,其为本发明所述缓存系统的一个实施例。在图2中,处理器系统由处理器核102、一级指令缓存104、一级指令标签存储器144、扫描器106、一级数据缓存204、一级数据标签存储器244、轨道表110、主循迹器(Master Tracker)120、数据循迹器(Data Tracker)320、加法器216218、选择器202和210构成。

在本实施例中,一级指令标签存储器144中的行与一级指令缓存104中的一级指令块一一对应,且每行中存储了相应一级指令块的块地址。一级数据标签存储器244中的行与一级数据缓存204中的一级数据块一一对应,且每行中存储了相应一级数据块的块地址。

在本发明中,可以用第一地址(BNX或DBNX)和第二地址(BNY或DBNY)来表示指令或数据在一级指令缓存或一级数据缓存中的位置信息,所述BN1X(或DBN1X)和BN1Y(或DBN1Y)合并构成的BN1(或DBN1)就是可以直接对一级指令缓存104(或一级数据缓存204)寻址的地址。例如,可以用BN1X表示该指令所在指令块的一级块号(即一级指令标签存储器144中的行号),并用BN1Y表示该指令的一级指令块内偏移量;可以用DBN1X表示该数据所在数据块的一级块号(即一级数据标签存储器244中的行号),并用DBN1Y表示该数据的一级数据块内偏移量。这样,在本实施例中,轨道表110中的行、一级指令缓存104中的指令块和一级指令标签存储器144中的行三者相互对应,并由同一个BN1X指向;轨道中的轨迹点和相应一级指令块中的指令对应,并由同一个BN1Y指向;一级数据缓存204中的数据块和一级数据标签存储器244中的行对应,并由同一个DBN1X指向。

本实施例中,轨道表110含有复数条轨道(track),每条轨道对应一级指令缓存104中的一个一级指令块,且每条轨道包含复数个轨迹点(track point)。一个轨迹点是轨道表中的一个表项,对应相应一级指令块中的至少一条指令,且轨道中从左向右的每个轨迹点对应的地址递增。此外,可以在轨道表110的每行(每条轨道)最后额外增加一个表项(结束轨迹点),用于存储指向顺序执行的下一轨道的位置。

轨道表110的轨迹点内容可以包含:指令类型(TYPE)域,有效位(V)域、地址域、和步长信息域。在此,指令类型域中存储的指令类型可以是分支指令类型、数据访问指令类型和其他指令类型等。分支指令可以被进一步细分,如:无条件直接分支指令、有条件直接分支指令、无条件间接分支指令和有条件间接分支指令等,其对应的轨迹点为分支点(Branch Point)。数据访问指令也可以被进一步细分,如数据读取指令和数据存储指令等,其对应的轨迹点为数据点(Data Point)。

对于分支点,地址域中包含的可以是BN1或PC。可以用某种方式(例如在指令类型域中做进一步区分)指示在该分支点的地址域中包含的是BN1还是PC。其中,BN1就是该分支指令对应的分支目标指令在一级指令缓存104中的位置信息,可以根据分支点中存储的BN1在一级指令缓存104中找到相应的分支目标指令,并在轨道表110中找到该分支目标指令对应的轨迹点;PC则是该分支指令对应的分支目标地址。

对于数据点,循迹地址域中包含的可以是DBN1或数据地址。可以用某种方式(例如在指令类型域中做进一步区分)指示在该数据点的地址域中包含的是DBN1还是数据地址。其中,DBN1就是该数据访问指令对应的数据在一级数据缓存204中的位置信息,可以根据数据点中存储的DBN1在一级数据缓存204中找到对应的数据;数据地址则是该数据访问指令需要访问的数据的地址。有效位域中存储了该数据访问指令当前所处的状态,根据不同的状态可以给予不同的数据地址预测方法。步长信息域则用于存储该数据访问指令对应的数据步长或指向该数据步长所在存储单元的一个指针。为了便于描述,在本实施例中以步长信息域中存储的均是数据步长为例进行说明。

需要说明的是,由于一个轨迹点不可能同时既是分支点又是数据点,因此可以由指令类型域区分出分支指令和数据访问指令,而分支点和数据点的其他域共享轨迹点中的剩余存储空间。

在图2中,扫描器106对从更低层次存储器(如二级指令缓存)填充到一级指令缓存104的指令块进行审查,并提取出轨迹点信息填充到轨道表110的相应表项中,从而在轨道表110中建立该一级指令块对应的轨道。在建立轨道时,首先由替换模块(图2中未显示)产生一个BN1X指向一条可用轨道。在本发明中,替换模块可以根据替换算法(如LRU算法)确定可用轨道。

当从更低层次存储器经扫描器106向一级指令缓存104填充指令块时,扫描器106计算该指令块中含有的分支指令的分支目标地址。计算得到的分支目标地址被送至一级指令标签存储器144与其中存储的指令块地址匹配确定该分支目标是否已经存储在一级指令缓存104中。如果匹配成功,则得到匹配成功项对应的BN1X,并以该分支目标指令地址的低位作为BN1Y,从而得到分支目标指令对应的BN1,与所述分支指令的指令类型一起作为轨迹点内容填充到该分支点中。如果匹配不成功,即分支目标指令所在的指令块尚未被填充到一级指令缓存104中,那么可以将分支目标指令所在的指令块从更低层次存储器填充到一级指令缓存104中由替换算法(如LRU算法)确定的BN1X指向的指令块中,并以该分支目标指令地址的低位作为BN1Y,从而得到分支目标指令对应的BN1,与所述分支指令的指令类型一起作为轨迹点内容填充到该分支点中;或者直接将分支目标指令地址与所述分支指令的指令类型一起作为轨迹点内容填充到该分支点中(此时表示该分支目标指令没有存储在一级指令缓存104中)。

具体地,扫描器106对从更低层次存储器送来的每一条指令进行审查,并提取出某些信息,如:指令类型、指令源地址和分支指令的分支增量(Branch Offset),并基于这些信息计算出分支目标地址。对于直接分支指令,可以通过对该指令所在指令块的块地址、该指令在指令块中的偏移量和分支增量三者相加得到分支目标地址。所述指令块地址可以是从一级指令标签存储器144中读出并被直接送往扫描器106中加法器的。也可以在扫描器106中增加用于存储当前指令块地址的寄存器,这样一级指令标签存储器144就不需要对同一指令块中的每条分支指令送出指令块地址。在本实施例中,直接分支指令的分支目标地址由扫描器106产生,而间接分支指令的分支目标地址由处理器核102产生。

当扫描器106审查指令块发现数据访问指令时,在相应轨道中建立对应的数据点。在本实施例中,数据点的有效位域长度为两位(2bits)。有效位值‘00’表示无效(IV)状态,此时地址域和步长信息域中的值均无效。有效位值‘01’表示学习(LE)状态,此时地址域中的值为本次数据地址对应的DBN1,步长信息域中的值无效。有效位值‘11’表示预测(SR)状态,此时地址域中的值为下次数据地址(Stride数据地址)对应的DBN1(简称Stride DBN1),步长信息域中的值有效。

因此,在建立数据点时,其有效位被置为‘00’进入IV状态。当该数据点被第一次执行时,可以得到本次数据地址对应的DBN1,因此有效位被改为‘01’,进入LE状态。当该数据点再次被执行时,可以计算得到数据步长,并根据该数据步长计算得到下次数据地址,从而如前转换得到Stride DBN1,因此有效位被改为‘11’,进入SR状态。之后该数据点可以一直保持在SR状态。

此外,在某些指令集体系结构(ISA,Instruction Set Architecture)中有采用直接寻址方式产生数据地址(即,以立即数为数据地址或以指令地址和立即数之和作为数据地址)的数据访问指令。对于这些指令集体系结构,还可以提取出所述立即数作为数据地址,或由扫描器106中的加法器对指令地址与提取出的立即数相加的结果作为数据地址,送到一级数据标签存储器244匹配。若匹配成功,则得到匹配成功项对应的DBN1X,并以该数据地址的低位作为DBN1Y,从而得到该数据访问指令对应的DBN1,和指令类型一起作为轨迹点内容填充到该数据点中。若匹配不成功,则将该数据地址送往更低层次存储器(如二级数据缓存)获取相应数据块填充到由替换算法(如LRU算法)确定的DBN1X指向的一级数据块中,并以该数据地址的低位作为DBN1Y,从而得到该数据访问指令对应的DBN1,和有效位‘11’、数据步长‘0’及指令类型一起作为轨迹点内容填充到该数据点中,使得之后每次执行该数据点时对应的数据地址均为所述立即数或加法结果。

在本发明中轨迹点本身的轨迹点地址与该轨迹点所代表指令的指令地址相关(correspond);而分支指令轨迹点中含有分支目标的轨迹点地址,且该轨迹点地址与分支目标指令地址相关。与一级缓存104中一系列连续指令所构成的一个一级指令块相对应的复数个连续的轨迹点称为一条轨道。该一级指令块与相应的轨道由同一个一级块号BN1X指示。轨道表110含有至少一条轨道。一条轨道中的总的轨迹点数可以等于轨道表110中一行中的表项总数(也可以在此总数上增添结束轨迹点)。这样,轨道表110就成为一个以轨道表项地址对应分支源地址、表项内容对应分支目标地址来代表一条分支指令的表。此外,可以在某个一级指令块被替换时,将以该行为分支目标的其他轨道表行中的分支点中的分支目标BN1替换为从一级指令标签存储器144中查到的相应PC,使该行可以被其他指令行写入而不致引起错误。

主循迹器120和数据循迹器320结构相同,其中主循迹器120由寄存器112、增量器114和选择器118组成,数据循迹器320由寄存器312、增量器314和选择器318组成。

主循迹器120的读指针115(即寄存器112的输出)的格式为BN1X,BN1Y。其中BN1X选中轨道表110中的一行及一级指令缓存104中的相应的存储块,BN1Y选中该行中一个表项及存储块中相应的指令。即,读指针115指向轨道表110中处理器核102即将执行的指令(即当前指令)对应的轨迹点,并读出轨迹点内容经总线117分别送往主循迹器中的选择器118和数据循迹器中的选择器318。同时,读指针115对一级缓存104寻址,读出该当前指令送往处理器核102供执行。或者,可以由读指针115中的BN1X对一级缓存104寻址读出相应指令块,并由处理器核102输出的指令偏移地址(PC Offset),即指令地址的低位部分,从该指令块中读出相应指令供处理器核102执行。在本说明书中,将主要以前一种方式(单独由读指针115对一级缓存104寻址读出指令)为例进行说明,并将在必要时对后一种方式(由读指针115和指令偏移地址共同对一级缓存104寻址读出指令)进行补充。

主循迹器120的寄存器112由处理器核102送来的步进(stepping)信号111控制。步进信号111是处理器核向循迹器提供的反馈信号,此信号在处理器核正常工作时一直为‘1’,使循迹器120中寄存器112每个时钟周期都更新,使读指针115指向轨道表中一个新的表项及一级缓存104中一条新的指令以供处理器核执行。当处理器核中工作异常,需要停流水线或者不能执行新的指令时,则步进信号为‘0’,使寄存器112停止更新,循迹器120及指针115保持原来状态不变,一级缓存104暂停向处理器核102提供新的指令。

若总线117上读出的轨迹点内容中的指令类型经控制器(图中未显示)译码显示该指令不是分支指令,控制器则控制选择器118选择来源于寄存器112的BN1X值和来源于增量器114的增一后的BN1Y作为新的BN1输出送回寄存器112的输入。寄存器112在有效的步进信号111控制下更新后,读指针115指向原轨迹点同一轨道上右方的顺序下一个轨迹点并从一级缓存104中读出顺序下一条指令供处理器核102执行。

若总线117上读出的轨迹点内容中的指令类型显示该指令是分支指令,则该轨迹点内容中还相应包含了分支目标轨迹点的位置信息(BN1或PC)。

若控制器发现该位置信息是PC,则将该PC值中的块地址部分送往一级指令标签存储器144匹配,如果匹配成功,则得到匹配成功项对应的BN1X,并以该PC值的低位作为BN1Y,从而得到分支目标指令对应的BN1写回该分支点中。如果匹配不成功,则如前将该分支目标指令所在的指令块从更低层次存储器填充到一级指令缓存104中由替换算法(如LRU算法)确定的BN1X指向的指令块中,并以该分支目标指令地址的低位作为BN1Y,从而得到分支目标指令对应的BN1写回该分支点中。

这样,当读指针115指向一个分支点时,从轨道表110中读出并放上总线117的最终总是BN1。此时,由处理器核执行该分支指令时产生的表示分支转移是否发生的TAKEN信号113控制选择器118进行选择。若TAKEN信号113的值为‘1’,表示分支转移发生,选择轨道表输出的BN1送回寄存器112,当步进信号111有效(值为‘1’)时更新寄存器112,使得下一周期寄存器112的值被更新为该BN1,即读指针115指向分支目标指令对应的轨迹点并从一级缓存104中读出该分支目标指令供处理器核102执行。若TAKEN信号113的值为‘0’,表示分支转移没有发生,则选择寄存器112输出的BN1X及增量器114对寄存器112的BN1Y值增一的结果作为输出送回寄存器112,当步进信号111有效(值为‘1’)时更新寄存器112,使得下一周期寄存器112的值增一,即读指针115指向右方顺序下一个轨迹点并从一级缓存104中读出对应指令供处理器核102执行。若步进信号111无效则寄存器112的值保持不变,继续等待步进信号111有效时再更新。此外,对于无条件分支点,选择器118可以不根据TAKEN信号113进行选择,而是直接在控制器的控制下选择来源于轨道表110的BN1送往寄存器112并如前更新寄存器112。还可以将结束轨迹点视为一个无条件分支点,其分支目标轨迹点就是顺序地址的下一指令块的第一条指令对应的轨迹点。这样,当循迹器120读指针115移动结束轨迹点时,可以直接在控制器的控制下,由选择器118选择所述下一指令块第一条指令的BN1并更新寄存器112,使得循迹器120读指针115指向正确的下一轨迹点。

数据循迹器320的读指针315(即寄存器312的输出)的格式为BN1Y,用于指向读指针115中BN1X指向的轨道中的一个轨迹点,并读出该轨迹点内容经总线317送出。总线317上的指令类型及数据点的有效位信息经控制器译码后控制选择器318和寄存器312。

当控制器译出总线317上的类型信息为非数据访问类型时,其使选择器318选择增量器314的输出并使寄存器312存进该增量器的输出,经读指针315指向并读出轨道表110中同一轨道行中顺序下一个表项,直至读指针315指向一个数据点为止,使得读指针315能领先于读指针115指向处理器核102尚未执行的指令对应的轨迹点。

当控制器译出总线317上的类型信息为数据访问类型时,进一步对有效位值进行判断。若此时读出的有效位为‘00’(IV状态),则表示相应数据访问指令尚未被处理器核102执行过,因此寄存器312停止更新,使得读指针315暂停移动。当读指针315的值与读指针115中BN1Y值相等时,处理器核102执行到该数据访问指令并产生本次数据地址通过总线209输出。该本次数据地址经选择器210选择后被送到一级数据标签存储器244匹配。如果匹配成功,则得到匹配成功项对应的DBN1X,并以该本次数据地址的低位作为DBN1Y,从而得到本次数据地址对应的DBN1,经选择器202选择后与新的有效位值‘01’一起被写回该数据点中,使得该数据点进入LE状态。如果匹配不成功,即本次数据地址对应的数据块尚未被填充到一级数据缓存204中,那么可以将本次数据地址对应的数据块从更低层次存储器填充到一级数据缓存204中由替换算法(如LRU算法)确定的DBN1X指向的数据块中,并以该本次数据地址的低位作为DBN1Y,从而得到分支目标指令对应的DBN1,经选择器202选择后与新的有效位值‘01’一起被写回该数据点中,使得该数据点进入LE状态。同时,该DBN1对应的数据被送往处理器核102使用。当该数据点进入LE状态后,控制器控制寄存器312继续更新,使得读指针315如前移动直至下一个数据点。

若读出的有效位为‘01’(LE状态),则表示相应数据访问指令只被处理器核102执行过一次,因此寄存器312停止更新,使得读指针315暂停移动。当读指针315的值与读指针115中BN1Y值相等时,处理器核102执行到该数据访问指令并产生本次数据地址(即第二次执行该数据访问指令时的数据地址)。可以根据本次数据地址与上次数据地址计算得到数据步长Stride。具体地,可以将原存储在该数据点中的DBN1中的DBN1X送到一级数据标签存储器244寻址,读出数据块地址,并与该DBN1中的DBN1Y合并构成上次(即第一次)执行该数据点时对应的数据地址(即上次数据地址)。用本次数据地址减去上次数据地址即可得到数据步长Stride。之后,该本次数据地址如前所述被转换为DBN1,与新的有效位值‘11’及数据步长Stride一起被写回该数据点中,使得该数据点进入SR状态。同时,该DBN1对应的数据被送往处理器核102使用。当数据点进入SR状态后,可以根据所述Stride计算得到下次数据地址(Stride数据地址)。例如,可以由加法器218对总线209上的本次数据地址与总线317上的Stride相加得到下次数据地址,经选择器210选择后如前将所述下次数据地址转换为Stride DBN1,经总线202选择后写回该数据点中,并保持SR状态不变。又如,可以直接由加法器216对总线317上本次数据地址对应的DBN1与Stride相加,若没有超出DBN1Y的边界,则Stride DBN1中的DBN1X与本次数据地址的DBN1X相同,而加法结果中对应DBN1Y部分的就是Stride DBN1中的DBN1Y,从而得到Stride DBN1,经总线202选择后写回该数据点中,并保持SR状态不变。通过上述过程,就能保证下次数据地址对应的数据已经被存储在一级数据缓存204中由所述数据点中的DBN1对应的存储单元中,从而避免了数据缓存缺失。

若读出的有效位为‘11’(SR状态),则表示相应数据访问指令至少已经被处理器核102执行过两次,此时数据点中存储的DBN1对应的是下次数据地址,根据该DBN1就可以直接从一级数据缓存204中读出相应数据提供给处理器核102使用。由于读指针315领先于读指针115,因此可以在处理器核102尚未执行到该数据点对应的数据访问指令时,就已经从一级数据缓存204中读出相应数据准备好,不但避免了数据缓存缺失,还掩盖了从一级数据缓存204中读取数据所需的时间。当数据被读出后,可以如前利用存储在数据点中的Stride计算再下次的数据地址(Stride数据地址),并如前将对应的Stride DBN1写入数据点中,保证对应数据已经存储在一级数据缓存204中。当数据点处于SR状态时,寄存器312可以继续更新。

当数据循迹器320的读指针315指向结束轨迹点时,停止移动。当发生分支转移,或因读指针115到达结束轨迹点时,选择器118和318均选择总线117上的BN1分别写入寄存器112和312,使得主循迹器120的读指针115指向分支目标轨迹点或下一轨道的第一个轨迹点。而读指针315在读指针115中BN1X的配合下也指向该轨迹点。这样,读指针315从处理器核102正在执行的指令(即读指针115指向的轨迹点)开始,提前向后移动,重复上述过程。

在本实施例中,用同一个轨道表110存储分支点和数据点。显然,可以利用表格压缩技术对本实施例中的轨道表110进行压缩以节省存储空间。例如,可以在一个压缩轨道表中仅仅按顺序存储分支点和数据点,而不存储既非分支点也非数据点的轨迹点。通过建立并存储该压缩轨道表中分支点及数据点所在位置与它们在原始轨道表中所在位置的对应关系,使得循迹器读指针能指向正确的分支点或数据点,从而减少轨道表的容量。

当然,还可以用不同的两张轨道表分别存储分支点和数据点,而主循迹器和数据循迹器则分别对这两张轨道表寻址。在此情况下,存储分支点的轨道表中轨迹点类型只需要能够区分分支点和非分支点即可,而存储数据点的轨道表中的轨迹点类型也只需要能够区分数据点和非数据点即可,并可以利用表格压缩技术对这两张轨道表进行更有效的压缩以更好地节省存储空间。具体运行过程与之前类似,在此不再赘述,且为了便于叙述,在本说明中将均以同时包含了分支点和数据点的轨道表为例进行说明。

此外,对于数据访问指令中的数据存储指令,可以通过增加一个写缓存的方法延迟写回数据缓存(或存储器),即不必事先计算得到数据存储指令的数据地址。因此,可以对数据读取指令和数据存储指令均建立数据点,此时,在数据点中还需要有额外的类型位表示该数据点对应的是数据读取指令还是数据存储指令;也可以只对数据读取指令建立数据点,而将数据存储指令视为其他指令。当数据存储指令被视为其他指令时,若采用轨道表压缩技术,则数据存储指令对应的轨迹点也可以不被存储在压缩轨道表中。

由于处在循环代码中的数据访问指令前后两次的数据地址的差值通常是固定的,因此可以使用Stride预先计算可能的下次数据地址(Stride数据地址)。但是在某些特殊情况下,数据地址的差值可能发生变化。为了防止错误发生,当数据点处于SR状态时,可以在处理器核102执行到相应数据访问指令时,即读指针315与读指针115的BN1Y相等时,用处理器核102执行该数据访问指令产生的正确数据地址,对之前计算得到的可能数据地址(或对应的DBN1)进行核对。

例如,当处理器核102产生正确数据地址后,可以如前将该正确数据地址转换为DBN1,并与所述可能数据地址对应的DBN1进行比较。若比较结果为相同,则之前的预测是正确的,可以正常继续后续操作(数据点依然保持在SR状态)。

若比较结果为不相同,则之前的预测是错误的。此时,若处理器核102已经使用错误的预测数据进行后续操作,则需要将处理器核102中相应流水线段的执行结果清除,并如前将正确数据地址转换为DBN1,提供相应正确的数据供处理器核102使用。同时,该正确的DBN1与有效位值‘01’一起被写回该数据点中,使得该数据点进入LE状态。之后,控制器控制寄存器312继续更新,使得读指针315如前移动直至下一个数据点。

又如,可以将数据点中的所述可能数据地址对应的DBN1如前转换为可能数据地址,并与处理器核102执行该数据访问指令时产生正确数据地址进行比较。根据比较结果,可以进行与前例相同的操作。

当一条数据访问指令位于多层循环中时,每次执行反复同一层次循环时,对应的数据步长相同,但执行不同层次循环时,对应的数据步长可能不同。例如:对于一条位于两层循环中的数据访问指令,每次执行内层循环时,数据地址增加‘4’,即数据步长为‘4’;但每次执行外层循环时,数据地址增加‘20’,即数据步长为‘20’。此时,无论将‘4’还是‘20’作为该指令的数据步长,都会导致一定数目的数据地址预测错误。根据本发明技术方案,还可以建立一张步长表(Stride Table),根据分支指令与数据访问指令之间的关系,对同一条数据访问指令位于不同层次循环的情况,记录不同的数据步长(即对于同一条数据访问指令,分别存储其在不同循环下的数据步长),并根据循环的执行情况,提供相应的数据步长以计算下次数据地址,使得数据地址的预测更准确。

请参考图3A,其为本发明所述步长表的一个实施例。在本实施例中,步长表362的存储部分331由复数个行和复数个列构成,其中每一列对应一个数据点,每一行对应一层循环层次情况。假设步长表存储部分331有N行,则在任何一列中都可以记录相应数据点在最多N层循环情况中的最多N种不同数据步长。

请参考图3B,其为本发明所述循环中的数据访问指令的一个示意图。在图3B中,指令按地址顺序从左向右排列,其中,指令357是数据访问指令,而指令351、353和355均是指令357之后的反向(backward)跳转的分支指令。因此,这三条分支指令分别与其分支目标指令之间的这些指令构成循环。如图3B所示,共构成三层嵌套的循环,其中,分支指令351对应的循环为最内层循环,而分支指令355对应的循环为最外层循环。这样,可以分别对这段代码中的每条数据访问指令给予专门的循环步长存储模块,从而在不执行不同层次的循环操作时提供不同的数据步长。

回到图3A,步长表存储部分331中的列可以与轨道表中的数据点一一对应,即轨道表110中的每个数据点都对应步长表中的一个列。此时,步长表存储部分331可以有与轨道表110相同的寻址方式,即可以用读指针115的BN1X和读指针315的BN1Y指向轨道表110中的数据点,并将该二维地址(即BN1X和BN1Y)转换为等价的一维地址后指向步长表存储部分331中该数据点对应的列。这样,轨道表110中的数据点可以不再需要步长信息域。或者,一个较小的步长表存储部分331可以只对应轨道表110中的一部分数据点,并根据一定的替换策略(如LRU算法)进行替换。此时,这部分数据点的步长信息域中存储的是指向步长表存储部分331中一个列的步长指针SP,而其他数据点的步长信息域中存储的是数据步长Stride。为了便于描述,在本实施例中步长表存储部分331中的列只对应轨道表中的一部分数据点。

此外,为了记录分支转移信息,在轨道表110的分支点中增加了一个分支转移域用于存储该分支点最近一次被处理器核102执行时分支转移是否发生的信息。进一步地,也可以只存储反向跳转的分支点最近一次被处理器核102执行时分支转移是否发生的信息。显然,所述信息还可以被存储在一个独立的表中,且该表与轨道表110的寻址地址相同。更进一步地,可以利用表格压缩技术该独立的表进行压缩以节省存储空间。为了便于描述,在本实施例中,所述分支转移是否发生的信息被存储在轨道表110的分支点中。

根据本发明技术方案,可以将数据点之后连续N个反向跳转的分支点的上一次分支判断构成一个分支判别字BDW(branch decision word),并根据该BDW确定此时应该用哪个数据步长。具体地,可以通过将轨道表110中该数据访问指令之后的N个反向跳转的分支点中的分支转移域拼接构成所述BDW。或者,当这些分支转移域是用一个独立表压缩存储时,可以从该表中读出该数据访问指令之后的N个反向跳转的分支点对应的分支判断值拼接构成所述BDW。由于程序的循环是因为分支指令的反向跳转形成的,对于处在循环内部的数据访问指令而言,该反向跳转的分支指令实际发生时间比执行该数据访问指令要早,因此以所述BDW为据可以清楚判别该数据访问指令处于哪层循环中,从而读取相应的数据步长供后续使用。

以步长表存储部分331中某列对应图3B所示程序中的数据访问指令357,以及N(BDW的宽度)等于3为例,假设由于分支指令351的分支转移发生(分支转移信息为‘1’),使得当数据循迹器320读指针315第二次指向数据点357时,读出的步长指针SP被送到译码器335译码后选中步长表存储部分331中的一个列。由于分支指令353和355均尚未被执行,因此相应的分支转移信息均为‘0’,从而构成分支判别字BDW‘100’。所述BDW经优先译码器333译码后选中步长表存储部分331所述列中的一个表项。当处理器核102执行到该数据访问指令时,如前例计算得到Stride,并被作为表项内容存储到所述被选中的表项中。当数据循迹器320读指针315再次指向数据点357时,若BDW依然是‘100’,则可以从该表项中读出存储在其中的Stride,用于计算下次数据地址。对于该列中的其他表项,也可以按相同方法建立。

需要说明的是,根据嵌套循环的特点,当内部循环发生时,无论之前外部循环是否发生过,均应使用内部循环对应的Stride。因此优先译码器333对接收到的BDW进行从左往右的优先译码,一旦发现第一个‘1’,即输出相应字线选中步长表存储部分331中的一行。例如,分支判别字BDW‘010’和‘011’均对应步长表存储部分331的同一行。

再假设步长表存储部分331中数据点357对应的列中的所有表项均已经存储了相应的Stride。此时就可以对不同层次的循环输出不同的的Stride。例如,若分支指令351的分支转移一直发生,则BDW始终是‘100’,步长表存储部分331输出数据点357对应该BDW(‘100’)的Stride。又如,某次分支指令351的分支转移没有发生,但分支指令353的分支转移发生,则当读指针315指向数据点357时,BDW为(‘010’),此时步长表存储部分331输出数据点357对应该BDW(‘010’)的Stride。其他情况也可以此类推。

此外,一旦在数据地址核对时发现可能数据地址错误,即表示上次计算得到的Stride不再正确。此时可以如前例对步长表存储部分331中该数据点当前BDW对应的表项内容进行更新,从而将正确的Stride存储到该表项中。这样,针对不同层次循环情况,步长表存储部分331可以输出对应每条数据访问指令的不同数据步长,并根据需要对每条数据访问指令在不同层次循环中的数据步长进行更新,进一步提高了事先计算得到的数据地址的准确性。

根据本发明技术方案,步长表的组织与使用方式可以有多种多样。除了上述使用BDW的方式外,再举两个例子说明:第一种方式是使用一个先入先出,另外一种方式是使用一个寄存器记录最后一次分支成功的分支指令地址。这两种方式使用的步长表都是普通的存储阵列。其行对应于分支指令,其列对应于数据访问指令。如果该步长表的大小与轨道表110一样大,则可以直接用轨道表地址对其寻址,因为每个轨道表地址代表一条指令,只要分辨出分支指令地址作为步长表的X地址,数据访问指令地址作为步长表的Y地址即可。如果步长表与轨道表的大小不一样,则步长表的地址上还要有如同普通缓存器上标签(tag)的阵列,将轨道表地址BN1映射为步长表的地址。同样,分支指令地址映射为X地址,数据访问地址映射为Y地址。

第一种方式使用一个先入先出(FIFO),其表项内容至少容纳一个数据访问指令的轨道表地址BN1及该指令当时指向的数据缓存地址DBN1。当一条数据访问指令的信息被以BN1为地址从轨道表中读出,其中的DBN1被用以从一级数据缓存204中读出数据以备使用后,将其BN1与DBN1存入先入先出。其他数据访问指令也按同样方式被存入先入先出。系统检测各分支指令的判断情况,当某条分支指令的判断情况为成功分支时,该分支指令的地址被送往步长表读出相应的一行。此后以先入先出中的BN1顺序读取前述选定的一行中与之相应的一个表项,此即为该数据访问指令在成功分支的循环中的步长信息(Stride)。将先入先出送出的DBN1与Stride相加,得到下一DBN1。将下一DBN1写回由该数据访问指令地址BN1指向的轨道表110表项。如此操作直到先入先出为空。这种方式的特征是将DBN1加上步长以获得下一DBN1的操作延迟到分支判断已经作出,步长已知的时刻再进行。有的时候在先入先出还没有空之前,新的数据就被写入。为处理这种情况可以用两个先入先出交替工作(ping-pang buffer),或在先入先出中每个表项中留一标志位指示此表项为一个循环中的第一条数据访问指令,通知系统对此表项及以后表项要用新的一次的成功分支所选定的步长表中的行作为步长操作,不再赘述。

第二种方式为最近一次分支成功的分支指令地址被存入一个寄存器,该寄存器内容被用于对步长表的行寻址。当一条数据访问指令的信息被以BN1地址从轨道表中读出,其中的DBN1被用以从一级数据缓存204中读出数据以备使用后,即以其BN1作为Y地址访问步长表,从上述寄存器指向的行中读出步长(Stride)。即以该步长与DBN1与Stride相加,得到下一DBN1。将此DBN1与Stride一同存入轨道表110中由BN1指向的表项。其他数据访问指令也同样处理。系统检测各分支指令的判断情况,当某条分支指令的判断情况为成功分支时,该分支指令的地址被送往步长表读出相应的一行。当上述数据访问指令信息被再次读出时,其BN1地址再次作为Y地址访问步长表,从寄存器指向的行中读出步长。该步长与轨道表中存储的步长作比较。如相等则下一DBN1可信,可直接用其访问一级数据缓存204。如不相等,则将该下一DBN1减去轨道表项中记录的步长,再加上步长表中读出的步长作为下一DBN1,以其访问一级数据缓存204。这种方式的实质是先用以前的成功分支的相应步长求出下一DBN1,但在使用该DBN1前用于本次数据访问的相关的成功分支的步长作验证。

这两种方式都是在实际执行数据访问指令之前的若干时候已算出数据访问要用的缓存地址。如果该数据尚未在一级数据缓存中,这两种方式都留出充足的时间供系统将所需数据填入一级缓存,消除或部分掩盖缓存缺失惩罚。当然,还可以有与第二种方式相似的第三种方式,即轨道表表项中存放的是上一次数据访问时使用的DBN1。这样当该上一DBN1被从轨道表中提前读出时,再从步长表中以BN1为Y地址读出相应步长(此时上一次成功分支的分支指令地址指向步长表中的一行),与DBN1相加后作为当前DBN1,以此访问一级数据缓存204。这样的做法不一定能完全掩盖一级数据缓存的缺失,但比传统的数据缓存还是减少了访问时延与功耗。

步长表的填充是其读取的逆运算。当使用从步长表中读出的步长计算得到的DBN1被验证逻辑证明是错误的,则正确的DBN1减去错误的DBN1其差就是正确的Stride与错误的Stride之间的差。将该差值与原存在于步长表中的Stride相加得到新的Stride值存回步长表中即可更新步长表。步长表填充时的寻址可以用读取时的同样方式。

在上述实施例中,对于任何一条数据访问指令,都可以在第二次执行完毕后得到数据步长Stride,并用于计算下次数据地址(Stride数据地址)。而对于第一、二次执行本身,可以采用提前基地址(EB,Early Base)的方法提前计算数据地址。这样,即使对于不处在循环中的数据访问指令(即只会被执行一次的数据访问指令),也能提前得到数据地址并开始预取及提供给处理器核,从而减少数据缓存缺失,以及全部或部分掩盖访问数据缓存的时间。在本发明中,该技术被简称为EB技术。采用EB技术计算得到的数据地址简称为EB数据地址,其对应的DBN1被简称为EB DBN1。

如前例所述,对于以立即数为数据地址的数据访问指令,可以在扫描器106审查该指令时就进行数据预取。而对于基于基地址(如基地址寄存器中的值)计算数据地址(如通过基地址加上偏移量得到数据地址)的数据访问指令,则必须等到所述基地址所在的基地址寄存器更新完毕(即更新为处理器核102执行该数据访问指令时该基地址寄存器的值)后,才能使用该基地址寄存器中的值进行数据地址计算。根据本发明技术方案,可以增加一条与处理器核主流水线并行执行的数据流水线(L/S Pipeline),专门用于处理数据访问指令,使得最多能提早M个周期计算数据访问指令的数据地址,其中M大于0。一旦基地址寄存器更新完毕,就由该数据流水线计算数据地址并预取数据,从而掩盖访问存储器的时间。根据本发明技术方案,只要对数据访问指令及其前M条指令所用到的寄存器进行相关性判断,就可以在最多提前M个周期的范围内,确定基地址寄存器更新完毕的时间点。

请参考图4,其为本发明所述判断基地址寄存器是否更新完毕的实施例。在本实施例中,计算数据地址最多提早周期数为3,即M等于3。因此只需要通过对数据访问指令及其前三条指令所用到的寄存器进行相关性判断。对于其他需要提前更多周期计算数据地址的情况,也可以用类似方法实现。在本实施例中为了对指令用到的寄存器进行相关性判断,可以在轨道表110的每个轨迹点中增加存储目标寄存器号的区域,并在每个数据点中增加存储基地址寄存器号的区域,由读指针315寻址通过总线317读出所述目标寄存器号和基地址寄存器号。或者,可以增加一个指令读缓冲(IRB,Instruction Read Buffer),用于存储读指针115中BN1X指向的指令块,而读指针315除了对轨道表110中由所述BN1X指向的行中的轨迹点寻址外,还同时对该指令读缓冲中的相应指令寻址,读出该指令中的目标寄存器号及数据访问指令中的基地址寄存器号。为了便于描述,在本实施例中,假设每条指令最多有一个目标寄存器,且目标寄存器号被存储在轨道表110中。

这样,随着数据循迹器320读指针315的移动,读指针315经过的轨迹点中的目标寄存器号通过总线317依次被读出后经总线401送往寄存器402,而寄存器402与寄存器404、寄存器406构成先入先出结构。这样,寄存器402、寄存器404和寄存器406分别存储了读指针315当前指向的轨迹点之前第一、二、三个轨迹点中存储的目标寄存器号。这三个寄存器的输出分别被送到比较器412、比较器414和比较器416作为一个输入。读指针315当前指向的轨迹点的基地址寄存器号通过总线411被分别送到这三个比较器作为另一个输入。三个比较器分别对各自的两个输入进行比较,并将比较结果送到编码器408进行编码操作,得到的编码结果就是可以提前计算数据地址的周期数。

具体地,若比较器412的输出为‘1’,则表示该数据访问指令之前的第一条指令会更新基地址寄存器,因此无法提前计算数据地址。若比较器412的输出为‘0’,且比较器414的输出为‘1’,则表示该数据访问指令之前的第二条指令会更新基地址寄存器,因此可以提前一个周期计算数据地址。若比较器412和414的输出均为‘0’,且比较器416的输出为‘1’,则表示该数据访问指令之前的第三条指令会更新基地址寄存器,因此可以提前两个周期计算数据地址。若三个比较器输出均为‘0’,则表示该数据访问指令之前的三条指令均不会更新基地址寄存器,因此可以提前三个周期计算数据地址。

仍然以图1中的流水线示意图为例,如果SUB指令以LOAD指令的读取到的数据作为源操作数,那么如前所述SUB指令的E段需要等到LOAD指令的M2段完成后才能开始,即插入两个气泡。请参考图5A,其为采用本发明所述提前基地址技术时的一个流水线示意图。在采用提前基地址技术后,若数据访问指令LOAD能够提前三个周期被执行,那么就会得到如图5A所示的流水线示意图,其中LOAD指令的M2段和SUB指令的I2段同时完成,因此主流水线在执行SUB指令时不必插入气泡,从而提高了处理器系统的整体性能。

此外,在图5A中还可以观察到,由于LOAD指令在数据流水线中执行,因此主流水线相应地空闲了一个周期。因此可以在主流水线中的SUB指令提前一个周期开始执行,从而使得主流水线中完全跳过(Skip)对LOAD指令的操作。

请参考图5B,其为采用本发明所述提前基地址技术时的另一个流水线示意图。在数据流水线中,LOAD指令如前例被提前了三个周期执行,而主流水线中的ADD指令进入I2段的同时,SUB指令进入I1段,与图5A中的SUB指令相比提前了一个周期。在图5B中,数据流水线中LOAD指令的M2段与主流水线中SUB指令的D段同时完成,因此主流水线在执行SUB指令时仍然不必插入气泡,完成这三条指令的总周期数比图5A中少一个周期,从而提高了处理器系统每周期执行的指令数(IPC,instruction per cycle)。

可以对图2实施例中的处理器系统做改进以实现图5B中的流水线。请参考图6,其为本发明所述数据缓存结构的一个改进实施例。为了便于描述,在本实施例中只显示了轨道表110、主循迹器120、数据循迹器320,以及新增加了同步模块212,省略了其他部分。在本实施例中,由主循迹器120读指针115对一级指令缓存104寻址读出指令供处理器核102执行。此外假设数据访问指令计算数据地址的最大提前量(M)是3个周期。

同步模块212由四个部分组成:时间点检测模块610、计数控制模块620、发射控制模块630和相关性检测模块650。在时间点检测模块610中,减法器614对读指针115上的BN1和读指针315上的BN1相减,得到当前处理器核102正在执行的指令(当前指令)与该数据访问指令之间的间隔指令条数。该间隔条数被送到比较器616和618,分别与常数‘-3’和‘-1’进行比较。

具体地,对于比较器616,当读指针115与读指针315的差值等于‘-3’时,表示读指针315比读指针115领先3个轨迹点,该时间点对应本实施例所述的最大提前量‘3’,此时可以控制数据访问指令进入数据流水线的I段。当读指针115与读指针315的差值大于‘-3’时,表示读指针315比读指针115领先量少于3个轨迹点。

根据本发明技术方案,通常情况下当读指针315领先于读指针115,当读指针115移动接近读指针315(例如:距离为‘3’)时,可以开始执行该数据访问指令。但是,有时发生分支转移可能会使得读指针115直接被更新为指向离读指针315更近的位置(例如:距离为‘2’、‘1’、或‘0’)时,此时也可以立即开始执行该数据访问指令。

因此,当读指针115与读指针315的差值大于等于‘-3’时,可以控制读指针315指向的数据访问指令进入数据流水线的I段。此外,无论读指针115和315的距离是多少,只要读指针315指向的数据访问指令已经进入数据流水线的I段,那么在读指针315指向下一个数据点之前,不会再控制该数据访问指令重复进入数据流水线的I段。同时,比较器616的输出‘1’经总线617送到计数器680对当时相关性检测模块650中的三个比较器的输出进行取样。取样得到的就是所述数据访问指令与其之前三条指令之间是否存在寄存器相关性的信息。计数器680根据该信息进行编码产生控制信号经总线681送往发射控制模块630中的选择器638。

此外,比较器616的输出‘1’经总线617还被送到发射控制模块630中的寄存器632、634和636,以及选择器638。其中,寄存器632、634和636的输出分别对总线617上信号延迟了一个、两个和三个周期。因此选择器638的四个输入分别是总线617上的信号,以及该信号被延迟一个、两个和三个周期得到的信号。这样,选择器638根据总线681送来的根据相关性检测结果编码得到的选择信号进行选择输出,以控制数据访问指令在数据流水线D段是否能够发射(即,在D段中访问寄存器堆以获取该数据访问指令所需的基地址寄存器值)。

类似地,对于比较器618,当读指针115与读指针315的差值等于‘-1’时,表示读指针315比读指针115领先1个轨迹点,即处理器核102已经执行到读指针315指向的数据访问指令之前的那条相邻指令,在该时间点时应对主循迹器120的读指针增加‘2’,从而跳过该指令之后的所述数据访问指令,直接指向该数据点之后的指令。在其他情况下,主循迹器120的读指针增加‘1’,以指向当前指令的下一条指令。

在本实施例,相关性检测模块650对数据点及其之前指令的寄存器相关进行判断。然而,由于在现代流水线技术中需要对位于不同流水线段的指令进行包括寄存器相关在内的相关性判断,因此也可以这些已有的相关性判断逻辑(如:旁路逻辑)进行本发明所需的寄存器相关性判断,以减少硬件开销。此外,由于数据循迹器320的读指针315比主循迹器120读指针115更早地移动到数据点,因此,在准备提前发射该数据点对应的数据访问指令时,其之前的需要检测相关性的指令可能还没有全部进入处理器核102的主流水线,此时,可以使用一个寄存器相关性判断逻辑对那些还没有进入主流水线的指令(即读指针115和读指针315之间的指令)与所述数据访问指令进行寄存器相关性判断,并编码得到选择器638的控制信号。具体实现方法可以参考本说明书实施例,在此不再赘述。

这样,可以根据总线681上的控制信号对选择器638的输入进行选择。例如,当寄存器相关性判断逻辑检测到数据访问指令与之前指令均没有相关性时,选择总线617上的发射信号输出,在时间点‘-3’发射该数据访问指令的D段,使得数据访问指令能够提前三个周期取回数据。又如,当寄存器相关性判断逻辑检测到数据访问指令与之前第一条指令没有相关性、但与之前第二条指令有相关性时,选择寄存器634输出的发射信号。由于寄存器634中的值是对总线617延迟两个周期(即经过寄存器632、634锁存后)得到的,因此相当于在时间点‘-1’发射该数据访问指令的D段,使得数据访问指令能够提前一个周期取回数据。又如,当寄存器相关性判断逻辑检测到数据访问指令与之前第一条指令有相关性时,选择寄存器636输出的发射信号(延迟三个周期),此时该数据访问指令没能提前取回数据。

当比较器618的比较输出为“成功”(‘1’)时,表示读指针115已经到达或超过‘-1’时间点,此时比较器618输出的‘1’经总线619送到计数控制模块620中控制选择器622选择常数‘2’作为输出送往主循迹器120。当比较器618的比较输出为“不成功”(‘0’)时,表示读指针115尚未到达或超过‘-1’时间点,此时比较器618输出的‘0’经总线619送到计数控制模块620中控制选择器622选择常数‘1’作为输出送往主循迹器120。

在主循迹器120中,用一个加法器624代替了图2中的增量器114。加法器624的一个输入来源于寄存器112,另一个输入则来源于计数控制模块620。这样,当比较器618的输出为“比较不成功”时,计数控制模块620将‘1’送往加法器624的该输入端,使得读指针115增一指向原轨迹点之后的第一个轨迹点,相应指令如前例被读出送往处理器核102中的主流水线执行。

当比较器618的输出为“比较成功”时时,计数控制模块620将‘2’送往加法器624的该输入端,使得读指针115增二指向原轨迹点之后的第二个轨迹点,相应指令如前例被读出送往处理器核102中的主流水线执行,从而跳过了该数据点对应的数据访问指令(该数据访问指令由数据流水线执行),提高了主流水线的性能。

需要说明的是,在本实施例中,为了能更清楚的表达各个时间点的含义,用值为负数的时间点进行说明。当然,在具体实现中,可以用寄存器112中的BN1值减去读指针115的BN1值,并分别在比较器616和618中与正常数‘3’和‘1’比较。具体过程在此不再赘述。

为了更好地采用本实施例所述方法用不同流水线执行不同类型的指令,可以将指令分为两大类:由主流水线执行的指令(以下简称为类型‘0’的指令)和由数据流水线执行的指令(以下简称为类型‘1’的指令)。具体地,在本实施例中,数据访问指令就是类型‘1’的指令,而其他指令均为类型‘0’的指令。

可以在扫描器106对正被填充到一级指令缓存104中的指令块进行审查时确定指令是类型‘1’还是类型‘0’,并将所述类型信息存储在轨道表110的相应轨迹点中。这样,当根据读指针115寻址从一级指令缓存104输出指令提供给处理器核102时,可以同时从轨道表110中输出相应的类型信息,并根据该类型信息决定由主流水线(当类型为‘0’时)还是数据流水线(当类型为‘1’时)执行所述指令。

按照上述类型分类,指令间的寄存器相关性可以被进一步细分为类型‘0’之间的寄存器相关性、类型‘1’之间的寄存器相关性、在前的类型‘1’和在后的类型‘0’之间的寄存器相关性,和在前的类型‘0’和在后类型‘1’之间的寄存器相关性。

对于第一种情况,由于类型‘0’指令均为主流水线中处理,因此可以借用主流水线中已有的旁路检测逻辑检测类型‘0’之间的寄存器相关性并做相应处理。类似地,对于第二种情况,可以借用数据流水线中已有的旁路检测逻辑检测类型‘1’之间的寄存器相关性并做相应处理。

对于第三种情况,由于类型‘1’指令被提前送到数据流水线执行,因此当在前的类型‘1’与在后的类型‘0’存在寄存器相关性时,仍然可以借用旁路检测逻辑检测它们之间的寄存器相关性并做相应处理。

对于第四种情况,由于在后的类型‘1’指令被提前到在前的类型‘0’指令之前执行,因此用现有的旁路检测逻辑无法判断是否存在所述相关性。此时采用如图6实施例所述的同步模块212中的相关性检测模块650即可实现对在前的类型‘0’和在后的类型‘1’之间的寄存器相关性的检测,从而控制类型‘1’指令在数据流水线中D段的发射时间点。

当然,对于由读指针115和指令偏移地址同时对一级指令缓存104寻址(即根据处理器核102输出的指令偏移地址在由读指针115中BN1X寻址)读出指令供处理器核102执行的情况下,除了上述主循迹器120的改动外,处理器核102内部的指令地址生成器也应做相应改动,并接收来源于时间点检测模块610的控制信号,使得该指令地址生成器能与主循迹器120同步地增加,保证输出的指令偏移地址正确。

请参考图7,其为本发明所述改进后的指令地址生成器的一个实施例。在图7中,加法器702、选择器706和寄存器708都是根据现有技术实现的指令地址生成器中的模块。其中,寄存器708中存储的就是当前指令地址(PC),该PC被送到加法器702与分支增量701相加得到分支目标指令地址经总线送往选择器706。选择器706的另一个输入来源于加法器704,并根据TAKEN信号113进行选择。当TAKEN信号113为‘1’时,表示分支转移发生,选择器706选择来源于加法器702的指令地址;当TAKEN信号113为‘0’时,表示分支转移没有发生,选择器706选择来源于加法器704的指令地址。选择器706的输出被写入寄存器708。

本实施例中的指令地址生成器与现有指令地址生成器的区别在于,用加法器704则代替了现有指令地址生成器中的增量器(该增量器用于对指令地址PC增加‘1’,即一个指令字的长度,以得到顺序地址的下一指令的地址)。加法器704的一个输入来源于寄存器708,另一个输入为时间点检测模块610送来的增量值(如前述‘1’或‘2’等),这样,根据当前指令(即寄存器708中的PC指向的指令)之后连续数据访问指令的数目,加法器704对当前指令的PC加上相应数目个指令字的长度。若此时TAKEN信号113为‘0’,则下一指令地址就能够跳过所述连续条数据访问指令,从而实现与图6实施例相同的功能。

根据本发明技术方案,可以将图2实施例中的一层缓存结构改进为两层缓存结构,并同时应用Stride技术和EB技术,以达到更好的性能。此时,每个数据点中的有效位还增加了一种情况:当有效位值为‘10’时,表示处于提前(EB)状态,在此状态下采用EB技术提前进行地址计算得到的数据地址是一定正确的。

请参考图8,其为本发明所述两层缓存的缓存系统的一个实施例。本实施例中的指令和数据各有各自的一级缓存,并共享同一个二级缓存。在图8中,扫描器106、一级指令缓存104、轨道表110、一级数据缓存204、主循迹器120、数据循迹器320均与图2实施例中的相同。处理器核102与图2中的处理器核类似,差别在于本实施例将用于计算数据地址的部分从处理器核102中移出放在数据引擎208中,且通过总线203将处理器核102中的寄存器堆或基地址寄存器的输出(即基地址寄存器的值)送往数据引擎208。在图8中新增加的模块有:二级缓存(L2)108、主动表(AL)160、指令读缓冲(IRB)116、数据引擎(Data Engine)208和块号逆映射模块(IXMAP)206。

需要说明的是,在本实施例中,为了清晰起见,用双向总线203对处理器核102、数据引擎208和一级数据缓存204之间的数据进行传递。在实际的硬件实现中,可以用两组单向的总线代替本说明书中的总线203以实现同样的功能。此外,为了更好地显示本发明所述缓存系统的流水线结构,在后面的实施例(如图11、16等实施例)中只显示了总线203的一部分功能(如:将处理核102输出的寄存器值送往数据引擎208)。

一级数据缓存204为全相联(fully associative)缓存,而二级缓存108为组相联(set associative)缓存。二级缓存108用于存储指令和数据,且与一级指令缓存104、一级数据缓存204为包含关系,即一级指令缓存104中的所有指令和一级数据缓存204中的所有数据都已经被存储在二级缓存108中。根据本发明技术方案,可以用第一地址BN2X和第二地址BN2Y来表示指令或数据在二级缓存108中的位置信息。所述BN2X和BN2Y合并构成的BN2就是可以直接对二级缓存108寻址的地址,即可以根据BN2X找到二级缓存108中的存储块,并根据BN2Y从该存储块中找到相应指令或数据。

请参考图9A,其为本发明所述缓存系统中用到的地址格式的示意图。在本实施例中,假设缓存中的存储的指令或数据的地址均为32位,其中最低两位表示指令字或数据字中的字节偏移量(byte offset)。剩余的30位可以被分为两部分:二级标签(TAG)903和二级块内偏移量(BN2Y)905。所述二级标签903对应二级缓存108中二级存储块的块地址,根据二级块内偏移量905即可从该二级存储块中找到相应的指令或数据。在此,与图2实施例中类似,可以建立二级标签903与二级块号(BN2X)907的映射关系。所述BN2X 907与BN2Y 905构成了该指令或数据对应的二级缓存寻址地址BN2。

假设一个二级存储块对应4个块地址连续的一级存储块,显然可以用指令或数据对应的BN2Y 905中的子块号(即最高两位)确定该指令或数据在所述4个一级存储块中哪个存储块中,而BN2Y的剩余部分就等于该指令或数据在其所在一级存储块中的BN1Y 911。为了便于说明,将BN2X 907与所述子块号共同构成的部分成为BN2S 909。

此外,如前所述,对于每个一级存储块(指令块或数据块),都可以有一个相应的BN1X(或DBN1X)913,该BN1X(或DBN1X)913和BN1Y 911一同构成BN1(或DBN1)。因此,任何一个BN2除了可以用BN2X和BN2Y来表示外,还可以用BN2S和BN1Y(或DBN1Y)来表示,这两种表示方式是完全等价的。

回到图8,主动表160由块号映射模块162、选择器168和二级标签存储器164构成。其中,块号映射模块(XMAP)162中的行、二级标签存储器164中的行和二级缓存108中的二级指令块三者均相互对应,且由同一个二级块号BN2X指向。二级标签存储器164的每行中存储了二级缓存108中相应二级存储块(指令块或数据块)的块地址。选择器168对送到主动表160的来自不同来源的BN2S进行选择,其选中的BN2S经总线169送到块号映射模块162和二级标签存储器164选择相应的行。

块号映射模块162的每行包含了,当二级缓存108中相应二级存储块全部或部分存储在一级指令缓存104或一级数据缓存204中时,其对应的一级指令块号BN1X或一级数据块号DBN1X的信息。块号映射模块162的内部结构可以参考图10中所示的块号映射模块162。由于二级缓存108中的每个二级存储块均对应4个一级存储块(即一级指令块或数据块),因此块号映射模块162的每行中包含4个存储一级块号(BN1X或DBN1X)及相应有效位(valid bit)的存储域。其中有效位用于表明存储在该存储域中的一级块号是否有效。除此之外,块号映射模块162的每行中还包含一个存储域用于存储该行对应的二级存储块的顺序指令地址或数据地址的前一个(previous)二级存储块的BN2X及相应有效位,和一个存储域用于存储该行对应的二级存储块的顺序指令地址或数据地址的下一个(next)二级存储块的BN2X及相应有效位。通过块号映射模块162,可以将BN2转换为相应的BN1或DBN1。

在本实施例中,由于数据循迹器320的读指针315领先于主循迹器120的读指针115,因此读指针315可以比读指针115更早指向一个分支点。当读指针315在移动过程中经过分支点时,若从总线317中读出的分支点内容包含的是BN2,则将该BN2送到块号映射模块162,用其中的BN2S中的BN2X在块号映射模块162中读出相应行内容,并用所述BN2S中的子块号对该行的4个存储BN1X的存储域进行选择。若被选中的存储域中的有效位表示该BN1X无效,则根据替换算法(如LRU算法)分配一个BN1X,并将该BN2S对应的指令块从二级缓存108填充到一级指令缓存104中由该BN1X指向的存储块中,同时将该BN1X及表示有效的有效位填充到所述被选中的存储域中。这样,该有效的BN1X及所述BN2中的BN1Y一同构成一个BN1,实现从BN2到BN1的转换。当主循迹器120读指针115指向该分支点时,从总线117读出的就是BN1。此外,该BN1还可以经选择器140选择后旁路送往主循迹器120和数据循迹器320以供立即使用。

对于数据,也可以采用类似方法。即,用BN2S中的BN2X在块号映射模块162中读出相应行内容,并用所述BN2S中的子块号对该行的4个存储DBN1X的存储域进行选择。若选中的存储域中的有效位表示该DBN1X无效,则根据替换算法(如LRU算法)分配一个DBN1X,并将该BN2S对应的数据块从二级缓存108填充到一级指数据缓存204中由该DBN1X指向的存储块中,同时将该DBN1X及表示有效的有效位填充到所述被选中的存储域中。这样,该有效的DBN1X及所述BN2中的DBN1Y一同构成一个DBN1,实现从BN2到DBN1的转换。此外,该DBN1还可以经选择器132选择后旁路送往一级数据缓存204以供立即使用。

回到图8,主动表160可以通过三种方式访问:通过指令或数据地址匹配得到BN2或BN1或DBN1,通过BN2寻址读出相应的块地址,以及通过BN2寻址读出相应的BN1或DBN1。具体地,在第一种方式中,来源于总线119、209或211的指令或数据地址中的块地址经选择器134选择后送到二级标签存储器164中匹配。匹配成功项对应的BN2X与所述指令或数据地址中的子块号部分共同构成BN2S,经总线161、选择器168总线169被送到块号映射模块162进行如前操作。若读出的BN1X(或DBN1X)有效,则该BN1(或DBN1)与所述指令或数据地址中的BN1Y(或DBN1Y)部分共同构成BN1(或DBN1)经总线163输出;否则,所述BN2S与所述BN1Y(或DBN1Y)共同构成BN2经总线163输出,从而实现了从指令或数据地址到BN2或BN1或DBN1的转换。

在第二种方式中,来源于总线163、119、317、207或161的BN2X经选择器168选择后对二级标签存储器164寻址,读出相应行中存储的块地址通过总线171输出。所述块地址与BN2中的BN2Y一同可以构成指令或数据地址,从而实现了从BN2到指令或数据地址的转换。

在第三种方式中,来源于总线163、119、317、207或161的BN2X经选择器168选择后对块号映射模块162中读出相应行内容,并用所述BN2S中的子块号对该行的4个存储BN1X或DBN1X的存储域进行选择,如前将BN2转换为相应的BN1或DBN1。

块号逆映射模块206中的行与一级数据缓存204中的数据块一一对应,并由同一个BN1X指向。块号逆映射模块206的每行存储了该一级数据块对应的BN2S,即该一级数据块所在的二级存储块的块号BN2X,及该一级数据块在所述二级存储块中的位置(子块号)。通过块号逆映射模块206,可以将DBN1转换为相应的BN2。具体地,可以用其DBN1中的DBN1X对块号逆映射模块206寻址读出相应行中的BN2S,与DBN1中的DBN1Y构成BN2,实现从DBN1到BN2的转换。

在本实施例中,扫描器106对从二级缓存108经总线107送来的指令块进行审查,并提取出轨迹点信息填充到轨道表110的相应表项中,从而建立该二级指令块对应的至少一个一级指令块的轨道,同时扫描器106从总线105输出该指令块填充到一级指令缓存104。与图2实施例的不同之处在于,对于从扫描器106发起的填充,最终填充到轨道表110中的轨迹点内容中包含的可以是BN1或BN2,但不存储PC。

在数据引擎208中,可以根据基地址寄存器值、地址偏移量、本次数据地址对应的DBN1、数据步长Stride中的部分信息产生数据地址或下次DBN1,其中数据地址可以通过主动表110转换为下次DBN1。因此,对于从数据引擎208发起的填充,最终填充到轨道表110中的数据点内容包含的一定是DBN1。

请参考图9B,其为本发明所述轨迹点内容的一个示意图。在分支点格式951中,存储域953中包含了轨迹点类型,如:用‘0’表示该轨迹点是分支点。需要注意的是,这里的‘0’表示的是分支点的指令类型,并不是本说明书中所述的类型‘0’。存储域955中包含了分支指令类型,如:直接分支、间接分支、无条件分支或条件分支等。存储域957中包含了该分支点中的BN是BN2还是BN1的信息,如:用‘1’表示该分支点中的是BN2,用‘0’表示该分支点中的是BN1。存储域959中包含了相应的BNX值,根据存储域957值的不同,该值可以是BN1X,也可以是BN2X。存储域961中包含了相应的BNY值,根据存储域957值的不同,该值可以是BN1Y,也可以是BN2Y。

在数据点格式971中,存储域973中包含了轨迹点类型,如:用‘1’表示该轨迹点是数据点。存储域975中包含了之前所述的有效位(V)。存储域977中包含了数据访问指令类型,如:数据读取指令或数据存储指令等。存储域979中包含了该数据点对应的数据地址的DBN1X。存储域981中包含了该数据点对应的数据地址的DBN1Y。存储域983中包含了之前所述的数据步长Stride。

回到图8,在本实施例中,一旦某个一级指令块被替换时,可以将以该行作为分支目标的其他轨道表行中的分支点中的分支目标BN1替换为相应的BN2。具体地,可以在轨道表110的每一行再增加一个表项用于存储该行轨道对应的BN2S,从而能够通过转换得到该轨道上的所有轨迹点本身的BN1对应的BN2,使得在该轨道及其相应指令块被替换时,一旦该轨道上的轨迹点是其他轨道中分支点的分支目标轨迹点,可以将所述其他轨道中分支点中存储的BN1转换为相应的BN2。这样,只要一级指令缓存104和二级缓存108的容量保持一定的比例,就可以避免因一级指令块替换导致的分支目标BN1的指向错误。因此在分支点中不需要存储PC。而一旦某个一级数据块被替换时,只需要将指向该数据块的数据点中的有效位置为‘00’(即IV状态),就表示该数据点中的DBN1无效,从而避免因一级数据块替换导致的数据DBN1的指向错误。

请参考图10,其为本发明所述产生轨迹点内容的一个实施例。为了便于描述,在图10中仅显示了图8的部分模块。首先对数据点进行说明,如图10所示,在数据引擎208中包含两输入加法器368和三输入加法器360。其中,加法器368的功能与图2实施例中的加法器216相同,用于根据DBN和Stride计算Stride DBN1。在采用EB技术时计算数据地址时,加法器360的一个输入为‘0’,从而对总线203上送来的基地址寄存器值与总线125上送来的地址偏移量相加,得到数据地址并经总线211输出;在采用Stride技术计算Stride数据地址时,加法器360的该输入为数据步长Stride,从而对总线203上送来的基地址寄存器值、总线125上送来的地址偏移量,以及数据步长Stride相加,得到Stride数据地址并经总线211输出。在本实施例中,假设数据点已经处于SR状态,加法器368对轨道表110通过总线317送来的数据点中的DBN1和Stride相加,若加法结果没有超出一个一级数据块的边界(即DBN1X不变),则将该结果DBN1(即Stride DBN1)通过总线131经选择器136选择后写回轨道表110中该数据点中作为下一DBN1,并保持该数据点为SR状态。

若加法器368的加法结果超出了一个一级数据块的边界,但没有超出其所在的二级存储块边界,则将总线317上的原DBN1X经选择器132选择后送到块号逆映射模块206转换为BN2X并通过总线207输出,加法器368计算得到的子块号经总线131输出,两者共同构成下次数据地址对应的BN2S并通过总线207、选择器168送到块号映射模块162如前转换为相应的DBN1X,与加法器368计算得到的DBN1Y共同构成下一DBN1通过总线163、选择器136写回轨道表110中该数据点中,并保持该数据点为SR状态。

若加法器368的加法结果超出了一个二级存储块的边界,但没有超出其前一个或下一个二级存储块的边界,则将原DBN1X送到块号逆映射模块206转换为BN2X,经总线207、选择器168送到块号映射模块162寻址,读出存储在该行中相应存储域的前一个或下一个二级存储块BN2X,与加法器368计算得到的子块号共同构成下次数据地址对应的BN2S,再经总线163、选择器168送回块号映射模块162如前转换为DBN1X。该DBN1X与加法器368计算得到的DBN1Y共同构成Stride DBN1通过总线163、选择器136写回该数据点中,并保持该数据点为SR状态。

若加法器368的加法结果超出了原DBN1所在的二级存储块的前一个或下一个二级存储块的边界,则由加法器360对总线203上送来的基地址寄存器值、总线125上送来的地址偏移量,以及数据步长Stride相加,得到下次数据地址,之后再如前例,将该数据地址中的块地址部分经总线211、选择器134送到二级标签存储器164与存储在其中的数据块地址进行匹配,匹配得到的BN2S经总线161、选择器168、总线169送到块号映射模块162读出相应的Stride DBN1,通过总线163、选择器136写回该数据点中,并保持该数据点为SR状态。

具体地,如图10所示,每个二级存储块包含4个一级存储块(子块号分别对应‘00’、‘01’、‘10’和‘11’)。每个一级存储块包含8个数据(DBN1Y分别对应‘0’~‘7’)。在块号映射模块162的每一行对应一个BN2X,其中‘00’~‘11’存储域分别存储了与该BN2X中相应子块号对应的DBN1X,N存储域和P存储域分别存储了该BN2X对应的二级存储块顺序地址的上一个或下一个二级存储块的BN2X。

下面以某一条数据访问指令对应的数据为例进行说明。为了便于描述,用两位十进制数表示DBN1X,并用三位十进制数表示BN2X。例如,该数据访问指令本次数据对应的DBN1的值为‘32|3’,表示DBN1X是‘32’,DBN1Y是‘3’。

块号逆映射模块206的行中则存储了与该行对应的一级数据块在二级缓存中的位置,例如,当块号逆映射模块206中DBN1‘32|3’对应的行存储的‘282|2’时,表示相应的一级数据块(DBN1X为‘32’)对应的二级存储块的BN2X是‘282’,子块号是‘2’。因此DBN1‘32|3’对应的BN2就是‘282|2|3’。

例如,假设当前数据步长为‘4’,将DBN1Y(‘3’)与所述数据步长(‘4’)相加得到新的DBN1Y(‘7’),且没有进位输出,因此该新的DBN1就是‘32|7’,位于原DBN1(‘32|3’)同一个一级数据块中。

又如,假设当前数据步长为‘8’,将DBN1Y(‘3’)与所述数据步长(‘8’)相加得到‘1,3’,其中‘1’为进位输出。因此将将BN2Y(‘2|3’)与所述数据步长(‘8’)相加得到新的BN2Y(‘3|3’),且没有进位输出,因此该新的BN2就是‘282|3|3’,位于原BN2(‘282|2|3’)同一个二级存储块中。此时,如前所述根据子块号‘3’对块号映射模块162中由BN2X(‘282’)指向的行中读出相应的存储域(即‘11’存储域)内容‘27’就是所述新BN2对应的DBN1X。因此所述新BN2对应的DBN1就是‘27|3’。

又如,假设当前数据步长为‘16’,将BN2Y(‘2|3’)与所述数据步长(‘16’)相加得到‘1,0|3’,其中‘1’为进位输出,表示新BN2对应的二级存储块是原BN2对应的二级存储块的顺序地址下一个二级存储块,且相应的新DBN1对应该下一个二级存储块的第‘0’个一级数据块(子块号为‘00’)。此时,如前所述块号映射模块162中由原BN2X(‘282’)指向的行中的N存储域的内容‘280’就是所述新BN2中的BN2X值。这样,所述新BN2就是‘280|0|3’。由于块号映射模块162中BN2X‘280’对应的行中的‘00’存储域的值为‘68’,因此新DBN1就是‘68|3’。

又如,假设当前数据步长为‘64’,若将BN2Y(‘2|3’)与所述数据步长(‘64’)相加得到‘2,2|3’,其中第一个‘2’为进位输出,表示新BN2对应的二级存储块是原BN2对应的二级存储块的顺序地址下一个二级存储块的再下一个二级存储块。此时,如前所述先根据原BN2X‘282’从块号映射模块162中读出相应N存储域的值‘280’(即下一个二级存储块的BN2X),再根据该下一个二级存储块的BN2X‘280’从块号映射模块162中读出相应N存储域的值‘283’(即再下一个二级存储块的BN2X),从而得到新的BN2‘283|2|3’。又由于块号映射模块162中BN2X‘283’对应的行中的‘10’存储域的值为‘09’,因此新DBN1就是‘09|3’。

参考上述例子,即可通过直接将本次DBN1与数据步长相加确定下次DBN1。此外,上述例子以数据步长是正数为例进行说明,对于数据步长是负数的情况,也可用同样方法得到下次DBN1。接下来对分支点进行说明,其过程与数据点类似。不同之处在于,由于正在被扫描器106审查的指令块是从二级缓存108中由BN2S指向的存储块读出,并填充到一级指令缓存104中由BN1X指向的存储块中,因此对于该指令块中的任意一条指令,其本身在指令块中的偏移量BN1Y是已知的,使得该指令本身的BN1和BN2都是已知的,不需要像数据那样通过块号逆映射模块206将DBN1X转换为BN2S。

如图10所示,扫描器106中包含加法器1016和1018。其中加法器1016的功能与加法器368类似,对分支指令本身的BN1与分支增量相加。若加法结果没有超过分支指令所在一级指令块的边界,则扫描器106直接输出该结果作为分支目标BN1,经总线119、选择器136写入该分支指令对应的分支点中。此时,该分支点中的内容是BN1。

若加法器1016的加法结果超过分支指令所在一级指令块的边界,但没有超过其所在的二级存储块边界,则该分支指令本身的BN2X和计算得到的BN2Y(即子块号和BN1Y)共同构成分支目标BN2,经总线119、选择器136写入该分支指令对应的分支点中。此时,该分支点中的内容是BN2。

若加法器1016的加法结果超过分支指令所在二级存储块的边界,但没有超出其前一个或下一个二级存储块的边界,则该分支指令本身的BN2X经总线119、选择器168送到块号映射模块162寻址,读出存储在该行中相应存储域的前一个或下一个二级存储块BN2X,与加法器1016计算得到的BN2Y(即子块号和BN1Y)共同构成分支目标BN2,经总线119、选择器136写入该分支指令对应的分支点中。此时,该分支点中的内容是BN2。

若加法器1016的加法结果超过分支指令所在二级存储块的前一个或下一个二级存储块的边界,可以用之前例子中的同样方法,根据原BN2X寻址从块号映射模块162中读出相应N存储域的BN2X值,再根据该BN2X寻址从块号映射模块162中读出相应N存储域的BN2X值......,如此反复,直到读出该加法结果对应的BN2X,再如前所述与所述分支目标地址中的BN2Y共同构成分支目标BN2后再转换为BN1;或者,如之前所述,直接由加法器1018对总线171送来的当前被审查的指令块的块地址、分支指令本身的块内偏移量(即BN1Y)和分支增量三者相加,得到分支目标指令地址。所述分支目标地址中的块地址经总线119、选择器134送到二级标签存储器164匹配,如前所述方法得到BN2X,并与所述分支目标地址中的BN2Y共同构成分支目标BN2,经总线119、选择器136写入该分支指令对应的分支点中。此时,该分支点中的内容是BN2。

当然,在加法器1016的加法结果超过分支指令所在一级指令块的边界的情况下,可以如前所述,直接将按上述方法得到的分支目标BN2存储在该分支指令对应的分支点中,使得分支点中的内容为BN2;也可以如前所述,进一步根据所述BN2中的BN2S在块号映射模块162中找到相应的存储域,并在该存储域有效的情况下将BN2转换为相应的BN1存储到该分支指令对应的分支点中,使得分支点中的内容为BN1。

回到图8,在本实施例中,指令读缓冲116至少包含当前处理器正在执行的指令所在的指令块(简称当前指令块)。指令读缓冲116有一个写端口,可以将一级指令缓存104中由选择器130选择读指针115或315指向的行写入指令读缓冲116中。

指令读缓冲116还有两个读端口,可以根据读指针115寻址通过总线101输出相应指令送往处理器核102,同时根据读指针315寻址输出相应指令经总线125送往处理器核102和数据引擎208。即,指令读缓冲116是多端口缓冲。虽然也可以通过增加一级指令缓存104的读端口个数来实现同样的功能,但采用指令读缓冲116能在更短的时间内读出指令,且硬件代价更小。

指令读缓冲116的第一个读端口由读指针115上的BN1寻址输出相应指令经总线101送到处理器核102执行。第二个读端口由读指针315上的BN1寻址。当读指针315指向数据点时,所述第二个读端口输出的就是数据访问指令中的基地址寄存器号和地址偏移量。所述基地址寄存器号被送到处理器核102以读出相应的基地址寄存器值,输出的地址偏移量则被送到数据引擎208用于数据地址计算。

当然,指令读缓冲116中还可以包含更多的指令块。例如,当指令读缓冲116中包含两个指令块时,除了当前指令块以外,还可以包含顺序地址的下一指令块。这样,当读指针315领先于读指针115时,即使读指针315已经指向读指针115指向的当前指令块的顺序地址下一指令块时,依然可以在指令读缓冲116向处理器核102提供正确指令的同时,读出正确的数据点对应的基地址寄存器号和地址偏移量。

数据引擎208的主要功能是采用Stride技术计算Stride DBN1,以及采用EB技术计算数据地址(该数据地址可以如前被送到主动表160转换为相应的EBDBN1)。关于数据引擎208的详细运行过程将在图11实施例中说明。

在图8中,主要的总线有:总线107、105、103、101、203、119、115、315、117、317、205、125。

其中,二级缓存108中的指令经总线107送到扫描器106后再经总线105送到一级指令缓存104,再经总线103送到指令读缓冲116,以及再经总线101送到处理器核102。

二级缓存108中的数据可以经总线107填充到一级数据缓存204中,而一级数据缓存204中的数据也可以经总线107被写回二级缓存108。类似地,一级数据缓存204中的数据可以经总线203被送到处理器核102写入寄存器堆(即处理器核102执行数据读取指令时读入数据),而处理器核102的寄存器堆中的数据也可以经总线203被写回一级数据缓存204(即处理器核102执行数据存储指令时存储数据)。因此,总线107和203都是双向总线(bi-direction bus)。

总线119是扫描器106的输出总线,其格式为BN1、BN2或指令地址。当支持以立即数为数据地址或以指令地址和立即数之和为数据地址的数据访问指令时,总线119上的格式还可以是数据地址。

总线115即主循迹器120的读指针,用于控制一级指令缓存104、轨道表110的第一个读端口和指令读缓冲116的第一个读端口的输出。具体地,总线115上的BN1X对轨道表110中的轨道和一级指令缓存104的行寻址,总线115上的BN1对轨道表110中的轨迹点和指令读缓冲116中的指令寻址。

总线315即数据循迹器320的读指针,用于控制一级指令缓存104、轨道表110的第二个读端口和指令读缓冲116的第二个读端口的输出。具体地,总线315上的DBN1X对轨道表110中的轨道和一级指令缓存104的行寻址,总线315上的DBN1对轨道表110中的轨迹点和指令读缓冲116中的指令寻址。

总线117是轨道表110的第一个读端口的输出,用于将轨道表110中读出的BN1送往主循迹器120和数据循迹器320。

总线317是轨道表110的第二个读端口的输出,用于将轨道表110中读出的DBN1送往一级数据缓存204、块号逆映射模块206和数据引擎208,并将轨道表110中读出的Stride送往数据引擎208,以及将轨道表110中读出的BN2送往主动表160。

总线205是同步模块212的输出,将同步信号送往数据引擎208以使数据引擎208中的操作(即访存流水线)与处理器核102中的操作(即主流水线)同步。

指令读缓冲116的第一个读端口如前所述通过总线101将指令送往处理器核102,第二个读端口的输出通过总线125将基地址寄存器值送往处理器核102以从寄存器堆中读出相应寄存器值,并将该值经总线203送往数据引擎208。

选择器130对总线115上主循迹器120读指针中的BN1X和总线315上数据循迹器320读指针中的BN1X进行选择,并输出其中一个对一级指令缓存104寻址,以读出相应指令块经总线103填充到指令读缓冲116中。

选择器140对总线163上经主动表160转换得到的BN1和总线317上从轨道表110中读出的BN1进行选择,并输出其中一个送往数据循迹器320。这样,当需要立即使用所述BN1更新数据循迹器320读指针315时,可以在该BN1被存储到轨道表110中的同时由选择器140旁路选择总线163上的BN1送往数据循迹器320,而不必等待该BN1被存储到轨道表110中后再从总线317读出。

选择器132对总线163上经主动表160转换得到的DBN1和总线317上从轨道表110中读出的DBN1进行选择,并输出其中一个对一级数据缓存204寻址,以读出相应数据经总线203送往处理器核。这样,当需要立即使用所述DBN1对一级数据缓存204寻址时,可以在该BN1被存储到轨道表110中的同时由选择器132旁路选择总线163上的BN1送往一级数据缓存204,而不必等待该DBN1被存储到轨道表110中后再从总线317读出。

选择器134对总线211上从数据引擎208输出的数据地址、总线119上从扫描器106输出的指令地址或数据地址,以及总线209上从处理器核102输出的指令地址进行选择,并输出其中一个送往主动表160中的二级标签存储器164进行匹配,并如前进行后续操作。

选择器136对总线119上从扫描器106输出的BN1或BN2、总线131上从数据引擎208输出的DBN1,以及总线163上从主动表160中的块号映射模块162输出的BN1、BN2或DBN1进行选择,并输出其中一个写入轨道表110的相应轨迹点中。

选择器138对总线117上从轨道表110第一个读端口输出的BN1和总线317上从轨道表第二个读端口输出的BN1进行选择,并输出其中一个送往数据循迹器320。这样,当分支指令的分支转移发生时,选择器138选择总线117上的BN1(即分支目标BN1)更新读指针315的值,使得数据循迹器320的读指针315与主循迹器120的读指针115均能指向分支目标轨迹点。当数据循迹器320读指针315领先主循迹器120读指针115提前到达结束轨迹点时,选择器138选择总线317上的BN1(即下一指令块第一条指令的BN1)更新读指针315的值,使得读指针315能提前指向下一指令块对应的轨道,并移动到该轨道上的第一个数据点。

选择器168共有5个输入,分别为总线163上从块号映射模块162输出的BN2S、总线317上从轨道表110第一个读端口输出的BN2S、总线119上从扫描器106输出的BN2S、总线207上从块号逆映射模块206输出的BN2S,以及总线161上从二级标签存储器164匹配输出的BN2S。选择器168对这5个输入进行选择,并输出其中一个BN2S经总线169对块号映射模块162寻址以读出相应行存储域的内容(前一BN2或后一BN2或BN1或DBN1)、对二级标签存储器164寻址以读出相应行中存储的二级存储块地址,以及对二级缓存108寻址以读出相应的二级存储块内容。

图8所述缓存系统的运行过程与图2实施例类似。不同之处在于,在本实施例中,由指令读缓冲116向处理器核102提供指令,而非图2中由一级指令缓存104直接提供。数据引擎208不再仅仅包含图2中的加法器206和208的功能,而是包含了数据流水线(Load/store pipeline),可以完成对数据访问指令的所有处理。主动表160则可以对所有地址(如指令、数据的一级缓存地址和二级缓存地址)进行匹配映射,通过一次转换即可得到一级缓存是否命中及二级缓存是否命中的信息,并得到相应的BN1、DBN1或BN2。因此在本实施例中,不再需要图2中一级指令标签存储器144和一级数据标签存储器244。由于本实施例所述缓存系统包含两层缓存,因此与图2相比,图8中还增加了块号逆映射模块206,用于将DBN1转换为BN2。此外,在图2中只采用了Stride技术,而图8中同时采用了Stride技术和EB技术,因此增加了同步模块212用于在利用EB技术计算EB DBN1时对数据引擎208中的访存流水线和处理器核102中的主流水线进行同步。

下面对图8所述缓存系统的运行过程作进一步具体说明。为了便于描述,以下由主循迹器120读指针115对指令读缓冲116寻址读出指令供处理器核102执行。具体地,根据读指针115中BN1Y从指令读缓冲116中由读指针115中BN1X指向的当前指令块中读出相应的指令。对于由处理器核102产生的指令地址偏移量代替读指针115中BN1Y对指令读缓冲116中当前指令块中指令寻址的情况,也可以参考同样的方法运行,在此不再赘述。

在本实施例中,由于与数据访问指令相关的操作均在数据引擎208中进行,因此主循迹器120读指针115跳过所有数据访问指令,使得数据访问指令不被送到处理器核102执行。

如前所述,扫描器106对从二级缓存108填充到一级指令缓存104的指令进行审查。若扫描器106发现该指令是直接分支指令,则计算分支目标地址。若所述分支目标与分支源(即该直接分支指令)位于同一个一级指令块中,则如前产生相应BN1;若所述分支目标与分支源位于同一个二级存储块的不同一级指令块中,则如前产生相应BN2;若所述分支目标位于分支源所在二级存储块的相邻存储块(即前一个或后一个存储块)中,则如前根据分支源的BN2从块号映射模块162转换得到该分支目标的BN2或BN1;对于其他情况,则如前将计算得到的分支目标指令地址送到二级标签存储器164中匹配转换为相应的BN2,并经总线161、选择器168送到块号映射模块162读出相应存储域,并在该存储域有效时将所述BN2转换为相应的BN1。所述BN1或BN2与该直接分支指令的指令类型一起经选择器136选择后写入轨道表110中该分支源对应的分支点中。

若扫描器106发现该指令是间接分支指令,则相应的指令类型写入轨道表110中该分支源对应的分支点中。之后,当主循迹器120读指针115指向该轨迹点时发现为间接分支,则由处理器核102计算产生分支目标地址,经总线209送到二级标签存储器164中匹配转换为相应的BN2或BN1后,经选择器136选择后写入轨道表110中该分支源对应的分支点中。

若扫描器106发现该指令是数据访问指令,则如图2实施例所述产生相应的有效位、DBN1,与指令类型一起经选择器136选择后写入轨道表110中该数据访问指令对应的数据点中。

假设当前指令读缓冲116中由主循迹器120的读指针115指向的是一条加法(ADD)指令,该加法指令被读出并经总线101送往处理器核102供执行。读指针115如前自增,指向指令读缓冲116当前指令块中的下一条指令及轨道表中的相应轨迹点。

此时,假设轨道表110输出到总线117上的指令类型显示该指令为直接分支分支指令。如前所述,总线117上读出的是BN1。主循迹器120暂存该分支目标BN1,且分支指令如前所述被从指令读缓冲116中读出供处理器核102执行,且读指针115继续自增,移动并指向下一条指令及相应轨迹点。

再假设此时读指针115指向的是一条按位或(OR)指令,则该指令如前被从指令读缓冲116中读出供处理器核102执行,且读指针115继续自增,移动并指向下一条指令及相应轨迹点。

再假设此时读指针115指向的是一条减法(SUB)指令。然而,此时处理器核102产生了之前分支指令的分支转移成功发生的信息,因此之前暂存的分支目标BN1被写入主循迹器120和数据循迹器320中的相应寄存器中,从而同时将读指针115和315的值更新为分支目标BN1。之后,选择器130则选择读指针115中的BN1X对一级指令缓存104寻址读出相应指令块(即分支目标指令所在指令块),并根据一定的替换算法(如LRU算法)填充到指令读缓冲116中。与此同时,根据读指针115中的BN1Y在所述被填充到指令读缓冲116中的指令块(即新的当前指令块)中读出相应指令(即所述分支目标指令)经总线115送往处理器核102供执行。之后,主循迹器120如前所述重新开始步进并依次提供该分支目标指令之后的后续指令供处理器核102执行。

如果上述加法指令之后的分支指令是间接分支指令,则当读指针115指向该分支点读出指令类型为间接分支时,等待处理器核102计算产生分支目标地址后,将该分支目标地址中的块地址通过总线209、选择器134送到主动表160中的二级标签存储器164中匹配,如前得到BN2X再到块号映射模块162读出相应存储域内容,再通过选择器140旁路送往数据循迹器320。之后过程如前例所述。

当分支转移完成后,数据循迹器320读指针315从该分支目标指令开始移动,并到达主循迹器120读指针115指向的轨迹点之后的第一个数据点。例如,可以为数据循迹器320提供更高频率的时钟信号,使得读指针315比读指针115的移动速度更快。

当读指针315指向数据点时,通过总线317读出该数据点中的内容,并对其中的有效位解码以确定当前该数据点的状态。若该数据点处于SR状态(有效位为‘11’),则在合适的时间点将总线317上的DBN1送到一级数据缓存204寻址读出相应数据经总线203送往处理器核102供使用。

若该数据点处于其他状态(有效位不为‘11’),则在合适的时间点根据读指针315中DBN1Y从指令读缓冲116中读出相应的数据访问指令经总线125送出。该数据访问指令中的基地址寄存器号被送到处理器核102中的寄存器堆以读出相应的基地址寄存器值,并经总线203送往数据引擎208。该数据访问指令中的地址偏移量则被直接通过总线125送到数据引擎208。在数据引擎208中,所述基地址寄存器值和地址偏移量被相加得到数据地址。该数据地址中的块地址经总线211、选择器134被送往二级标签存储器164进行地址匹配。

若匹配不成功,则如前所述将更低层次存储器中的相应数据块填充到二级缓存108中,并更新二级标签存储器164和块号映射模块162中的相应内容。若匹配成功,则匹配成功项对应的BN2X经总线161、选择器168、总线169指向块号映射模块162中的一行。当然,在具体实现中,也可以将二级标签存储器164和块号映射模块162设计成行行直接对应,这样只要在二级标签存储器164中有匹配,直接就能找到块号映射模块162中的对应行。

之后,块号映射模块162如前所述输出相应的DBN1经总线163、选择器136被填充到轨道表110的该数据点中并更新其有效位为SR状态。同时,该DBN1被旁路到一级数据缓存204寻址以读出相应数据,并经总线203送往处理器核102供使用。

与此同时,在数据引擎208中如前所述对该DBN1和Stride相加。若加法结果没有超出原DBN1的边界,则直接将该加法结果作为下一DBN1经总线131、选择器136写回轨道表110的该数据点中。

若加法结果超出了原DBN1的边界,则该加法结果经总线131送到块号逆映射模块206转换为对应的BN2S。该BN2S经总线207、选择器168、总线169被送到块号映射模块162寻址读出一行内容。

在这种情况下,若所述加法结果没有超出该BN2的边界,则如前所述读出块号映射模块162中该行内容中的存储DBN1X的相应存储域。若相应存储域中的DBN1X有效,则输出该DBN1X如前构成DBN1后经总线163、选择器136写回轨道表110的该数据点中。若相应存储域中的DBN1X无效,则如前所述分配一个DBN1X,并将相应数据块从二级缓存108填充到一级数据缓存204中由该DBN1X指向的存储块中,并输出该DBN1X如前构成DBN1后经总线163、选择器136写回轨道表110的该数据点中。

若所述加法结果位于该BN2的相邻存储块中,则如前所述读出该行内容中存储前一或后一存储块BN2X的相应存储域。若该存储域中的BN2X有效,则输出该BN2X经总线163、选择器168、总线169在块号映射模块162中找到相应行,之后的操作如前所述。若该存储域中的BN2X无效,则如前所述分配一个BN2X,并将相应数据块从更低层次存储器填充到二级缓存108中由该BN2X指向的存储块中,之后的操作如前所述。

当数据循迹器320读指针315指向结束轨迹点时,该结束轨迹点的内容(即下一指令块第一条指令对应的BN1)被读出并经总线317、选择器138送到数据循迹器320以更新读指针315的值为所述下一指令块第一条指令的BN1。此时,读指针315上的BN1X经选择器130选择后对一级指令缓存104寻址,读出相应指令块填充到指令读缓冲116中。这样,数据循迹器320读指针就可以继续在所述下一指令块对应的轨道上移动,通过总线317读出相应轨迹点内容,并从指令读缓冲116中读出相应指令并经总线125输出。之后的操作如前所述。

请参考图11,其为本发明所述处理器系统流水线结构的一个示意图,即图8实施例所述处理器系统的相应流水线结构图。在所述流水线结构中,主流水线分为4段:取指(I)段、译码(D)段、执行(E)段和写回(W)段;数据流水线分为6段:取指(I)段、译码(D)段、地址产生(G)段、地址转换(T)段、访存(M)段和写回(W)段。

结合图8实施例,主流水线主要用到轨道表110(第一读端口)、主循迹器120、指令读缓冲116和处理器核102。数据流水线主要用到轨道表110(第二读端口)、数据循迹器320、指令读缓冲116、数据引擎208、块号映射模块162、二级标签存储器164和一级数据缓存204。

具体地,在主流水线的I段中,根据主循迹器120读指针115从指令读缓冲116中读出相应指令。在D段中,处理器核102从总线101上接收到所述指令,由处理器核102中的译码器译码后,控制寄存器堆182读出单数个或复数个操作数经总线185输出。在E段中,旁路选择器186对数据流水线中读取到的数据、寄存器堆182中读出的操作数,以及总线191上旁路送来的执行结果进行选择,并输出给执行单元188进行运算。在W段中,所述运算结果经总线191被写回寄存器堆182,同时被旁路到E段的旁路选择器186,还被送到数据流水线G段中的旁路选择器192。

根据本发明技术方案,数据流水线按功能可以被细分为两路:采用EB技术的EB流水线,和采用Stride技术的Stride流水线。其中,EB流水线用到了数据流水线的全部6个流水线段。以数据流水线中没有气泡为例,在I段中,当数据循迹器320读指针315指向的是数据点时,由读指针315寻址从指令读缓冲116中读出相应数据访问指令并经总线125输出。由于在本例中数据流水线没有气泡,因此在D段中,该数据访问指令中的基地址寄存器号经总线125被送到处理器核102的寄存器堆182中读出相应的寄存器值(即基地址寄存器值),并通过总线183输出;地址偏移量则直接被暂存作为G段中加法器360的一个输入。在G段中,旁路选择器192对数据流水线D段时从寄存器堆182读出的基地址寄存器值和主流水线E段时执行单元188输出的运行结果进行选择,其结果经总线203被送到加法器360作为另一个输入。加法器360的第三个输入为‘0’或来源于总线367上由选择器366选择得到的数据步长Stride。当所述第三个输入为‘0’时,加法器360的输出是本次数据地址;当该输入为‘1’,加法器360的输出是下次数据地址。在T段中,加法器360计算得到的数据地址经总线211被送到主动表160中如前所述转换为DBN1,并保证相应数据已经被填充在一级数据缓存204中。此外,可以根据之前存储在该数据点中的DBN1经块号逆映射模块206转换为BN2后从二级标签存储器164中读出相应块地址以重新构成上次数据对应的数据地址,并由减法器364对总线211上的本次数据地址减去所述上次数据地址,以得到最新的数据步长Stride。在M段中,所述转换得到的DBN1被送到一级数据缓存204中以读出相应数据。在W段中,所述数据经总线203被写回寄存器堆182,并被送到旁路选择器186以备主流水线E段的执行单元188运算时使用。

从图11中可以看出,数据访问指令被提前三周发射,数据流水线中的T段(第4段)与主流水线中的I段(第1段)同时发生。这样,如果在前的数据访问指令与在后的非数据访问指令之间不存在寄存器相关性,则数据流水线M段(第5段)获取到的数据刚好可以通过选择器186被旁路到主流水线中E段(第3段)的执行单元188中,消除了常规流水线中数据访问指令获取数据的延迟槽。

为了便于描述,在Stride流水线中省略了段间寄存器。当数据循迹器320读指针315指向一个数据点时,一旦同步模块212检测到主循迹器120读指针115已经到达该数据点的前一个轨迹点时(即时间点为‘-1’),该数据点的内容被读出并经总线317、选择器132、总线319对一级数据缓存204寻址,提前读出相应数据经总线203送往处理器核102中的寄存器堆182和旁路选择器186。

如前所述,在Stride流水线中,加法器368对总线319上的DBN1和总线367上的Stride相加,得到Stride DBN1并通过总线131输出。在此,总线367上的Stride有三个来源:来自轨道表110中轨迹点内容经总线317输出的Stride、来自步长表362的Stride,以及来自减法器364的减法结果。其中,如图3A中所述,步长表362可以由轨道表110数据点中存储的步长指针SP及相应的分支判别字BDW共同寻址,读出相应表项中存储的Stride。减法器364的功能和作用将在后面作具体说明。

根据本发明技术方案,可以如前例根据总线131上加法器368的加法结果是否超出特定边界来进行不同的后续操作。具体地,若加法器368执行的加法操作结果显示Stride DBN1没有超出原DBN1(即总线319上的DBN1)所在一级数据存储块边界时,选择器136选择总线131上的Stride DBN1作为输出写回轨道表110的该数据点中。需要注意的是,只有在发现之前保存的Stride是错误的情况下,才需要将本次计算得到的新Stride(由减法器364产生)一起写回该数据点中,或写回步长表362中由该数据点中步长指针SP指向的表项中,否则可以保持该数据点中的Stride不变。

若加法器368执行的加法操作结果显示Stride DBN1位于原DBN1所在一级数据存储块以外,但没有超出其所在二级存储块边界时,如前所述将总线319上的原DBN1X送到块号逆映射模块206转换为相应的BN2X,并与总线131上的Stride DBN1中的子块号和BN1Y一起经总线207、选择器168送到块号映射模块162选出相应的DBN1并经总线163、选择器136写回该数据点。

若加法器368执行的加法操作结果显示Stride DBN1超出了原DBN1所在二级存储块边界时,则使用加法器360计算得到的数据地址,如前例转换为DBN1后写回该数据点。

这样,每当从轨道表110的数据点中读出一个DBN1时,都可以根据该DBN1在一级数据缓存204中寻址读出相应的数据供处理器核102执行该数据点对应的数据访问指令时使用。同时,通过对所述DBN1和Stride相加计算得到下次数据对应的Stride DBN1。此时若该Stride DBN1对应的尚未存储在一级数据缓存204中,则如前所述将相应数据块从更低层次存储器填充到一级数据缓存204中。此外,该Stride DBN1被写回所述数据点中供下次读取数据使用。

如图6、图8实施例所述,在图11流水线中,由同步模块212控制数据访问指令在EB流水线中的发射时间点。仍然以最早提前3个周期发射为例,同步模块只需要对该数据访问指令与其之前的三条指令之间的寄存器相关性进行如前检测,并根据结果产生相应数量的气泡以延后数据访问指令的发射。

请参考图12,其为本发明所述处理器系统流水线的另一个示意图。图12中显示的是数据访问指令提前三个周期发射(即同步模块212没有产生气泡)的情况。其中,指令I1、I2、I3、I4、I6、I7和I8是算术逻辑运算指令,由主流水线执行,各经过4个流水线段;指令I5是数据读取(LOAD)指令,由数据流水线中的EB流水线执行,经过6个流水线段。

在本实施例中,由于指令I1的E段在指令I5的G段之前完成,因此指令I1的执行结果可以被旁路到指令I5的G段使用。即,无论指令I5是否与指令I1有本发明所述的寄存器相关,都不会影响指令I5发射的时间点。此外,若指令I5与指令I2、I3和I4均没有本发明所述的寄存器相关,则指令I5可以提前三个周期发射。图12中显示了就是这两种情况下的流水线状态,即指令I5的I段与指令I2的I段同时发射。

若指令I5与指令I2、I3和I4之间存在本发明所述的寄存器相关,则同步模块212产生相应数目的气泡。具体地,若指令I5与指令I2存在所述相关,则指令I5的G段必须等到指令I2的E段完成后才能进行,此时同步模块212产生一个气泡,使得指令I5在图12所示基础上延后一个周期发射,即提前两个周期发射I5。若指令I5与指令I2不存在所述相关,但与指令I3存在所述相关,则指令I5的G段必须等到指令I3的E段完成后才能进行,此时同步模块212产生两个气泡,使得指令I5在图12所示基础上延后两个周期发射,即提前一个周期发射I5。若指令I5与指令I2、I3均不存在所述相关,但与指令I4存在所述相关,则指令I5的G段必须等到指令I4的E段完成后才能进行,此时同步模块212产生三个气泡,使得指令I5在图12所示基础上延后三个周期发射,即没有提前发射I5。

综上所述,本实施例中在同步模块212的控制下,数据访问指令可以提前0~3个周期发射。

需要注意的是,EB流水线中的气泡不一定会导致主流水线产生气泡。根据本发明技术方案,主流水线中是否会有气泡取决于LOAD指令之后第一条用到该LOAD指令读取到的数据的指令与所述LOAD指令之前最后一条与该LOAD指令存在所述寄存器相关性的指令之间的距离。只要这两条指令之间存在足够大的距离,无论该LOAD指令本身所处什么位置(即指令地址),均可以避免主流水线中产生气泡。以下将所述能保证主流水线中不产生气泡的距离称为关键距离(critical distance)。在本实施例中,所述关键距离为‘5’,即只要这两条指令之间间隔大于等于5条指令,主流水线均不会产生气泡。当所述距离小于‘5’时,主流水线中会插入相应数目的气泡。具体地,当距离为‘4’时,需要一个气泡;当距离为‘3’时,需要两个气泡;当距离为‘2’时,需要三个气泡(这两条指令之间的距离至少为‘2’)。显然,可以利用主流水线中现有的相关性检测逻辑或旁路逻辑对所述指令间距离进行判断。

以图12所示流水线为例,假设指令I5之后第一条用到其读取到的数据的是指令I6,指令I5之前最后一条与其存在所述寄存器相关性的是指令I1,两者距离为‘5’。此时指令I5如前所述可以提前三个周期发射,其M段与指令I6的D段同时发生,因此读取到的数据可以旁路给指令I6的E段使用,避免了指令I6流水线中的气泡。

又如,假设指令I5之后第一条用到其读取到的数据的是指令I8,指令I5之前最后一条与其存在所述寄存器相关性的是指令I3,两者距离也为‘5’。此时指令I5如前所述可以提前一个周期发射,其流水线在图12所示基础上延后了两个周期,M段与指令I8的D段同时发生,因此读取到的数据仍然可以旁路给指令I8的E段使用,避免了指令I8流水线中的气泡。

又如,假设指令I5之后第一条用到其读取到的数据的是指令I6,指令I5之前最后一条与其存在所述寄存器相关性的是指令I2,两者距离为‘4’。此时指令I5如前所述可以提前两个周期发射,其流水线在图12所示基础上延后了一个周期,导致M段与指令I6的E段同时发生,无法旁路,因此在指令I6流水线中需要插入一个气泡。

在本发明中,由于采用EB技术产生的EB数据地址及EB DBN1一定是正确的,因此当主流水线中没有产生上述气泡时,就说明此时采用EB技术可以在掩盖该数据访问指令执行过程,使得其后续指令提前执行,提高流水线性能。而一旦有上述气泡产生,则说明此时采用EB技术还不足以完全掩盖该数据访问指令执行过程。在这种情况下,可以采用Stride技术,提前使用存储在数据点中的Stride DBN1读取数据。

此外,对于某些数据点,可能有时能用EB技术掩盖,但有时不能。例如,对于处于循环代码中的数据点,在第一次进入该循环时,最后一条与其存在所述寄存器相关性的指令可能位于循环外较远处,所述指令距离(即该指令与数据点之后第一条用到其读取到的数据的指令之间的距离)大于等于所述关键距离,因此可以使用EB技术掩盖该数据点的数据访问过程。然而一旦循环转移发生,且此时最后一条与其存在所述寄存器相关性的指令也在所述循环中时,所述指令距离就有可能小于所述关键距离,之后可以使用Stride技术以尽量避免主流水线中的等待。在此,可以将主流水线中的所述气泡作为从使用EB技术向使用Stride技术转换的触发条件。例如,对于每个数据点,在第一次访问时都使用EB技术,一旦导致主流水线产生气泡,就转换为使用Stride技术,否则持续保持使用EB技术。

下面结合图8和图11,再用一个完整的例子进行具体说明。当扫描器106审查发现正在被填充的指令是数据访问指令时,在轨道表110中生成相应的数据点。具体地,当扫描器106审查发现数据访问指令采用直接寻址方式(如数据地址等于指令地址加立即数)时,由扫描器106计算数据地址。该数据地址通过总线119被送到主动表160。若二级标签存储器164是全相联的,则将所述数据地址中的块地址与二级标签存储器164的所有路(set)中存储的块地址进行匹配;若二级标签存储器164是组相联的,则将所述数据地址中的块地址与二级标签存储器164的相应组的所有路(set)中存储的块地址进行匹配。

若块地址匹配不成功,表示该数据尚未存储在二级缓存108中。此时,根据替换算法(如LRU算法)分配一个BN2X,通过总线将该数据地址送往更低层次存储器读取相应数据块填充到二级缓存108中由该BN2X指向的二级存储块中;同时,根据替换算法分配一个DBN1X,并将该二级存储块中的相应部分旁路填充到一级数据缓存204中由该DBN1X指向的一级数据块中。所述DBN1与指令类型、有效位‘11’、步长值‘0’一同作为轨迹点内容经总线163、选择器136被写入轨道表110的该数据点中,之后根据该DBN1可以向处理器核102提供相应数据。所述DBN1X还被写入主动表160的块号映射模块162中由所述BN2指向的行的相应DBN1X存储域中

若块地址匹配成功,但块号映射模块162中匹配成功项对应的行的相应存储域中没有有效的DBN1X,表示该数据已经存储在二级缓存108中,但尚未存储在一级数据缓存204中。此时,如前所述进行分配DBN1X、填充数据块、写轨道表及写DBN1X存储域等操作,在此不再赘述。

若块地址匹配成功,且块号映射模块162中匹配成功项对应的行的相应存储域中存在有效的DBN1X,表示该数据已经存储在一级数据缓存204中。此时,如前进行写轨道表操作,在此不再赘述。

此后,每当该数据点内容被读出时,均可以使用存储在其中的DBN1对一级数据缓存204寻址,直接读出相应数据供处理器核102使用。

另一方面,当扫描器106审查发现数据访问指令不采用直接寻址方式时,直接将该数据点的有效位设为‘00’,其他域也均设为‘0’,完成数据点的建立。之后在运行过程中由数据引擎208对该数据点进行具体操作。

在此,数据引擎208的功能类似一个时分复用的有限状态机,而数据点中的有效位则包含了相应的状态,这样,当数据循迹器320读指针315指向一个数据点时,数据引擎208就成为针对该数据点的有限状态机。当该数据点被处理完毕后,其状态被保存在所述有效位中,供下次使用。这样,在不同的时刻,数据引擎208配合不同数据点中的有效位值,起到有限状态机的功能。该有限状态机的具体运行过程将结合图13A实施例进行说明。图13A是本发明所述有限状态机的一种状态转移图。

下面主要以数据读取(LOAD)指令为例进行说明,之后会对数据存储(STORE)指令再作说明。此外,为了便于描述,下面假设LOAD指令所需的数据均已经存储在一级数据缓存204中。对于尚未存储在一级数据缓存204中的数据,均可以如前所述分配DBN1X并将相应数据块填充到一级数据缓存204中,相应过程在此不再赘述。

当数据循迹器320读指针315指向一个数据点时,读出的数据点内容中包含的有效位值可以是四种情况:‘00’、‘01’、‘10’或‘11’,分别对应图13A中的IV状态1302、LE状态1304、EB状态1306和SR状态1308。

对于第一种情况(有效位值是‘00’),表示该数据点当前处于IV状态1302。此时,数据引擎208采用EB技术如前所述利用EB流水线计算EB数据地址,并送到主动表160如前转换生成EB DBN1,经总线163、选择器132送到一级数据缓存204寻址,读出数据供处理器核102使用。此外,该EB DBN1及新的有效为值‘01’被写回所述数据点,使得数据点进入LE状态1304,如图13A中所示从IV状态1302向LE状态1304的转移。

对于第二种情况(有效位值是‘01’),表示该数据点当前处于LE状态1304。此时,数据引擎208除了仍采用EB技术如前所述利用EB流水线计算EB数据地址、转换生成EB DBN1、提前读出数据以外,还从该数据点中读出之前存储在其中的DBN1。这样,可以通过计算前后两次DBN1或前后两次数据地址之间的差值得到Stride。图11实施例中的减法器364就是用于对前后两次数据地址相减以计算Stride。具体地,从轨道表110数据点中读出的DBN1经总线317被送到块号逆映射模块206寻址读出相应的BN2S。该BN2S经总线207、选择器168送到二级标签存储器164寻址,读出相应的块地址与之前转换得到的BN2Y合并构成数据地址,通过总线171送往数据引擎208中的减法器364。减法器364对总线211上的EB数据地址与总线171上所述合并得到的数据地址相减,其结果就是数据步长Stride。根据本发明技术方案,可以每次都将新计算得到的Stride写回数据点中,也可以仅在新Stride与之前存储在数据点中的Stride不同时,才将该新Stride写回数据点中。

或者,可以将总线211上的EB数据地址送到本发明所述的二级标签存储器164及块号映射模块162如前所述匹配转换为EB DBN1后,用该EB DBN1减去总线317上的DBN1。当这两个DBN1位于同一个一级数据块时,该减法的结果就是数据步长Stride。

在上述过程中,若该数据点在EB流水线中的执行没有导致其后续指令在主流水线中产生气泡,则说明采用EB技术已经可以完全掩盖该数据点的数据访问过程,因此将该数据点中的有效位置为‘10’(即进入EB状态1306),如图13A中所示从LE状态1304向EB状态1306的转移。否则,说明采用EB技术尚不能完全掩盖该数据点的数据访问过程,因此将该数据点中的有效位置为‘11’(即进入SR状态1308),如图13A中所示从LE状态1304向状态SR1308的转移。进入SR状态1308后,计算Stride数据地址并转换为Stride DBN1写回该数据点中,尽量提前将数据准备好。具体地,可以由选择器366对减法器364产生的数据步长stride、从步长表362中输出的数据步长stride和总线317上轨道表110输出的数据步长stride进行选择,选出正确的数据步长stride后送到加法器368与总线319上的本次DBN1相加以计算下次DBN1并写回轨道表110的该数据点中;可以直接将选择器366选出的正确的数据步长stride写回轨道表110的该数据点中,当下次执行或即将执行到该数据点时(即数据循迹器320的读指针315再次指向该数据点时)再计算所述下次DBN1。

或者,也可以不管主流水线是否产生气泡,直接将该数据点中的有效位置为‘11’(即进入SR状态1308)。这种情况可以看作一种特例,在此不再重复说明。

对于第三种情况(有效位值是‘10’),表示该数据点当前处于EB状态1306。此时可以参考第二种情况采用EB技术进行后续操作。同样地,若EB流水线导致主流水线中产生气泡,则有效位被置为‘11’(即进入SR状态1308),如图13A中所示从EB状态1306向SR状态1308的转移。否则,有效位保持为‘10’,如图13A中所示从EB状态1306向自身的转移。

对于第四种情况(有效位值是‘11’),表示该数据点当前处于SR状态1308。此时,使用存储在其中的DBN1(即之前计算转换得到的Stride DBN1)对一级数据缓存204寻址,读出相应数据提供给处理器核102使用。同时,如前所述通过对该DBN1和Stride相加得到新的Stride DBN1,并如前根据该新的Stride DBN1是否超出旧DBN1所在一级或二级存储块边界,采取相应操作,从而保证Stride DBN1对应的数据已经存储在一级数据缓存204中,并将该Stride DBN1写入该数据点中供下次读取数据时使用。该数据点中的有效位则保持不变,如图13A中所示从SR状态1308向自身的转移。

根据本发明技术方案,采用EB技术得到的EB DBN1是一定正确的,但有可能无法完全掩盖数据访问过程,造成主流水线暂停。且EB流水线的功耗比Stride流水线大。如前所述,当数据点处于EB状态1306时,若EB流水线导致主流水线产生气泡,则将该数据点的有效位置为‘11’,进入SR状态1308以避免主流水线暂停造成的性能损失。此时,数据点中的Stride DBN1可以保持更新,以便提前将下次执行该数据点时可能用到的数据填充到一级数据缓存204中。

当然,根据本发明技术方案,为了降低功耗,也可以在从EB状态1306转换到SR状态1308时,只在数据点中存储Stride和EB DBN1,而不进行Stride数据地址的计算及Stride DBN1的转换。又或者,当EB流水线导致主流水线产生气泡时,也可以直接将该数据点的有效位置为‘00’,回到IV状态1302重新开始。对于这些情况,均可以参考本说明书中的相关实施例进行,在此不再具体说明。

根据本发明技术方案,采用Stride技术功耗较小,且不会暂停主流水线,在本质上降低了数据缓存缺失率。然而Stride DBN1不一定正确。因此,当数据点处于SR状态1308时,需要根据数据流水线实际执行该数据点时产生的数据地址该对之前计算转换得到的Stride DBN1进行核对。显然,可以利用EB流水线产生所述用于核对的数据地址。

具体地,可以有多种方法对数据地址进行核对。例如,在第一种方法中,可以将EB流水线中加法器360产生的EB数据地址经总线211送到主动表160转换为EB DBN1,与存储在轨道表110该数据点中的Stride DBN1比较。若两者相同,则表示该Stride DBN1是正确的,主流水线可以继续运行。若两者不同,则表示该Stride DBN1是错误的,需要清除主流水线中用到该LOAD指令的数据的指令执行的中间结果。同时用该EB DBN1从一级数据缓存204中读出相应数据送往处理器核102,使得主流水线中上述被清除的指令能获得正确数据重新执行。此外,该EB DBN1和有效位‘01’一同被写回该数据点中,使得数据点进入LE状态1304,如图13A中所示从SR状态1308向LE状态1304的转移。此时数据点中的Stride是无效的。

又如,在第二种方法中,可以将存储在轨道表110该数据点中的Stride DBN1读出经块号逆映射模块206、主动表160转换为Stride地址后,与加法器360产生的EB数据地址比较。根据比较结果采取的相应后续操作与前例相同。采用该方法可以不必通过标签(tag)匹配以产生EB DBN1,进一步降低了功耗。

又如,在第三种方法中,可以利用一个额外存储器保存数据点对应的基地址值。如前例所述,该存储器可以由数据点中的步长指针SP或数据循迹器320读指针315寻址。此时,可以将该存储器中保存的前一次执行数据点时的基地址值读出并加上Stride,得到的值与总线203上来源于处理器核102中寄存器堆182的本次基地址值进行比较。根据比较结果采取的相应后续操作与前例相同。采用该方法可以不必产生EB数据地址和EB DBN1,进一步降低了功耗。

又如,在第四种方法中,可以利用一个额外存储器保存数据点对应的分支判别字BDW。即,在计算得到一个数据点下次数据地址对应的Stride DBN1的同时,保存当时的BDW。例如,可以在轨道表110的每个数据点中增加一个BDW域用于存储该数据点对应的BDW,并在每次计算数据点下次DBN1的同时将当时的BDW存储在该数据点的BDW域中。当数据循迹器320读指针315再次指向该数据点时,将该BDW域中的BDW值(预测BDW,即预测DBN1时采用的分支转移情况)读出,与当时保存在步长表362中的分支转移情况构成的BDW(实际BDW,即实际执行时的分支转移情况)进行比较。若两者相等,表示之前预测Stride时该数据点所采用的循环情况与实际执行时的循环情况一致,可以认为之前预测得到的Stride和Stride DBN1都是准确的。若两者不等,表示实际执行时循环情况已经发生了变化,因此由EB流水线计算EB数据地址和EB DBN1,并从一级数据缓存204读出数据供处理器核102使用。该EB DBN1和有效位‘01’一同被写回该数据点中,使得数据点进入LE状态1304,如图13A中所示从SR状态1308向LE状态1304的转移。显然,可以在步长表362的每一列中增加一个表项用于存储该BDW值。

或者,在预测BDW和实际BDW比较结果为不相等时,可以不使用EB流水线计算EB DBN1,而是将之前计算得到的Stride DBN1(即错误的DBN1)减去预测数据步长Stride(即保存在轨道表110中或按预测BDW从步长表362中读出的Stride),再加上实际数据步长Stride(即按实际BDW从步长表362中读出的Stride),得到正确的DBN1。

又或者,在预测BDW和实际BDW比较结果为不相等时,通过实际数据步长Stride减去预测数据步长Stride以得到数据步长差值,再用之前计算得到的Stride DBN1(即错误的DBN1)加上该数据步长差值,得到正确的DBN1。

综上所述,当被执行的数据点处于SR状态1308时,需要实时核对Stride DBN1,但并不一定需要使用EB流水线计算EB数据地址或EB DBN1,从而降低了功耗。此外,一旦核对时发现Stride DBN1是错误的,该数据点进入LE状态1304,并使用EB流水线计算EB数据地址和EB DBN1,从而向处理器核102提供正确的数据。

根据本发明技术方案,当数据引擎作为有限状态机使用时,还可以有其他各种可能的状态转移情况。请参考图13B,其为本发明所述有限状态机的另一种状态转移图。图13B中的四个状态与图13A中的相同,不同之处在于,当被执行的数据点处于LE状态1304时,无论EB流水线是否会导致主流水线中产生气泡,该数据点都进入EB状态1306。只有当被执行的数据点处于EB状态1306,且EB流水线导致主流水线中产生气泡时,该数据点才会进入SR状态1308,否则保持在EB状态1306。当然,图13B仅仅以一种可能的状态转移情况为例,还可以有其他各种可能情况,应能参考本说明书推导得到,在此不再一一举例说明。

根据本发明技术方案,对于是否能够从EB状态1306转移到SR状态1308,除了前例中根据EB流水线是否会导致主流水线中产生气泡来判断外,还可以有其他合适的判断方法。

例如,可以为每个数据点增加一个计数器。与前例类似,可以通过步长指针SP或读指针315寻址找到数据点对应的计数器。在此,当数据点处于EB状态1306时,判断之前预测得到的Stride与实际Stride是否相等。若相等,则相应计数器增一,否则相应计数器清零。此外,当计数器值大于一个预设值时,该数据点进入SR状态1308,否则保持在EB状态1306。当然,还可以有其他各种合适的判断方法,应能参考本说明书推导得到,在此不再一一举例说明。

下面再对数据存储(STORE)指令进行说明。根据本发明技术方案,STORE指令对应的数据点并不一定需要使用EB技术。此时,可以使用现有方法计算数据地址后映射为DBN1对一级数据缓存204寻址,从而将数据写入相应存储单元。由于LOAD指令的优先级比STORE指令高,因此可以在处理器核102和一级数据缓存204之间增加一个写缓冲(Write Buffer),用于暂存需要写入一级数据缓存204的数据及相应地址(DBN1),在一级数据缓存204空闲时完成该写入操作。

然而,当对STORE指令也采用EB技术从数据引擎208发射时,主循迹器120读指针115也可以跳过该STORE指令,在主流水线中提前执行该STORE指令之后的指令,提高系统性能。具体方法与前述实施例中跳过LOAD指令的方法类似,差别在于其数据地址(DBN1)会按需相应延迟若干周期,配合寄存器堆182中读出的数据到达的时间点,将该数据存储到一级数据缓存204中由该DBN1指向的存储单元。

请参考图14A,其为本发明所述执行数据读取(LOAD)指令的一个实施例。在本实施例中,指令I1、I2、I3、I4、I6、I7和I8是算术逻辑运算指令,由主流水线执行,各经过4个流水线段;指令I5是数据读取指令,采用Stride技术,由数据流水线中的Stride流水线(3个流水线段)直接从一级数据缓存204中读出相应数据,并由数据流水线中EB流水线同步进行DBN1的核对(6个流水线段)。

如图14A所示,数据读取指令I5提前3个周期被送到数据流水线执行,即在指令I2进入主流水线I段的同时,指令I2进入EB流水线(此时对应EB状态)的I段,或同时进入Stride流水线及EB流水线(此时对应SR状态)的I段。此后,若数据点处于EB状态,则指令I5依次经EB流水线的D段、G段和T段,产生EB DBN1。若数据点处于SR状态,则指令I5除了如前进入EB流水线的D段、G段和T段外,还相应地将Stride流水线的M段延迟了3个周期(在图14A中用‘d’表示),并根据EB DBN1和Stride DBN1的比较结果,决定由Stride DBN1流水线的M段或EB流水线的M段读取数据。在数据流水线的M段,从一级数据缓存204读出数据,并在W段写回寄存器堆,同时该数据也可以按需被旁路到指令I6的E段和指令I7的D段。这样,在最好情况下,主流水线中跳过了数据访问指令(数据访问过程被完全掩盖),从而提高了处理器系统的性能。

请参考图14B,其为本发明所述执行数据读取指令的一个最差情况实施例。在本实施例中,假设数据读取指令I5处于EB状态,且与指令I4和I6均存在寄存器相关性。即,在指令I4的E段完成前,指令I5无法进入EB流水线的G段;在指令I5的M段完成前,指令I6无法进入主流水线的E段。

因此,虽然指令I5仍然提前了3个周期进入EB流水线,但是因存在寄存器相关性,同步模块212通过总线205输出3个气泡插入EB流水线以延迟D段的发射(在图14B中用‘d’表示)。如图14B所示,EB流水线的D段与主流水线中指令I4的E段同时发射,使得主流水线E段的执行结果能够被旁路到EB流水线的G段,用于计算EB数据地址。EB流水线的后续操作如前。

相应地,由于指令I5和I6存在寄存器相关性,因此主流水线中指令I6的气泡数目(在图14B中用‘b’表示)等于EB流水线中指令I5的延迟周期数。这样,主流水线中指令I6的D段和EB流水线中指令I5的M段同时发射,使得EB流水线M段读取的数据能够被旁路到主流水线的E段。即,在最差情况下,该数据读取指令没有提前完成,且数据访问过程不能被掩盖(主流水线中有气泡)。

图14C是本发明所述执行数据存储指令的一个最差情况实施例。显然,数据存储指令与其之前的指令可能存在寄存器相关性,但由于数据存储指令没有目标寄存器,因此与其之后的指令不会存在寄存器相关性。如图14C所示,由于数据存储指令I5与指令I4存在相关性,因此指令I5虽然提前了3个周期进入数据流水线,但其D段被延迟了3个周期(在图14C中用‘d’表示)。然而,指令I6不受数据流水线中气泡的影响,依然可以紧随指令I4进入主流水线,即主流水线中指令I6的I段和指令I4的D段同时发射。这样,在最差情况下,虽然该数据存储指令没有提前完成,但数据访问过程被完全掩盖,主流水线中没有气泡,并提高了处理器系统的性能。

在上述例子中,数据循迹器320读指针315可以提前移动并指向主循迹器120读指针115之后的第一个数据点。当然,还可以对数据循迹器320做进一步改进,增加两个寄存器,分别用于暂存总线317送来的数据点内容(即DBN1、Stride和有效位)和读指针315的值。在同步模块212的控制下,可以在合适的时间点利用所述寄存器中暂存的BN1对指令读缓冲116寻址以读出相应的数据访问指令,并如前进行后续操作,使得读指针315可以继续移动指向下一个(即第二个)数据点。类似地,还可以在数据循迹器320中暂存更多数据点的相关信息,使得读指针315能更早地指向更远的数据点。

根据本发明技术方案,除了可以在主流水线中跳过数据访问指令外,还可以采用类似的方法跳过分支指令,使得主流水线的效率更高,提高处理器系统的整体性能。

请参考图15,其为本发明所述跳过分支指令时的流水线的一个示意图。在图15中,指令I1、I2、I3、I4、I6、I7、I8、T6、T7、T8是算术逻辑运算指令,由主流水线执行,各经过4个流水线段(主流水线的各段与图12中的相同);指令I5是分支(branch)指令,由分支流水线执行,经过3个流水线段:取指(I)段、译码(D)段、分支判别(B)段。分支流水线中的I段和D段与主流水线及数据流水线中的I段和D段相同,用于取指和译码。分支流水线中的B段则用于产生分支判断结果。此外,在本实施例中,若分支指令I5分支转移没有发生,则I5的后续指令为I6、I7和I8;否则,I5的后续指令为T6、T7和T8。

具体地,在I段中,根据数据循迹器320读指针315从指令读缓冲116中读出相应分支指令中的用于判断分支转移是否发生的寄存器号。根据不同的体系结构,所述寄存器可以存储不同性质的数据。例如,所述寄存器可以被用于存储操作数。此时在D段中根据所述寄存器号从处理器核102的寄存器堆182中读出相应操作数,在B段中对读出的操作数进行比较,并根据比较结果确定分支转移是否发生。又如,所述寄存器可以被用于存储标志(flag),此时根据该标志的值确定分支转移是否发生。此时在D段中根据所述寄存器号从处理器核102的寄存器堆182中读出相应标志,直接确定分支转移是否发生或在B段中再确定分支转移是否发生。

如图15所示本实施例中,为了使主流水线中能跳过分支指令I5(即I6或T6的I段与I4的同时发生),必须将I5提前3个周期,使得I5的B段产生的分支转移结果能用于选择I6或T6中的一条进入主流水线的I段。因此,分支指令I5的I段与指令I2的I段同时发生。

如前所述,对于直接分支指令,当其被填充到一级指令缓存104的同时,由扫描器106计算分支目标地址并送往主动表160转换为相应的BN写入轨道表110的相应分支点中。该BN就是缓存地址,可以直接用于对一级指令缓存104或二级缓存108寻址读出相应的分支目标指令。此外,由于该分支点在轨道表110中的寻址地址BN1也是缓存地址,且该分支指令顺序地址的下一条指令(Fall through instruction)对应的轨迹点就是该分支点的相邻下一个轨迹点,可以通过对分支点BN1中的BN1Y增一得到,即根据轨道表110本身的结构就能得到分支指令下一指令的BN1,且可以直接使用该BN1对一级指令缓存104寻址读出相应的下一指令。因此,当数据循迹器320读指针315指向一个直接分支指令对应的分支点时,该分支指令的下一指令BN和分支目标BN均已准备好,只需要得到分支转移判断结果即可从所述下一指令BN和分支目标BN中选出一个用于获取相应指令。

对于间接分支指令,可以参考前例中数据地址的计算方法,利用数据引擎计算分支目标地址,其他操作与直接分支指令的情况相同。需要注意的是,由于间接分支指令在此被数据引擎处理,因此在轨道表110中其对应的分支点格式951的存储域953中包含的轨迹点类型被设为‘1’,使得数据引擎能识别到间接分支点并进行相应处理。

根据本发明技术方案,在此及以后的实施例中,数据引擎208与数据流水线不仅被用于处理分支指令和数据访问指令,还可以处理任何类型‘1’的指令。类型‘1’的指令也不再限于分支指令和数据访问指令,而可以是任何执行时所需周期数多(即执行耗时长)、需要提前发射的指令(如:乘法指令、除法指令等)。

因此,无论是直接分支指令还是间接分支指令,采用本发明所述技术,都可以在主流水线中跳过该分支指令。

与前例类似,当分支指令与其之前指令具有寄存器相关性(即由于分支点被提前发射,在分支流水线D段中读取寄存器值时,该寄存器值还没有更新为正确值)时,通过产生气泡并在流水线中插入气泡的方法,延后分支流水线中的D段。分支流水线中一旦有气泡,必定延后对下一指令和分支目标指令的选择,因此会导致主流水线中产生气泡。

因此,可以存储分支流水线产生的分支转移判断结果(如存储在轨道表110的相应分支点的分支转移域中),用于下次执行到该分支点时用作分支预测的依据。当数据循迹器320读指针315指向该分支点时,可以同时读出存储在其中的分支目标BN和上次分支转移判断结果,并根据该上次分支转移判断结果猜测性地提前选择下一指令和分支目标指令中的一个,避免主流水线中产生气泡。

当然,也可以如前例中存储数据点的Stride那样,将所述上次分支转移判断结果存储在一个额外的存储器中,通过BN1或指令地址对该存储器寻址读出相应的上次分支转移判断结果。此外,还可以对分支点增加一个计数器,当该计数器值小于等于一个预设值时,不进行预测,且当从分支点中读出的上次分支转移判断结果与本次实际分支转移情况相同时,计数器加一,否则计数器清零。当计数器值大于该预设值时,再使用该上次分支转移判断结果进行分支预测。

根据本发明技术方案,分支流水线可以和数据流水线共用相同的I段和D段,并额外增加了一个分支判断模块用于实现分支流水线B段的功能。下面结合图16A和图17进行具体说明。

请参考图16A,其为本发明所述处理器系统流水线结构的另一个示意图。在图16A中,主流水线和数据流水线与图11中的相同,但为了便于说明,没有显示数据引擎和处理器核的内部结构。分支流水线和数据流水线共用了相同的I段和D段,且在数据流水线的G段对应的位置增加了一个用于判断分支转移的分支模块170,从而实现了分支流水线的B段。

在本实施例中,与数据引擎208类似,指令读缓冲116根据数据循迹器320读指针315寻址输出指令通过总线125送往分支模块170中的译码器。总线125上该指令的寄存器号还被送往处理器核102中的寄存器堆182,读出相应操作数经总线203送回分支模块170或数据引擎208。

分支模块170根据译码得到的分支类型及接收到的操作数产生分支转移结果并经总线177送往主循迹器120中的选择器118和数据循迹器320中的选择器318。若分支转移没有发生,则选择器118和318均选择来源于增量器的输入。此时,数据循迹器320中的寄存器312的写使能信号无效,因此选择器318的输出不会影响读指针315的值。而在主循迹器120中,只要处理器核102送来的步进信号111有效,则寄存器112的写使能信号有效,选择器118的输出被写入寄存器112,从而使得读指针115更新为所述分支指令的下一指令的BN,指令读缓冲116根据读指针115寻址,向处理器核102输出所述下一指令供执行。

若分支转移发生,则选择器118和318均选择来源于轨道表110的分支目标BN1。此时寄存器112和312的写使能信号均有效,使得读指针115和315均更新为所述分支指令的分支目标BN。当读指针115和315更新完毕后,一级指令缓存104在读指针315中BN1X的寻址下,输出相应指令块填充到指令读缓冲116中。指令读缓冲116由读指针115寻址直接旁路输出所述分支目标指令送往处理器核102供执行。

根据本发明技术方案,分支模块170的基本功能是获取相应操作数、译码得到分支类型并基于该分支类型和操作数进行分支转移结果判断。根据不同的指令集体系结构,分支模块可以有不同的内部结构。请参考图16B,其为本发明所述分支模块的一个实施例。

为了便于描述,在本实施例中,假设通过对两个寄存器中的操作数进行比较确定分支转移是否发生。对于更多操作数之间比较的情况,以及有立即数,也可以参考进行,在此不再赘述。

在分支模块170中,译码控制器172接受总线125送来的指令并译码。若译码发现该指令不是分支指令,则忽略该指令。对于分支指令则进一步译码得到分支类型,产生相应的控制信号送到判断模块176。

由于在本实施例的分支流水线中,分支指令被提前3个周期,因此需要对分支指令及其前3条指令进行寄存器相关性判断,并确定分支流水线中的气泡数量(即确定D段的发射时间点),具体实现方法可以参考之前实施例。这样,在某一时间点,若不存在寄存器相关性,则所述分支指令中的寄存器号被通过总线125送到处理器核102的寄存器堆182中读出相应操作数,并经总线203送回分支模块170中的判断模块176中。

判断模块176根据译码控制器172送来的控制信号,对所述操作数进行相应判断,从而产生分支转移结果经总线177送出。例如,若所述控制信号表示两个操作数相等时分支转移发生,则判断模块176对这两个操作数进行是否相等的比较,并根据比较结果产生分支转移结果。又如,若所述控制信号表示第一个操作数大于第二个操作数时分支转移发生,则判断模块176对这两个操作数进行是否大于的比较,并根据比较结果产生分支转移结果。

请参考图16C,其为本发明所述分支模块的另一个实施例。在本实施例中,分支指令根据之前指令执行的结果或标志(flag)确定是否发生分支转移。此时,分支模块170中的译码控制器172与图16B中的相同,对接收到的分支指令进行译码,得到分支类型,并产生相应控制信号送往判断模块176。不同之处在于可能产生的气泡的数量。对于图16B实施例,最差情况下分支指令之前第一条指令对分支指令所需的寄存器进行更新,这样会导致三个气泡。但在图16C实施例中,最差情况下分支指令之前第一条指令产生分支指令所需的标志位,此时只会导致两个气泡。即,在最差情况下,图16C实施例比图16B实施例少一个气泡。此外,由于分支指令根据标志进行分支判断,因此分支流水线处理分支指令时不需要从寄存器堆中读出操作数。

具体地,在图16C中,处理器核102的执行单元188执行生成的用于产生的所述标志的中间结果被送往标志产生器的同时,也被送到判断模块176。判断模块176根据译码控制器172送来的控制信号及执行单元188送来的中间结果,在标志产生器产生所述标志的同时,产生分支转移结果经总线177送出。后续操作与图16B实施例相同,在此不再赘述。

此外,还可以对图16B所述分支模块做进一步改进,使得在最差情况下分支流水线也只需要产生两个气泡,即达到和图16C实施例同样的性能。请参考图16D,其为本发明所述分支模块的另一个实施例。在本实施例中,译码器172不仅对总线125上的分支指令进行译码,也对总线101上的指令(即所述分支指令的前一条指令)进行译码。判断模块176是一个三输入模块,其中两个输入是总线183上来源于寄存器堆182的操作数,对应分支指令前一条指令用到的两个操作数,另一个输入是如前所述由总线125上的寄存器号对寄存器堆182寻址并从专用读口读出经总线189、选择器192、总线203送来的操作数。这样,当所述前一条指令在主流水线D段读出操作数并通过总线183送往E段执行单元的同时,将所述操作数通过总线183旁路送往分支模块170中的判断模块176。

在此,与图16B实施例类似,译码控制器172对分支指令及其前3条指令进行寄存器相关性判断。若没有相关性,则总线125上的寄存器号被送到处理器核102中寄存器堆182读出相应寄存器值,经总线189、选择器192和总线203送回判断模块176用于产生分支转移结果。此时,所述分支指令的前一指令在主流水线中的E段而后该分支指令在数据流水线中的B段同时进行,因此所述标志和分支转移结果同时产生,该分支指令的执行过程可以被完全掩盖。

若存在寄存器相关性,此时将没有相关性的寄存器中的操作数称为非关键操作数(non-critical operand);有相关性的寄存器中的操作数称为关键操作数(critical operand),执行产生该关键操作数的指令称为关键指令(critical instruction)。即,分支指令与关键指令之间存在寄存器相关性。

此时译码控制器172除了如前所述控制总线125上的非关键操作数所在的寄存器号送往寄存器堆182以获取相应的非关键操作数之外,还进一步提取关键指令的指令类型,作为控制信号送往判断模块176。

另一方面,在处理器核102因执行该关键指令而读取寄存器堆182时,将读出的用于计算关键操作数的操作数送往执行单元的同时,通过旁路路径183送往判断模块176。

判断模块176根据从译码控制器172接收到的控制信号,对这三个操作数(例如一个非关键操作数和两个用于计算关键操作数的操作数)进行处理。例如,若关键指令是一条减法指令,且分支指令的判断条件为是否相等,则此时在判断模块176中可以通过对所述两个用于计算关键操作数的操作数相减并减去所述非关键操作数,得到分支转移结果。具体地,假设所述关键指令是减法指令“SUB R3,R2,R1”(寄存器R2的值减去寄存器R1的值,结果写回寄存器R3),所述分支指令为“BEQ R4,R3”(当寄存器R4和寄存器R3值相等时发生分支转移),那么根据本发明所述技术方案,数据流水线的B段中判断模块176执行的相当于分支指令“BEQ R4,(R2-R1)”(先由寄存器R2的值减去寄存器R1的值,再当寄存器R4和所述减法结果相等时发生分支转移)。

又如,若关键指令是一条逻辑运算指令,且分支指令的判断条件为是否相等,则此时在判断模块176中可以先对所述两个用于计算关键操作数的操作数进行相应的逻辑运算,再将运算结果减去所述非关键操作数,得到分支转移结果。后续操作与图16B实施例相同,在此不再赘述。这样,分支判断结果至少可以与该分支指令前一条指令的执行结果同时产生,即最差情况下分支流水线也只需要产生两个气泡,达到图16C实施例的效果。

请参考图17,其为本发明所述两层缓存的缓存系统的另一个实施例,该实施例与图16对应。为了便于此后的说明,将本实施例中的指令读缓冲116、主循迹器120、数据循迹器320和同步模块212合并称为循迹模块190。本实施例与图8实施例相比,增加了一个分支模块170代替处理器核102产生分支转移结果。此外,与图8实施例不同,本实施例中的数据循迹器320的读指针315包含BNX和BNY,而主循迹器120读指针115只包含BNY。在本实施例中,读指针315经过的所有分支点和数据点都不被送往主流水线执行。具体地,当轨道表110中根据读指针315寻址读出的轨迹点内容显示为分支点或数据点时,该轨迹点内容经总线317被送往数据引擎208。相应地,若该轨迹点是分支点,则指令读缓冲116中根据读指针315寻址读出的指令被送往分支模块170,若该轨迹点是数据点,则指令读缓冲116中根据读指针315寻址读出的指令被送往数据引擎208。

在本实施例中,指令读缓冲116在读指针115的寻址下输出相应指令供处理器核102执行。此外,在同步模块212中,对分支指令采用数据访问指令相同的处理方法,使得读指针115不但跳过数据访问指令,还能跳过分支指令。即,指令读缓冲116中由读指针115指向的指令不是分支指令,也不是数据访问指令,从而只将其他指令送往处理器核102由主流水线执行。

在此,指令读缓冲116可以包含一个或两个指令块。当指令读缓冲116只包含一个指令块时,则该指令块为当前指令块,此时只需要根据主循迹器120读指针115输出的BNY就可以从指令读缓冲116中读出相应指令送往处理器核102供执行。当指令读缓冲116包含两个指令块时,则除了包含当前指令块以外,还包含顺序下一指令块。由于读指针315领先于读指针115,因此读指针315会先指向当前指令块的下一指令块,此时只需要根据读指针315中的BNX对一级指令缓存104寻址即可读出该下一指令块填充到指令读缓冲116中。相应地,在指令读缓冲116中增加一个换行信号用于指向所述两个指令块中的当前指令块。这样,在当前指令块的最后一条指令被送往处理器核102后,该换行信号就指向指令读缓冲116中的另一个指令块,使之成为新的当前指令块,同时主循迹器120读指针115溢出归零或被清零,从而指向该新的当前指令块的第一条指令。当然,主循迹器120读指针115也可以包含BNX,从而无论指令读缓冲116包含多少个指令块,如前所述都能指向正确的指令并读出送往处理器核102供执行。此外,在本实施例中主循迹器120中的选择器118和数据循迹器320中的选择器318均受分支模块170的输出177控制。

下面以主循迹器120读指针115只包含BNY为例进行说明。与图8实施例不同,读指针115不再对轨道表110寻址。与前例类似,轨道表110中的分支点包含指令类型和分支目标BN,数据点包含指令类型、标志位、DBN1和数据步长。当读指针315在移动过程中,读出并送到总线317上的分支点内容中包含的是分支目标BN2,则该BN2如前所述被送往块号映射模块162转换为BN1,并在此过程中如前按需填充一级指令缓存104,使得分支点内容中包含的是分支目标BN1。

在本实施例中,当读指针315指向一个分支点或一个数据点时,停止移动,等待读指针115接近(即满足前述提前周期数)并将相应分支指令或数据访问指令发射到分支流水线或数据流水线中后,读指针315再继续移动。当然,也可以将分支点或数据点本身的BN1和分支点内容中的分支目标BN1或数据点内容中的DBN1存储到一个先入先出(FIFO)中,使得读指针315可以继续移动,更早地将后续分支点中的分支目标BN2转换为BN1。这种情况将在图18实施例中说明,在此暂不涉及。此外,在本实施例中,还可以增加一个循迹器,其读指针专门用于指向分支点,并如前将分支点中的分支目标BN2替换为BN1。在读指针315暂停移动时,该新增读指针可以继续移动。这种情况将在图21实施例中说明,在此暂不涉及。

此外,在上述例子中,数据循迹器320读指针315可以提前移动并指向主循迹器120读指针115之后的第一个分支点或数据点。当然,还可以对数据循迹器320做进一步改进,增加两个寄存器,分别用于暂存总线317送来的分支点或数据点内容和读指针315的值。在同步模块212的控制下,可以在合适的时间点利用所述寄存器中暂存的BN1对指令读缓冲116寻址以读出相应的分支指令或数据访问指令,并如前进行后续操作,使得读指针315可以继续移动指向下一个分支点或数据点。类似地,还可以在数据循迹器320中暂存更多分支点或数据点的相关信息,使得读指针315能更早地指向更远的分支点或数据点。

请参考图18,其为本发明所述两层缓存的缓存系统的另一个实施例。图18所示的缓存系统与图17基本相同,不同之处在于,循迹模块190中增加了一个先入先出(FIFO)196。因此,与图17实施例不同,读指针315经过先入先出196暂存后再送往同步模块212、一级指令缓存104和指令读缓冲116,而轨道表110经总线317输出的轨迹点内容在先入先出196中暂存后再被送往主循迹器120。

由于轨道表110根据读指针315的寻址将对应轨迹点内容通过总线551输出,因此读指针315的值和总线551上的值构成具有相应关系的一组BN对(BN pair)。具体地,当读指针315指向的是分支点时,所述BN对就是该分支点本身的BN1(以下称为源BN1)和分支目标BN1(若分支点内容中存储的是分支目标BN2,则可以按前述方法将该BN2转换为相应的BN1);当读指针315指向的是数据点时,所述BN对就是该数据点本身的BN1(源BN1)和相应数据对应的DBN1。在本实施例中,先入先出196只存储对应分支点和数据点的所述BN对。

由于先入先出196中保存了读指针315经过的分支点和数据点的信息,因此,只要先入先出196没有满,即便读指针115离这些分支点和数据点的距离大于所述提前周期数(此时所述分支点和数据点还没有得到处理,即还没有被发射到相应的分支流水线或数据流水线中),读指针315依然可以继续移动。此外,由于用先入先出196暂存了分支点或数据点的源BN1,因此指令读缓冲116可以直接在先入先出196输出的源BN1的寻址下通过总线125输出相应指令。

具体地,当数据循迹器320读指针315在移动过程中到达一个分支点或数据点时,将读指针315的值(即源BN1)和根据该源BN1值对轨道表110寻址读出的轨迹点内容构成的BN对存储到先入先出196中。之后,读指针315继续移动指向下一个分支点或数据点。

在此过程中,一旦读指针315指向的分支点中包含的是BN2,则读指针315暂停移动,按前述方法将BN2转换为BN1写回读指针315指向的该分支点(并按需将指令块从二级缓存108填充到一级指令缓存104中)后,再继续移动。或者,可以增加一个先入先出(FIFO)用于存储此时读指针315的值(即该分支点本身的BN1),当所述BN2被转换为BN1后写回该先入先出输出的BN1指向的分支点。这样,读指针315就可以不必等待,直接继续移动。

根据本发明技术方案,当读指针315移动到一条轨道的结束轨迹点时,可以暂停移动,也可以从总线551读出的结束轨迹点内容中的下一轨道BN1X及常数‘0’(结束轨迹点在轨道中的位置固定,因此不需要读指针315对其寻址)对数据循迹器320读指针315进行更新,使得读指针315能够指向轨道表110中的下一轨道的第一个轨迹点,从而继续移动指向下一个分支点或数据点。

当先入先出196满时,读指针315暂停移动,直到先入先出196不再满时重新开始移动。先入先出196当前输出的BN对包含了主循迹器120读指针115指向的指令之后的第一个分支点或数据点。如前所述,该BN对中的源BN1被提前送到指令读缓冲116的第二个读端口寻址,读出相应指令经总线125将指令中的指令类型送往分支模块170,并将指令中的寄存器号及指令操作码等送往数据引擎208。分支模块170和数据引擎208则根据该源BN1对应的是分支点还是数据点,如前采取相应后续操作。同时,指令读缓冲的第一个读端口根据主循迹器120读指针115寻址,如前向处理器核102提供指令。

同步模块212如前所述,对主循迹器120读指针115和先入先出196输出的源BN1进行比较,以确定分支指令或数据访问指令的发射时间点。具体地,对于数据点,当读指针和源BN1的差值大于等于‘-3’时,将源BN1对指令读缓冲116寻址读出的指令,并通过总线125将该指令中的寄存器号经送往处理器核102的寄存器堆182读出相应寄存器值后经总线203送往数据引擎208,与总线125上的指令的地址偏移量相加得到EB数据地址。

由于在本实施例中是由先入先出196输出的源BN1送到同步模块判断发射时间点,而不是如之前实施例所述移动数据循迹器320读指针315到达分支点或数据点,同步模块在图6基础上略有修改。请参考图19A,其为本发明所述同步模块的另一个实施例。本实施例只显示了图18实施例中的轨道表110、主循迹器120、数据循迹器320、指令读缓冲116、先入先出196和同步模块212。

由于不但要跳过数据访问指令,还要跳过分支指令,因此在本实施例中,数据访问指令和分支指令均为类型‘1’,其他指令为类型‘0’。

本实施例与图6实施例的一个差别在于相关性检测模块650的结构有所不同。在图6中,由于读指针315沿指令读缓冲116依次移动,因此当读指针315指向一个分支点或数据点(即:类型‘1’)时,其之前的指令(如图6实施例中的前三条指令)的目标寄存器号已经被存储在相关性检测模块650的相应寄存器中,可以与该分支指令或数据访问指令的源寄存器号进行相关性检测。而在本实施例中,先入先出196直接输出源BN1对指令读缓冲116寻址,因此需要同时从指令读缓冲116中读出该源BN1之前的指令的目标寄存器号。

假设本实施例中仍然对分支指令或数据访问指令和其之前三条指令进行寄存器相关性判断,则指令读缓冲116在先入先出196输出的源BN1寻址下,输出相应的分支指令或数据访问指令的源寄存器号经总线651送往相关性检测模块650中的三个比较器各作为第一个输入。同时,指令读缓冲116还输出该源BN1对应的指令的之前三条指令的目标寄存器号,分别通过总线653、655和657送往相关性检测模块650中的三个比较器各作为第二个输入。所述三个比较器分别对接收到的两个输入进行比较,如前例所述进行寄存器相关性判断。

本实施例与图6实施例的另一个差别在于计数控制模块620的结构有所不同。在图6实施例中,若主循迹器120读指针115尚未到达距分支点或数据点‘-1’的位置,计数控制模块620输出‘1’送往主循迹器120用于读指针115增‘1’,以指向下一条指令。若主循迹器120读指针115已经到达距分支点或数据点‘-1’的位置,计数控制模块620输出‘2’送往主循迹器120用于读指针115增‘2’,以跳过下一条指令(即该分支指令或数据访问指令)直接指向再下一条指令。

然而,如果该再下一条指令也是分支指令或数据访问指令,则会被送到分支流水线及数据流水线执行,导致主流水线暂停一个周期。进一步地,若存在连续多条分支指令或数据访问指令,则主流水线可能会暂停更多个周期。

在本实施例中,计数控制模块620除了保留图6实施例中的选择器622,以及选择器622的一个输入为常数‘1’不变外,增加了一个由寄存器552和增量器550构成的计数器(counter)。其中。增量器550对寄存器552的输出增‘1’后送回寄存器552。寄存器552带有一个‘0’有效的异步置位端,即当该置位端的输入为‘0’时,无论当时的时钟信号是否有效,寄存器552的值均被置为‘1’。此外,当寄存器552的时钟信号有效(‘1’)时,其值被更新为增量器550的输出。

这样,当读指针315指向的轨迹点既不是分支点也不是数据点时,读出的轨迹点类型(例如‘0’)通过总线551同时被送到寄存器552的置位端和时钟输入端,使得寄存器552的值为‘1’。此时,增量器550对寄存器552的值增‘1’得到‘2’。之后,当读指针315指向一个分支点或数据点时,读出的轨迹点类型(例如‘1’)通过总线551同时被送到寄存器552的置位端和时钟输入端。此时置位端输入为‘1’,因此不作用。时钟输入端为‘1’,因此增量器550输出的‘2’被写入寄存器552中,表示若要跳过一条分支指令或数据访问指令,则主循迹器120读指针115应该增‘2’。此时,增量器550对寄存器552的值增‘1’得到‘3’。

由于有先入先出196暂存源BN1,因此读指针315可以继续向该源BN1对应的分支点或数据点之后的轨迹点移动,若发现该轨迹点也是分支点或数据点(如:轨迹点类型为‘1’),则相应的轨迹点类型通过总线551同时被送到寄存器552的置位端和时钟输入端,如前所述寄存器552的值更新为‘3’,增量器550的输出为‘4’,表示若要跳过连续的两条分支指令或数据访问指令,则主循迹器120读指针115应该增‘3’。

如此反复,即可根据连续的分支指令或数据访问指令的条数N(即连续的类型‘1’指令的条数),由寄存器552输出相应的数值‘N+1’,使得读指针115与先入先出196输出的源BN1之差为‘-1’时,读指针一次性增加‘N+1’,从而跳过所述连续N条分支指令或数据访问指令。

然而在某些特定情况下,例如有较多个连续的类型‘1’轨迹点存在时,读指针315如前所述依次经过这些类型‘1’轨迹点并控制同步模块212中的寄存器552依次增一,则有可能在读指针115已经到达距所述连续类型‘1’轨迹点中第一分支点或数据点‘-1’的位置时,读指针315尚未移动到所述连续类型‘1’轨迹点之后的第一个类型‘0’轨迹点。此时寄存器552中的值小于‘N+1’(N即连续的类型‘1’指令的条数)。若根据该值更新读指针115,则读指针115会指向所述连续类型‘1’轨迹点中的一个。此时,根据读指针115对指令读缓冲116寻址输出的是类型‘1’的指令。如前所述,类型‘1’的指令被送到数据流水线执行,而主流水线则被相应插入一个气泡。之后反复该过程,直到读指针115到达第一个类型‘0’轨迹点,此时从指令读缓存116输出的指令被送到主流水线执行。

或者,当读指针115已经到达距所述连续类型‘1’轨迹点中第一分支点或数据点‘-1’的位置时,如果读指针315还指向该连续类型‘1’轨迹点中时(即读指针315还未到达该连续类型‘1’轨迹点之后的第一个类型‘0’轨迹点时),暂停读指针115的更新,直到读指针315指向类型‘0’轨迹点。在此过程中,如前将类型‘1’的指令送到数据流水线中执行。当读指针315指向类型‘0’轨迹点时,此时寄存器552中的值就是‘N+1’,因此读指针115在更新后直接指向所述第一个类型‘0’轨迹点,并从指令读缓存116输出的指令被送到主流水线执行。

具体地,可以采用一个有限状态机(FSM,finite state machine)实现上述过程。当读指针315指向类型‘0’时,FSM处于计数等待状态,计数器被置为‘1’。此时,一旦读指针315指向第一个类型‘1’时,FSM进入计数状态,每经过一个类型‘1’轨迹点,计数增‘1’(当连续经过N个类型‘1’时,计数达到‘N+1’)。当读指针315指向连续多个类型‘1’之后的第一个类型‘0’时,计数器停止计数,进入计数完成状态,同时将计数结果(‘N+1’)送到主循迹器120中加法器624与寄存器112中的值相加,并使得寄存器112写入该加法结果,从而使得读指针115能够一次越过N个类型‘1’轨迹点,直接指向所述连续多个类型‘1’之后的第一个类型‘0’轨迹点。之后,FSM进入计数等待状态,计数器被重新置为‘1’,并当读指针315指向第一个类型‘1’时,再次进入计数状态,重复上述过程。

图19A中时间点检测模块610与图6中的时间点检测模块功能相似,都是在检测待发射指令地址与主循迹器指针之间的距离。但时间点检测模块610还可以实现弹性的发射距离,某些送往提早流水线的可以在‘-2’、‘-1’,甚至‘0’。其中,计数器680是带有一个有限状态机,其初始状态是接受请求状态。当时间点检测模块610判定发射时机已到,就通过总线617将发射请求发到计数器680及发射控制模块630。计数器680根据该请求将相关性检测模块650中三个比较器的输出读进计数器680进行优先权编码。过程中还受从时间点检测模块610送来的信息控制,该信息告知当前循迹器地址与待发射地址之间的实际距离,比如距离只有两条,则总线657与651上的比较器在编码时就被忽略,因为此时总线657所代表的指令已经可以经由旁路而与待发射指令不形成相关关系。计数器680将相关关系经优先权编码后由总线681控制选择器638选择相应周期的延迟。同时,计数器680进入锁定状态,后续的发射请求将得不到计数器680的响应。选择器638选择对发射请求作不同周期的延迟,其最左面的输入对应于零周期延迟,其余三个输入相应地对应于一周期、两周期及三周期延迟。假如现在总线681控制选择器638选择最右面的输入,则总线617发射请求要经过寄存器632、寄存器634及寄存器636三个寄存器的延迟于三个时钟周期后才出现在总线205上控制相应指令发射进提早流水线。此时,总线205也将计数器680解锁,使其进入接受请求状态,准备接受下一个发射请求。

回到图18,对于直接分支点,先入先出196输出的BN对中已经包含了相应的分支目标BN1,因此只需要等待分支模块170如图16B、图16C或图16D实施例所述产生分支转移结果,即可确定相应的后续指令。

若分支转移没有发生,则主循迹器120读指针115继续递增(增加‘1’,或在有连续N个类型‘1’的情况下增加‘N+1’,对指令读缓冲116寻址读出当前指令块中的后续指令送往处理器核102供执行。先入先出196则输出下一个BN对,当读指针115和该BN对中的源BN1差值大于等于‘-3’时,重复上述过程。

若分支转移发生,则主循迹器120中的选择器118选择先入先出196输出的BN对中的分支目标BN1写入主循迹器120中的寄存器112。该分支目标BN1还经数据循迹器320中的选择器318选择后写入数据循迹器320中的寄存器312。这样,读指针115和315均被更新为分支目标BN1。如前所述,一级指令缓存104根据读指针315中的BN1X(即该分支目标BN1中的BN1X)的寻址输出相应指令块(即所述分支目标所在的指令块)填充到指令读缓冲116中,使得指令读缓冲116能根据读指针115的寻址输出正确的分支目标指令供处理器核102执行。同时,先入先出196被清空,读指针315从该分支目标BN1开始移动,重复上述过程。

对于间接分支点,当读指针和源BN1的差值大于等于‘-3’时,将源BN1对指令读缓冲116寻址读出的指令,并通过总线125将该指令中的寄存器号送往处理器核102的寄存器堆182读出相应寄存器值后送往数据引擎208。该指令中的地址偏移量也经总线125被送到数据引擎208。这样,在数据流水线的G段中,数据引擎208中的加法器360对所述寄存器值和地址偏移量相加得到分支目标地址。之后,采用处理数据点时相同的方法,在数据流水线的T段将该分支目标地址被转换为BN1。

之后的操作与对直接分支点的操作类似,不同之处仅在于直接分支点的分支目标BN1来源于先入先出196的输出,但间接分支点的分支目标BN1来源于主动表160。因此当分支转移发生时,主循迹器120中的选择器118和数据循迹器320中的选择器318均选择主动表160输出的分支目标BN1写入相应寄存器(即寄存器112和312),使得读指针115和315均被更新为分支目标BN1。为了使图18便于阅读,在图18中没有显示该路径。显然,可以根据本发明所述技术方案及相关实施例推导得到该路径的具体实现方法。之后的操作与直接分支点相同,在此也不再赘述。

这样,在本发明所述的缓存系统中,分支指令和数据访问指令均不再占用主流水线,且尽可能被提前发射,使得所述分支指令和数据访问指令之后的其他指令尽可能早地被主流水线执行,提高了系统的性能。

在本发明中,经主流水线发射的类型‘0’指令之间的数据相关都可以由主流水线中的互锁(interlock)及旁路(bypass)逻辑来保障。同理,经EB流水线发射的类型‘1’指令之间的数据相关都可以由EB流水线中的互锁(interlock)及旁路(bypass)逻辑来保障。从类型‘1’指令到类型‘0’指令之间的数据相关性,主流水线中的互锁及旁路逻辑也已保障(如同普通流水线中访问数据缓存发生缓存缺失时会停流水线直到需要的数据准备好为止)。在本发明中,现有方法未能保障的数据相关是从类型‘0’指令(主流水线)到类型‘1’指令(EB流水线)的数据相关。因为长延时(latency)的类型‘1’指令是提前发射的,所以在类型‘1’指令之前的3条类型‘0’指令在类型‘1’指令要做发射与否的判断时,还未进入主流水线,因此要检测待发射的类型‘1’指令与尚未发射的类型‘0’指令的相关性。在本发明中,检测尚未发射的类型‘0’指令的目标寄存器号与待发射的类型‘1’指令的源寄存器号是否相同,如相同即有相关性。

在本发明中,尚未发射的类型‘0’指令的寄存器号都是从指令读缓存中提前提取(如果一级指令缓冲有多个读口也可以从中提取)。作相关性检测的时机可以如前例在类型‘1’指令将要发射前检测。也可以提前在类型‘1’指令相应表项刚由数据循迹器读指针从轨道表或轨道读缓冲中读出时即作检测,因为需要的寄存器号都可以由该读指针指向的指令读缓冲或一级指令缓存指令及其之前的指令获得。可以将检测所得的发射时间槽信息放入先入先出(FIFO)196或198等以待该指令地址从先入先出读出时直到发射时间点。

请见图19B,其为本发明所述先入先出缓冲的一个实施例。在此实施例中先入先出196中每个表项除了有存储该类型‘1’指令的源地址(即轨道表地址BN1),以及分支目标地址或数据缓存地址(即轨道表内容BN1或DBN1等);另存有该类型‘1’指令发射时间点的信息。本实施例以两种方式保存发射时间点信息。其一,是当提前发射时间槽上有一条类型‘0’指令时,时间点信息为类型‘0’且用该类型‘0’指令的BN1Y地址表示。其二,是当提前发射时间点是类型‘1’指令时,即在此类型‘1’指令前一条类型‘1’指令发射之后发射此类型‘1’指令。因为这意味着此类型‘1’指令前3条指令中至少有一条是类型‘1’指令,而此类型‘1’指令在这三个时间点都可以发射,但必须在前一条类型‘1’指令之后循序发射。即从先入先出196或198中读出如该指令发射时间点上的指令类型的标记为类型‘0’时,则等待主循迹器120的指针151达到先入先出输出的地址时即发射;如该类型标记为类型‘1’时,则马上发射(从先入先出中输出表示在此之前的类型‘1’指令已发射)。

与之前实施例中所采取的先由主循迹器与数据循迹器之间的距离在发射时间点发出类型‘1’指令发射信号,再由相关性检测逻辑来决定对该信号延迟若干时钟周期的方法不同。本实施例中,相关性检测的结果已经包含在存入先入先出196中的时间槽信息中。产生该信息的单元其逻辑可以较为细致,如该类型‘1’指令前3条有其他类型‘1’指令,可以根据情形调整发射时间槽使两条流水线中的流水线段都尽量填满。还可以根据指令的类型及状态设定不同的发射时间,如一条处于SR(‘11’)状态的读数据指令就不一定要在‘-3’的时间点发射,甚至可以在‘+1’时间点发射。一条处于SR(‘11’)状态的写数据指令就可以在‘+2’的时间点实施。在做这些调整的时候当然要考虑到流水线中的资源冒险(data harzard)以及必要的仲裁。

进一步地,先入先出196的每个表项中有如图19B所示的域,其中域701为待发射指令地址(源地址),域703为发射时间点地址,域705为发射时间点指针编号,域707为待发射指令类型,域709为轨道表表项内容。从先入先出读出时701用于指向指令缓冲器116指出待发射的指令。域703为发射时间点的BN1Y地址,域705为发射时间点的循迹器指针编号,例如主循迹器编为‘0’,数据循迹器为‘1’。域707为域701所指向的指令的类型,如类型‘0’指令为‘0’,类型‘1’指令为‘1’。如此在由域705记录的循迹器指针到达域707所示的地址时,由域701指出的指令,即根据域707指示的类型向EB流水线或主流水线发射。其中,域709的内容适用于图18的结构,即轨道表110与域701中地址相应的表项内容存于此域,以供发射时调用。图19、20、23、24、25中使用的先入先出198与先入先出196的表项格式类似,但没有域709。因为这些实施例中都有轨道读缓冲178,存有整条轨道各表项。由域701(即上述这些实施例中指针319)指向轨道读缓冲178即可读出表项内容供调用。

请参考图20,其为本发明所述两层缓存的缓存系统的另一个实施例。在本实施例中,用先入先出198代替了图18中的先入先出196,并增加了一个轨道读缓冲(Track Read Buffer,TRB)178。在此,轨道读缓冲178中存储了指令读缓冲116中指令块对应的轨道,即指令读缓冲116中的指令块和轨道读缓冲178中的轨道一一对应。

数据循迹器320的读指针315对轨道表110寻址,同时读指针315上的BN1被存储到先入先出198中。这样,与图18实施例类似,读指针315可以不必等待处理器核102执行到分支指令或数据访问指令,而直接继续移动指向后面的分支点或数据点。此外,根据先入先出198输出的源BN1可以从轨道读缓冲178中读出对应该源BN1的分支目标BN1或数据的DBN1,因此在本实施例中可以不必如图18实施例中的先入先出196那样存储一个完整的BN对,而是只需要存储源BN1即可。

与图19A实施例类似,在读指针315对轨道表110寻址的过程中,当移动到一条轨道的结束轨迹点时,从总线417读出的结束轨迹点内容中的下一轨道BN1X及常数‘0’对数据循迹器320读指针315进行更新,使得读指针315能够指向轨道表110中的下一轨道的第一个轨迹点,从而继续移动指向下一个分支点或数据点。与图18实施例类似,一旦先入先出198满,则读指针315暂停移动,直到先入先出198不满时再继续移动。在此移动过程中,若从轨道表110中读出的轨迹点内容是BN2,则可以如前送往主动表160转换为BN1后再写回该轨迹点。

在本实施例中,先入先出198中存储的是先入先出196中存储的BN对中的源BN1。与图18实施例中的先入先出196类似,先入先出198输出的源BN1被送到同步模块212。此外,该输出的源BN1还被送到TRB 178用于读出相应的分支点或数据点内容。

轨道读缓冲178在先入先出198输出的源BN1的寻址下,通过总线317输出相应的轨迹点内容。若该轨迹点是分支点,则该分支点内容中的分支目标BN1X通过总线317被送到一级指令缓存104寻址找到相应指令块。若该分支转移发生,则该分支点内容中的分支目标BN1X通过总线317对主循迹器120读指针115和数据循迹器320读指针315进行更新。更新后的读指针315对一级指令缓存104的指令块和轨道表110的行寻址读出相应分支目标指令块和轨道并分别通过总线103和417填充到指令读缓冲116和轨道读缓冲178中对应的位置。这样,读指针115和315均指向所述分支目标指令或轨迹点,且所述分支目标指令块和相应轨道均已准备好。之后的操作与前述实施例相同,在此不再赘述。当然,也可以不必等到读指针315被更新为所述分支目标BN1后再从一级指令缓存104和轨道表110中读出相应分支目标指令块及轨道,而是可以用轨道读缓冲178输出的所述分支目标BN1对一级指令缓存104的指令块和轨道表110的行寻址,提前读出分支目标指令块和轨道并分别填充到指令读缓冲116和轨道读缓冲178中。在具体实现中可以增加一个选择器对读指针315中的BN1X和轨道表178输出的分支目标BN1X进行选择后再对一级指令缓存104的指令块和轨道表110的行寻址,读出对应的轨道。另一方面,若分支转移没有发生,则先入先出198输出下一个源BN1,继续上述过程。

若先入先出198输出的源BN1的寻址下指向的轨迹点是结束轨迹点,则该结束轨迹点中的下一轨道BN1X通过总线317对主循迹器120读指针115和数据循迹器320读指针315更新,并用更新后的读指针315对一级指令缓存104的指令块和轨道表110的行寻址读出相应指令块和轨道,再分别通过总线103和417填充到指令读缓冲116和轨道读缓冲178中,使得读指针115和315均指向所述下一指令块或轨道的第一条指令或轨迹点,且所述下一指令块和相应轨道均已准备好。之后的操作与前述实施例相同,在此不再赘述。

若先入先出198输出的源BN1的寻址下指向的轨迹点是数据点,则该数据点内容中的DBN1和Stride通过总线317被送到数据引擎208。之后的操作与前述实施例相同,在此不再赘述。

此外,在本实施例中,主流水线、数据流水线和分支流水线的运行过程与前述实施例相同,即主循迹器120读指针115控制指令读缓冲116向主流水线提供指令(非分支指令且非数据访问指令),数据循迹器320读指针315经先入先出198暂存后控制指令读缓冲116向数据流水线提供分支指令或数据访问指令,具体过程在此不再赘述。

请参考图21,其为本发明所述两层缓存的缓存系统的另一个实施例。在本实施例中,增加了一个领先循迹器(Look ahead Tracker,LTR)520,去除了图20实施例中的先入先出198。

领先循迹器520的结构与数据循迹器320完全相同,包含选择器(对应数据循迹器320中的选择器318)、寄存器(对应数据循迹器320中的寄存器312)和增量器(对应数据循迹器320中的增量器314),其输出为读指针515(对应数据循迹器320的输出读指针315)。领先循迹器520的作用相当于图20实施例中的数据循迹器,其读指针515可以不必等待处理器核102执行到分支指令或数据访问指令,而直接继续移动指向后面的分支点,并将其中包含的BN2如前所述替换为相应的BN1。

本实施例中的数据循迹器320的读指针315则指向主循迹器120读指针115指向的轨迹点之后的第一个分支点或数据点,即向轨道读缓冲178输出源BN1。因此本实施例中读指针315相当于图20实施例中先入先出198的输出。相应地,在本实施例中,读指针315和115被送到同步模块用于判断分支指令或数据访问指令的发射时间点,其实现的功能与图20实施例中相同。

在读指针515对轨道表110寻址的过程中,当移动到一条轨道的结束轨迹点时,从总线417读出的结束轨迹点内容中的下一轨道BN1X及常数‘0’对数据循迹器520读指针515进行更新,使得读指针515能够指向轨道表110中的下一轨道的第一个轨迹点,从而继续移动指向下一个分支点或数据点。在此,由于用数据循迹器320实现了先入先出198的功能,因此不存在先入先出198满的情况,因此读指针515不会暂停移动。此外,当分支转移发生时,除了如前所述将读指针115和315更新为分支目标BN1外,还需要将读指针515也更新为分支目标BN1。具体地,该分支目标BN1经总线317、选择器被存储到领先循迹器520的寄存器中,使得读指针515的值被更新为该分支目标BN1。之后,领先循迹器520读指针515从该BN1开始继续不断移动指向后面的分支点,并将其中包含的BN2如前所述替换为相应的BN1。

根据本发明技术方案,还可以将主流水线及数据流水线进一步划分为前端流水线和后端流水线,两者以产生分支指令所需源操作数(执行分支指令时根据所述源操作数可以产生分支转移结果)的流水线段作为后端流水线的第一段,该段之前的流水线段均属于前端流水线,其后的流水线段均属于后端流水线。具体地,以前述实施例中的主流水线为例,E段就是产生所述源操作数的流水线段,因此主流水线中的前端流水线包含I段和D段,后端流水线包含E段和W段。相应地,在数据流水线中,前端流水线包含I段和D段,后端流水线包含G段、T段、M段和W段。这样,在主流水线和数据流水线中各增加了一个前端流水线,从而在分支指令的分支转移结果产生前,由不同的前端流水线分别执行分支指令的顺序地址下一指令和分支目标指令,以及它们的后续指令。当分支转移结果产生后,再相应选择这两条前端流水线中的一条的结果送到后端流水线继续执行。这样,无论分支转移是否发生,主流水线都不会因该分支指令而暂停或产生气泡。

请参考图22A,其为本发明所述包含两个前端流水线的流水线的一个示意图。在本实施例中,指令I1、I2、I3、I4、I6、T6、I7、T7、I8和T8是算术逻辑运算指令,由主流水线执行,各经过4个流水线段;指令I5是直接分支指令,由分支流水线执行,经过3个流水线段。此外,指令I6、I7和I8是直接分支指令I5的顺序地址后续指令,指令T6、T7和T8是分支指令I5的分支目标指令及后续指令

根据本发明技术方案,当数据循迹器320读指针315指向该分支点时,该分支点对应的顺序地址下一指令已经存储在指令读缓冲116中,其分支目标指令已经存储在一级指令缓存104(此时分支点内容为BN1)或二级缓存108(此时分支点内容为BN2)中。如前所述,若分支点内容为BN2,则可以提前将分支目标指令所在指令块填充到一级指令缓存104中并将分支点内容更新为相应的BN1。这样,当同步模块212检测到主循迹器120读指针115与数据循迹器320读指针315之差大于等于‘-3’时,分支点的顺序下一指令和分支目标指令均已经准备好可以分别供处理器核102的两个前端流水线执行。

本实施例对执行分支指令时的最差情况(即分支指令I5与指令I4存在寄存器相关性)进行说明。对于较好的情况,也可以进行类似的操作。具体地,如图22A所示,分支指令I5提前3个周期被送到分支流水线执行,即在指令I2进入主流水线I段的同时,指令I2进入分支流水线的I段。此后的两个周期,指令I3和I4依次进入主流水线的I段。由于指令I5与I4存在寄存器相关性,因此分支流水线中指令I5的D段被延迟了3个周期再发射。然而,在本实施例中由于主流水线具有两个前端流水线,因此不会因分支流水线中的延迟而产生气泡,即在指令I4发射进入主流水线I段的后一个周期,指令I6和T6各自发射进入主流水线中的当前前端流水线和目标前端流水线的I段。下一周期,指令I7和T7分别发射进入当前前端流水线和目标前端流水线的I段,与此同时指令I6和T6分别发射进入当前前端流水线和目标前端流水线的D段。

利用图16C或图16D实施例所述的方法,提前在主流水线中指令I4的E段时即可得到分支转移结果,这样主流水线可以不必等待,直接根据分支转移结果选择指令I6或T6的D段执行结果送往后端流水线。具体地,若分支转移没有发生,则选择指令I6的D段执行结果送往后端流水线;若分支转移发生,则选择指令T6的D段执行结果送往后端流水线。

此外,根据该分支转移结果,还可以只保留一条前端流水线继续工作,相应选择指令I7或T7的I段送到D段继续执行,并相应获取指令I8或T8中的一个送到主流水线I段执行。具体地,若分支转移没有发生,则当前前端流水线继续工作,将指令I7的I段执行结果送往D段继续执行,并获取指令I8送到当前前端流水线的I段执行,而目标前端流水线可以不再工作;若分支转移发生,则目标前端流水线继续工作,将指令T7的I段执行结果送往D段继续执行,并获取指令T8送到目标前端流水线的I段执行,而当前前端流水线可以不再工作。这样,采用图16C或图16D实施例所述方法判断分支转移结果,在最差情况下主流水线中也不会产生气泡。

请参考图22B,其为本发明所述包含两个前端流水线的流水线的另一个示意图。本实施例与图22A实施例基本相同,不同之处在于指令I5是间接分支指令,该指令在进入分支流水线后,需要如前所述利用数据流水线由数据引擎208计算分支目标地址。即利用数据流水线的G段计算分支目标地址,并利用数据流水线的T段将该分支目标地址转换为BN1。

在本实施例中,由于分支目标BN1由数据流水线的T段产生,而分支转移结果由分支流水线的B段产生,且用于计算分支目标地址的寄存器与用于判断分支转移结果的寄存器可以不同,因此数据流水线与分支流水线可能发生的寄存器相关性可以不同,即数据流水线与分支流水线中的气泡数量可以不同。

如图22B所示,当指令I5在数据流水线中用到的寄存器与其之前指令不存在相关性时,数据流水线的T段就可以与指令I4的D段同时完成,并提供分支目标BN1(对应指令T6),这样,在下一周期,指令I6和T6可以进入主流水线的I段。相应地,如果指令I5在数据流水线中与其之前的指令存在寄存器相关性,则数据流水线中会产生相应周期数的延迟,使得指令I6和T6进入主流水线的时间点相应延后,但仍可能比用主流水线执行间接分支指令所产生的气泡(分支延迟)要少。具体情况可以参考本实施例及前述实施例推导,在此不再赘述。

参考图22A实施例,分支流水线中的B段只需要在其后续指令(即I6和T6)的E段前完成即可,因此在本实施例中,分支流水线中即使产生了3个周期的延迟,其B段都可以在指令I6和T6的E段前完成。在这种情况下,指令I4的E段先于指令I5的B段完成,因此指令I5在分支流水线中与其之前的指令无论是否存在寄存器相关性,分支转移结果均能在后续指令的E段前产生,即分支流水线中的延迟不会造成主流水线的额外气泡。

当前,也可以做进一步改进,使得指令I6和T6不在同一时间点进入主流水线的I段。由于指令I6是顺序下一指令,其BN1在指令I5执行前已经可知,因此指令I5可以在指令I4进入主流水线D段的同时进入I段。但指令T6必须在指令I5的数据流水线T段的下一周期才能进入主流水线的I段,使得指令T6比指令I6晚一个周期进入I段。这样,当分支流水线中的延迟不超过两个周期时,若分支转移没有发生,则选择指令I6的D段送到后端流水线的E段继续执行,使得主流水线中跳过分支指令I5;若分支转移发生,则选择指令T6的I段送到D段执行,并在下一周期再送往后端流水线的E段继续执行。具体操作可以参考前述实施例进行,在此不再赘述。

为了实现图22A和图22B所示的功能,主流水线和数据流水线均需要两个前端流水线,并将循迹模块190修改为相应的调度器(Scheduler)。具体地,在主流水线的当前前端流水线中执行分支指令顺序地址下一指令及其后续指令中的非分支且非数据访问指令,在数据流水线的当前前端流水线中执行分支指令顺序地址下一指令及其后续指令中的分支指令或数据访问指令;在主流水线的目标前端流水线中执行分支指令的分支目标指令及其后续指令中的非分支且非数据访问指令,在数据流水线的目标前端流水线中执行分支指令的分支目标指令及其后续指令中的分支指令或数据访问指令。

请参考图23,其为本发明所述调度器的一个实施例。支持双前端流水线的处理器结构见图23、24、25,都以图20中的循迹模块190的类似结构为例,其他结构的调度器也都可以适用,在此不再赘述。以下将两条前端流水线分别称为流水线A与流水线B。两条前端流水线所使用的功能块是一样的,所以两条前端流水线相互之间对称(symmetric),在任意时刻,由控制器指定一条流水线为当前前端流水线,另一条则为目标前端流水线。为清楚分辨,图中功能模块号及连接线号后缀0属A前端流水线,后缀1属B前端流水线。请参见图23,其为支持双前端流水线,同时发射分支后的指令(fall-through instruction)与分支目标指令(branch target instruction)及其后续指令所使用的调度器392。每条前端流水线各有自己的专属调度器。与图20中的实施例相比,主要是增加了选择器322,用于选择本流水线中轨道读缓冲(TRB)178的输出以及另一流水线中的轨道读缓冲(TRB)178的输出一供本调度器中的各个循迹器使用。

选择器322通常选择本流水线的轨道读缓冲(TRB)178的输出。当先入先出先入先出198的地址输出指向轨道读缓冲(TRB)178中结束轨迹点时,轨道读缓冲(TRB)178中读出的结束轨迹点经选择器322到达主循迹器(MTR)120与轨道循迹器(DTR)320供其中的寄存器锁存以更新读指针115及315,控制一级指令缓存104向指令读缓冲116填充下一顺序指令块;及控制轨道表110向轨道读缓冲(TRB)178填充下一顺序轨道。此处为简明起见,假设指令读缓冲116及轨道读缓冲178都有旁路功能即可在被填充的同时向处理器核102,及数据引擎208,分支处理器170,主循迹器(MTR)120,数据循迹器(DTR)320等同时提供由指针指向的指令及轨道表表项内容。如果由轨道读缓冲(TRB)178的输出由总线317不经循迹器,直接旁路用于向一级指令缓存104和轨道表110寻址则指令读缓冲116及轨道读缓冲178可以不具有旁路功能。

当前前端流水线的轨道读缓冲(TRB)178读出一个非结束轨迹点的分支点时,控制器610(见图25中)产生的控制总线677会控制目标前端流水线中的选择器322选择当前前端流水线,即另一条前端流水线中轨道读缓冲(TRB)178的输出经总线317填充入目标前端流水线中的主循迹器(MTR)120及数据循迹器(DTR)320,更新其读指针115及315指向一级指令缓存104中分支目标指令所在的指令块及轨道表110中相应的轨道,将其填充进分支目标调度器392中的指令读缓冲116及轨道读缓冲(TRB)178。其后在同步模块判定的时间点向数据引擎208或处理器核102发射分支目标及后续指令。控制器610通过总线677控制两个调度器中的选择器322及主循迹器120与数据循迹器320中的选择器,与处理器核产生的流水线段状态反馈111共同控制主循迹器120及数据循迹器320中的寄存器。

此外,调度器392中的同步模块212也与图20中的不同,其部分功能由控制器610执行,这是因为在有两条前端流水线的情况下,目标前端流水线发射的前三条指令其发射时机可能是基于当前前端流水线中的循迹器指针以确定。目标前端流水线上的类型‘1’指令的相关性检测可能也既要检测当前前端流水线中分支指令之前的类型‘0’指令,也要检测目标前端流水线上的类型‘0’指令。同一条前端流水线中的类型‘1’指令及分支目标及其后续指令的发射采用图19的实施例中的方式以及先入先出198的格式。其中,域705中的发射时间点指针编号为2位,代表4个不同的指针。

在本实施例的流水线中,其相关检测有三种情况:其一,分支目标指令本身是类型‘1’指令,在这种情况下需要查分支指令之前的两条类型‘0’指令与分支目标指令之间的相关性;其二,分支目标指令后一条指令是类型‘1’指令,在这种情况下要查分支目标指令及分支指令前一条类型‘0’指令与分支目标后一条指令之间的相关性;其三,分支目标指令后第二条指令是类型‘1’指令,在这种情况下要查其与分支目标指令及分支指令后一条类型‘0’指令之间的相关性。

请参见图24,其为本发明所述支持双前端流水线的处理器的一个结构图。此结构与图20中结构相似,差异处是增加了一个调度器共为2个调度器3920及3921,且这两个调度器的结构与图23中调度器392相同;处理器核中增添了一条前端流水线与原有的流水线各自由调度器3920经由总线1010提供指令,及由调度器3921经总线1011提供指令。控制器610接收分支单元170及两个调度器中指针115、315及同步模块212的输入及处理器核104与数据引擎208的状态(为使图简单明了除来自170的以外均未画出),通过总线677控制两个调度器3920,3921,分支单元179与数据引擎208的操作。另外,增设了选择器342选择来自两个调度器392的总线3150及3151,以控制一级指令缓存104向相应调度器中的指令读缓冲116填充指令块,及控制轨道表110向相应调度器中的轨道读缓冲178填充轨道。增设了选择器338以选择来自两个调度器392的总线1250及1251,向处理器核提供寄存器堆地址以及向数据引擎208提供类型‘1’指令。选择器132也由图20中的二选一增加到三选一以接受增设的调度器的输出3171以控制一级数据缓存204的访问。

另外,此时轨道表110的输出被通过417送出,其功能是向主动表160传送BN2以转换为BN1及向两个调度器中的轨道缓冲器1780及1781填充轨道。两个调度器输出的3170或3171总线除如图20中例,送往数据引擎以外,还被用于向另一个调度器提供分支目标地址BN1以填进其主循迹器(MTR)120与数据循迹器(DTR)320中的寄存器,使其相应读指针指向相应目标。定义A流水线中主循迹器的指针1150,其发射时间点指针编号为‘00’;数据循迹器3200其编号为‘01’;定义B流水线中主循迹器的指针1151,其发射时间点指针编号为‘10’;数据循迹器3201其编号为‘11’。图中写缓冲620位于从处理器核写回一级数据缓存204的路径上。其他的模块与总线都与图20中相同。

请参见图25,其为本发明所述支持双前端流水线的处理器的流水线的一个示意图,与图24中的结构图相应。与图11与图16中的流水线示意图类似,图25也分为下部的主流水线与上部的数据流水线,但是上述两条流水线中各自有两条前端流水线A与B。其中,主流水线中的两条前端流水线从轨道读缓冲178X(此处‘X’可以为‘0’或‘1’)经选择器322X到主循迹器120X,指令读缓冲116X(I段)到寄存器堆182(D段)中都有各自独立的流水线资源,直到由旁路选择器186在分支判断控制下从前端流水线A专用的寄存器堆输出185和前端流水线B专用的寄存器堆输出183中选择其一送往后端流水线中的执行单元188(E段)执行运算,其执行结果写回寄存器堆(W段)。在数据流水线中则A、B流水线各有其独立的数据循迹器320X与指令读缓冲116X(I段,是主流水线中的读缓冲116的另一个读口)。为支持双前端流水线操作,前端流水线相应的各总线也被复制(duplicated),各有两份。其他模块与图11与图16中模块功能相同。

轨道表110的输出经总线417被送往两个前端流水线中的轨道读缓冲178X,即A前端流水线中的轨道读缓冲1780及B前端流水线中的轨道读缓冲1781存储。以流水线A为例说明,先入先出1980(即图23中的先入先出198)中读出的指针3190指向轨道读缓冲1780,从中读出轨道表项内容经总线3170送往选择器3220,也送往选择器132以控制一级数据缓存204的访问。轨道表项内容经选择器3220选择后经总线3230送往主循迹器1200及数据循迹器3200。主循迹器1200的输出读指针1150指向指令读缓冲1160,控制从其中循序读出指令,经总线1011送往处理器核102供执行,包括对指令进行译码及根据指令中的寄存器地址读出寄存器堆内容,经A流水线专用读口185送往旁路逻辑186供选择。当有分支指令时,B前端流水线对分支目标及后续指令也作相似操作。根据分支单元170的分支判断与前端流水线的状态(哪条流水线是当前前端流水线),控制器610控制旁路单元186选择A或B流水线的指令操作码及从相应寄存器堆读口送出的操作数供执行单元188作相应操作并将结果写回旁路单元186和192及寄存器堆182。

图25上方的数据流水线的两条前端流水线各仅含有I流水线段。仅在由控制器610输出的总线677控制的选择器338开始的共用后端流水线则含有D、G、T、M、W各流水线段。仍以A前端流水线段说明,其中数据循迹器3200接受由选择器3220的输出3230,其输出读指针3150控制对轨道表110的访问,也被送入先入先出1980。先入先出1980的输出指针3190控制读取轨道读缓冲1780及指令读缓冲1160中的一个读口。任一时钟周期中两条指令读缓冲1160与1161输出的指令1250及1251由选择器338选择其中一条供后端流水线中分支单元170及数据引擎208使用。未执行到分支指令之前,两条前端流水线中只有当时被指定为当前前端流水线的前端流水线与后端流水线在执行当前指令段(另一条前端流水线在准备发射分支目标指令),此时因此条指令控制器610通过总线677控制选择器338选择当前前端流水线。当分支指令被提前发射时,此指令经总线338选择后经总线1125进入分支单元170作分支判断。

此后控制器610根据数据流水线上前端流水线A或B上的类型‘1’指令的状况仲裁选择某一条流水线,其规则是如两条流水线中只有一条有类型‘1’指令从指令读缓存116的读口输出则选该条流水线;如两条流水线同时有类型‘1’指令要发射,则根据仲裁规则(比如当前前端流水线优先)发射。另一条流水线上的指令则被延迟一周发射。这种情形可能会最终在主流水线中导致一个气泡。尤其是当两条前端流水线都有连续的类型‘1’指令(如:数据访问指令)时,则会产生更多的气泡。可以复制另一个数据引擎同时在寄存器堆182中再增加一套供该引擎使用的读口使两个EB前端流水线各控制一个读口。使选择器338仍选择送往分支判断器170的指令,但两个数据引擎和寄存器堆的两个读口各自接受从A或B前端流水线中指令读缓冲116中读口输出的指令1250及1251控制,并行处理。这样可以在两个读引擎的输出处增设一个选择器,其输出作为总线211送往主动表160中标签164,则可使前端流水线增多两个流水线段(D段读寄存器堆及G段数据引擎计算数据访问地址)以减少主流水线中的可能气泡数。如果主动表160及一级数据缓存204都有双口,则可以延至在一级缓存器204的两个输出处作选择,此时按本流水线的设置则分支判断已作出,如此则完全不会因为数据流水线中的资源冲突而在主流水线中产生任何气泡。在这种情况下,整个数据流水线都含有两条独立的具有I、D、G、T、M、W的完整流水线,而没有后端流水线。在此不再赘述。

A主流水线的操作是由主循迹器1200控制循序读取指令读缓冲1160,每一周期向处理器核102发射一条类型‘0’指令。数据流水线的操作是由先入先出1980的读口上的类型‘1’指令地址作为指针3190,在控制器610判断适当的时刻向数据流水线提供该指针3190指向的指令读缓冲1160内的指令及相应的轨道读缓冲1780中的表项内容发射类型‘1’指令及其辅助内容(如分支时的分支目标地址BN1,或数据访问时使用的DBN1、Stride等)。B流水线的操作也相同。

以下以图25为例,说明具有双分支前端的处理器的分支操作过程。初始状态以A前端流水线为当前前端流水线,B前端流水线为目标前端流水线。A流水线中主循迹器1200的输出指针1150控制指令读缓冲1160经总线1010发射一条类型‘0’指令。其后每个时钟周期指针1150增‘1’,顺序发射类型‘0’指令。先入先出1980的输出指针3190从指令读缓冲1160内的指令及相应的轨道读缓冲1780中读出类型‘1’指令及相应的表项内容准备发射。连接在轨道读缓冲1780的输出3170上的译码器(图中未显示)检测该指令类型为直接分支并通知控制器610。此时,选择器338选择A前端流水线中的指令读缓冲1160提供的指令1250放上总线1125。控制器610根据该类型‘1’指令类型为直接分支指令,经总线677控制B前端流水线中选择器3221选择A前端流水线中轨道读缓冲1780的输出3170放上总线3231,并控制B流水线的主循迹器1201及数据循迹器3201将总线3231上的分支目标锁存。选择器342(见图24)选择上述数据循迹器3201的读指针3151上的BN1X控制将一级指令缓存104中含有分支目标的指令块存入指令读缓冲1161,将轨道表110中分支目标所在轨道存入轨道缓冲器1781。

此时,B流水线中同步模块开始计算分支目标的发射时机。如果分支目标是类型‘1’指令,则当前前端流水线(即A前端流水线)中的主循迹器指针1150与目标前端流水线(即B流水线)中数据循迹器指针3151距离为‘3’时,即由控制器610控制选择器338选择1251上的类型‘1’指令发射至数据引擎208等。此时,同步逻辑会根据此指令为类型‘1’指令使B流水线中主循迹器的指针1151越过这条指令(也可以如前述发射后由处理器核中的译码器判断为类型

‘1’指令而当空指令执行)。如果分支目标是类型‘0’指令,则当前前端流水线(即A前端流水线)中的主循迹器指针1150与目标前端流水线(即B流水线)中数据循迹器指针3151距离为‘1’时,即经处理器核中的1010总线发射类型‘0’指令。

假设分支目标及其后的两条指令都是类型‘0’指令,B流水线中同步模块据此读出A流水线中指针3190中的BN1Y值(假设为6),以此值减‘1’得到发射点的源地址(5),并请A流水线中的相关性检测单元检测出该指令为类型‘0’指令,即将该源地址及该源地址会出现的指针(此处为1150)的编码(‘00’)及发射指令种类(类型‘0’)存入先入先出1981中的发射点域。读指针3151上的地址(即原来从3170总线读出的分支目标地址)BN1也经先入先出1981传递至指针3191,从轨道读缓冲1781中读出分支目标的信息(因为是类型‘0’指令,所以无相应信息)。上述主循迹器1201的指针1151中的BN1Y从指令读缓冲1161中读出分支目标指令准备供处理器核中的B前端流水线执行。

此时,B前端流水线的数据流水线与主流水线皆已作好发射分支目标指令的准备。当A流水线主循迹器1200的读指针1150其BN1Y到达‘3’时,分支指令(其BN1Y地址为‘6’)A流水线上的同步模块判断分支指令发射时机已到,即通过控制器610通知分支单元170,已放在总线1125上的指令有效,分支处理器170中的指令译码器对分支判断类型译码进入判断流程。在A流水线执行完分支指令前的最后一条类型‘0’指令后(其源地址BN1Y=‘5’),下一周A流水线上的主循迹器1200越过分支指令开始循序执行分支指令后的后续指令。同时目标前端流水线也开始经总线1011向处理器核102发射分支目标指令及其后的指令,直到处理器核102反馈分支目标(B)前端流水线已被填满。同时,A流水线中先入先出1980的读指针向前移动指向先入先出中下一个地址BN1,以此为指针3190从轨道读缓冲1780上读出下一个类型‘1’指令的表项内容,根据其中的指令类型判断为又一条分支指令;指针3190也从指令读缓存1160中读出该分支指令放上总线1250供选择器338选择。实际操作中只要能保证相关性受到适当的检测,控制器610可以使目标指令在目标前端流水线中早于分支指令后续指令开始执行,避免两条数据流水线中都有类型‘1’指令导致的数据流水线后端资源冲突。

假设分支判断器170对上述正在执行的第一条分支指令判断结果为分支不成功,则A流水线状态仍为当前前端流水线继续执行;旁路逻辑186选择A流水线的寄存器读口185提供的操作数和/或总线203上的数据或总线191上的前一周期执行结果提供给执行单元188执行。同时,选择器338选择A流水线将已在1250上的第二条分支指令放上总线1125;来自B流水线中的两个循迹器都停止操作并将B流水线中的先入先出1981清空。下一时钟周期控制器610如前控制将先入先出1980指针3190指向的A流水线中轨道读缓冲1780的输出3170(此时为第二条分支指令的分支目标地址)经选择器3221送往B流水线的两个循迹器锁存。假设此时分支目标本身是类型‘1’指令,即如前计算出其发射时机(此时应是‘-3’),作相关性检测以确定当前前端流水线中最终发射地址及循迹器编号(例如发射时机应是在当前前端流水线BN1Y=‘2’时,但该条指令与分支目标指令有相关性,但其后的指令都不具相关性,则确定BN1Y=‘3’;但BN1Y=‘3’的指令是类型‘1’指令;故循迹器编号是数据循迹器3200的编号‘01’),将‘3’与‘01’及分支目标类型‘1’被存入先入先出1981的发射时机域。该域连同B流水线上数据循迹器3201的输出3151被送进先入先出1981。如前例相应的含有分支目标的指令块及相应轨道被填充入指令读缓冲1161及轨道读缓冲1781并由先入先出1981的输出组成3191指向并读出,分支目标指令在B流水线中已准备好发射。

根据此时A流水线上先有类型‘1’指令(即第二条分支指令),控制器610控制选择器338仍选择循迹器1160的输出放上总线1250送往数据引擎208等。当A流水线轨道循迹器3200的指针3150的值等于‘2’时(分支指令源地址BN1Y为‘5’),A流水线上的同步模块也判断分支指令发射时机已到,即通知分支单元170,已放在总线1125上的指令有效。分支处理器170中的指令译码器对分支判断类型译码进入判断流程。此后A流水线继续循序执行分支指令之前与之后的类型‘0’指令(分支指令本身是提前发射)。当指针3150的值等于‘3’时,B流水线上的同步模块212也判断分支目标指令发射时机已到,此时控制器610控制选择器338选择总线1251上的值放上总线1125并通知数据流水线上各功能模块总线1250上指令有效,各功能模块开始译码、操作。先入先出1981的输出3191也指向B流水线中轨道缓冲器1781中的下一个类型‘1’指令内容。由此B流水线如前例一直执行直到B前端流水线已满。此时A流水线如前在继续发射分支指令的后续指令。如此时后续指令中有类型‘1’数据访问指令,则可以在控制器610的仲裁下发射。

如此时分支判断器170判断为分支成功,则控制器610控制旁路逻辑186选择B流水线的寄存器堆读口185或总线203上的B流水线上的数据访问结果或总线191上的上一周期,其执行结果供后端流水线执行。B流水线上的循迹器1201及3201继续正常操作,而A流水线上的循迹器1200及3200停止操作,其先入先出1980被清空。控制器610也将B前端流水线状态设为当前前端流水线,而A前端流水线设为目标前端流水线。据此控制器610通过总线677将选择器338设为缺省选择1251。如B流水线中先入先出1981的输出指针3191指向的轨道读缓冲1781中的下一条类型‘1’指令是分支指令,则控制器610也控制A前端流水线中的选择器3220选择B前端流水线中轨道读缓冲1781的输出3171放上总线3230并锁存进主循迹器1200及数据循迹器3200。该两个循迹器的输出指针1150及3150也依前例从一级指令缓存104中读出含分支目标的指令块存入A流水线中指令读缓冲1160,从轨道表110中读出相应的轨道存入A流水线中轨道读缓冲1780,并依前例作好发射分支目标及其后续指令的准备。如此周而复始,所述双前端流水线处理器在处理分支指令时不会有分支预测错误,也不会有分支惩罚。此外,分支指令本身不占处理器周期。

下面再以图21实施例所述包含三个循迹器的循迹模块为基础得到的调度器为例进行说明。本实施例对应的处理器系统的结构与图24类似,不同之处在于调度器与图21中循迹模块相比,也增加了一个选择器322用于对轨道读缓冲178输出的BN1和从调度器外部经总线3170送来的BN1选择后对主循迹器120、数据循迹器320和领先循迹器520的读指针进行更新。具体结构可以参考图23中调度器对图20中循迹模块的修改推导得到,在此不再赘述。此外,为了与图23、图24和图25不发生混淆,在本实施例中,将两个调度器分别称为调度器392(A)和调度器392(B),分别对应前端流水线A和前端流水线B。此外,在调度器392(A)的相关器件或总线后增加一个‘(A)’,如:轨道读缓冲178(A)、总线125(A)等,用于表示该器件或总线属于调度器392(A)或前端流水线A;在调度器392(B)的相关器件或总线后增加一个‘(B)’,如:轨道读缓冲178(B)、总线125(B)等),用于表示该器件或总线属于调度器392(B)或前端流水线B。

下面结合图26做进一步说明。请参考图26,其为本发明所述包含两个前端流水线的缓存系统执行程序的一个实施例。图26显示了三条轨道,分别为轨道P(BN1X为‘18’)、轨道Q(BN1X为‘21’)和轨道R(BN1X为‘63’),每条轨道对应一个指令块。每条轨道包含‘0’到‘15’共16个轨迹点,每个轨迹点对应一条指令,例如轨迹点Q0对应指令Q0、轨迹点Q1对应指令Q1,等等。在图26中用叉代表分支点,如:分支点P6(BN1为‘1806’)、分支点Q4(BN1为‘2104’)和分支点Q10(BN1为‘2110’);用三角代表数据点,如:数据点P2(BN1为‘1802)、数据点Q5(BN1为‘2105’)、数据点Q14(BN1为‘2114’)和数据点R8(BN1为‘6308);用圆圈代表最后更新分支点所用寄存器值的指令对应的轨迹点,如:轨迹点Q3(BN1为‘2103’)和轨迹点Q9(BN1为‘2109’)。其中,轨迹点Q3与分支点Q4存在寄存器相关性,轨迹点Q9与分支点Q10存在寄存器相关性。此外,为了便于说明,在本实施例中假设数据点P2、Q5、Q14和R8与其之前的指令均不存在寄存器相关性。对于其他情况也可以参考本发明技术方案,按类似方法处理,在此不再赘述。

在本实施例中,首先因分支转移的发生,使得对应当前前端流水线的主循迹器120读指针115和数据循迹器320读指针315均指向轨道Q的第一个轨迹点Q0,并沿轨道Q依次执行相应指令,且分支点Q4的分支转移没有发生、分支点Q10的分支转移发生,转移进入分支目标轨迹点P1继续执行依次相应指令。

为了便于描述,在本实施例中省略了对调度器392(A)中的读指针515(A)和调度器392(B)中的读指针515(B)如前从Q0开始提前移动并将分支点中的BN2替换为相应的BN1的相关说明。假设当由于分支转移而进入轨道Q的第一个轨迹点Q0时,前端流水线A为当前前端流水线。可以同时参考图27,其为本发明所述包含两个前端流水线的流水线的另一个示意图。图27中显示了在本实施例运行过程中,每个周期的流水线状态。

在第一个周期,循迹模块392(A)中读指针115(A)和315(A)的值均为‘2100’,指向轨迹点Q0(该轨迹点为类型‘0’)。指令读缓冲116(A)根据读指针115(A)寻址,向处理器核102输出类型‘0’的指令Q0供主流水线中的前端流水线A执行。由于此时读指针315(A)指向类型‘0’的轨迹点,因此同步模块212(A)中的寄存器552(A)的值被复位为‘1’。

在第二个周期,读指针115(A)如前所述增一得到‘2101’,对指令读缓冲116(A)寻址,读出指令Q1到主流水线中的前端流水线A执行。而读指针315(A)则如前所述提前移动并指向类型‘1’轨迹点Q4。由于此时读指针115(A)与读指针315(A)之差为‘-3’,因此指令读缓冲116(A)在读指针315(A)的寻址下,输出分支指令Q4送往分支流水线的前端流水线A执行。同时,轨道读缓冲178(A)在读指针315(A)的寻址下输出的分支目标BN1中的BN1X经总线317(A)对一级指令缓存104和轨道表110寻址,分别读出分支目标指令块经总线103送往循迹模块392(A)填充到指令读缓冲116(A)中,以及读出分支目标轨道经总线317(A)送往循迹模块392(B)填充到轨道读缓冲178(B)中。该分支目标BN1(‘6305’)还经总线317(A)被送到循迹模块392(B)用于更新读指针115(B)、315(B)和515(B)。由于此时读指针315(A)指向类型‘1’的轨迹点,同步模块212(A)中的寄存器552(A)的值如前增一得到‘2’。

在第三个周期,读指针115(A)如前所述增一得到‘2102’,对指令读缓冲116(A)寻址,读出指令Q2到主流水线中的前端流水线A执行。由于类型‘1’的指令Q4已经发射,因此读指针315(A)如前所述移动到下一个类型‘1’的轨迹点Q5。又由于此时读指针115(A)与读指针315(A)之差为‘-3’,因此指令读缓冲116(A)在读指针315(A)的寻址下,输出数据访问指令Q5送往分支流水线的前端流水线A执行。由于此时读指针315(A)指向类型‘1’的轨迹点,同步模块212(A)中的寄存器552(A)的值如前增一得到‘3’。此外,由于分支指令Q4与指令Q3存在寄存器相关性,因此在分支流水线A中插入了一个气泡使得指令Q4的D段被延迟发射。同时,在循迹模块392(B)中,读指针315(B)如前所述移动到下一个类型‘1’的轨迹点R8。

在第四个周期,读指针115(A)如前所述增一得到‘2103’,对指令读缓冲116(A)寻址,读出指令Q3到主流水线中的前端流水线A执行。此时,读指针115(A)位于分支指令Q4之前的‘-1’位置,因此选择寄存器552中的值‘3’作为读指针115(A)的增量,得到加法结果‘2106’。此外,由于类型‘1’的指令Q5已经发射,因此读指针315(A)如前所述移动到下一个类型‘1’的轨迹点Q10,并在该移动过程中,先将寄存器552(A)的值复位为‘1’(当读指针315(A)指向Q6时),再增一得到‘2’(当读指针315(A)指向Q10时)。此外,由于分支指令Q4与指令Q3存在寄存器相关性,因此在分支流水线A中再次插入一个气泡使得指令Q4的D段被延迟发射。

在第五个周期,读指针115(A)被更新为所述加法结果‘2106’,对指令读缓冲116(A)寻址,读出指令Q6到主流水线中的前端流水线A执行,从而直接跳过分支指令Q4和数据访问指令Q5。由于此时读指针315(A)指向类型‘0’的轨迹点,因此同步模块212(A)中的寄存器552(A)的值被复位为‘1’。在本周期,指令Q3进入D段,当采用如图16C或图16D所述分支转移判断方法时,分支指令Q4的D段可以发射,因此分支流水线A中不再插入气泡。在循迹模块392(B)中,指令读缓冲116(B)根据读指针115(A)寻址,向处理器核102输出类型‘0’的指令R5供主流水线中的前端流水线B执行。又由于此时读指针115(B)与读指针315(B)之差为‘-3’,因此指令读缓冲116(B)在读指针315(B)的寻址下,输出数据访问指令R8送往数据流水线的前端流水线B执行。从本周期开始,两个前端流水线同时工作,其中,前端流水线A是当前前端流水线,前端流水线B是目标前端流水线。

在第六个周期,读指针115(A)如前所述增一得到‘2107’,对指令读缓冲116(A)寻址,读出指令Q7到主流水线中的前端流水线A执行。又由于此时读指针115(A)与读指针315(A)之差为‘-3’,因此指令读缓冲116(A)在读指针315(A)的寻址下,输出分支指令Q10送往分支流水线的前端流水线A执行。读指针115(B)如前所述增一得到‘6306’,对指令读缓冲116(B)寻址,读出指令R6到主流水线中的前端流水线B执行。由于在本周期产生分支指令Q4的分支转移结果(即分支转移不发生),因此从下一周期开始,继续执行当前前端流水线(即前端流水线A),放弃目标前端流水线(即前端流水线B)。此外,又由于有新的分支指令(Q10)被发射,因此轨道读缓冲178(A)在读指针315(A)的寻址下输出的分支目标BN1中的BN1X经总线317(A)对一级指令缓存104和轨道表110寻址,分别读出分支目标指令块经总线103送往循迹模块392(B)填充到指令读缓冲116(B)中,以及读出分支目标轨道经总线317(A)送往循迹模块392(B)填充到轨道读缓冲178(B)中。该分支目标BN1(‘1801’)还经总线317(A)被送到循迹模块190(B)用于更新读指针115(B)、315(B)和515(B)。由于此时读指针315(A)指向类型‘1’的轨迹点,同步模块212(A)中的寄存器552(A)的值如前增一得到‘2’。

在第七个周期,读指针115(A)如前所述增一得到‘2108’,对指令读缓冲116(A)寻址,读出指令Q8到主流水线中的前端流水线A执行。由于类型‘1’的指令Q10已经发射,因此读指针315(A)如前所述移动到下一个类型‘1’的轨迹点Q14。又由于分支指令Q10与指令Q9存在寄存器相关性,因此在分支流水线A中插入了一个气泡使得指令Q10的D段被延迟发射。在循迹模块392(B)中,读指针315(B)如前所述移动到下一个类型‘1’的轨迹点P2。

根据本发明技术方案,可以对不同轨道中的轨迹点间的距离进行判断。例如,可以先由主循迹器120(A)读指针115(A)中的BN1Y减去数据循迹器320(B)读指针315(B)中的BN1Y再加上指令读缓冲116(A)中读出的分支指令的分支增量(branch offest)对应BN1Y的部分,再将计算得到的结果与常数‘-3’如前进行比较,即可判断出读指针115(A)是否已经位于读指针315(B)之前的‘-3’的位置。当然,也可以有其他合适的判断方法。

因此在本周期中,分支源轨道上的轨迹点Q8与分支目标轨道上的轨迹点P2距离之差为‘-3’,因此指令读缓冲116(B)在读指针315(B)的寻址下,输出数据访问指令P2送往分支流水线的前端流水线B执行。由于此时读指针315(B)指向类型‘1’的轨迹点,同步模块212(B)中的寄存器552(B)的值如前增一得到‘2’。

在第八个周期,读指针115(A)如前所述增一得到‘2109’,对指令读缓冲116(A)寻址,读出指令Q9到主流水线中的前端流水线A执行。此时,读指针115(A)位于分支指令Q10之前的‘-1’位置,因此选择寄存器552(A)中的值‘2’作为读指针115(A)的增量,得到加法结果‘2111’。此外,由于分支指令Q10与指令Q9存在寄存器相关性,因此在分支流水线A中再次插入一个气泡使得指令Q10的D段被延迟发射。在循迹模块392(B)中,读指针315(B)如前所述移动到下一个类型‘1’的轨迹点P6。

在第九个周期,读指针115(A)被更新为所述加法结果‘2111’,对指令读缓冲116(A)寻址,读出指令Q11到主流水线中的前端流水线A执行,从而直接跳过分支指令Q10。如前所述,在本周期分支流水线A中不再插入气泡。在循迹模块392(B)中,指令读缓冲116(B)根据读指针115(A)寻址,向处理器核102输出类型‘0’的指令P1供主流水线中的前端流水线B执行。此时,读指针115(B)位于数据访问指令P2之前的‘-1’位置,因此选择寄存器552(B)中的值‘2’作为读指针115(B)的增量,得到加法结果‘1803’。从本周期开始,两个前端流水线再次同时工作,其中,前端流水线A是当前前端流水线,前端流水线B是目标前端流水线。

在第十个周期,读指针115(A)如前所述增一得到‘2112’,对指令读缓冲116(A)寻址,读出指令Q12到主流水线中的前端流水线A执行。读指针115(B)被更新为所述加法结果‘1803’,对指令读缓冲116(B)寻址,读出指令P3到主流水线中的前端流水线B执行。由于在本周期产生分支指令Q10的分支转移结果(即分支转移发生),因此从下一周期开始,将原目标前端流水线(即前端流水线B)作为新的当前前端流水线执行,并放弃原当前前端流水线(即前端流水线A)。

从第十一个周期开始,前端流水线B成为当前前端流水线,前端流水线A则按需成为目标前端流水线,之后的操作可以参考上述过程。

需要说明的是,在上述实施例的同步模块中均用读指针115和315的距离与常数比较的方法判断分支指令或数据访问指令的发射时间点。然而也可以有其他合适的方法。由于类型‘1’指令在被提前发射时,其之前所述若干条指令可能还没有进入主流水线及数据流水线,因此通过静态判断预测它们之间的寄存器相关性。以图20实施例为例,可以在数据循迹器320读指针315指向一个类型‘1’轨迹点时,对该轨迹点与其之前若干个轨迹点进行寄存器相关性判断,并根据判断结果确定发射该类型‘1’轨迹点时主循迹器120读指针115的BN1Y值。

具体地,仍然以最多提前三个周期发射为例,若该类型‘1’轨迹点本身的BN1Y为‘x’,则当该轨迹点与之前第一个轨迹点存在寄存器相关性时,所述发射时间点的BN1Y就是‘x’;当该轨迹点与之前第一个轨迹点不存在寄存器相关性、但与之前第二个轨迹点存在寄存器相关性时,所述发射时间点的BN1Y就是‘x-1’;当该轨迹点与之前第一、二个轨迹点不存在寄存器相关性、但与之前第三个轨迹点存在寄存器相关性时,所述发射时间点的BN1Y就是‘x-2’;当该轨迹点与之前三个轨迹点均不存在寄存器相关性时,所述发射时间点的BN1Y就是‘x-3’。

这样,只需要在先入先出198中的每一项增加一个存储单元用于存储所述发射时间点的BN1Y,使之构成源BN1和发射时间点BN1Y的关系对,就可以在先入先出198输出源BN1指向轨道表110的同时,输出相应的发射时间点BN1Y到同步模块212。当主循迹器120读指针115的BN1Y等于该发射时间BN1Y时,即可发射该类型‘1’指令到分支流水线或数据流水线。

显然,还可以在在读指针315指向该类型‘1’轨迹点时,用类似的判断方法对该轨迹点及其后若干个轨迹点的寄存器相关性进行判断,从而确定分支流水线或数据流水线中插入气泡的数目。具体方法与前例相同,在此不再赘述。

根据本发明技术方案,可以用存储在存储器或缓存中的信息调度(schedule)指令的发射(issue)。所述信息可以是程序流(program flow)。所述程序流具体表现为指令顺序(instruction sequence)。进一步地,可以使用存储在轨道表、轨道读缓冲和指令读缓冲中的一个或多个中的信息对指令进行调度,从而实现多发射。即,可以根据存储在存储器、缓存、轨道表、轨道读缓冲和指令读缓冲中的一个或多个中的程序流以及指令间的距离(distance)等信息提前发射某些指令。

再进一步地,在上述实施例中将指令分为了两大类型:执行时所需周期数多(即执行耗时长)的指令(即类型‘1’指令)和执行时所需周期数少(即执行耗时短)的指令(即类型‘0’指令),并在处理器核获取指令前,所述缓存系统提前读出了该指令的类型(类型‘0’或类型‘1’),并提前发射类型‘1’指令,从而掩盖其较多周期数的执行时间,使之尽量与类型‘0’指令同时完成。显然,可以根据本发明技术方案,将指令执行时所需周期按分为更多类型,并对不同类型的指令给予不同的提前发射周期数。具体实现方法可参考上述实施例,在此不再赘述。

仍然以将指令分为两类为例进行说明。通常,分支指令、数据访问指令在执行时会产生延时(气泡),因此可以被归为类型‘1’指令。进一步地,还可以将可能涉及缓存缺失的指令归为类型‘1’指令。根据本发明技术方案,在采用轨道表技术后,指令缓存的缺失接近于零,因此这里所述的涉及缓存缺失的指令可以被进一步限定为涉及数据缓存缺失的指令。当然,也可以不排除涉及指令缓存缺失的指令。此外,对于乘法指令、除法指令等需要多个E段的指令,也可以归为类型‘1’指令中。这样,在此其他指令就被归为类型‘0’指令中。

根据本发明技术方案,可以在扫描器106对填充到一级指令缓存的指令进行审查时对指令进行所述分类。当然,也可以在读指针(如图20中的读指针315或图21中的读指针515)的移动过程中,对依次经过的各个轨迹点进行所述分类。

因此,可以将上述实施例中的分支流水线和数据流水线均成为提前流水线(early pipeline)。这样,在本发明所述处理器系统中,由提前流水线执行类型‘1’指令,并由主流水线执行类型‘0’指令。如前所述可以尽量早地提前发射类型‘1’指令(在上述实施例中为3个周期)。而类型‘1’指令执行时所需的周期数则与该指令及其之前指令之间的寄存器相关性有关。一旦存在相关性,则该类型‘1’指令所在的提前流水线就会被插入相应数量的气泡。

然而,提前流水线中存在的气泡不一定会导致该类型‘1’指令之后的指令在主流水线中插入气泡。主流水线中是否会插入气泡只和该类型‘1’指令与其后第一条使用该指令的结果的类型‘0’指令之间的距离有关。如前所述,可以用流水线控制结构中现有的旁路模块进行检测,以确定是否在主流水线中插入气泡。

此外,对于某些指令,既可以被归为类型‘1’,也可以被归为类型‘0’。例如,由于数据存储指令访问数据缓存时可能发生缓存缺失,因此可以被归为类型‘1’。然而,只要增加一个数据写缓冲暂存存储到缓存中的数据,该缓存缺失就不会造成数据存储指令按时完成,因此也可以被归为类型‘0’。在此,可以将这类指令归为类型‘s’。

这样,就可以根据程序中类型‘1’和类型‘0’的指令的数目,动态地将类型‘s’指令当作类型‘0’或类型‘1’指令处理。具体地,若程序中类型‘1’指令较多时,主流水线很可能会空闲,因此可以将类型‘s’指令当作类型‘0’指令处理,由主流水线执行(反之亦然),从而平衡(balance)主流水线和提前流水线中执行的指令数量。具体地,可以使用两个计数器分别对已发射的类型‘1’和类型‘0’的指令进行计数,将类型‘s’指令当作计数结果较小的那类指令处理。另外一种为负载平衡(Load balancing)方式,通过观察图19A中计数器的值(寄存器552的输出),小于等于‘3’(类型‘1’指令提早发射周期数)时,类型‘s’指令按类型‘1’发射,大于‘3’时按类型‘0’发射。这样,处理器系统能用最少的周期执行同样数量的指令,以提高整体性能。

根据本发明技术方案和构思,还可以有其他任何合适的改动。对于本领域普通技术人员来说,所有这些替换、调整和改进都应属于本发明所附权利要求的保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1