自堆栈快取存储器进行快速推测性弹出操作方法及装置的制作方法

文档序号:6436137阅读:231来源:国知局
专利名称:自堆栈快取存储器进行快速推测性弹出操作方法及装置的制作方法
技术领域
本发明涉及一种微处理器的快取存储器,特别是涉及一种其内区分为堆栈存储器与非堆栈存储器存取的快取存储器。
背景技术
微处理器是一种数字装置,用以执行电脑程序的指令。一典型的电脑系统包括一微处理器,其连接一系统存储器,而系统存储器储存程序指令及将被程序指令处理的数据(即资料,以下均称为数据)。如此一系统的运作受限于如下事实从系统存储器读取数据进入微处理器,或自微处理器将数据写入系统存储器所需的时间,远长于微处理器执行处理这些数据的指令所需的时间。此一时间差常在一到二个级数之间。因此,在等待存储器(即内存、存储器,以下均称为存储器)读取或写入数据时,微处理器是处于闲置状态而无事可做。
微处理器的设计者长久以来就认识到以下一个事实程序倾向于在相对较长的时间内存取相对较小的一部份数据,例如频繁地存取程序变数。具有此一特征的程序被称为具有良好的时间局部性(temporal locality),此一特征被称为存储存取局部性原理(the locality of reference principle)。为了利用此一原理,典型的现代微处理器通常包括一个或多个快取存储器。快取存储器或快取,在电气上接近微处理器的核心,且为相对较小的存储器,用于暂时性地储存数据内容的一部份,这些数据通常常驻于较大且较远离微处理器的核心的存储器,例如系统存储器。进行数据的快取操作是将数据存入快取的储存元件中,然后,比起自较远的存储器提供数据,自该快取存储器可以较快的速度提供数据。
当微处理器执行一存储器读取指令,如载入或弹出指令,微处理器先检查所要的数据是否出现在快取存储器,即要读取的地址是否命中快取存储器。如否,则要读取的地址在快取存储器发生失误,微处理器除了将数据载入特定寄存器外,亦提取该数据进入快取存储器。在数据已存在快取存储器之后,下次再碰到一存储器读取指令要求相同的数据时,就可自快取存储器,而不是系统存储器,提取数据进入寄存器。于是,既然数据已存在快取存储器,基本上,存储器读取指令可以较快速地被执行。
一快取存储器将数据(即资料)储存于快取单位(cache line,or cacheblock)。快取单位是在快取存储器与系统存储器之间传递的最小的数据单位。在一个例子中,一个快取单位数据量的大小是六十四个字节。当一存储器读取指令在快取存储器失误,与失误地址相关的一整个快取单位的数据量,被提取进入快取存储器,而不只是存储器读取指令所要求的数据而已。此后,要求在相同快取单位的数据的存储器读取指令就可以较快速地被执行,因为数据可自快取供应,而无庸再去存取系统存储器。
当一存储器写入指令被执行,例如存入或压入指令,如果存储器写入指令地址命中快取存储器,则数据可立即被写入快取存储器的快取单位,而使数据写入系统存储器被椎迟。稍后,快取存储器会将此一快取单位写入系统存储器,通常是为了腾出空间给新的快取单位。此一操作通常被称为写回(writeback)操作。而且,当存储器写入指令地址在快取存储器失误,某些快取存储器会在其内配置一层(entry)。即,快取存储器会对在其内一层中的快取单位进行写回操作,而与写入地址相关的新快取单位则自系统存储器被读取,并进入之前被旧的快取单位所占据的层。此一操作通常被称为写入配置操作(writeallocate operation)。
正如所见,一个有效的快取存储器能大幅度提高微处理器的运作。两个影响快取存储器效率的主要因素为快取命中率(cache hit rate)及快取存取时间(cache access time)。快取命中率是快取命中次数对快取命中次数加快取失误次数之和的比值。快取存取时间是将特定数据读出或写入快取存储器所需的微处理器核心时钟周期数。
影响快取命中率最大的因素是快取存储器容量的大小,即,能储存于快取存储器的数据字节数。快取存储器容量越大,储存于快取存储器的系统存储器的部份数据的量也就越大,于是,相关的快取单位也就越有可能出现于快取存储器。由于此一原因,始终存在着要增加快取存储器容量的驱力。就历史的角度来看,快取存储器的大小通常受限于微处理器芯片能够提供给快取存储器的实体空间。然而随着集成电路中元件尺寸持续的变小,这个限制亦不复存在。
快取存储器的大小亦影响现有快取存储器的存取时间。很不凑巧的是较大的快取存储器通常需要较长的存取时间。这是由于现有的快取存储器是一种随机存取存储器(random access memories)之故,即,存取快取存储器中的任一快取单位均需相同的时间。在快取存储器内,可用以储存数据的位置越多,用以标定数据位置所需的电路也就越复杂。所幸集成电路中元件尺寸持续的变小亦可减少快取存取时间,因而可以补偿增加快取存储器容量的负面效应。
然而,亦始终存在着持续提高微处理器时钟频率的要求,此意味着时钟周期的时间长度不断的缩短,而这又意味着快取的存取需要更多数目的时钟周期。于是,微处理器就倾向于使用较小的快取存储器,尤其是在第一级快取存储器(L1 cache)。例如,第一级快取就自Pentium III的16KB降为Pentium4的8KB。驱使快取存储器大小降低的并非芯片的实体限制,而是微处理器核心时钟周期的缩短,虽然这样做伴随着快取存储器表现的降低。
因此,所需要的是增加快取存储器的有效容量,或降低快取存储器的存取时间,或两者皆是。
由此可见,上述现有的快取存储器在结构与使用上,显然仍存在有不便与缺陷,而亟待加以进一步改进。为了解决快取存储器存在的问题,相关厂商莫不费尽心思来谋求解决之道,但长久以来一直未见适用的设计被发展完成,而一般产品又没有适切的结构能够解决上述问题,此显然是相关业者急欲解决的问题。
有鉴于上述现有的快取存储器存在的缺陷,本发明基于从事此类产品设计制造多年丰富的实务经验及专业知识,并配合理论的运用,发明出一种新型的自堆栈快取存储器进行快速推测性弹出操作的方法及装置,能够改进一般现有的快取存储器,使其更具有实用性。经过不断的研究、设计,并经反复试作样品及改进后,终于发明出确具实用价值的本发明。

发明内容
本发明的目的在于,克服现有的快取存储器存在的缺陷,而提供一种新的装置堆栈快取存储器,所要解决的技术问题是使其能为大多数的弹出指令提供较快速的存取,从而更加适于实用。
本发明的另一目的在于,提供一种新的方法,所要解决的技术问题是提供一种快速有效存取的方式,从而更加适于实用。
本发明的目的及解决其技术问题是采用以下技术方案来实现的。依据本发明提出的一种快取存储器(cache memory),其包括一后入先出(last-in-first-out)存储器,该后入先出存储器用于快取压入(push)指令的目位置相关的快取单位(cache line)的数据,该后入先出存储器并具一顶层(top entry),用以储存最新的压入(push)指令的目的地址相关的一快取单位;一输入单元,连接该后入先出存储器,该输入单元用于指示一自该快取存储器要求数据的指令是一指定该数据来源地址的弹出(pop)指令;以及逻辑单元,连接该输入单元,该逻辑单元用于回应该输入单元,并在决定该来源地址与储存在该顶层的快取单位的地址是否匹配之前,控制该后入先出存储器推测性地自该顶层提供该数据至该弹出指令。
本发明的目的及解决其技术问题还可采用以下技术措施进一步实现。
前述的快取存储器,其还包括一比较器,连接该逻辑单元,在该逻辑单元控制该后入先出存储器推测性地提供该数据至该弹出指令之后,该比较器用于比较该来源地址与储存在该顶层的快取单位的地址。
前述的快取存储器,其还包括一输出单元,连接该逻辑单元,如果该比较器指示该弹出指令的该来源地址与储存在该顶层的该快取单位的地址不匹配,该输出单元用于指示该后入先出存储器不正确地推测性提供该数据至该弹出指令。
前述的快取存储器,其中所述的弹出指令包括一指令,其用于自一系统存储器的堆栈弹出该数据,而该系统存储器连接一包括此快取存储器的微处理器。
前述的快取存储器,其中所述的堆栈的地址包括有最新压入指令的目的地址、弹出指令的来源地址包括在该堆栈地址,而该堆栈是在该系统存储器上、或自该弹出数据的返回地址。
前述的快取存储器,其中所述的快取单位包括多个字节的数据,这些字节数目等于能在快取存储器与该系统存储器之间传递的最小字节数目。
前述的快取存储器,其中所述的快取单位包括一第一字节组的数据,其中提供给该弹出指令的该数据包括一第二字节组的数据,且其中该第一字节组的字节数至少二倍于该第二字节组的字节数。
前述的快取存储器,其中所述的快取自该快取存储器的该快取单位的数据与一包括该快取存储器的系统的其他存储器保持一致性。
前述的快取存储器,其还包括一偏移量,供应该逻辑单元,该偏移量用于指定位于该顶层的快取单位的数据的位置,而该数据是由最新的压入指令所定。
前述的快取存储器,其中所述的逻辑单元控制该后入先出存储器,推测性地自该顶层的快取单位的数据的地址,提供该数据,而该地址是由该偏移量所定。
前述的快取存储器,其中,如果为回应该弹出指令,而更新该偏移量,致使该偏移量绕越该顶层的快取单位,该逻辑单元将令该后入先出存储器移出其内的该顶层。
前述的快取存储器,其中,如果在存入该最新的压入指令所定的该数据之前,更新该偏移量,致使该偏移量绕穿该顶层的快取单位,该逻辑单元将令该后入先出存储器下移,因而产生一新的顶层,其中该逻辑单元将由该最新的压入指令所定的该数据存入该新的顶层中由该偏移量所定的地址。
前述的快取存储器,其中所述的快取存储器,其还包括一算术单元,连接该逻辑单元,该算术单元用于更新该偏移量。
前述的快取存储器,其中所述的算术单元更新该偏移量包括将一由指令所定的运算元加于该偏移量,其中该指令指定该运算元加至一微处理器内的堆栈指针寄存器,而该微处理器包括该快取存储器。
前述的快取存储器,其中,如果该偏移量的更新致使该偏移量绕越该顶层的快取单位,该逻辑单元将令该后入先出存储器移出其内的该顶层。
前述的快取存储器,其中所述的最新的压入指令是指相对于储存于该后入先出存储器的多个该快取单位的数据及尚未被弹出的数据的至少一者为最新。
前述的快取存储器,其中所述的最新压入指令的该目的地址所相关的该快取单位包括一尚未自系统存储器堆栈弹出的最新压入指令的数据。
本发明的目的及解决其技术问题还采用以下的技术方案来实现。依据本发明提出的一种快取存储器(cache memory),其包括多个第一类储存元件,规划为一随机存取快取存储器(random access cache),该多个第一类储存元件用于快取非压入指令(non-push)所定的数据;多个第二类储存元件,规划为一堆栈快取存储器(stack cache),该多个第二类储存元件用于快取压入(push)指令的目的地址所相关的数据的快取单位(cache line),该堆栈快取存储器具有一顶层(top entry)用于储存最新压入指令的目的地址所相关的一快取单位;一输入单元,该输入单元用于指示一自快取存储器要求数据的指令是一指定该数据来源地址的弹出(pop)指令;以及逻辑单元,连接该输入单元及该多个第一和第二类储存元件,该逻辑单元用于回应该输入单元,并在决定该来源地址与储存在该顶层的该快取单位的地址是否匹配之前,控制该堆栈快取存储器推测性地自该顶层提供该数据至该弹出指令。
本发明的目的及解决其技术问题还采用以下的技术方案来实现。依据本发明提出的一种快取堆栈存储器(caching stack memory)数据的方法,其包括以下步骤将一压入(push)指令所定的数据及在一堆栈存储器(stack memory)内此一数据的目的地址存入快取存储器(cache memory);在该存入之后,解码一弹出(pop)指令;回应该解码,为此弹出指令产生一数据的来源地址;在该产生来源地址之后,比较来源地址与储存于此快取存储器的目的地址;以及针对该解码,不考虑该比较,提供储存于此快取存储器的数据。
本发明的目的及解决其技术问题还可采用以下技术措施进一步实现。
前述的快取堆栈存储器数据的方法,其还包括以下的步骤回应该比较,决定来源地址并不存在快取存储器;以及回应该决定,修正该数据提供。
前述的快取堆栈存储器数据的方法,其中所述的修正步骤包括自此快取存储器之外的一堆栈存储器提取来源地址所定的正确数据。
前述的快取堆栈存储器数据的方法,其中所述的修正步骤还包括在该提取之前,产生一微处理机的异常状况(exception)。
前述的快取堆栈存储器数据的方法,其中所述的快取存储器设计成具有一后入层(last-in entry)的后入先出存储器,其中该数据提供包括提供储存于快取存储器的后入层的数据。
前述的快取堆栈存储器数据的方法,其还包括如果目的地址在快取存储器失误,在该储存之前,压下此后入先出存储器。
本发明的目的及解决其技术问题还采用以下的技术方案来实现。依据本发明提出的一种自快取存储器(cache memory)推测性的提供数据给弹出(pop)指令的方法,其包括以下步骤储存压入(push)指令的目的地址所定的第一数据进入后入先出(last-in-first-out)存储器的顶层(top entry);在该储存第一数据之后,自弹出指令收到对由来源地址所定的第二数据的要求;回应该收到要求,不理会来源地址,自后入先出存储器的顶层提供第一数据;比较来源地址与目的地址;以及在该提供第一数据之后,回应该比较,决定第一数据是否即是第二数据。
本发明的目的及解决其技术问题还可采用以下技术措施进一步实现。
前述的自快取存储器推测性的提供数据给弹出指令的方法,其还包括如果来源地址与目的地址不匹配,产生一输出,其指示第一数据不是第二数据、在该产生输出之后,提供第二数据给弹出指令或执行一异常常规(exceptionroutine)以进行该提供第二数据。
前述的自快取存储器推测性的提供数据给弹出指令的方法,其还包括在不快于该提供第一数据的情况,进行虚拟至真实的分页地址翻译(pageaddress translation)以产生来源地址。
本发明的目的及解决其技术问题还采用以下的技术方案来实现。依据本发明提出的一种承载于一传播媒介的电脑数据信号,其包括电脑可读程序码(computer-readable program code),用于提供一快取存储器(cachememory),该程序码包括第一程序码,用于提供一输入,以指示一种自快取存储器读取数据的指令类型,该指令指定该数据的来源地址;第二程序码,用于提供一后入先出(last-in-first-out)存储器,该后入先出存储器连接该输入,该后入先出存储器具有多个层(entries),每一个层储存一快取单位(cache line)的数据,每一数据与一压入(push)指令相关,该多个层具有一顶层(top entry),用以储存一快取单位的数据,该数据与一最新压入指令相关,其中为回应该输出指示该指令为一弹出(pop)指令,此快取存储器自该后入先出存储器的该顶层提供数据给该弹出指令;以及第三程序码,用于提供一比较器以接受该来源地址,用以产生该来源地址与该后入先出存储器的该顶层的快取单位的地址是否匹配的指示,以决定提供给该弹出指令的该数据是否为正确数据。
本发明与现有技术相比具有明显的优点和有益效果。由以上技术方案可知,为了达到前述发明目的,本发明解决问题的技术手段的主要技术内容如下本发明的技术内容之一是提供一种自堆栈存储器快取数据的快取存储器,与其他自非堆栈存储器快取取数据的快取存储器有明显不同。其不同于现有的快取存储器使用随机存取的方式,堆栈存储器是以一种后入先出的方式(last-in-first-out LIFO)快取数据。
最新压入且没有立即被弹出的数据储存于堆栈快取的顶层。在一实施例中,堆栈快取对最新压入数据的偏移量(offset)保持追踪,而该最新压入数据是在储存于顶层的快取单位之中。
堆栈快取则是利用弹出指令与先前的压入指令通常具有关联性的特点,而进行快速推测性弹出操作。在推测压入/弹出具有关联性之下,不待计算来源地址,也不待决定来源地址是否命中堆栈快取,一弹出指令下达之后,堆栈快取立即推测性地提供储存于顶层的快取单位由偏移量(offset)所定的数据。弹出指令来源地址随后与储存于顶层的快取单位的数据的地址进行比较,以决定不正确的数据是否被推测性地提供给弹出指令。
偏移量(offset)在每一次碰到压入或弹出指令时均被更新。如果偏移量(offset)绕至下一快取单位(wrap to the next cache line),则在弹出指令下达之后,在顶层的快取单位就会被弹出位堆栈快取。如果一压入指令使偏移量(offset)绕至上一快取单位(wrap to the previous cache line),则快取单位会下移一个层,而压入的数据则被储存于新的顶层。与压入指令目地地址相关的快取单位与压入的数据一起被提取及合并。
此外,在碰到直接修改堆栈指针的指令时,例如加一数值到堆栈指针寄存器的指令,偏移量(offset)亦被修改,如果此一修改致使偏移量(offset)绕入下一快取单位(wrap to the next cache line),则堆栈快取亦会进行弹出。
此一快速弹出操作,有潜力使数据的弹出,较现有的快取快上好几个时钟周期,尤其是,提供推测性的弹出数据所需的时间,并未包括计算弹出来源地址(pop source address)所需的时间、及翻译虚拟弹出来源地址(virtual popsource address)成为实体弹出来源地址(physical pop source address)所需的时间。
此外,现有的快取进行列解码(row decode)、指针比较(tag compare)及行多路(way muxing)所需的时间,亦未被包括在提供推测性的弹出数据所需的时间。于是,在至少一个实施例中,本发明的提供弹出数据操作可以较现有的快取快上四个时钟周期。
本发明的目的在于,克服现有的快取存储器存在的缺陷,而提供一种新的装置堆栈快取存储器,所要解决的技术问题是使其能为大多数的弹出指令提供较快速的存取,从而更加适于实用。
本发明的另一目的在于,提供一种新的方法,所要解决的技术问题是提供一种快速有效存取之方式,从而更加适于实用。
经由上述可知,本发明自堆栈快取存储器进行快速推测性弹出操作的方法及装置,是公开一种微处理器的堆栈快取存储器及进行推测性快速弹出(fastspeculative pop instruction)操作的装置。此堆栈快取存储器以一种后入先出(last-in-first-out)的方式储存压入指令相关的多个快取单位(cacheline)的数据。最新的非弹出性(non-popped)压入数据储存在堆栈快取顶层(top entry)的快取单位内,一用以指定该压入数据位置的偏移量(offset)被维持着。当遭遇一使堆栈指针寄存器(stack pointer register)更新的指令时,此一偏移量亦被更新。当一弹出指令要求数据,在确定弹出指令的来源地址是否与所提供数据的地址相匹配之前,堆栈快取就推测性地自顶层提供由该偏移量所定的数据给弹出指令。如果来源地址与所提供数据的地址随后是被判定为不匹配,则进行一异常操作,以提供正确数据(资料)。
利用上述技术方案,本发明自堆栈快取存储器进行快速推测性弹出操作的方法及装置,相对于先前现有技术至少具有下列优点此一快速弹出操作,有潜力使数据的弹出,其较现有的快取快上好几个时钟周期,在至少一个实施例中,本发明的提供弹出数据操作可以较现有的快取快上四个时钟周期。
综上所述,本发明特殊的自堆栈快取存储器进行快速推测性弹出操作的微处理器及装置,能够为大多数的弹出指令提供较快速的存取,从而更加适于实用。其具有上述诸多的优点及实用价值,并在同类产品中未见有类似的结构设计及方法公开发表或使用而确属创新,其不论在结构上、方法上或功能上皆有较大的改进,在技术上有较大的进步,并产生了好用及实用的效果,且较现有的快取存储器具有增进的多项功效,从而更加适于实用,而具有产业的广泛利用价值。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并为了让本发明的上述和其他目的、特征和优点能更明显易懂,以下特举较佳实施例,并配合附图,详细说明如下。


图1是本发明导管结构化微处理器的方块图;图2是本发明图1中堆栈快取的方块图;图3是本发明图1中堆栈快取附加元件的方块图;图4是本发明图1中第一级数据快取的多路逻辑的方块图;图5是本发明自图1中堆栈快取进行快速弹出操作的流程图;图6是本发明向图1中堆栈快取进行压入操作的流程图;图7是本发明图1中微处理器回应加入堆栈指针指令的流程图;图8是本发明自图1中堆栈快取进行载入操作的流程图;图9是本发明向图1中第一级数据快取进行存入操作的流程图;图10是本发明自图1堆栈快取进行图5快速弹出操作的时序图;图11是本发明图8中自堆栈快取进行推测性载入操作的时序图;图12是本发明图8中自堆栈快取进行常规(即非推测性)载入操作的时序图;图13是本发明图8中自非堆栈快取进行载入操作的时序图;图14是本发明导管结构化微处理器的方块图;图15是本发明图14中第一级数据快取的方块图;图16是本发明自图15中数据快取进行快速弹出操作的流程图;图17是本发明向图15中数据快取进行压入操作的流程图;图18是本发明图14中微处理器回应加入堆栈指针指令的流程图;图19是本发明图16中自图15中数据快取进行快速弹出操作的时序图。
标记说明100导管结构化微处理器(pipelined microprocessor)102指令快取(instruction cache)104指令提取器(instruction fetcher)106指令翻译器(instruction translator)108指令调度器(instruction scheduler)112寄存器文件夹(register file)114执行单元(execution units)116写回站(write-back stage)118总线界面单元(bus interface unit)122非堆栈快取(non-stack cache)124堆栈快取(stack cache)126第一级数据快取(L1 data cache)128微码存储器(microcode memory)132处理器总线(processor bus)134微指令(microinstructions)136总线(bus)138总线(bus)142运算元(operand)152堆栈指针寄存器(stack pointer register)202快取单位206的快取状态(cache status of the cache line 206)204快取单位206的地址标记(address tag of the cache line 206)
206快取单位数据(cache line of data)212堆栈快取_写入_MESI信号(sc_write_MESI signal)214堆栈快取_写入_标记信号(sc_write_tag signal)216堆栈快取_写入_数据信号(sc_write_data signal)222堆栈快取_MESI信号(sc_MESI signal)224堆栈快取_标记信号(sc_tag signal)226堆栈快取_数据信号(sc_data signal)232压入_堆栈快取信号(push_sc signal)234弹出_堆栈快取信号(pop_sc signal)302控制逻辑单元(control logic)304算术单元(arithmetic unit)306地址产生器(address generator)308转换后备缓冲器(translation lookaside buffer TLB)312比较器(comparators)314比较器(comparators)3162输入-多路器(two-input multiplexer)318多路器(multiplexer)322浮点_偏移寄存器(fp_offset register)324写回快取单位缓冲器(writeback line buffer)32616输入-多路器(sixteen-input multiplexer)328写回_多路_选择信号(writeback_mux_sel signal)332运算元(operand)334虚拟地址(virtual address)336实际地址(physical address)338写回要求信号(writeback_request signal)342压入_指令信号(push_instr signal)344弹出_指令信号(pop_instr signal)346载入_指令信号(load_instr signal)348储存_指令信号(store_instr signal)352加入_堆栈指针_指令信号(add_sp_instr signal)
362虚拟地址_匹配信号(VA_match signal)364实际地址_匹配信号(PA_match signal)366非堆栈快取_命中信号(non-sc_hit signal)368控制信号(control signal)、多路选择信号(mux select signal)372算术单元304的递增值输出(output on which arithmetic unit304provides the decremented value)382加入信号(add signal)384递减信号(decrement signal)386递增信号(increment signal)388欠位信号(underflow signal)389堆栈快取_命中信号(sc_hit signal)391推测_堆栈快取_载入_多路_选择信号(spec_sc_load_mux_selsignal)392溢位信号(overflow signal)393常规_堆栈快取_载入_多路_选择信号(normal_sc_load_mux_selsignal)394加入_堆栈指针_值信号(add_sp_val signal)395L1_多路_选择信号(L1_mux_sel signal)396浮点_偏移信号(fp_offset signal)397配置_填充_缓冲器信号(llocate_fill_buffer signal)398浮点数据(fp_data)399异常信号(exception signal)4024输入-多路器(four-input multiplexer)40416输入-多路器(sixteen-input multiplexer)40616输入-多路器(sixteen-input multiplexer)40816输入-多路器(sixteen-input multiplexer)4122输入-多路器(two-input multiplexer)4222输入-多路器412输出的快取单位(cache line from the outputof two-input mult iplexer 412)42416输入-多路器404的输出数据(output of sixteen-inputmultiplexer 404)42616输入-多路器406的输出数据(output of sixteen-inputmultiplexer 406)42816输入-多路器408输出的快取单位(cache line from the outputof sixteen-input multiplexer 408)432自非堆栈快取122输出数据(output data from non-stack cache122)502解码并发交弹出指令504根据浮点_偏移寄存器的值,推测性提供在堆栈快取顶层快取单位的数据506递增浮点_偏移信号508决定浮点_偏移寄存器是否溢位512将顶层弹出堆栈快取514计算弹出指令的来源虚拟地址516转换后备缓冲器产生弹出指令的来源实际地址518比较实际地址及顶层实际堆栈快取_标记522决定实际地址是否命中堆栈快取的顶层524异常处理器使正确的数据供应给弹出指令602解码及发交压入指令604递减浮点_偏移信号606计算压入指令的目的虚拟地址608转换后备缓冲器产生压入指令的目的实际地址612比较实际地址及顶层实际堆栈快取_标记614决定实际地址是否命中堆栈快取的顶层616压入数据被存入堆栈快取的顶层618决定堆栈快取的底层是否有效622对堆栈快取底层的写回进行调度624压入数据、标记及状态存入堆栈快取的顶层626配置填充缓冲器为相关的快取单位在堆栈快取建立所有权628相关快取单位与压入数据合并进入堆栈快取顶层
702解码及发交加入堆栈指针指令704加入_堆栈指针_值加入浮点_偏移706决定浮点_偏移寄存器是否溢位708弹出堆栈快取顶层并进行有效快取单位写回调度802解码及发交载入指令804计算来源虚拟地址806比较虚拟地址及堆栈快取前两个层的虚拟疊快取_标记808决定虚拟地址是否命中堆栈快取的前两个层812自有效匹配的堆栈快取层推测性地提供数据814转换后备缓冲器产生载入指令来源实际地址816比较实际地址与有效匹配的堆栈快取层的实际堆栈快取_标记818决定实际地址否命中推测性提供载入数据的堆栈快取层822异常处理器使正确的数据提供给载入指令824转换后备缓冲器产生载入指令的来源实际地址826比较在实际地址与堆栈快取每一实际堆栈快取_标记828决定实际地址是否命中堆栈快取832自有效匹配的堆栈快取层提供数据834进行列解码并在非堆栈快取选择列或行组836比较实际地址指针与在非堆栈快取所选行组的每一行实际地址指针838决定载入实际地址是否命中非堆栈快取842自有效匹配的非堆栈快取层提供数据844在非堆栈快取配置层846提取失误快取单位进入配置的非堆栈快取层848自非堆栈快取提供数据902解码及发交储存指令904计算储存指令的目的虚拟地址906转换后备缓冲器产生储存指令的目的实际地址908比较实际地址及堆栈快取所有层的实际堆栈快取_标记912决定实际地址是否命中堆栈快取914向有效匹配的堆栈快取层储存数据
916比较实际地址指针与在非堆栈快取选择的每一行的实际地址指针918决定储存指令的目的实际地址是否命中非堆栈快取?922向有效匹配的非堆栈快取层储存数据924在非堆栈快取配置层926提取失误快取单位进入配置的非堆栈快取层928向非堆栈快取储存数据1400导管结构化微处理器(pipelined microprocessor)1402数据快取(data cache)1502控制逻辑单元(control logic)1504储存单元阵列(storage element array)1506列解码器(row decoder)1508检查逻辑单元(check logic)15122输入-多路器(two-input multiplexer)1514顶层(top entry)1516浮点_列堆栈(fp_row stack)1524行选择产生器(way select generator)15262输入-多路器(two-input multiplexer)15284输入-多路器(four-input multiplexer)1532顶层(top entry)1534浮点_行堆栈(fp_way stack)1542读取[N-10]信号(read[N-10]signal)1544浮点_检查信号(fp_check signal)1546实际地址336的地址标记部份(address tag portion of physicaladdress 336)1548索引(index)1552列信号(row signal)1554新_列信号(new_row signal)1556浮点_列(fp_row)1558弹出_列信号(pop_row signal)1562压入_列信号(push_row signal)
1564快速_弹出信号(fast_pop signal)1572快取_命中信号(cache_hit signal)1574地址标记(address tag)1576有效位(valid bit)1578常规_行_选择信号(normal_way_select signal)1582新_行信号(new_way signal)1584浮点_行(fp_way)1586弹出_行信号(pop_way signal)1588压入_行信号(push_way signal)1592多路器1528的输出信号(signal on which multiplexer selectsone of the cache lines to output)1594由真值读取[N-10]信号1542所定的列的内容(contents of therow specified by the true read[N-10]signal 1542)1596控制信号(control input)、多路选择信号(mux select signal)1602解码及发交弹出指令1604推测性地提供由浮点_列、浮点_行及浮点_偏移寄存器的值所定的数据1606递增浮点_偏移信号1608决定递增操作是否导致浮点_偏移寄存器溢位1612将顶层弹出浮点_列堆栈;将顶层弹出浮点_列堆栈1614计算弹出指令的来源虚拟地址1616转换后备缓冲器产生弹出指令的来源实际地址1618比较实际地址与由浮点_列及浮点_行所选择层的地址标记;比较实际地址与由浮点_列所提供的列的地址标记1622决定弹出指令的来源实际地址是否命中储存单元阵列1624异常处理器使正确的数据供应给弹出指令1702解码及发交压入指令1704递减浮点_偏移信号1706决定递减是否导致浮点_偏移寄存器欠位1708决定压入指令的目的实际地址是否命中储存单元阵列
1712以常规来处理命中数据快取的压入指令1714异常处理器更新浮点_列堆栈及浮点_行堆栈1716决定压入指令的目的实际地址是否命中储存单元阵列1718决定命中储存单元阵列的列及行1722压入命中的列到浮点_列堆栈;压入命中的行到浮点_行堆栈1724以常规来处理命中数据快取的压入指令1726决定所选择的列中的被取代的行1728压入取代的列到浮点_列堆栈;压入取代的行到浮点_行堆栈1732以常规来处理在数据快取失误的压入指令1802解码及发交加入堆栈指针指令1804加入_堆栈指针_值加入浮点_偏移1806决定加入操作是否导致浮点_偏移寄存器溢位1808将顶层弹出浮点_列堆栈;将顶层弹出浮点_行堆栈具体实施方式
为更进一步阐述本发明为达成预定发明目的所采取的技术手段及其功效,以下结合附图及较佳实施例,对依据本发明提出的自堆栈快取存储器进行快速推测性弹出操作的方法及装置其具体实施方式
、结构、方法、特征及其功效,详细说明如后。
一般而言,程序将系统存储器分成两区堆栈区及非堆栈区,非堆栈区又常被称为堆积区。堆栈与堆积的主要差别是堆积以随机的方式存取,堆栈通常以后入先出(last-in-first-out LIFO)的方式存取。
另一个堆栈与堆积差别是读取或写入存储器的指令指定读取或写入地址的方式。读取或写入堆积的指令以显式技巧指定存储地址。相反的,读取或写入堆栈的指令,通常通过微处理器内一特殊的寄存器--一种称之为堆栈指针寄存器,以隐式技巧指定存储地址。
一压入指令,依照要压入堆栈的数据量大小,更新堆栈指针寄存器,然后将数据,自微处理器内的一寄存器,存入更新过的堆栈指针寄存器所定的地址。例如,在X86的架构内,一压入指令(如压入(PUSH)、呼叫(CALL)或执行(ENTER)指令),依要压入数据量大小(例如,如果数据是一双字,则为四个字节),递减(decrement)堆栈指针寄存器,然后依更新过的堆栈指针寄存器所定的地址,将数据存入堆栈。
相反地,一弹出指令,依照存于堆栈指针寄存器的地址,读取数据,然后将数据载入微处理器内的一寄存器,然后依被弹出堆栈的数据量大小,更新堆栈指针寄存器。例如,在X86的架构内,一弹出指令(如弹出(POP)、返回(RET)或离开(LEAVE)指令)依被弹出数据量大小的递增(increment)堆栈指针寄存器。
于是,依其后入先出(LIFO)的特性,当数据被压入堆栈,堆栈往上增加(即往降低存储器地址的方向),相对地,当数据被弹出堆栈,堆栈向下缩减(即往增加存储器地址的方向)。于是,此一存于堆栈指针寄存器的数值被称为堆栈的顶部。
堆栈是一种方便配置存储器空间的机构。在典型的程序中,堆栈的主要用途之一是将副常规参数随同呼求常规的返回地址压回堆栈。通过将返回地址弹出堆栈且进入微处理器程序计数器,被呼求的副常规回到呼求常规,然后呼求常规将参数弹出堆栈,并使堆栈回复到呼求前状态。这些概念具有一个非常有用的特色那就是使巢状的副常规呼求容易进行。
在此所述的快速弹出是利用下述的事实通常在压入及弹出指令之间有一对一的关系,即被弹出堆栈的数据通常也就是先前被压入堆栈的数据。
在本发明中,一弹出指令是指将数据自存储器移至微处理器的指令(例如进入位于微处理器寄存器文件夹中的寄存器),同时,此一指令以隐式技巧而非显式技巧指定数据的存储器位置,弹出数据的存储器位置的地址,是隐含性地基于储存于微处理器堆栈指针寄存器的一数值。例如,在X86架构中的处理器中,弹出指令为弹出(POP)、返回(RET)及离开(LEAVE)指令,其来源运算元由一堆栈指针寄存器的值以隐式技巧指定,而其目的运算元指定一微处理器寄存器文件夹的寄存器。
在本发明中,一载入指令是一种将数据自存储器移至微处理器的指令(例如进入位于微处理器寄存器文件夹中的寄存器)的非弹出指令,载入指令以显式技巧指定来源数据的存储器地址,或至少以显式技巧指定一寄存器或一组寄存器,该一寄存器或一组寄存器指定来源数据存储器地址。例如,在X86架构中的处理器中,载入指令为移动(MOV)指令,其来源运算元指定存储器位置,而其目的运算元指定一微处理器寄存器文件夹的寄存器。
在本发明中,一压入指令是一种将数据自微处理器移至存储器的指令(例如自位于微处理器寄存器文件夹中的寄存器),而数据存储器位置是隐式技巧而非显式技巧指定,压入数据的存储器位置的地址,是隐含性地基于储存于微处理器堆栈指针寄存器的一数值。例如,在X86架构中的处理器中,压入指令为压入(PUSH)、呼叫(CALL)及输入(ENTER)指令,其目的运算元由一堆栈指针寄存器的值以隐式技巧指定,而其来源运算元指定一微处理器寄存器文件夹的寄存器。
在本发明中,一储存指令是一种将数据自微处理器移至存储器的指令(例如自位于微处理器寄存器文件夹中的寄存器移至存储器)的非压入指令,储存指令以显式技巧指定目的数据的存储器地址,或至少以显式技巧指定一寄存器或一组寄存器,该一寄存器或一组寄存器指定目的数据存储器地址。例如,在X86架构中的处理器中,储存指令为移动(MOV)指令,其其来源运算元指定一微处理器寄存器文件夹的寄存器,而目的运算元指定存储器位置。
请参阅图1所示,是本发明导管结构化微处理器100的方块图,在一实施例中,微处理器100包括一种其指令集合基本上符合X86架构指令集合的微处理器,且该指令集合在更特别包括弹出(POP)、压入(PUSH)、呼叫(CALL)、返回(RET)、执行(ENTER)及离开(LEAVE)指令,此外该指令集合且还包括自存储器载入数据及储存数据入存储器的指令,如X86的移动MOV指令。然而本发明并未限制只使用于X86架构微处理器或X86的指令集合。
微处理器100包括一寄存器文件夹112,该寄存器文件夹112包括多个寄存器,用于储存运算元及微处理器的状态数据(资料)。在一实施例中,该寄存器文件夹112包括一般寄存器、地址节段寄存器、索引寄存器、状态及控制寄存器,以及指令指针/或程序计数器寄存器。在一实施例中,寄存器文件夹112包括至少一X86架构微处理器使用者可见的寄存器集合。该寄存器文件夹112更特别包括一堆栈指针寄存器152,该堆栈指针寄存器152储存系统存储器的堆栈顶部地址。在一实施例中,该堆栈指针寄存器152基本上相似于X86的ESP寄存器。
微处理器100包括一指令快取102,用于对含有指令字节的快取单位进行快取。在一实施例中,指令快取102包括一第一级快取(L1 cache)。指令快取102自连接微处理器100的系统存储器提取指令,例如压入及弹出指令。压入及弹出指令,根据储存在堆栈指针寄存器152的堆栈顶部地址,以隐式技巧存取一在系统存储器的堆栈。
微处理器100亦包括一总线(即汇流排,以下均称为总线)界面单元118,其连接指令快取102。总线界面单元118亦经由处理器总线132将微处理器100连接至系统存储器。总线界面单元118转介微处理器100内的各种功能性的单元至处理器总线132。例如,总线界面单元118自系统存储器提取指令至指令快取102。此外,总线界面单元118将数据写入和读出系统存储器,例如,将数据写入和读出系统存储器的堆栈,而该堆栈的顶部则由堆栈指针寄存器152所定。
微处理器100亦包括一指令提取器104,其连接指令快取102。指令提取器104自指令快取102提取指令。指令提取器104依照由位在寄存器文件夹112的指令指针寄存器,依序提取次一指令,除非碰到由程序所控制的改变,例如,当有分支指令(转移指令)时,指令提取器104开始提取位于分支指令的标的地址的指令,或当有异常时,指令提取器104开始提取异常处理常规的指令。
微处理器100亦包括一微码存储器128,其连接指令提取器104。微码存储器128储存将被指令提取器104提取的指令。微码存储器128更特别包括异常处理常规的指令,而该异常处理常规的指令用于处理由微处理器100产生的异常状况。如下所述,在一实施例中,为回应检测到不正确的提供推测性弹出或载入数据(资料),微处理器100产生一个异常状况,用于修正微处理器100有关堆栈存取的状态。
微处理器100亦包括一指令翻译器106,其连接指令提取器104。指令翻译器106接收来自指令提取器104的指令,如压入及弹出指令,将指令解码,翻译成供微处理器100导管结构其余部份执行的微指令。在一实施例中,微处理器100导管结构其余部份包括用以执行微指令的一精简指令集合电脑的核心(RISC core)。在一实施例中,指令翻译器106为每一指令产生一指示信号(indicator),用于指示用来翻译成微指令的宏指令是否为压入(push)、弹出(pop)、载入(load),或储存(store)指令之一。
微处理器100亦包括一指令调度器108,其连接指令翻译器106。指令调度器108接收指令翻译器106所译的微指令134并分发给执行单元114。
该执行单元114自指令调度器108接收微指令134,及自寄存器文件夹112接收运算元142,如压入指令数据,或堆栈指针寄存器152的值并执行微指令134。在一实施例中,执行单元114包括一整数单元、一浮点单元、一多媒体延伸指令集(MMX)单元、一多数据流式扩展(SSE)单元、一分支单元、一载入单元以及一储存单元。该载入单元执行自系统存储器将数据戴入微处理器100的指令,包括弹出指令。该储存单元执行自微处理器100将数据存入系统存储器的指令,包括压入指令。
微处理器100亦包括一写回站116,其连接执行单元114。写回站116接收执行单元114执行指令的结果,并将此结果,如弹出指令数据,写回寄存器文件夹112。
微处理器100亦包括一数据快取126,经由总线136连接总线界面单元118,并经由总线138连接执行单元114。在一实施例中,该数据快取126为第一级数据快取(L1 data cache)。该数据快取126包括一堆栈快取124及一非堆栈快取122。总线界面单元118自系统存储器提取数据入数据快取126,且自数据快取126将数据写回系统存储器。持别的是总线界面单元118自堆栈快取124及非堆栈快取122,将快取单位写回系统存储器;自系统存储器读取快取单位,以写入堆栈快取124及非堆栈快取122的配置层。更持别的是总线界面单元118在系统存储器堆栈及堆栈快取124之间传递由压入及弹出指令所定的数据。
在一实施例中,非堆栈快取122实质上包括一现有第一级数据快取(L1data cache),即非堆栈快取122包括使随机分布系统存储器地址存取时间一致的现有第一级数据快取。在一实施例中,该非堆栈快取122包括一4-行组(4-way set)关联性快取。然而,储存单元区分压入及非压入指令的数据,以决定要存入堆栈快取124或非堆栈快取122。储存单元将压入指令的数据存入堆栈快取124而不是非堆栈快取122;而将非压入指令的数据,即储存指令的数据,存入非堆栈快取122。在此方面,非堆栈快取122不同于现有的快取。堆栈快取124将参考图2而详细说明如下。
在一实施例中,微处理器100亦包括一第二级快取(L2 cache),其支援第一级指令快取102(L1 instruction cache)及第一级数据快取126(L1 datacache)。持别是该第二级快取(L2 cache)扮演牺牲者快取的角色,用于容纳被逐出数据快取126(堆栈快取124或非堆栈快取122)的快取单位,而数据快取126则填满来自第二级快取的快取单位。
请参阅图2所示,是本发明图1中堆栈快取124的方块图。该堆栈快取124包括多个储存单位,其被规划为一堆栈或后入先出存储器。堆栈快取124为一堆栈或后入先出存储器的事实不可与系统存储器中的堆栈相混淆,其顶部是由堆栈指针寄存器152的数值所定。再者,堆栈快取124快取系统存储器堆栈的数据。
图2所示的实施例包括16个储存单位或层,编号为0至15。其顶层编号为0,而底层编号为15,然而本发明并不限制一特定号码使用于堆栈快取124。每一层包括储存空间使用于一快取单位数据206、一快取单位206的地址标记204以及一快取单位206的快取状态202。在一实施例中,该快取状态202包括的状态值基本上符合熟知的MESI(Modified,Exclusive,Shared,Invalid)快取一致性状态值。在一实施例中,一快取单位206包括64字节的数据。在一实施例中,地址标记204包括快取单位206的实际地址。
在一实施例中,地址标记204包括快取单位206实际地址的上部显著位(the upper significant bits),其是用于单独识别快取单位206。在一实施例中,微处理器100包括一存储器分页系统,其是用于将虚拟存储器地址翻译成实际地址,且地址标记204亦包括快取单位206虚拟地址。在一实施例中,虚拟地址包括虚拟地址位的片段,用以降低储存虚拟地址的空间。下面详细描述使用地址标记204的虚拟地址部份从堆栈快取124进行推测性载入。
通过堆栈快取_写入_MESI信号212(sc_write_MESI signal),堆栈快取124接受一新的快取状态以存入顶层MESI区域202;通过堆栈快取_写入_标记信号214(sc_write_tag signal),堆栈快取124接受一新的标记以存入顶层标记区域204;通过堆栈快取_写入_数据信号216(sc_write_data signal),堆栈快取124接受一新的快取单位以存入顶层数据区域206。
堆栈快取124亦自图3中的控制逻辑单元302,接受一压入_堆栈快取信号232(push_sc signal)。当控制逻辑单元302确定一压入_堆栈快取信号232为真,堆栈快取124会下移一个层,即,底层会移出堆栈快取124,且其他层接受正在其上的层内的值,而堆栈快取_写入_MESI信号212(sc_write_MESI)、堆栈快取_写入_标记信号214(sc_write_tag)、堆栈快取_写入_数据信号216(sc_write_data)上的值,则被写入堆栈快取124的顶层。在一实施例中,堆栈快取124的快取单位206上的每一双字可以经由堆栈快取_写入_数据信号216(sc_write_data signal)个别地被写入。在一实施例中,一个双字(或double-word)包括4个字节。堆栈快取124的快取单位206上的每一字(2个字节)或每一字节可以经由堆栈快取_写入_数据信号216(sc_write_data signal)个别地被写入,亦在其他实施例中预期被使用。
堆栈快取124,通过一堆栈快取_MESI[150]信号222(sc_MESI[150]signal),提供MESI状态202给十六个层中的每一个;堆栈快取124,通过一堆栈快取_标记[150]信号224(sc_tag[150]signal),提供地址标记204给十六个层中的每一个;堆栈快取124,通过一堆栈快取_数据[150]信号226(sc_data[150]signal),提供快取单位数据206给十六个层中的每一个。顶层快取单位数据206由堆栈快取_数据226
信号(sc_data
)提供,顶层的次一层的快取单位数据206由堆栈快取_数据[1]信号226(sc_data[1])提供,依此类推,底层的快取单位数据206由堆栈快取_数据[15]信号226(sc_data[15])提供。地址标记204及MESI状态202亦由类似方式提供。
堆栈快取124亦自图3中的控制逻辑单元302,接受一弹出_堆栈快取信号234(pop_sc signal)。当控制逻辑单元302确定一弹出_堆栈快取信号234(pop_sc signal)为真,堆栈快取124会上移一个层,即,顶层会移出堆栈快取124,且其他层接受正在其下的层内的值。在一实施例中,当一层自堆栈快取124中被弹出,即,当弹出_堆栈快取信号234(pop_sc signal)为真,堆栈快取124的底层的MESI状态202的值被更新为无效(Invalid);所有堆栈快取124的层的MESI状态202的值被均被初始化为无效(Invalid)。
请参阅图3所示,是本发明图1中堆栈快取124附加元件的方块图,堆栈快取124包括控制逻辑单元302。
该控制逻辑单元302,自图1执行单元114中的储存单元,接受一压入指令信号342(push_instr signal)。当压入_指令信号342(push_instrsignal)为真,表示储存单元正在要求储存数据(资料)进入图1中的数据快取126,以回应接受来自图1中的指令调度器108的压入指令。
控制逻辑单元302,亦自图1执行单元114中的载入单元,接受一弹出指令信号344(pop_instr signal)。当弹出_指令信号344(pop_instr signal)为真,表示载入单元正在要求自图1中的数据快取126载入数据(资料),以回应接受来自图1中的指令调度器108的弹出指令。
控制逻辑单元302,亦自图1执行单元114中的载入单元,接受一载入_指令信号346(load_instr signal)。当载入_指令信号346(load_instrsignal)为真,表示载入单元正在要求自图1中的数据快取126载入数据(资料),以回应接受来自图1中的指令调度器108的载入指令。
控制逻辑单元302,亦自图1执行单元114中的储存单元,接受一储存_指令信号348(store_instr signal)。当储存_指令信号348(store_instrsignal)为真,表示储存单元正在要求储存数据(资料)进入图1中的数据快取126,以回应接受来自图1中的指令调度器108的储存指令。
控制逻辑单元302,亦自图1执行单元114中的整数单元,接受一加入_堆栈指针_指令信号352(add_sp_instr signal)。当加入_堆栈指针_指令信号352(add_sp_instr signal)为真,表示整数单元正在通知数据快取126自指令调度器108接收到一加入堆栈指针的指令,如X86的ADD指令。在一实施例中,加入宏指令是加入一立即值至堆栈指针寄存器,例如ADD、ESP指令。
堆栈快取124亦包括一地址产生器306。地址产生器306接受来自图1中的寄存器文件夹112的运算元,如基底值(base values)、偏移量(offsets)及存储器描述器的值(memory descriptor values),并根据所接受的值,产生一虚拟地址334。该虚拟地址334是一对存储器进行存取的指令的虚拟存储器地址,如压入(push)、弹出(pop)、载入(load)或储存(store)指令。在载入(load)指令的情形,虚拟地址334是虚拟的载入数据的来源地址。在储存(store)指令的情形,虚拟地址334是虚拟的储存数据的目的地址。在弹出(pop)指令的情形,虚拟地址334是虚拟的弹出数据的来源地址。在压入(push)指令的情形,虚拟地址334是虚拟的压入数据的目的地址。在一实施例中,地址产生器306被包括于每一载入及储存单元之中。
堆栈快取124亦包括一转换后备缓冲器308(translation lookasidebuffer TLB),其连接地址产生器306。TLB308快取分页表的信息,其用于将虚拟地址334翻译成实际地址336。在一实施例中,TLB308只翻译实际地址336的上面部份,实际地址336的下面部份则与虚拟地址334相对的下面部份相同。在一实施例中,一最小的分页大小(page size)只有4KB,因此实际地址336的下面部份的12个位就没被翻译。
堆栈快取124亦包括二比较器312,其连接地址产生器306。每个比较器3上2均接收虚拟地址334。其中一比较器312接收图2中堆栈快取_标记
信号224(sc_tag
signal)的虚拟地址部份,另一比较器312接收堆栈快取_标记[1]信号224(sc_tag[1]signal)的虚拟地址部份。即,两个比较器312分别接收,堆栈快取124前两个层地址标记204的虚拟地址部份,然后各别比较虚拟堆栈快取_标记224(virtual sc_tag)与虚拟地址334。如果虚拟堆栈快取_标记
224(virtual sc_tag
)与虚拟地址334相匹配,则第一个比较器312在虚拟地址_匹配
信号362(VA_match
signal)上产生一真值,此一真值提供给该控制逻辑单元302。同理,如果虚拟堆栈快取_标记[1]224(virtual sc_tag[1])与虚拟地址334相匹配,则第二个比较器312在虚拟地址_匹配[1]的信号362(VA_match[1]signal)上产生一真值,此一真值亦是提供给控制逻辑单元302。控制逻辑单元302亦自堆栈快取124接受图2中堆栈快取_MESI[150]信号222(sc_MESI[150]signal)。控制逻辑单元302利用虚拟地址_匹配[10]信号362(VA_match[10]signal)及堆栈快取_MESI[10]信号222(sc_MESI[10]signal),以决定虚拟地址334是否命中堆栈快取124前两个层之一,以便自堆栈快取124进行推测性载入,如下所述。即,控制逻辑单元302利用虚拟地址_匹配[10]的信号362(VA_match[10]signal)及堆栈快取_MESI[10]信号222(sc_MESI[10]signal),以决定虚拟地址334是否与虚拟堆栈快取_标记[10]224(virtualsc_tag[10])的虚拟地址之一相匹配。在一地址标记204(tag)为一虚拟地址位的杂凑的实施例中,虚拟地址334在供应给比较器312之前被杂凑(hashed)。
需要加以阐明的是虽然核对堆栈快取124前两个层,以决定是否自堆栈快取124进行推测性载入,已在一图3的实施例中加以描述,核对较前两个更多的层,或只有核对最前面一个层,在其他实施例中亦被预期被使用。被核对的数据(资料)项目越多,检测到可以进行快速载入的机会也越大。快取单位的尺寸越大,需要被核对的层就越少。图3的实施例所提供的为核对128个字节。
堆栈快取124亦包括十六个比较器314,其连接TLB 308。每一个该比较器314均接收实际地址336。各别比较器314亦分别接收各自相关的堆栈快取_标记[150]信号224(sc_tag[150]signal),即,各别比较器314分别接收各自相关的地址标记204上的实际地址部份,而该地址标记204是在各自相关的堆栈快取_标记[150]信号224(sc_tag[150]signal)上,并将其与实际地址336比较。如果实际堆栈快取_标记
224(sc_tag
)与实际地址336相匹配,则第一比较器314会产生一真值于实际地址_匹配
信号364(PA_match
signal)之上,而实际地址_匹配
信号364则提供给控制逻辑单元302;如果实际堆栈快取_标记[1]224(sc_tag[1])与实际地址336相匹配,则第二比较器314会产生一真值于实际地址_匹配[1]的信号364(PA_match[1]signal)之上,而实际地址_匹配[1]的信号364则提供给控制逻辑单元302;并依此类推于十六个比较器314中的每一个。控制逻辑单元302使用实际地址_匹配[150]信号364(PA_match[150]signal)及快取_MESI[150]信号222(sc_MESI[150]signal)以决定实际地址336是否命中堆栈快取124的层之一,以便自堆栈快取124进行载入,并决定推测性弹出或载入是否正确地提供数据,如详述于下者。即,控制逻辑单元302使用实际地址_匹配[150]信号364(PA_match[150]signal)及堆栈快取_MESI[150]信号222(sc_MESI[150]signal)以决定实际地址336是否与堆栈快取_标记[150]224(sc_tag[150])之一的定实际地址部份相匹配。
控制逻辑单元302并产生一堆栈快取_命中信号389(sc_hit signal),其被供应给执行单元114的载入及储存单元,其是用于显示与弹出、压入或储存指令相关的快取单位,至少推测性地存在于堆栈快取124。在弹出指令的例子,控制逻辑单元302,在证实弹出指令来源地址命中堆栈快取124之前,推测性地产生一真值给堆栈快取_命中信号389(sc_hit signal)以回应弹出指令信号344上的一真值,如下列参照图5所示者。在压入指令的例子,如果堆栈快取_MESI[150]信号222(sc_MESI[150]signal)及实际地址_匹配[150]信号364(PA_match[150]signal)显示实际地址336与一堆栈快取124的有效实际地址标记相匹配,或堆栈快取124配置实际地址336相关的快取单位,则控制逻辑单元302产生一真值给堆栈快取_命中信号389(sc_hitsignal),如下列参照图6所示者。在载入指令的例子,如果堆栈快取_MESI[10]信号222(sc_MESI[10]signal)及虚拟地址_匹配[10]的信号362(VA_match[10]signal)显示虚拟地址334与堆栈快取124上部层的有效虚拟地址标记之一相匹配,则控制逻辑单元302推测性地产生一真值给堆栈快取_命中信号389(sc_hit signal);或如果堆栈快取_MESI[150]信号222(sc_MESI[150]signal)及实际地址_匹配[150]信号364(PA_match[150]signal)显示实际地址336与一堆栈快取124的有效实际地址标记相匹配,则控制逻辑单元302非推测性地产生一真值给堆栈快取_命中信号389(sc_hitsignal),如下列参照图8所示者。在储存指令的例子,如果堆栈快取_MESI[150]信号222(sc_MESI[150]signal)及实际地址_匹配[150]信号364(PA_match[150]signal)显示实际地址336与一堆栈快取124的有效实际地址标记相匹配,则控制逻辑单元302产生一真值给堆栈快取_命中信号389(sc_hit signal),如图9所示。
控制逻辑单元302亦自图1中非堆栈快取122接受一非堆栈快取_命中信号366(non-sc_hit signal)。如果实际地址336命中非堆栈快取122,则非堆栈快取_命中信号366(non-sc_hit signal)为真。控制逻辑单元302亦产生压入_堆栈快取信号232(push_sc signal)及弹出_堆栈快取信号234(pop_scsignal),其操作过程将说明如下。
堆栈快取124,亦包括一个浮点_偏移寄存器322(fp_offset register),该连接控制逻辑单元302,其用于储存一个称之为浮点_偏移的值。寄存器322以浮点_偏移信号396(fp_offset signal)输出其值,浮点_偏移信号396(fp_offset signal)提供给控制逻辑单元302。浮点_偏移寄存器322(fp_offset register)的值用于自堆栈快取124进行快速弹出操作,如下所述。如详细研究下列诸图可知,尤其是图5至图7的流程图,浮点_偏移寄存器322(fp_offset register)指定最新压入指令数据在快取单位中的位置,该快取单位是储存于堆栈快取124的顶层。即,浮点_偏移寄存器322(fp_offset register)指定尚未被弹出的存储器堆栈的最新压入指令数据的位置。在一实施例中,浮点_偏移寄存器322(fp_offset register)包括一4位的值,其用于指定快取单位206中16个双字之一的偏移量,该快取单位是储存于堆栈快取124的顶层。控制逻辑单元302监控弹出、压入及加入堆栈指针的指令,以为堆栈指针寄存器152(stack pointer register)的改变做准备,并使浮点_偏移寄存器322的值与堆栈指针寄存器152中的位[52]保持一致。在一实施例中,当执行单位114中的载入、储存或整数单位指示弹出、压入或加入堆栈指针的指令已发出,控制逻辑单元302就更新浮点_偏移寄存器322。在一实施例中,不待写回站116更新堆栈指针寄存器152,控制逻辑单元302就更新浮点_偏移寄存器322。藉此,压入之后的弹出指令、加入堆栈指针指令或其他弹出指令,可使用堆栈指针寄存器152中的期待值,而无庸伫候写回站116更新堆栈指针寄存器152,然后再自堆栈指针寄存器152取得位[52]。
堆栈快取124亦包括一具有16个输入的多路器318,连接浮点_偏移寄存器322(fp_offset register)。在一实施例中,多路器318包括16个输入,每一个接受堆栈快取_数据
信号226(sc_data
signal)16个双字中的一个。多路器318接受浮点_偏移信号396(fp_offset signal)做为一输入选择信号(as a select input),以选择堆栈快取_数据
信号226(sc_data
signal)16个双字中的一个,并在进行快速弹出操作时,输出一浮点数据398(fp_data)给弹出指令,如说明于以下者。
堆栈快取124亦包括一算术单元304(arithmetic unit),连接控制逻辑单元302,并接受浮点_偏移信号396(fp_offset signal)。
算术单元304(arithmetic unit)亦自控制逻辑单元302接受一递减信号384(decrement signal)。如果控制逻辑单元302在递减信号384上产生一真值,则算术单元304递减自浮点_偏移信号396(fp_offset signal)接受的值,并提供此递减后的值给一输出372(output)。如果此递减操作造成一欠位(underflow),则算术单元304在欠位信号388(underflow signal)产生一真值,欠位信号388提供给控制逻辑单元302。
算术单元304(arithmetic unit)亦自控制逻辑单元302接受一递增信号386(increment signal)。如果控制逻辑单元302在递增信号386上产生一真值,则算术单元304递增自浮点_偏移信号396(fp_offset signal)接受的值,并提供此递增后的值给一输出372(output)。如果此递增操作造成一溢位(overflow),则算术单元304在溢位信号392(overflow signal)产生一真值,溢位信号392提供给控制逻辑单元302。
算术单元304(arithmetic unit)亦自控制逻辑单元302接受一加入信号382(add signal)。如果控制逻辑单元302在加入信号382上产生一真值,则算术单元304加入自浮点_偏移信号396(fp_offset signal)接受的值,至自加入_堆栈指针_值信号394(add_sp_val signal)接受的值,并提供此加入后的值给一输出372(output)。如果此加入造成一溢位(overflow),则算术单元304在溢位信号392(overflow signal)产生一真值。在一实施例中,加入_堆栈指针_值信号394(add_sp_val signal)是由图1中执行单元114(execution units)的整数单位所提供。提供给加入_堆栈指针_值信号394(add_sp_val signal)的值是由一指令所定,该指令加入一值给堆栈指针寄存器152(stack pointer register)。
堆栈快取124亦包括一个2输入-多路器316(two-input multiplexer),连接浮点_偏移寄存器322(fp_offset register)。2输入-多路器316的输出连接浮点_偏移寄存器322(fp_offset register)的输入。2输入-多路器316自一输入接受算术单元304的输出372。2输入-多路器316自其另一输入接受堆栈指针寄存器152(stack pointer register)输出中的位[52]。2输入-多路器316自控制逻辑单元302接受一控制信号368(control signal),以选择其输入之一,其将用于输出至浮点_偏移寄存器322。
堆栈快取124亦包括一个16输入-多路器326(sixteen-inputmultiplexer),连接控制逻辑单元302。16个输入中的每一个接受堆栈快取124上十六个快取单位206中相关的一个,其由十六个相关的堆栈快取_数据[150]信号226(sc_data[150]signal)所提供。16输入-多路器326选择十六个堆栈快取_数据[150]信号226中的一个,其由控制逻辑单元302产生的写回_多路_选择信号328(writeback_mux_sel signal)所决定。16输入-多路器326的输出被当成写回快取单位缓冲器324(writeback linebuffer)的输入。写回快取单位缓冲器324的输出经由总线136送至图1中总线界面单元118。控制逻辑单元302亦产生一写回要求信号338(writeback_request signal),其亦送至总线界面单元118。写回快取单位缓冲器324及写回要求信号338是用来自堆栈快取124将快取单位写回系统存储器,其如下所述。
控制逻辑单元302亦产生一真值给配置_填充_缓冲器信号397(allocate_fill_buffer signal),以配置一填充缓冲器,以提取快取单位进入系统存储器,或自,微处理器100的其他快取存储器如堆栈快取124或L2快取,提取快取单位,其如下所述。
控制逻辑单元302亦产生一真值给异常信号399(exception signal),以指示一异常状况已发生,且使微处理器100分支至微码存储器128中的异常处理器,其如以下所述。
控制逻辑单元302亦产生推测_堆栈快取_载入_多路_选择信号391(spec_sc_load_mux_sel signal)、常规_堆栈快取_载入_多路_选择信号393(normal_sc_load_mux_sel signal)及L1_多路_选择信号395(L1_mux_sel signal),其将说明于下,尤其是与图4有关者。
请参阅图4所示,是本发明图1中第一级数据快取126多路逻辑的方块图,该第一级数据快取126包括一4输入-多路器402(four-input multiplexer),其输出提供给图1中总线138,尤其,以输出138提供弹出及载入数据给图1执行单元114中的载入单元。
多路器402的第一个输入是接受图1中非堆栈快取122的输出数据432,以提供自非堆栈快取122进行载入的数据。多路器402的第二个输入是接受16输入-多路器404(sixteen-input multiplexer)的输出数据424,以提供自堆栈快取124进行推测性载入的数据。多路器402的第三个输入是接受第二16输入-多路器406(sixteen-input multiplexer)的输出数据426,以提供自堆栈快取124进行常规或非推测性载入的数据。多路器402的第四个输入是接受图3中浮点数据398,以提供数据给快速弹出操作。
多路器404自2输入-多路器412(two-input multiplexer)的输出接受一快取单位422的十六个双字。多路器404,根据图3实际地址336中的位[52]的输入选择信号(select input),选择快取单位422的十六个双字之一。
多路器406自16输入-多路器408(sixteen-input multiplexer)的输出接受一快取单位428的十六个双字。多路器406,根据实际地址336中的位[52]的输入选择信号(select input),选择快取单位428的十六个双字之一。
2输入-多路器412,通过堆栈快取_数据[10]信号226(sc_data[10]signal),自堆栈快取124前两个层,接受二快取单位的数据。通过根据图3推测_堆栈快取_载入_多路_选择信号391(spec_sc_load_mux_sel signal),2输入-多路器412选择堆栈快取_数据[10]信号226二快取单位之一,以用于输出信号422,而推测_堆栈快取_载入_多路_选择信号391是控制逻辑单元302根据载入_指令信号346(load_instr signal)、虚拟地址_匹配[10]信号362(VA_match[10]signal)及堆栈快取_MESI[10]信号222(sc_MESI[10]signal)的值而定,其如下述。
16输入-多路器408,通过堆栈快取_数据[150]信号226(sc_data[150]signal),其十六个输入各别自堆栈快取124的十六个层,接受十六个快取单位的数据。通过根据图3常规_堆栈快取_载入_多路_选择信号393(normal_sc_load_mux_sel signal),16输入-多路器408选择堆栈快取_数据[150]信号226十六快取单位之一,以用于输出信号428,而常规_堆栈快取_载入_多路_选择信号393是控制逻辑单元302根据载入_指令信号346(load_instr signal)、实际地址_匹配[150]信号364(PA_match[150]signal)及堆栈快取_MESI[150]信号222(sc_MESI[150]signal)的值而定,其如下述。
请参阅图5所示,是本发明自图1中堆栈快取124进行快速弹出操作的流程图,流程是从方块502开始。
在方块502,图1中指令翻译器106(instruction translator)解码一弹出指令,且图1中指令调度器108(instruction scheduler)将此弹出指令发交图1中执行单元114(execution units)的载入单元。载入单元则产生一真值给图3中弹出_指令信号344(pop_instr signal)。然后,流程进行至方块504。
在方块504,根据一现存于浮点_偏移寄存器322(fp_offset register)的值,多路器318自堆栈快取_数据
信号226(sc_data
signal)的快取单位选择适当的双字,并提供给浮点数据398(fp_data),该快取单位在堆栈快取124的顶层。回应弹出_指令信号344的真值,控制逻辑单元302产生一值给图3中L1_多路_选择信号395(L1_mux_sel signal),使图4中多路器402选择输入的浮点数据398(fp_data),并经由总线138提供给执行单元114(execution units)的载入单元,再提供给弹出指令,写回站116(write-back stage)再将其载入弹出指令指定的图1中寄存器文件夹112(register file)中的一个寄存器。
例如,如果此弹出指令是一X86的RET指令,则弹出数据被载入寄存器文件夹112中的指令指针寄存器。例如,如果此弹出指令是一X86的LEAVE指令,则弹出数据被载入寄存器文件夹112中的EBP。例如,如果此弹出指令是一X86的POP指令,则弹出数据被载入弹出指令指定的图1中寄存器文件夹112(register file)中的一个寄存器。如同在图5中所见,数据是被推测性地载入载入单位。此一操作之所以为推测性是因为弹出指令的来源地址与提供给载入单元的数据地址是否相同尚未被确认,而该数据来自堆栈快取124顶层,在方块516,弹出指令的来源地址其后将产生于实际地址336(physicaladdress)上。同时为了回应弹出_指令信号344的真值,控制逻辑单元302产生一真值给图3中堆栈快取_命中信号389(sc_hit signal),其被提供给执行单元114(execution units)的载入单元。然后,流程进行至方块506。
在方块506,控制逻辑单元302产生一真值给递增信号386(incrementsignal),算术单元304反应性地递增浮点_偏移信号396(fp_offset signal),并提供此一递增值给输出372,而控制逻辑单元302使多路器316经由控制信号368进行选择,以载入图3中浮点_偏移寄存器322(fp_offset register)。然后,流程进行至决定方块508。
在决定方块508,控制逻辑单元302检查溢位信号392(overflow signal),以决定在方块506进行的递增操作是否导致浮点_偏移寄存器322溢位。即,控制逻辑单元302决定弹出指令是否导致堆栈指针寄存器152绕入次一快取单位(wrap to the next cache line)。如是,则流程进行至方块512,如否,则流程进行至方块514。
在方块512,控制逻辑单元302产生一真值给弹出_堆栈快取信号234(pop_sc signal),以将顶层弹出堆栈快取124。既然,顶层快取单位的最后一个双字已被弹出指令弹出系统存储器堆栈,顶层被弹出堆栈快取124是为使堆栈快取124与系统存储器快取保持一致。在一实施例中,直到下述方块518已被执行,才执行方块514,以使实际地址336(physical address)能够与堆栈快取_标记
224(sc_tag
signal)的值进行比较,该堆栈快取_标记
224是属于在方块504中提供数据的层。在一实施例中,在方块504中使用的堆栈快取_标记
224被保留下来,在其后的方块518中使用。虽然在一实施例中,浮点_偏移寄存器322(fp_offset register)被维持为一双字偏移(dword offset)以供应双字压入及弹出指令,其他的实施例提供其他压入及弹出数据的大小,例如字组(words),字节组(bytes),或四字组(quadwords)亦被考虑使用。然后,流程进行至方块514。
在方块514,地址产生器306(address generator)计算弹出指令的来源虚拟地址334(virtual address)。然后,流程进行至方块516。
在方块516,转换后备缓冲器308(translation lookaside buffer TLB)产生弹出指令的来源实际地址336(physical address)。然后,流程进行至方块518。
在方块518,图3中其中一个比较器314比较在方块516产生的实际地址336及图2中实际堆栈快取_标记
224,以产生图3中实际地址_匹配
信号364(PA_match
signal)。然后,流程进行至方块522。
在决定方块522,控制逻辑单元302检查图2中堆栈快取_MESI
信号222(sc_MESI
signal)及图3中实际地址_匹配
信号364(PA_match
signal)以决定堆栈快取124的顶层是否有效,以及决定弹出指令的来源实际地址336(physical address)与堆栈快取124的顶层的地址标记204(addresstag)是否匹配,即,实际地址336是否命中堆栈快取124的顶层。在一实施例中,实际地址336的位[52]亦与浮点_偏移396(fp_offset)的值做比较,浮点_偏移396是用于选择浮点数据398(fp_data)提供的双字,以验证正确的双字有被提供。如果弹出指令的来源实际地址336命中堆栈快取124的顶层,则流程结束,即,推测性快速弹出操作提供了正确的弹出数据。如否,则流程进行至方块524。
在方块524,控制逻辑单元302产生一真值给异常信号399(exceptionsignal),使微处理器100分支至异常处理器,以处理推测性快速弹出操作提供不正确的弹出数据的情况。在一实施例中,异常处理器清除(flushes)堆栈快取124,并将堆栈指针寄存器152的位[52]的现时值载入浮点_偏移寄存器322(fp_offset register)。异常处理器使正确的数据供应给弹出指令。在一实施例中,清除(flushes)堆栈快取124包括将堆栈快取124的任何有效的快取单位写回系统存储器或L2快取。然后,流程在方块524结束。
如同前述所见,以及如同参阅图10将详述于下者,图5的快速弹出操作使弹出数据提供至弹出指令的速度较现有的快取存储器有快上几个时钟周期的潜力,现有的快取存储器并未在弹出指令及载入指令间做区分。
请参阅图6所示,是本发明向图1中堆栈快取124进行压入操作的流程图,流程从方块602开始。
在方块602,图1中指令翻译器106(instruction translator)解码一压入指令,且图1中指令调度器108(instruction scheduler)将此压入指令发交图1中执行单元114(execution units)的储存单元。储存单元则产生一真值给图3中压入_指令信号342(push_instr signal)。然后,流程进行至方块604。
在方块604,控制逻辑单元302产生一真值给递减信号384(decrementsignal),算术单元304反应性地递减浮点_偏移信号396(fp_offset signal),并提供此一递减值给输出372,而控制逻辑单元302使多路器316经由控制信号368进行选择,以载入图3中浮点_偏移寄存器322(fp_offset register)。此外,回应压入_指令信号342的真值,控制逻辑单元302产生一真值给堆栈快取_命中信号389(sc_hit signal),其被提供给执行单元114(executionunits)的储存单元。然后,流程进行至方块606。
在方块606,地址产生器306(address generator)计算压入指令的目的虚拟地址334(virtual address)。然后,流程进行至方块608。
在方块608,转换后备缓冲器308(translation lookaside buffer TLB)产生压入指令的目的实际地址336(physical address)。然后,流程进行至方块612。
在方块612,图3中,其中一个比较器314比较在方块608产生的实际地址336及图2中实际堆栈快取_标记
224,以产生图3中实际地址_匹配
信号364(PA_match
signal)。然后,流程进行至方块614。
在决定方块614,控制逻辑单元302检查图2中堆栈快取_MESI
信号222(sc_MESI
signal)及图3中实际地址_匹配
信号364(PA_match
signal)以决定堆栈快取124的顶层是否有效,以及决定压入指令的目的实际地址336(physical address)与堆栈快取124的顶层的实际地址标记204(address tag)是否匹配,即,实际地址336是否命中堆栈快取124的顶层。如是,则流程进行至方块616。如否,则流程进行至决定方块618。在一实施例中,如果实际地址336命中顶层之外的其他层,则在有效层被写回系统存储器之后,堆栈快取124被清除,然后,流程进行至方块616。
在方块616,经由堆栈快取_写入_数据信号216(sc_write_data signal)进入实际地址336的地址位[52]所指示的快取单位数据206的双字偏移,压入数据被存入堆栈快取124的顶层。如果需要,经由堆栈快取_写入_MESI信号212(sc_write_MESI signal),顶层MESI状态202将被更新,例如一修正(Modified)的值。压入数据自压入指令所定的寄存器文件夹112的寄存器被取出。例如,如果此压入指令为X86的CALL指令,则压入数据为自寄存器文件夹112的指令指针寄存器计算而来的次一顺序的指令指针。例如,如果此压入指令为X86的ENTER指令,则压入数据为寄存器文件夹112的EBP寄存器的值。例如,如果此压入指令为X86的压入(PUSH)指令,则压入数据为压入指令所定的寄存器文件夹112的寄存器。然后,流程在方块616结束。
在决定方块618,既然压入数据的目的实际地址336在堆栈快取124失误,一个新的层,即,堆栈快取124的顶层,必需为压入的目的实际地址336相关的快取单位而配置。既然堆栈快取124要下移,为新的快取单位配置顶层,底层必须被移出堆栈快取124。所以,控制逻辑单元302就检查堆栈快取_MESI[150]信号222,以决定堆栈快取124的底层是否有效。如是,则流程进行至方块622;如否,则流程进行至方块624。
在方块622,控制逻辑单元302对堆栈快取124的底层的写回进行调度,通过在写回_多路_选择信号328(writeback_mux_sel signal)产生一数值,使多路器326选择堆栈快取_数据[15]信号226,即,堆栈快取124的底层的快取单位,以提供写回快取单位缓冲器324(writeback line buffer),然后,产生一真值给写回要求信号338(writeback_request signal),要求总线界面单元118将此快取单位写回L2快取的系统存储器。然后,流程进行至方块624。
在方块624,控制逻辑单元302确立压入_堆栈快取信号232(push_scsignal),将堆栈快取124下移一个层,并通过堆栈快取_写入_数据信号216(sc_write_data signal)、堆栈快取_写入_标记信号214(sc_write_tagsignal)及堆栈快取-_写入_MESI信号212(sc_write_MESI signal)各别地将压入数据、其标记及MESI状态存入堆栈快取124。然后,流程进行至方块626。
在方块626,控制逻辑单元302配置一填充缓冲器(fill buffer),用以为压入指令目的地址336相关的快取单位在堆栈快取124建立所有权,并提取相关的快取单位进入。在一实施例中,如果相关的快取单位出现于其他的两个存储器,则方块626包括窥察非堆栈快取122及L2快取,并自非堆栈快取122或L2快取取得相关的快取单位。然后,流程进行至方块628。
在方块628,相关的快取单位被接收进入在方块626配置的填充缓冲器(fill buffer),快取单位的数据与在方块624被存入的压入数据合并进入堆栈快取124的顶层。于是流程在方块628结束。
请参阅图7所示,是本发明图1中微处理器100回应加入堆栈指针指令的操作流程图。如前所述,快速弹出操作是利用此一事实大部份运作良好的程序,在压入指令与弹出指令之间,有一对一对应的关系。即,每一压入指令终将跟随着一相对的弹出指令。然而此一规则至少有一值得注意的异常状况,即关于副常规参数的传递,其将参照X86指令被加以描述。
例如,在C语言,功能参数在系统存储器堆栈传递。一系列的压入(PUSH)指令,一指令对一参数,用于将这些参数压入堆栈。例如,在呼叫一功能之前,且该功能接受五个4字节参数(4-byte parameters),此呼叫功能执行五个压入(PUSH)指令,以将该五个参数压入堆栈。然后,此呼叫功能执行一CALL指令,将返回地址(return address)压入堆栈,并传递控制到副常规。副常规执行的最后一个指令是一RET指令,其将返回地址弹出堆栈。呼叫副常规必需要求收回被这些参数占据的堆栈空间。选择之一为执行五个POP指令,以将堆栈指针值回复到这些参数被压入堆栈之前。然而,既然呼叫功能不需要这些参数,大多数的编译器(compiler)只是执行一ADD指令,以增加这些参数占据空间的大小给堆栈指针。即,与其执行五个POP指令,编译器产生一较快且较小的ADD指令。在上述例子,呼叫副常规将加入20到堆栈指针。这是使压入指令与弹出指令无法匹配的最常见的程序。于是,在一实施例中,快速弹出装置解码一指令,该指令加入一值于堆栈指针并相应地更新浮点_偏移寄存器322(fp_offset register)。图7流程从方块702开始。
在方块702,图1中指令翻译器106(instruction translator)解码一加入指令,该加入指令的目的地为堆栈指针寄存器152,且图1中指令调度器108(instruction scheduler)将此加入指令发交图1中执行单元114(execution units)的整数单元。该整数单元则产生一真值给图3中加入_堆栈指针_指令信号352(add_sp_instr signal)。然后,流程进行至方块704。
在方块704,控制逻辑单元302产生一真值给加入信号382(add signal),算术单元304反应性地加入加入_堆栈指针_值394(add_sp_val)给浮点_偏移396(fp_offset),并提供此一和值给输出372,而控制逻辑单元302使多路器316经由控制信号368进行选择,以载入图3中浮点_偏移寄存器322(fp_offset register)。然后,流程进行至方块706。
在决定方块706,控制逻辑单元302检查溢位信号392(overflow signal),以决定在方块704进行的加入操作是否导致浮点_偏移寄存器322溢位。即,控制逻辑单元302决定加入指令是否导致堆栈指针(stack pointer)152绕至另一快取单位。在方块706,一溢位状况为此一加入致使堆栈指针152(stack pointer)不再参考储存于堆栈快取124顶层的快取单位。尢其是,如果此一加入导致溢位,堆栈指针152典型地参考一快取单位,其存储器地址紧邻并大于储存于堆栈快取124顶层快取单位的存储器地址。于是,为使正确的快取单位能出现在顶层,堆栈快取124必须进行弹出。在一实施例中,控制逻辑单元302提供一加入给溢位超过一快取单位的堆栈指针152。在此一实施例中,在下述方块708中自堆栈快取124被弹出的层数目N,在假设快取单位的大小为64字节时,可计算如下 如果N大于1,就发生了溢位状况。如果发生了溢位状况,则流程进行至方块708,否则流程结束。
在方块708,控制逻辑单元302产生一真值给弹出_堆栈快取信号234(pop_sc signal),以弹出堆栈快取124顶层。控制逻辑单元302决定储存于堆栈快取124顶层的快取单位是否有效,如果是,则进行将此有效快取单位写回系统存储器或L2快取的调度,其类似于图6中的方块622写回底层。如在方块706所讨论,在一实施例中,N被计算出来,且N个层自堆栈快取124被弹出,在此N个层的有效快取单位被写回。然后,流程在方块708结束。
请参阅图8所示,是本发明自图1中堆栈快取124进行载入操作的流程图。图8包括图8A、图8B及图8C,而统称为图8。图8A说明自图1中堆栈快取124进行推测性载入操作;图8B说明自堆栈快取124进行常规载入操作;图8C说明自图1中非堆栈快取122进行载入操作。流程自方块802开始。
在典型的程序中,系统存储器堆栈的另一个主要用途是在堆栈为副常规的局部变数配置空间。通过局部变数配置空间量递减堆栈指针,副常规在堆栈配置空间。然后,通过一堆栈指针偏移所计算出的地址,载入指令对局部变数进行存取。于是,此载入数据有很大的机会与最新压入数据是在同一个快取单位。另外,此亦具高度可能性即副常规执行载入指令以存取呼叫常规为其压入堆栈的参数。压入的参数亦有高度的可能性跨越两个快取单位,即,如参阅图6中方块618至方块628所述者,此压入指令导致绕入下一快取单位。因此,某些参数将会在堆栈快取124顶层的次一层的快取单位中,或甚在次一层的再次一层中。于是,在一实施例中,自堆栈快取124进行推测性载入操作,利用上述事实,并检查载入数据是否出现于前两个层。通过直接检查前两个层,可以避免现有快取存储器的列解码(row decode)操作,藉此很有潜力可节省一个时钟周期。
另外,在一实施例中,通过使用载入指令虚拟地址334(virtual address)而非实际地址336(physical address)进行指针(tag)比较以得知载入数据是否出现于前两个层,此推测性载入操作很有潜力可以节省另一个时钟周期。如果虚拟地址与前两个层之一匹配,纵然由于虚拟别名之故,并非完全确定,载入数据是很有可能出现在此命中的层。在一微处理器100的实施例中,堆栈快取124推测性地提供不正确的数据给推测性载入操作的原因是操作中的系统工作切换,会更新存储器分页信息,因而导致错误的虚拟地址匹配。在一实施例中,特别是在使用堆栈地址区段寄存器(stack address segmentregister)的微处理器100中,如在X86架构中的SS寄存器,堆栈快取124推测性地提供不正确的数据给推测性载入操作的原因是堆栈地址区段寄存器的更新,影响有效的地址计算,因此很有可能导致错误的虚拟地址匹配。
虽然,图8描述的是堆栈快取124的前两个层,以进行推测性载入操作的候选者而被检查,本发明的推测性载入操作并不限制被检查的堆栈快取124上面层于一特定数目;推测性载入操作检查各种数目的堆栈快取124层,在其他各种本发明的实施例中亦被考虑。
在方块802,图1中指令翻译器106(instruction translator)解码一载入指令,且图1中指令调度器108(instruction scheduler)将此载入指令发交图1中执行单元114(execution units)的载入单元。载入单元则产生一真值给图3中载入_指令信号346(load_instr signal)。然后,流程进行至方块804。
在方块804,地址产生器306(address generator)计算载入指令的来源虚拟地址334(virtual address)。然后,流程进行至方块806。
在方块806,图3中两个比较器312比较在方块804产生的虚拟地址334及图2中虚拟疊快取_标记[10]224,以产生图3中虚拟地址_匹配[10]信号362(VA_match[10]signal)。然后,流程进行至决定方块808。
在决定方块808,控制逻辑单元302检查图2中堆栈快取_MESI[10]信号222(sc_MESI[10]signal)及图3中虚拟地址_匹配[10]信号362(VA_match[10]signal)以决定堆栈快取124的前两个层是否有效,以及决定载入指令的来源虚拟地址334(virtual address)与堆栈快取124的前两个层地址标记204(address tag)的虚拟部份是否匹配,即,虚拟地址334是否命中堆栈快取124的前两个层。如是,则流程进行至方块812。如否,则流程进行至第八B图的方块824。
在方块812,为回应载入_指令信号346(load_instr signal)上的真值,控制逻辑单元302产生一值给推测_堆栈快取_载入_多路_选择信号391(spec_sc_load_mux_sel signal),使多路器412选择二快取单位堆栈快取_数据[10]信号226(sc_data[10]signal)的两者之一,以提供图4信号422,以得到与载入指令来源虚拟地址334匹配的一有效虚拟地址标记204,堆栈快取_数据[10]信号226是在决定方块808决定。此外,多路器404自快取单位422,选择一双字以提供图4信号424,该双字是由实际地址[52]336所定。而且,控制逻辑单元302产生一值给L1_多路_选择信号395(L1_mux selsignal),使图4多路器402选择输入数据424(对402而言是输入),经由总线138供应执行单元114上的载入单元,载入单元再提供予载入指令,写回站116再将之载入图1中由载入指令所定的寄存器文件夹112中的寄存器之一。如图8A所见,数据是推测性地提供给载入单元。此一操作所以是推测性是因为载入指令来源实际地址与载入数据的地址是否相同尚未被确认,载入指令来源实际地址随后将产生在方块814中的实际地址336上,而载入数据则由堆栈快取124的前两个层之一提供给载入单元。为回应在方块808检测到虚拟地址334命中堆栈快取124的前两个层,控制逻辑单元302产生一真值给堆栈快取_命中信号389(sc_hit signal),堆栈快取_命中信号389则提供给执行单元114上的载入单元。然后,流程进行至方块814。
在方块814,转换后备缓冲器308(TLB)产生载入指令来源实际地址336。然后,流程进行至方块816。
在方块816,两个图3比较器314比较在方块814产生的实际地址336与实际堆栈快取_标记[10]224(sc_tag[10]),以产生对应的图3实际地址_匹配[10]信号364(PA_match[10]signal),在方块812,载入数据是由实际堆栈快取_标记[10]224进行推测性提供。然后,流程进行至决定方块818。
在决定方块818,控制逻辑单元302检查实际地址_匹配[10]信号364,以决定载入指令来源实际地址336与此层实际地址标记204是否匹配,此实际地址_匹配[10]信号364是与推测性提供载入数据的堆栈快取124层相关;即,检查实际地址336是否命中此层。如果,载入指令来源实际地址336命中此推测的层,则流程结束,即,推测性的载入操作提供正确的弹出数据。否则,流程进行至方块822。
在方块822,控制逻辑单元302产生一真值给异常信号399(exceptionsignal),使微处理器100分支至异常处理器,以处理推测性载入操作提供不正确的载入数据的情况。异常处理器使正确的数据提供给载入指令。在一实施例中,异常处理器自非堆栈快取122或系统存储器或L2快取载入数据。然后,流程在方块822结束。
如同所见,且如同参阅图11详述于下者,图8A中本发明自堆栈快取124进行推测性载入操作,使提供载入数据给载入指令有潜力较现有的快取存储器快上数个时钟周期。
在图8B方块824,转换后备缓冲器308(TLB)产生载入指令的来源实际地址336。然后,流程进行至方块826。
在方块826,图3的比较器314比较在方块824产生的实际地址336与堆栈快取124十六层的每一实际堆栈快取_标记[150]224(sc_tag[150]),以产生实际地址_匹配[150]信号364(PA_match[150]signal)。然后,流程进行至决定方块828。
在决定方块828,控制逻辑单元302检查堆栈快取_MESI[150]信号222(sc_MESI[150]signal)及实际地址_匹配[150]信号364(PA_match[150]signal)以决定任意一个堆栈快取124层是否有效,及决定载入指令的来源实际地址336与堆栈快取124有效层的实际地址标记204(address tag)是否匹配,即,实际地址336是否命中堆栈快取124。如果载入指令的来源地址336命中堆栈快取124,则流程进行至方块832。如否,则流程进行至图8C的方块834。
在方块832,为回应载入_指令信号346(load_instr signal)上的真值,和为回应在堆栈快取124前两个层失误的虚拟地址334,以及为回应载入指令的来源实际地址336命中堆栈快取124,控制逻辑单元302产生一值给常规_堆栈快取_载入_多路_选择信号393(normal_sc_load_mux_sel signal),使多路器408选择十六个快取单位堆栈快取_数据[150]信号226之一,以提供予图4信号428,以得到与载入指令来源实际地址336匹配的一有效实际地址标记204,堆栈快取_数据[150]信号226是在决定方块828决定。此外,多路器406自快取单位428,选择一双字以提供图4信号426,该双字是由实际地址[52]336所定。而且,控制逻辑单元302产生一值给L1_多路_选择信号395(L1_mux_sel signal),使多路器402选择输入数据426(对402而言是输入),经由总线138供应执行单元114上的载入单元,载入单元再提供予载入指令,写回站116再将之载入图1中由载入指令所定的寄存器文件夹112中的寄存器之一。为回应在方块828检测到来源实际地址336命中堆栈快取124,控制逻辑单元302产生一真值给堆栈快取_命中信号389(sc_hitsignal),堆栈快取_命中信号389则提供给执行单元114上的载入单元。然后,流程在方块832结束。
如同所见,且如同参照图12详论于下者,第八B图中的自堆栈快取124进行常规载入操作,使提供载入数据给载入指令有潜力较现有快取存储器,如非堆栈快取122,快上至少一个时钟周期。
在图8C的方块834,非堆栈快取122接受在图8B的方块824产生的实际地址336的索引(index)部份,并反应性地进行此索引的列解码(row decode),以在非堆栈快取122中选择一列或一行组。然后,流程进行至方块836。
在方块836,非堆栈快取122比较在方块824产生的实际地址336的上面或指针(tag)部份与在方块834选择的每一个行的实际地址指针(physicaladdress tag)。然后,流程进行至决定方块838。
在决定方块838,非堆栈快取122检查方块836的比较结果及选择的行的有效位,以决定载入实际地址336是否命中非堆栈快取122。如是,则流程进行至方块842;如否,则流程进行至方块844。
在方块842,非堆栈快取122自实际地址336命中的非堆栈快取122层提供数据。然后,流程在方块842结束。
在方块844,为回应在决定方块838的决定载入实际地址336在非堆栈快取122失误,非堆栈快取122配置一层以载入与载入指令实际地址336相关的失误快取单位。然后,流程进行至方块846。
在方块846,非堆栈快取122自系统存储器或L2快取提取失误快取单位,进入在方块846配置的非堆栈快取122层。然后,流程进行至方块848。
在方块848,非堆栈快取122自在方块846提取的快取单位提供载入数据。然后,流程在方块848结束。
在一实施例中,在图8C的方块834至方块848是依现有的快取技术进行,即,图8C是在描述自现有的非堆栈快取122进行现有的载入操作,而该载入操作是在载入地址336于堆栈快取124失误时进行。
请参阅图9所示,是本发明向图1中L1快取126进行储存操作的流程图。流程从方块902开始。
在方块902,图1中指令翻译器106(instruction translator)解码一储存指令,且图1中指令调度器108(instruction scheduler)将此储存指令发交图1中执行单元114(execution units)的载入单元。储存单元则产生一真值给图3中储存_指令信号348(store_instr signal)。然后,流程进行至方块904。
在方块904,地址产生器306(address generator)计算储存指令的目的虚拟地址334(virtual address)。然后,流程进行至方块906。
在方块906,转换后备缓冲器308(TLB)产生储存指令的目的实际地址336。然后,流程进行至方块908。
在方块908,图3比较器314比较在方块906产生的实际地址336及堆栈快取124十六个层的实际堆栈快取_标记[150]224,以产生实际地址_匹配[150]信号364(PA_match[150]signal)。然后,流程进行至决定方块912。在决定方块912,控制逻辑单元302检查堆栈快取_MESI[150]信号222(sc_MESI[150]signal)及实际地址_匹配[150]信号364(PA_match[150]signal),以决定任意一个堆栈快取124层是否有效,及决定储存指令的目的实际地址336与堆栈快取124有效层的实际地址标记204(address tag)是否匹配,即,实际地址336是否命中堆栈快取124。如果储存指令的目的地址336命中堆栈快取124,则流程进行至方块914。如否,则流程进行至方块916。在方块914,经由堆栈快取_写入_数据信号216(sc_write_data signal)进入实际地址336的地址位[52]所指示的快取单位数据206的双字偏移,储存数据被存入在方块912决定的堆栈快取124的有效匹配层。如果需要,经由堆栈快取_写入_MESI信号212(sc_write_MESI signal),顶层MESI状态202将被更新,例如一修正(Modified)的值。储存数据自储存指令所定的寄存器或存储器位置被取出。例如,如果此储存指令为X86的移动(MOV)指令,此一MOV指令指定一通用寄存器为储存数据的来源,则储存数据是在寄存器文件夹112的一寄存器中,其被移动(MOV)指令定为来源运算元。为回应在方块912检测到实际地址336命中堆栈快取124,控制逻辑单元302产生一真值给堆栈快取_命中信号389(sc_hit signal),堆栈快取_命中信号389则提供给执行单元114上的储存单元。然后,流程在方块914结束。
在方块916,在方块906产生的实际地址336的的指针(tag)部份与每一个行的实际地址指针(physical address tag)比较,该组的行是由实际地址336的索引(index)部分自非堆栈快取122选出。然后,流程进行至决定方块918。
在决定方块918,控制逻辑单元302检查非堆栈快取_命中信号366(non-sc_hit signal),以决定储存指令的目的实际地址336是否命中非堆栈快取122。如是,则流程进行至方块922;如否,则流程进行至方块924。
在方块922,储存数据被存入有效匹配的行,该行属于在决定方块918决定的非堆栈快取122的行组。然后,流程在方块922结束。
在方块924,为回应在决定方块918的决定储存实际地址336在非堆栈快取122失误,非堆栈快取122配置一层以储存与储存指令实际地址336相关的失误快取单位。然后,流程进行至方块926。
在方块926,非堆栈快取122自系统存储器或L2快取提取失误快取单位,进入在方块924配置的非堆栈快取122层。然后,流程进行至方块928。
在方块928,非堆栈快取122向在方块926提取的快取单位存入储存数据。然后,流程在方块928结束。
在一实施例中,在图9的方块902至方块906以及方块916至方块928是依现有的快取技术进行,即,图9的方块902至方块906以及方块916至方块928是在描述自现有的非堆栈快取122进行现有的储存操作,而该储存操作是在储存地址336在堆栈快取124失误时进行。
请参阅图10所示,是本发明自图1堆栈快取124进行图5快速弹出操作的时序图,图10包括编号1到4的四个直栏,与微处理器100的四个时钟周期相对应。图10亦包括有五个横列,各自被标注以代表微处理器100的不同的动作或结果。图10由直栏与横列所定的方格为空白,或内含“弹出(pop)”,用以显示在微处理器100导管结构进行时,弹出指令的位置。
在时钟周期1,根据图10第一横列及图5的方块502,图1中执行单元114(execution units)的载入单元产生一真值给图3弹出_指令信号344(pop_instr signal),为弹出指令要求弹出数据。
在时钟周期2,根据图10第二横列及图5的方块504,堆栈快取124自浮点_偏移信号396(fp_offset signal)所定的顶层快取单位,提供数据给弹出指令。尤其是,多路器318自堆栈快取_数据
信号226(sc_data
signal)提供的十六个双字,选择一双字浮点数据(fp_data)398,且多路器402选择此一浮点数据(fp_data)398输入,堆栈快取_数据
信号226来自堆栈快取124顶层。此外,堆栈快取124在堆栈快取_命中信号389(sc_hitsignal)向载入单元显示弹出指令的命中,即,堆栈快取124向载入单元显示弹出数据出现于堆栈快取124。如同之前参阅图5所讨论者,堆栈快取_命中信号389的命中提示是推测性的,因为弹出指令的来源地址与弹出数据的地址是否相同尚未被验证,弹出数据来自堆栈快取124顶层,而弹出指令的来源地址将于时钟周期3产生。在一实施例中,堆栈快取_命中信号389(sc_hitsignal)向载入单元显示弹出指令的命中由堆栈快取_MESI
222(sc_MESI
)有效位把关,所以,堆栈快取124不会向载入单元显示弹出指令的命中,除非堆栈快取124顶层是有效的,即,纵然,在预示弹出命中前,控制逻辑单元302并未证实地址匹配,但它的确验证了堆栈快取124顶层是有效的。
在时钟周期2,根据图10第三横列及图5的方块514,地址产生器306计算虚拟地址334。
在时钟周期3,根据图10第四横列及图5的方块516,转换后备缓冲器308(TLB)产生弹出指令的来源实际地址336。
在时钟周期4,根据图10第五横列及图5的方块518方块524,控制逻辑单元302检测到堆栈快取124提供不正确的弹出数据。
如比较图10及将说明于下的图13所见,快速弹出操作使L1数据快取有潜力使提供数据给弹出指令较现有快取快上数个时钟周期,现有的快取并未在弹出指令及载入指令间做区分。
在一实施例中,实际地址336的位[52]使用于选择双字,而非浮点_偏移信号396(fp_offset signal),同时数据的提供是在时钟周期3,而非在时钟周期2。
请参阅图11所示,是本发明从图8堆栈快取124进行推测性载入操作的时序图,图11包括编号1到4的四个直栏,与微处理器100的四个时钟周期相对应。图11亦包括六个横列,各自被标注以代表微处理器100的不同的动作或结果。图11由直栏与横列所定的方格为空白,或内含“load”,用以显示在微处理器100导管结构进行时,载入指令的位置。
在时钟周期1,根据图11第一横列及图8的方块802,图1中执行单元114(execution units)的载入单元产生一真值给图3载入_指令信号346(load_instr signal),为载入指令要求载入数据。
在时钟周期2,根据图11第二横列及图8的方块804,地址产生器306计算虚拟地址334。
在时钟周期3,根据图11第三横列及图8的方块806,图3比较器312进行虚拟地址标记比较,以产生图3虚拟地址_匹配[10]信号362(VA_match[10]signal)。此外,依图8的方块812,根据虚拟地址_匹配[10]信号362及图2的堆栈快取_MESI[10]信号222(sc_MESI[10]signal),控制逻辑单元302产生图3推测_堆栈快取_载入_多路_选择信号391(spec_sc_load_mux_sel signal)。此外,堆栈快取124在堆栈快取_命中信号389(sc_hit signal)向载入单元显示载入指令的命中,即,堆栈快取124向载入单元显示载入数据出现于堆栈快取124。如同之前参阅图8所讨论者,命中提示是推测性的,因为载入指令的来源实际地址336与载入数据的地址是否相同尚未被验证,载入指令的来源实际地址336将在时钟周期3产生,而载入数据于时钟周期4自堆栈快取124提供给载入单元。
在时钟周期3,根据图11第四横列及图8方块814,转换后备缓冲器308(TLB)产生弹出指令的来源实际地址336。
在时钟周期4,根据图11第五横列及图8的方块812,载入数据提供给载入单元。特别是,根据推测_堆栈快取_载入_多路_选择信号391(spec_sc_load_mux_sel signal),多路器412选择两个快取单位堆栈快取_数据[10]信号226中的一个;根据实际地址[52]336,多路器404选择一适当的双字,而多路器402选择输入424。
在时钟周期4,根据图11第六横列及图8的方块816至方块822,控制逻辑单元302检测到堆栈快取124提供不正确的载入数据。
如比较图11及将说明于下的图13所见,推测性载入操作使L1数据快取126有潜力使提供数据给载入指令较现有的快取快上数个时钟周期。
请参阅图12所示,是本发明从图8堆栈快取124进行常规--即非推测性载入操作的时序图,图12包括编号1到5的五个直栏,与微处理器100的五个时钟周期相对应。图12亦包括五个横列,各自被标注以代表微处理器100的不同的动作或结果。图12由直栏与横列所定的方格为空白,或内含“载入(load)”,用以显示在微处理器100导管结构进行时,载入指令的位置。
在时钟周期1,根据图12第一横列及图8的方块802,图1中执行单元114(execution units)的载入单元产生一真值给图3载入_指令信号346(load_instr signal),为载入指令要求载入数据。
在时钟周期2,根据图12第二横列及图8的方块804,地址产生器306计算虚拟地址334。
在时钟周期3,根据图12第三横列及图8的方块824,转换后备缓冲器308(TLB)产生弹出指令的来源实际地址336。
在时钟周期4,根据图12第四横列及图8d方块826,图3比较器314进行实际地址标记比较,以产生图3实际地址_匹配[150]信号364(PA_match[150]signal)。此外,依图8的方块832,根据实际地址_匹配[150]信号364及图2堆栈快取_MESI[150]信号222(sc_MESI[10]signal),控制逻辑单元302产生图3常规_堆栈快取_载入_多路_选择信号393(normal_sc_load_mux_sel signal)。此外,依图8的方块832,堆栈快取124在堆栈快取_命中信号389(sc_hit signal)向载入单元显示载入指令的命中。
在时钟周期5,根据图12第五横列及图8的方块832,载入数据提供给载入单元。特别是,根据常规_堆栈快取_载入_多路_选择信号393,多路器408选择十六个快取单位堆栈快取_数据[150]信号226中的一个;根据实际地址[52]336,多路器406选择一适当的双字,而多路器402选择输入424。
如比较图12及将说明于下的图13所见,常规载入操作使L1数据快取126有潜力使提供数据给载入指令较现有快取快。
请参阅图13所示,是本发明从图8非堆栈快取122进行载入操作的时序图,图13包括编号1到6的五个直栏,与微处理器100的六个时钟周期相对应。图13亦包括六个横列,各自被标注以代表微处理器100的不同的动作或结果。图13由直栏与横列所定的方格为空白,或内含“load”,用以显示在微处理器100导管结构进行时,载入指令的位置。
在时钟周期1,根据图13第一横列及图8的方块802,图1中执行单元114(execution units)的载入单元产生一真值给图3载入_指令信号346(load_instr signal),为载入指令要求载入数据。
在时钟周期2,根据图13第二横列及图8的方块804,地址产生器306计算虚拟地址334。
在时钟周期3,根据图13第三横列及图8的方块824,转换后备缓冲器308(TLB)产生弹出指令的来源实际地址336。
在时钟周期4,根据图13第四横列,根据实际地址336的索引部份,非堆栈快取122进行现有的列解码,并自每一个行读取数据,而行在列解码结果所定的集合内。
在时钟周期5,根据图13第五横列,非堆栈快取122进行实际地址336标记部份与所选集合的每一行的地址标记的比较。根据地址标记比较的结果及每一行的有效位,非堆栈快取122产生行选择信号,以选择有效匹配的行。
在时钟周期6,根据图13第六横列,非堆栈快取122多路出(muxes out)行选择信号所定的快取单位,并根据实际地址336下部位,多路出(muxes out)所选择的快取单位适当的双字。
相较于上述图10至图13的时序图,其他实施例在本发明亦被考虑使用,其中各种上述的功能,例如地址比较及多路程序,被排入各种不同的时钟周期;而关于快速弹出、推测性载入、常规载入及自非堆栈快取122载入,本发明并不只限制于上述特例。
由上述可知,相较于没有区分堆栈及非堆栈存取的现有单一快取,使用分开的堆栈快取124及非堆栈快取122的一个优点是可有效地增加L1数据快取126的容量,且并未增加L1数据快取126的存取时间。且,由于非堆栈快取122并未被堆栈数据污染,就被一个程序存取的整体数据而言,相较于相同大小的现有快取存储器,非堆栈快取122的效率有所增加。此外,堆栈快取124能为大多数的弹出指令提供有利的快速存取,此是由于堆栈存取后入先出的特质,既然该数据(资料)很有可能是最新压入堆栈快取124的数据,或在堆栈快取124的最新数据,弹出指令所要求的数据很有可能在堆栈快取124的顶部。于是,在决定弹出地址是否确实命中堆栈快取124之前,堆栈快取124就推测性地提供弹出数据。更且,堆栈快取124能为大多数的载入指令提供有利的快速存取,此是由于堆栈存取后入先出的特质,载入指令所要求的数据很有可能在靠近堆栈快取124顶单或多个快取单位。于是,在进行实际地址比较以确定载入指令所要求的数据是否存在于这些场也之前,堆栈快取124根据虚拟地址比较,就推测性地自堆栈快取124的上部层之一提供载入数据。既然将虚拟地址翻译成实际地址需要额外的时间,比起先进行实际地址比较,在大部份的情况,上述做法可使堆栈快取124以较快的速度提供载入数据。最后,如果载入指令的虚拟地址并未命中这些堆栈快取124上部层,以致载入数据不能推测性地提供给载入指令,此时如果载入指令的实际地址有命中堆栈快取124,则堆栈快取124提供载入数据。如果载入指令的实际地址没有命中堆栈快取124,则非堆栈快取122提供载入数据。于是,自堆栈快取124读取数据所需的等待时间(latency time)并非固定,当有较多可预测的存取时,就使用较少的时钟周期。等待时间一方面决定于指令的种类,另一方面则决定于被要求的数据在堆栈快取124位置。
请参阅图14所示,是本发明导管结构化微处理器1400的方块图,微处理器1400与图1微处理器100相似,除了微处理器1400包括一L1数据快取1402,而L1数据快取1402并未包括堆栈快取124。如下所述,图14L1数据快取1402包括一现有L1数据快取,该现有L1数据快取具有一装置可自L1数据快取1402进行快速弹出操作。
请参阅图15所示,是说明本发明的图14中L1数据快取1402的方块图,一些图15的元件及其功能与图3相似,并且以相同的数字编号。数据快取1402包括地址产生器306,其接受运算元(operand)332并产生虚拟地址334;转换后备缓冲器308(TLB),其接受虚拟地址334并产生实际地址336;算术单元304,其接受加入信号382(add signal)及递减信号384(decrement signal)、递增信号386(increment signal)并产生欠位信号388(underflow signal)和溢位信号392(overflow signal);和多路器316、多路器318、浮点_偏移寄存器322(fp_offset register)、加入_堆栈指针_值信号394(add_sp_valsignal)、堆栈指针寄存器152位[52]、输出信号372及浮点_偏移信号396(fp_offset signal),其功能与图3相同编号者功能相类似,除了另述于以下者外。数据快取1402并包括控制逻辑单元1502,其功能在某些方面与图3的控制逻辑单元302相类似。控制逻辑单元1502,类似图3控制逻辑单元302,接受压入_指令信号342(push_instr signal)、弹出_指令信号344(pop_instr signal)及加入_堆栈指针_指令信号352(add_sp_instrsignal)。控制逻辑单元1502,类似图3控制逻辑单元302,产生多路选择信号368(mux select signal)。控制逻辑单元1502产生异常信号399(exceptionsignal),其类似于图3相同编号者,以回应检测到不正确的快速弹出操作,除了另述于下者外。
数据快取1402亦包括有一储存单元阵列(即数组,以下均称为阵列)1504,用于储存多个快取单位、每一快取单位的地址指针以及每一快取单位的快取状态,如MESI状态。在一图15的实施例中,储存单元阵列1504被规划成具有N个横列(或组set),及四个直行(或排way),即,数据快取1402被规划成4-行组关联性快取存储器。然而本发明并不限制于具有特定行数的快取。在一实施例中,在储存单元阵列1504中的快取单位的大小包括六十四个字节。
数据快取1402亦包括一列解码电路1506。列解码器1506接受一列信号1552,列信号1552(row signal)指定储存元件阵列1504中的N个横列之一。列解码器1506产生一真值给多个由列信号1552所定的读取[N-10]信号1542(read[N-10]signal)中的一个。为回应接受的读取信号,储存元件阵列1504输出该列的内容信号1594,该列由该真值读取[N-10]信号1542(read[N-10]signal)所定,即,所选择的列的各行内的快取单位的数据、地址指针及MESI状态均承载于内容信号1594上输出。在一图15的实施例中,四个快取单位,伴随地址指针1574及MESI状态有效位1576,承载于内容信号1594上输出,其中每个快取单位包括十六个双字。
数据快取1402亦包括有一4输入-多路器1528,连接储存元件阵列1504。4输入-多路器1528在其每一输入位置各别接受储存元件阵列1504输出的四个快取单位1594之一。根据控制信号1596,多路器1528选择其中一快取单位在信号1592输出。信号1592提供给多路器318;根据浮点_偏移信号396(fp_offset signal),多路器318提供一双字给总线138。
数据快取1402亦包括一由控制逻辑单元1502产生的快速_弹出信号1564(fast_pop signal)。控制逻辑单元1502产生一真值给快速_弹出信号1564,以回应弹出_指令信号344(pop_instr signal),并使自数据快取1402进行快速弹出的操作开始进行。
数据快取1402亦包括一储存元件的第一堆栈,或被称为浮点_列堆栈1516(fp_row stack)的层,连接控制逻辑单元1502。浮点_列堆栈1516包括多个储存单元,每一个储存单元储存一值以识别储存单元阵列1504中的各列。在一实施例中,每一浮点_列堆栈1516的单元储存log2N个位,其中N为储存单元阵列1504中横列的数目。多个浮点_列堆栈1516的储存单元被规划成堆栈或后入先出(LIFO)存储器,其包括一顶层1514(top entry),顶层1514储存最新压入横列值,最新压入横列值是由控制逻辑单元1502所提供的新_列信号1554(new_row signal)所决定。即,新_列信号1554决定储存单元阵列1504中的一列,该列储存“含有最新压入指令数据”的快取单位,其将参阅图17详细说明于下。储存“含有最新压入指令数据”的横列,有利于数据快取1402进行快速弹出操作,其如下述。浮点_列堆栈1516亦接受由控制逻辑单元1502产生的压入_列信号1562(push_row signal)。当控制逻辑单元1502确认一真值给压入_列信号1562,浮点_列堆栈1516就下移一层,即,底层被移出浮点_列堆栈1516,且其他层则接受紧在其上层的值,且新_列信号1554的值则被写入浮点_列堆栈1516的顶层。浮点_列堆栈1516亦接受由控制逻辑单元1502产生的弹出_列信号1558(pop_row signal)。当控制逻辑单元1502确认一真值给弹出_列信号1558,浮点_列堆栈1516就上移一层,即,顶层被移出浮点_列堆栈1516,且其他层则接受紧在其下层的值。
数据快取1402亦包括有一2输入-多路器1512,连接浮点_列堆栈1516。2输入-多路器1512的输入位置之一接受来自浮点_列堆栈1516顶层1514,被称为浮点_列1556(fp_row)的值。在另一输入位置,多路器1512接受实际地址336的索引或列选择部份1548,实际地址336则来自转换后备缓冲器308(TLB)。在一实施例中,索引1548包括实际地址336的下部地址位。如果快速_弹出信号1564为真,则多路器1512选择浮点_列信号1556的值,并于列信号1552上输出至列解码器1506;如果快速_弹出信号1564不为真,则多路器1512选择索引1548,以在列信号1552上输出。
数据快取1402亦包括一储存元件的第二堆栈,或被称为浮点_行堆栈1534(fp_way stack)的层,连接控制逻辑单元1502。浮点_行堆栈1534包括多个储存单元,每一个储存单元储存一值以识别储存单元阵列1504中的各直行。在一图15的实施例中,每一浮点_行堆栈1534的单元储存两个位,以指定储存单元阵列1504中的四行之一。多个浮点_行堆栈1534的储存单元被规划成堆栈或后入先出(LIFO)存储器,其包括一顶层1532(top entry),顶层1532储存最新压入直行值,最新压入直行值是由控制逻辑单元1502所提供的新行信号1582(new_way signal)所决定。即,新_行信号1582决定储存单元阵列1504中某列的一行,该列由新_列信号1554决定,且该列储存“含有最新压入指令数据”的快取单位,其将参阅图17详细说明于下。储存“含有最新压入指令数据”的直行,有利于数据快取1402进行快速弹出操作,其如下述。浮点_行堆栈1534亦接受由控制逻辑单元1502产生的压入_行信号1588(push_way signal)。当控制逻辑单元1502确认一真值给压入_行信号1588,浮点_行堆栈1534就下移一层,即,底层被移出浮点_行堆栈1534,且其他层则接受紧在其上层的值,并且新_行信号1582的值则被写入浮点_行堆栈1534的顶层1532。该浮点_行堆栈1534亦接受由控制逻辑单元1502产生的弹出_行信号1586(pop_way signal)。当控制逻辑单元1502确认一真值给弹出_行信号1586,该浮点_行堆栈1534就上移一层,即,顶层被移出浮点_行堆栈1534,且其他层则接受紧在其下层的值。
在一实施例中,浮点_列堆栈1516及浮点_行堆栈1534被包括于单一储存单元堆栈,其中每一储存单元储存一列/行对。
数据快取1402亦包括有一2输入-多路器1526,连接浮点_行堆栈1534。2输入-多路器1526的输入位置之一接受来自浮点_行堆栈1534顶层1532,被称为浮点_行1584(fp_way)的值。在另一输入位置,多路器1526接受常规_行_选择信号1578(normal_way_select signal)。如果快速_弹出信号1564为真,则多路器1526选择浮点_行1584的值,并在多路选择信号1596(muxselect signal)上输出至多路器1528;如果快速_弹出信号1564不为真,则多路器1526选择常规_行_选择信号1578(normal_way_select signal),以在多路选择信号1596上输出。
在一实施例中,每一浮点_列堆栈1516及浮点_行堆栈1534的层包括一有效位,且快速_弹出信号1564由顶层1514(top entry)及顶层1532(top entry)有效位的AND逻辑运算把关,即,虽然控制逻辑单元1502在进行一快速弹出操作之前并未确认弹出来源地址是否匹配,但在进行一快速弹出操作之前,它真的有确认浮点_列堆栈1516的顶层1514是有效的,及浮点_行堆栈1534的顶层1532是有效的。在此一实施例中,每一次浮点_列堆栈1516或浮点_行堆栈1534被弹出,上移后的底层的有效位被设为“伪”。
数据快取1402亦包括有一行选择产生器1524(way select generator),连接控制逻辑单元1502。行选择产生器1524接受各个被选择列的地址标记1574及有效位1576,这些被选择列是来自储存单元阵列1504。行选择产生器1524亦接受实际地址336的地址标记部份1546,实际地址336是来自转换后备缓冲器308(TLB)。行选择产生器1524将储存单元阵列1504输出的每一地址标记1574与实际地址标记1546进行比较,如弹出,压入、载入或储存指令的实际地址标记。如果地址标记1574中的一个匹配实际地址标记1546,且其相关的有效位1576显示地址标记1574是有效的,则行选择产生器1524在快取_命中信号1572(cache_hit signal)上产生一真值,该快取_命中信号1572则提供给控制逻辑单元1502。此外,行选择产生器1524提供有效匹配的行的值即命中储存单元阵列1504的行给常规_行_选择信号1578(normal_way_select signal),而该常规_行_选择信号1578则供应控制逻辑单元1502及多路器1526。
数据快取1402亦包括一检查逻辑单元1508(check logic),连接储存单元阵列1504。检查逻辑单元1508接受实际地址336、快速_弹出信号1564(fast_pop signal)、浮点_列1556(fp_row)、浮点_行1584(fp_way)、被选择列的地址标记1574、有效位1576及浮点_偏移信号396(fp_offset signal)。检查逻辑单元1508进行检查以决定快速弹出操作时,推测性提供给弹出指令的数据是否正确。检查逻辑单元1508决定快速弹出操作时,由浮点_列1556(fp_row)及浮点_行1584(fp_way)提供的列行值是否正确,该列行值用于自储存单元阵列1504选择正确的快取单位,以提供正确的弹出数据。在一实施例中,在一快速弹出操作中,检查逻辑单元1508比较浮点_列1556(fp_row)的值与浮点_行1584(fp_way)所定的行的地址标记1574。在一实施例中,在一快速弹出操作中,检查逻辑单元1508比较浮点_列1556(fp_row)的值与实际地址336的相关位。在一实施例中,在一快速弹出操作中,检查逻辑单元1508比较浮点_偏移信号396(fp_offset signal)的值与实际地址336的相关位。检查逻辑单元1508亦验证浮点_行1584(fp_way)所定的行的有效位1576显示在快速弹出操作中存取的快取单位是一有效快取单位。如果快取单位无效或正确的快取单位未被存取,则检查逻辑单元1508产生一伪值于浮点_检查信号1544(fp_check signal),浮点_检查信号1544则被提供给控制逻辑单元1502;否则,检查逻辑单元1508产生一真值于浮点_检查信号1544(fp_check signal),浮点_检查信号1544则被提供给控制逻辑单元1502。
请参阅图16所示,是本发明从图15中数据快取1402进行快速弹出操作的流程图,流程从方块1602开始。
在方块1602,指令翻译器106(instruction translator)解码一弹出指令,且指令调度器108(instruction scheduler)将此弹出指令发交图14中执行单元114(execution units)的载入单元。载入单元则产生一真值给弹出_指令信号344(pop_instr signal)。然后,流程进行至方块1604。
在方块1604,为了回应弹出_指令信号344(pop_instr signal)的真值,控制逻辑单元1502产生一真值给快速_弹出信号1564(fast_pop signal)。于是,多路器1512选择浮点_列1556(fp_row)给列信号1552(row signal),列信号1552则提供给解码器1506(row decoder)。列解码器1506产生一真值给浮点_列1556所指定的读取[N-10]信号1542(read[N-10]signal)中的一个以为回应。储存单元阵列1504在输出内容信号1594上输出真值读取信号[N-10]的列以为回应。为回应快速_弹出信号1564的真值,多路器1526选择输入浮点_行1584(fp_way)给多路选择信号1596(mux select signal),多路选择信号1596则提供给多路器1528。多路器1528自浮点_行1584(fp_way)所指定的行选择快取单位给输出信号1592,以为回应。多路器318自输出信号1592的快取单位选择适当的双字,经总线138给执行单元114(execution units)的载入单元,以提供给弹出指令,随后写回站116(write-back stage)将其载入弹出指令所指定的寄存器文件夹112(registerfile)的寄存器之一,多路器318自输出信号1592的快取单位选择适当的双字是根据储存于浮点_偏移寄存器322(fp_offset register)的值。例如,如果弹出指令是X86的RET指令,则弹出数据被载入寄存器文件夹112的指令指针寄存器。例如,如果弹出指令是X86的LEAVE指令,则弹出数据被载入寄存器文件夹112的X86 EBP。例如,如果弹出指令是X86的POP指令,则弹出数据被载入弹出指令所指定的寄存器文件夹112的寄存器之一。如图16所见,数据是被推测性地提供给载入单元。此一操作所以是推测性的原因是弹出指令的来源地址与弹出数据的地址是否相同并未被确认,弹出指令的来源地址随后将在方块1616产生于实际地址336上,弹出数据则自储存单元阵列1504(storage element array)的一层提供给载入单元,该层是由浮点_列1556(fp_row)以及浮点_行1584(fp_way)所指定的。然后,流程进行至方块1606。
在方块1606,控制逻辑单元1502产生一真值给递增信号386(incrementsignal),算术单元304反应性地递增浮点_偏移信号396(fp_offset signal),并提供此一递增值给输出372,而控制逻辑单元1502使多路器316经由控制信号368进行选择,以载入图3中浮点_偏移寄存器322(fp_offset register)。然后,流程进行至决定方块1608。
在决定方块1608,控制逻辑单元1502检查溢位信号392(overflowsignal),以决定在方块1606进行的递增操作是否导致浮点_偏移寄存器322溢位。即,控制逻辑单元1502决定弹出指令是否导致堆栈指针寄存器152绕至次一快取单位。如是,则流程进行至方块1612,如否,则流程进行至方块1614。
在方块1612,控制逻辑单元1502产生一真值给弹出_列信号1558(pop_rowsignal),以将顶层弹出浮点_列堆栈1516(fp_row stack);同时,控制逻辑单元1502产生一真值给弹出_行信号1586(pop_way signal),以将顶层弹出浮点_行堆栈1534(fp_way stack)。顶层被弹出使其与系统存储器快取保持一致,既然,储存于储存单元阵列1504(storage element array)层的快取单位的最后一个双字已被弹出指令弹出系统存储器堆栈,该快取单位层是由浮点_列堆栈1516(fp_row stack)的顶层1514(top entry)及浮点_行堆栈1534(fp_way stack)的顶层1532(top entry)所决定。如下所述,在一实施例中,直到下述方块1618已被执行,才执行方块1612。在一实施例中,在方块1604使用的浮点_列1556(fp_row)及浮点_行1584(fp_way)的值被保留下来在其后的方块1618使用。然后,流程进行至方块1614。
在方块1614,地址产生器306计算出弹出指令的来源虚拟地址334。然后,流程进行至方块1616。
在方块1616,转换后备缓冲器308(TLB)产生弹出指令的来源实际地址336。然后,流程进行至方块1618。
在方块1618,检查逻辑单元1508比较在方块1616产生的实际地址336的相当部份与浮点_行1584(fp_way)所选择的地址标记1574,并比较实际地址336的相当部份与浮点_列1556(fp_row),并比较实际地址336的相当部份与浮点_偏移信号396(fp_offset signal),并检查浮点_行1584(fp_way)所选择的有效位1576以产生浮点_检查信号1544(fp_check signal),以提供控制逻辑单元1502。然后,流程进行至方块1622。
在决定方块1622,控制逻辑单元1502检查浮点_检查信号1544(fp_checksignal)以决定弹出指令的来源实际地址336是否命中储存单元阵列1504(storage element array)的一层,该层是由浮点_列堆栈1516(fp_row stack)以及浮点_行堆栈1534(fp_way stack)的顶层所决定。如果弹出指令的来源实际地址336命中由浮点_列堆栈1516(fp_row stack)及浮点_行堆栈1534(fp_way stack)的顶层所决定的储存单元阵列1504(storage element array)的一层,则流程结束,即,推测性快速弹出操作提供正确弹出数据。否则,流程进行至方块1624。
在方块1624,控制逻辑单元1502产生一真值给异常信号399(exceptionsignal),使微处理器1400分支至异常处理器,以处理推测性快速弹出操作提供不正确的弹出数据的情况。异常处理器使正确的数据供应给弹出指令。在一实施例中,异常处理器清除浮点_列堆栈1516(fp_row stack)及浮点_行堆栈1534(fp_way stack),并将堆栈指针寄存器152的位[52]的现时值载入浮点_偏移寄存器322(fp_offset register)。然后,流程在方块1624结束。
如同前述所见,以及如同参阅图19将详细说明于下者,图16的快速弹出操作使弹出数据提供至弹出指令的速度较现有没有快速弹出装置的快取存储器有快上几个时钟周期的潜力。
请参阅图17所示,是本发明向图15中数据快取1402进行压入操作的流程图,流程从方块1702开始。
在方块1702,指令翻译器106(instruction translator)解码一压入指令,且图1中指令调度器108(instruction scheduler)将此压入指令发交执行单元114(execution units)的储存单元。储存单元则产生一真值给压入_指令信号342(push_instr signal)。然后,流程进行至方块1704。
在方块1704,控制逻辑单元1502产生一真值给递减信号384(decrementsignal),算术单元304反应性地递减浮点_偏移信号396(fp_offset signal),并提供此一递减值给输出372,而控制逻辑单元1502使多路器316经由控制信号368进行选择,以载入浮点_偏移寄存器322(fp_offset register)。然后,流程进行至决定方块1706。
在决定方块1706,控制逻辑单元1502检查欠位信号388(underflowsignal),以决定在方块1704浮点_偏移396(fp_offset)的递减是否导致浮点_偏移寄存器322(fp_offset register)的欠位。即,控制逻辑单元1502决定弹出指令是否导致堆栈指针寄存器152绕入次一快取单位(wrap to thenext cache line)。如是,则流程进行至决定方块1716,如否,则流程进行至决定方块1708。
在决定方块1708,控制逻辑单元1502检查快取_命中信号1572(cache_hitsignal)),以决定压入指令的目的实际地址336是否命中储存单元阵列1504(storage element array)。如是,则流程进行至方块1712,如否,则流程进行至方块1714。
在方块1712,数据快取1402以常规的压入指令来处理命中数据快取1402的压入指令,即,数据快取1402根据在数据快取领域中众所周知的现有方法来处理此压入指令。既然此压入并未绕至上一快取单位(did not wrap to aprevious cache line),更新浮点_列堆栈1516(fp_row stack)及浮点_行堆栈1534(fp_way stack)就无必要。因此,随后的弹出操作指定由浮点_列堆栈1516(fp_row stack)的顶层1514(top entry)及浮点_行堆栈1534(fp_waystack)的顶层1532(top entry)所决定的快取单位的数据是很有可能的。然后,流程在方块1712结束。
在方块1714,控制逻辑单元1502产生一真值给异常信号399(exceptionsignal),使微处理器1400分支至异常处理器,以更新浮点_列堆栈1516(fp_row stack)及浮点_行堆栈1534(fp_way stack)。异常处理器使正确的数据供应给弹出指令。在一实施例中,异常处理器清除(flush)浮点_列堆栈1516(fp_row stack)及浮点_行堆栈1534(fp_way stack),并将堆栈指针寄存器152的位[52]的现时值载入浮点_偏移寄存器322(fp_offsetregister)。然后,流程进行至方块1726。
在决定方块1716,控制逻辑单元1502检查快取_命中信号1572(cache_hitsignal),以决定压入指令的目的实际地址336是否命中储存单元阵列1504(storage element array)。如是,则流程进行至方块1718,如否,则流程进行至方块1726。
在方块1718,控制逻辑单元1502决定命中储存单元阵列1504(storageelement array)的列及行。列由索引1548(index)决定,行由常规_行_选择信号1578(normal_way_select signal)决定。控制逻辑单元1502在新_行信号1582(new_way signal)上提供命中的行给浮点_行堆栈1534(fp_waystack)。另外,。控制逻辑单元1502在新_列信号1554(new_row signal)上提供命中的行给浮点_列堆栈1516(fp_row stack)。然后,流程进行至方块1722。
在方块1722,控制逻辑单元1502产生一真值给压入_列信号1562(push_row signal),以压入新_列信号1554(new_row signal)的值到浮点_列堆栈1516(fp_row stack)。控制逻辑单元1502亦产生一真值给压入_行信号1588(push_way signal),以压入新_行信号1582(new_way signal)的值到浮点_行堆栈1534(fp_way stack)。然后,流程进行至方块1724。
在方块1724,数据快取1402以常规的压入指令来处理命中数据快取1402的压入指令,即,在方块1722更新浮点_列堆栈1516(fp_row stack)及浮点行堆栈1534(fp_way stack)之后,数据快取1402根据在数据快取领域中众所周知的现有方法来处理此压入指令。然后,流程在方块1724结束。
在方块1726,控制逻辑单元1502决定索引1548(index)所选择的列中的行,其将被失误的压入地址336相关的快取单位取代,该快取单位此时必须被提取进入数据快取1402。在一实施例中,控制逻辑单元1502选择被选择的列中最近最没有被用到的行。控制逻辑单元1502以新_行信号1582(new_waysignal)提供取代的行给浮点_行堆栈1534(fp_way stack)。此外,控制逻辑单元1502以新_列信号1554(new_row signal)提供索引1548(index)所选择的列给浮浮点_列堆栈1516(fp_row stack)。然后,流程进行至方块1728。
在方块1728,控制逻辑单元1502产生一真值给压入_列信号1562(push_row signal),以压入新_列信号1554(new_row signal)的值到浮点_列堆栈1516(fp_row stack)。控制逻辑单元1502亦产生一真值给压入_行信号1588(push_way signal),以压入新_行信号1582(new_way signal)的值到浮点_行堆栈1534(fp_way stack)。然后,流程进行至方块1732。
在方块1732,数据快取1402以常规的压入指令来处理在数据快取1402失误的压入指令,即,在方块1728更新浮点_列堆栈1516(fp_row stack)及浮点_行堆栈1534(fp_way stack)之后,数据快取1402根据在数据快取领域中众所周知的现有方法来处理此压入指令。。然后,流程在方块1732结束。
请参阅图18所示,是本发明图14中微处理器1400回应加入堆栈指针指令的流程图,流程从方块1802开始。
在方块1802,指令翻译器106(instruction translator)解码一加入指令,此加入指令的目的为图14中堆栈指针寄存器152,且指令调度器108(instruction scheduler)将此加入指令发交图14中执行单元114(execution units)的整数单元。整数单元则产生一真值给加入_堆栈指针_指令信号352(add_sp_instr signal)。然后,流程进行至方块1804。
在方块1804,控制逻辑单元1502产生一真值给加入信号382(addsignal),算术单元304反应性地加入加入_堆栈指针_值信号394(add_sp_valsignal)给浮点_偏移信号396(fp_offset signal),并提供此一和值给输出372,而控制逻辑单元1502使多路器316经由控制信号368进行选择,以载入浮点_偏移寄存器322(fp_offset register)。然后,流程进行至方块1806。
在决定方块1806,控制逻辑单元1502检查溢位信号392(overflowsignal),以决定在方块1804进行的加入操作是否导致浮点_偏移寄存器322溢位。即,控制逻辑单元1502决定加入指令是否导致堆栈指针(stackpointer)152绕入次一快取单位(wrap to the next cache line)。在方块1806,一溢位状况为此一加入致使堆栈指针152(stack pointer)不再参考储存于数据快取1402层的快取单位,该层是由浮点_列堆栈1516(fp_row stack)的顶层1514及浮点_行堆栈1534(fp_way stack)的顶层1532所决定。尢其是,如果此一加入导致溢位,堆栈指针152典型地参考一快取单位,其存储器地址紧邻并大于储存于数据快取1402层的快取单位的存储器地址,该层是由浮点_列堆栈1516(fp_row stack)的顶层1514及浮点_行堆栈1534(fp_waystack)的顶层1532所决定。于是,为了使将由浮点_列堆栈1516(fp_rowstack)的顶层1514及浮点_行堆栈1534(fp_way stack)的顶层1532所决定的正确的快取单位能出现,浮点_列堆栈1516及浮点_行堆栈1534必须进行弹出。在一实施例中,控制逻辑单元1502提供一加入给溢位超过一快取单位的堆栈指针152。在此一实施例中,在下述的方块1808中,自浮点_列堆栈1516及浮点_行堆栈1534被弹出的层数目N,在假设快取单位的大小为64字节时,可计算如下 如果N大于1,就发生了溢位状况。如果发生了溢位状况,则流程进行至方块1808,否则流程结束。
在方块1808,控制逻辑单元1502产生一真值给弹出_列信号1558(pop_rowsignal),以将顶层弹出浮点_列堆栈1516(fp_row stack);同时,控制逻辑单元1502产生一真值给弹出_行信号1586(pop_way signal),以将顶层弹出浮点_行堆栈1534(fp_way stack)。如在方块1806所讨论,在一实施例中,N被计算出来,且N个层自浮点_列堆栈1516及浮点_行堆栈1534被弹出。然后,流程在方块1808结束。
请参阅图19所示,是本发明图16中自图15数据快取1402进行快速弹出操作的时序图,图19包括编号1到4的四个直栏,与微处理器1400的四个时钟周期相对应。图19亦包括六个横列,各自被标注以代表微处理器1400的不同的动作或结果。图19由直栏与横列所定的方格为空白,或内含“弹出(pop)”,用以显示在微处理器1400导管结构进行时,弹出指令的位置。
在时钟周期1,根据图19第一横列及图16的方块1602,执行单元114(execution units)的载入单元产生一真值给弹出_指令信号344(pop_instr signal),为弹出指令要求弹出数据。
在时钟周期2,根据图19第二横列及图16的方块1604,列解码器1506解码浮点_列信号1556(fp_row signal)上的列值,以产生一真值给读取[N-10]信号1542(read[N-10]signal)中的一个。储存元件阵列1504提供被选择列的四个行的每一层的快取单位、地址指针及快取状态,以为回应。
在时钟周期2,根据图19第三横列及图16的方块1614,地址产生器306计算虚拟地址334。
在时钟周期3,根据图19第四横列及图16的方块1604,多路器1528多路出(muxes out)浮点_行1584(fp_way)所定的快取单位1592,且多路器318多路出(muxes out)所选择快取单位1592的适当的双字,该双字是由浮点_偏移信号396(fp_offset signal)所定。在一实施例中,由实际地址336(physical address)下部位[52]所定的所选择快取单位1592的适当的双字被多路出来。
在时钟周期3,根据图19第五横列及图16方块1616,转换后备缓冲器308(TLB)产生弹出指令的来源实际地址336。
在时钟周期4,根据图19第六横列及图16方块1618至方块1624,控制逻辑单元1502检查浮点_检查信号1544(fp_check signal),以决定不正确的推测性弹出操作是否已被执行。
在一实施例中,在图15数据快取1402进行载入指令的时序与在图1非堆栈快取122进行载入指令的时序相似,因此,图13亦描述在数据快取1402进行载入指令的时序。如比较图19与图13所见,图16快速弹出操作使数据快取1402在提供数据给弹出指令时有潜力较现有快取快上数个时钟周期,该现有快取并未包括图15快速弹出装置,且在弹出指令及载入指令并未有所区隔。
在一实施例中,虚拟地址334的位[52]而非浮点_偏移信号396(fp_offset signal)被使用来选择双字。
虽然本发明及其目的、特征、优点均已被详细描述说明于上,但其他实施例亦包括于本发明的范围之中。例如,堆栈或后入先出(LIFO)存储器可以各种方式被具体化以达成后入先出(last-in-first-out)的功能。一代表性实施例为一寄存器文件夹具有循环性先入先出(circular FIFO)存储器的功能,其堆栈指针的底部及顶部被维持着,以决定下一个要被压入或弹出的层及何时堆栈已被净空。更且,虽然上述实施例参照X86架构的指令予以描述,其中堆栈朝减少存储器地址的方式成长,但本发明亦可被使用于其他类型的微处理器,其具有堆栈朝增加存储器地址的方式成长的堆栈存取指令。另外,虽然有公开特定大小的快取单位的实施例,但其他尺寸的快取单位亦可使用于本发明。
虽然本发明及其目的、特征、优点均已被详细描述于上,但其他实施例亦包括于本发明的范围之中。除了使用硬件实行本发明之外,本发明亦可以包括于电脑可用媒介(例如,可读的媒介)中的电脑可读码(如电脑可读程序码、数据等)的方式实施。电脑码使得公开于此的发明的功能或其制造或两者成为可能。例如,本发明可以使用一般程序语言(例如,C,C++,JAVA等)、GDSIIdatabases、硬件描述语言(HDL)包括Verilog HDL,VHDL,Altera HDL(AHDL)等、或其他程序或/且电路(路线图)捕捉工具来实现。电脑码可以配置于任何已知的电脑可用媒介(例如,可读的媒介),包括半导体存储器、磁盘、光盘(例如,CD-ROM,DVD-ROM等),并可配置成电脑数据信号而包括于电脑可用的(例如,可读的)传播媒介中(例如,载波,或其他媒介包括数字、光学或类比媒介)。如此,电脑码可经由通讯网路,包括互联网及内联网(intranet)而传播。本发明可以被体现于做为知识产权(IP)核心的电脑码,例如,微处理器核心,或做为一系统阶层的设计,如单芯片系统(SOC)),然后转变成硬件而为集成电路的一部份。本发明亦可以硬件及电脑码结合的方式实施。
以本发明所公开的观念及实施例为基础,而达成与本发明目的相同的构造变化修饰或其他构造的设计,均不偏离本发明的精神,且均在申请专利范围的涵盖之内。
以上所述,仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例公开如上,然而并非用以限定本发明,任何熟悉本专业的技术人员,在不脱离本发明技术方案范围内,当可利用上述揭示的技术内容作出一些变化或修饰为等效变化的等效实施例,但凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等效变化与修饰,均仍属于本发明技术方案的范围内。
权利要求
1.一种自堆栈快取存储器进行快速推测性弹出操作的装置,其特征在于,其包括一后入先出(last-in-first-out)存储器,该后入先出存储器用于快取压入(push)指令的目位置相关的快取单位(cache line)的数据,该后入先出存储器并具一顶层(top entry),用以储存最新的压入(push)指令的目的地址相关的一快取单位;一输入单元,连接该后入先出存储器,该输入单元用于指示一自该快取存储器要求数据的指令是一指定该数据来源地址的弹出(pop)指令;以及逻辑单元,连接该输入单元,该逻辑单元用于回应该输入单元,并在决定该来源地址与储存在该顶层的快取单位的地址是否匹配之前,控制该后入先出存储器推测性地自该顶层提供该数据至该弹出指令。
2.根据权利要求1所述的堆栈快取存储器的装置,其特征在于,还包括一比较器,连接该逻辑单元,在该逻辑单元控制该后入先出存储器推测性地提供该数据至该弹出指令之后,该比较器用于比较该来源地址与储存在该顶层的快取单位的地址。
3.根据权利要求2所述的堆栈快取存储器的装置,其特征在于,还包括一输出单元,连接该逻辑单元,如果该比较器指示该弹出指令的该来源地址与储存在该顶层的该快取单位的地址不匹配,该输出单元用于指示该后入先出存储器不正确地推测性提供该数据至该弹出指令。
4.根据权利要求1所述的堆栈快取存储器的装置,其特征在于,其中所述的弹出指令包括一指令,其用于自一系统存储器的堆栈弹出该数据,而该系统存储器连接一包括此快取存储器的微处理器。
5.根据权利要求4所述的堆栈快取存储器的装置,其特征在于,其中所述的堆栈的地址包括有最新压入指令的目的地址、弹出指令的来源地址包括在该堆栈地址,而该堆栈地址是在该系统存储器上、或自该弹出数据的返回地址。
6.根据权利要求4所述的堆栈快取存储器的装置,其特征在于,其中所述的快取单位包括多个字节的数据,这些字节数目等于能在快取存储器与该系统存储器之间传递的最小字节数目。
7.根据权利要求1所述的堆栈快取存储器的装置,其特征在于,其中所述的快取单位包括一第一字节组的数据,其中提供给该弹出指令的该数据包括一第二字节组的数据,且其中该第一字节组的字节数至少二倍于该第二字节组的字节数。
8.根据权利要求1所述的堆栈快取存储器的装置,其特征在于,其中所述的快取自该快取存储器的该快取单位的数据与一包括该快取存储器的系统的其他存储器保持一致性。
9.根据权利要求1所述的堆栈快取存储器的装置,其特征在于,其还包括一偏移量,供应该逻辑单元,该偏移量用于指定位于该顶层的快取单位的数据的位置,而该数据是由最新的压入指令所定。
10.根据权利要求9所述的堆栈快取存储器的装置,其特征在于,其中所述的逻辑单元控制该后入先出存储器,推测性地自该顶层的快取单位的数据的地址,提供该数据,而该地址是由该偏移量所定。
11.根据权利要求10所述的堆栈快取存储器的装置,其特征在于,其中,如果为回应该弹出指令,而更新该偏移量,致使该偏移量绕越该顶层的快取单位,该逻辑单元将令该后入先出存储器移出其内的该顶层。
12.根据权利要求9所述的堆栈快取存储器的装置,其特征在于,其中,如果在存入该最新的压入指令所定的该数据之前,更新该偏移量,致使该偏移量绕穿该顶层的快取单位,该逻辑单元将令该后入先出存储器下移,因而产生一新的顶层,其中该逻辑单元将由该最新的压入指令所定的该数据存入该新的顶层中由该偏移量所定的地址。
13.根据权利要求9所述的堆栈快取存储器的装置,其特征在于,其还包括一算术单元,连接该逻辑单元,该算术单元用于更新该偏移量。
14.根据权利要求13所述的堆栈快取存储器的装置,其特征在于,其中所述的算术单元更新该偏移量包括将一由指令所定的运算元加于该偏移量,其中该指令指定该运算元加至一微处理器内的堆栈指针寄存器,而该微处理器包括该快取存储器。
15.根据权利要求14所述的堆栈快取存储器的装置,其特征在于,其中,如果该偏移量的更新致使该偏移量绕越该顶层的快取单位,该逻辑单元将令该后入先出存储器移出其内的该顶层。
16.根据权利要求1所述的堆栈快取存储器的装置,其特征在于,其中所述的最新的压入指令是指相对于储存于该后入先出存储器的多个该快取单位的数据及尚未被弹出的数据的至少一者为最新。
17.根据权利要求1所述的堆栈快取存储器的装置,其特征在于,其中所述的最新压入指令的该目的地址所相关的该快取单位包括一尚未自系统存储器堆栈弹出的最新压入指令的数据。
18.一种自堆栈快取存储器进行快速推测性弹出操作的装置,其特征在于,其包括多个第一类储存元件,规划为一随机存取快取存储器(random accesscache),该多个第一类储存元件用于快取非压入指令(non-push)所定的数据;多个第二类储存元件,规划为一堆栈快取存储器(stack cache),该多个第二类储存元件用于快取压入(push)指令的目的地址所相关的数据的快取单位(cache line),该堆栈快取存储器具有一顶层(top entry)用于储存最新压入指令的目的地址所相关的一快取单位;一输入单元,该输入单元用于指示一自快取存储器要求数据的指令是一指定该数据来源地址的弹出(pop)指令;以及逻辑单元,连接该输入单元及该多个第一和第二类储存元件,该逻辑单元用于回应该输入单元,并决定该来源地址与储存在该顶层的该快取单位的地址是否匹配之前,控制该堆栈快取存储器推测性地自该顶层提供该数据至该弹出指令。
19.一种自堆栈快取存储器进行快速推测性弹出操作的方法,其特征在于,其包括以下步骤将一压入(push)指令所定的数据及在一堆栈存储器(stack memory)内此一数据的目的地址存入快取存储器(cache memory);在该存入之后,解码一弹出(pop)指令;回应该解码,为此弹出指令产生一数据的来源地址;在该产生来源地址之后,比较来源地址与储存于此快取存储器的目的地址;以及针对该解码,不考虑该比较,提供储存于此快取存储器的数据。
20.根据权利要求19所述的堆栈快取存储器数据的方法,其特征在于,其还包括以下步骤回应该比较,决定来源地址并不存在快取存储器;以及回应该决定,修正该数据提供。
21.根据权利要求20所述的堆栈快取存储器数据的方法,其特征在于,其中所述的修正步骤包括自此快取存储器之外的一堆栈存储器提取来源地址所定的正确数据。
22.根据权利要求21所述的堆栈快取存储器数据的方法,其特征在于,其中所述的修正步骤还包括在该提取之前,产生一微处理机的异常状况(exception)。
23.根据权利要求19所述的堆栈快取存储器数据的方法,其特征在于,其中所述的快取存储器设计成具有一后入层(last-in entry)的后入先出存储器,其中该数据提供包括提供储存于快取存储器的后入层的数据。
24.根据权利要求44所述的堆栈快取存储器数据的方法,其特征在于,其还包括如果目的地址在快取存储器失误,在该储存之前,压下此后入先出存储器。
25.一种自堆栈快取存储器进行快速推测性弹出操作的方法,其中推测性的提供数据给弹出(pop)指令的方法,其特征在于,其包括以下步骤储存压入(push)指令的目的地址所定的第一数据进入后入先出(last-in-first-out)存储器的顶层(top entry);在该储存第一数据之后,自弹出指令收到对由来源地址所定的第二数据的要求;回应该收到要求,不理会来源地址,自后入先出存储器的顶层提供第一数据;比较来源地址与目的地址;以及在该提供第一数据之后,回应该比较,决定第一数据是否即是第二数据。
26.根据权利要求25所述的自堆栈快取存储器推测性的提供数据给弹出指令的方法,其特征在于,其还包括如果来源地址与目的地址不匹配,产生一输出,其指示第一数据不是第二数据、在该产生输出之后,提供第二数据给弹出指令或执行一异常常规(exception routine)以进行该提供第二数据。
27.根据权利要求25所述的自堆栈快取存储器推测性的提供数据给弹出指令的方法,其特征在于,其还包括在不快于该提供第一数据的情况,进行虚拟至真实的分页地址翻译(page address translation)以产生来源地址。
28.一种应用于自堆栈快取存储器进行快速推测性弹出操作的装置与方法的电脑数据信号,其特征在于,其包括电脑可读程序码(computer-readable program code),用于提供一快取存储器(cache memory),该程序码包括第一程序码,用于提供一输入,以指示一种自快取存储器读取数据的指令类型,该指令指定该数据的来源地址;第二程序码,用于提供一后入先出(last-in-first-out)存储器,该后入先出存储器连接该输入,该后入先出存储器具有多个层(entries),每一个层储存一快取单位(cache line)的数据,每一数据与一压入(push)指令相关,该多个层具有一顶层(top entry),用以储存一快取单位的数据,该数据与一最新压入指令相关,其中为回应该输出指示该指令为一弹出(pop)指令,此快取存储器自该后入先出存储器的该顶层提供数据给该弹出指令;以及第三程序码,用于提供一比较器以接受该来源地址,用以产生该来源地址与该后入先出存储器的该顶层的快取单位的地址是否匹配的指示,以决定提供给该弹出指令的该数据是否为正确数据。
全文摘要
本发明是关于一种自堆栈快取存储器进行快速推测性弹出操作的方法及装置,是公开一种微处理器的堆栈快取存储器及进行推测性快速弹出操作的方法及装置。此堆栈快取存储器以一种后入先出方式储存压入指令相关的多个快取单位的数据。最新的非弹出性压入数据储存在堆栈快取顶层的快取单位内,一用以指定该压入数据位置的偏移量被维持着。当遭遇一使堆栈指针寄存器更新指令时,此偏移量亦被更新。当一弹出指令要求数据,在确定弹出指令的来源地址是否与所提供数据的地址相匹配之前,堆栈快取就推测性地自顶层提供由该偏移量所定的数据给弹出指令。如果来源地址与所提供数据的地址随后被判定为不匹配,则进行一异常操作,以提供正确数据。本发明能为大多数弹出指令提供较快速存取。
文档编号G06F12/10GK1641567SQ20041008881
公开日2005年7月20日 申请日期2004年11月4日 优先权日2004年1月16日
发明者胡克·E·罗德尼 申请人:智权第一公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1