CN104731719A - 一种缓存***和方法 - Google Patents

一种缓存***和方法 Download PDF

Info

Publication number
CN104731719A
CN104731719A CN201410826711.4A CN201410826711A CN104731719A CN 104731719 A CN104731719 A CN 104731719A CN 201410826711 A CN201410826711 A CN 201410826711A CN 104731719 A CN104731719 A CN 104731719A
Authority
CN
China
Prior art keywords
instruction
branch
address
read pointer
processor core
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201410826711.4A
Other languages
English (en)
Other versions
CN104731719B (zh
Inventor
林正浩
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shanghai Xinhao Bravechips Micro Electronics Co Ltd
Original Assignee
Shanghai Xinhao Bravechips Micro Electronics Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Shanghai Xinhao Bravechips Micro Electronics Co Ltd filed Critical Shanghai Xinhao Bravechips Micro Electronics Co Ltd
Priority to CN201410826711.4A priority Critical patent/CN104731719B/zh
Publication of CN104731719A publication Critical patent/CN104731719A/zh
Application granted granted Critical
Publication of CN104731719B publication Critical patent/CN104731719B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3802Instruction prefetching
    • G06F9/3814Implementation provisions of instruction buffers, e.g. prefetch buffer; banks

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Advance Control (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Abstract

本发明提供了一种缓存***和方法,应用于处理器领域时能在处理器核执行指令前,将所述指令填充到所述处理器核能直接访问的高速存储器中,且不需要处理器核提供指令地址,直接根据处理器核执行指令产生的反馈信息,控制所述高速存储器向处理器核提供指令,几乎使所述处理器核每次都能在所述高速存储器中获取到需要的指令,达到极高的缓存命中率。

Description

一种缓存***和方法
技术领域
本发明涉及计算机,通讯及集成电路领域。
背景技术
通常缓存的作用是将更低级存储器中的部分内容复制在其中,使这些内容能被更高级存储器或处理器核快速存取,以保证流水线的持续运行。
现行缓存的寻址都基于以下方式,用地址中的索引段寻址读出标签存储器中的标签与地址中的标签段进行匹配;用地址中索引段与块内位移段共同寻址读出缓存中的内容。如果从标签存储器中读出的标签与地址中的标签段相同,那么从缓存中读出的内容有效,称为缓存命中。否则,如果从标签存储器中读出的标签与地址中的标签段不相同,称为缓存缺失,从缓存中读出的内容无效。对于多路组相联的缓存,同时对各个路组并行进行上述操作,以检测哪个路组缓存命中。命中路组对应的读出内容为有效内容。若所有路组都为缺失,则所有读出内容都无效。缓存缺失之后,缓存控制逻辑将低级存储媒介中的内容填充到缓存中。
缓存缺失可分为三类状况:强制缺失、冲突缺失和容量缺失。在现有缓存结构中,除了预取成功的小部分内容外,强制缺失是不可避免的。但是,现有的预取操作会带来不小的代价。此外,虽然多路组相联缓存可以降低冲突缺失,但受制于功耗及速度限制(如因为多路组相联缓存结构要求将所有路组由同一索引寻址的内容及标签同时读出并比较),路组数难以超过一定数目。
现代的缓存***通常由多路组相连的多层次缓存构成。新的缓存结构,如:牺牲缓存、跟踪缓存以及预取等都是基于上述基本缓存结构并改善上述结构。然而,随着日渐扩大的处理器/存储器速度鸿沟,现行体系结构,特别是多种缓存缺失,已成为是制约现代处理器性能提升的最严重瓶颈。
本发明提出的方法与***装置能直接解决上述或其他的一个或多个困难。
发明内容
本发明提出了一种缓存方法,由缓存向处理器核推送指令,并根据处理器核执行所述指令的反馈信息确定后续推送的指令;当处理器核执行的指令为直接分支指令或非分支指令时,所述反馈信息不包括指令地址。
可选的,在所述方法中,所述缓存提供一个第一读指针对所述缓存寻址以读出对应指令供处理器核执行;根据处理器核执行所述指令产生的反馈信息,更新第一读指针的值。
可选的,在所述方法中,对填充到所述缓存中的一级缓存的指令进行审查,提取出相应的指令信息;根据所述指令信息,将一级缓存中所有分支指令的分支目标指令预先存储到所述缓存中的二级缓存中;当处理器核执行分支指令时,无论分支转移是否发生,后续将被执行的指令至少已经存储在二级缓存中;若分支转移发生,第一读指针被更新为所述分支指令的分支目标寻址地址值;若分支转移没有发生,第一读指针被更新为该分支指令顺序执行的后一条指令的寻址地址值。
可选的,在所述方法中,根据所述指令信息,提前将处理器核将要执行到的分支指令的分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中。
可选的,在所述方法中,对填充到一级缓存的指令进行审查,提取出相应的指令信息;第一读指针根据所述指令信息而非指令本身的功能确定如何更新。
可选的,在所述方法中,当第一读指针指向一条有条件分支指令,且其后一条是无条件分支指令时,则根据处理器核对有条件分支指令的执行结果:若分支转移发生,第一读指针被更新为所述有条件分支指令的分支目标寻址地址值;若分支转移没有发生,第一读指针被更新为所述无条件分支指令的分支目标寻址地址值;使得处理器核不需要单独一个时钟周期执行所述无条件分支指令。
可选的,在所述方法中,对第一读指针的值进行缓冲,并由所述缓冲后的第一读指针值对一级缓存寻址以读出对应指令供处理器核执行;第一读指针提前指向分支指令,若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中。
可选的,在所述方法中,提供一个第二读指针;所述第二读指针提前指向第一读指针之后的分支指令,若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中。
可选的,在所述方法中,当处理器核执行到分支指令时,根据分支预测选择顺序执行下一指令和分支目标指令中的一个作为后续指令猜测执行,并保存另一个的寻址地址;若分支转移结果与分支预测一致,则继续执行后续指令;若分支转移结果与分支预测不一致,则清空流水线,并从所述保存的寻址地址对应的指令重新执行。
可选的,在所述方法中,所述指令信息包括指令类型和分支指令的分支目标寻址地址;每条分支指令对应一个分支目标寻址地址;每条指令均对应一个指令类型,所述指令类型为一位或更多位,可以被进一步分为基本类型信息和分支指令类型;其中,基本类型信息对分支指令和非分支指令进行区分,每条指令均对应一个基本类型信息;分支指令类型对分支指令进行进一步区分,每条分支指令对应一个分支类型信息;所述分支指令类型进一步包括:有条件分支指令、无条件分支指令。
可选的,在所述方法中,根据第一读指针找到对应指令的指令类型;根据第二读指针找到所述指令之后第一条分支指令的分支目标寻址地址。
可选的,在所述方法中,根据第一读指针值通过映射得到对应的第二读指针值;所述第二读指针值等于第一读指针指向的指令之前的分支指令数。
可选的,在所述方法中,当处理器核执行分支指令时,若分支转移发生,第一读指针被更新为第二读指针指向的分支目标寻址地址值;若分支转移没有发生,第一读指针被更新为该分支指令顺序执行的后一条指令的寻址地址值。
可选的,在所述方法中,处理器核包含两个前端流水线和一个后端流水线;所述方法还提供:一个第一指令读缓冲,用于存储当前指令块;一个第三读指针对一级缓存寻址以读出对应指令供处理器核的目标前端流水线执行;所述第一读指针对所述第一指令读缓冲寻址以读出对应指令供处理器核的顺序前端流水线执行。
可选的,在所述方法中,若分支指令的分支转移没有发生:将第三读指针值更新为第一读指针指向的下一条分支指令的分支目标寻址地址,使得第三读指针指向一级缓存中该分支目标指令块,并读出对应指令供处理器核的目标前端流水线执行;第一读指针继续更新,并从第一指令读缓冲中读出对应指令供处理器核的顺序前端流水线执行;若分支指令的分支转移成功发生:将第三读指针指向的指令块从一级缓存填充到第一指令读缓冲中,并将第一读指针值更新为第三读指针增一后的值;第一读指针从该值开始更新,并从第一指令读缓冲中读出对应指令供处理器核的顺序前端流水线执行。
可选的,在所述方法中,一个第二指令读缓冲,用于存储目标指令块;第三读指针对所述第二指令读缓冲寻址以读出对应指令供处理器核的目标前端流水线执行;一个第二读指针;所述第二读指针提前指向第一读指针之后的分支指令,若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中;一个第四读指针;所述第四读指针提前指向第三读指针之后的分支指令,若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中;当第二读指针提前指向第一读指针之后的第一条分支指令时,将第三读指针值更新为第一读指针指向的分支指令的分支目标寻址地址,使得第三读指针指向一级缓存中该分支目标指令块,并读出对应指令供处理器核的目标前端流水线执行。
可选的,在所述方法中,所述缓存提供一个第一读指针对所述缓存中的一级缓存寻址以读出对应的复数条指令推送给处理器核,并对所述复数条指令进行相关性检测;根据相关性检测的结果,控制处理器核执行所述复数条指令中的部分或全部;根据处理器核执行所述指令产生的反馈信息,以及所述相关性检测的结果,更新第一读指针的值;所述方法进一步包括:提供一个第二读指针;所述第二读指针提前指向第一读指针之后的分支指令,若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从所述缓存中的二级缓存填充到一级缓存中,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中。
可选的,在所述方法中,所述指令信息包括指令类型、分支指令的分支目标寻址地址和数据访问指令的数据寻址地址和数据步长;每条分支指令对应一个分支目标寻址地址;每条数据访问指令对应一个数据寻址地址和一个数据步长;每条指令均对应一个指令类型,所述指令类型为一位或更多位,可以被进一步分为基本类型信息、分支指令类型和数据访问指令类型;其中,基本类型信息对分支指令、数据访问指令和其他指令进行区分,每条指令均对应一个基本类型信息;分支指令类型对分支指令进行进一步区分,每条分支指令对应一个分支类型信息;所述分支指令类型进一步包括:有条件分支指令、无条件分支指令;数据访问指令类型进一步包含了表示其对应的数据寻址地址是否有效的地址有效信息,以及表示其对应的数据步长是否有效的步长有效信息。
可选的,在所述方法中,所述数据访问指令类型中的地址有效信息和步长有效信息共表示三种状态:状态一:根据处理器核提供的数据地址获取数据,并记录该数据地址;状态二:根据处理器核提供的数据地址获取数据,并根据该数据地址及状态一记录的数据地址计算并记录数据步长,并根据该数据地址和所述数据步长计算并记录下次数据地址;状态三:根据状态二记录的所述下次数据地址向处理器核推送数据,并根据该数据地址和所述数据步长计算并记录再下一次的数据地址。
可选的,在所述方法中,当所述数据所在数据块的顺序地址前一数据块或后一数据块已经存储在一级缓存中时,将所述前一数据块或后一数据块在一级缓存中的地址信息与所述数据所在的数据块记录在一起,使得对所述数据访问时能够同时读出其前一数据块或后一数据块在一级缓存中的寻址地址;通过将本次执行数据访问指令对应的本次数据的地址加上数据步长得到下次执行该数据访问指令时的下次数据的地址,当所述下次数据的地址位于本次数据地址的前一数据块或后一数据块中时,在读出所述数据的同时读出所述前一数据块或后一数据块的寻址地址,从而直接得到所述下次数据在一级缓存中的寻址地址。
可选的,在所述方法中,提供一个第二读指针;所述第二读指针从所述第一读指针指向的指令开始移动提前指向第一条分支指令;若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中;对于所述第二读指针在移动过程中经过的数据访问指令中的每一条,若该数据访问指令需要访问的数据尚未存储在一级缓存中,则将该数据从二级缓存填充到一级缓存,使得处理器核执行到该数据访问指令时可以直接从一级缓存中访问该数据。
可选的,在所述方法中,提供一个第五读指针;所述第五读指针提前指向第一读指针之后的数据访问指令,若该数据访问指令需要访问的数据尚未存储在一级缓存中,则将该数据从二级缓存填充到一级缓存,使得处理器核执行到该数据访问指令时可以直接从一级缓存中访问该数据。
可选的,在所述方法中,提供一个第五读指针和一个暂存器;所述第五读指针提前移动依次指向第一读指针之后的各个数据访问指令;若该数据访问指令需要访问的数据尚未存储在一级缓存中,则将该数据从二级缓存填充到一级缓存,并存储到所述暂存器中;否则,直接从一级缓存中读出所述数据并存储到所述暂存器中;使得所述第五读指针可以继续移动指向下一条数据访问指令;所述暂存的数据被依次推送到处理器核供执行数据访问指令时取用。
可选的,在所述方法中,按指令地址顺序依次在一张信息表中记录各条分支指令的指令信息;所述指令信息包括所述分支指令的分支目标指令在缓存中的地址信息;在一张映射表中存储从指令地址到所述信息表的相应地址的的映射关系;所述映射表中的信息与缓存中的指令一一对应,且根据所述映射关系,可以将指令地址转换为从该指令地址开始的第一条分支指令在所述信息表中的地址。
可选的,在所述方法中,提供一个第一读指针对所述缓存寻址以读出对应指令供处理器核执行;根据所述映射关系将第一读指针值转换为相应的信息表地址;提供一个第二读指针对所述信息表寻址以读出相应分支指令的指令信息;所述指令信息包括所述分支指令对应的分支目标指令地址信息;当分支转移发生时,选择所述分支目标指令地址信息作为第一读指针的待更新值,并选择所述信息表地址作为第二读指针的待更新值;否则,分别选择第一读指针和第二读指针值增一的值作为相应的待更新值;根据第一读指针指向的映射表信息,决定是否将第二读指针更新为相应的所述待更新值;根据所述反馈信息,决定是否将第一读指针更新为相应的所述待更新值。
本发明还提出了一种缓存***,包括:处理器核,用于执行指令;缓存,所述缓存中至少存储了处理器核将要执行的指令;缓存控制器,用于根据处理器核执行指令的反馈信息对缓存寻址,控制缓存向处理器核推送后续指令;当处理器核执行的指令为直接分支指令或非分支指令时,所述反馈信息不包括指令地址。
可选的,在所述***中,所述缓存控制器至少包括:循迹器(tracker);所述循迹器输出第一读指针对缓存寻址以读出相应指令供处理器核执行,并根据处理器核执行指令产生的反馈信息更新所述第一读指针的值。
可选的,在所述***中,一级缓存,所述一级缓存中至少存储了处理器核将要执行的指令;二级缓存,用于存储一级缓存中的所有指令,及一级缓存中所有分支指令的分支目标指令;所述缓存控制器还包括主动表、块地址映射模块、轨道表和扫描器;其中:主动表,其表项与二级缓存指令块对应,用于存储二级缓存中指令块的地址信息;块地址映射模块,用于存储一级缓存与二级缓存指令地址的对应关系;轨道表,其轨迹点与一级缓存指令对应,用于存储一级缓存中指令的指令信息;所述指令信息包括指令类型和分支指令的分支目标指令位置信息;扫描器,用于对填充到一级缓存的指令进行审查,提取出相应的指令信息,计算分支指令的分支目标指令地址,并将计算得到的分支目标指令地址在主动表及块地址映射模块中匹配;若匹配不成功,则将包含所述分支目标指令在内的至少一条指令从更低层次存储器填充到二级缓存中,并将相应的分支目标指令位置信息存储到轨道表中;若匹配成功,则直接将分支目标指令位置信息存储到轨道表中;循迹器(tracker),输出第一读指针对一级缓存寻址以读出相应指令供处理器核执行,并从轨道表中读出所述指令信息;所述循迹器还根据处理器核执行指令产生的反馈信息及所述所述指令信息更新所述第一读指针的值;若分支转移发生,第一读指针被更新为所述分支指令的分支目标寻址地址值;若分支转移没有发生,第一读指针被更新为该分支指令顺序执行的后一条指令的寻址地址值。
可选的,在所述***中,第一读指针根据所述指令信息而非指令本身的功能确定如何更新。
可选的,在所述***中,同时从轨道表中读出第一读指针指向的轨迹点及其后一个轨迹点中存储的所述指令信息。
可选的,在所述***中,当第一读指针指向一条有条件分支指令,且其后一条是无条件分支指令时,则根据处理器核对有条件分支指令的执行结果:若分支转移发生,第一读指针被更新为所述有条件分支指令的分支目标寻址地址值;若分支转移没有发生,第一读指针被更新为所述无条件分支指令的分支目标寻址地址值;使得处理器核不需要单独一个时钟周期执行所述无条件分支指令。
可选的,在所述***中,还包括一个缓冲器,所述缓冲器用于存储第一读指针的值;所述缓冲器输出的第一读指针值对一级缓存寻址以读出对应指令供处理器核执行;循迹器的第一读指针提前指向分支指令,若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中;当处理器核执行分支指令时,若分支转移发生,循迹器的第一读指针被更新为所述分支目标寻址地址值;若分支转移没有发生,循迹器的第一读指针被更新为该分支指令顺序执行的后一条指令的寻址地址值。
可选的,在所述***中,还包括一个副循迹器(slave tracker);所述副循迹器输出第二读指针,提前指向第一读指针之后的分支指令,若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中。
可选的,在所述***中,所述循迹器中还包含一个寄存器,用于存储顺序执行下一指令和分支目标指令中的一个寻址地址;当处理器核执行到分支指令时,根据分支预测选择顺序执行下一指令和分支目标指令中的一个作为后续指令猜测执行,并将另一个的寻址地址存储在所述寄存器中;若分支转移结果与分支预测一致,则继续执行后续指令;若分支转移结果与分支预测不一致,则清空流水线,并从所述寄存器中保存的寻址地址对应的指令重新执行。
可选的,在所述***中,所述轨道表中每条轨道的最后一个轨迹点之后再增加一个结束轨迹点;所述结束轨迹点的指令类型为无条件分支指令,其分支目标寻址地址为顺序执行下一轨道第一个轨迹点的寻址地址;当第一读指针指向结束轨迹点时,一级缓存输出空指令;当结束轨迹点之前的轨迹点不是分支点时,可以将该结束轨迹点的指令类型及分支目标寻址地址作为该轨迹点的指令类型及分支目标寻址地址。
可选的,在所述***中,所述轨道表进一步包括:指令类型表,用于存储指令对应的基本类型信息;所述基本类型信息对分支指令和非分支指令进行区分;每条指令均对应指令类型表的一个表项,且表项内容为一位或更多位;目标地址表,用于存储分支指令对应的分支指令类型和分支目标寻址地址;每条分支指令对应目标地址表的一个表项;所述分支指令类型包括:有条件分支指令、无条件分支指令。
可选的,在所述***中,根据第一读指针从指令类型表中找到对应指令的基本类型信息;所述基本类型信息被送到循迹器;根据第二读指针从目标地址表中找到所述指令之后第一条分支指令的的分支指令类型和分支目标寻址地址;所述分支指令类型被送到循迹器,所述分支目标寻址地址被送到副循迹器。
可选的,在所述***中,还包括一个偏移地址映射模块,用于将第一读指针值映射为相应的目标地址表列号;所述目标地址表列号被送到副循迹器;若处理器核执行分支指令且分支转移发生,副循迹器的第二读指针被更新为偏移地址映射模块送来的列号;若处理器核执行分支指令且分支转移没有发生,副循迹器的第二读指针值被增一,指向目标地址表中的下一个表项;所述偏移地址映射模块包含:译码器,用于根据第一读指针值,产生一个掩码值,使得所述第一读指针指向的指令及其后指令对应的掩码值均为‘0’,其他掩码值均为‘1’;掩码器,用于对译码器产生的掩码值与指令类型表中的基本类型信息进行与操作,得到控制字;选择器阵列;在所述选择器阵列中,每列选择器根据控制字相应位的值进行选择;若该位为‘0’,则选择本行前列的输入;若该位为‘1’,则选择下行前列的输入;使得选择器阵列输入的唯一一个‘1’被上移的行数等于控制字中‘1’的个数,输出一个只包含一个‘1’、其余均为‘0’的序列;编码器,用于将所述序列编码为一个列号,从而将第一读指针值映射为相应的目标地址表列号。
可选的,在所述***中,处理器核包含两个前端流水线和一个后端流水线;所述***还包括:一个第一指令读缓冲,用于存储当前指令块;一个第二循迹器,输出第三读指针对一级缓存寻址以读出对应指令供处理器核的目标前端流水线执行;所述第一读指针对所述第一指令读缓冲寻址以读出对应指令供处理器核的顺序前端流水线执行。
可选的,在所述***中,若分支指令的分支转移没有发生:将第三读指针值更新为第一读指针指向的下一条分支指令的分支目标寻址地址,使得第三读指针指向一级缓存中该分支目标指令块,并读出对应指令供处理器核的目标前端流水线执行;第一读指针继续更新,并从第一指令读缓冲中读出对应指令供处理器核的顺序前端流水线执行;若分支指令的分支转移成功发生:将第三读指针指向的指令块从一级缓存填充到第一指令读缓冲中,并将第一读指针值更新为第三读指针增一后的值;第一读指针从该值开始更新,并从第一指令读缓冲中读出对应指令供处理器核的顺序前端流水线执行。
可选的,在所述***中,还包括:一个第二指令读缓冲,用于存储目标指令块;第三读指针对所述第二指令读缓冲寻址以读出对应指令供处理器核的目标前端流水线执行;一个副循迹器,输出第二读指针;所述第二读指针提前指向第一读指针之后的分支指令,若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中;一个第二副循迹器,输出第四读指针;所述第四读指针提前指向第三读指针之后的分支指令,若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中;当第二读指针提前指向第一读指针之后的第一条分支指令时,将第三读指针值更新为第一读指针指向的分支指令的分支目标寻址地址,使得第三读指针指向一级缓存中该分支目标指令块,并读出对应指令供处理器核的目标前端流水线执行。
可选的,在所述***中,还包括:一个循迹器,输出第一读指针对所述缓存中的一级缓存寻址以读出对应的复数条指令推送给处理器核,一个相关性检测模块,对所述复数条指令进行相关性检测,并根据相关性检测的结果,控制处理器核执行所述复数条指令中的部分或全部;所述循迹器根据处理器核执行所述指令产生的反馈信息,以及所述相关性检测的结果,更新第一读指针的值;所述***进一步包括:一个副循迹器,输出第二读指针提前指向第一读指针之后的分支指令,若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从所述缓存中的二级缓存填充到一级缓存中,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中。
可选的,在所述***中,所述轨道表中的指令信息还包括数据访问指令的数据寻址地址和数据步长;每条数据访问指令对应一个数据寻址地址和一个数据步长;根据从轨道表中读出的由所述第五读指针指向的表项中存储的所述数据寻址地址可以直接在一级缓存中找到相应的数据;所述指令信息包括指令类型进一步包括:分支指令类型、数据访问指令类型和其他指令类型;数据访问指令类型进一步包含了其对应的数据寻址地址是否有效,以及数据步长是否有效的信息。
可选的,在所述***中,还包括一个相邻数据块地址存储器;所述相邻数据块地址存储器的行与一级缓存中的数据块一一对应:当一级缓存中的一个数据块的顺序地址前一数据块或后一数据块已经存储在一级缓存中时,则在相邻数据块地址存储器的相应行中存储了所述前一数据块或后一数据块在一级缓存中的地址信息;所述***还包括一个数据引擎;所述数据引擎至少包含一个加法器,用于通过将本次执行数据访问指令对应的本次数据的地址加上数据步长得到下次执行该数据访问指令时的下次数据的地址;当所述下次数据的地址位于本次数据地址的前一数据块或后一数据块中时,在根据所述数据寻址地址从一级缓存中读出相应数据的同时从所述相邻数据块地址存储器中读出对应行中的前一数据块或后一数据块在一级缓存中的寻址地址,从而直接得到所述下次数据在一级缓存中的寻址地址。
可选的,在所述***中,还包括一个副循迹器;所述副循迹器输出第二读指针,所述第二读指针从所述第一读指针指向的指令开始移动提前指向第一条分支指令;若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中;对于所述第二读指针在移动过程中经过的数据访问指令中的每一条,若该数据访问指令需要访问的数据尚未存储在一级缓存中,则将该数据从二级缓存填充到一级缓存,使得处理器核执行到该数据访问指令时可以直接从一级缓存中访问该数据。
可选的,在所述***中,还包括一个数据循迹器,输出第五读指针;所述第五读指针提前指向第一读指针之后的数据访问指令,若该数据访问指令需要访问的数据尚未存储在一级缓存中,则将该数据从二级缓存填充到一级缓存,使得处理器核执行到该数据访问指令时可以直接从一级缓存中访问该数据。
可选的,在所述***中,提供一个第五读指针和一个暂存器;所述第五读指针提前移动依次指向第一读指针之后的各个数据访问指令;若该数据访问指令需要访问的数据尚未存储在一级缓存中,则将该数据从二级缓存填充到一级缓存,并存储到所述暂存器中;否则,直接从一级缓存中读出所述数据并存储到所述暂存器中;使得所述第五读指针可以继续移动指向下一条数据访问指令;所述暂存的数据被依次推送到处理器核供执行数据访问指令时取用。
可选的,在所述***中,一个信息表,用于按指令地址顺序依次存储各条分支指令的指令信息;所述指令信息包括所述分支指令的分支目标指令在缓存中的地址信息;一个映射表,用于存储从指令地址到所述信息表的相应地址的的映射关系;所述映射表中的信息与缓存中的指令一一对应,且根据所述映射关系,可以将指令地址转换为从该指令地址开始的第一条分支指令在所述信息表中的地址;一个循迹器,用于提供一个第一读指针对所述缓存寻址以读出对应指令供处理器核执行;所述映射表接收循迹器送来的第一读指针值根据所述映射关系转换为相应的信息表地址;一个副循迹器,用于提供一个第二读指针对所述信息表寻址以读出相应分支指令的指令信息;所述指令信息包括所述分支指令对应的分支目标指令地址信息;当分支转移发生时,所述循迹器选择所述分支目标指令地址信息作为第一读指针的待更新值,所述副循迹器选择所述映射转换得到的信息表地址作为第二读指针的待更新值;否则,所述循迹器和副循迹器分别选择第一读指针和第二读指针值增一的值作为相应的待更新值;根据第一读指针指向的映射表信息,副循迹器决定是否将第二读指针更新为相应的所述待更新值;根据所述反馈信息,循迹器决定是否将第一读指针更新为相应的所述待更新值。
可选的,在所述***中,所述循迹器还包括:一个寄存器,用于存储第一读指针值;一个增量器,用于对所述寄存器中存储的第一读指针值增一以得到增一后的值;一个选择器;当分支转移发生时,所述选择器选择所述分支目标指令地址信息作为第一读指针待更新值,否则选择所述第一读指针值增一后的值作为第一读指针待更新值;根据所述反馈信息,循迹器决定是否将第一读指针更新为相应的所述第一读指针待更新值;所述副循迹器还包括:一个寄存器,用于存储第二读指针值;一个增量器,用于对所述寄存器中存储的第二读指针值增一以得到增一后的值;一个选择器;当分支转移发生时,所述选择器选择所述映射转换得到的信息表地址作为第二读指针待更新值,否则选择所述第二读指针值增一后的值作为第二读指针待更新值;根据第一读指针指向的映射表信息,副循迹器决定是否将第二读指针更新为相应的所述第二读指针待更新值。
本发明还提出了一种缓存中指令块信息组织方法,所述方法包含一种压缩方法;所述压缩方法通过对指令进行分类,仅将特定类型的指令或特定类型指令的指令信息存储在一张信息表中,并根据分类结果生成一张映射表。
可选的,在所述方法中,还包含一种解压缩方法;所述解压缩方法根据所述映射表中的内容,将指令地址转换为该指令或该指令的指令信息在所述信息表中的地址。
可选的,在所述方法中,提取缓存中指令的相关指令信息,并将所述指令信息至少分为两类;按指令地址顺序将所述分类结果依次记录在一张映射表中;按指令地址顺序将至少一类指令信息依次记录在一张信息表中。
可选的,在所述方法中,当按指令在缓存中的地址对缓存寻址时,根据所述映射表中的内容,转换出所述指令地址对应的指令信息在所述信息表中的地址。
可选的,在所述方法中,根据所述指令地址对所述映射表中的分类信息进行从‘0’开始的计数:对每个存储在所述信息表中的指令信息对应的类型加一或移位一位,直到到达所述指令地址对应的类型为止;此时得到的计数值或移位位数值就是所述指令地址对应的指令信息在所述信息表中的地址。
对于本领域专业人士,还可以在本发明的说明、权利要求和附图的启发下,理解、领会本发明所包含其他方面内容。
有益效果
本发明所述***和方法可以为数字***使用的缓存结构提供基本的解决方案。与传统缓存***仅在缓存缺失后才填充的机制不同,本发明所述的***和方法在处理器执行一条指令之前就对指令缓存进行填充,可以避免或充分地隐藏缓存缺失。
本发明根据程序执行流及处理器核执行指令的反馈,不需要处理器核提供指令地址,直接由较高层次缓存向处理器核提供指令,减少了流水线深度,提高了流水线效率。特别在分支预测错误时,能减少浪费的流水线周期。
对于本领域专业人士而言,本发明的其他优点和应用是显见的。
附图说明
图1A是本发明所述缓存结构的一个实施例;
图1B是本发明所述缓存结构的另一个实施例;
图1C是本发明支持猜测执行的实施例;;
图2是本发明所述缓存***的另一个实施例;
图3是本发明所述缓存***的另一个实施例;
图4是本发明所述缓存***的另一个实施例;
图5是本发明所述指令类型表和目标地址表的一个实施例;
图6是本发明所述偏移地址映射模块的一个实施例;
图7是本发明所述缓存***的另一个实施例;
图8是本发明所述循迹器的另一个实施例;
图9是本发明所述避免分支损失的缓存***的一个实施例;
图10是本发明所述轨道表内容的一个实施例;
图11是本发明所述避免分支损失的缓存***的另一个实施例;
图12是本发明所述缓存***的另一个实施例;
图13是轨道表表项格式的一个实施例;
图14是指令类型表的另一个实施例;
图15A是指令类型表及分支目标地址表的格式的一个实施例;
图15B是指令类型表、分支目标表及数据地址表格式的一个实施例;
图16是本发明所述缓存***的另一个实施例;
图17是支持指令多发射的推送缓存***的一个实施例。
具体实施方式
以下结合附图和具体实施例对本发明提出的高性能缓存***和方法作进一步详细说明。根据下面说明和权利要求书,本发明的优点和特征将更清楚。需说明的是,附图均采用非常简化的形式且均使用非精准的比例,仅用以方便、明晰地辅助说明本发明实施例的目的。
需要说明的是,为了清楚地说明本发明的内容,本发明特举多个实施例以进一步阐释本发明的不同实现方式,其中,该多个实施例是列举式并非穷举式。此外,为了说明的简洁,前实施例中已提及的内容往往在后实施例中予以省略,因此,后实施例中未提及的内容可相应参考前实施例。
虽然该发明可以以多种形式的修改和替换来扩展,说明书中也列出了一些具体的实施图例并进行详细阐述。应当理解的是,发明者的出发点不是将该发明限于所阐述的特定实施例,正相反,发明者的出发点在于保护所有基于由本权利声明定义的精神或范围内进行的改进、等效转换和修改。同样的元器件号码可能被用于所有附图以代表相同的或类似的部分。
本发明所述的指令地址(Instruction Address)指的是指令在主存储器中的存储地址,即可以根据该地址在主存储器中找到这条指令。在此为简单明了起见,均假设虚拟地址等于物理地址,对于需要进行地址映射的情况,本发明所述方法也可适用。在本发明中,当前指令可以指当前正在被处理器核执行或获取的指令;当前指令块可以指含有当前正被处理器执行的指令的指令块。
在本发明中,分支指令(Branch Instruction)或分支点(Branch Point)指的是任何适当的能导致处理器核改变执行流(Execution Flow)(如:非按顺序执行指令或微操作)的指令形式。分支指令地址指分支指令本身的指令地址,该地址由指令块地址和指令偏移地址构成。分支目标指令指的是分支指令造成的分支转移所转向的目标指令,分支目标指令地址指的是分支目标指令的指令地址。
请参考图1A,其为本发明所述缓存结构的一个实施例。在图1A中,处理器***由处理器核102、一级缓存104、扫描器106、二级缓存108、轨道表110、替换模块124、循迹器(tracker)120、主动表130、块地址映射模块134和选择器132、140、142、146、148、150构成。图1A中没有显示的还有一个控制器,该控制器接收从处理器核102、块地址映射模块134、扫描器106、主动表130、轨道表110及替换模块124的输出控制各功能模块的操作。
在本发明中,可以用第一地址(BNX)和第二地址(BNY)来表示指令在一级缓存或二级缓存中的位置信息。在此,第一地址和第二地址可以是一级缓存的寻址地址,也可以是二级缓存的寻址地址。当一条指令已经被存储在一级缓存104中时,可以用BN1X表示该指令所在指令块的一级块号(即指向一级缓存中相应的一个一级指令块),并用BN1Y表示该指令的一级块内偏移量(即该指令在一级指令块中的相对位置)。当一条指令已经被存储在二级缓存108中时,可以用BN2X表示该指令所在指令块的二级块号(即指向二级缓存中相应的一个二级指令块),并用BN2Y表示该指令的二级块内偏移量(即该指令在二级指令块中的相对位置)。为了便于说明,可以用BN1代表BN1X和BN1Y,用BN2代表BN2X和BN2Y。由于本发明中凡在一级缓存中的指令在二级缓存中均有存储,因此对于一级缓存中存储的指令,可以用BN1或BN2表示。
在本发明中,可以用所述第一地址和第二地址来表示轨迹点在轨道表110中的位置信息。而分支点的指令类型中则还可以包含分支目标寻址地址是以BN1表示(即分支目标为BN1的直接分支指令)还是以BN2表示(即分支目标为BN2的直接分支指令)的信息。当一个分支点中存储的是BN1时,说明该分支点的分支目标指令所在的指令块已经被存储在一级缓存104中由该BN1X指向的存储块中,且根据该BN1Y可以从中找到所述分支目标指令。当一个分支点中存储的是BN2时,说明该分支点的分支目标指令所在的指令块已经被存储在二级缓存108中由该BN2X指向的存储块中,且根据该BN2Y可以从中找到所述分支目标指令,但无法直接确定该分支目标指令对应的指令是否已经存储在一级缓存104中。
在本发明中,一个二级指令块可以包含若干个一级指令块,这样,根据指令在二级指令块中的二级块内偏移量(BN2Y)可以直接得到其对应的一级块内偏移量(BN1Y)。例如,若二级指令块包含两个一级指令块,则该二级指令块中的指令的BN2Y比该指令在其所在一级指令块中的BN1Y多一位(bit)。所述BN2Y中的最高位(MSB,most significant bit)即表示该指令位于该二级指令块对应的两个一级指令块中的哪一个,而其他位就相当于该指令位于其所在一级指令块中的BN1Y。对于一个二级指令块包含更多一级指令块的情况,可以此类推。
主动表130中的表项与二级缓存108中的存储块一一对应。主动表130中的每个表项存储了一个二级指令块地址与一个二级块号BN2X的匹配对,指明了该指令块地址对应的二级指令块存储在二级缓存108中的哪个存储块中。在本发明中,可以根据一个二级指令块地址在主动表130中进行匹配,并在匹配成功的情况下得到一个BN2X;也可以根据一个BN2X对主动表130寻址,以读出对应的二级指令块地址。
扫描器106对从二级缓存108经总线107送来的指令块进行审查,并提取出轨迹点信息填充到轨道表110的相应表项中,从而建立该二级指令块对应的至少一个一级指令块的轨道,同时扫描器106从总线105输出该指令块填充到一级缓存104。在建立轨道时,首先由替换模块124产生一个BN1X指向一条可用轨道。在本发明中,替换模块124可以根据替换算法(如LRU算法)确定可用轨道。
当从二级缓存108经扫描器106向一级缓存104填充指令块时,扫描器106计算该指令块中含有的分支指令的分支目标地址。计算得到的分支目标地址被送至主动表130与其中存储的指令块地址匹配确定该分支目标是否已经存储在二级缓存108中。如果匹配不成功,则分支目标指令所在的指令块尚未被填充到二级缓存108中,那么在将该指令块从更低层存储器填充到二级缓存104中的同时,在主动表130中建立相应的二级指令块地址与二级块号的匹配对。
具体地,扫描器106对从总线107来的每一条指令进行审查,并提取出某些信息,如:指令类型、指令源地址和分支指令的分支增量(Branch Offset),并基于这些信息计算出分支目标地址。对于直接分支指令,可以通过对该指令所在指令块的块地址、该指令在指令块中的偏移量和分支增量三者相加得到分支目标地址。所述指令块地址可以是从主动表130中读出并被直接送往扫描器106中加法器的。也可以在扫描器106中增加用于存储当前指令块地址的寄存器,这样主动表130就不需要实时地送出指令块地址。在本实施例中,直接分支指令的分支目标地址由扫描器106产生,而间接分支指令的分支目标地址由处理器核102产生。
块地址映射模块134中的行与主动表130中的表项及二级缓存108中的存储块一一对应,并由同一个BN2X指向,用于存储二级块号与一级块号的对应关系。块地址映射模块134中对应每个二级缓存块的每一行有复数个表项,每个表项中存储与此二级缓存块中相应部分对应的一级缓存块的一级块号(BN1X)。这样,对于一个BN2,可以根据其中的BN2X找到块地址映射模块134中的一行,再用其中BN2Y的高位在该行中找到对应表项。若该表项中存储了的有效的BN1X,则说明所述BN2对应的指令已经存储在一级缓存104中,可以将BN2转换为相应的BN1;否则,说明所述BN2对应的指令尚未存储在一级缓存104中。具体地,以一个二级指令块包含两个一级指令块为例,块地址映射模块134中的每一行对应两个BN1X,且根据BN2中BN2Y的最高位即可找到该BN2对应的那个BN1X表项。对于一个二级指令块包含更多一级指令块的情况,可以此类推。
本实施例中,轨道表110含有复数个轨迹点(track point)。一个轨迹点是轨道表中的一个表项,对应至少一条指令,且轨道中从左向右的每个轨迹点对应的地址递增。此外,可以在轨道表110的每行(每条轨道)最后额外增加一个表项(结束轨迹点),用于存储指向顺序执行的下一轨道的位置。轨道表110的轨迹点内容可以包含:格式(TYPE),二级块号(BN2X)及二级块内偏移(BN2Y)。轨道表110的轨迹点内容也可以包含格式(TYPE),一级块号(BN1X)及一级块内偏移(BN1Y)。在此,格式中包含指令类型,如:分支指令、数据访问指令和其他指令等。分支指令可以被进一步细分,如:无条件直接分支指令、有条件直接分支指令、无条件间接分支指令和有条件间接分支指令等,其对应的轨迹点为分支点。数据访问指令也可以被进一步细分,如数据读取指令和数据存储指令等,其对应的轨迹点为数据点。
在本发明中轨迹点本身的轨迹点地址与该轨迹点所代表指令的指令地址相关(correspond);而分支指令轨迹点中含有分支目标的轨迹点地址,且该轨迹点地址与分支目标指令地址相关。与一级缓存104中一系列连续指令所构成的一个一级指令块相对应的复数个连续的轨迹点称为一条轨道。该一级指令块与相应的轨道由同一个一级块号BN1X指示。轨道表110含有至少一条轨道。一条轨道中的总的轨迹点数可以等于轨道表110中一行中的表项总数(也可以增添结束轨迹点)。这样,轨道表110就成为一个以轨道表项地址对应分支源地址、表项内容对应分支目标地址来代表一条分支指令的表。此外,在轨道表110的每一行中除各对应指令的轨迹点以及结束轨迹点外还可以额外再增加一个二级块号表项,用于记录该行轨道BN1X对应的BN2X。这样,就可以在某个一级指令块被替换时,将以该行为分支目标的其他轨道表行中的分支点中的分支目标BN1X转换为相应的BN2X,并将BN1Y转换为相应的BN2Y,使该行可以被其他指令行写入而不致引起错误。
轨道表110中记录了程序运行的可能路径或程序执行流的可能流向,因此循迹器120可以根据轨道表110中的程序流和处理器核102的反馈沿程序流循迹。因为在一级缓存104中存有与轨道表表项相应的指令,一级缓存104以循迹器120的输出总线115为读地址,跟随循迹器120所遵循的程序流而通过总线103送出指令供处理器核102执行。轨道表110中某些分支目标是用二级缓存地址BN2记录的,其目的是仅将可能将要用到的指令存到一级缓存104,使得一级缓存104可以有较二级缓存108更小的容量和更快的速度。当循迹器130读出的表项中分支以BN2记录时,要将该BN2送往块地址映射模块134等模块转换获得BN1地址,或将二级缓存中的指令按新分配的BN1地址填充到一级缓存104中;也将该获得或者分配的BN1地址填回轨道表110中该表项中,循迹器120从该BN1开始并根据处理器核102反馈的指令执行结果(如:分支指令的执行结果),控制一级缓存104向处理器核102输出指令供执行。
轨道表110写端口对应的写入地址有两个来源,分别是行地址选择器140(BN1X)和列地址选择器142(BN1Y)。当建立轨道时,选择器140选择替换模块124输出的行地址BN1X,而选择器142选择扫描器106输出的列地址BN1Y。当循迹器120读出的轨迹点内容中存储的是BN2时,该BN2被送往块地址映射模块134转换为BN1,该BN1需要被写回该轨迹点中(即读出、修改及写回,read modify write);另外当循迹器120读出的轨迹点内容中的指令类型是间接分支指令时,将处理器核102产生的间接分支目标地址经总线155被选择器148选择后再经总线149送往主动表130匹配得到BN1,或匹配/分配得到BN2X并按之前所述方法经块地址映射模块134等转换得到BN1。该BN1也需要被写回该轨迹点中。在这两种情况下,行地址选择器140和列地址选择器142均选择当时的读出地址指针115上的BN1X和BN1Y作为轨道表110的写入地址。
轨道表110写端口本身有两个来源:总线125和123,经选择器146选择后作为写入内容。其中总线125上的值是块地址映射模块134输出的BN1,总线123上的值是二级缓存地址形式(BN2)的分支目标地址。
根据本发明技术方案,在指令被填充到一级缓存104的同时,扫描器106审查、提取出相应信息。具体地,若该指令是分支指令,则扫描器106计算分支目标地址。所述分支目标地址中的块地址经总线129被选择器148选择后再经总线149送到主动表130匹配。若匹配成功,得到匹配成功项对应的BN2X由选择器132选择后经总线133送往块地址映射模块134,并根据所述分支目标地址中的BN2Y在由所述BN2X指向的行中查找对应的BN1X。若有效的BN1X存在,则通过总线125输出该BN1X,并将所述BN2Y转换成相应的BN1Y。选择器140选择由替换模块124产生的该分支指令对应的BN1X 127作为轨道表110写地址中的第一地址,选择器142选择扫描器106输出的该分支指令在其所在指令块中的块内偏移量119作为轨道表110写地址中的第二地址,而总线125上的BN1经选择器146选择后与所述提取出的指令类型一同作为轨迹点内容经总线147写入轨道表110中,完成该轨迹点的建立。此时该轨迹点中包含的是BN1。
若在块地址映射模块134中该BN2对应的有效BN1X不存在,则选择器140选择由替换模块124产生的该分支指令对应的BN1X 127作为轨道表110写地址中的第一地址,选择器142选择扫描器106输出的该分支指令在其所在指令块中的块内偏移量119作为轨道表110写地址中的第二地址,将总线133上的该BN2X和扫描器106计算得到的分支目标地址中的BN2Y拼接成BN2放上总线123并经选择器146选择后与所述提取出的指令类型一同作为轨迹点内容经总线147写入轨道表110中,完成该轨迹点的建立。此时该轨迹点中包含的是BN2。
若所述分支目标地址中的块地址在主动表130中匹配不成功,表示该分支目标地址对应的指令尚未存储在二级缓存108中,则根据替换算法(如LRU算法)分配一个二级存储块的块号BN2X,并将该分支目标地址送往更低层次的存储器取得相应指令块经总线109存储到二级缓存108由所述BN2X指向的存储块中。选择器140选择由替换模块124产生的该分支指令对应的BN1X 127作为轨道表110写地址中的第一地址,选择器142选择扫描器106输出的该分支指令在其所在指令块中的块内偏移量119作为轨道表110写地址中的第二地址,直接将该BN2X及所述分支目标地址中的块内偏移地址(及BN2Y)合并为BN2放上总线123并经选择器146选择后与所述提取出的指令类型一同作为轨迹点内容经总线147写入轨道表110中,完成该轨迹点的建立。此时该轨迹点中包含的是BN2。
如此重复上述过程,即可实现从二级缓存108向一级缓存104填充指令并建立相应的轨道。在此过程中,替换模块124产生的一级缓存块地址BN1X 127也向一级缓存器104提供写地址,供与轨道表相应的一级存储块写入。若该存储块是分次写入,则由扫描器106扫描一个指令块时会产生的BN1Y地址通过总线119提供给一级缓存器104以控制指令写进正确的地址。
循迹器120则由寄存器112、增量器114和选择器118组成,其读指针115(即寄存器112的输出)指向轨道表110中处理器核102即将执行的指令(即当前指令)对应的轨迹点,并读出轨迹点内容经总线117送往选择器118。同时,读指针115对一级缓存104寻址,读出该当前指令经总线103送往处理器核102供执行。读指针115的格式为BN1X,BN1Y。其中BN1X选中轨道表110中的一行及一级指令缓存104中的相应的存储块,BN1Y选中该行中一个表项及存储块中相应的指令。
寄存器112由处理器核102送来的步进(stepping)信号111控制。步进信号111是处理器核向循迹器提供的反馈信号,此信号在处理器核正常工作时一直为‘1’,使循迹器120中寄存器112每个时钟周期都更新,使读指针115指向轨道表中一个新的表项及一级缓存104中一条新的指令以供处理器核执行。当处理器核中工作异常,需要停流水线或者不能执行新的指令时,则步进信号为‘0’,使寄存器112停止更新,循迹器120及指针115保持原来状态不变,一级缓存104暂停向处理器核102提供新的指令。
读指针115指向轨道表110中的一个表项(轨迹点),将其由总线117读出。若总线117上读出的轨迹点内容中的指令类型经控制器译码显示该指令不是分支指令,控制器则控制选择器118选择来源于寄存器112的BN1X值和来源于增量器114的增一后的BN1Y作为新的BN1输出送回寄存器112的输入。寄存器112在有效的步进信号111控制下更新后,读指针115指向原轨迹点同一轨道上右方的顺序下一个轨迹点并从一级缓存104中读出顺序下一条指令经总线103供处理器核102执行。
若由总线117上读出的轨迹点内容中的指令类型显示该指令是分支目标为BN1的无条件直接分支指令,则控制器控制选择器118选择该BN1作为输出送往寄存器112,并在步进信号111有效时更新寄存器112,使得下一周期寄存器112的值被更新为该BN1,即读指针115指向分支目标指令对应的轨迹点并从一级缓存104中读出该分支目标指令经总线103供处理器核102执行。若步进信号111无效则寄存器112的值保持不变,继续等待步进信号111有效时再更新。
若所述轨迹点内容中的指令类型显示该指令为分支目标为BN1的有条件直接分支指令,则控制器控制选择器118根据处理器核执行该分支指令时产生的表示分支转移是否发生的TAKEN信号113进行选择。此时,若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中读出对应指令经总线103供处理器核102执行。若步进信号111无效则寄存器112的值保持不变,继续等待步进信号111有效时再更新。
若所述轨迹点内容中的指令类型显示该指令为分支目标为BN2的直接分支指令(包括有条件、无条件两种情况),则该BN2经总线117被送往块地址映射模块134按之前所述方法进行匹配转换。在块地址映射模块134中,若存在该BN2对应的有效BN1X,则输出该BN1X及相应BN1Y合并为BN1,经总线125写回该分支点中以替换原存储的BN2。若不存在该BN2对应的有效BN1X,则按前述方法由替换模块124产生一个BN1X,在轨道表110(及一级缓存104)中经总线127指定一条可用轨道(及对应的一个存储块)。并将二级缓存108中从所述BN2对应的二级指令块中的相应一级指令块填充到一级缓存104由所述BN1X指向的存储块中,同时由扫描器106对所述被填充指令进行审查并提取出轨迹点信息填充到轨道表110中由所述BN1X指向的行,并将产生的BN1X和BN2X之间的对应关系存储到块地址映射模块134中。同时,将与该轨道相应的指令存储在一级缓存104中。替换模块124产生的BN1X,与根据BN2Y去除高位(二级缓存子缓存块号,每个二级缓存子缓存块的容量相当于一个一级缓存块)获得的BN1Y一同合并为BN1放上总线125。此时,选择器140、142选择读指针115的值(即分支指令本身对应的分支点)作为写地址,选择器146选择总线125上的BN1作为写入内容写回该分支点中以置换原来的BN2。如此,轨道表110输出的轨迹点内容包含的是BN1。之后的操作与上述分支目标为BN1的直接分支指令中的情况相同,在此不再赘述。
若所述轨迹点内容中的指令类型显示该指令为间接分支指令(包括有条件、无条件两种情况),则循迹器暂停更新,等待处理器核102执行该分支指令时产生分支地址,或由专用模块进行计算。控制器在看到分支地址已产生的信号(如处理器核102送出的分支判断有效信号)时控制将该分支目标地址中的块地址经总线155、选择器148、总线149送往主动表130匹配。若在主动表130中匹配成功,则可以得到匹配成功表项对应的BN2X,并以分支目标地址中的块内偏移量作为BN2Y。该BN2X和BN2Y值被送往块地址映射模块134匹配,如命中获得相应的BN1值,则之后的操作与上述分支目标为BN1的直接分支指令中的情况相同;若不命中,则之后的操作与上述分支目标为BN2的直接分支指令中的情况相同,在此不再赘述。若在主动表130中匹配不成功,表示该分支目标地址对应的指令尚未存储在二级缓存108中,则根据替换算法(如LRU算法)由主动表130分配一个二级存储块的块号BN2X,并将该分支目标地址送往更低层次的存储器取回相应指令块存储到二级缓存108由所述BN2X指向的存储块中。再按之前所述方法,将该指令块填充到一级缓存104中并建立相应轨道,以及将所述BN2被转换为BN1填回该分支点中(在此过程中产生的BN2并不会被填充到轨道表110中,而直接将对应的BN1填充到轨道表110中),使得轨道表110输出的轨迹点内容包含的是BN1。之后的操作与上述分支目标为BN1的直接分支指令中的情况相同,在此不再赘述。
若下一次循迹器重新读出含该间接分支目标的表项时,该表项的指令类型是间接分支指令,但是地址类型是BN1,控制器据此认定该间接分支指令此前已访问过,当指令类型是无条件分支,或是条件分支且根据处理器核102反馈的分支判断113为分支时可以用该BN1地址猜测执行。但是要对该猜测地址BN1做核实(verify)。其方法可以是经过BN1地址反求出相应的指令地址(如:通过该BN1X对应的轨道中存储的BN2X对主动表130寻址读出指令块地址,并根据该BN1X在块地址映射模块134中所述BN2X对应的行中存储的位置将BN1Y转换为BN2Y,将指令块地址与BN2Y拼接得到完整的指令地址),待处理器核102执行该间接分支指令产生分支目标地址时将该分支目标地址与反求出的指令地址比较。如果相同,则继续执行。如果不相同,则清空分支点后的指令,不保存其结果,从处理器核102提供的分支目标地址开始执行并将该地址如前例映射成BN1后存入该分支点。
在本实施例中,将结束轨迹点视为一个无条件分支点,因此当循迹器120读指针指向结束轨迹点之前的那个轨迹点(即指令块中的最后一条指令),且该轨迹点不是分支点,或是分支转移没有发生的分支点时,循迹器120读指针115继续更新、移动到结束轨迹点,并输出BN1送往一级缓存104。由于结束轨迹点不对应于真实的指令,循迹器120读指针115要到下一个时钟周期才会更新为下一轨道的第一个轨迹点,因此在本时钟周期内,一级缓存104还需要向处理器核102输出一条空指令(即不会改变处理器核内部状态的指令,例如NOP)供执行。在本发明中,可以对送到一级缓存104的寻址地址进行判断,一旦发现寻址地址对应结束轨迹点,则不需要访问一级缓存104,直接输出空指令供处理器核102执行;也可以在一级缓存104的每行中增加一个存储单元用于存储该空指令,而该存储单元正好可以被读指针115输出的结束轨迹点本身的BN1寻址到,从而输出该空指令供处理器核102执行。然而,这样做的缺点是使得处理器核102在每个指令块多花费一个时钟周期用于执行无用的空指令。因此,可以对图1A进行改进,使得循迹器120读指针115指向结束轨迹点的前一轨迹点时,根据该轨迹点的指令类型及处理器核102执行该指令的反馈,在下一时钟周期直接指向分支目标轨迹点或下一轨道的第一个轨迹点。
请参考图1B,其为本发明所述缓存结构的另一个实施例。本实施例中的处理器核102、一级缓存104、扫描器106、二级缓存108、替换模块124、主动表130、块地址映射模块134和选择器132、140、142、146、148、150均与图1A实施例相同。不同之处在于,轨道表110每次输出两个轨迹点的内容(循迹器120读指针115指向的轨迹点内容182及其后的一个轨迹点内容183),而循迹器120中则增加了类型译码器152、控制器154和选择器116,此外,处理器核102还额外送出一个信号161到循迹器120中的控制器154。其中控制器154执行图1A中未显示的控制器的类似功能,此处将其显示以便于说明较复杂的功能与操作。
在本实施例中,轨道表110的读端口在循迹器120输出的读指针115的寻址下,输出两个相邻轨迹点的内容并放上总线117与总线121,控制器154则检测所述总线117上的指令类型,类型译码器152检测所述总线121上的指令类型。在任一时刻,从轨道表110中读出两个表项:当前表项182及其顺序下一个(右方)表项183。当前表项182中的内容经总线117读出送往选择器118的一个输入及控制器154,并在其为BN2格式时如前被送往块地址映射模块134等,用于将内容中的BN2映射为BN1。下一表项183则经总线121送出,送往类型译码器152译码,其结果控制选择器116。选择器116的一个输入来源于总线121,另一个输入来源于读指针115中的BN1X及增量器114送来的增一后的BN1Y(即读指针115中的BN1Y值增一)。类型译码器152只对无条件分支指令类型译码,若总线121上的类型为无条件分支指令类型,则控制选择器116选择输出总线121上的内容;若任何其他类型,则选择来源于总线115的BN1X与增量器114输出的增一后的BN1Y。
以下先考虑总线121上的类型(即顺序下一个表项)不是无条件分支指令类型。此时,选择器116选择来自增量器114的输出送往选择器118的一个输入。
如果控制器154译出总线117上(即当前表项182中的内容)的指令类型是非分支指令,该控制器控制选择器118选择由选择器116选择的增量器114的输出作为寄存器112的输入。来自处理器核102的步进信号111控制该输入存入寄存器112,使得循迹器向右移动达到下一个地址(即顺序更大的地址BNX1不变,BNY1+‘1’)。
如果总线117上该内容中的指令类型是无条件分支,则控制器154控制选择器118选择总线117上的分支目标地址,使得读指针115跳转到由总线117上分支目标地址对应的轨迹点位置。
如果总线117上的指令类型是直接有条件分支,则控制器154控制循迹器120暂停更新并等待,直到处理器核102产生分支转移是否发生的TAKEN信号113。此时寄存器112不仅受步进信号111控制,也受处理器核产生的一个表示Taken信号113是否有效的信号161控制,需要信号161显示TAKEN信号113有效且步进信号111也有效时,寄存器112才更新。如果分支转移没有发生(TAKEN信号113为‘0’),则选择器118选择选择器116的输出,如之前执行非分支指令的方式运行;如果分支转移发生(TAKEN信号113为‘1’),则选择器118选择总线117,将其上的分支目标地址存入寄存器112,指针115指向轨道表中分支目标的相应表项,及一级缓存104中的分支目标指令,将其读出供处理器核102执行。
如果总线117上的指令类型是BN2分支类型,则控制器154控制循迹器120中寄存器112暂停更新并等待,并将该BN2经总线117,选择器132,总线133选择块地址映射模块134中一行,以转换获得BN1地址。并由其提供该BN1,经总线125、选择器146、总线147写入轨道表中的原来间接分支表项。该表项经总线117读出,此后处理与前例相同。循迹器120沿该BN1并根据处理器核102反馈的指令执行结果(如:分支指令的执行结果),控制一级缓存104向处理器核102输出指令供执行。
如果分支转移没有发生,则如之前非分支指令的做法运行,如果分支转移发生,则如之前无条件分支指令的做法运行。
如果该内容中的指令类型是间接分支,控制器154控制循迹器120中寄存器112暂停更新,并等待处理器核102经总线155送出分支目标地址。该地址经选择器148送往主动表130匹配。如果在主动表130中获得匹配,产生相应的BN2,则将该BN2经选择132、总线133选择块地址映射模块134中一行,以转换获得BN1地址,以后操作与上例同。如果在主动表130中未能匹配,即将该分支目标地址送往更低层存储器获取相应指令块填充入二级缓存108,并将需要的一级指令块填充入一级缓存104。将所填充的一级缓存块号BN1填入块地址映射模块134,该BN1被经总线125送出,以后操作与上例同。
如果表项183中是无条件分支指令,则分支类型译码器152对总线121上的指令类型译码,使得选择器116选择总线121上的分支目标而不选择经增量器114提供的BN1(所述BN1即BN1X、BN1Y+‘1’),如此当处理器核102执行完表项182相应的指令后,并不执行表项183对应的指令(因为表项183对应的可能是结束轨迹点,在一级缓存104中并无指令与其对应),而是直接执行表项183中所含的分支目标地址的相应指令。
如果表项182中是一条非分支指令,则如上所述执行完该指令后所执行的下一条指令就是表项183中的分支目标所指向的指令。如果表项182中是一条无条件分支指令,则执行完该指令后所执行的下一条指令就是表项182中的分支目标所指向的指令,表项183对该过程不产生影响。如果表项182中是一条条件分支指令,则执行完该指令后所执行的下一条指令取决于处理器核102所产生的TAKEN信号113。如判断为分支转移发生(TAKEN信号113为‘1’),则选择器118选择总线117上的分支目标,表示TAKEN信号113有效的信号161控制将该目标存入寄存器112,使指针115指向该分支目标,下一条执行的指令就是表项182中分支目标地址所指向的指令。如判断为分支转移不发生(TAKEN信号113为‘0’),则选择器118选择经选择器116输出的总线121上的分支目标,表示TAKEN信号113有效的信号161与步进信号111控制将来自183的无条件分支目标存入寄存器112使指针115指向该分支目标,下一条执行的指令就是表项183中的无条件分支目标地址所指向的指令。
结束轨迹点中的无条件分支目标其地址也可以是二级缓存地址BN2。类型译码器152在译码总线121上读出的表项的指令类型时如果发现该地址为BN2格式,也可以将该总线121输出的BN2放上总线117按前例在块地址映射模块134中映射为BN1存回该表项。为了清晰及便于说明起见,这个路径在图1B中没有画出。
图1B例中该条件分支指令的类型判断可以有四种方式。第一种方式为只有一种无条件分支类型,即对程序中原有的无条件分支指令,与本发明所添加的结束轨迹点中控制跳转到下一轨道起始表项的无条件跳转操作不加区分。这种方式会使得程序中原有的条件分支指令被跳过,不被处理器核102执行,但是程序流在轨道表110与循迹器120的控制下,可以正确执行该分支指令的目标指令及其后续指令。这样,节省了原来执行该无条件分支指令所占的时钟周期。但处理器核102中因为未执行该指令,程序计数器PC值会有误差,如果需要保持精确PC值则需进行补偿。本发明中的缓存***不需要PC即能正确向处理器核102提供其将要执行的指令供其不间断地执行。如果需要获得某个时刻的PC值时(如调试时),每行轨道表中都记载了该一级指令块相应的二级缓存块地址BN2X及二级缓存子块地址。由此,BN2X从主动表130中可读出相应的标签,与二级缓存块地址,子块地址及指针115中BNY的数值拼接,就是正在执行的指令的PC值。
第二种方式为有两种无条件分支类型。其中,一种为结束点无条件分支类型对应轨道中每条轨道的结束点。对于这种结束点无条件分支类型,类型译码器152将其视为该结束点不对应程序中一条指令,由此控制选择器106选择总线121上的分支目标,在执行完总线117上的指令后直接跳转到总线121上的分支目标地址。另一类对应程序中的无条件分支类型,类型译码器152在译出这种类型时不将其作为分支处理,控制选择器116选择增量器114的输出。当执行完总线117上的表项内容的相应指令后,下一条执行的指令为其顺序下一条指令,即程序中原有的无条件分支指令。这种方式下处理器核中的PC则一直保持正确的值。
第三种方式为对图1B实施例进行改进,在扫描器106对指令块审查的过程中,如果发现一级指令块的倒数第二条指令不是有条件分支指令,且最后一条指令为非分支指令,扫描器在这种情况下将结束轨迹点合并到该最后一条指令对应的轨迹点中。即,将该最后一条指令的指令类型标记为无条件分支指令,并将下一指令块第一条指令对应的BN1或BN2(若是BN2则循迹器读出时会按前例将其转换为BN1)作为轨迹点内容存储在该最后一条指令对应的轨迹点中。这样,当循迹器120读指针115指向该指令对应的轨迹点时,除了从一级缓存104中读出该指令供处理器核102正常执行外,控制器154将总线117上指令类型译码发现是无条件分支类型,因此控制选择器118选择总线117,在下一时钟周期将读指针115更新为该无条件分支的分支目标BN1(即下一指令块第一条指令对应的BN1)。此时,处理器核102不需要浪费一个时钟周期执行空指令。
在扫描器106对指令块审查的过程中,如果发现一级指令块的最后一条指令(对应一条轨道中最后一个轨迹点)为分支指令,扫描器在这种情况下不将结束轨迹点合并到该指令对应的轨迹点中,而将结束轨迹点的内容放置在每条轨道最后一条指令对应的轨迹点之后(右方)的轨迹点。当该最后一条指令是无条件分支指令时,控制器154按总线117上的无条件分支类型控制选择器118选择总线117上的分支目标放上指针115,跳转至该目标,结束轨迹点不会被执行。当该最后一条指令是条件分支指令时,控制器154按总线117上的条件分支类型控制循迹器120暂停,等待处理器核102产生的分支判断信号113。此时类型译码器152译出总线121上的指令类型为无条件分支,控制选择器116选择总线121。当分支判断信号113为‘分支’,控制器154控制选择器118选择总线117上的条件分支目标放上指针115。当分支判断信号113为‘不分支’,控制器154控制选择器118选择116选择器的输出,将总线121上的无条件分支目标放上指针115。一级缓存104按指针115送出指令供处理器核102执行。
上述三种方式都既适用于定长的指令或变长的指令。即并不要求结束轨迹点在轨道中的固定位置。此外,若结束轨迹点在轨道中的位置是固定的,则可以根据读指针115中BN1Y的值判断是否已经到达最后一条指令。第四种方式为轨道表中只有一种无条件分支类型,但循迹器根据该类型在轨道中所处位置将其分为两种类型。此方式中,指针115中的BN1Y被送进类型译码器152而总线121上的指令类型不需要译码。当所述BN1Y指向一条轨道中最后一个表项时,类型译码器152控制选择器106选择总线121上的分支目标,在执行完总线117上的指令后直接跳转到总线121上的分支目标地址。当所述BN1Y指向一条轨道中除最后一个表项之外的其他表项时,类型译码器152控制选择器116选择增量器114的输出。当执行完总线117上的表项内容的相应指令后,下一条执行的指令为其顺序下一条指令。这种方式下处理器核中的PC则一直保持正确的值。这种方式适应定长指令。
此外,当从总线117上读出的轨道表110表项经控制模块154译码其类型为条件分支指令时,本发明可以控制处理器核102沿分支中的一支猜测执行(speculate execution),以提高处理器的执行效率。请参见图1C,其为本发明支持猜测执行的实施例。图1C中循迹器120中与图1B中循迹器相比增添了选择器162及寄存器164,用于选择、存储分支猜测执行未选中的另一支暂存,以备猜测错误时使用。猜测执行方向可以由现有的静态预测,或动态分支预测(branchprediction)技术决定,也可由存于轨道表中对应分支指令的表项中的分支预测域决定。而输入选择器118也由三输入选择器218置换,寄存器164的输出接选择器218的第三个输入。
以猜测不分支为例,控制器154在译出总线177上的一个条件分支类型并获得不分支的预测值时,控制选择器162及寄存器164选择总线117上的分支目标地址存入寄存器164。同时控制器154控制选择器118选择116选择器的输出(其为分支指令的顺序下一条指令)供存入寄存器112,使指针115控制一级缓存104提供分支指令后的顺序下一条指令供处理器核102执行,并向处理器核标记这条指令为猜测执行。指针115也指向轨道表110中分支指令后顺序第一个表项,使其被放上总线117。之后控制器154按总线117上的指令类型决定循迹器的后续方向,继续向处理器核提供指令。所有这些指令都被标记为猜测执行。当总线161通知分支判断信号113为有效时,控制器154将预测的分支方向与113上的分支方向比较。若比较结果相同,则沿原猜测方向继续执行。若比较结果不同,此时控制器154向处理器核102发送‘猜测错误’的信号,使处理器核清除所有带猜测执行标记的指令及其中间执行结果。同时控制器154控制选择器118选择寄存器164的输出,使分支未被猜测执行的一支的地址被用于控制一级缓存器104向处理器核102提供指令,并沿此继续执行。
若猜测为分支,则控制器154在译出总线177上的一个条件分支类型并获得进行分支的预测值时,控制选择器162及寄存器164选择116选择器的输出(其为分支指令的顺序下一条指令)存入寄存器164。同时控制器154控制选择器118选择总线117上的分支目标地址供存入寄存器112,使指针115控制一级缓存104提供分支指令的分支目标指令供处理器核102执行,并向处理器核标记这条指令为猜测执行。指针115也指向总线117上的分支目标地址指向的轨道表110中表项,使其被放上总线117。之后控制器154按总线117上的指令类型决定循迹器的后续方向,继续向处理器核提供指令。所有这些指令都被标记为猜测执行。当总线161通知分支判断信号113为有效时,控制器154将预测的分支方向与113上的分支方向比较。若比较结果相同,则沿原猜测方向继续执行。若比较结果不同,此时控制器154向处理器核102发送‘猜测错误’的信号,使处理器核清除所有带猜测执行标记的指令及其中间执行结果。同时控制器154控制选择器218选择寄存器164的输出,使分支未被猜测执行的一支的地址被用于控制一级缓存器104向处理器核102提供指令,并沿此继续执行。
在图1A和图1B实施例中,一级缓存104中所有直接分支指令和绝大多数分支指令的分支目标指令所在的指令块都被事先预取到二级缓存108中,因此不会因二级缓存缺失而造成处理器***性能的下降。此外,当一级缓存104中的分支指令对应的分支点内容包含的是BN1时,其分支目标指令所在的指令块已经被存储在一级缓存104中,不会因一级缓存缺失而造成处理器***性能的下降;然而,若该分支点内容包含的是BN2,则仍然会发生一级缓存缺失。为此可以改进图1A实施例,使得循迹器120读指针115能更早地指向分支点,提前将指令块从二级缓存108填充到一级缓存104,并将BN2转换为BN1。此外,对于图1B、图1C也可以做类似的改进,在本说明书中不再赘述。
请参考图2,其为本发明所述缓存***的另一个实施例。在本实施例中,处理器核102、一级缓存104、扫描器106、二级缓存108、轨道表110、替换模块124、主动表130、块地址映射模块134和选择器132、140、142、146、148、150及相应控制器与图1A实施例中的相同。不同之处在于寄存器112不再由步进信号111控制,而由分支信号161及控制器对总线117上的类型信息译码共同控制。另外在本实施例中增加了一个先进先出缓冲(FIFO)226用于存储循迹器输出的一级缓存寻址地址BN1。缓冲226的写入受寄存器112的控制信号控制,即每次寄存器112存进一个新值,该值随后也被写入226。缓冲226的读出受步进信号111控制,按先入先出的顺序向一级缓冲输出存储在其中的BN1进行寻址以获取相应指令供处理器核102执行。
当控制器译出总线117上的类型信息为非分支类型时,其使选择器118选择增量器114的输出并使寄存器112存进该增量器的输出,经指针115指向并读出轨道表110中同一轨道行中顺序下一个表项。当控制器译出总线117上的类型信息为无条件分支类型时,其使选择器118选择总线117并使寄存器112存进总线117上的地址,经指针115执行并读出分支目标表项。如控制器译出总线117上的类型信息为条件分支类型时,其使选择器118及寄存器112都由处理器核102控制。来自处理器核102的分支判断信号(TAKEN)113为‘0’时,选择器118选择增量器114的输出;当分支判断信号113为‘1’时,选择器118选择总线117。当来自处理器核的分支有效信号161为有效时,寄存器112存进选择器118的输出,使指针115按处理器核102中的判断结果指向并读出轨道表110中该分支指令的顺序下一指令相应表项,或分支目标相应表项。指向选择增量器114的输出并使寄存器112存进该增量器的输出,经指针115指向并读出同一轨道行中顺序下一个表项。也可以不使用分支有效信号161而将其功能合并到步进信号111上,即当处理器核102执行了分支指令但尚未作出分支判断使步进信号111为‘0’,使寄存器112暂停更新。当分支判断已做出分支判断信号113有效时,使步进信号111为‘1’,寄存器112恢复更新,达到与前述使用分支有效信号161同样的效果。
当控制器译出总线117上的类型信息为BN2类型时,则寄存器112不更新,使循迹器指针115保持指向该表项,按前例将BN2由总线117,选择器132及总线133送往块地址映射模块134以映射获取相应的BN1地址,经总线123、选择器146及总线147写回轨道表110中指针115指向的同一表项。此后将该BN1经总线117读出由控制器根据该BN1的指令类型控制选择器118及寄存器112依前例运行。当控制器译出总线117上的类型信息为间接指令类型时,则寄存器112不更新,使循迹器指针115保持指向该表项,按图1A中例使处理器核102产生的间接分支目标指令地址155经选择器148送往主动表130匹配。匹配所得的BN2经由选择器132,总线133并送到块地址映射模块134映射为BN1经总线123、选择器146及总线147写回轨道表110中指针115指向的同一表项。此后将该BN1经总线117读出由控制器根据该BN1的指令类型控制选择器118及寄存器112依前例运行。
如此,因为有缓冲226的缓冲,循迹器120读指针115就可以提前指向处理器核102正在执行的指令之后的若干条指令。当这若干条指令中有分支点内容包含BN2的分支指令时,则可以在读指针115经过该分支指令对应的分支点时通过总线117读出该BN2,并利用循迹器120读指针115指向该分支点与缓冲226输出该分支点的BN1到一级缓存104获取指令供处理器核102执行之间的时间差,按之前实施例所述方法将指令块从二级缓存108填充到一级缓存104,并将BN2转换为BN1写回该分支点。这样,当处理器核102执行该分支指令时,其分支目标指令所在指令块已经存储在一级缓存104中,不会发生缓存缺失。
此外,还可以在图1A实施例的基础上,增加一个副循迹器(slave tracker),使得循迹器如图1A实施例中的循迹器那样向一级缓存104提供寻址地址以获取指令供处理器核102执行,而副循迹器如图2实施例中的循迹器那样提前到达处理器核102正在执行的指令之后的若干个轨迹点,将这些指令中位于二级缓存108的分支目标指令所在指令块填充到一级缓存104中。此外,对于图1B也可以做类似的改进,在本说明书中不再赘述。请参考图3,其为本发明所述缓存***的另一个实施例。
在图3中,在本实施例中,处理器核102、一级缓存104、扫描器106、二级缓存108、轨道表110、替换模块124、主动表130、块地址映射模块134和选择器132、140、142、146、148、150及相应控制器与图1A实施例中的相同。不同之处在于,在本实施例中的轨道表110有两组读端口,可以同时根据两个读指针分别输出相应轨迹点内容。此外,本实施例中增加了一个副循迹器320。所述副循迹器320的结构与循迹器120相似,由寄存器312、增量器314和选择器318构成,其输出的读指针315可以独立对轨道表110寻址。这样,轨道表110根据循迹器120读指针115的寻址,从总线117输出相应轨迹点内容,并根据副循迹器320读指针315的寻址,从总线317输出相应轨迹点内容。
在本实施例中,循迹器120的读指针115包括BN1X和BN1Y,其操作过程与图1A实施例中的循迹器相同,在此不再赘述。而副循迹器320的读指针只包括BN1Y,其操作过程与图2实施例中的循迹器类似。具体地,副循迹器320中的寄存器312每个时钟周期均更新。当处理器核102送来的TAKEN信号113值为‘0’时,表示当前处理器核102执行的不是分支指令,或执行分支指令但分支转移没有发生,则选择器318选择来源于寄存器312的BN1X和来源于增量器314的增一后的BN1Y作为新的BN1更新寄存器312,使得读指针315指向轨道表110中当前轨道的下一个轨迹点,如此反复,直至指向该轨道的最后一个轨迹点为止。在此过程中,读指针315经过的轨迹点内容均被读出,若发现该轨迹点为包含BN2的分支点,则经总线317将所述BN2送往块地址映射模块134及二级缓存108,按之前实施例所述方法在有效BN1X存在的情况下,将BN2转换为BN1回填到该分支点中,或在有效BN1X不存在的情况下由替换模块124分配一个BN1X,并将BN2Y转换为BN1Y从而得到完整的BN1,以及将对应的指令块从二级缓存108填充到一级缓存104,所述BN1回填到该分支点中。这样,随着读指针315沿轨道移动到结束轨迹点,该轨道中所有分支点的分支目标指令所在指令块均在处理器核102执行到该分支指令之前就被填充到一级缓存104中,不会发生缓存缺失。
如之前实施例所述,循迹器120读指针115受步进信号111控制向一级缓存104提供寻址地址以获取指令供处理器核102执行。因此,当处理器核102执行分支指令时,循迹器120读指针115的值就是该分支指令对应分支点的寻址地址BN1,对轨道表110寻址读出该分支点内容并经总线117输出同时送往循迹器120中的选择器118和副循迹器320中的选择器318。此时在步进信号111和TAKEN信号113的控制下工作。
若处理器核102执行分支指令时分支转移发生,则选择器118选择总线117上的BN1更新寄存器112,使得读指针115指向分支目标轨迹点,并向一级缓存104提供从该分支目标轨迹点本身BN1,以获取所述分支目标指令供处理器核102执行。而选择器318也选择总线117上的BN1更新寄存器312,使得读指针315也指向分支目标轨迹点。之后循迹器120按前述方法继续控制一级缓存104向处理器核102提供所述分支目标指令的后续指令,而副循迹器320按前述方法在该轨道(即所述分支目标轨迹点所在轨道)上移动读指针315,确保其经过的分支点的分支目标指令所在指令块被填充到一级缓存104中。
若处理器核102执行分支指令时分支转移没有发生,则选择器118选择来源于寄存器112中的BN1X和来源于增量器114的增一后的BN1Y作为新的BN1更新寄存器112,使得读指针115指向该分支点的后一个轨迹点,并向一级缓存104提供从该后一个轨迹点本身BN1,以获取相应指令供处理器核102执行。而选择器318也选择来源于寄存器312中的BN1X和来源于增量器314的增一后的BN1Y作为新的BN1更新寄存器312,即继续在当前轨道上移动读指针315,确保其经过的分支点的分支目标指令所在指令块被填充到一级缓存104中。
这样,本实施例实现了与图2实施例相同的功能,使得处理器核102执行分支指令时,其分支目标指令所在指令块已经存储在一级缓存104中,不会发生缓存缺失。
在上述实施例中,除了结束轨迹点,轨道表中每行的表项数等于相应一级指令块中的指令数目。由于只有分支指令需要存储分支目标寻址地址(BN1或BN2),而非分支指令对应的轨迹点内容中只有指令类型是必须的,使得轨道表中存储了大量无用数据。因此可以对轨道表110进行压缩,以节省存储空间。请参考图4,其为本发明所述缓存***的另一个实施例。本实施例以图1A实施例为基础,对轨道表110的内部结构进行了详细说明。为了便于描述,在图4中只显示了部分模块。其中,一级缓存104、处理器核102和循迹器120与图1A实施例中的相应部件相同。副循迹器420的结构与图1A实施例中的循迹器120相似,但其输出的读指针为列指针425,只包含了列地址或列号(MBNY),且副循迹器420中选择器418和寄存器432接受控制信号与循迹器120的不同。
在本实施例中,轨道表110由一个指令类型表410和一个目标地址表412构成,两者之间及与一级缓存104的行一一对应,由总线411送来的同一个BN1X指向。指令类型表410的最后一列为结束表项,其余表项的列数与一级指令块中指令的数目相等,且一一对应。在指令类型表410中,除结束表项外的每个表项中均存储了一级缓存104中对应指令的基本类型,结束表项中则存储了一个分支指令类型。这样,指令类型表410中就包含了轨道表110中相应存储块中每一条指令的基本类型信息。
目标地址表412的列数大于或等于一个一级指令块中可能存在的分支指令(包括结束轨迹点的无条件分支)的最大数目,其每行中按对应一级指令块中分支指令出现的顺序依次在从左向右的各个表项中存储了相应分支指令的分支目标指令对应的BN(可以为BN1或BN2)。为了便于说明,将目标地址表412中已经存储了正确的目标指令BN的表项称为有效表项,其余表项为无效表项。特别地,每行中最后一个有效表项中存储了对应指令类型表410中该行结束表项对应的目标轨迹点的BN(相当于结束轨迹点中存储的BN)。这样,目标地址表412中就包含了轨道表110中所有的分支目标轨迹点的寻址地址BN,且任意一条轨道对应的目标地址表412中至少包含一个有效表项(即至少存储了包含结束轨迹点对应的目标指令BN)。
请参考图5,其为本发明所述指令类型表和目标地址表的一个实施例。在本实施例中,以一级缓存104包含4个指令块(指令块0~指令块3),每个指令块包含8条指令(指令0~指令7)为例进行说明,轨道表110相应地也包含4行(4条轨道)。因此轨道表110中的指令类型表410包含4行(第0行~第3行),每行对应一个指令块,包含9个表项,其中前8个表项(第0表项~第7表项)对应指令块中的8条,存储了相应指令的指令类型。在本实施例中,用‘1’表示分支指令类型,用‘0’表示非分支指令类型。最后一个表项(第8表项)为结束表项,必定是一个分支指令类型。
轨道表110中的目标地址表412也包含4行(第0行~第3行),每行包含3个表项,用于存储分支目标指令的BN,以及更为详细的类型信息(如:直接分支、间接分支、有条件分支、无条件分支、分支目标是BN1还是BN2等)。在此,假设每个指令块中最多包含2条分支指令,则再加上结束表项对应的无条件分支转移,因此每行最多需要3个表项用于存储分支目标指令的BN即可。对于指令块包含更多分支指令的情况,可以相应增加目标地址表412的列数,在此不再赘述。此外,将所述更为详细的类型信息存储在指令类型表410中也是可以的,但会增加有更多表项的指令类型表410的容量,因此将其存储在目标地址表412而非指令类型表410,其目的是为了进一步节省存储空间。
在扫描器106审查指令、提取指令信息并建立轨道时,可以将提取出的指令类型存储在指令类型表410中由该指令本身的BN1X、BN1Y指向的表项中。对于分支指令,则还要将匹配或分配得到分支目标指令BN及所述分支类型信息存储在目标地址表412中该BN1X指向的行中的第一个无效表项中,使之成为有效表项。具体地,可以用一个计数器实现所述功能,当建立新轨道时,该计数器被清零,每当审查到一条分支指令时,将匹配或分配得到分支目标指令BN及所述类型信息存储在目标地址表412中该分支指令的BN1X指向的行,及由该计数器指向的列对应的表项中,且计数器增一。这样,当一条轨道建立完毕后,指令类型表410中存储了该轨道上所有轨迹点的基本类型,而目标地址表412中存储了该轨道上所有分支点及结束轨迹点的分支目标指令及分支类型信息。
在本实施例中,目标地址表412中的表项内容由四个部分组成,第一部分表示目标指令寻址地址是BN1还是BN2(‘1’表示BN1,‘2’表示BN2),第二部分表示该分支指令的类型(‘C’表示直接有条件分支,‘U’表示直接无条件分支。‘I’表示间接条件分支),第三、四部分分别表示目标指令BN中的BNX和BNY。例如,图5中目标地址表412第0行的第0表项内容‘2C83’表示相应的分支指令是有条件分支指令,且目标指令寻址地址是BN2,其中BN2X值为‘8’,BN2Y值为‘3’。
如果一个指令的寻址类型是BN2,而指令类型为‘I’,间接条件分支指令,此时循迹器120应等待处理器核102经总线155送出分支目标地址至主动表130匹配,如前例获得BN1地址后按该BN1地址从一级缓存104中读取指令供处理器核102执行。如果一个指令的寻址类型是BN1,而指令类型为‘I’,间接条件分支指令,此时循迹器120可以用该BN1地址经指针115指向一级指令缓存104,从中读取相应指令,及其后续指令供处理器核102猜测执行,但是应该将处理器核102经总线155送出的间接目标地址经主动表130与块地址映射模块134匹配所得的BN1与该猜测执行的BN1相比较。如比较结果相同,则处理器核继续执行。如比较结果不相同,则处理器核102要将流水线上猜测执行的指令及其中间结果清除,控制器控制将匹配所得的BN1写入轨道表的表项中替换原来猜测执行的BN1。之后循迹器读出该BN1依前例执行。
具体地,假设轨道表110中已建立了三条轨道:第0、1、3号轨道。如图5所示,指令类型表410中这三条轨道的第8表项作为结束表项,值均为‘1’。在其余表项中,第0号轨道第3表项、第1号轨道第2表项和第6表项,以及第3号轨道第4表项的值为‘1’,表示这些表项对应的轨迹点是分支点,在目标地址表412中相应存储了分支目标指令的BN。例如,第0号轨道第3表项是该轨道中的第一个分支点,目标地址表412第0行的第0表项与之对应。第0号轨道的下一个分支点就是结束轨迹点,目标地址表412第0行的第1表项与之对应。由于结束轨迹点在本实施例中被视为无条件分支,因此该表项内容中的相应部分为‘U’。
回到图4,循迹器120的读指针115只要沿轨道表110中指令类型表410的行移动,就可以依次读出一条轨道中所有轨迹点对应的基本类型,同时读指针115中的BN1被送到一级缓存104获取指令经总线103供处理器核102执行。根据本发明技术方案,在处理器核102执行到分支指令前,提前读出该分支指令的轨迹点内容,若其中包含的是BN2,则将相应指令块从二级缓存108通过总线105填充到一级缓存104。因此,需要当读指针115指向一个分支点,或该分支点之前的连续非分支点时,即通过总线423从目标地址表412中读出该分支点对应的分支目标BN,判断是BN1还是BN2以进行后续操作(总线423的功能相当于图1A总线117)。
具体地当处理器核102执行指令没有发生分支转移时,寄存器422的值为‘0’,即选择器418选择来源于增量器414的输出(寄存器432中的目标地址表412列号增一)。且经总线413送到存储器426的读指针115中的BN1Y每次读出的基本类型信息都会被存储到寄存器424中。这样,一旦读指针经过分支点对应的基本类型信息(值为‘1’),则在下一时钟周期,寄存器424的值为‘1’,控制寄存器432写入选择器418的输出,使得列指针425更新为原列号增一,指向目标地址表412中的下一个表项。
当处理器核102执行分支指令且分支转移发生时,TAKEN信号113(值为‘1’)被写入寄存器422,且存储器426输出的基础类型信息(值为‘1’)被写入寄存器424。这样,在下一时钟周期,读指针115指向分支目标轨迹点,通过偏移地址映射模块416将该轨迹点的BN1Y映射转换为目标地址表412中该轨迹点之后第一个分支点对应的表项的列号MBNY并放上总线419。此时,寄存器422的值为‘1’,控制选择器418选择总线419上的列号。寄存器424的值为‘1’,控制寄存器432写入选择器418的输出,使得列指针425更新为总线419上的列号,指向目标地址表412中所述轨迹点之后第一个分支点对应的表项。由于指令类型表410和目标地址表412的行一一对应,因此只需要对列进行映射即可。图4实施例中的偏移地址映射模块416实现了所述映射操作。
请参考图6,其为本发明所述偏移地址映射模块的一个实施例。其中,选择器阵列601中选择器的列数等于一级指令块中指令的数目,即8列;选择器的行数等于目标地址表412中每行可以包含表项的最大数目。为了清晰起见,在图6中显示了4行、4列,分别为自下向上的最初4行和自左向右的最初4列。最下一行为第0行,以上各行的行号依次递增。最左面一列为第0列,其右方各列的列号依次递增,每列对应指令类型表中的一个列。第0列中除了第0行选择器的输入A为‘1’、输入B为‘0’以外,其余各选择器的输入A和B均为‘0’。第0行所有选择器的输入B均为‘0’。其他列选择器的输入A来源于前一列同一行选择器的输出值,输入B来源于前一列下一行选择器的输出值。
译码器605对从总线413送来的循迹器120读指针115中的BN1Y进行译码,得到的掩码值送往掩码器607。该掩码值的宽度也为8位,其中所述BN1Y对应的掩码位之前的掩码位的值均为‘1’,该BN1Y对应的掩码位及之后的掩码位的值均为‘0’。之后,将该掩码值与从指令类型表410送来的由读指针115中的BN1X为地址读出的一行内容中除结束轨迹点对应的指令类型以外的8位指令类型进行按位与操作,从而保留该行中该BN1Y对应的掩码位之前指令类型的值,并将其余值清零,得到一个8位的控制字送往选择器阵列601。
该控制字的每一位控制选择器阵列601中的一列选择器。当该位为‘0’时,相应列的选择器全部选择输入A;当该位为‘1’时,相应列的选择器全部选择输入B。即,对于选择器阵列601中的每一列选择器,若对应的控制位为‘1’,则选择来源于前一列下一行的输出值作为输入,使得前一列的输出值整体上移一行,并在最下一行补‘0’,作为本列的输出;若对应的控制位为‘0’,则选择来源于前一列同一行的输出值作为输入,保持前一列的输出值作为本列的输出。这样,控制字中有多少个‘1’,选择器阵列601第一列的输入就会被上移多少行,即选择器阵列601的输入中的唯一一个‘1’被上移了相应行数。因此选择器阵列601的输出中包含且仅包含一个‘1’,且这个‘1’所在的行的位置由控制字确定。之后,由编码器603对选择器阵列601的输出进行编码,所得即为目标地址表412的列地址MBNY经总线419送出,从而完成指令类型表410和目标地址表412之间列地址的转换(即BNY与MBNY之间的转换)。
例如,若当前读指针115的BN1X为‘1’、BN1Y为‘4’,则应该在目标地址表412中找到该轨迹点(BN1X为‘1’、BN1Y为‘4’)之后的第一个分支点(BN1X为‘1’、BN1Y为‘6’)对应的表项(即第1行第1列表项)。此时,掩码器607输出的掩码值为‘11110000’,与指令类型表410送出的第1行值‘00100010’进行按位与操作后得到‘00100000’,即控制字中有1个‘1’。这样,选择器阵列601的输入中的‘1’被上移1行,即选择器阵列601的输出从下向上依次为‘01000000’,经编码器603编码后得到‘1’经总线419输出,使得指令类型表410第1行的列地址(BN1Y)‘4’转换为目标地址表412第1行的列地址(MBNY)‘1’。
又如,若当前读指针115的BN1X为‘0’、BN1Y为‘3’,此时对应的就是一个分支点,则应该在目标地址表412中找到该分支点(BN1X为‘0’、BN1Y为‘3’)对应的表项(即第0行第0列表项)。此时,掩码器607输出的掩码值为‘11100000’,与指令类型表410送出的第0行值‘00010000’进行按位与操作后得到‘00000000’,即控制字中有0个‘1’。这样,选择器阵列601的输入中的‘1’没有被上移,即选择器阵列601的输出从下向上依次为‘10000000’,经编码器603编码后得到‘0’经总线419输出,使得指令类型表410第0行的列地址(BN1Y)‘3’转换为目标地址表412第0行的列地址(MBNY)‘0’。
回到图4,在本实施例中,还增加了一行存储器426用于存储指令类型表410中循迹器120读指针115指向的当前行。在本发明中,存储器426不是必须的,但当存储器426存在时,一旦循迹器120读指针115指向一条新轨道,即读指针115的BN1X值发生改变,将指令类型表410中由所述新的BN1X指向的行的内容读出存储到存储器426中。之后,读指针115只需要访问存储器426即可读出相应指令类型,减少访问指令类型表410的次数以降低功耗。
这样,如之前实施例所述,由步进信号111控制循迹器120中寄存器112的更新,并分别通过总线411和413将读指针115上的BN1X和BN1Y送往一级缓存104获取相应指令经总线103供处理器核102执行。读指针115中的BN1X还通过总线411被送往目标地址表412,而BN1Y还通过总线413被送到偏移地址映射模块416和存储器426。在偏移地址映射模块416中该BN1Y被映射转换为目标地址表412的列号通过总线419送到副循迹器420中的选择器418作为一个输入。
在副循迹器420中,寄存器432中存储了当前处理器核102执行的指令之后的第一个分支点在目标地址表412中的列号,该列号经副循迹器420列指针425输出送到目标地址表412可以在由总线411上的BN1X指向的行中找到相应表项,读出其中的内容并经总线423送往选择器118。副循迹器420中的增量器414则对寄存器432中的列号增一,得到顺序执行时下一个分支点的列号,并送到选择器418作为另一个输入。寄存器422接受来源于处理器核102的TAKEN信号113并暂存一个时钟周期后送往选择器418作为控制信号。这样,一旦处理器核102执行分支指令发生分支转移,则在下一个时钟周期,选择器418选择总线419上的经转换得到的列号输出送往寄存器432,否则选择来源于增量器414的增一后的列号输出送往寄存器432。
读指针115上的BN1Y总线413从存储器426中读出相应的指令类型,经总线421送往副循迹器420中的寄存器424暂存一个时钟周期后作为寄存器432的写使能信号。若该写使能信号的值为‘0’,表示当前处理器核正在执行的指令不是分支指令,则寄存器432的值(即列号)保持不变;若该写使能信号的值为‘1’,表示当前处理器核正在执行的指令是分支指令,则寄存器432的值更新为选择器418的输出。这样,当处理器核执行了分支指令,寄存器432的值才会相应被更新为分支目标指令BN1Y对应的列号或当前轨道上的下一个列号。当该分支指令执行结果判断为不分支时,选择器418选择增量器414的输出存入寄存器432,结果使列指针425指向分支目标表412中原来表项右方的表项。当该分支指令执行结果判断为分支时,选择器418选择总线419上内容存入寄存器432,结果使列指针425指向经偏移地址映射模块416映射所得的分支目标后的第一个分支指令在轨道表412中的表项。
循迹器120及副循迹器420均依存储器426中的指令基本类型运行。当存储器426的输出总线421上是‘0’(即为非分支指令类型)时;循迹器120以增量器114的输出更新读指针115,使其移向顺序下一个轨迹点,并控制一级缓存104输出相应顺序下一条指令供处理器核102执行;副循迹器420中寄存器不更新,列指针425不移动。
当存储器426的输出总线421上是‘1’(即为分支指令类型)时,循迹器120根据分支类型和分支判断更新读指针115,如分支转移没有发生,则读指针115移向顺序下一个轨迹点,并控制一级缓存104输出相应顺序下一条指令供处理器核102执行;如分支转移发生,则读指针115跳转到来源于分支目标表412的输出总线423的分支目标,并控制一级缓存104输出分支目标指令供处理器核102执行。
副循迹器420中寄存器也相应更新,列指针425移动。如分支转移没有发生,则列指针425移向分支目标表412的顺序下一列,读出该列中由读指针115中BN1X地址411指向的表项,经总线423送往循迹器120中选择器118备用。如分支转移发生,则列指针425跳转到跳转后的读指针115经偏移地址映射模块416映射所得的分支目标表412中的一列,将该列中有跳转号的读指针115中BN1X地址411指向的表项,经总线423送往循迹器120中选择器118备用。
本实施例中,分支目标表412的表项中存放的目标地址格式是轨道表地址BN1X和BN1Y。当分支转移发生时,此轨道表地址被选择放上读指针115,其中的行地址BN1X总线411指向一级缓存器104的一个指令块以及指令类型表410中的一行寻址,其中的BN1Y总线413指向上述指令块中一条指令,也对偏移地址映射模块416、存储器426进行列寻址。偏移地址映射模块416将总线413上的BN1Y映射为列地址MBNY送往副循迹器420,放上列指针425。列指针425与读指针115中的BN1X总线411协同指向一个表项,将该表项中内容(包含分支目标地址BN1X和BN1Y)经总线423送到循迹器120备用。
具体地,若分支转移发生,TAKEN信号113控制选择器118选择来自总线423的分支目标供写入寄存器112。在下一时钟周期,循迹器120读指针115更新为所述分支目标指令的BN1,其中的BN1X经总线411读出指令类型表410中分支目标所在的一行送往偏移地址映射模块416及存储器426。读指针115上的BN1Y经总线413被送到偏移地址映射模块416根据上述分支目标所在行的数据转换为分支目标表412的列号,此时寄存器422和424的值均为‘1’,该列号通过总线419送到选择器418经选择后写入寄存器432,使得列指针425更新为分支目标指令BN1Y对应的列号。此时,根据读指针115中的BN1X及列指针425上的列号,可以在目标地址表412中指向从该分支目标指令开始的第一个分支点对应的表项。此时,该表项中的内容被读出并经总线423将分支目标送到选择器118,分支类型送到控制器备用。当读指针115指向存储器426中下一个‘1’,(对应已送到选择器118的分支目标)时,读指针115控制一级缓存104输出相应指令经总线103供处理器核102执行、产生分支转移判断时,按之前实施例所述方法更新循迹器120读指针115,具体过程在此不再赘述。
若分支转移没有发生,则寄存器422的值为‘0’、寄存器424的值为‘1’,在下一时钟周期,循迹器120读指针115中的BN1X保持不变,选择器418选择增量器414的输出写入寄存器432,使得列指针425更新,原列号增一。此时,根据读指针115中的BN1X及列指针425上的行号,可以在目标地址表412中找到该分支指令之后的第一个分支指令对应的表项(原表项右方的表项)。此时,该表项中的内容被读出并经总线423送到选择器118,之后当循迹器120读指针115指向该分支点并控制一级缓存104输出相应指令经总线103供处理器核102执行、产生分支转移结果时,按之前实施例所述方法更新循迹器120读指针115,具体过程在此不再赘述。
下面结合图4和图5,用一个具体的例子进行说明。假设当前轨道表110中指令类型表410和目标地址表412的内容如图5实施例所示,且循迹器120读指针115的值为‘10’(即BN1X为‘1’,BN1Y为‘0’),经总线411和413对一级缓存104寻址以读出对应指令经总线103供处理器核102执行。此时副循迹器420列指针425的值(即列号)也为‘0’,指向目标轨道表由总线411指向的行(即第1行)中的第0号表项,并读出表项内容‘1C01’,即相应分支指令是有条件分支,且分支目标指令已经存储在一级缓存104中,对应的目标地址BN1为‘01’。该BN1经过总线423被送往循迹器120中的选择器118。此外,存储器426根据总线413上读指针115的BN1Y值(‘0’)寻址输出指令类型(‘0’)经总线421送到寄存器424暂存供下个周期使用。控制器根据总线421上指令类型(‘0’)为非分支而控制选择器118选择增量器114的输出送往寄存器112。又因没有分支转移发生,TAKEN信号(‘0’)也被送到寄存器422暂存供下个周期使用。
在下一时钟周期,循迹器120读指针115增一得到‘11’,并经总线411和413对一级缓存104寻址以读出对应指令经总线103供处理器核102执行。由于本时钟周期内寄存器422的值为‘0’,因此偏移地址映射模块416不工作;寄存器424值为‘0’,因此副循迹器420中寄存器432不更新,即列指针425保持不变。此外,存储器426根据总线413上读指针115的BN1Y值(‘1’)寻址输出指令类型(‘0’)经总线421送到寄存器424暂存供下个周期使用。控制器根据总线421上指令类型(‘0’)为不分支控制选择器118选择增量器114的输出送往寄存器112。又因没有分支转移发生,TAKEN信号(‘0’)也被送到寄存器422暂存供下个周期使用。
在下一时钟周期,循迹器120读指针115增一得到‘12’,并经总线411和413对一级缓存104寻址以读出对应指令经总线103供处理器核102执行,即处理器核102执行对应分支指令。控制器根据总线421上指令类型为分支指令,总线423上分支类型为条件分支且地址格式为BN1,控制循迹器暂停等待处理器核102的分支判断。此外,存储器426根据总线413上读指针115的BN1Y值(‘2’)寻址输出指令类型(‘1’)经总线421送到寄存器424暂存供下个周期使用。假设分支转移没有发生,即TAKEN信号113为‘0’。该TAKEN信号(‘0’)控制循迹器120的选择器118选择增量器114输出的增一后的BN1Y,使得读指针115上的BN1在下一时钟周期更新为‘13’。由于本时钟周期内寄存器422的值为‘0’,因此偏移地址映射模块416不工作;寄存器424值为‘0’,因此副循迹器420中寄存器432不更新,即列指针425保持不变。又因分支转移没有发生,TAKEN信号(‘0’)被送到寄存器422暂存供下个周期使用。
在下一时钟周期,循迹器120读指针115增一得到‘13’,并经总线411和413对一级缓存104寻址以读出对应指令经总线103供处理器核102执行。控制器根据总线421上指令类型(‘0’)为非分支控制选择器118选择增量器114的输出送往寄存器112。由于本时钟周期内寄存器422的值为‘0’,因此偏移地址映射模块416不工作;且控制选择器418选择增量器414输出;寄存器424的值为‘1’,控制寄存器432更新为选择器418输出的增一后的列号‘1’,使得列指针425指向目标轨道表由总线411指向的行(即第1行)中的第1号表项,并读出表项内容‘1C35’,即该分支指令是有条件分支,且分支目标指令已经存储在一级缓存104中,对应的目标地址BN1为‘35’。该BN1经过总线423被送往循迹器120中的选择器118备用。此外,存储器426根据总线413上读指针115的BN1Y值(‘3’)寻址输出指令类型(‘0’)经总线421送到寄存器424暂存供下个周期使用。又因没有分支转移发生,TAKEN信号(‘0’)被送到寄存器422暂存供下个周期使用。
在之后的两个时钟周期,如之前实施例所述,循迹器120读指针115每个时钟周期增一,依次为‘14’、‘15’,并依次经总线411和413对一级缓存104寻址以读出对应指令经总线103供处理器核102执行。在此过程中,由于寄存器422的值均为‘0’,因此偏移地址映射模块416不工作;寄存器424值均为‘0’,因此副循迹器420中寄存器432不更新,即列指针425保持不变。此外,存储器426根据总线413上读指针115的BN1Y值(依次为‘4’、‘5’)寻址输出指令类型(‘0’)经总线421送到寄存器424暂存供下个周期使用。又因没有分支转移发生,TAKEN信号(‘0’)被送到寄存器422暂存供下个周期使用。
在下一时钟周期,循迹器120读指针115增一得到‘16’,并经总线411和413对一级缓存104寻址以读出对应指令经总线103供处理器核102执行,即处理器核102执行对应分支指令。此外,存储器426根据总线413上读指针115的BN1Y值(‘6’)寻址输出指令类型(‘1’)经总线421送到寄存器424暂存供下个周期使用。控制器根据总线421上指令类型(‘1’)为分支指令,总线423上分支类型为条件分支且分支目标为BN1,控制循迹器暂停等待处理器核102的分支判断。假设此时分支转移发生,即TAKEN信号113为‘1’。该TAKEN信号(‘1’)控制循迹器120的选择器118选择来源于总线423的分支目标BN1(‘35’),使得读指针115上的BN1在下一时钟周期更新为‘35’。由于本时钟周期内寄存器422的值为‘0’,因此偏移地址映射模块416不工作;寄存器424值为‘0’,因此副循迹器420中寄存器432不更新,即列指针425保持不变。又因分支转移发生,TAKEN信号(‘1’)被送到寄存器422暂存供下个周期使用。
在下一时钟周期,循迹器120读指针115更新为‘35’,即指向指令类型表第3行第5列表项。读指针115的值经总线411和413对一级缓存104寻址以读出对应指令(即分支目标指令)经总线103供处理器核102执行。由于本时钟周期内寄存器422的值为‘1’,因此读指针115上的BN1Y(‘5’)经总线413被送到偏移地址映射模块416转换得到列号MBNY为‘1’,该值经总线419送到副循迹器420的选择器418,此时寄存器422的值‘1’控制选择器418选择来源于总线419的列号‘1’作为输出;寄存器424的值为‘1’,控制寄存器432更新为选择器418输出的列号‘1’,使得列指针425指向目标轨道表由总线411指向的行(即第3行)中的第1号表项,并读出表项内容‘1U00’,即该相应指令是无条件分支指令,且分支目标指令已经存储在一级缓存104中,对应的目标地址BN1为‘00’。该BN1经过总线423被送往循迹器120中的选择器118。此外,存储器426根据总线413上读指针115的BN1Y值(‘5’)寻址输出指令类型(‘0’)经总线421送到寄存器424暂存供下个周期使用。又因没有分支转移发生,TAKEN信号(‘0’)被送到寄存器422暂存供下个周期使用。此后三个周期总线421上读出的指令类型都为非分支类型,控制器据此按前例使循迹器的指针115中BN1Y每周增‘1’,而副循迹器420则不作更新。
当指针115指向指令类型表410中3行8列时,其中的‘1’被读出,控制器据此判断该指令为分支指令,又从423上译出该分支为无条件分支指令且地址格式为BN1类型,即控制选择器118选择总线423上的分支目标‘00’存入寄存器112。该3行8列中的‘1’也由总线421送往寄存器424暂存。该无条件分支类型也产生一个‘1’送往寄存器422暂存。下一周期循迹器的指针即指向指令类型表410中0行0项,由此开始执行,并控制一级缓存器104送出相应的指令供处理器核102执行。在寄存器424与422为‘1’的值控制下,选择器418如前例选择总线419送来的映射结果(此时为‘0’)存入寄存器432使指针425指向第0列。之后的运行过程可以以此类推,从而正确地运行指令,实现本发明所述的功能。
此外,还可以按图1B所述方法对图4实施例进行改进,使图4的实施例在运行到每条轨道对应最后一条指令的轨迹点后不需要在结束轨迹点上空耗一个周期。此实施例中使用前述区分结束轨迹点方法中的第三种,当指令块的最后一条指令为非分支指令时,将结束轨迹点合并到该指令对应的轨迹点中。请参考图7,其为本发明所述缓存***的另一个实施例。
本实施例与图4类似,只显示了部分模块。其中,处理器核102、一级缓存104、偏移地址映射模块416、存储器426和副循迹器420与图4中的相应部件相同。不同之处在于,轨道表110每次输出两个轨迹点的内容,即指令类型表410分别通过总线421和429输出循迹器120读指针115指向的表项内容及其后的一个表项内容,以及目标地址表412分别通过总线423和427送出读指针115中BN1Y经偏移地址映射模块416转换得到的MBNY指向的表项内容及其后的一个表项内容。循迹器120中则相应增加了类型译码器752、控制器754和选择器116。此外,处理器核102还送出信号161到循迹器120中的控制器754。
在本实施例中,增量器114的输出不再直接送到选择器118,而是送到选择器116。目标地址表412的读端口在副循迹器420输出的列指针425的寻址下,输出相应两个表项(当前表项及下一表项)内容并放上总线423和427。其中,目标地址表412经总线423输出的当前表项内容中的目标地址BN被送往选择器118、分支类型信息则被送往控制器754。目标地址表412经总线427输出的下一表项内容中的目标地址BN被送往选择器116、分支类型信息则被送往控制器752。
存储器426在循迹器120输出的读指针115中的列地址413寻址下,输出两个表项(当前表项及下一表项)内容分别放上总线421和429。其中,存储器426经总线421输出的当前表项中的基本类型信息除了如图4实施例那样被送往寄存器424外,还被送到类型译码器752和控制器754。存储器426经总线429输出的下一表项中的基本类型信息则也被送到类型译码器752和控制器754。
类型译码器752对指令类型表410送来的当前表项的基本类型信息和下一表项的基本类型信息进行译码,其结果控制选择器116从增量器114的输出和总线427的输出进行选择并送往选择器118。
与图1B实施例类似,目标地址表412中的BN2在被用到时都按之前实施例所述方法被转换为BN1,因此为了便于说明,在本实施例中,可以认为目标地址表412输出的总线423和427上的目标地址都是BN1。
在本实施例中,若总线421上的基本类型信息为非分支指令,则类型译码器752控制选择器116选择增量器114的输出,控制器754控制选择器118选择选择器116的输出,使得下个时钟周期寄存器112中的BN1X保持不变、BN1Y增一,读指针指向指令类型表410中顺序执行的下一个表项,并从一级缓存104中读出该下一指令供处理器核102执行。在此实施例中为方便描述,假设来自处理器核的有效信号111一直有效。
若当前指令总线421上的基本类型信息为分支指令、且下一指令总线429上的基本类型信息为分支指令、总线423上的分支类型信息为条件分支、且总线427上的分支类型信息为无条件分支指令,则类型译码器152控制选择器116选总线427上的无条件分支目标BN1,控制器754根据TAKEN信号113控制选择器118。若TAKEN信号113为‘1’,表示当前表项对应的分支指令的分支转移发生,则选择器118选择总线423上的分支目标BN1,使得下个时钟周期循迹器120读指针115被更新为该当前分支指令的分支目标BN1,并从一级缓存104中读出该分支目标指令供处理器核102执行。否则,选择器118选择来源于选择器116的输出(即该无条件分支指令的分支目标BN1),使得下个时钟周期循迹器120读指针115被更新为该无条件分支指令的分支目标BN1,并从一级缓存104中读出该分支目标指令供处理器核102执行。
若当前指令总线421上的基本类型信息、下一指令总线429上的基本类型信息、总线423上的分支类型信息、总线427上的分支类型信息并非上述组合,则下一指令类型不影响当前指令,类型译码器752控制选择器116选择增量器114的输出。控制器754根据当前指令总线421上的基本类型信息和总线423上的分支类型信息、地址格式控制循迹器120的读指针115的运行方向。如当前指令类型为非分支指令,则类型译码器752控制选择器116选择增量器114的输出,控制器754控制选择器118选择选择器116的输出,使得下个时钟周期寄存器112中的BN1X保持不变、BN1Y增一,读指针指向指令类型表410中顺序执行的下一个表项,并从一级缓存104中读出该下一指令供处理器核102执行。
若总线421上的基本类型信息为分支指令、且总线423上的分支类型信息为有条件分支指令,控制器754根据TAKEN信号113控制选择器118。若TAKEN信号113为‘1’,表示当前表项对应的分支指令的分支转移发生,则选择器118选择总线423上的分支目标BN1,使得下个时钟周期循迹器120读指针115被更新为该分支指令的分支目标BN1,并从一级缓存104中读出该分支目标指令供处理器核102执行。否则,选择器118选择来源于增量器114的输出,使得下个时钟周期寄存器112中的BN1X保持不变、BN1Y增一,并从一级缓存104中读出该下一指令供处理器核102执行。
若总线421上的基本类型信息为分支指令、且总线423上的分支类型信息为无条件分支指令,控制器754控制选择器118选择总线423上的分支目标BN1,使得下个时钟周期循迹器120读指针115被更新为该分支指令的分支目标BN1,并从一级缓存104中读出该分支目标指令供处理器核102执行。
在本实施例中,其他模块的功能与操作均与之前实施例相同,在此不再赘述。
图7所示的使用压缩表的缓存***,仅需要对其循迹器120做如图1C所示的改进也可以支持猜测执行。请参见图8,其为本发明所述循迹器的另一个实施例。本实施例的循迹器120如同图1C中的循迹器增增添了选择器162及寄存器164,用于选择、存储分支猜测执行未选中的另一支暂存,以备猜测错误时使用,二输入选择器118也被换为三输入选择器818。其工作方式如同图1C一样,是控制器854在译出总线423上的分支类型为条件分支指令时,按该指令的预测方向选择分支的一支放上总线115控制一级缓存104向处理器核提供不间断的指令供执行,并将这些指令标记为猜测执行。同时将未被选中的另一支的第一条指令的轨道表地址存入寄存器164备用。若由总线113提供的分支判断证明猜测为正确时,即沿原猜测方向继续执行。若证明猜测为错误时,即如同图1C实施例,控制器854将猜测执行的指令及中间结果清除,并控制选择器166选择将存放在寄存器164中的轨道表地址放上指针115,使一级缓存器104提供分支的另一支的第一条指令供处理器核102执行。指针115中的BNX1经总线411也指向指令类型表410中分支另一支的相应轨道,将其读出放入偏移地址映射模块416,与指针115中的BNY1值413共同作用产生上述分支另一支第一条指令后的第一条分支指令在目标地址表412中的列地址MBNY经总线419送往从副循迹器420。同时控制器854向副循迹器420中的选择器送出选择分支的控制信号,经寄存器延迟一周后,控制选择器418选择总线419;同时控制器854向或逻辑824送出时钟使能信号,经寄存器延迟一周后控制将总线419上的MBNY值存进寄存器432。总线411与指针425配合指向目标地址表412中的相应表项,将其中的分支类型及轨道表地址经总线423送往控制器854及选择器818备用。下一表项通过总线427送往选择器116,此后控制器854即按从存储器426读出的指令类型及总线423上的分支类型控制循迹器的方向使缓存***向处理器核102提供适当的指令供执行。
另一种实现方式是在从副循迹器420中如同在循迹器120中按同样方式添加选择器及寄存器用于存储不同于猜测方向的另一支轨道上的第一个分支目标的MBNY值,并将二输入选择器418由一个三输入选择器置换。该寄存器的输出接该三输入选择器增加的输入端。这样,副循迹器420中的三输入选择器可以由控制器854产生的循迹器120中同样控制信号延迟一周后控制;但控制器854还是需要产生时钟使能信号送往或逻辑824在猜测错误时使能寄存器432存入原来存在新添加寄存器中的列地址MBNY值,以代替上例中总线419上的值(新添加寄存器中存的列地址MBNY值与总线419上经映射得到的列地址MBNY值是一样的)。此实施方式的操作与上例中操作相似,在此不再赘述。
根据现有的分支预测技术,在分支指令的分支转移结果尚未产生时,先猜测性地执行分支点的一条分支路径,一旦预测不准确,则需要清空流水线,重新从分支点的另一条分支路径开始执行。在本发明中,根据产生分支转移判断的流水线段的位置将处理器核中的流水线分为前端(front end)流水线和后端(back end)流水线。其中后端流水线包括从产生分支判断的流水线段开始到流水线终了的流水线段,前端流水线包括从第一级流水线段到分支判断前的一个流水线段。这样,只要处理器核中包含了由选择器选择的两个前端流水线和一个后端流水线,就可以不必等待分支判断结果,由两个前端流水线分别执行分支指令顺序地址的后续指令和分支目标指令及其后续指令。当分支判断结果产生时,再根据该结果控制选择器选择两个前端流水线之中一个的中间结果传递到后端流水线继续执行,从而避免了因分支转移预测错误导致的性能损失。
请参考图9,其为本发明所述无分支损失的缓存及处理器***的一个实施例。为了便于描述,在图9中只显示了部分模块,其中一级缓存104和轨道表110均与图2实施例中的相应模块相同。不同之处在于,图9中的处理器核1102包含两条前端流水线和一条后端流水线。这两条前端流水线分别为对应分支点后顺序(fall-through)地址及其后续指令的顺序前端流水线;以及对应分支目标及其后续指令的目标前端流水线。此外,图9中还增加了一个指令读缓存1104及相应的一行轨道表1110和一个选择器1108。其中,指令读缓冲1104的大小可以容纳一级缓存104中的一个指令块,用于存储处理器核1102正在执行的当前指令块;轨道表1110则存储了指令读缓冲1104对应的轨道。在本发明的所有实施例中,为便于说明,都假设指令读缓冲的时延为‘0’,即读缓冲可以当周写入当周读出。此外,除循迹器120外,还增加了另外一个循迹器1120。为了便于描述,在本实施例中将循迹器120称为当前循迹器,将循迹器1120称为目标循迹器。也增加了控制器1140以协调两个循迹器的工作并控制对读缓存1104及轨道表1110的写入。
循迹器120和1120的结构相同,且和图7实施例中的循迹器类似,不同之处在于分别用三输入选择器代替了相应的两输入选择器而且内部细节被省略了以便于理解。其中,循迹器120中的选择器118增加的输入端接循迹器1120中增量器1114的输出1123;而循迹器1120中的选择器1118增加的输入端接轨道表1110的输出总线117。总线1117既可提供整条轨道以填充轨道表1110(此时只用BNX寻址);也可提供轨道中一个轨迹点(一个表项)供循迹器1120使用。同理总线103既可提供整个指令块以填充指令缓冲1104(此时也只用BNX寻址);也可提供指令块中一条指令供处理器核1102执行。
处理器核1102提供的步进信号111控制当前循迹器120的步进并向控制器1140提供流水线状态。控制器1140监测处理器核1102提供的分支判断113,目标前端步进信号1111以及来自轨道表的总线117,1117上的指令类型及地址格式协调、控制全***运行。控制器1140在处理器核1102执行一条无条件分支指令或条件分支指令且处理器核的分支判断信号113为分支成功时,控制当前循迹器120中的选择器118选择总线1123,即目标循迹器1120中增量器1114的输出,以存入寄存器112,更新读指针115。控制器1140在监测读指针115判断处理器核1102执行到一个指令块中最后一条指令时,控制当前循迹器120中的选择器118选择总线117,即由轨道表1110中最后一个表项提供的下一顺序指令块的地址(实际上是该行的结束轨迹点,具体操作方式请见图7实施例,在此不再赘述),以存入寄存器112,更新读指针115。除了上述情况以外,控制器1140控制选择器118选择增量器114的输出,使读指针115在步进信号111的控制下步进。
当控制器1140在总线117上监测到一个代表分支指令的表项时,控制目标循迹器1120中的选择器1118选择总线117上的分支目标以存入寄存器1112,更新读指针1115。当控制器1140监测总线1115发现一个指令块的最后一条指令正在被送往处理器核中的目标前端流水线执行时,控制器控制选择器1118选择总线1117上内容存入寄存器1112更新指针1115(实际上是该行的结束轨迹点,具体操作方式请见图7实施例,在此不再赘述)。除了上述情况以外,控制器1140控制选择器1118选择增量器1114的输出,使读指针1115在目标前端步进信号1111的控制下步进。控制器1140在轨道表1110经总线117输出的表项为无条件分支时或监测读指针115决定要读取结束轨迹点时控制选择器1108选择当前读指针115的BNX411;其余时候选择目标读指针1115的BN1X部分1141。指针115在步进时控制读缓冲1104向处理器核1102中的顺序前端流水线提供指令供执行。指针1115在步进时控制一级指令缓存器104向处理器核1102中的目标前端流水线提供指令供执行。
在本实施例中,循迹器120读指针115中的BNY经总线413对轨道表1110和指令读缓存1104寻址,读出相应轨迹点内容和指令,并经总线1103向处理器核1102中的顺序前端流水线提供所述指令。循迹器1120读指针1115中的BNX经总线1141被选择器1108选择后经总线1109对轨道表110和一级缓存104寻址,找到对应的轨道和指令块;同时,循迹器1120读指针1115中的BNY经总线1143对该轨道和指令块寻址,读出相应轨迹点内容和指令,并经总线103向处理器核1102中的目标前端流水线提供所述指令。
下面以图10所示的轨道表为例进行说明。虽然图10的轨道表110是由一张表构成,并没有被分为指令类型表和目标地址表,但其包含的内容实质上与图5实施例中指令类型表410和目标地址表412包含的内容相同。在本实施例中,当前循迹器120如前例中的循迹器那样,根据处理器核1102送来的步进信号111,即控制器1140根据指令类型即处理器核的分支判断113,更新读指针115。由于指令读缓冲1104和轨道表1110中分别存储了当前指令块和当前轨道,因此只需要根据读指针115中的BNY经总线413寻址即可在其中找到提供给处理器核1102执行的当前指令及相应的当前轨迹点。若从轨道表1110读出的轨迹点内容中的指令类型表示当前指令不是分支指令,则当前循迹器120按前例更新读指针115,使之步进并控制指令读缓冲1104输出相应指令经总线1103供处理器核1102的顺序前端流水线执行,直至读指针115指向轨道表1110中的一个分支点。在此过程中,处理器核1102的后端流水线始终选择顺序前端流水线的输出结果执行。
假设该分支点为无条件分支,则控制器1140控制当前循迹器120中的选择器118选择总线117上来源于轨道表1110的轨迹点内容(即该无条件分支的分支目标轨迹点BN)作为输出更新读指针115。读指针115中的BNX经总线411由选择器1108选择后,经总线1109对一级缓存104和轨道表110寻址,读出相应的目标指令块和目标轨道,分别通过总线103和1117存储到指令读缓冲1104和轨道表1110中。同时,读指针115中的BNY经总线413对指令读缓冲1104和轨道表1110寻址,读出所述被存储的目标指令块中的目标指令经总线1103送往处理器核1102的顺序前端流水线供执行,并读出目标轨道中的目标轨迹点内容经总线117送往当前循迹器120,存入寄存器112。如此完成了无条件分支转移,之后的操作如前例所述。
对于读指针115指向条件分支的情况,以图10轨道表110中的第1行存在轨道表1110中为例。如前例所述,当读指针115中BN1Y部分413指向轨道表1110中的第一轨迹点时,经总线117读出的表项中的指令类型为非分支,该类型控制选择器118选择增量器114的输出,使读指针115步进到轨道表1110中的第二轨迹点1130,也同时通过BNY总线413控制读缓存1104中对应轨迹点1130的相应指令(是一条分支指令)经总线1103送往处理器核1102的顺序前端流水线执行。轨迹点1130的表项内容1C01经总线117读出后,经控制器1140译码判断其分支类型为条件分支,地址格式为BN1。此时控制器1140控制选择器118选择增量器114的输出;选择器1118选择总线117上的分支目标BN。如此在下一个时钟的上升沿,指针115被更新为指向轨迹表1110中轨迹点1130后的第3号轨迹点,并将相应的分支指令之后的顺序下一条指令送往顺序前端流水线;同时指针1115被更新指向轨道表110中分支源1130的分支目标轨迹点(此例中为0行第一个轨迹点‘01’),并指向一级指令缓存104中读出与分支目标相应的指令送往目标前端流水线。
之后,当前循迹器120读指针115和目标循迹器1120读指针1115均如前例步进并分别控制指令读缓冲1104和一级缓存104分别输出相应指令供处理器核1102的两个前端流水线执行,直至所述与轨迹点1130对应的分支指令到达后端流水线的第一段,产生分支判断。假设前端流水线的深度为N,则此时处理器核1102已分别处理了从当前指令块中该分支指令之后的后续指令和分支目标指令块中从分支目标指令开始的后续指令中的各N条指令。
在本实施例中,分支点1130的分支转移没有发生,因此处理器核1102中的后端流水线选择顺序前端流水线的输出结果继续执行(即丢弃了目标前端流水线的中间执行结果);控制器1140控制当前循迹器120中选择器118选择增量器114的输出在步进信号111控制下继续步进;目标循迹器1120则停止步进。这样,随着当前循迹器120的继续步进,从储存在读缓冲1104中的当前指令块继续提供后续指令给处理器核1102执行。
之后,当前循迹器120读指针115指向分支点1132(轨道表110中第1行第6个轨迹点)时,控制器1140读出其中的内容为‘1C35’,表示分支点1132为有条件直接分支,且分支目标轨迹点BN为‘35’,即第3行第5个轨迹点。轨道表1110根据总线413上的BN1Y输出该目标轨迹点BN。控制器1140如前控制经总线117将该BN‘35’送到目标循迹器1120存入寄存器1112更新读指针1115;而循迹器120如前选择增量器114的输出使读指针115步进。之后与前例相同,在与轨迹点1132相应的分支指令到达产生分支转移结果的流水线段时,循迹器120的读指针115和循迹器1120的读指针1115已经分别控制指令读缓冲1104和一级缓存104向处理器核1102的顺序前端流水线和目标前端流水线输出了N条指令。
在本实施例中,分支点1132的分支转移成功发生,因此处理器核1102中的后端流水线选择目标前端流水线的输出结果继续执行(即丢弃了顺序前端流水线的执行结果)。当前循迹器120中的选择器118则选择总线1123上来源于目标循迹器1120读指针1115中的BNX以及增量器1114的增一后的BNY作为BN存储到寄存器112中以更新读指针115。该BN指向的就是从分支目标开始第N+1条指令,即处理器核1102接下来应该执行的指令。同时,目标循迹器1120读指针1115中的BNX经选择器1108选择后通过总线1109在一级缓存104和轨道表110中分别读出相应指令块(即所述分支目标开始第N+1条所在的指令块)和相应轨道经总线103和1117存储到指令读缓存1104和轨道1110中。至此,当前循迹器120读指针已经更新为指向分支目标开始第N+1条指令,而该指令所在的指令块已经被填充在指令读缓冲1104中,且对应的轨道已经被填充在轨道表1110中。这样,随着当前循迹器120的继续步进,沿所述分支目标开始第N+1条指令所在的指令块继续由读缓冲1104经总线103向顺序前端流水线提供后续指令给处理器核1102执行。处理器1102中后端流水线在选择目标前端流水线N个时钟周期后选择顺序前端流水线,使来自目标前端流水线的第N条指令与来自顺序前端流水线的第N+1条指令之间无间断执行。由此实现无损失分支。
在上述过程中,当目标循迹器1120读指针1115步进到轨道表110中目标轨道的结束轨迹点或无条件分支点时,可以如前例所述更新为目标轨道的下一轨道或无条件分支目标轨道。然而,一旦当前循迹器120读指针115步进到轨道表1110中当前轨道的结束轨迹点或无条件分支点,且当时轨道表110正在被目标循迹器1120使用以控制向目标前端流水线提供指令时,则无法从轨道表110中读出相应的下一轨道或无条件分支目标轨道。
根据本发明技术方案,第一种解决方法是停止当前循迹器120读指针115的步进,等待处理器核1102产生分支转移结果。若分支转移没有发生,则此时目标循迹器1120不再步进,选择器1108选择总线411上的BNX(及当前轨道的下一轨道或无条件分支目标轨道的BNX)控制轨道表110通过总线11125输出该下一轨道或无条件分支目标轨道存储到轨道表1110中,使得当前循迹器120可以继续步进。若分支转移发生,则如前例所述将当前循迹器120读指针115更新为所述分支目标开始第N+1条指令对应的BN,并将该指令所在的指令块和相应轨道分别填充到指令读缓冲1104和轨道表1110中,使得当前循迹器120可以继续步进。
第二种解决方法是暂停目标循迹器1120读指针1115的步进。利用这一暂停周期,选择器1108选择总线411上的BNX(及当前轨道的下一轨道或无条件分支目标轨道的BNX)控制轨道表110通过总线11125输出该下一轨道或无条件分支目标轨道存储到轨道表1110中,使得当前循迹器120可以继续步进。而在下一时钟周期,目标循迹器1120读指针1115则可以继续步进。后续操作如前例所述。
第三种解决方法是对图9实施例的结构进行改进,增加一个指令读缓冲及相应的轨道表用于存储目标指令块及相应轨道。这样,当前循迹器120和目标循迹器1120均对各自的指令读缓冲及轨道寻址,而不用访问一级缓存104和轨道表110。一旦任意一个循迹器需要转向下一轨道或无条件分支目标轨道时,一级缓存104和轨道表110可以输出相应指令块及轨道填充到相应指令读缓冲及相应轨道表中。图11是这种解决方法在如图8例中分离轨道表上的实施例。单一轨道表的这种解决方法可依此类推,不再赘述。
请参考图11,其为本发明所述支持无损失分支的缓存***的另一个实施例。在图11中,一级缓存104、轨道表110、偏移地址映射模块416、存储器426、图8实施例中的相应部件相同,循迹器120与副循迹器910也与图8实施例中中循迹器120及副循迹器420功能相同。其中循迹器120为当前循迹器,副循迹器920为当前副循迹器,且为了清晰起见,图11中只显示了目标循迹器120中的部分模块,而省略了寄存器164、选择器162、控制器752和854,并省略了或逻辑824;另外,图8中的二输入选择器162被三输入选择器118替代以接受当分支转移发生时从目标循迹器送来的BN地址。副循迹器910中的寄存器422,424被移到920之外,而包含在控制器1260中。控制器1260接受来自处理器核1102的TAKEN信号113、读指针115与1115以及总线421、921、423的输入控制所有4个循迹器与副循迹器的运行。处理器核1102和指令读缓冲1104则与图9实施例中的相应部件相同,其中指令读缓冲1104用于存储当前指令块,与存储器426中的指令类型相对应。
图11中增加了一个指令读缓冲1204用于存储目标指令块。相应地,增加了一个存储器1226用于存储该目标指令块对应的指令类型,并增加了一个目标循迹器1120和一个当前副循迹器1220。其中,目标循迹器1120的结构与图7例中的循迹器120相同,目标副循迹器1220与当前副循迹器910的结构相同。此外,在图11中还有选择器1108、1210和选择器1208。其中,选择器1108对两个循迹器的读指针中的BNX进行选择,其输出控制一级指令缓存器104向读缓冲1104或读缓冲1204填写指令块,也指向轨道表110中的一行,从该行中读出指令类型表410中的整行放入偏移地址映射模块416。选择器1210用于对两个循迹器的读指针中的BNY进行选择,其输出被送到偏移地址映射模块416与其中的由相应BNX读出的表410内容共同作用以产生下一分支点地址MBN1Y信号419。选择器1208用于对两个副循迹器的读指针进行选择,其输出用于从目标地址表412中上述BNX指向的一行中读出一个表项,其表项中的分支类型及地址格式被控制器用于决定循迹器的走向及当地址格式为BN2时用于将指令块填入一级缓存器104。选择器1108与1210由控制器1260产生的同一信号控制,选择器1208由控制器1260产生的另一信号加以控制(为了清晰起见,该等信号未在图中显示)。这样,选择器1108、1210和1208配合对循迹器、副循迹器的读指针进行选择。在本发明的所有实施例中,为便于说明,都假设指令读缓冲的时延为‘0’,即读缓冲可以当周写入当周读出。
在本实施例中,当前循迹器120在处理器核1102送来的步进信号111的控制下,更新读指针115,控制指令读缓冲1104输出相应指令经总线1103送往处理器核1102的顺序前端流水线供执行;而读指针115的BN1Y部分413则在偏移地址映射器416中映射为MBN1Y存入当前副循迹器910。副循迹器910以该MBN1Y值在目标地址表412中由读指针115所指向的一行中读出从413所指向的指令开始的第一条分支指令(可以是413所指向的指令本身)的分支目标。该分支目标,以下称分支目标1,被存入目标循迹器1120中,放上读指针1115,以其中的BN1X1411控制从一级指令缓存器104读出存入目标指令读缓冲1204并以读指针1115其中的BN1Y部分1143从中读取相应指令经总线1255送往处理器核1102的目标前端流水线供执行;而读指针1115的BN1Y部分1143则在偏移地址映射器416中映射为MBN1Y存入目标副循迹器1220。过程中读指针115一直步进向顺序前端流水线提供指令,读指针1115也一直步进直到填满目标前端流水线。
控制器1260接受处理器核的反馈与从轨道表提前读出的指令、分支类型及地址格式,协调、控制全***运行。处理器核1102提供的步进信号111控制当前循迹器120的步进并向控制器1260提供流水线状态。控制器1260监控总线421、921上的指令类型以及423上的分支类型、地址格式控制各循迹器的运行以及控制对读缓冲与相应的指令类型存储器的存储以及偏移地址映射模块的偏移操作。控制器1260在处理器核1102执行一条无条件分支指令或条件分支指令且处理器核的分支判断信号113为分支时,控制当前循迹器120中的选择器118选择总线1123,即目标循迹器1120中增量器1114的输出,以更新寄存器112。控制器在处理器核1102执行到一个指令块中最后一条指令时,控制当前循迹器120中的选择器118选择总线423,即由目标地址存储器412此时提供的下一顺序指令块的地址,以更新寄存器112。在上述两个情况发生的下一时钟周期控制器控制当前副循迹器910中的选择器918选择来自偏移地址映射模块416的总线419上的MBN1Y(目标地址存储器412的列地址)更新寄存器912。除了上述情况以外,控制器控制选择器118选择增量器114的输出,使读指针115在步进信号111的控制下步进;并控制选择器918选择增量器914的输出,当总线421上的数值为‘1’时(表示此时送往处理器核执行的指令是一条分支指令),步进使得当前副循迹器读指针425指向目标地址存储器中的顺序下一列。
当控制器1260在总线423上监测到一个新的分支目标时(其监测方式可以是监测总线423上的变化或者监测目标地址存储器412的读请求或读地址,如1223的变化等),控制目标循迹器1120中的选择器1118选择总线423上的分支目标以更新寄存器1112,并且在一个时钟周期后控制目标副循迹器1220中选择器1218选择来自偏移地址映射模块416的总线419上的MBN1Y(目标地址存储器412的列地址)更新寄存器1212。当控制器1260监测总线1115发现一个指令块的最后一条指令正在被送往处理器核中的目标前端流水线执行时,控制器控制选择器1108及1208选择以目标读指针1115中的BN1X部分1411及总项1215上的读指针中BN1Y部分为地址读取目标地址表412中该行最后一个表项(下一顺序地址数据块的地址)放上总线423,并控制目标循迹器1120冲的选择器1118选择以总线423上的分支目标地址更新寄存器1112;并在下一时钟周期控制目标副循迹器1220中的选择器1218更新寄存器1212。除了上述情况以外,控制器控制选择器1218选择增量器1114的输出,使读指针1115在目标前端步进信号(为明了起见,该信号在图11上未显示)的控制下步进;并控制选择器1218选择增量器1214的输出,当总线423上的数值为‘1’时(表示此时送往处理器核执行的指令是一条分支指令),步进使得目标副循迹器读指针1215指向目标地址存储器中的顺序下一列。
如果读指针115步进过程中从存储器426中读出一个‘1’,表示对应指令是一条分支指令,以下称分支指令1。此时与图11例中相同,当前循迹器指针还是沿当前轨道步进并控制指令读缓冲1104输出相应指令经总线1103送往处理器核1102的顺序前端流水线供执行。存储器426的输出被放上总线421控制当前副循迹器910步进,其读指针425控制从目标地址表412中读出下一条分支指令的分支目标地址,以下称分支目标2。
如分支指令1的分支判断为不分支,则指针115继续沿当前轨道步进,向顺序前端流水线持续提供指令;而目标前端流水线则被清空,分支目标2被填入目标循迹器1120,此后如前由读指针1115控制向目标前端流水线提供从分支目标2开始的指令,以备指针115指向的下一个分支点。如果读指针1115步进过程中从存储器1226中读出一个‘1’,表示对应指令是一条分支指令,则总线921据此控制目标副循迹器1220步进,记录相应的下一条分支指令在目标地址表中地址MBN1Y备用。如分支指令1的分支判断为分支,则指针读1115的顺序下一个步进值被填入当前循迹器120的指针115,目标读缓冲1204的内容被存入当前读缓冲1104并由此向顺序前端流水线提供指令。处理器核1102也切换执行来自目标前端流水线的指令N个时钟周期,之后切换回执行来自顺序前端流水线的指令。
此外,一旦循迹器120或1120的读指针到达结束轨迹点或无条件分支点,则控制器1260控制该循迹器与相应的副循迹器共同如图8实施例所述操作。以下以当前循迹器120为例说明,目标循迹器1120在结束轨迹点或无条件分支点的操作方式与当前循迹器相似但其提供的指令被送往处理器核1102中的目标前端流水线执行。在当前循迹器120的读指针115到达一个分支点之前,当前副循迹器910的读指针425已经通过指针1223如前例指向轨道表110中目标地址表412的相应表项,并读出该表项内容放上总线423。控制器1260根据表项内容中的分支类型判断该分支点为无条件分支,等待总线421上与此分支点相应的指令已送往处理器核1102执行的通知。当总线421上值为‘1’时,控制器1260控制当前循迹器120中的选择器118选择总线423上该无条件分支的分支目标轨迹点BN作为输出更新读指针115。读指针115中的BNX经总线411由选择器1108选择后,经总线1109对一级缓存104和轨道表110寻址,从一级缓存104中读出相应的目标指令块通过总线103及选择器1250存储到指令读缓冲1104中,并从轨道表110的指令类型表410中读出相应行经总线417,选择器1252存储到存储器426中并送到偏移地址映射模块416。同时,读指针115中的BNY经总线413对指令读缓冲1104和存储器426寻址,从指令读缓冲1104中读出所述被存储的指令块中的目标指令经总线1103送往处理器核1102的顺序前端流水线供执行,并从存储器426中读出目标轨道中的目标轨迹点的指令类型经总线421送往当前副循迹器910,如此完成了无条件分支转移。
之后当前循迹器120继续步进、以及当前副循迹器910在分支发生时根据信号419更新读指针425,读指针425经选择器1208选择后通过总线1223对目标地址表412寻址,提前指向从所述无条件分支目标开始的第一个分支点,读出相应表项内容(即分支目标BN),并通过总线423将该分支目标BN输出送到当前循迹器120及目标循迹器1120及控制器的操作如前例所述。进一步地,目标循迹器1120根据上述分支目标BN更新读指针1115。该读指针1115中的BNX 1251此时由选择器1108选择送往一级读缓存104读取目标指令块经总线103填入目标读缓冲1204。而读指针1115中的BNY 1253则从目标读缓冲1204中选取目标指令经总线1255送往处理器核1102中的目标前端流水线。此后,目标循迹器1120步进直到从分支目标开始的一共N条指令被填入该前端流水线,处理器核1102提供反馈信号通知循迹器1120停止步进为止。因为前端流水线的深度N是定值,所以也可以由一个计数器来提供停止信号,但是来自处理器核1102的步进信号还是需要的,用以将处理器核的状态,如停流水线等,通知目标循迹器1120。
当读指针115指向分支点时,此时当前循迹器120中选择器118选择增量器114的输出更新指针115,使指针115继续从当前读缓冲1104中读取指令送往处理器核1102中的顺序前端流水线。之后,当前循迹器120读指针115如前例步进,此时如目标前端流水线尚未填满,则目标循迹器1120也同时在步进,如前所述向目标前端流水线提供指令。直到与该分支点相应的分支指令经顺序前端流水线到达分支判断流水段(后端流水线的第一段),产生分支转移判断。
下面以图5所示的轨道表(其实质与图10所示轨道表相同)为例进行说明。假设一个以指令类型表410中的1行0列为分支目标的分支发生,此时BN1‘10’如前例被存储进循迹器120中的寄存器112,使得读指针115为‘10’。如前所述,此时一级指令缓存104中的1号存储块被读出经总线103及选择器1250存入当前读缓冲1104,读指针115中的BN1Y 413则指向1104中的0号表项,从中读出指令经总线1103送往处理器核1102的顺序前端流水线执行。同时,指令类型表410中的第1行被读出,经总线417放入偏移地址映射模块416及经选择器1252存入存储器426。读指针115中的BN1Y部分413经选择器1210选择在偏移地址映射模块416中如前例映射出信号419其MBN1Y值为‘0’。
下一时钟周期指针115步进,其值为‘11’,控制顺序读缓冲1104读出其1号表项中指令,供顺序前端流水线执行。同时,存储器426中1号表项被读出放上总线421,其值为‘0’。同时,控制器1260根据上述发生的分支使信号419上的值‘0’被锁存进副循迹器910中的寄存器,使得分支目标表读指针425为‘0’,经选择器1208选择经总线1223指向分支目标表412中由BNX指出的第1行中0号表项,该表项内容1C01被读出。控制器1260判断该表项格式为BN1,因此不需进行一级指令缓存填充操作。控制器也判断该分支类型为条件分支,因此控制目标循迹器1120中的选择器1218选择总线423上的该表项BN1地址‘01’以备目标循迹器中寄存器1212锁存。
下一时钟周期指针115步进,其值为‘12’,控制顺序读缓冲1104读出其2号表项中指令,供顺序前端流水线执行。此时,从存储器426读出的值为‘1’,放上总线421,控制器1260判断其为分支指令,且由总线423上其相应指令的值1C01判断为条件分支类型,因此等待处理器核1102的TAKEN分支判断113来决定循迹器走向。同时,寄存器1212锁存,因此指针1115为‘01’(分支目标),经选择器1108选择,经总线1109控制读出一级指令缓存器104中第0行,经总线103存入目标指令缓冲1204;总线1109也控制读出指令类型表410中的第0行存入偏移地址映射模块416与存储器1226。同时,指针1115上的BN1Y部分1143从目标指令缓冲1204中读出1号表项中的指令经总线1255送往目标前端流水线执行,总线1143也经选择器416选择在偏移地址映射模块416中映射出从该分支目标起的第一条分支指令的MBN1Y为‘0’,经总线419送往副循迹器1220,此时控制器控制1210中选择器1218选择该MBN1Y以备寄存器1212锁存。同时副循迹器910也因为总线421为‘1’在控制器1260控制下步进,因此时没有分支,所以控制器1260控制选择器918选择增量器914的输出,上述选择器918的输出存入寄存器912使读指针425为‘1’,经选择器1208选择,经总线1223指向分支目标表412中由BNX指出的第1行中1号表项,该表项内容1C35被读出放上总线423。控制器1260判断其为条件分支类型,将其类型暂存留待其相应指令被执行时(为1行6列中的指令)用以控制循迹器的动作。
下一时钟周期指针115步进,其值为‘13’,控制顺序读缓冲1104读出其3号表项中指令,供顺序前端流水线执行。指针1215也步进,其值为‘02’,控制目标读缓冲1204读出其2号表项中指令,供目标前端流水线执行。副循迹器1220中寄存器1212将选择器1218的输出,其值为‘0’的MBN1Y锁存。但此时选择器1208不选择寄存器1212的输出总线1215。
下一时钟周期指针115步进,其值为‘14’,控制顺序读缓冲1104读出其4号表项中指令,供顺序前端流水线执行。指针1115也步进,其值为‘03’,控制目标读缓冲1204读出其3号表项中指令,供目标前端流水线执行。
下一时钟周期指针115步进,其值为‘15’,控制读出当前读缓冲1104中5号表项中指令,供顺序前端流水线执行。指针1115也步进,其值为‘04’,控制目标读缓冲1204读出其4号表项中指令,供目标前端流水线执行。此周期中,处理器核1102已产生分支判断,为不分支,经TAKEN信号113送往控制器。控制器1260控制选择器118选择增量器114的输出。根据不分支的判断,目标前端流水线被清空。
下一时钟周期指针115步进,其值为‘16’,控制顺序读缓冲1104读出其6号表项中指令,供顺序前端流水线执行。并如前例读出指令类型存储器426中6号表项,放上总线421,其值为‘1’。控制器1260控制使指针1115上的BN值被更新为总线423上的BN值‘35’。指针1115上的BNX部分411经选择器1108选择,经总线1109控制读出一级指令缓存104中3号指令块,存入目标指令缓冲1204,并由指针1115上的BN1Y部分1143控制读出1204中的5号表项送往处理器核1102中目标前端流水线供执行;总线1109同时也读出指令类型表410中的第3行存入偏移地址映射模块416及存储器1226。指针1115中的BN1Y部分1143经选择器1210选择,在偏移地址映射模块416中映射出从该分支目标起的第一条分支指令的MBN1Y为‘1’,经总线419送往副循迹器1120,此时控制器1260控制选择器1218选择该MBN1Y。同时副循迹器910也因为总线421为‘1’在控制器1260控制下步进,因此时没有分支,所以控制器1260控制选择器918选择增量器914的输出,上述选择器918的输出存入寄存器912使读指针425为‘2’,经选择器1208选择,经总线1223指向分支目标表412中由BNX指出的第1行中2号表项,该表项内容1U30被读出放上总线423。控制器1260判断其为无条件分支类型,等待其相应指令被执行到时(其实是图5中指令类型表410中第1行中第8列的下一顺序指令行的地址,以无条件分支指令的方式记载)用以控制循迹器的动作。
下一时钟周期指针115步进,其值为‘17’,控制顺序读缓冲1104读出其7号表项中指令,供顺序前端流水线执行。指针1115也步进,其值为‘36’,控制目标读缓冲1204读出其6号表项中指令,供目标前端流水线执行。因为指针115已经到达该指令块中最后一条指令,因此控制器1260作根据总线423上当前值‘1U30’中的BN‘30’读取一级指令缓存104的准备。
下一时钟周期指针115值为‘30’,如前例控制将一级指令读缓存104中的第3个指令块存入顺序读缓冲1104并读出其0号表项中指令,供顺序前端流水线执行。指针1215也步进,其值为‘37’,控制目标读缓冲1204读出其7号表项中指令,供目标前端流水线执行。因为指针1115已经到达该指令块中最后一条指令,因此控制器1260作根据总线423上当前值‘1U00’中的BN‘00’读取一级指令缓存104的准备。控制器1260控制选择器1108选择总线1115放上总线1109指向轨道表110中的第3行,同时控制选择器1208选择读指针1215经总线1223送往目标地址表412中读出其第1项‘1U00’放上总线423。控制器1260根据该正被执行的指令是一个指令块中的最后一个指令,且从存储器1226中相应的第7项读出经总线921送来的指令类型为非分支指令,因而判定‘1U00’实际上不对应于程序中的真实指令,而是一条结束无条件分支。因此,不等候从总线921上送来的与‘1U00’相对应的为‘1’的指令类型,即决定分支。
下一时钟周期指针115值为‘31’,控制当前读缓冲1204读出其1号表项中指令,供顺序前端流水线执行。指针1115为‘00’控制将一级指令读缓存104中的第0个指令块存入目标读缓冲1204并读出其0号表项中指令,供目标前端流水线执行。此周期中,处理器核1102已产生分支判断经信号113送到控制器1260,为分支。控制器1260根据该判断控制选择器118选择总线1123上的值‘01’(即目标读指针1115上的BN1Y经增量器增量后的值)。控制器1260也控制选择器1252选择存储器1226的输出。根据分支的判断,顺序前端流水线被清空。
下一时钟周期根据进行分支的判断,控制器1260控制将目标指令缓冲器1204中内容经选择器1250写入当前指令缓冲器1104,也控制将选择器1252的输出写入存储器426。寄存器112锁存选择器118的输出使读指针115值为‘01’,控制当前读缓冲1104读出其1号表项中指令,供顺序前端流水线执行。已经在目标指令流水线中的指令继续执行,但控制器控制目标循迹器1120不使目标缓冲器1204继续对处理器核中的目标前端流水线提供更多指令。指针115中的BN1Y部分413的值‘1’如前经映射模块416映射为‘0’经总线419送出。从本周开始,处理器核1102选择来自目标前端流水线的指令执行N个时钟周期。
下一时钟周期指针115值为‘02’,控制目标读缓冲1204读出其2号表项中指令,供顺序前端流水线执行。副循迹器910中的寄存器912将总线419上的‘0’值锁存放上读指针425,经选择器1208总线1223从目标地址表412中由指针115指向的0行中的0列读出表项内容2C83。控制器判断该表项格式为BN2,将其BN2值‘83’经总线423送往主动表,使相应指令块被填入一级缓存,并将该一级缓存的BN1填入目标地址表412中。该BN1被从总线423读出,以备循迹器使用。如此周而复始,可以实现无损失的分支操作。
与图9实施例类似,若分支转移没有发生,则处理器核1102中的后端流水线选择顺序前端流水线的输出结果继续执行(即丢弃了目标前端流水线的执行结果);当前循迹器120继续步进;目标循迹器1120停止步进。这样,随着当前循迹器120的继续步进,沿当前指令块继续提供后续指令给处理器核1102执行。若分支转移成功发生,则处理器核1102中的后端流水线选择目标前端流水线的输出结果继续执行(即丢弃了顺序前端流水线的执行结果)。当前循迹器120中的选择器118则选择总线1123上来源于目标循迹器1120读指针1115中的BNX以及增量器1114的增一后的BNY作为BN存储到寄存器112中以更新读指针115。该BN指向的就是从分支目标开始第N+1条指令,即处理器核1102接下来应该执行的指令。同时,指令读缓冲1204中的指令块被存储到指令读缓冲1104中,且存储器1226中的全部内容也被存储到存储器426中,使得当前循迹器120读指针更新为指向分支目标开始第N+1条指令,而该指令所在的指令块已经被填充在指令读缓冲1104中,且对应的指令类型已经被填充在存储器426中。这样,随着当前循迹器120的继续步进,沿所述分支目标开始第N+1条指令所在的指令块继续提供后续指令给处理器核1102执行。
在本实施例中,由于使用了两个指令读缓冲1104和1204分别存储当前指令块和目标指令块,且相应地使用了两个存储器426和1226分别存储这两个指令块对应的指令类型,因此无论是当前循迹器120读指针115还是目标循迹器1120读指针1115到达所在轨道的结束轨迹点或无条件分支点,都可以从一级缓存104和轨道表110中读出相应的指令块及指令类型,分别填充到相应指令读缓冲及存储器中,而不必停止该循迹器本身或暂停另一个循迹器的步进。
根据本发明技术方案,还可以在图11的基础上,进一步增加指令读缓冲及相应指令类型存储器的容量,使得在指令读缓冲中可以保存一定数量的指令块,并在存储器中保存相应数量的指令类型。当循迹器120或1120读指针被更新为当前轨道及目标轨道以外的轨道时,可以检查该轨道及相应指令块是否还存储在所述存储器及指令读缓冲中。其实施方式可以是在指令读缓冲或相应的指令类型存储器中存储每个对应指令块的BN1X地址。当需要读取一级指令缓存器时,读指针115及1115中的BN1X值先被送到读缓冲与其中存储的各BN1X匹配。若在所述存储器及指令读缓冲有存储(即BN1X有匹配),则可以减少对一级缓存104和轨道表110的访问次数,降低功耗。
此外,在图9、11实施例中,当前一条条件分支指令尚未到达产生分支转移结果的流水线段时,若当前循迹器120或目标循迹器1120的读指针指向的是一个条件分支点(即后一个条件分支点),则无法同时向处理器核1102提供该后一个条件分支的两个分支路径上的指令。对此可以有两种解决方法,下面以图9实施例中当前循迹器120读指针115指向后一个条件分支点为例进行说明,对于目标循迹器1120也可以参考同样方法解决,而对于图11实施例也类似,在此不再赘述。
第一种解决方法是在当前循迹器120中增加一个寄存器用于存储分支目标BN,并对该后一个条件分支做分支转移不发生的预测,使得当前循迹器120沿所在轨道继续步进。若前一个条件分支的分支转移没有发生,且对于后一个条件分支的预测正确,则当前循迹器120沿所在轨道继续步进。若前一个条件分支的分支转移没有发生,但对于后一个条件分支的预测错误,则当前循迹器120读指针115的值被恢复之前在寄存器中存储的分支目标BN,并清除顺序前端流水线,使得当前循迹器120重新从该后一个条件分支的分支目标轨迹点开始步进。若前一个条件分支转移发生,则如前例更新当前循迹器120读指针115并从该前一个条件分支的分支目标开始的第N+1个轨迹点开始步进。在此,指令读缓冲1104及一级缓存在当前循迹器120和目标循迹器1120控制下向处理器核1102提供指令的过程与前例相同。
第二种解决方法是在处理器核中增加更多的前端流水线。例如,当处理器核中有四条前端流水线时,并有相应的四套循迹器,读缓冲及指令类型存储器即可以实现同时执行两层条件分支对应的四个分支路径上的指令。具体方法可根据之前实施例类推,在此不在赘述。根据本发明技术方案和构思,还可以有其他任何合适的改动。对于本领域普通技术人员来说,所有这些替换、调整和改进都应属于本发明所附权利要求的保护范围。
请参考图12,其为本发明所述缓存***的另一个实施例。本实施例以图1A实施例为基础,增添了数据缓存。图中只显示了图1A中与本实施例说明相关的下半部,其中处理器核102、一级缓存104、轨道表110、循迹器120与图1A实施例中同样编号的模块相同,为便于说明未显示图1A的上部,但应理解为图12中有图1A中的主动表130、块地址映射模块134等模块,其操作也相似。新增加了数据缓存器1426,数据引擎1428及选择器1424。选择器1424的输入是来自图1A所示的块地址映射模块134的总线123,125或来自数据引擎1428的总线1425。本实施例中轨道表110不但存储了与分支指令相关的信息,也存储了与数据访问指令相关的信息。请看图13,其为实施例12中轨道表表项的格式,1300为基本格式,其中1303为指令类型,1305为块(X)地址,1307为块内偏移地址。具体地,如果表项与分支指令对应,则指令类型域1303中含有前述地址类型(BN2或BN1),分支类型(直接或间接,有条件或无条件)等;1305,1307域中分别含有指令块地址及指令块内偏移地址,可以是指令缓存地址BN2形式或BN1形式。如果表项与数据访问指令对应(见1318),则状态域1311,1312中含有该表项的状态(以下会详述);1313域中含有该相应指令连续的两次数据访问的两个数据地址之间的差值,以下称步长(Stride);1315,1317域中分别含有数据缓存1426的数据块地址DBNX及数据块内偏移地址DBNY,合称数据缓存器地址DBN;如果支持多种数据访问操作(如装载、存储),则增设指令类型域以分别。B型标识符1321表示本表项对应分支指令,L型标识符1323表示本表项对应数据访问指令,如果同一表中含有对应分支及数据访问指令的表项,就需要上述标识符以资区分。如果有表项对应的不是上述两类指令,则可以用一个N型标识符标出。回到图12,读指针115控制一级指令缓存104读出一条指令送给处理器核102执行,同时读出轨道表110中相应表项。当总线117上读出的表项的标识符是N型时,控制器(图中未显示)控制选择器118选择增量器114的输出,下个周期执行顺序下一条指令。当总线117上读出的表项的指令类型标识符是B型时,其操作已在图1A实施例说明,在此不在赘述。当总线117上读出的表项的指令类型是标识符是L型时,控制器以117上的数据地址访问数据缓存器1426,在1426与处理器核102间交换数据。同时数据引擎1428将117上的数据地址与步长值相加经选择器1424存回轨道表110中原读出表项。此时也控制选择器118选择增量器114的输出,下个时钟周期执行顺序下一条指令。数据地址可以是DBN格式,由DBNX及DBNY组成。DBNX即数据一级缓存器1426的行号,DBNY是数据在DBNX指出的一行中的块内偏移量。DBN(数据缓存器地址)与BN(指令缓存器地址)是相互独立的。本实施例中的作用机制是通过指令缓存器地址BN访问轨道表110中的一个L型表项,读出该表项中的DBN数据缓存器地址,以该DBN为地址访问图12中的数据一级缓存器1426。即轨道表110的地址是指令缓存器地址BN,表项内容含有数据缓存器地址DBN,因此轨道表110将指令地址映射为数据地址。这种映射关系是可变的,每执行一次该数据访问指令后,都由图12中数据引擎1428将轨道表110的L型表项中刚用以访问一级数据缓存器1416的数据地址加上其中的步长(Stride)值,作为新的数据地址存回110中该表项。
请参考图14,其为本发明所述缓存***的另一个实施例。本实施例以图1A与图4实施例为基础,增添了数据缓存。为了便于描述,在图14中只显示了部分模块,有些模块被省略。其中扫描器106、二级缓存108、主动表130、块地址映射模块134和选择器132、142、148、150与图1A中实施例中相同编号的模块相同;指令一级缓存104、轨道表110,处理器核102,循迹器120,目标地址表412,偏移地址映射模块416,存储器426与图4实施例中相同编号的模块相同。其中副循迹器428与图4中副循迹器420相比结构有所修改,428中没有寄存器424,而是由421总线与寄存器422的输出经或门1462控制寄存器432的更新,即只要421或寄存器422的输出为‘1’,寄存器432即更新。图1A中的二输入选择器146被三输入选择器1420代替,新增的一个输入来自数据引擎1428。新增了数据下块地址存储器1422,数据一级缓存器1426,数据引擎1428。其中数据下块地址存储器1422的表项中存有该数据块的顺序上一个及下一个数据块的数据缓存块地址DBNX。新增双向总线1427,在二级缓存器108与一级数据缓存器1426间传递数据;新增双向总线1429,在一级数据缓存器1426与处理器核102间传递数据。新增的模块与总线都是为了支持数据缓存器操作。另外在图1A中选择器312及150都有一个输入来自轨道表110的输出117,在图12中该输入来自分支目标表412的输出423。图4中的423与图1A中的117在逻辑上是等效的。
为了支持数据缓存操作,轨道表110中指令类型表410及分支目标地址表412的内容有所改变,不但存储分支指令的相关信息,也存储数据访问指令(如装载Load、存储Store等)的相关信息。存储操作可以通过写缓冲(Write Buffer)暂存而延迟对数据缓存器的访问,而装载操作则无法延迟,提前产生装载数据地址更利于减少处理器的等待时间。因此以下说明都以指令类型表410中指令类型行及分支目标地址表412都只存储分支指令以及装载指令相关信息为例,但本实施例可被应用于所有装载操作与/或存储操作。请见图15A,其为图12实施例中处理器***指令类型表410及分支目标地址表412的格式。图中1501为一级指令缓存器104中一个指令块,指令按其块内偏移地址增序从左向右排列。其中L代表装载指令,B代表分支指令,N代表既非装载也非分支的指令。1503为指令类型表410中与该指令块相应的行,其中为‘1’的表项代表B型或L型指令,值为‘0’的代表N型指令。1503最右方一个表项是如前所述的结束轨迹点,以‘E’代表。1505则为分支目标地址表412中与该指令相应的行,此时每个表项中都有一个标识符L或B。L表示该表项存储装载指令的信息,B表示该表项存储分支指令的信息,此例中没有N型表项。
实质上1503及1505所示,是对1501指令块中指令信息的一种抽象提取与压缩。***的操作只需要1501指令块中部分指令的信息,该部分‘操作需要(Operation Necessary)’指令中的相关信息被提取出来按该部分指令的编移地址顺序以1505的形式保存在分支目标表412中,而其他‘操作不需要’的指令的信息不被保存;即仅将‘操作需要’指令的信息按指令顺序排列。而1503格式中则存储了指令块中全部指令的块内偏移地址,其中‘操作需要’指令(即1505中存储了信息的部分指令)以标识符与‘操作不需要’的指令以不同的标识符区别;全部标识符按指令顺序排列。在适当的处理逻辑作用下可以按一条指令的块内偏移地址经1503的标识符寻求1505的该指令对应信息。处理逻辑实质上是在检测块内偏移地址在1503中对应的‘操作需要’标识符的顺序号MBNY,因为所需的信息在1505中其实是按‘操作需要’指令的顺序号排列。图15A中的1501,1503及1505上方的数字是对应表项的块内偏移地址。1505上的块内偏移地址1,3,4,6不连续,因为只有这些偏移地址相应的指令是‘操作需要’,而1305下方的数字则是各该表项所对应的指令的顺序号MBNY,其中顺序号‘4’的表项中存储结束轨迹点,因指令段1501中有4条B型和L型指令,其相应信息占据了1505中顺序号为‘0’-‘3’的表项。在这个实施例中,1503格式中与操作有关的指令其标识符为‘1’,无关指令的标识符以‘0’表示。相应地,1503中,偏移地址1,3,4,6表项中标识符为‘1’,其他表项中标识符为‘0’。如图4实施例中一样,图14分支目标表412是个压缩表,存有1505格式的行。但对该表中每行中表项的寻址是通过‘操作需要”指令的顺序号寻址的。此例中由副循迹器428驱动的分支目标表读指针425上的值即该顺序号。以下结合图14及图15A说明***的操作。
第一时钟周期,处理器***在执行一个指令段,该指令段的轨道表信息已被存入存储器426。读指针115从一级指令缓存器104中读出一条分支(B型)指令经总线103推送到处理器核102执行。115中的块内偏移地址部分413从存储器426中读出相应表项‘1’放上总线421。此时分支目标表412输出的该分支指令的分支目标(指向图15A中1301指令块中偏移地址为‘2’的指令)经总线423送到主循迹器120中选择器118的一个输入。读指针115的偏移地址部分413从存储器426读出分支指令对应表项‘1’放上总线421。根据为‘1’的421值,及423上BN地址格式及条件分支指令类型,控制器(图上未显示)等待处理器核做分支判断。处理器核102执行上述分支指令,判断为‘执行分支’,经分支判断113控制选择器118选择总线423。
第二时钟周期,113上的值也被存进寄存器422;寄存器112更新,总线423上的分支目标地址被放上读指针115。读指针115从一级指令缓存器104中读出1301指令块中偏移地址为‘2’的N型指令推送到处理器核102供执行。此时读指针115指向轨道表110中分支目标表412中的1505行,也指向指令类型表410中的1503行,因为分支判断为‘执行’,因为寄存器422的输出为‘1’,因此1503行也被存入存储器426。块内偏移映射模块416以1503行的信息将偏移地址413的值‘2’映射为指令顺序号‘1’经总线419送到副循迹器420中选择器420的一个输入端备用。寄存器422中的值控制选择器418选择总线419。偏移地址413也读出存储器426中该N型指令的表项‘0’放上总线421。控制器(图15中未显示)根据421上的值‘0’,控制选择器118选择增量器114的输出。
第三时钟周期,寄存器112输出的BN1X读指针411不变,BN1Y读指针413加‘1’,偏移量为‘3’。此时413从一级指令读缓存104中读出1301中偏移量为‘3’的L型指令,推送往处理器核102供执行。寄存器422的值为‘1’,经或门1462使寄存器432更新,分支目标读指针425以指令顺序号‘1’读取分支目标表412中1505行顺序号为‘1’(偏移地址为‘3’)的表项从总线423送出。偏移地址读指针413也读出存储器426中该L型指令的表项‘1’放上总线421送出。控制器(图15中未显示)根据421上的值‘1’,读取总线423上的标识符。根据该L型标识符,控制器控制选择器118选择增量器114的输出;也以423上的DBN访问一级数据缓存器1426,读取数据经总线1429向处理器核102推送。此时数据引擎1428将上一周期存入的DBNY与Stride相加。如其和未超出一个数据块的大小,则以来自423的当前DBNX,以该和为DBNY构成下一个DBN经总线1425,选择器1424存入分支目标表412中当前DBN的表项(此处为1305中左边开始第二个表项)。如其和超出一个数据块的大小,但落于相邻的数据块中时,则以来自下块地址存储器1422的相邻数据块的DBNX地址为DBNX,以该和中抛弃溢出指令块大小的剩余部分为DBNY构成下一个DBN同样经总线1425,选择器1424存入分支目标表412中当前DBN的表项(此处为1305中左边开始第二个表项)。如其和超出相邻指令块的地址空间,此时等待处理器核102计算出该L型指令的数据地址经总线155送到主动表130匹配,以其匹配结果经总线133到块地址映射模块134中映射DBNX(其过程与图1A中所述相同,在此不在赘述)。该DBNX以数据引擎中上述的和,抛弃溢出指令块大小的剩余部分为DBNY构成下一个DBN存入分支目标表412中当前DBN的表项(此处为1505中顺序号为‘2’的表项)。也将下一DBN与当前DBN的差作为步长Stride存入同一表项。如此在下一次执行到同一L型指令时,即以分支目标表412中对应表项中的DBN为地址访问一级数据缓存器1426,提前向处理器核102推送数据。
此时读指针413从存储器426中读出的1503中偏移量为‘3’的值为‘1’放上总线421。该为‘1’的421值使循迹器120中选择器118受总线423上标识符,指令类型及指令判断113的控制。其规则如下。当423上的标识符为L时,则选择器118选择增量器114的输出。当423上的标标识符为B,且423上地址类型为BN2时,则如将BN2经总线423及133送往块地址映射模块134映射为BN1地址存回分支轨道表412同一表项中,其过程如图1A例中所述,在此不再赘述。当423上的标识符为B,且423上地址类型为BN1,423指令类型为无条件分支指令时,选择器118选择423上的BN1地址。当423上的标识符为B,且423上地址类型为BN1,423指令类型为条件分支指令时,则选择器118由指令判断113控制,如113为‘执行分支’则选择423上的BN1地址;如113为‘不分支’,则选择增量器114的输出。此时421上值为‘1’,423上的标识符为L,因此选择器118选择增量器114的输出。本周期分支判断113为‘不分支’(在执行非分支指令时,113的值均为‘不分支’),
第四时钟周期,113的值存进寄存器422。上述偏移地址为‘3’的L型指令在处理器核102中译码后,使102读取已推送到总线1429上的数据,将其装载进102中的寄存器堆。同时寄存器112输出的BN1X读指针411不变,BN1Y读指针413加‘1’,偏移地址为‘4’。此时413从一级指令读缓存104中读出1501中偏移量为‘4’的B型指令,送往处理器核102。本时钟周期中,寄存器422的值为‘0’,控制选择器418选择增量器414的输出,而上个时钟周期总线421的值为‘1’,寄存器432更新,因此读指针425增‘1’为‘2’,控制读出分支目标表412中1505中顺序号为‘3’的表项。该表项经总线423读出后,控制器判断其为B型,因此不用423上值访问一级数据缓存器1426,而是将423上的BN值送到选择器118的一个输入,并等待421上值以控制循迹器120中选择器118。此时BN1Y读指针413值为‘4’,从存储器426中读出1503中偏移量为‘4’的表项‘1’放上总线421。根据421为‘1’,标识符为B型,地址类型为BN1,指令类型为条件分支指令,控制器按规则等待由分支判断113来控制选择器118,以决定程序流向。如果分支判断113的值为‘执行分支’,则操作过程如本实施例前述,不再赘述。
如果分支判断113的值为‘不分支’,则控制选择器118选择增量器114的输出。下一时钟周期,将该113值‘0’送往寄存器422存储;寄存器112输出的BN1X读指针411不变,BN1Y读指针413加‘1’,偏移量为‘5’。此时413从一级指令读缓存104中读出1301中偏移量为‘5’的N型指令,推送往处理器核102供执行。寄存器422的值为‘0’,控制选择器418选择增量器414的输出,总线421的值为‘1’,本周期寄存器432更新,分支目标读指针425以指令顺序号‘3’读取分支目标表412中1505行顺序号为‘3’(偏移地址为‘6’)的表项从总线423送出。偏移地址读指针413也读出存储器426中该L型指令的表项‘1’放上总线421。控制器根据421上的值‘1’,读取总线423上的标识符。根据该L型标识符,控制器控制选择器118选择增量器114的输出;也以423上的DBN访问一级数据缓存器1426,读取数据经总线1429向处理器核102推送。以下操作与本实施例中前述同,不再赘述。
当扫描器106扫描填入一级指令缓存106的指令块并为其产生相应轨道填入轨道表时,如被扫描的指令是L型指令时,则按该L指令的BNX,BNY地址在指令类型表410中表项写入‘1’,并以该BNX,以及控制写入的计数器地址为列地址在分支目标地址表412的表项中将D位及S位置为‘无效’。当该L型指令第一次被执行时,控制器根据总线423上‘无效’的S位,等待处理器核102经总线155送出数据存储器地址,如前述经主动表130及块地址映射模块134映射为DBN寻址一级数据缓存器1426读取数据提供给处理器核102;也将该DBN存入分支目标地址表412原读出的表项,并将表项中D位设为有效。当该L型指令第二次被执行时,控制器根据总线423上‘无效’的S位,等待处理器核102经总线155送出数据存储器地址,如前述映射为DBN寻址一级数据缓存器1426读取数据;也将该DBN存入分支目标地址表412原读出的表项,数据引擎1428则根据有效的D位及无效的S位将映射所得的DBN与总线423上的DBN相减,将其差存入原读出的表项中的Stride域,并将该表项中S位设为有效。当该L型指令第三次及其后被执行时,控制器根据总线423上‘有效’的D位及S位,直接以423上的DBN寻址一级数据缓存器1426读取数据提供给处理器核102。可以先用423上的DBN先取数据送往处理器核102,102执行该L型指令产生数据存储器地址如前映射为DBN与423上的DBN比较,如相同则处理器核102直接使用已提供的数据;如不同,则以新产生的DBN访问一级数据缓存器1426重新读取数据,并将该DBN存入原读出表项并将该表项的D位置为‘有效、S位置为‘无效’。如此循环。此例中二级缓存器108是混合缓存(Unified Cache),存有指令块及数据块,通过总线107向一级指令缓存104及扫描器106提供指令块,也通过总线1427与一级数据缓存1426交换数据。相应地,块地址映射模块134中也以BN的形式存有指令缓存块的块地址,也以DBN的形式存有数据缓存块的块地址以供映射。
由此可见,本实施例对于指令循环中的装载指令在第一,及第二次执行时需要一个数据地址计算单元根据寄存器堆内的值计算数据地址(本实施例中由处理器核102提供),其后的数据地址都可以由本发明的缓存***(包括轨道表110,循迹器120,420等)自动产生,向处理器核102推送数据。存储操作(Store)也可由本发明的缓存***自动提供地址,处理器核只需要提供从寄存器堆读出的数据就可。本发明的缓存***也可以向处理器核推送指令,除间接分支指令需要一个指令地址计算单元根据寄存器堆内的值计算间接分支目标地址外,其他的指令都可以由本发明公开的缓存***自动向处理器核102推送。处理器核102只需要向缓存***提供分支判断103以控制程序走向,及步进信号111以通知缓存***处理器核内流水线状态(暂停推送)两种反馈信号就可以。
请参考图15B,其为另一种指令类型表,分支目标表,数据地址表格式用以支持图16中的实施例。请参考图16,其为本发明所述缓存***的另一个实施例。本实施例以图14实施例为基础,增添了数据地址表以专门存储数据访问地址。为了便于描述,在图16中只显示了部分模块。其中,指令一级缓存104、处理器核102,循迹器120,副循迹器420,目标地址表412,偏移地址映射模块416,存储器426,块地址映射模块134,数据下块地址存储器1422,数据一级缓存器1426,数据引擎1428与图12中一样。选择器146与图1A中一样。不同的是图15实施例中,轨道表150代替了图14中的轨道表110。轨道表150中增加了一个数据地址表1412存储装载指令的相关信息,分支目标表412则如图4中例只存储分支指令的相关信息。与412类似,数据地址表1412同样是个压缩表以节省存储空间,因此图12中指令类型表410被指令类型表1410替换;1410中代表B型和L型的分支类型是分别独立存放的,不同于图15A中1503的B型和L型的分支类型混合存放。数据访问操作也需要其专用的数据副循迹器1428,存储器1426,数据访问地址映射模块1416,使得读指针115中的BNY能正确映射为数据访问地址指针1425指向与该BNY对应的数据地址表1412表项。上述1416,1426与负责指令地址映射的地址映射模块416,存储器426结构一样,功能也一样。副循迹器1428中则如同副循迹器428一样,增加了一个或门1630,使得不但总线1421上的‘1’值(代表执行了一条数据指令),可以使得1420中的寄存器1432更新以指向下一条数据访问指令,而且分支判断(如113等)也可使寄存器1432更新以存入分支目标指令及其后指令中第一条数据访问指令的指令顺序号MBNY。选择器1424选择来自块地址映射模块134或数据引擎1428的DBN以存入数据地址表1412。从一级数据缓存器1624读出的数据经总线1633存入先入先出1636以备处理器核102读取。从处理器核102写回的数据经写缓冲器1638缓冲,经总线1639写回一级数据缓存器1624。
数据地址表1412与目标地址表412的组织形式相似,列数大于或等于一个一级指令块中可能存在的数据访问分支指令的最大数目,其每行中按对应一级指令块中数据访问指令出现的顺序依次在从左向右的各个表项中按图13中1318的格式存储了相应数据访问指令S位、D位、步长及DBN。请注意现在分支指令信息与装载指令信息分由412与1412中存储,因此两个表中的表项格式都不需要B或L的标识符1321及1323。请见图15B,其为图16实施例中指令类型表1410与分支目标比表412,数据地址表1412的格式及对应关系。仍以执行图14实施例中同样的指令段1501为例,指令类型表1410由读指针115中BNX411选中读出的现在有两行,其中一行(下称指令类型行)1513为分支指令专用的指令类型,(与图4例中指令类型表410中的行作用完全相同),与分支指令表412中的行1315对应。该行被读出后如同图4中实施例一样被送到偏移地址映射模块416,存储器426以控制循迹器120及副循迹器420,因此图16中向处理器核102提供指令103的操作与图4实施例中类似,在此不再赘述。指令类型表1410表项中新增的一行(下称数据类型行)1523则是为同一指令段中数据访问指令而设。可见1513中偏移地址为‘4’的表项为‘1’,对应1501指令段中偏移地址为‘4‘的B型指令,而该指令的分支目标地址信息则被存入分支目标表412中1515形式中顺序号为‘0’的表项;1513中其他表项为‘0’,而1515中顺序号为‘1’的表项中存储的是结束轨迹点,即顺序下个指令块的块号。1523是指令类型表1410的数据行,同样对应1501的指令段。可见1523中偏移地址为‘1’,‘3’,‘6’的表项为‘1’,对应1501指令段中的L型指令;而数据地址表1412中也有1525格式的数据地址表项,其中左起3个表项中分别存储1501指令段中块内偏移地址为‘1’,‘3’,‘6’的L型指令的数据地址信息;而1523中其他表项为‘0’。其D位,S位的设置及使用与图14实施例相同。图15B中轨道表150中指令类型表1410中的指令行1513,分支目标表412中的相应1515行对应,1410中的数据行1523则与数据访问地址表1412中1525行,由同一读指针115寻址。
以下结合图16及图15B说明***的操作,第一时钟周期,处理器***在执行一个指令段,该指令段的轨道表信息已被存入存储器426及1426。读指针115从一级指令缓存器104中读出一条分支(B型)指令经总线103推送到处理器核102执行。115中的块内偏移地址部分413从存储器426中读出相应表项‘1’放上总线421,也从存储器1426中读出相应表项‘0’放上总线1421。此时分支目标表412输出的该分支指令的分支目标(指向图15A中1301指令块中偏移地址为‘2’的指令)经总线423送到主循迹器120中选择器118的一个输入。控制器根据总线421及432上的值,如图14例等待处理器的分支判断。处理器核102执行该分支指令,判断为执行分支,经分支判断113控制选择器118选择总线423。
第二时钟周期,分支判断113的值被存入寄存器422及1422;读指针115从一级指令缓存器104中读出1501指令块中偏移地址为‘2’的N型指令推送到处理器核102供执行。此时读指针115指向轨道表110中分支目标表412中的1515行及数据地址表1412中的1525行,也指向指令类型表410中的1513及1523行,因为寄存器422的值为‘1’(分支判断为‘执行分支’),因此1513行被存入存储器426,1523行被存入存储器1426。块内偏移映射模块416以1513行的信息将偏移地址413的值‘2’映射为指令顺序号‘0’经总线419送到副循迹器420中选择器420的一个输入端。块内偏移映射模块1416以1523行的信息将偏移地址413的值‘2’映射为数据顺序号‘1’经总线1419送到数据副循迹器1420中选择器1418的一个输入端。寄存器422及1422中的值‘1’控制选择器418选择总线419,选择器1418选择总线1419。偏移地址413也读出存储器426中该N型指令的表项‘0’放上总线421,读出存储器1426中该N型指令的表项‘0’放上总线1421。控制器(图16中未显示)根据421上的值‘0’,控制选择器118选择增量器114的输出。
第三时钟周期,寄存器112输出的BN1X读指针411不变,BN1Y读指针413加‘1’,偏移量为‘3’。此时413从一级指令读缓存104中读出1301中偏移量为‘3’的L型指令,推送往处理器核102供执行。寄存器422的值为‘1’,本周期寄存器432更新,分支目标读指针425以指令顺序号‘0’读取分支目标表412中1505行顺序号为‘0’(偏移地址为‘0’)的表项从总线423送出。此时寄存器1432因寄存器1422的值为‘1’而更新,将总线1419上的值‘1’放上数据地址表读指针1425访问数据目标表1412从总线1423读出DBN。此后偏移地址读指针413读出存储器426中该L型指令的表项‘0’放上总线421,读出存储器1426中该L型指令的表项‘1’放上总线1421。控制器根据421上的值‘0’,控制选择器118选择增量器114的输出;也根据1421上的值‘1’,以1423上的DBN访问一级数据缓存器1426,读取数据经总线1633与先入先出1636向处理器核102推送。此后数据引擎1428的操作与图14实施例中相同,不再赘述。
如果421总线值为‘0’,控制器控制选择器118选择增量器114的输出。如果421总线值为‘1’,控制器使循迹器120中选择器118受总线423上指令类型及指令判断113的控制。其规则如下。当423上地址类型为BN2时,则如将BN2经总线423及133送往块地址映射模块134映射为BN1地址存回分支轨道表412同一表项中,其过程如图1A例中所述,在此不再赘述。当423上地址类型为BN1,423指令类型为无条件分支指令时,选择器118选择423上的BN1地址。当423上地址类型为BN1,423指令类型为条件分支指令时,则选择器118由指令判断113控制,如113为‘执行分支’则选择423上的BN1地址;如113为‘不分支’,则选择增量器114的输出。此时421上值为‘0’,因此选择器118选择增量器114的输出。
第四时钟周期,上述偏移地址为‘3’的L型指令在处理器核102中译码后,使102读取已推送到先入先出1436上的数据,将其装载进102中的寄存器堆。同时寄存器112输出的BN1X读指针411不变,BN1Y读指针413加‘1’,偏移量为‘4’。此时413从一级指令读缓存104中读出1301中偏移量为‘4’的B型指令,送往处理器核102。本时钟周期中,寄存器1422的值为‘0’,控制选择器1418选择增量器1414的输出,总线1421的值为‘1’,寄存器1432更新,因此读指针1425增‘1’为‘2’,控制读出数据目标表1412中1525中顺序号为‘2’的表项。该表项经总线1423读出后,控制器用1423上DBN值访问一级数据缓存器1426,读取数据经总线1633存入先入先出1636。此时BN1Y读指针413值为‘4’,从存储器426中读出1513中偏移量为‘4’的表项‘1’放上总线421。根据421为‘1’,423总线上地址类型为BN1,指令类型为条件分支指令,控制器按规则等待由分支判断113来控制选择器118,以决定程序流向。如果分支判断113的值为‘执行分支’,则第五周期的其他操作过程如本实施例前述第二周期所述,不再赘述。
如果分支判断113的值为‘不分支’,则控制选择器118选择增量器114的输出。第五时钟周期,将该113值‘0’送往寄存器422及1422存储;寄存器112输出的BN1X读指针411不变,BN1Y读指针413加‘1’,偏移量为‘5’。此时413从一级指令读缓存104中读出1301中偏移量为‘5’的N型指令,推送往处理器核102供执行。寄存器422的值为‘0’,控制选择器418选择增量器414的输出,上周总线1421值为‘1’,本周期寄存器432更新,分支目标读指针425以指令顺序号‘1’读取分支目标表412中1515行顺序号为‘1’的表项,即结束轨迹点,从总线423送出。偏移地址读指针413也读出存储器426,1426中1513,1523偏移地址为‘5’的该N型指令的表项‘0’,‘0’放上总线421,1421。控制器根据421上的值‘0’,控制选择器118选择增量器114的输出。以下操作与本实施例中前述同,不再赘述。
图16实施例中的分支指令和数据访问指令各有其独立的分支指令类型1513及1523,有独立的压缩信息表412和1412,有独立的循迹器428和1428,有独立的偏移地址映射模块416和1416,有独立的存储器426和1426,因此可以互不干扰地提前执行,如偏移地址为‘6’的装载指令可以与偏移地址为‘4’的分支指令同时由缓存***处理,更好地掩盖数据缓存器的延迟。反之亦然,可以同时处理一条偏移地址在前的数据访问指令与一条偏移地址在后的分支指令以掩盖指令缓存器的延迟。
基本的结构是仅提取进行缓存器处理需要的指令信息存储到压缩表412及1412,而将这些需要的指令的偏移地址记录在指令类型表410中。基本操作方式是循迹器120,428,1428中的选择器118,418,1418受分支判断控制,不成功的分支(含非分支)选择各循迹器中增量器114,414,1414的输出;成功的分支时主循迹器120选择(来自分支目标表412中由读指针115的BMX,425的BNY指出的)分支目标地址,副循迹器420,1420选择分支目标地址经偏移地址映射模块416,1416映射得到的指令顺序号。主循迹器120读指针115的更新由处理器核流水线状态反馈111决定,在流水线正常工作时每个时钟周期都更新。副循迹器428,1428的更新则由读指针115中偏移地址413读出指令类型表410中相应的指令类型控制更新。其中由读指针115的块内偏移部分413从存储器426中当前正被执行的指令的指令类型421控制程序的走向(也可以不由421控制,而完全由分支判断113控制,此时处理器核102使113在任何成功的分支,包括无条件分支时都显示‘执行分支’),421值为‘1’更通知副循迹器428当前正在执行分支指令,428可在下个时钟周期更新,提供下一分支指令的信息。
同样,由读指针115的块内偏移部分413从存储器1426中当前正被执行的指令的指令类型1421控制数据访问,如1421值为‘1’则通知副循迹器1428当前正在执行一条数据访问指令,1428可在下个时钟周期更新,提供下条数据访问指令的信息。上述操作都是在完成一条分支或数据访问指令后,缓存***即不需处理器核102协助,提前准备下一分支指令的分支目标或提前读取下一数据访问指令所需读取的数据。如此,在执行大部分指令时处理器核102只要提供处理器核流水线状态反馈111及分支判断113就足以。只有在执行间接分支指令或一条数据访问指令的第一次,第二次执行时处理器核才需要提供分支目标指令地址或数据指令地址。执行其他指令时,所述缓存***都可以仅根据流水线状态及分支判断向处理器核推送指令和数据。
可以进一步改进,在先入先出1636的每个表项中增设其所存放数据的数据访问指令的块内偏移地址BNY。图16例中副循迹器1420中寄存器1432每完成一次数据缓存器1426的访问及相应的数据引擎1428操作后即更新,直到本指令段最后一条数据访问指令(需要标出该最后指令的位置)。数据访问指令的块内偏移地址BNY,连同以该指令从数据缓存器1426读出的数据被存进先入先出1636中同一表项,以备处理器核102读取。当该指令段中有分支指令被判断为‘执行分支’时,将该分支指令的偏移地址送进先入先出1636,将其中数据访问指令的块内偏移地址大于该分支指令偏移地址的表项清空。
可以进一步改进,使图16实施例中的缓存***和方法应用于指令多发射。请见图17,其为支持指令多发射的推送缓存***,以4发射为例。图17中块地址映射模块134,轨道表150,分支副循迹器428,偏移地址映射模块416,数据副循迹器1428,数据偏移地址映射模块1416,数据下块地址存储器1422,数据一级缓存器1426,数据引擎1428,选择器146,选择器1424与图16中一样。不同的是处理器核1702中有4套指令译码/执行单元连接到一个寄存器堆,该寄存器堆有足够的读口与写口支持所有4套执行单元在同一时钟周期中各执行一条指令。为便于说明,将这4套执行单元以A,B,C,D命名,其中A单元执行顺序第一条指令,B单元执行第二条,其他按序类推。相应地指令一级缓存1704能提供从输入的地址开始的4条连续指令,也以A,B,C,D命名。存储器1726代替了图16中426,存储器1736代替了图16中1426,也能提供从输入的地址开始的4个连续表项A,B,C,D。主循迹器1720中用加法器1714代替了原120中的增量器114。新增了相关检测器1702及掩码器1706及1708。相关检测器1702检测从一级指令缓存1704经总线1701送往处理器核1702执行的4条连续指令之间的相关性,根据检测结果,产生两个控制信号;其中一个是1707,向主循迹器1720提供一个地址增量,由加法器1714与读指针115相加以得到下一周期的读指针(4条连续指令的起始地址);另一个是3位的控制线1703以控制处理器核中的B,C,D执行单元是否执行,也控制掩码器1706及1708掩盖从存储器1726及1736中读出的B,C,D表项,使可被执行的指令的指令类型信息被用于产生控制总线421及1421,但本周期因指令相关性而不能执行的指令的指令类型被屏蔽掩码器1706及1708将来自存储器1726及1736中的A表项及经过控制线1703掩码(‘与’操作)后的B,C,D项做‘或’操作,其结果作为前述总线421及1421控制程序走向及控制数据访问,也控制副循迹器420及1420的步进。
在本实施例中,如果连续四条指令之间不存在相关性(depandency),那么可以由处理器核中4个执行单元同时执行一级指令缓存1704提供的4条顺序指令,从而实现四发射。如果指令之间存在相关性,则相互之间有相关性的指令中的后一条及其后的指令在本时钟周期不执行,而要在下一个时钟周期从上述有相关性的后一条指令开始发射4条指令。为此要使用相关性检测器(depandency checker)。因为本实施例中多发射的指令是顺序执行,因此在同一次发射时,不需要检测寄存器的“读后写(WAR)相关”和“读后读(RAR)相关”,只需要检测“写后读(RAW)相关”和“写后写(WAW)”相关即可。即当一条指令的目标寄存器与其之后某条指令的源寄存器号相同时会产生写后读相关,这两条指令不能并行执行;以及当两条指令均写同一个目标寄存器时,应丢弃前一条指令对应的值,而将后一条指令对应的值写入寄存器堆。另外,图17实施例中只有一套处理数据访问的模块及一套处理分支指令的模块,因此同时发射的4条指令中只有一条分支指令及一条数据分支指令被执行,而第二条分支指令或第二条数据访问指令及其后指令不能在当周执行,而要留待下一时钟周期执行。因此相关性检测器1702也检测复数条分支指令,以及复数条数据访问指令之间的相关性。
相关性检测器1702对同时发射的4条指令的操作码进行简单译码,已确定每条指令的指令格式,根据指令格式提取与指令相关性有关的指令域,如寄存器号等,对4条指令进行相关性检测,对后3条指令B,C,D每条产生一个相关位。其中,对复数条分支指令即复数条数据访问指令的检测可以由上述简单译码来提供指令类型,或者通过读取存储器1726及1736中的指令类型来提供指令类型。若相关位为‘1’,则表示该指令与之前的任何指令之间都没有相关性;若相关位为‘0’,则表示该指令与之前至少一条指令之间有相关性,该指令不能与之前的指令在同一时钟周期执行。该B,C,D相关位经过1702中一个优先权编码器使得B指令的相关位能影响到C,D相关位;使得C指令的相关位能影响到D相关位;即当B相关位为‘0’时,C,D相关位一定为‘0’;当C相关位为‘0’时,D相关位一定为‘0’。经过优先权编码器修正后的B,C,D相关位就是控制线1703,用以控制处理器核中相应的B,C,D执行单元是否执行对应指令,A执行单元总是执行A指令,因为A指令不可能是相关指令中的第二条。1703也被送到掩码器1706及1708中与从存储器1726及1736中读出的B,C,D项按位进行‘与’操作,其3位结果与A项一同进行‘或’操作,其一位结果放上总线421及总线1421。1703上的相关位也被1702中的一个编码器编码,其结果作为指令地址增量放上控制线1705送到主循迹器1720中加法器1714的一个输入段。其编码方式为当‘BCD’位为‘111’时编为十进制数‘4’,此时4条指令间无相关性;当‘BCD’位为‘110’时编为十进制数‘3’,此时D指令有相关性;当‘BCD’位为‘100’时编为十进制数‘2’,此时至少C指令有相关性;当‘BCD’位为‘000’时编为二进制数‘1’,此时至少B指令有相关性。该经1705送出的编码结果即指令地址增量。
仍以图15B中1501指令块为例。假设读指针115的块地址部分411指向一级指令缓存1704中1501指令块,而块内偏移部分413其值为‘0’,则缓存1704将1501指令段中偏移地址‘0’-‘3’的4条指令‘NLNL’经总线1701推送到处理器核1702供执行。此时读指针425与1425的值也都为‘0’。同时,413也控制从存储器1726读出其中的分支指令行1513的‘0-3’表项‘0000’,413也控制从存储器1736读出其中的分支指令行1523的‘0-3’表项‘0101’。这些表项被送到相关性检测器1702(图17中未显示),检测器1702检测后发现其中偏移地址为‘1’及为‘3’的两条L型指令相关,产生B,C,D相关位‘110’,及指令地址增量‘3’。相关位‘110’经总线1703送到处理器核1702使其中D执行单元不执行D指令(即偏移地址为‘3’的L指令)。相关位‘110’也经总线1703送到掩码器1706与来自存储器1726的表项‘0000’中后三位进行‘与’操作后与第一位进行‘或’操作,产生421值‘0’;在掩码器1708中对来自存储器1736的表项‘0101’进行同样操作后,产生1421值‘1’。加法器1714将413上的值‘0’与总线1707上的地址增量‘3’相加,其和为‘3’。因为421值为‘0’(意义为此时钟周期中可以执行的指令中没有分支指令)控制器控制选择器118选择加法器1714的输出‘3’。而1421值为‘1’(意义为此时钟周期中可以执行的指令中有数据访问指令),因此控制器以数据地址表1412的输出1423上的DBN访问数据缓存器1426,推送数据存入先入先出1633以备处理器核1702中执行L指令的执行单元(此时是B单元)读取。
下一时钟周期,读指针的块地址部分411不变,偏移地址部分413为‘3’,则指令缓存1704将1501指令段中偏移地址‘3’-‘6’的4条指令‘LBNL’经总线1701推送到处理器核1702供执行。此时因上一周1421值为‘1’,因此本周寄存器1432更新,读出数据地址表1412中1525行中顺序号为‘1’的表项。‘LBNL’4条指令经相关性检测器1702检测,得出总线1703上值‘110’,总线1705上值‘3’。413也控制读出存储器1726及1736中‘3’-‘6’表项的值‘0100’及‘1001’,在掩码器1706,1708中与总线1703上值‘110’作用后得421值‘1’及1421值‘1’。此周处理器核1702中由总线1703上值‘110’控制D执行单元不执行D指令(偏移地址为’6’的L型指令)。因为本周的1421值为‘1’,因此控制器以数据地址表1412的输出1423上的DBN访问数据缓存器1426,推送数据存入先入先出1633。因为本周的421值为‘1’(意义为此时钟周期中可以执行的指令中有分支指令),且总线423上的分支类型为条件分支指令,因此控制器控制选择器118受分支判断113控制。加法器1714将413上的值‘3’与总线1707上的地址增量‘3’相加,其和为‘6’。如分支判断为‘不分支’,则选择器18选择加法器1714的输出,下个时钟周期读指针413值为‘6’,指令缓存1704将1501指令段中偏移地址‘6’-‘7’的2条指令‘LN’经总线1701推送到处理器核1702供执行。本周中因上个周期421为‘1’,且分支判断为‘不分支’,副循迹器420中寄存器432值增‘1’,从分支目标表412中读出顺序号为‘1’的表项(1515中的结束轨迹点)送往选择器的一个输入;上个周期1421为‘1’,且分支判断为‘不分支’,副循迹器420中寄存器1432值增‘1’,从数据指令表1421中读出顺序号为‘2’的表项(偏移地址为‘6’)经总线1423访问数据读缓存1426。相关性检测器1702也对总线1703上的指令如前进行相关性检测。
如分支判断为‘执行分支’,则选择器18选择总线423,下个时钟周期读指针115的值为分支目标地址,指令缓存1704将从分支目标指令开始的4条指令‘LN’经总线1701推送到处理器核1702供执行。分支目标指令段的指令类型经总线417被存入存储器1726及1736。读指针115的块内偏移部分413上此时是分支目标地址的块内偏移地址,在偏移地址映射器416及1416中映射为MBNY顺序号419及1419。因上个周期分支判断为‘执行分支’,选择器418选择419,因上个周期421为‘1’,副循迹器420中寄存器432存入419总线上值(分支目标指令及其后指令中第一条分支指令在分支目标表412中的指令顺序号MBNY)。同样因上个周期分支判断为‘执行分支’,选择器1418选择1419,因上个周期1421为‘1’,副循迹器1420中寄存器1432存入1419总线上值(分支目标指令及其后指令中第一条数据访问指令在数据地址表1412中的指令顺序号MBNY)。以后的操作以此类推。
图17实施例以复数条数据访问指令之间的相关性为例说明,但指令间其他种类的相关性处理也是同样的。相关性检测器1702检测复数条指令间的相关性,决定那些指令可被同时执行并通过1703总线控制处理器核中的相应执行单元;也通过1703总线控制掩码器1706及1708将可被同时执行的各条指令的指令类型用于产生控制总线421,及1421。控制总线421用于控制程序的走向,1421用于控制数据访问。421与1421也控制各自相应副循迹器读指针425及1425的更新,提前从分支目标表412及数据地址表1412中读出下一个分支目标地址BN或数据访问地址DBN备用。相关性检测器1702也提供与可执行指令条数相应的地址增量1705,供主循迹器读指针115指向下一时钟周期的起始地址。
虽然本发明的实施例仅仅对本发明的结构特征和/或方法过程进行了描述,但应当理解的是,本发明的权利要求并不只局限与所述特征和过程。相反地,所述特征和过程只是实现本发明权利要求的几种例子。
应当理解的是,上述实施例中列出的多个部件只是为了便于描述,还可以包含其他部件,或某些部件可以被组合或省去。所述多个部件可以分布在多个***中,可以是物理存在的或虚拟的,也可以用硬件实现(如集成电路)、用软件实现或由软硬件组合实现。
显然,根据对上述较优的实施例的说明,无论本领域的技术发展有多快,也无论将来可能取得何种目前尚不易预测的进展,本发明均可以由本领域普通技术人员根据本发明的原理对相应的参数、配置进行相适应的替换、调整和改进,所有这些替换、调整和改进都应属于本发明所附权利要求的保护范围。

Claims (54)

1.一种缓存方法,其特征在于,由缓存向处理器核推送指令,并根据处理器核执行所述指令的反馈信息确定后续推送的指令;当处理器核执行的指令为直接分支指令或非分支指令时,所述反馈信息不包括指令地址。
2.如权利要求1所述的缓存方法,其特征在于,
所述缓存提供一个第一读指针对所述缓存寻址以读出对应指令供处理器核执行;
根据处理器核执行所述指令产生的反馈信息,更新第一读指针的值。
3.如权利要求2所述的缓存方法,其特征在于,
对填充到所述缓存中的一级缓存的指令进行审查,提取出相应的指令信息;
根据所述指令信息,将一级缓存中所有分支指令的分支目标指令预先存储到所述缓存中的二级缓存中;
当处理器核执行分支指令时,无论分支转移是否发生,后续将被执行的指令至少已经存储在二级缓存中;和
若分支转移发生,第一读指针被更新为所述分支指令的分支目标寻址地址值;若分支转移没有发生,第一读指针被更新为该分支指令顺序执行的后一条指令的寻址地址值。
4.如权利要求3所述的缓存方法,其特征在于,根据所述指令信息,提前将处理器核将要执行到的分支指令的分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中。
5.如权利要求4所述的缓存方法,其特征在于,对填充到一级缓存的指令进行审查,提取出相应的指令信息;第一读指针根据所述指令信息而非指令本身的功能确定如何更新。
6.如权利要求4所述的缓存方法,其特征在于,当第一读指针指向一条有条件分支指令,且其后一条是无条件分支指令时,则根据处理器核对有条件分支指令的执行结果:
若分支转移发生,第一读指针被更新为所述有条件分支指令的分支目标寻址地址值;若分支转移没有发生,第一读指针被更新为所述无条件分支指令的分支目标寻址地址值;
使得处理器核不需要单独一个时钟周期执行所述无条件分支指令。
7.如权利要求4所述的缓存方法,其特征在于,对第一读指针的值进行缓冲,并由所述缓冲后的第一读指针值对一级缓存寻址以读出对应指令供处理器核执行;
第一读指针提前指向分支指令,若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中。
8.如权利要求4所述的缓存方法,其特征在于,提供一个第二读指针;所述第二读指针提前指向第一读指针之后的分支指令,若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中。
9.如权利要求8所述的缓存方法,其特征在于,当处理器核执行到分支指令时,根据分支预测选择顺序执行下一指令和分支目标指令中的一个作为后续指令猜测执行,并保存另一个的寻址地址;
若分支转移结果与分支预测一致,则继续执行后续指令;
若分支转移结果与分支预测不一致,则清空流水线,并从所述保存的寻址地址对应的指令重新执行。
10.如权利要求4所述的缓存方法,其特征在于:
所述指令信息包括指令类型和分支指令的分支目标寻址地址;每条分支指令对应一个分支目标寻址地址;和
每条指令均对应一个指令类型,所述指令类型为一位或更多位,可以被进一步分为基本类型信息和分支指令类型;其中,基本类型信息对分支指令和非分支指令进行区分,每条指令均对应一个基本类型信息;分支指令类型对分支指令进行进一步区分,每条分支指令对应一个分支类型信息;所述分支指令类型进一步包括:有条件分支指令、无条件分支指令。
11.如权利要求10所述的缓存方法,其特征在于,根据第一读指针找到对应指令的指令类型;根据第二读指针找到所述指令之后第一条分支指令的分支目标寻址地址。
12.如权利要求11所述的缓存方法,其特征在于,根据第一读指针值通过映射得到对应的第二读指针值;所述第二读指针值等于第一读指针指向的指令之前的分支指令数。
13.如权利要求12所述的缓存方法,其特征在于,当处理器核执行分支指令时,若分支转移发生,第一读指针被更新为第二读指针指向的分支目标寻址地址值;若分支转移没有发生,第一读指针被更新为该分支指令顺序执行的后一条指令的寻址地址值。
14.如权利要求2所述的缓存方法,其特征在于,处理器核包含两个前端流水线和一个后端流水线;所述方法还提供:
一个第一指令读缓冲,用于存储当前指令块;
一个第三读指针对一级缓存寻址以读出对应指令供处理器核的目标前端流水线执行;和
所述第一读指针对所述第一指令读缓冲寻址以读出对应指令供处理器核的顺序前端流水线执行。
15.如权利要求14所述的缓存方法,其特征在于,若分支指令的分支转移没有发生:
将第三读指针值更新为第一读指针指向的下一条分支指令的分支目标寻址地址,使得第三读指针指向一级缓存中该分支目标指令块,并读出对应指令供处理器核的目标前端流水线执行;第一读指针继续更新,并从第一指令读缓冲中读出对应指令供处理器核的顺序前端流水线执行;和
若分支指令的分支转移成功发生:
将第三读指针指向的指令块从一级缓存填充到第一指令读缓冲中,并将第一读指针值更新为第三读指针增一后的值;第一读指针从该值开始更新,并从第一指令读缓冲中读出对应指令供处理器核的顺序前端流水线执行。
16.如权利要求14所述的缓存方法,其特征在于,提供:
一个第二指令读缓冲,用于存储目标指令块;第三读指针对所述第二指令读缓冲寻址以读出对应指令供处理器核的目标前端流水线执行;
一个第二读指针;所述第二读指针提前指向第一读指针之后的分支指令,若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中;和
一个第四读指针;所述第四读指针提前指向第三读指针之后的分支指令,若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中;
当第二读指针提前指向第一读指针之后的第一条分支指令时,将第三读指针值更新为第一读指针指向的分支指令的分支目标寻址地址,使得第三读指针指向一级缓存中该分支目标指令块,并读出对应指令供处理器核的目标前端流水线执行。
17.如权利要求1所述的缓存方法,其特征在于,
所述缓存提供一个第一读指针对所述缓存中的一级缓存寻址以读出对应的复数条指令推送给处理器核,并对所述复数条指令进行相关性检测;
根据相关性检测的结果,控制处理器核执行所述复数条指令中的部分或全部;
根据处理器核执行所述指令产生的反馈信息,以及所述相关性检测的结果,更新第一读指针的值;
所述方法进一步包括:提供一个第二读指针;所述第二读指针提前指向第一读指针之后的分支指令,若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从所述缓存中的二级缓存填充到一级缓存中,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中。
18.如权利要求4所述的缓存方法,其特征在于:
所述指令信息包括指令类型、分支指令的分支目标寻址地址和数据访问指令的数据寻址地址和数据步长;每条分支指令对应一个分支目标寻址地址;每条数据访问指令对应一个数据寻址地址和一个数据步长;和
每条指令均对应一个指令类型,所述指令类型为一位或更多位,可以被进一步分为基本类型信息、分支指令类型和数据访问指令类型;其中,基本类型信息对分支指令、数据访问指令和其他指令进行区分,每条指令均对应一个基本类型信息;
分支指令类型对分支指令进行进一步区分,每条分支指令对应一个分支类型信息;所述分支指令类型进一步包括:有条件分支指令、无条件分支指令;
数据访问指令类型进一步包含了表示其对应的数据寻址地址是否有效的地址有效信息,以及表示其对应的数据步长是否有效的步长有效信息。
19.如权利要求18所述的缓存方法,其特征在于,所述数据访问指令类型中的地址有效信息和步长有效信息共表示三种状态:
状态一:根据处理器核提供的数据地址获取数据,并记录该数据地址;
状态二:根据处理器核提供的数据地址获取数据,并根据该数据地址及状态一记录的数据地址计算并记录数据步长,并根据该数据地址和所述数据步长计算并记录下次数据地址;
状态三:根据状态二记录的所述下次数据地址向处理器核推送数据,并根据该数据地址和所述数据步长计算并记录再下一次的数据地址。
20.如权利要求19所述的缓存方法,其特征在于:当所述数据所在数据块的顺序地址前一数据块或后一数据块已经存储在一级缓存中时,将所述前一数据块或后一数据块在一级缓存中的地址信息与所述数据所在的数据块记录在一起,使得对所述数据访问时能够同时读出其前一数据块或后一数据块在一级缓存中的寻址地址;和
通过将本次执行数据访问指令对应的本次数据的地址加上数据步长得到下次执行该数据访问指令时的下次数据的地址,当所述下次数据的地址位于本次数据地址的前一数据块或后一数据块中时,在读出所述数据的同时读出所述前一数据块或后一数据块的寻址地址,从而直接得到所述下次数据在一级缓存中的寻址地址。
21.如权利要求18所述的缓存方法,其特征在于,提供一个第二读指针;所述第二读指针从所述第一读指针指向的指令开始移动提前指向第一条分支指令;若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中;
对于所述第二读指针在移动过程中经过的数据访问指令中的每一条,若该数据访问指令需要访问的数据尚未存储在一级缓存中,则将该数据从二级缓存填充到一级缓存,使得处理器核执行到该数据访问指令时可以直接从一级缓存中访问该数据。
22.如权利要求17或18所述的缓存方法,其特征在于,提供一个第五读指针;所述第五读指针提前指向第一读指针之后的数据访问指令,若该数据访问指令需要访问的数据尚未存储在一级缓存中,则将该数据从二级缓存填充到一级缓存,使得处理器核执行到该数据访问指令时可以直接从一级缓存中访问该数据。
23.如权利要求17或18所述的缓存方法,其特征在于:提供一个第五读指针和一个暂存器;所述第五读指针提前移动依次指向第一读指针之后的各个数据访问指令;
若该数据访问指令需要访问的数据尚未存储在一级缓存中,则将该数据从二级缓存填充到一级缓存,并存储到所述暂存器中;否则,直接从一级缓存中读出所述数据并存储到所述暂存器中;使得所述第五读指针可以继续移动指向下一条数据访问指令;
所述暂存的数据被依次推送到处理器核供执行数据访问指令时取用。
24.如权利要求1所述的缓存方法,其特征在于,所述方法包括:
按指令地址顺序依次在一张信息表中记录各条分支指令的指令信息;所述指令信息包括所述分支指令的分支目标指令在缓存中的地址信息;
在一张映射表中存储从指令地址到所述信息表的相应地址的的映射关系;所述映射表中的信息与缓存中的指令一一对应,且根据所述映射关系,可以将指令地址转换为从该指令地址开始的第一条分支指令在所述信息表中的地址。
25.如权利要求24所述的缓存方法,其特征在于,所述方法还包括:
提供一个第一读指针对所述缓存寻址以读出对应指令供处理器核执行;
根据所述映射关系将第一读指针值转换为相应的信息表地址;
提供一个第二读指针对所述信息表寻址以读出相应分支指令的指令信息;所述指令信息包括所述分支指令对应的分支目标指令地址信息;
当分支转移发生时,选择所述分支目标指令地址信息作为第一读指针的待更新值,并选择所述信息表地址作为第二读指针的待更新值;否则,分别选择第一读指针和第二读指针值增一的值作为相应的待更新值;
根据第一读指针指向的映射表信息,决定是否将第二读指针更新为相应的所述待更新值;
根据所述反馈信息,决定是否将第一读指针更新为相应的所述待更新值。
26.一种缓存***,其特征在于,包括:
处理器核,用于执行指令;
缓存,所述缓存中至少存储了处理器核将要执行的指令;
缓存控制器,用于根据处理器核执行指令的反馈信息对缓存寻址,控制缓存向处理器核推送后续指令;当处理器核执行的指令为直接分支指令或非分支指令时,所述反馈信息不包括指令地址。
27.如权利要求26所述的缓存***,其特征在于,所述缓存控制器至少包括:循迹器(tracker);所述循迹器输出第一读指针对缓存寻址以读出相应指令供处理器核执行,并根据处理器核执行指令产生的反馈信息更新所述第一读指针的值。
28.如权利要求27所述的缓存***,其特征在于,所述缓存包括:
一级缓存,所述一级缓存中至少存储了处理器核将要执行的指令;
二级缓存,用于存储一级缓存中的所有指令,及一级缓存中所有分支指令的分支目标指令;
所述缓存控制器还包括主动表、块地址映射模块、轨道表和扫描器;其中:
主动表,其表项与二级缓存指令块对应,用于存储二级缓存中指令块的地址信息;
块地址映射模块,用于存储一级缓存与二级缓存指令地址的对应关系;
轨道表,其轨迹点与一级缓存指令对应,用于存储一级缓存中指令的指令信息;所述指令信息包括指令类型和分支指令的分支目标指令位置信息;
扫描器,用于对填充到一级缓存的指令进行审查,提取出相应的指令信息,计算分支指令的分支目标指令地址,并将计算得到的分支目标指令地址在主动表及块地址映射模块中匹配;若匹配不成功,则将包含所述分支目标指令在内的至少一条指令从更低层次存储器填充到二级缓存中,并将相应的分支目标指令位置信息存储到轨道表中;若匹配成功,则直接将分支目标指令位置信息存储到轨道表中;
循迹器(tracker),输出第一读指针对一级缓存寻址以读出相应指令供处理器核执行,并从轨道表中读出所述指令信息;所述循迹器还根据处理器核执行指令产生的反馈信息及所述所述指令信息更新所述第一读指针的值;若分支转移发生,第一读指针被更新为所述分支指令的分支目标寻址地址值;若分支转移没有发生,第一读指针被更新为该分支指令顺序执行的后一条指令的寻址地址值。
29.如权利要求28所述的缓存***,其特征在于,第一读指针根据所述指令信息而非指令本身的功能确定如何更新。
30.如权利要求28所述的缓存***,其特征在于,同时从轨道表中读出第一读指针指向的轨迹点及其后一个轨迹点中存储的所述指令信息。
31.如权利要求30所述的缓存***,其特征在于,当第一读指针指向一条有条件分支指令,且其后一条是无条件分支指令时,则根据处理器核对有条件分支指令的执行结果:
若分支转移发生,第一读指针被更新为所述有条件分支指令的分支目标寻址地址值;若分支转移没有发生,第一读指针被更新为所述无条件分支指令的分支目标寻址地址值;
使得处理器核不需要单独一个时钟周期执行所述无条件分支指令。
32.如权利要求28所述的缓存***,其特征在于,还包括一个缓冲器,所述缓冲器用于存储第一读指针的值;
所述缓冲器输出的第一读指针值对一级缓存寻址以读出对应指令供处理器核执行;
循迹器的第一读指针提前指向分支指令,若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中;
当处理器核执行分支指令时,若分支转移发生,循迹器的第一读指针被更新为所述分支目标寻址地址值;若分支转移没有发生,循迹器的第一读指针被更新为该分支指令顺序执行的后一条指令的寻址地址值。
33.如权利要求28所述的缓存***,其特征在于,还包括一个副循迹器(slavetracker);
所述副循迹器输出第二读指针,提前指向第一读指针之后的分支指令,若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中。
34.如权利要求33所述的缓存***,其特征在于,所述循迹器中还包含一个寄存器,用于存储顺序执行下一指令和分支目标指令中的一个寻址地址;
当处理器核执行到分支指令时,根据分支预测选择顺序执行下一指令和分支目标指令中的一个作为后续指令猜测执行,并将另一个的寻址地址存储在所述寄存器中;
若分支转移结果与分支预测一致,则继续执行后续指令;
若分支转移结果与分支预测不一致,则清空流水线,并从所述寄存器中保存的寻址地址对应的指令重新执行。
35.如权利要求28所述的缓存***,其特征在于,所述轨道表中每条轨道的最后一个轨迹点之后再增加一个结束轨迹点;所述结束轨迹点的指令类型为无条件分支指令,其分支目标寻址地址为顺序执行下一轨道第一个轨迹点的寻址地址;当第一读指针指向结束轨迹点时,一级缓存输出空指令;
当结束轨迹点之前的轨迹点不是分支点时,可以将该结束轨迹点的指令类型及分支目标寻址地址作为该轨迹点的指令类型及分支目标寻址地址。
36.如权利要求28所述的缓存***,其特征在于,所述轨道表进一步包括:
指令类型表,用于存储指令对应的基本类型信息;所述基本类型信息对分支指令和非分支指令进行区分;每条指令均对应指令类型表的一个表项,且表项内容为一位或更多位;
目标地址表,用于存储分支指令对应的分支指令类型和分支目标寻址地址;每条分支指令对应目标地址表的一个表项;所述分支指令类型包括:有条件分支指令、无条件分支指令。
37.如权利要求36所述的缓存***,其特征在于,根据第一读指针从指令类型表中找到对应指令的基本类型信息;所述基本类型信息被送到循迹器;和
根据第二读指针从目标地址表中找到所述指令之后第一条分支指令的的分支指令类型和分支目标寻址地址;所述分支指令类型被送到循迹器,所述分支目标寻址地址被送到副循迹器。
38.如权利要求37所述的缓存***,其特征在于,还包括一个偏移地址映射模块,用于将第一读指针值映射为相应的目标地址表列号;所述目标地址表列号被送到副循迹器;若处理器核执行分支指令且分支转移发生,副循迹器的第二读指针被更新为偏移地址映射模块送来的列号;若处理器核执行分支指令且分支转移没有发生,副循迹器的第二读指针值被增一,指向目标地址表中的下一个表项;
所述偏移地址映射模块包含:
译码器,用于根据第一读指针值,产生一个掩码值,使得所述第一读指针指向的指令及其后指令对应的掩码值均为‘0’,其他掩码值均为‘1’;
掩码器,用于对译码器产生的掩码值与指令类型表中的基本类型信息进行与操作,得到控制字;
选择器阵列;在所述选择器阵列中,每列选择器根据控制字相应位的值进行选择;若该位为‘0’,则选择本行前列的输入;若该位为‘1’,则选择下行前列的输入;使得选择器阵列输入的唯一一个‘1’被上移的行数等于控制字中‘1’的个数,输出一个只包含一个‘1’、其余均为‘0’的序列;
编码器,用于将所述序列编码为一个列号,从而将第一读指针值映射为相应的目标地址表列号。
39.如权利要求27所述的缓存***,其特征在于,处理器核包含两个前端流水线和一个后端流水线;所述***还包括:
一个第一指令读缓冲,用于存储当前指令块;
一个第二循迹器,输出第三读指针对一级缓存寻址以读出对应指令供处理器核的目标前端流水线执行;和
所述第一读指针对所述第一指令读缓冲寻址以读出对应指令供处理器核的顺序前端流水线执行。
40.如权利要求39所述的缓存***,其特征在于,若分支指令的分支转移没有发生:
将第三读指针值更新为第一读指针指向的下一条分支指令的分支目标寻址地址,使得第三读指针指向一级缓存中该分支目标指令块,并读出对应指令供处理器核的目标前端流水线执行;第一读指针继续更新,并从第一指令读缓冲中读出对应指令供处理器核的顺序前端流水线执行;和
若分支指令的分支转移成功发生:
将第三读指针指向的指令块从一级缓存填充到第一指令读缓冲中,并将第一读指针值更新为第三读指针增一后的值;第一读指针从该值开始更新,并从第一指令读缓冲中读出对应指令供处理器核的顺序前端流水线执行。
41.如权利要求40所述的缓存***,其特征在于,还包括:
一个第二指令读缓冲,用于存储目标指令块;第三读指针对所述第二指令读缓冲寻址以读出对应指令供处理器核的目标前端流水线执行;
一个副循迹器,输出第二读指针;所述第二读指针提前指向第一读指针之后的分支指令,若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中;和
一个第二副循迹器,输出第四读指针;所述第四读指针提前指向第三读指针之后的分支指令,若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中;
当第二读指针提前指向第一读指针之后的第一条分支指令时,将第三读指针值更新为第一读指针指向的分支指令的分支目标寻址地址,使得第三读指针指向一级缓存中该分支目标指令块,并读出对应指令供处理器核的目标前端流水线执行。
42.如权利要求26所述的缓存***,其特征在于,还包括:
一个循迹器,输出第一读指针对所述缓存中的一级缓存寻址以读出对应的复数条指令推送给处理器核,
一个相关性检测模块,对所述复数条指令进行相关性检测,并根据相关性检测的结果,控制处理器核执行所述复数条指令中的部分或全部;
所述循迹器根据处理器核执行所述指令产生的反馈信息,以及所述相关性检测的结果,更新第一读指针的值;
所述***进一步包括:一个副循迹器,输出第二读指针提前指向第一读指针之后的分支指令,若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从所述缓存中的二级缓存填充到一级缓存中,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中。
43.如权利要求28所述的缓存***,其特征在于:
所述轨道表中的指令信息还包括数据访问指令的数据寻址地址和数据步长;每条数据访问指令对应一个数据寻址地址和一个数据步长;根据从轨道表中读出的由所述第五读指针指向的表项中存储的所述数据寻址地址可以直接在一级缓存中找到相应的数据;和
所述指令信息包括指令类型进一步包括:分支指令类型、数据访问指令类型和其他指令类型;数据访问指令类型进一步包含了其对应的数据寻址地址是否有效,以及数据步长是否有效的信息。
44.如权利要求43所述的缓存***,其特征在于,还包括一个相邻数据块地址存储器;所述相邻数据块地址存储器的行与一级缓存中的数据块一一对应:当一级缓存中的一个数据块的顺序地址前一数据块或后一数据块已经存储在一级缓存中时,则在相邻数据块地址存储器的相应行中存储了所述前一数据块或后一数据块在一级缓存中的地址信息;
所述***还包括一个数据引擎;所述数据引擎至少包含一个加法器,用于通过将本次执行数据访问指令对应的本次数据的地址加上数据步长得到下次执行该数据访问指令时的下次数据的地址;
当所述下次数据的地址位于本次数据地址的前一数据块或后一数据块中时,在根据所述数据寻址地址从一级缓存中读出相应数据的同时从所述相邻数据块地址存储器中读出对应行中的前一数据块或后一数据块在一级缓存中的寻址地址,从而直接得到所述下次数据在一级缓存中的寻址地址。
45.如权利要求43所述的缓存***,其特征在于,还包括一个副循迹器;
所述副循迹器输出第二读指针,所述第二读指针从所述第一读指针指向的指令开始移动提前指向第一条分支指令;若该分支指令的分支目标指令尚未存储在一级缓存中,则将该分支目标指令从二级缓存填充到一级缓存,使得处理器核执行到该分支指令时,无论分支转移是否发生,后续将被执行的指令已经存储在一级缓存中;
对于所述第二读指针在移动过程中经过的数据访问指令中的每一条,若该数据访问指令需要访问的数据尚未存储在一级缓存中,则将该数据从二级缓存填充到一级缓存,使得处理器核执行到该数据访问指令时可以直接从一级缓存中访问该数据。
46.如权利要求42或43所述的缓存***,其特征在于,还包括一个数据循迹器,输出第五读指针;所述第五读指针提前指向第一读指针之后的数据访问指令,若该数据访问指令需要访问的数据尚未存储在一级缓存中,则将该数据从二级缓存填充到一级缓存,使得处理器核执行到该数据访问指令时可以直接从一级缓存中访问该数据。
47.如权利要求42或43所述的缓存***,其特征在于:提供一个第五读指针和一个暂存器;所述第五读指针提前移动依次指向第一读指针之后的各个数据访问指令;
若该数据访问指令需要访问的数据尚未存储在一级缓存中,则将该数据从二级缓存填充到一级缓存,并存储到所述暂存器中;否则,直接从一级缓存中读出所述数据并存储到所述暂存器中;使得所述第五读指针可以继续移动指向下一条数据访问指令;
所述暂存的数据被依次推送到处理器核供执行数据访问指令时取用。
48.如权利要求26所述的缓存***,其特征在于,还包括:
一个信息表,用于按指令地址顺序依次存储各条分支指令的指令信息;所述指令信息包括所述分支指令的分支目标指令在缓存中的地址信息;
一个映射表,用于存储从指令地址到所述信息表的相应地址的的映射关系;所述映射表中的信息与缓存中的指令一一对应,且根据所述映射关系,可以将指令地址转换为从该指令地址开始的第一条分支指令在所述信息表中的地址;
一个循迹器,用于提供一个第一读指针对所述缓存寻址以读出对应指令供处理器核执行;所述映射表接收循迹器送来的第一读指针值根据所述映射关系转换为相应的信息表地址;
一个副循迹器,用于提供一个第二读指针对所述信息表寻址以读出相应分支指令的指令信息;所述指令信息包括所述分支指令对应的分支目标指令地址信息;
当分支转移发生时,所述循迹器选择所述分支目标指令地址信息作为第一读指针的待更新值,所述副循迹器选择所述映射转换得到的信息表地址作为第二读指针的待更新值;否则,所述循迹器和副循迹器分别选择第一读指针和第二读指针值增一的值作为相应的待更新值;
根据第一读指针指向的映射表信息,副循迹器决定是否将第二读指针更新为相应的所述待更新值;
根据所述反馈信息,循迹器决定是否将第一读指针更新为相应的所述待更新值。
49.如权利要求48所述的缓存***,其特征在于,
所述循迹器还包括:
一个寄存器,用于存储第一读指针值;
一个增量器,用于对所述寄存器中存储的第一读指针值增一以得到增一后的值;
一个选择器;当分支转移发生时,所述选择器选择所述分支目标指令地址信息作为第一读指针待更新值,否则选择所述第一读指针值增一后的值作为第一读指针待更新值;
根据所述反馈信息,循迹器决定是否将第一读指针更新为相应的所述第一读指针待更新值;
所述副循迹器还包括:
一个寄存器,用于存储第二读指针值;
一个增量器,用于对所述寄存器中存储的第二读指针值增一以得到增一后的值;
一个选择器;当分支转移发生时,所述选择器选择所述映射转换得到的信息表地址作为第二读指针待更新值,否则选择所述第二读指针值增一后的值作为第二读指针待更新值;
根据第一读指针指向的映射表信息,副循迹器决定是否将第二读指针更新为相应的所述第二读指针待更新值。
50.一种缓存中指令块信息组织方法;其特征在于,所述方法包含一种压缩方法;所述压缩方法通过对指令进行分类,仅将特定类型的指令或特定类型指令的指令信息存储在一张信息表中,并根据分类结果生成一张映射表。
51.如权利要求50所述的方法,其特征在于,所述方法还包含一种解压缩方法;所述解压缩方法根据所述映射表中的内容,将指令地址转换为该指令或该指令的指令信息在所述信息表中的地址。
52.如权利要求51所述的方法,其特征在于:
提取缓存中指令的相关指令信息,并将所述指令信息至少分为两类;
按指令地址顺序将所述分类结果依次记录在一张映射表中;
按指令地址顺序将至少一类指令信息依次记录在一张信息表中。
53.如权利要求52所述的方法,其特征在于:
当按指令在缓存中的地址对缓存寻址时,根据所述映射表中的内容,转换出所述指令地址对应的指令信息在所述信息表中的地址。
54.如权利要求53所述的方法,其特征在于,根据所述指令地址对所述映射表中的分类信息进行从‘0’开始的计数:对每个存储在所述信息表中的指令信息对应的类型加一或移位一位,直到到达所述指令地址对应的类型为止;此时得到的计数值或移位位数值就是所述指令地址对应的指令信息在所述信息表中的地址。
CN201410826711.4A 2013-12-24 2014-12-23 一种缓存***和方法 Active CN104731719B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201410826711.4A CN104731719B (zh) 2013-12-24 2014-12-23 一种缓存***和方法

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
CN2013107378134 2013-12-24
CN201310737813 2013-12-24
CN201410826711.4A CN104731719B (zh) 2013-12-24 2014-12-23 一种缓存***和方法

Publications (2)

Publication Number Publication Date
CN104731719A true CN104731719A (zh) 2015-06-24
CN104731719B CN104731719B (zh) 2020-04-28

Family

ID=53455626

Family Applications (2)

Application Number Title Priority Date Filing Date
CN201410048036.7A Pending CN104731718A (zh) 2013-12-24 2014-01-29 一种缓存***和方法
CN201410826711.4A Active CN104731719B (zh) 2013-12-24 2014-12-23 一种缓存***和方法

Family Applications Before (1)

Application Number Title Priority Date Filing Date
CN201410048036.7A Pending CN104731718A (zh) 2013-12-24 2014-01-29 一种缓存***和方法

Country Status (2)

Country Link
CN (2) CN104731718A (zh)
WO (1) WO2015096688A1 (zh)

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107291920A (zh) * 2017-06-28 2017-10-24 南京途牛科技有限公司 一种机票查询缓存方法
CN110187663A (zh) * 2019-06-19 2019-08-30 浙江中控技术股份有限公司 监控方法和装置
CN111290698A (zh) * 2018-12-07 2020-06-16 上海寒武纪信息科技有限公司 数据存取方法、数据处理方法、数据存取电路和运算装置
CN114780031A (zh) * 2022-04-15 2022-07-22 北京志凌海纳科技有限公司 一种基于单机存储引擎的数据处理方法和装置
CN117193861A (zh) * 2023-11-07 2023-12-08 芯来智融半导体科技(上海)有限公司 指令处理方法、装置、计算机设备和存储介质
CN117971719A (zh) * 2024-03-28 2024-05-03 北京微核芯科技有限公司 一种提前传递数据的方法及其装置

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10346168B2 (en) * 2015-06-26 2019-07-09 Microsoft Technology Licensing, Llc Decoupled processor instruction window and operand buffer
US20170046159A1 (en) * 2015-08-14 2017-02-16 Qualcomm Incorporated Power efficient fetch adaptation
CN108139967B (zh) * 2015-10-09 2021-07-20 华为技术有限公司 将数据流转换为阵列
US9588758B1 (en) 2015-12-18 2017-03-07 International Business Machines Corporation Identifying user managed software modules
JP6400770B1 (ja) * 2017-04-03 2018-10-03 株式会社東芝 伝送局
CN107729053B (zh) * 2017-10-17 2020-11-27 安徽皖通邮电股份有限公司 一种实现高速缓存表的方法
CN109684236A (zh) * 2018-12-25 2019-04-26 广东浪潮大数据研究有限公司 一种数据写缓存控制方法、装置、电子设备和存储介质
CN111625280B (zh) * 2019-02-27 2023-08-04 上海复旦微电子集团股份有限公司 指令控制方法及装置、可读存储介质
CN110851182B (zh) * 2019-10-24 2021-12-03 珠海市杰理科技股份有限公司 指令获取方法、装置、计算机设备和存储介质

Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6360317B1 (en) * 1997-10-29 2002-03-19 Advanced Micro Devices, Inc. Predecoding multiple instructions as one combined instruction and detecting branch to one of the instructions
US20020108029A1 (en) * 2001-02-02 2002-08-08 Yuki Kondoh Program counter (PC) relative addressing mode with fast displacement
US20080301420A1 (en) * 2007-06-04 2008-12-04 Nec Electronic Corporation Branch prediction control device having return address stack and method of branch prediction
US20090204791A1 (en) * 2008-02-12 2009-08-13 Luick David A Compound Instruction Group Formation and Execution
CN102110058A (zh) * 2009-12-25 2011-06-29 上海芯豪微电子有限公司 一种低缺失率、低缺失惩罚的缓存方法和装置
US20110161641A1 (en) * 2009-12-29 2011-06-30 International Business Machines Corporation SPE Software Instruction Cache
CN102163143A (zh) * 2011-04-28 2011-08-24 北京北大众志微***科技有限责任公司 一种实现值关联间接跳转预测的方法
CN102841865A (zh) * 2011-06-24 2012-12-26 上海芯豪微电子有限公司 高性能缓存***和方法
CN102968293A (zh) * 2012-11-28 2013-03-13 中国人民解放军国防科学技术大学 基于指令队列的程序循环代码动态检测及执行方法

Patent Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6360317B1 (en) * 1997-10-29 2002-03-19 Advanced Micro Devices, Inc. Predecoding multiple instructions as one combined instruction and detecting branch to one of the instructions
US20020108029A1 (en) * 2001-02-02 2002-08-08 Yuki Kondoh Program counter (PC) relative addressing mode with fast displacement
US20080301420A1 (en) * 2007-06-04 2008-12-04 Nec Electronic Corporation Branch prediction control device having return address stack and method of branch prediction
US20090204791A1 (en) * 2008-02-12 2009-08-13 Luick David A Compound Instruction Group Formation and Execution
CN102110058A (zh) * 2009-12-25 2011-06-29 上海芯豪微电子有限公司 一种低缺失率、低缺失惩罚的缓存方法和装置
US20110161641A1 (en) * 2009-12-29 2011-06-30 International Business Machines Corporation SPE Software Instruction Cache
CN102163143A (zh) * 2011-04-28 2011-08-24 北京北大众志微***科技有限责任公司 一种实现值关联间接跳转预测的方法
CN102841865A (zh) * 2011-06-24 2012-12-26 上海芯豪微电子有限公司 高性能缓存***和方法
CN102968293A (zh) * 2012-11-28 2013-03-13 中国人民解放军国防科学技术大学 基于指令队列的程序循环代码动态检测及执行方法

Cited By (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107291920A (zh) * 2017-06-28 2017-10-24 南京途牛科技有限公司 一种机票查询缓存方法
CN107291920B (zh) * 2017-06-28 2021-02-02 南京途牛科技有限公司 一种机票查询缓存方法
CN111290698A (zh) * 2018-12-07 2020-06-16 上海寒武纪信息科技有限公司 数据存取方法、数据处理方法、数据存取电路和运算装置
CN111290698B (zh) * 2018-12-07 2022-05-03 上海寒武纪信息科技有限公司 数据存取方法、数据处理方法、数据存取电路和运算装置
CN110187663A (zh) * 2019-06-19 2019-08-30 浙江中控技术股份有限公司 监控方法和装置
CN110187663B (zh) * 2019-06-19 2020-11-03 浙江中控技术股份有限公司 监控方法和装置
CN114780031A (zh) * 2022-04-15 2022-07-22 北京志凌海纳科技有限公司 一种基于单机存储引擎的数据处理方法和装置
CN114780031B (zh) * 2022-04-15 2022-11-11 北京志凌海纳科技有限公司 一种基于单机存储引擎的数据处理方法和装置
CN117193861A (zh) * 2023-11-07 2023-12-08 芯来智融半导体科技(上海)有限公司 指令处理方法、装置、计算机设备和存储介质
CN117193861B (zh) * 2023-11-07 2024-03-15 芯来智融半导体科技(上海)有限公司 指令处理方法、装置、计算机设备和存储介质
CN117971719A (zh) * 2024-03-28 2024-05-03 北京微核芯科技有限公司 一种提前传递数据的方法及其装置

Also Published As

Publication number Publication date
CN104731719B (zh) 2020-04-28
CN104731718A (zh) 2015-06-24
WO2015096688A1 (zh) 2015-07-02

Similar Documents

Publication Publication Date Title
CN104731719A (zh) 一种缓存***和方法
CN104978282B (zh) 一种缓存***和方法
CN102841865B (zh) 高性能缓存***和方法
CN104679480A (zh) 一种指令集转换***和方法
CN102306093B (zh) 实现现代处理器间接转移预测的装置及方法
CN102110058B (zh) 一种低缺失率、低缺失惩罚的缓存方法和装置
CN104424129A (zh) 基于指令读缓冲的缓存***和方法
CN104679481A (zh) 一种指令集转换***和方法
CN104424158A (zh) 基于通用单元的高性能处理器***和方法
CN103513957B (zh) 高性能缓存方法
CN105701030B (zh) 根据卷标比特的动态高速缓存置换路选择
CN104424128A (zh) 变长指令字处理器***和方法
CN103620547A (zh) 使用处理器的转换后备缓冲器的基于客户指令到本机指令范围的映射
CN102855121B (zh) 分支处理方法与***
CN101611380A (zh) 推测性吞吐量计算
US20130086564A1 (en) Methods and systems for optimizing execution of a program in an environment having simultaneously parallel and serial processing capability
CN103309644A (zh) 用于微处理器的转译地址高速缓存
CN103198026A (zh) 指令高速缓存功耗降低
US9753855B2 (en) High-performance instruction cache system and method
CN101375228A (zh) 具有省电指令高速缓存通路预测器和指令代替方案的微处理器
CN105701031A (zh) 取决于模式而可动态配置以选择分配至全部或是一个组的多模式组相联高速缓存存储器
KR20120068824A (ko) 데이터 처리 장치, 데이터 처리 방법, 프로그램 변환 처리 장치, 프로그램 변환 처리 방법, 프로그램 해석 처리 장치, 프로그램 해석 처리 방법, 이력 보존 장치, 프로그램, 컴파일 처리 장치, 및 컴파일 처리 방법
CN105718241A (zh) 一种基于sparc v8体系结构的分类式混合分支预测***
CN103984637A (zh) 一种指令处理***及方法
CN104854560A (zh) 软硬件协同协同预取

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
CP02 Change in the address of a patent holder

Address after: 201203 501, No. 14, Lane 328, Yuqing Road, Pudong New Area, Shanghai

Patentee after: SHANGHAI XINHAO MICROELECTRONICS Co.,Ltd.

Address before: 200092, B, block 1398, Siping Road, Shanghai, Yangpu District 1202

Patentee before: SHANGHAI XINHAO MICROELECTRONICS Co.,Ltd.

CP02 Change in the address of a patent holder