执行快速推测式加载运算的微处理器及装置的制作方法

xiaoxiao2020-7-23  5

专利名称:执行快速推测式加载运算的微处理器及装置的制作方法
技术领域
本发明涉及微处理器中的高速缓存的领域,尤其涉及在堆栈内存存取与非堆栈内存存取之间进行区别的高速缓存。
背景技术
微处理器为一种执行计算机程序所指定的指令的数字装置。典型的计算机系统包括微处理器,其耦接至用以储存程序指令,以及借助程序指令所处理的数据的系统内存。这样的系统的效能会因为将来自于系统内存中的数据读入微处理器,或者是将来自于微处理器中的数据写入系统内存所需的时间通常会远大于微处理器执行用以处理数据的指令所需的时间,而受到阻碍。时间差时常介于一个与二个等级的大小之间。因此,当等待内存读取或写入时,往往会将微处理器设定为不会做任何事情的闲置状态。
然而,处理器的设计者很久以前已了解程序会花相当大部份的时间,来存取相当小部份的数据,如频繁地存取程序变量。具有此种特征的程序表明可显示良好的时间局限性(temporal locality),以及此种特征的习性称为参考原理的局限性。为了利用此原理,现代微处理器通常包括一个或多个高速缓存。高速缓存(cache memory或cache)为电性地靠近微处理器核心的相当小的内存,其用以暂时储存正常会储存于计算机系统的较大,较远的内存(如系统内存)中的一子集数据。高速缓存数据会将数据储存于高速缓存的储存组件中,以致于数据接下来可由比系统的较远内存更快的高速缓存来提供。
当微处理器执行内存读取指令(如加载或弹出(pop)指令)时,微处理器首先会进行检查,以了解请求的数据是否存在于高速缓存中(亦即,内存读取地址是否命中(hit)高速缓存)。若否(亦即,若内存读取地址未命中(miss)高速缓存),则微处理器除了会将数据加载到微处理器的特定寄存器之外,还会将数据提取到高速缓存。现在因为数据存在于高速缓存中,所以下次碰到请求相同数据的内存读取指令时,数据可从高速缓存提取到寄存器,来进行处理。因为数据已存在于高速缓存中,所以基本上可立即执行内存读取指令。
高速缓存会将数据储存于高速缓存线(cache lines),或高速缓存区块(cache block)中。高速缓存线为可在高速缓存与系统内存之间转移数据的最小单元。高速缓存线大小的一例为64字节的数据。当内存读取指令产生高速缓存失误(miss)时,会将涉及失误地址的整个高速缓存线提取到高速缓存,来取代只提取内存读取指令所请求的数据。因此,可从高速缓存来供应数据,而不必通过存取系统内存来供应数据,所以可快速地执行请求相同高速缓存线中的数据的接下来的内存读取指令。
此外,当执行内存写入指令(如储存或推入(push)指令)时,若内存写入地址命中高速缓存,则可将数据立即写入高速缓存的高速缓存线,藉此可使数据到系统内存的写入延迟。之后,高速缓存会将高速缓存线写入系统内存,以让出地方给较新的高速缓存线。此运算通常称为写回运算,更进一步地,当内存写入地址未命中高速缓存时,某些高速缓存也会配置高速缓存中的项目(entry)。亦即,高速缓存会执行高速缓存的项目中的旧高速缓存线的写回运算,以及将来自于系统内存的写入地址所包含之新高速缓存线读进先前由旧高速缓存线所占据的高速缓存项目。此运算通常称为写入配置运算。如可观察到的是,有效率地执行高速缓存可大大地改善微处理器的效能。影响高速缓存效率的二个主要因素是高速缓存命中率及高速缓存存取时间。高速缓存的命中率为高速缓存命中对高速缓存命中与失误的总和之比。存取时间为从高速缓存读取特定数据,或将特定数据写入高速缓存的所需的处理器核心频率周期的数目。
影响高速缓存命中率的最大因素是高速缓存的大小(亦即,可储存于高速缓存中的数据字节的数目)。高速缓存愈大,高速缓存中所储存的系统内存数据的子集也愈大,因此所包含的高速缓存线将更可能会存在于高速缓存中。由于此原因,会有增加高速缓存大小的行动。历史上来说,高速缓存的大小通常受限于可专用于高速缓存的微处理器晶粒上的实际空间的数量。然而,因为电路组件几何图形持续的减小,所以此限制也会降低。
但是,高速缓存大小也会影响传统高速缓存的存取时间。不幸的是,较大的高速缓存通常会比较小的高速缓存的存取时间长。这是因为传统高速缓存为随机存取内存,其需要相同量的时间,来存取高速缓存中的任何高速缓存线。数据可储存于高速缓存内的可行位置的数目愈大,放置由内存地址所指定的数据所需的电路也愈复杂。幸运的是,电路组件几何图形的持续降低也会降低高速缓存存取时间,并且有助于补偿增加的高速缓存大小的负面效应。
然而,较高的微处理器频率会有一种不变的要求,其必然意含频率周期时间(其意含存取高速缓存需较大数目的频率周期)的降低。因此,在微处理器中,会有朝向较小高速缓存的趋势,特别是第一阶(L1)高速缓存。例如,Pentium 4的L1高速缓存只有8KB,其从Pentium III中的16KB的L1数据高速缓存中降低。迫使高速缓存大小降低并不是芯片的实际资产要求。更确切地说,尽管较小的高速缓存会导致伴随而来的效能降低,但是迫使高速缓存大小降低可缩短处理器核心频率周期时间。
因此,需要一种增加高速缓存的有效大小,或降低高速缓存存取时间,或二者的方式。

发明内容
为了实现上述目的,本发明提供一种高速缓存,包括数个储存组件,配置为一后进先出内存,所述储存组件中的顶端一个,用以储存由数个最新近推入指令所指定的一高速缓存线的数据,并且用以储存该高速缓存线的一虚拟地址及一实际地址;一比较器,耦接至该顶端的储存组件,用以将该高速缓存线虚拟地址与由一加载指令所请求的数据之一来源虚拟地址进行比较;以及一输出,耦接至该比较器,在判断由该加载指令所请求的该数据的一来源实际地址是否与该实际高速缓存线地址匹配之前,若该比较器显示该来源虚拟地址与存于该顶端储存组件中的该高速缓存线虚拟地址匹配,则用以表示由该加载指令所请求的该数据存在于该高速缓存中。
本发明还提供一种微处理器,包括一第一高速缓存,用以高速缓存由推入指令所指定的数据,该第一高速缓存包括一后进先出堆栈内存,其具有一顶端项目,用以储存对应于最新推入指令数据的一高速缓存线的数据;一第二高速缓存,用以高速缓存由非推入内存存取指令所指定的数据,该第二高速缓存包括一非后进先出内存;以及控制逻辑,耦接至该第一高速缓存及该第二高速缓存,若由一加载指令所指定的一虚拟地址与存入该顶端项目中的该高速缓存线的一虚拟地址匹配,则会从该第一高速缓存中该加载指令所指定的该顶端项目数据,推测式地提供数据。
本发明又提供一种执行来自于堆栈存储高速缓存的推测式加载运算的方法,该方法包括以后进先出的方式,将堆栈内存数据存入一高速缓存;在该储存之后,判断一加载指令的一虚拟地址是否与存入该高速缓存的一顶端项目中的数据的一虚拟地址匹配;判断该加载指令的一实际地址是否与存入该顶端项目中的数据的一实际地址匹配;以及在判断该加载指令的该实际地址是否与存入该顶端项目中的数据的该实际地址匹配之前,若该加载指令的该虚拟地址与存入该顶端项目中的数据的该虚拟地址匹配,则会从该顶端项目中产生数据。
在一个方案中,本发明提出一种用以高速缓存推入指令的堆栈数据的堆栈高速缓存。此堆栈高速缓存为后进先出(LIFO)内存。因此,最新堆栈数据储存于堆栈高速缓存的顶端项目中。在一个方案中,堆栈高速缓存会储存高速缓存于其中的高速缓存线的虚拟及实际地址。当遇到加载指令时,会计算加载指令的虚拟地址。然后,加载虚拟地址会与顶端堆栈高速缓存项目中的高速缓存线的虚拟地址进行比较。若虚拟地址匹配,则堆栈高速缓存会将请求数据推测式地传送到加载指令,而不会先执行实际地址比较,以明确地判断数据是否存在于顶端项目中。与虚拟地址比较并行的是,会执行转译旁视缓冲器(translation lookaside buffer)查询,而将加载虚拟地址转译成加载实际地址。然后,会将加载实际地址与顶端堆栈高速缓存项目中的高速缓存线的实际地址进行比较,以确认会产生正确数据。若实际比较显示未匹配,则会产生一信号,以表示产生不正确数据的情况。在一实施例中,此信号会使微处理器发生例外的情形。例外处理器的微码会修正堆栈高速缓存,而会从内存中的实际堆栈,或从微处理器的另一高速缓存中,产生正确数据。
在一个方案中,微处理器还包括第二高速缓存,其实质上会与用以储存非堆栈数据的堆栈高速缓存并行地存取。当加载地址命中非堆栈高速缓存时,若虚拟及实际加载地址均未命中堆栈高速缓存,则数据会从非堆栈高速缓存传送到加载指令。
因为不需花费时间执行TLB查询,即可产生数据,所以来自于堆栈高速缓存的推测式加载运算会较快。特别而言,加载指令(亦即,会从内存中读取且不是弹出运算,会存取堆栈数据的指令)所请求的数据(如本地子例程变量)可能位于堆栈高速缓存的顶端项目(entry)中;因此,若虚拟加载地址命中顶端项目,则很有可能顶端项目高速缓存线会包含请求的数据。在一实施例中,堆栈高速缓存中的顶端二个项目,或顶端三个项目,或其它小数目的顶端项目会具有用于推测式加载的进行比较的虚拟地址。


图1是根据本发明的一管线式微处理器的方框图;图2是绘示根据本发明的图1的堆栈高速缓存的方框图;图3是绘示根据本发明的图1的堆栈高速缓存的额外组件的方框图;图4是绘示根据本发明的图1的L1数据高速缓存的多任务逻辑的方框图;图5是绘示来自于根据本发明的图1的堆栈高速缓存的快速弹出运算的流程图;图6是绘示根据本发明的图1的堆栈高速缓存的推入运算的流程图;图7是绘示图1所示的微处理器相对应于加入到堆栈指示器指令的运作的流程图;图8是绘示根据本发明的图1的堆栈高速缓存的加载运算的流程图;图9是绘示根据本发明的图1的L1数据高速缓存的储存运算的流程图;图10是绘示来自于根据本发明的图1的堆栈高速缓存的图5的快速弹出运算的时序的时序图;图11是绘示来自于根据本发明的图8的堆栈高速缓存运算的推测式加载的时序的时序图;图12是绘示来自于根据本发明的图8的堆栈高速缓存运算的正常(亦即,非推测式)加载的时序的时序图;图13是绘示来自于根据本发明的图8的非堆栈高速缓存运算的加载的时序的时序图;图14是根据本发明的一管线式微处理器的方框图;图15是绘示根据本发明的图14的L1数据高速缓存的方框图;
图16是绘示来自于根据本发明的图15的数据高速缓存的快速弹出运算的流程图;图17是绘示根据本发明的图15的数据高速缓存的推入运算的流程图;图18是绘示响应于根据本发明的堆栈指针器指令的相加的图14的微处理器的运算的流程图;以及图19是绘示来自于根据本发明的图15的数据高速缓存运算的图16的快速弹出运算的时序的时序图。
其中,附图标记说明如下100,1400管线式微处理器 102指令高速缓存104指令提取器 106指令转译器108指令排程器 112寄存器文件114执行单元 116写回阶段118总线接口单元 122非堆栈高速缓存124堆栈高速缓存 126数据高速缓存128微码内存 134微指令136,138总线142操作数152堆栈指针寄存器 202高速缓存状态204地址标签 206一高速缓存线的数据212sc_write_MESI信号214sc write_tag信号216sc_write_data信号222sc_MESI[15:0]信号224sc_tag[15:0]信号 226sc_data[15:0]信号232push_sc信号 234pop_sc信号302,1502控制逻辑 304算术单元306地址产生器 308转译旁视缓冲器(TLB)312、314比较器316、318、326、402、404、406、408、412、1512、1526、1528多任务器322fp_offset寄存器 324写回线缓冲器334虚拟地址 336实际地址338writeback_request信号342push_instr信号
344pop_instr信号 346load_instr信号348store_instr信号352add_sp_instr信号364PA_match
信号366非sc_hit信号368控制信号 372输出382相加信号 384减少信号386增加信号 388下溢信号389sc_hit信号391spec_sc_load_mux_sel信号 392溢位信号393normal_sc_load_mux_sel信号 394add_sp_val信号395L1_mux_sel信号 396fp_offset信号397allocate_fill_buffer信号 398fp_data399例外信号 422,428高速缓存线424,426输出 432输出数据1402L1数据高速缓存1504储存组件数组1506行译码电路1508检查逻辑1514,1532顶端项目1516fp_row堆栈1524路选择产生器 1534fp_way堆栈1542read[N-1:0]信号 1544fp_check信号1546实际地址标签 1548索引,或行选择部分1552行信号1554new_row信号1556fp_row信号1558pop_row信号1562push_row信号 1564fast_pop信号1572cache_hit信号 1574标签1576MESI状态的有效位 1578normal_way_select信号1582new_way信号 1584fp_way1586pop_way信号 1588push_way信号1592信号 1594内容1596控制输入
具体实施例方式
大体上来说,本发明是利用程序通常会将系统内存分离成二个区域堆栈区及非堆栈区。非堆栈区一般称为堆积(heap)。堆栈与堆积之间的主要差异为堆积以随机存取的方式来存取;然而,堆栈一般是以后进先出(LIFO)的方式来存取。堆栈与堆积之间的另一种差别为读取或写入指令,用来指定读取或写入的位置的地址的方式。读取或写入堆积的指令一般会明确地指定内存地址。反之,读取或写入堆栈的指令一般会经由微处理器中的特别寄存器(一般称为堆栈指针寄存器),而隐含地指定内存地址。推入指令会借助推进堆栈的数据的大小,来更新堆栈指针寄存器,然后会将来自于微处理器的寄存器的数据储存于更新的堆栈指针寄存器中所储存的内存中的地址。例如,在x86的架构中,推入指令(如推入(PUSH)、呼叫(CALL)、或进入(ENTER)指令)会借助推入的数据的大小(例如,若数据为双字组,则为4个字节),而使堆栈指针寄存器减少,然后会将数据存入位于更新的堆栈指针寄存器中所指定的地址的堆栈。反之,弹出指令会读取位于堆栈指针寄存器中所储存的地址的数据,将数据加载微处理器中的寄存器,然后会借助弹出堆栈的数据的大小,来更新堆栈指针寄存器。例如,在x86的架构中,弹出指令(如弹出(POP)、返回(RET)、或离开(LEAVE)指令)会借助弹出堆栈的数据的大小,而使堆栈指针寄存器增加。因此,传统上而言,根据其LIFO特性,当将数据推进堆栈时,堆栈会向上增加(亦即,内存地址会减少),而同样地,当将数据弹出堆栈时,会向下减少(亦即,内存地址会增加)。因此,堆栈指针寄存器中所储存的值称为堆栈的顶端。
堆栈为配置内存空间的便利机制。典型程序中的堆栈的主要功用之一是将副例程参数,以及呼叫例程的返回地址推入堆栈。呼叫的副例程借助将返回地址弹出堆栈,而进入微处理器的程序计数器,而返回呼叫例程,然后呼叫例程会将参数弹出堆栈,而使堆栈恢复其预先呼叫的情况。此种概念的极有用特性是可促进巢状式副例程呼叫。
在此所述的快速弹出运算利用推入与弹出指令之间通常具有一对一的相应关系。亦即,当执行弹出指令时,弹出堆栈的数据一般是先前借助对应的推入指令所推进堆栈的数据。
在本发明中,弹出指令为一种将来自于内存的数据移入微处理器(如移入微处理器的寄存器文件中的寄存器)的指令,并且在此指令中,会隐含地指定,而不会明确地指定数据的内存位置。特别而言,弹出数据的内存位置地址基于微处理器的堆栈指针寄存器中所储存的值而隐含着。X86架构的处理器中的弹出指令的例子是弹出(POP)、返回(RET)、以及离开(LEAVE)指令,其来源操作数隐含地指定与堆栈指针寄存器值有关,而其目的操作数会指定处理器寄存器文件中的寄存器。
在本发明中,加载指令为一种将来自于内存的数据移入微处理器(如移入微处理器的寄存器文件中的寄存器)的非弹出指令。亦即,加载指令会明确地指定来源数据的内存地址,或至少会明确地指定一寄存器或一组寄存器,用以指定来源数据的内存地址。X86架构的处理器中的加载指令的一例是移动(MOV)指令,其来源操作数会指定内存位置,而其目的操作数会指定处理器寄存器文件中的寄存器。
在本发明中,推入指令为一种将数据从微处理器(如从微处理器的寄存器文件中的寄存器)移到内存的指令,并且在此指令中,会隐含地指定,而不会明确地指定数据的内存位置。特别而言,推入数据的内存位置地址基于微处理器的堆栈指针寄存器中所储存的值而隐含着。X86架构处理器的推入指令的例子是推入(PUSH)、呼叫(CALL)、以及进入(ENTER)指令,其目的操作数隐含地指定与堆栈指针寄存器值有关,而其来源操作数会指定处理器寄存器文件中的寄存器。
在本发明中,储存指令为一种将数据从微处理器移到内存(如从微处理器的寄存器文件中的寄存器移到内存)的非推入指令。亦即,储存指令会明确地指定目的数据的内存地址,或至少会明确地指定一寄存器或一组寄存器,用以指定目的数据的内存地址。X86架构的处理器中的储存指令的一例是移动(MOV)指令,其来源操作数会指定处理器寄存器文件中的寄存器,而其目的操作数会指定内存位置。
现在参照图1,其显示根据本发明的管线式微处理器100的方框图。在一实施例中,微处理器100包括指令集实质上符合x86架构指令集的微处理器。特别而言,指令集尤其是包括x86的弹出、推入、呼叫、返回、进入、以及离开指令。此外,指令集包括从内存中加载数据,以及将数据储存于内存的指令。如x86的移动指令。然而,本发明不受限于x86架构的处理器,或x86指令集。
微处理器100包括寄存器文件112。寄存器文件112包括数个寄存器,用以储存微处理器100的操作数及状态信息。在一实施例中,寄存器文件112包括一般用途寄存器、地址区段寄存器、索引寄存器、状态与控制寄存器、以及指令指针,或程序计数寄存器。在一实施例中,寄存器文件112包括至少一个x86架构的微处理器的使用者可见寄存器组。特别而言,寄存器文件112包括堆栈指针寄存器152,用以储存系统内存中的堆栈的顶端。在一实施例中,堆栈指针寄存器152实质上与x86的ESP寄存器类似。
微处理器100包括指令高速缓存102,用以高速缓存指令字节的高速缓存线。在一实施例中,指令高速缓存102包括第一阶(L1)高速缓存。指令高速缓存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核心,用以执行微指令。在一实施例中,指令转译器106会产生每个指令的指针,以显示微指令系从其中进行转译的指令(称为宏指令)是否为推入、弹出、加载、或储存。
微处理器100还包括指令排程器(scheduler)108,其耦接至指令转译器106。指令排程器108会接收来自于指令转译器106的转译微指令,并且会将微指令134传送到执行单元114,其用以执行微指令。
执行单元114会接收来自于指令排程器108及操作数142(如来自于寄存器文件112的堆栈指针寄存器152的推入指令数据或值)的微指令134,并且会执行微指令134。在一实施例中,执行单元114包括整数单元、浮点单元、MMX单元、SSE单元、分支单元、加载单元、以及储存单元。加载单元会执行将来自于系统内存的数据加载到微处理器100的指令,包括弹出指令。储存单元会执行包括推入指令的指令(亦即,用以将数据从微处理器100存入系统内存的指令)。
微处理器100还包括写回阶段116,其耦接至执行单元114。写回阶段116会接收借助执行单元114所执行的指令的结果,并且会将结果(如弹出指令数据)写回到寄存器文件112。
微处理器100还包括数据高速缓存126,其经由总线136而耦接至总线接口单元118,以及经由总线138而耦接至执行单元114。在一实施例中,数据高速缓存126为L1数据高速缓存。数据高速缓存126包括堆栈高速缓存124及非堆栈高速缓存122。总线接口单元118会将来自于系统内存的数据提取到数据高速缓存126,并且会将数据从数据高速缓存126写入系统内存。特别而言,总线接口单元118会将来自于堆栈高速缓存124及非堆栈高速缓存122的高速缓存线写回到系统内存,并且会读取来自于系统内存的高速缓存线,而写入到堆栈高速缓存124及非堆栈高速缓存122的配置项目。更特别而言,总线接口单元118会转移由系统内存堆栈与堆栈高速缓存124之间的推入及弹出指令所指定的数据。
在一实施例中,非堆栈高速缓存122实质上包括传统的L1数据高速缓存。亦即,非堆栈高速缓存122包括设计用以促进随机分布的系统内存地址的存取时间一致的传统的L1数据高速缓存。在一实施例中,非堆栈高速缓存122包括4向组合结合式(4-way set associate)高速缓存。然而,储存单元会在推入与非推入指令数据之间进行区别,以决定是否将数据存入堆栈高速缓存124或非堆栈高速缓存122。储存单元会将推入指令存入堆栈高速缓存124,而不会存入非堆栈高速缓存122,并且会将非推入指令数据(亦即,储存指令数据)存入非堆栈高速缓存122。在这方面,非堆栈高速缓存122与传统高速缓存不同。堆栈高速缓存124会配合图2进行详细地说明。
在一实施例中,微处理器100还包括第二阶(L2)高速缓存,用以协助L1指令高速缓存102及L1数据高速缓存126。特别而言,L2高速缓存用来当作从数据高速缓存126(非堆栈高速缓存122及堆栈高速缓存124)移出的高速缓存线的牺牲(victim)高速缓存,并且L1数据高速缓存126会充满L2高速缓存的高速缓存线。
现在参照图2,所显示的是绘示根据本发明的图1的堆栈高速缓存124的方框图。堆栈高速缓存124包括配置用来当作堆栈,或LIFO内存的数个储存组件。堆栈高速缓存124为堆栈或LIFO内存的事实并不会与系统内存中所包含的堆栈产生混淆,其顶端由堆栈指针寄存器152中的值所指定。更确切地说,堆栈高速缓存124会高速缓存系统内存堆栈的数据。
图2的实施例包括称为0到15的十六个储存组件,或项目。顶端项目称为项目0,而底部项目称为项目15。然而,本发明不受限于堆栈高速缓存124中的特定数目的项目。每个项目包括用于一高速缓存线的数据206的储存空间、高速缓存线的地址标签标签204、以及高速缓存线的高速缓存状态202。在一实施例中,高速缓存状态202包括实质上会符合熟知的MESI(修改、独有、分享、无效)高速缓存一致状态值的状态。在一实施例中,高速缓存线206包括64个字节的数据。在一实施例中,标签204包括高速缓存线206的实际地址。
在一实施例中,标签204包括独特地识别高速缓存线206所需的高速缓存线206实际地址的较高有效位。在一实施例中,微处理器100包括内存分页系统,用以将虚拟内存地址转译成实际内存地址,而标签204还包括高速缓存线206的虚拟地址。在一实施例中,虚拟地址包括杂凑(hash)的虚拟地址位,以降低储存虚拟地址所需的空间量。使用标签204的虚拟地址部份,来执行来自于堆栈高速缓存124的推测式加载会于底下进行详细地说明。
堆栈高速缓存124会接收经由sc_write_MESI信号212而存入顶端项目的MESI字段202的新高速缓存状态。堆栈高速缓存124会接收经由sc_write_tag信号214而存入顶端项目的标签字段204的新标签。堆栈高速缓存124会接收经由sc_write_data信号216而存入顶端项目的数据域位206的新高速缓存线。堆栈高速缓存124还会接收来自于图3的控制逻辑302之push_sc信号232。当控制逻辑302使push_sc信号232使能为真值时,堆栈高速缓存124会向下移位一个项目(亦即,底部项目会移出堆栈高速缓存124),并且其它项目中的每一个会立即接收位于其上的项目的值,以及会将sc_write_MESI 212、sc_write_tag 214、以及sc_write_data 216的值写入堆栈高速缓存124的顶端项目。在一实施例中,堆栈高速缓存124的高速缓存线206的每个双字组会经由sc_write_data信号216,而各自地写入,双字组(dword或double-word)包括四个字节。可包含堆栈高速缓存124的高速缓存线206的每个字组(2个字节),或每个字节会经由sc_write_data信号216,而各自地写入的其它实施例。
堆栈高速缓存124会产生其十六个项目中的每一个的MESI状态202而成为sc_MESI[15:0]信号222。堆栈高速缓存124会产生其十六个项目中的每一个的标签204而成为sc_tag[15:0]信号224。堆栈高速缓存124会产生其十六个项目中的每一个的高速缓存线数据206而成为sc_data[15:0]信号226。顶端项目的高速缓存线206会产生sc_data
,顶端项目的下一个的高速缓存线206会产生sc_data[1],向下以此类推,底部项目的高速缓存线206会产生sc_data[15]。标签204及MESI状态202以类似的方式产生。堆栈高速缓存124还会接收来自于图3的控制逻辑302的pop_sc信号234。当控制逻辑302使pop_sc信号234使能时,堆栈高速缓存124会向上移位一个项目(亦即,顶部项目会移出堆栈高速缓存124),并且其它项目中的每一个会立即接收位于其下的项目的值。在一实施例中,当将项目弹出堆栈高速缓存124时(亦即,pop_sc信号234为真时),堆栈高速缓存124的底部项目的MESI状态202会更新为无效的值。堆栈高速缓存124的所有项目的MESI状态202会初始化为无效的值。
现在参照图3,所显示是根据本发明的图1的堆栈高速缓存124中的额外组件的方框图。堆栈高速缓存124包括控制逻辑302。
控制逻辑302会从图1的执行单元114的储存单元中,接收push_instr信号342。真值的push_instr信号342表示储存单元响应于从图1的指令排程器108中所接收到的推入指令,而正请求将数据存入图1的数据高速缓存126。
控制逻辑302还会从执行单元114的加载单元中,接收pop_instr信号344。真值的pop_instr信号344表示加载单元响应于从指令排程器108中所接收到的弹出指令,而正请求加载来自于数据高速缓存126的数据。
控制逻辑302还会从执行单元114的加载单元中,接收load_instr信号346。真值的load_instr信号346表示加载单元响应于从指令排程器108中所接收到的加载指令,而正请求加载来自于数据高速缓存126的数据。
控制逻辑302还会从执行单元114的储存单元中,接收store_instr信号348。真值的store_instr信号348表示储存单元响应于从指令排程器108中所接收到的储存指令,而正请求将数据存入数据高速缓存126。
控制逻辑302还会从执行单元114的整数单元中,接收add_sp_instr信号352。真值的add_sp_instr信号352表示整数单元正通知数据高速缓存126,已从指令排程器108中,接收到相加的堆栈指针器指令(如x86相加(ADD)指令)。在一实施例中,相加宏指令(如ADD ESP,imm指令)会将立即值加到堆栈指针寄存器。
堆栈高速缓存124还包括地址产生器306。地址产生器306会从图1的寄存器文件112中,接收操作数(如基础值、偏移量、以及内存描述符号值),并且会基于接收到的值而产生虚拟地址334。虚拟地址334为用以存取内存的指令(如推入、弹出、加载、或储存指令)的虚拟内存地址。在加载指令的情况中,虚拟地址334为加载数据的虚拟来源地址。在储存指令的情况中,虚拟地址334为储存数据的虚拟目的地址。在弹出指令的情况中,虚拟地址334为弹出数据的虚拟来源地址。在推入指令的情况中,虚拟地址334为推入数据的虚拟目的地址。在一实施例中,地址产生器306系包含于加载及储存单元中的每一个之中。
堆栈高速缓存124还包括转译旁视缓冲器(translation lookaside buffer,简称TLB)308,其耦接至地址产生器306。TLB 308会高速缓存用来将虚拟地址334转译成实际地址336的分页表信息。在一实施例中,只有实际地址336的较高部份会由TLB 308来转译,而实际地址336的较低部份只是对应于虚拟地址334的较低部份。在一实施例中,最小的分页大小为4KB;因此,不会转译实际地址336的较低的12个地址位。
堆栈高速缓存124还包括二个比较器312,其耦接至地址产生器306。比较器312中的每一个会接收虚拟地址334。比较器312中的一个会接收图2的sc_tag
信号224的虚拟地址部份,而另一个比较器312会接收sc_tag[1]信号224的虚拟地址部份。亦即,二个比较器312会接收堆栈高速缓存124的顶端二个项目的2的标签204的各自的虚拟地址部份,并且会将各自的虚拟sc_tag 224与虚拟地址334进行比较。若虚拟sc_tag
224与虚拟地址334匹配,则第一比较器3 12会使VA_match
信号362(其会传送到控制逻辑302)产生真值。同样地,若虚拟sc_tag[1]224与虚拟地址334匹配,则第二比较器312会使VA_match[1]信号362(其也会传送到控制逻辑302)产生真值。控制逻辑302还会从堆栈高速缓存124中,接收图2的sc_MESI[15:0]信号222。控制逻辑302会使用VA_match[1:0]信号362及sc MESI[1:0]信号222,来决定虚拟地址334是否命中堆栈高速缓存124的顶端二个项目中任一个,以执行来自于堆栈高速缓存124的推测式加载,如底下详细地说明。亦即,控制逻辑302会使用VA_match[1:0]信号362及sc_MESI[1:0]信号222,来决定虚拟地址334是否与虚拟sc_tag[1:0]224中的任一个的虚拟地址部份中的有效一个匹配。在虚拟标签204为杂凑的虚拟地址位的实施例中,在送到比较器312之前,会杂凑虚拟地址334。
要注意的是,虽然图3的实施例叙述检查堆栈高速缓存124的顶端二个项目,来决定是否可从此执行推测式加载,但是可包含检查超过二个顶端项目的其它实施例,以及可包含检查唯一一个顶端项目的另一实施例。检查所包含的数据项量愈大,检测执行快速加载的能力的可能性愈大。因此,高速缓存线大小愈大,需检查的项目数目愈小。图3的实施例可提供128个字节的检查。
堆栈高速缓存124还包括十六个比较器314,其耦接至TLB 308。比较器314中的每一个会接收实际地址336。比较器314中的每一个也会接收sc_tag[15:0]信号224中的各自一个。亦即,比较器314会接收各自的sc_tag信号224上的标签204的各自的实际地址部份,并且会将其与实际地址336进行比较。若实际sc_tag
224与实际地址336匹配,则第一比较器314会使PA_match
信号364(其会传送到控制逻辑302)产生真值;若实际sc_tag[1]224与实际地址336匹配,则第二比较器314会使PA_match[1]信号364(其也会传送到控制逻辑302)产生真值;十六个比较器314中的每一个可以此类推。控制逻辑302会使用PA_match[15:0]信号364及sc_MESI[15:0]信号222,来决定实际地址336是否命中堆栈高速缓存124的项目中的任一个,以执行来自于堆栈高速缓存124的加载,并且用以决定推测式弹出或加载是否正确或错误推测地送出其数据,如底下详细地说明。亦即,控制逻辑302会使用PA_match[15:0]信号364及sc_MESI[15:0]信号222,来决定实际地址336是否与sc_tag[15:0]224的实际地址部份中的有效一个匹配。
控制逻辑302还会产生sc_hit信号389(其会传送到执行单元114的加载及储存单元),以显示弹出、推入、加载、或储存指令所意谓的高速缓存线至少会推测式地存在于堆栈高速缓存124中。在弹出指令的情况中,在确认弹出来源地址命中堆栈高速缓存124之前,控制逻辑302会响应于真值的pop_instr信号344,而推测式地产生真值的sc_hit信号389,如底下配合图5的说明。在推入指令的情况中,若sc_MESI[15:0]222及PA_match[15:0]364显示实际地址336与堆栈高速缓存124中的有效实际地址标签匹配,或者是若堆栈高速缓存124配置由实际地址336所意含的高速缓存线,则控制逻辑302会产生真值的sc_hit信号389,如底下配合图6的说明。在加载指令的情况中,若sc_MESI[1:0]222及VA_match[1:0]362显示虚拟地址334与堆栈高速缓存124的顶端项目中的一个中的有效虚拟地址标签匹配,则控制逻辑302会推测式地产生真值的sc_hit信号389,或者是若sc_MESI[15:0]222及PA_match[15:0]364显示实际地址336与堆栈高速缓存124中的有效实际地址标签匹配,则其会非推测式地产生真值的sc_hit信号389,如底下配合图8的说明。在储存指令的情况中,若sc_MESI[15:0]222及PA_match[15:0]364系显示实际地址336与堆栈高速缓存124中的有效实际地址标签匹配,则控制逻辑302会非推测式地产生真值的sc_hit信号389,如底下配合图9的说明。
控制逻辑302还会从图1的非堆栈高速缓存122中,接收非sc_hit信号366。若实际地址336命中非堆栈高速缓存122,则非sc_hit信号366为真。控制逻辑302还会产生图2的push_sc信号232及pop_sc信号234,其运作已于其中进行说明。
堆栈高速缓存124还包括fp_offset寄存器322,其耦接至控制逻辑302,用以储存称为fp offset的值。寄存器322会输出其值为fp_offset信号396,其会传送到控制逻辑302。fp_offset 322的值用来执行来自于堆栈高速缓存124的快速弹出运算,如底下详细地说明。如将从底下其余图式(特别是图5到7的流程图)的研读中所了解的,fp_offset 322会指定由最新近推入指令所指定的数据的堆栈高速缓存124的顶端项目中所储存的高速缓存线内的位置。亦即,fp_offset 322会指定尚未弹出主存储器中的堆栈的推入指令的数据位置。在一实施例中,fp_offset 322包括四个位的值,用以指定堆栈高速缓存124的顶端项目中所储存的高速缓存线206中的十六个双字组其中之一的偏移量。控制逻辑302会监视堆栈指针器指令的弹出、推入、以及相加,以预先考虑堆栈指针寄存器152的变化,并且用以使fp_offset 322的值与堆栈指针寄存器152的位[5:2]保持一致。在一实施例中,当执行单元114的加载、储存、或整数单元系表示已各自产生堆栈指针器指令的弹出、推入、或相加时,控制逻辑302会更新fp_offset 322。在一实施例中,控制逻辑302不需等待由写回阶段116来更新堆栈指针寄存器152,就可以更新fp_offset322。借助做此,堆栈指针器的推入、相加之接下来的弹出指令,或其它弹出指令不必延迟等待写回阶段116来更新堆栈指针器152,就可使用堆栈指针器152的预期值,然后可从堆栈指针寄存器152中,得到写回位[5:2]。
堆栈高速缓存124还包括十六个输入的多任务器318,其耦接至fp_offset寄存器322。在一实施例中,多任务器318包括十六个输入,每个系用以接收sc_data
信号226的十六个双字组中的各自一个。当执行快速弹出运算时,多任务器318会接收当作选择输入的fp_offset信号396,以选择sc_data
的十六个双字组中的一个,而输出fp_data 398信号,而会传送到弹出指令。
堆栈高速缓存124还包括算术单元304,其耦接至控制逻辑302。算术单元304会接收fp_offset信号396。
算术单元304还会接收来自于控制逻辑302的减少信号384。若控制逻辑302产生真值的减少信号384,则算术单元304会使fp_offset信号396所接收到的值减少,并且会使输出372的值减少。若减少运算导致下溢(underflow),则算术单元304会产生真值的下溢信号388,其会传送到控制逻辑302。
算术单元304还会接收来自于控制逻辑302的增加信号386。若控制逻辑302产生真值的增加信号386,则算术单元304会使fp_offset信号396所接收到的值增加,并且会使输出372的值增加。若增加运算导致溢位,则算术单元304会产生真值的溢位信号392,其会传送到控制逻辑302。
算术单元304还会接收来自于控制逻辑302的相加信号382。若控制逻辑302产生真值的相加信号382,则算术单元304会将fp_offset信号396所接收到的值相加,并且会使输出372的值产生总和。若相加导致溢位,则算术单元304会产生真值的溢位信号392。在一实施例中,add_sp_val信号394系由图1的执行单元114中的整数单元所产生。add_sp_val信号394所产生的值为借助将一值与堆栈指针器1 52相加的指令所指定的值。
堆栈高速缓存124还包括二个输入的多任务器3 1 6,其耦接至fp_offset寄存器322。多任务器316的输出耦接至fp_offset寄存器322的输入。多任务器316的一输入会接收算术单元的输出372。多任务器316的另一输入会接收堆栈指针寄存器152的输出的位[5:2]。多任务器316会从控制逻辑302中,接收当作选择输入的控制信号368,以选择其输入中的一个,而输出到fp_offset寄存器322。
堆栈高速缓存124还包括十六个输入的多任务器326,其耦接至控制逻辑302。多任务器326的十六个输入中的每一个会接收位于十六个各自的sc_data[15:0]信号226上的堆栈高速缓存124的十六个高速缓存线206中的各自一个。多任务器326会选择借助控制逻辑302所产生的writeback_mux_sel信号328所指定的十六个sc_data[15:0]信号226中的一个。多任务器326的输出用来当作写回线缓冲器324的输入。写回线缓冲器324的输出位于图1的总线136至总线接口单元118上。控制逻辑302还会产生writeback_request信号338,其也会传送到总线接口单元118。写回线缓冲器324及writeback request信号338用来写回从堆栈高速缓存124到系统内存的高速缓存线,如底下所述。
控制逻辑302还会产生真值的allocate fill buffer信号397,以配置用以将高速缓存线提取到系统内存,或从微处理器100的另一个高速缓存(如堆栈高速缓存124或L2高速缓存)中,提取高速缓存线的填满缓冲器,如底下所述。
控制逻辑302还会产生真值的例外信号399,以表示已发生例外情况,而使微处理器100分支到微码内存128中的例外处理器,如底下所述。
控制逻辑302还会产生spec_sc_load_mux_sel信号391、normal_sc_load_mux_sel信号393、以及L1_mux_sel信号395,其全部特别会配合图4,而于底下进行说明。
现在参照图4,所显示的是绘示根据本发明的图1的L1数据高速缓存126中的多任务逻辑。数据高速缓存126包括四个输入的多任务器402,其输出位于图1的总线138上。特别而言,多任务器402的输出138会将弹出及加载数据传送到图1的执行单元114中的加载单元。
多任务器402的第一输入会接收来自于图1的非堆栈高速缓存122的输出数据432,以提供来自于非堆栈高速缓存122的加载的数据。多任务器402的第二输入会接收十六个输入的多任务器404的输出424,以提供来自于堆栈高速缓存124的推测式加载的数据。多任务器402的第三输入会接收第二个十六个输入的多任务器406的输出426,以提供来自于堆栈高速缓存124的正常,或非推测式加载的数据。多任务器402的第四输入会接收图3的fp_data信号398,以提供快速弹出运算的数据。
多任务器404会从二个输入的多任务器412的输出中,接收高速缓存线422的十六个双字组。多任务器404会基于图3的实际地址336的位[5:2]的选择输入,来选择高速缓存线422的十六个双字组其中一。
多任务器406会从十六个输入的多任务器408的输出中,接收高速缓存线428的十六个双字组。多任务器406会基于实际地址336的位[5:2]的选择输入,来选择高速缓存线428的十六个双字组其中一。
多任务器412的二个输入会经由sc_data[1:0]信号226,来接收堆栈高速缓存124的顶端二个项目的高速缓存线。多任务器412会基于图3的spec_sc_load_mux_sel信号391,来选择二条高速缓存线sc_data[1:0]226其中一,而输出信号422,其控制逻辑302基于load_instr信号346、VA_match[1:0]信号362、以及sc_MESI[1:0]信号222的值而产生,如底下所述。
多任务器408的十六个输入中的各自一个会经由sc_data[15:0]信号226,来接收堆栈高速缓存124的十六个项目的高速缓存线。多任务器408会基于图3的nomal_sc_load_mux_sel信号393,来选择十六条高速缓存线sc_data[15:0]226其中一,而输出信号428,其控制逻辑302系基于load_instr信号346、PA_match[15:0]信号364、以及sc_MESI[15:0]信号222之值而产生,如底下所述。
现在参照图5,所显示的是绘示根据本发明的来自于图1的堆栈高速缓存124的快速弹出运算的流程图。流程会从方框502开始。
在方框502,图1的指令解译器106会将弹出指令译码,以及图1的指令排程器108会将弹出指令传送到图1的执行单元114中的加载单元。响应时,加载单元会使图3的pop_instr信号344产生真值。流程会继续进行方框504。
方框504,多任务器31基于目前储存于图3的fp_offset寄存器322中的值,来选择位于fp_data信号398上,来自于堆栈高速缓存124的顶端项目中的高速缓存线sc_data
226的适当双字组。响应于真值的pop_instr信号344,图3的控制逻辑302会使图3的L1_mux_sel信号395产生一值,而使图4的多任务器402选择图3的fp_data 398,其会经由总线138而传送到执行单元114中的加载单元,而传送到弹出指令,其写回阶段116接下来会加载到弹出指令中所指定的图1的寄存器文件112中的寄存器其中之一。例如,若弹出指令为x86返回(RET)指令,则会将弹出数据加载到寄存器文件112的指令指针寄存器中。例如,若弹出指令为x86弹出(POP)指令,则会将弹出数据加载到弹出指令中所指定的寄存器文件112的寄存器中。如可从图5中观察得知,会将数据推测式地传送到加载单元。因为此运算尚未确认弹出指令的来源地址(其接下来将在方框516,在实际地址336产生)与从堆栈高速缓存124的顶端项目传送到加载单元的弹出数据的地址相同,所以其为推测式。再者,响应于真值的pop_instr信号344,控制逻辑302会使图3的sc_hit信号389(其会传送到执行单元114中的加载单元)产生真值。流程会继续进行方框506。
在方框506,控制逻辑302会产生真值的增加信号386,以及算术单元304会响应地增加fp_offset 396,并且会使输出372的值增加,其控制逻辑302会导致多任务器316经由控制信号368,来进行选择,而加载到图3的fp_offset寄存器322。流程会继续进行判断方框508。
在判断方框508,控制逻辑302会检查溢位信号392,以判断在方框506所执行的增加运算是否会造成fp_offset 322的溢位。亦即,控制逻辑302会判断弹出运算是否将会造成堆栈指针器152覆盖下个高速缓存线。若如此,则流程会继续进行方框512;否则,流程会继续进行方框514。
在方框512,控制逻辑302会产生真值的pop_sc信号234,而使顶端项目弹出堆栈高速缓存124。因为顶端项目中所储存的高速缓存线中所储存的高速缓存取线中的最后双字组现在正借助弹出指令而弹出系统内存堆栈,所以将顶端项目弹出堆栈高速缓存124,可使堆栈高速缓存124与系统内存高速缓存保持一致。在一实施例中,方框512直到已执行方框518(底下会进行说明),才会执行,以致于实际地址336会与数据会于方框504期间,从其中产生之项目的sc_tag
224值进行比较。在一实施例中,会储存方框504所使用的sc_tag
224值,其接下来会用于方框518。虽然已叙述fp_offset 322系保持为双字组偏移量,以容纳双字组的推入及弹出指令的一实施例,但是可包含容纳其它的推入及弹出数据大小(如字组、字节、或四字符组)的其它实施例。流程会继续进行方框514。
在方框514,地址产生器306会计算弹出指令的图3的来源虚拟地址334。流程会继续进行方框516。
在方框516,TLB 308会产生弹出指令的图3的来源实际地址336。流程会继续进行方框518。
在方框518,图3的比较器314其中之一会将方框516所产生的实际地址336,与图2的实际sc_tag
224进行比较,而产生图3的PA_match
信号364。流程会继续进行判断方框522。
在判断方框522,控制逻辑302会检查图2的sc_MESI
信号222,以及PA_match
信号364,以判断堆栈高速缓存124的顶端项目是否有效,以及弹出指令的来源实际地址336是否与顶端堆栈高速缓存124项目的实际标签204匹配,亦即,实际地址336是否会命中堆栈高速缓存124的顶端项目。在一实施例中,实际地址336的位[5:2]也会与用来选择位于fp_data 398上的双字组的fp_offset 396的值进行比较,以确认已产生正确的双字组。若弹出指令来源地址336命中堆栈高速缓存124的顶端项目,流程会结束(亦即,推测式快速弹出运算会产生正确的弹出数据)。否则,流程会继续进行方框524。
在方框524,控制逻辑302会产生真值的例外信号399,而使微处理器100分支到例外处理器,用以处理推测式快速弹出运算产生不正确的弹出数据的情况。在一实施例中,例外处理器会刷新堆栈高速缓存124,并且将堆栈指针寄存器152的位[5:2]的目前值加载到fp_offset寄存器322。例外处理器会将正确数据传送到弹出指令。在一实施例中,刷新堆栈高速缓存124包括写回到系统内存,或堆栈高速缓存124至系统内存的L2高速缓存的任何有效高速缓存线。流程会在方框524结束。
如可观察得知,以及如将配合图10,而于底下进行更详细地说明,配合图5所述的快速弹出运算使传送到弹出指令的弹出数据,可比使用弹出指令与加载指令之间并无区别的传统高速缓存快多个频率周期。
现在参照图6,所显示的是绘示根据本发明的图1的堆栈高速缓存124的推入运算的流程图。流程会从方框602开始。
在方框602,图1的指令解译器106会将推入指令译码,以及图1的指令排程器108会将推入指令传送到图1的执行单元114中的储存单元。响应时,储存单元会使图3的push_instr信号342产生真值。流程会继续进行方框604。
在方框604,控制逻辑302会产生真值的减少信号384,以及算术单元304会响应地减少fp_offset 396,并且会使输出372的值减少,其控制逻辑302会导致多任务器316经由控制信号368,来进行选择,而加载到图3的fp_offset寄存器322。此外,响应于真值的push_instr信号342,控制逻辑302会产生真值的sc_hit信号389,其会传送到执行单元114中的储存单元。流程会继续进行方框606。
在方框606,地址产生器306会计算推入指令的图3的目的虚拟地址334。流程会继续进行方框608。
在方框608,TLB308会产生推入指令的图3的目的实际地址336。流程会继续进行方框612。
在方框612,图3的比较器314其中之一会将方框516所产生的实际地址336,与图2的实际sc_tag
224进行比较,而产生图3的PA_match
信号364。流程会继续进行判断方框614。
在判断方框614,控制逻辑302会检查图2的sc_MESI
信号322,以及PA_match
信号364,以判断堆栈高速缓存124的顶端项目是否有效,以及推入指令的目的实际地址336是否与顶端堆栈高速缓存124项目的实际标签204匹配,亦即,实际地址336是否会命中堆栈高速缓存124的顶端项目。若如此,流程会继续进行方框616。否则,流程会继续进行判断方框618。在一实施例中,若实际地址336命中除了顶端项目之外的堆栈高速缓存124的一项目,则在将有效项目写回到系统内存之后,会刷新堆栈高速缓存124,然后流程会继续进行方框616。
在方框616,推入数据经由sc_write_data信号216而存入堆栈高速缓存124的顶端项目,而成为借助实际地址336的地址位[5:2]所表示的高速缓存线206的双字组偏移量。若需要的话,顶端项目的MESI状态202会经由sc_write_MESI信号212来更新,如更新为修改的值。推入数据从由推入指令所指定的寄存器文件112的寄存器中获得。例如,若推入指令为x86呼叫(CALL)指令,则推入数据为从寄存器文件112的指令指针寄存器中所计算的下个循序指令指针器。例如,若推入指令为x86进入(ENTER)指令,则推入数据为寄存器文件112的x86 EBP寄存器中的值。例如,若推入指令为x86推入(PUSH)指令,则推入数据为推入指令中所指定的寄存器文件112中的寄存器。流程会在方框616结束。
在判断方框618,因为推入数据的目的地址未命中堆栈高速缓存124,所以对于由推入目的地址336所意含的高速缓存线而言,必须配置堆栈高速缓存124中的新项目(称为顶端项目)。因为将会使堆栈高速缓存124向下移位,以配置新高速缓存线的顶端项目,所以底部项目需移出堆栈高速缓存124。因此,控制逻辑302会检查sc_MESI[15]222,以判断底部堆栈高速缓存124项目是否有效。若如此,则流程会继续进行方框622;否则,流程会继续进行方框624。
在方框622,控制逻辑302借助使writeback_mux_select信号328产生一值,来安排底部堆栈高速缓存124项目的写回,而使多任务器326选择sc_data[15]226(亦即,底部堆栈高速缓存124项目的高速缓存线),其会传送到写回线缓冲器324,然后会产生真值的writeback_request信号338,来请求图1的总线接口单元118,而将高速缓存线写回至L2高速缓存的系统内存。流程会继续进行方框624。
在方框624,控制逻辑302会使push_sc信号322使能,而使堆栈高速缓存124向下移位一个项目,并且分别会经由sc_write_data信号216、sc_write_tag信号214、以及sc_write MESI信号212而将推入数据、其标签、以及MESI状态存入堆栈高速缓存124中。流程会继续进行方框626。
在方框626,控制逻辑302会配置充满缓冲器,而产生借助推入指令的目的地址336所意含的高速缓存线的堆栈高速缓存124的所有权,并且会提取意含的高速缓存线。在一实施例中,方框626包括窥视(snooping)非堆栈高速缓存122及L2高速缓存,以及若意含的高速缓存线系存在于其它二个高速缓存的任一个中,则意含的高速缓存线会从非堆栈高速缓存122或L2高速缓存中获得。流程会继续进行方框628。
在方框628,意含的高速缓存线系收入方框626所配置的充满缓冲器中,并且高速缓存线数据会与方框624,存于其中的推入数据合并,而成为堆栈高速缓存124的顶端项目。流程会在方框628结束。
现在参照图7,所显示的是绘示响应于根据本发明的堆栈指针器指令的相加的图1的微处理器100的运算的流程图。如以上所述,快速弹出运算利用在大部份的通用程序中,推入指令与弹出指令之间有一对一的对应关系。亦即,每个推入指令最终会接着对应的弹出指令。然而,考虑子例程参数的通过时,此规则会有一个显著的例外,现在将配合x86指令来进行说明。
例如,在C语言中,功能参数会传到系统内存堆栈。会执行一串推入指令(每个参数对应一个推入指令),而将参数推入堆栈。例如,在呼叫接收五个4个字节参数的函数之前,呼叫函数会执行五个推入指令,而将五个参数推入堆栈。然后呼叫函数会执行呼叫指令,其会将返回地址推入堆栈,并且使控制转移到子例程。子例程执行的最后指令为返回(RET)指令,其会使返回地址弹出堆栈。呼叫例程现在必须要求恢复由参数所占据的堆栈的空间。一种选择是执行一串五个弹出指令,以在将参数推入堆栈之前,使堆栈指针器恢复其值。然而,因为呼叫函数不需要参数,所以大部份的编译器只会执行相加指令,而将参数所占据的空间大小加回到堆栈指针器。亦即,除了执行五个弹出指令之外,编译器会产生较快且较小的单一相加指令。在以上的例子中,呼叫例程会将20加到堆栈指针器。这是推入及弹出指令未匹配的最普遍次序。因此,在一实施例中,快速弹出装置系有助于将一值相加到堆栈指针器的指令译码,于是会更新fp_offset 322的值。流程会从方框702开始。
在方框702,图1的指令转译器106会将目的为图1的堆栈指针寄存器152的相加指令译码,并且图1的指令排程器108会将相加指令传送到图1的执行单元114中的整数单元。响应时,整数单元会使图3的add_sp_instr信号352产生真值。流程会继续进行方框704。
在方框704,控制逻辑302会产生真值的相加信号382,以及算术单元304会响应地将add_sp_val 394加到fp_offset 396,并且会使输出372产生总和,其控制逻辑302会导致多任务器316经由控制信号368,来进行选择,而加载到图3的fp_offset寄存器322。流程会继续进行判断方框706。
在判断方框706,控制逻辑302会检查溢位信号392,以判断在方框704所执行的相加运算是否会造成fp_offset 322的溢位。亦即,控制逻辑302会判断相加指令是否将会造成堆栈指针器152覆盖另一高速缓存线。在方框706,溢位情况为相加造成堆栈指针器152不再参考堆栈高速缓存124的顶端项目中所储存的高速缓存线的情况。特别而言,若相加造成溢位,则堆栈指针器152通常会参考内存地址紧邻且大于堆栈高速缓存124的顶端项目中所储存的高速缓存线的内存地址的高速缓存线。因此,堆栈高速缓存124必须使存在于顶端项目中的正确高速缓存线依序弹出。在一实施例中,控制逻辑302可容纳溢位超过一条高速缓存线的堆栈指针器152的相加。在此实施例中,底下之从方框708的堆栈高速缓存124弹出的项目的数目N系计算如下,假设高速缓存线大小为64个字节N=(fp_offset+add_sp_val)/64因此,若N大于1,则溢位已发生。若溢位情况发生,则流程会继续进行方框708;否则流程会结束。
在方框708,控制逻辑302会产生真值的pop_sc信号234,以使顶端项目弹出堆栈高速缓存124。然而,首先控制逻辑302会判断存于顶端项目中的高速缓存线是否有效,而若如此,会安排将有效高速缓存线写回到系统内存或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开始。
在典型的程序中,系统内存堆栈的另一种主要使用是配置堆栈上的子程序本地变量(local variable)的空间。子程序借助本地变量所配置的空间量而使堆栈指针器降低,来配置堆栈上的空间。然后,本地变量借助如与堆栈指针器有关的偏移量所计算的地址的加载指令来进行存取。因此,很有可能加载数据与最新近推入的数据位于相同的高速缓存线。此外,很有可能子例程将会执行加载指令,来存取借助呼叫例程而推入堆栈的参数。很有可能推入的参数将会跨越二条高速缓存线,亦即,推入指令其中之一会造成覆盖到下条高速缓存线,如配合图6的方框618到628所述。因此,某些参数将位于堆栈高速缓存124的顶端项目的下一个(而不是顶端项目,或甚至是紧邻顶端项目的下一个诸如此类)的高速缓存线中。因此,在一实施例中,来自于堆栈高速缓存124的推测式加载运算利用检查堆栈高速缓存124,以知道加载数据是否存在于顶端二个项目中的此事实。借助直接检查顶端二个项目,可避免传统高速缓存的行译码运算,藉此可节省频率周期。
此外,在一实施例中,推测式加载可借助使用加载指令虚拟地址334,而不是实际地址336,来执行标签比较,以知道加载数据是否存在于顶端二个项目中,而节省额外的频率周期。若虚拟地址与顶端二个项目其中之一匹配,则虽然由于虚拟别名的可能性而不确定,但是很有可能加载数据存在于命中项目中。在微处理器100的一实施例中,堆栈高速缓存124使推测式加载运算推测式地产生不正确数据的原因是操作系统工作切换(其会更新内存分页信息),藉此会产生错误的虚拟地址匹配。在一实施例中,特别是在使用堆栈地址区段寄存器(如x86架构中的SS寄存器)的微处理器100中,举例而言,堆栈高速缓存124使推测式加载运算推测式地产生不正确数据的原因是更新堆栈区段寄存器(其会影响有效地址计算),藉此可能产生错误的虚拟地址匹配。
虽然图8叙述检查堆栈高速缓存124中的顶端二个项目来当作执行推测式加载运算的候选者的一实施例,但是推测式加载运算并不受限于检查特定数目的顶端堆栈高速缓存124项目,并且可包含借助来自于堆栈高速缓存124的推测式加载运算来检查之堆栈高速缓存124中的各种数目的项目的各种实施例。
在方框802,图1的指令转译器106会将加载指令译码,并且图1的指令排程器108会将加载指令传送到图1的执行单元114中的加载单元。响应时,加载单元会使图3的load_instr信号346产生真直。流程会继续进行方框804。
在方框804,地址产生器306会计算加载指令的图3的来源虚拟地址334。流程会继续进行方框806。
在方框806,图3的二个比较器312会将方框804所产生的虚拟地址334与图2的虚拟sc_tag[1:0]进行比较,而产生图3的VA_match[1:0]信号362。流程会继续进行判断方框808。
在判断方框808,图3的控制逻辑302会检查图2的sc_MESI[1:0]信号222及VA_match[1:0]信号362,以判断堆栈高速缓存124的顶端二个项目中的任一个是否有效,以及加载指令的来源虚拟地址334是否与顶端二个堆栈高速缓存124项目的标签204的虚拟部份匹配,亦即,虚拟地址334是否命中堆栈高速缓存124的顶端二个项目。若如此,流程会继续进行方框812。否则,流程会继续进行图8的方框824。
在方框812,响应于真值的load_instr信号346,控制逻辑302会使spec_sc_load_mux_sel信号391产生一值,而使多任务器412选择位于图4的信号422上的堆栈高速缓存124的二条高速缓存线sc_data[1:0]226中的一个,其在判断方框808判断出具有与加载指令的来源虚拟地址334匹配的有效虚拟标签204。此外,多任务器404会从借助位于图4的信号424上的实际地址[5:2]所指定的高速缓存线422中,选择双字组。另外,控制逻辑302会使图3的L1_mux_sel信号395产生一值,而使图4的多任务器402选择会经由总线138而传送到执行单元114中的加载单元,而传送到加载指令的输入424,其写回阶段116接下来会加载到加载指令中所指定的图1的寄存器文件112中的寄存器其中之一。如可从图8A中观察得知,传送到加载单元的数据为推测式。因为此运算尚未确认加载指令(其接下来将于方框814的实际地址336产生)的来源实际地址,与从堆栈高速缓存124的二个顶端项目中的一个传送到加载单元的加载数据的地址相同,所以此运算为推测式。响应于方框808的虚拟地址334命中堆栈高速缓存124中的顶端二个项目的检测,控制逻辑302会产生真值的sc_hit信号389,其会传送到执行单元114中的加载单元。流程会继续进行方框814。
在方框814,TLB 308会产生加载指令的来源实际地址336。流程会继续进行方框816。
在方框816,图3的比较器314中的二个会将方框814所产生的实际地址336,与从其中,加载数据会推测式地于方框812产生的实际sc_tag[1:0]224进行比较,而产生图3的各自的PA_match[1:0]信号364。流程会继续进行判断方框818。
在判断方框818,控制逻辑302会检查从其中,加载数据会推测式地于方框812产生之对应于堆栈高速缓存124的此项目的PA_match[1:0]信号364,来判断加载指令的来源实际地址336是否与此项目的实际标签204匹配;亦即,实际地址336是否命中此项目。若加载指令来源地址336命中堆栈高速缓存124的推测式项目,则流程会结束,亦即,推测式加载运算会产生正确的弹出数据。否则,流程会继续进行方框822。
在方框822,控制逻辑302会产生真值的例外信号399,而使微处理器100分支到用以处理推测式加载运算产生不正确加载数据的情况的例外处理器。例外处理器会使正确数据传送到加载指令。在一实施例中,例外处理器会从非堆栈高速缓存122或系统内存或L2高速缓存中,加载正确数据。流程会于方框822结束。
如可观察得知,以及如将于底下配合图11的更详细地讨论,配合图8A所述的来自于堆栈高速缓存124的推测式加载运算使传送到加载指令的加载数据能比传统高速缓存可能快多个频率周期。
在图8B的方框824,TLB 308会产生加载指令的来源实际地址336。流程会继续进行方框826。
在方框826,图3的比较器314会将方框824所产生的实际地址336,与十六个堆栈高速缓存124项目中的每一个的实际sc_tag[15:0]进行比较,而产生PA_match[15:0]信号364。流程会继续进行判断方框828。
在判断方框828,控制逻辑302会检查sc_MESI[15:0]信号222及PA_match[15:0]信号364,来判断堆栈高速缓存124项目中的任一个是否有效,以及加载指令的来源实际地址336是否与有效堆栈高速缓存124项目的实际标签204匹配,亦即,实际地址336是否命中堆栈高速缓存124。若加载指令来源地址336命中堆栈高速缓存124,则流程会继续进行方框832;否则,流程会继续进行图8C的方框834。
在方框832,响应于真值的load_instr信号346,以及响应加载指令的来源虚拟地址334未命中堆栈高速缓存124的顶端二个项目,以及响应于加载指令来源地址336命中堆栈高速缓存124,控制逻辑302会使normal_sc_load_mux_sel信号393产生一值,而使多任务器408选择位于图4的信号428上的堆栈高速缓存124的十六条高速缓存线sc_data[15:0]中的一个,其在判断方框828判断出具有与加载指令的来源实际地址336匹配的有效实际标签204。此外,多任务器406会从借助位于图4的信号426上的实际地址[5:2]所指定的高速缓存线428中,选择双字组。另外,控制逻辑302会使L1_mux_sel信号395产生一值,而使多任务器402选择会经由总线138而传送到执行单元114中的加载单元,而传送到加载指令的输入426,其写回阶段116接下来会加载到加载指令中所指定的图1的寄存器文件112中的寄存器其中之一。响应于方框828的实际地址336命中堆栈高速缓存124的检测,控制逻辑302会产生真值的sc_hit信号389,其会传送到执行单元114中的加载单元。流程会在方框832结束。
如可观察得知,以及如将于底下配合图12的更详细地讨论,配合图8B所述的来自于堆栈高速缓存124的正常加载运算使传送到加载指令的加载数据能比传统高速缓存(如非堆栈高速缓存122)可能至少快一个频率周期。
在图8C的方框834中,非堆栈高速缓存122会接收图8B的方框824所产生的实际地址336的索引部份,并且会响应地执行索引的行译码,以选择非堆栈高速缓存122中的一行,或一组路(way)。流程会继续进行方框836。
在方框836,非堆栈高速缓存122会将方框824所产生的实际地址336中的上方,或标签部份,与方框834所选择的此组中的每路的实际地址标签进行比较。流程会继续进行判断方框838。
在判断方框838,非堆栈高速缓存122会检查方框836与选择路的有效位的比较结果,以判断加载实际地址336是否命中非堆栈高速缓存122。若如此,流程会继续进行方框842;否则,流程会继续进行方框844。
在方框842,非堆栈高速缓存122会从实际地址336命中的非堆栈高速缓存122的项目中,产生加载数据。流程会在方框842结束。
在方框844,回应于判断方框838判断加载实际地址336未命中非堆栈高速缓存122,非堆栈高速缓存122会配置一项目于其中,用以加载由加载指令的实际地址336所意含的失误高速缓存线。流程会继续进行方框846。
在方框846,非堆栈高速缓存122会将来自于系统内存或L2高速缓存的失误高速缓存线提取到方框844所配置的非堆栈高速缓存122中的项目。流程会继续进行方框848。
在方框848,非堆栈高速缓存122会从方框846所提取的高速缓存线中,产生加载数据。流程会在方框848结束。
在一实施例中,图8C的方框834到848根据传统的高速缓存技术来执行。亦即,图8C绘示来自于传统非堆栈高速缓存122的传统加载,其在加载地址336未命中堆栈高速缓存124的事件中执行。
现在参照图9,所显示的是绘示根据本发明的图1的L1高速缓存126的储存运算的流程图。流程会从方框902开始。
在方框902,图1的指令解译器106会将储存指令译码,并且图1的指令排程器108会将储存指令传送到图1的执行单元114中的储存单元。响应时,储存单元会使图3的store_instr信号348产生真值。流程会继续进行方框904。
在方框904,地址产生器306会计算储存指令的图3的目的虚拟地址334。流程会继续进行方框906。
在方框906,TIB 308会产生储存指令的图3的目的实际地址336。流程会继续进行方框908。
在方框908,图3的比较器314会将方框906所产生的实际地址336,与十六个堆栈高速缓存124项目中的每一个的实际sc_tag[15:0]进行比较,而产生PA_match[15:0]信号364。流程会继续进行判断方框912。
在判断方框912,控制逻辑302会检查sc_MESI[15:0]信号222及PA_match[15:0]信号364,来判断堆栈高速缓存124项目中的任一个是否有效,以及储存指令的目的实际地址336是否与有效堆栈高速缓存124项目的实际标签204匹配,亦即,实际地址336是否命中堆栈高速缓存124。若储存指令目的地址336命中堆栈高速缓存124,则流程会继续进行方框914;否则,流程会继续进行方框916。
在方框914,储存数据经由sc_write_data信号216而存入判断方框912所决定的堆栈高速缓存124的有效匹配项目,而成为借助实际地址336的地址位[5:2]所表示的高速缓存线206的双字组偏移量。若需要的话,顶端项目的MESI状态202会经由sc_write_MESI信号212来更新,如更新为修改的值。储存数据从由储存指令所指定的寄存器或内存位置中获得。例如,若储存指令为用以指定一般用途寄存器为储存数据的来源的x86移动(MOV)指令,则储存数据位于如MOV指令种的来源操作数所指定的寄存器文件112中的寄存器中。响应于实际地址336命中堆栈高速缓存124的方框912的检测,控制逻辑302会产生真值的sc_hit信号389,其会传送到执行单元114中的储存单元。流程会在方框914结束。
在方框916,方框906所产生的实际地址336的标签部份会与借助实际地址336的索引部份所选择的非堆栈高速缓存122的此组中的每路的实际标签进行比较。流程会继续进行判断方框918。
在判断方框918,控制逻辑302会检查非sc_hit信号366,以判断储存指令的目的实际地址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根据传统的高速缓存技术来执行。亦即,方框902到906,以及方框916到928绘示传统非堆栈高速缓存122的传统储存,其在储存地址336未命中堆栈高速缓存124的事件中执行。
现在参照图10,所显示的是绘示来自于根据本发明的图1的堆栈高速缓存124的图5的快速弹出运算的时序的时序图。图10包括称为1到4的四列,其对应于微处理器100的四个频率周期。图10还包括五行,所标示的每一个表示微处理器100的不同动作或结果。图10的已知列与行的每个矩形为空白,或者是包括字「弹出(pop)」,用以表示当弹出指令向下经过微处理器100管线时,弹出指令的位置。
在频率周期1中,根据图10的第一行,图1的执行单元114中的加载单元系根据图5的方框502,而使图3的pop_instr信号344产生真值,以请求弹出指令的弹出数据。
在频率周期2中,根据第二行,图1的堆栈高速缓存124会从fp_offset 396所指定的顶端项目中的高速缓存线中,将数据传送到弹出指令。特别而言,多任务器318会从位于来自于顶端堆栈高速缓存124项目的sc_data
226上的十六个双字组中,选择由fp_offset 396所指定的双字组398,并且多任务器402会选择fp_data输入398。此外,堆栈高速缓存124会以sc_hit信号389,来表示弹出指令命中加载单元。亦即,堆栈高速缓存124会指示加载单元,弹出指令的数据存在于堆栈高速缓存124中。如配合图5的以上的讨论,因为命中指示sc_hit 389尚未确认弹出指令的来源地址(其将于频率周期3产生)与将会在频率周期3中,从堆栈高速缓存124的顶端项目传送到加载单元的弹出数据的地址相同,所以其为推测式。在一实施例中,表示弹出指令命中加载单元的sc_hit信号389为图2的有效位sc_MESI
222的门(gate),以致于堆栈高速缓存124不会显示弹出指令命中加载单元,除非堆栈高速缓存124中的顶端项目为有效。亦即,虽然在表示弹出命中之前,控制逻辑302不会确认地址匹配,但是会确认堆栈高速缓存124中的顶端项目为有效。
在频率周期2中,根据第三行,地址产生器306根据图5的方框514,来计算图3的虚拟地址334。
在频率周期3中,根据第四行,TLB 308根据图5的方框516,而产生弹出指令的图3的来源实际地址336。
在频率周期4中,根据第五行,控制逻辑302根据图5的方框518到524,来检测堆栈高速缓存124产生不正确弹出数据的情况。
如可借助比较图10与图13而得知(其于底下进行说明),快速弹出运算有助于使L1数据高速缓存126产生弹出指令的数据可比传统高速缓存(其不会在弹出指令与加载指令之间进行区别)快多个频率周期。
在一实施例中,实际地址336的位[5:2]用来选择双字组,而不是fp_offset396,并且在频率周期3,而不是在频率周期2中,会产生数据。
现在参照图11,所显示的是绘示来自于根据本发明的图8的堆栈高速缓存124运算的推测式载入的时序的时序图。图11包括称为1到4的四列,其对应于微处理器100的四个频率周期。图11还包括六行,所标示的每一个表示微处理器100的不同动作或结果。图11的已知列与行的每个矩形为空白,或者是包括字“加载(load)”,用以表示当加载指令向下经过微处理器100管线时,加载指令的位置。
在频率周期1中,根据图11的第一行,图1的执行单元114中的加载单元根据图8的方框802,而使图3的load_instr信号346产生真值,以请求加载指令的加载数据。
在频率周期2中,根据第二行,地址产生器306根据图8的方框804,来计算图3的虚拟地址334。
在频率周期3中,根据第三行,图3的比较器312根据图8的方框806,执行虚拟标签比较,而产生图3的VA_match[1:0]信号362。此外,控制逻辑302根据图8的方框812,基于VA_match[1:0]信号362及图2的sc_MESI[1:0]信号222,而产生图3的spec_sc_load_mux_sel 391。此外,图1的堆栈高速缓存124会经由sc_hit信号389,来表示加载指令命中加载单元。亦即,堆栈高速缓存124会指示加载单元,加载指令的数据存在于堆栈高速缓存124中。如配合图8的以上的讨论,因为命中指示尚未确认加载指令的实际来源地址336(其将于频率周期3产生)与将会在频率周期4中,从堆栈高速缓存124传送到加载单元的加载数据的地址相同,所以其为推测式。
在频率周期3中,根据第四行,TLB 308根据图8的方框814,而产生弹出指令的图3的来源实际地址336。
在频率周期4中,根据第五行,加载数据根据图8的方框812,而传送到加载单元。特别而言,图4的多任务器412会基于spec_sc_load_mux_sel391,而选择二条高速缓存线sc_data[1:0]226其中之一,图4的多任务器404会基于实际地址[5:2]336,来选择适当的双字组,而多任务器402会选择输入424。
在频率周期4中,根据第六行,控制逻辑302根据图8的方框816到822,来检测堆栈高速缓存124产生不正确加载数据的情况。
如可借助比较图11与图13而得知(其于底下进行说明),推测式加载运算有助于使L1数据高速缓存126产生加载指令的数据可比传统高速缓存快多个频率周期。
现在参照图12,所显示的是绘示来自于根据本发明的图8的堆栈高速缓存124运算的正常(亦即,非推测式)加载的时序的时序图。图12包括称为1到5的五列,其对应于微处理器100的五个频率周期。图12还包括五行,所标示的每一个表示微处理器100的不同动作或结果。图12的已知列与行的每个矩形为空白,或者是包括字“加载(load)”,用以表示当加载指令向下经过微处理器100管线时,加载指令的位置。
在频率周期1中,根据图12的第一行,图1的执行单元114中的加载单元系根据图8的方框802,而使图3的load_instr信号346产生真值,以请求加载指令的加载数据。
在频率周期2中,根据第二行,地址产生器306根据图8的方框804,来计算图3的虚拟地址334。
在频率周期3中,根据第三行,TLB 308根据图8的方框824,而产生弹出指令的图3的来源实际地址336。
在频率周期4中,根据第四行,图3的比较器314根据图8的方框826,执行实际标签比较,而产生图3的PA_match[1:0]信号364。此外,控制逻辑302根据图8的方框832,基于PA_match[1:0]信号364及图2的sc_MESI[15:0]信号222,而产生图3的normal_sc_load_mux_sel 393。此外,图1的堆栈高速缓存124会经由sc_hit信号389,来表示加载指令命中加载单元。
在频率周期5中,根据第五行,加载数据根据图8的方框832,而传送到加载单元。特别而言,图4的多任务器408会基于normal_sc_load_mux_sel393,而选择十六条高速缓存线sc_data[15:0]226其中之一,图4的多任务器406会基于实际地址[5:2]336,来选择适当的双字组,而多任务器402会选择输入426。
如可借助比较图12与图13而得知(其于底下进行说明),正常加载运算有助于使L1数据高速缓存126产生加载指令的数据可比传统高速缓存快。
现在参照图13,所显示的是绘示来自于根据本发明的图8的非堆栈高速缓存122运算的加载的时序的时序图。图13包括称为1到6的六列,其对应于微处理器100的六个频率周期。图13还包括六行,所标示的每一个表示微处理器100的不同动作或结果。图13的已知列与行的每个矩形为空白,或者是包括字“加载(load)”,用以表示当加载指令向下经过微处理器100管线时,加载指令的位置。
在频率周期1中,根据图13的第一行,图1的执行单元114中的加载单元根据图8的方框802,而使图3的load_instr信号346产生真值,以请求加载指令的加载数据。
在频率周期2中,根据第二行,地址产生器306根据图8的方框804,来计算图3的虚拟地址334。
在频率周期3中,根据第三行,TLB 308根据图8的方框824,而产生弹出指令的图3的来源实际地址336。
在频率周期4中,根据第四行,非堆栈高速缓存122基于实际地址336的索引部份,来执行传统的行译码,并且会从行译码的结果所指定的此组的每路中,读取数据。
在频率周期5中,根据第五行,非堆栈高速缓存122会执行实际地址336的标签部份,与选择组的每路的标签的实际标签比较。基于标签比较及每路的有效位,非堆栈高速缓存122会产生路选择信号,来选择匹配有效路。
在频率周期6中,根据第六行,非堆栈高速缓存122会选择由路选择所指定的高速缓存线,并且会基于实际地址336的较低位,而选择所选择的高速缓存线的适当双字组。
配合图10到13的时序图要注意的是,可包含所述的各种功能(如地址比较及多任务)会分成不同频率周期的其它实施例,并且快速弹出、推测式加载、正常加载、以及来自于非堆栈高速缓存122的加载不受限于所显示的特定的实施例。
如可从先前的说明中观察得知,具有不同的堆栈高速缓存124及非堆栈高速缓存122的优点是此配置比不能在堆栈与非堆栈存取之间进行区别的传统单一高速缓存,可有效地增加L1数据高速缓存126的大小,而不会增加L1数据高速缓存126的存取时间。再者,借助不污染具有堆栈数据的非堆栈高速缓存122,非堆栈高速缓存122的效率会超过相关于一程序所存取的全部数据的相同大小的传统高速缓存。此外,堆栈高速缓存124系借助了解由于堆栈存取的LIFO特性,所以弹出指令所请求的数据因为很有可能是堆栈高速缓存124的最新近推入,或最新的数据而很有可能位于堆栈高速缓存124的顶端,而有助于使大部份的弹出指令的存取更快。因此,在判断弹出地址是否真正命中堆栈高速缓存124之前,堆栈高速缓存124会推测式地产生弹出数据。再者,堆栈高速缓存124借助了解由于堆栈存取的LIFO特性,所以加载数据很有可能位于高速缓存线中,或接近堆栈高速缓存124的顶端的线,而有助于使大部份的加载指令的存取更快。因此,堆栈高速缓存124基于在执行实际地址比较之前的虚拟地址比较,以明确地判断出加载数据存在,而从顶端堆栈高速缓存项目的其中之一中,产生加载数据。在大部份的情况中,这使堆栈高速缓存124比最先执行实际地址比较时,能更快产生加载数据,这是因为将虚拟地址转译成实际地址需要额外的时间。最后,若加载虚拟地址未命中顶端堆栈高速缓存124项目,以致于加载数据不能推测式地传送到加载指令,则当加载实际地址命中堆栈高速缓存124时,堆栈高速缓存124会产生加载数据。若加载实际地址未命中堆栈高速缓存124时,非堆栈高速缓存122会产生加载数据。因此,从堆栈高速缓存124中,读取数据所需的延迟时间是可变的,而且较多的可预测存取需要很少的频率周期。延迟一方面会取决于读取堆栈高速缓存124的指令的型式而变化。延迟另一方面会取决于堆栈高速缓存124内所请求的数据的位置而变化。
现在参照图14,所显示的是绘示根据本发明的管线式微处理器1400的方框图。微处理器1400与图1的微处理器100类似,除了微处理器1400包括不包含堆栈高速缓存124的L1数据高速缓存1402之外。图14的L1数据高速缓存1402包括传统L1数据高速缓存,其具有用以执行来自于L1数据高速缓存1402的快速弹出运算的装置,如底下所述。
现在参照图15,所显示的是绘示根据本发明的图14的L1数据高速缓存1402的方框图。图15的许多组件及功能与图3的组件类似,并且类似的组件的标号相对应。特别而言,数据高速缓存1402包括地址产生器306,其用以接收操作数332及产生虚拟地址334;TLB 308,其用以接收虚拟地址334及产生实际地址336;算术单元304,其用以接收相加信号382、减少信号384、以及增加信号386,并且会产生下溢信号388,以及溢位信号392;以及多任务器316、多任务器318、fp_offset寄存器322、add_sp_val信号394、堆栈指针寄存器位[5:2]152、输出信号372、以及fp_offset信号396,其功能与配合图3所述的相似标号组件类似,除了底下所述的差异之外。数据高速缓存1402还包括控制逻辑1502,其在某些方面,与图3的控制逻辑302类似。控制逻辑1502会接收push_instr信号342、pop_instr信号344、以及add_sp_instr信号352,与图3的控制逻辑302类似。控制逻辑1502会产生多任务选择信号368,与图3的控制逻辑302类似。控制逻辑1502会响应于不正确的快速弹出运算的检测,而产生例外信号399,与图3的相似标号的信号类似,除了底下所述的差异之外。
数据高速缓存1402还包括储存组件数组1504,用以储存数条高速缓存线、每条高速缓存线的地址标签、以及每条高速缓存线的高速缓存状态(如MESI状态)。在图15的实施例中,储存组件数组1504配置为具有N行,或组(set),以及四列,或路(way)。亦即,数据高速缓存1402配置为四路组相联式(way set associative)高速缓存。然而,本发明不受限于特定数目的路的高速缓存。在一实施例中,储存组件数组1504中所储存的高速缓存线的大小包括64个字节。
数据高速缓存1402还包括行译码电路1506。行译码器1506会接收行信号1552,其用以指定储存组件数组1504的N行其中之一。行译码器1506会使由行信号1552所指定的数个read[N-1:0]信号1542其中之一产生真值。响应时,储存组件数组1504会输出由read[N-1:0]信号1542所指定的行的内容1594。亦即,所选择的行的每路的高速缓存线数据、标签、以及MESI状态会经由信号1594来输出。在图15的实施例中,包括十六个双字组的四条高速缓存线,以及其对应的标签1574,以及MESI状态的有效位1576会经由信号1594来输出。
数据高速缓存1402还包括四个输入的多任务器1528,其耦接至储存组件数组1504。多任务器1528的四个输入中的每一个会接收储存组件数组1504所输出的各自的四条高速缓存线1594其中之一。多任务器1528会基于控制输入1596,选择高速缓存线其中之一,而输出信号1592。所选择的高速缓存线1592会传送到多任务器318,其会基于fp_offset信号396,而在总线138上,产生双字组。
数据高速缓存1402还包括由控制逻辑1502所产生的fast_pop信号1564。控制逻辑1502会响应真值的pop_instr信号344,而产生真值的fast_pop信号1564,而使数据高速缓存1402执行fast_pop运算。
数据高速缓存1402还包括第一堆栈的储存组件,或项目(称为fp_row堆栈1516),其耦接至控制逻辑1502。fp_row堆栈1516包括数个储存组件,每一个用以储存用以辨识储存组件数组1504中的一行的一值。在一实施例中,fp_row堆栈1516的每个组件会储存log2N位,其中N为储存组件数组1504的行的数目。fp_row堆栈1516中的数个储存组件配置为堆栈,或LIFO,其包括顶端项目1514,其借助控制逻辑1502,而储存位于new_row信号1554上的最新近推入的行值。亦即,new_row信号1554会指定储存组件数组1504内的行,其用以储存包含最新近推入指令的数据的高速缓存线,如底下配合图17的详细地说明。有帮助的是,储存包含最新近推入数据的行使数据高速缓存1402能执行如底下所述的快速弹出运算。fp_row堆栈1516还会从控制逻辑1502中,接收push_row信号1562。当控制逻辑1502使push_row信号1562使能为真值时,fp_row堆栈1516会向下移位一个项目(亦即,底部项目会移出fp_row堆栈1516且其它项目中的每一个会立即接收位于其上的项目的值),并且new_row_1554上的值会写入fp_row堆栈1516的顶端项目。fp_row堆栈1516还会从控制逻辑1502中,接收pop_row信号1558。当控制逻辑1502使pop_row信号1558使能为真值时,fp_row堆栈1516会向上移位一个项目(亦即,顶端项目会移出fp_row堆栈1516且其它项目中的每一个会立即接收位于其下的项目的值)。
数据高速缓存1402还包括二个输入的多任务器1512,其耦接至fp_row堆栈1516。在一输入上,多任务器1512会接收fp_row堆栈1516的顶端项目1514的值,称为fp_row 1556。在另一输入上,多任务器1512会从TLB 308中,接收实际地址336的索引,或行选择部分1548。在一实施例中,索引1548包括实际地址336的较低地址位。若fast_pop信号1564为真,则多任务器1512会选择fp_row信号1556,而输出会传送到行译码器1506的行信号1552;否则,多任务器1512会选择索引1548,而输出行信号1552。
数据高速缓存1402还包括第二堆栈的储存组件,或项目(称为fp_way堆栈1534),其耦接至控制逻辑1502。fp_way堆栈1534包括数个储存组件,每一个用以储存用以辨识储存组件数组1504中的一路的一值。在图15的一实施例中,fp_way堆栈1534的每个组件会储存2个位,用以指定储存组件数组1504的四路其中之一。fp_way堆栈1 534中的数个储存组件配置为堆栈,或LIFO,其包括顶端项目1532,其借助控制逻辑1502,而储存位于new_way信号1582上的最新近推入的路值。亦即,new_way信号1582会指定由new_row信号1554所指定的储存组件数组1504的行内的路,其用以储存包含最新近推入指令的数据的高速缓存线,如底下配合图17的详细地说明。有帮助的是,储存包含最新近推入数据的路使数据高速缓存1402能执行如底下所述的快速弹出运算。fp_way堆栈1534还会从控制逻辑1502中,接收push_way信号1588。当控制逻辑1502使push_way信号1588使能为真值时,fp_way堆栈1534会向下移位一个项目(亦即,底部项目会移出fp_way堆栈1534且其它项目中的每一个会立即接收位于其上的项目的值),并且new_way 1582上的值会写入fp_way堆栈1534的顶端项目1532。fp_way堆栈1534还会从控制逻辑1502中,接收pop_way信号1586。当控制逻辑1502使pop_way信号1586使能为真值时,fp_way堆栈1534会向上移位一个项目(亦即,顶端项目会移出fp_way堆栈1534且其它项目中的每一个会立即接收位于其下的项目的值)。
在一实施例中,fp_row堆栈1516及fp_way堆栈1534包含于每个会储存行/路对的储存组件的单一堆栈中。
数据高速缓存1402还包括二个输入的多任务器1526,其耦接至fp_way堆栈1534。在一输入上,多任务器1526会接收fp_way堆栈1534的顶端项目1532的值,称为fp_way 1584。在另一输入上,多任务器1526会接收normal_way_select信号1578。若fast_pop信号1564为真,则多任务器1526会选择fp_way信号1584,而输出会传送到行译码器1528的多任务选择信号1596;否则,多任务器1526会选择normal_way_select信号1578,而输出多任务选择信号1596。
在一实施例中,fp_way堆栈1534及fp_row堆栈1516包括有效位,并且fast_pop信号1564为顶端项目1514及顶端项目1532的及(AND)逻辑的门。亦即,虽然控制逻辑1502不会在执行快速弹出之前,确认弹出来源地址,但是在执行快速弹出运算之前,会确认fp_row堆栈1516中的顶端项目1514为有效,以及fp_way堆栈1534中的顶端项目1532为有效。在此实施例中,每次弹出fp_row堆栈1516及fp_way堆栈1534时,向上移位之后的底部项目会具有设定为伪的有效位。
数据高速缓存1402还包括路选择产生器1524,其耦接至控制逻辑1502。路选择产生器1524会从储存组件数组1504的选择的行中,接收每一个地址标签1574及有效位1576。路选择产生器1524还会从TLB 308中,接收实际地址336的地址标签部分1546。路选择产生器1524包括实际地址标签1546(如弹出、推入、加载、或储存指令),而且每个标签1574借助储存组件数组1504来输出。若标签1574其中之一与实际地址标签1546匹配,并且其对应的有效位1576表示标签1574为有效,则路选择产生器1524会产生会传送到控制逻辑1502的真值的cache_hit信号1572。此外,路选择产生器1524会经由normal_way_select信号1578(其会传送到控制逻辑1502及多任务器1526),而产生有效匹配路(亦即,命中储存组件数组1504的行)的值。
数据高速缓存1402还包括检查逻辑1508,其耦接至储存组件数组1504。检查逻辑1508会接收实际地址336、fast_pop信号1564、fp_row信号1556、fp_way信号1584、标签1574、有效位1576、以及fp_offset信号396。检查逻辑1508会进行检查,以判断在快速弹出运算期间,推测式地传送到弹出指令的数据是否为正确数据。检查逻辑1508会判断分别由fp_row 1556及fp_way 1584所产生的正确的行及路值是否在快速弹出运算的期间,会用来选择储存组件数组1504中的正确高速缓存线,而产生正确的弹出数据。在一实施例中,检查逻辑1508会将快速弹出运算中所使用的fp_row 1556的值,与借助快速弹出运算中的fp_way 1584所指定的路的标签1574进行比较。在一实施例中,检查逻辑1508还会将快速弹出运算中所使用的fp_row 1556值,与实际地址336的对应位进行比较。在一实施例中,检查逻辑1508还会将快速弹出运算中所使用的fp_offset 396的值,与实际地址336的对应位进行比较。检查逻辑1508还会确认借助fp_way 1584所指定的路的有效位1576表示快速弹出运算中所存取的高速缓存线为有效高速缓存线。若高速缓存线不为有效,或未存取正确高速缓存线,则检查逻辑1508会产生伪值的fp_check信号1544,其会传送到控制逻辑1502。否则,检查逻辑1508会产生真值的fp_check信号1544,其会传送到控制逻辑1502。
现在参照图16,所显示的是绘示根据本发明的来自于图15的数据高速缓存1402的快速弹出运算的流程图。流程会从方框1602开始。
在方框1602,指令解译器106会将弹出指令译码,以及指令排程器108会将弹出指令传送到图14的执行单元114中的加载单元。响应时,加载单元会使pop_instr信号344产生真值。流程会继续进行方框1604。
在方框1604,响应于真值的pop_instr信号344,控制逻辑1502会产生真值的pop_instr信号1564。因此,多任务器1512会选择fp_row 1556,而经由行信号1552传送到行译码器1506。回应时,行译码器1506会使由fp_row1556所指定的read[N-1:0]信号1542其中之一产生真值。响应时,储存组件数组1504的输出1594会输出真值的read[N-1:0]信号的行。响应于真值的fast_pop信号1564,多任务器1526会选择fp_way输入1584,而用以当作多任务选择信号1596,其会传送到多任务器1528。回应时,多任务器1528会从由fp_way 1584所指定的路中,选择高速缓存线,而输出信号1592。多任务器318会基于目前存于fp_offset寄存器322中的值,而从位于总线138上的多任务器1528所输出的高速缓存线1592中,选择适当的双字组,其会经由总线138而传送到执行单元114中的加载单元,而传送到弹出指令,其写回阶段116接下来会加载到弹出指令中所指定的图14的寄存器文件112中的寄存器其中之一。例如,若弹出指令为x86返回(RET)指令,则会将弹出数据加载到寄存器文件112的指令指针寄存器中。例如,若弹出指令为x86离开(LEAVE)指令,则会将弹出数据加载到寄存器文件112的x86 EP中。例如,若弹出指令为x86弹出(POP)指令,则会将弹出数据加载到弹出指令中所指定的寄存器文件112的寄存器中。如可从图16中观察得知,会将数据推测式地传送到加载单元。因为此运算尚未确认弹出指令的来源地址(其接下来将在方框1616,在实际地址336产生)与从由fp_row 1556及fp_way 1584所指定的储存组件数组1504的项目传送到加载单元的弹出数据的地址相同,所以其为推测式。流程会继续进行方框1606。
在方框1606,控制逻辑1502会产生真值的增加信号386,以及算术单元304会响应地增加fp_offset 396,并且会使输出372的值增加,其控制逻辑1502会导致多任务器316经由控制信号368,来进行选择,而加载到fp_offset寄存器322。流程会继续进行判断方框1608。
在判断方框1608,控制逻辑1502会检查溢位信号392,以判断在方框1606所执行的增加运算是否会造成fp_offset 322的溢位。亦即,控制逻辑1502会判断弹出运算是否将会造成堆栈指针器152覆盖下个高速缓存线。若如此,则流程会继续进行方框1612;否则,流程会继续进行方框1614。
在方框1612,控制逻辑1502会产生真值的pop_row信号1558,而使顶端项目弹出fp_row堆栈1516,并且控制逻辑1502会产生真值的pop_way信号1586,而使顶端项目弹出fp_way堆栈1534。因为借助fp_row堆栈1516的顶端项目1514及fp_way堆栈1534的顶端项目1532所指定的储存组件数组1504的项目中所储存的高速缓存线中的最后双字组现在正借助弹出指令而弹出系统内存堆栈,所以会将顶端项目弹出,以使其与系统内存高速缓存保持一致。在一实施例中,方框1612直到已执行方框1618(底下会进行说明),才会执行。在一实施例中,会储存方框1604所使用的fp_row 1556及fp_way1584值,其接下来会用于方框1618。流程会继续进行方框1614。
在方框1614,地址产生器306会计算弹出指令的来源虚拟地址334。流程会继续进行方框1616。
在方框1616,TLB 308会产生弹出指令的来源实际地址336。流程会继续进行方框1618。
在方框1618,检查逻辑1508会将方框1616所产生的实际地址336的对应部份与由fp_way 1584所选择的标签1574进行比较,以及会将实际地址336的对应部份与fp_row 1556进行比较,以及会将实际地址336的对应部份与fp_offset 396进行比较,并且会检查由fp_way 1584所选择的有效位1576,而产生fp_check信号1544,其会传送到控制逻辑1502。流程会继续进行判断方框1622。
在判断方框1622,控制逻辑1502会检查fp_check信号1544,以判断弹出指令的来源实际地址336是否会命中由fp_row堆栈1516及fp_way堆栈1534的顶端项目所指定的储存组件数组1504的项目。若弹出指令的来源地址336命中由fp_row堆栈1516及fp_way堆栈1534的顶端项目所指定的储存组件数组1504的项目,流程会结束(亦即,推测式快速弹出运算会产生正确的弹出数据)。否则,流程会继续进行方框1624。
在方框1624,控制逻辑1502会产生真值的例外信号399,而使微处理器1400分支到例外处理器,用以处理推测式快速弹出运算产生不正确的弹出数据的情况。例外处理器会使正确数据传送到弹出指令。在一实施例中,例外处理器会刷新fp_row堆栈1516及fp_way堆栈1534,并且会将堆栈指针寄存器152的位[5:2]的目前值加载到fp_offset寄存器322。流程会在方框1624结束。
如可观察得知,以及如将配合图19,而于底下进行更详细地说明,配合图16所述的快速弹出运算使传送到弹出指令的弹出数据,可比无快速弹出装置的传统高速缓存快多个频率周期。
现在参照图17,所显示的是绘示根据本发明的图15的数据高速缓存1402的推入运算的流程图。流程会从方框1702开始。
在方框1702,指令解译器106会将推入指令译码,以及指令排程器108会将推入指令传送到执行单元114中的储存单元。响应时,储存单元会使push instr信号342产生真值。流程会继续进行方框1704。
在方框1704,控制逻辑1502会产生真值的减少信号384,以及算术单元304会响应地减少fp_offset 396,并且会使输出372的值减少,其控制逻辑1502会导致多任务器316经由控制信号368,来进行选择,而加载到fp_offset寄存器322。流程会继续进行判断方框1706。
在判断方框1706,控制逻辑1502会检查下溢信号388,以判断在方框1704之fp_offset 396的减少是否会造成fp_offset 322的下溢。亦即,控制逻辑1502会判断推入运算是否将会造成堆栈指针器152覆盖先前高速缓存线。若如此,则流程会继续进行方框1716;否则,流程会继续进行判断方框1708。
在判断方框1708,控制逻辑1502会检查cache_hit信号1572,以判断推入指令的目的实际地址336是否命中储存组件数组1504。若如此,则流程会继续进行方框1712;否则,流程会继续进行方框1714。
在方框1712,数据高速缓存1402会处理命中数据高速缓存1402的当作正常推入指令的推入指令。亦即,数据高速缓存1402会根据数据高速缓存的技术中所熟知的传统方法,来处理推入指令。因为推入不会覆盖先前高速缓存线,所以不需更新fp_row堆栈1516及fp_way堆栈1534;因此,接下来的弹出运算很有可能指定由fp_row堆栈1516的顶端项目1514及fp_way堆栈1534的顶端项目1532所指定的高速缓存线中的数据。流程会在方框1712结束。
在方框1714,控制逻辑1502会产生真值的例外信号399,而使微处理器1400分支到例外处理器,用以更新fp_row堆栈1516及fp_way堆栈1534。在一实施例中,例外处理器会刷新fp_row堆栈1516及fp_way堆栈1534,并且会将堆栈指针寄存器152的位[5:2]的目前值加载到fp_offset寄存器322。流程会继续进行方框1726。
在判断方框1716,控制逻辑1502会检查cache_hit信号1572,以判断推入指令的目的实际地址336是否命中储存组件数组1504。若如此,则流程会继续进行方框1718;否则,流程会继续进行方框1726。
在方框1718,控制逻辑1502会决定命中储存组件数组1504的行及路。此行由索引1548所决定。此路由normal_way_select 1578所决定。控制逻辑1502会经由new_way信号1582,将命中的路传送到fp_way堆栈1534。此外,控制逻辑1502会经由new_row信号1554,将命中的行传送到fp_row堆栈1516。流程会继续进行方框1722。
在方框1722,控制逻辑1502会产生真值的push_row信号1562,而将new_row 1554所产生的值推入fp_row堆栈1516。控制逻辑1502还会产生真值的push_way信号1588,而将new_way 1582所产生的值推入fp_way堆栈1534。流程会继续进行方框1724。
在方框1724,数据高速缓存1402会处理命中数据高速缓存1402的当作正常推入指令的推入指令。亦即,在方框1722,更新fp_row堆栈1516及fp_way堆栈1534之后,数据高速缓存1402会根据数据高速缓存的技术中所熟知的传统方法,来处理推入指令。流程会在方框1724结束。
在方框1726,控制逻辑1502会决定由索引1548所选择的储存组件数组1504的行中的路由现在必须提取到数据高速缓存1402的失误推入地址336所意含的高速缓存线来取代。在一实施例中,控制逻辑1502会选择所选的行的最近最少使用的路。控制逻辑1502会经由new_way信号1582,将取代路传送到fp_way堆栈1534。此外,控制逻辑1502会经由new_row信号1554,将索引1548所指定的行传送到fp_row堆栈1516。流程会继续进行方框1728。
在方框1728,控制逻辑1502会产生真值的push_row信号1562,而将new_row 1554所产生的值推入fp_row堆栈1516。控制逻辑1502还会产生真值的push_way信号1588,而将new_way 1582所产生的值推入fp_way堆栈1534。流程会继续进行方框1732。
在方框1732,数据高速缓存1402会处理未命中数据高速缓存1402的当作正常推入指令的推入指令。亦即,在方框1728,更新fp_row堆栈1516及fp_way堆栈1534之后,数据高速缓存1402会根据数据高速缓存的技术中所熟知的传统方法,来处理推入指令。流程会在方框1732结束。
现在参照图18,所显示的是绘示响应于根据本发明的堆栈指针器指令的相加的图14的微处理器1400的运算的流程图。流程会从图18中的方框1802开始。
在方框1802,指令转译器106会将目的为图14的堆栈指针寄存器152的相加指令译码,并且指令排程器108会将相加指令传送到执行单元114中的整数单元。响应时,整数单元会使add_sp_instr信号352产生真值。流程会继续进行方框1804。
在方框1804,控制逻辑1502会产生真值的相加信号382,以及算术单元304会响应地将add_sp_val 394加到fp_offset 396,并且会使输出372产生总和,其控制逻辑1502会导致多任务器316经由控制信号368,来进行选择,而加载到fp_offset寄存器322。流程会继续进行判断方框1806。
在判断方框1806,控制逻辑1502会检查溢位信号392,以判断在方框1804所执行的相加运算是否会造成fp_offset 322的溢位。亦即,控制逻辑1502会判断相加指令是否将会造成堆栈指针器152覆盖另一高速缓存线。在方框1806,溢位情况为相加造成堆栈指针器152不再参考由fp_row堆栈1516的顶端项目1514及fp_way堆栈1534的顶端项目1532所指定的数据高速缓存1402的项目中所储存的高速缓存线的情况。特别而言,若相加造成溢位,则堆栈指针器152通常会参考内存地址紧邻且大于由fp_row堆栈1516的顶端项目1514及fp_way堆栈1534的顶端项目1532所指定的数据高速缓存1402的项目中所储存的高速缓存线的内存地址的高速缓存线。因此,fp_row堆栈1516及fp_way堆栈1534必须使由fp_row堆栈1516的顶端项目1514及fp_way堆栈1534的顶端项目1532所指定的正确高速缓存线依序弹出。在一实施例中,控制逻辑1502可容纳溢位超过一条高速缓存线的堆栈指针器152的相加。在此实施例中,底下的从方框1808的fp_row堆栈1516及fp_way堆栈1534弹出的项目的数目N系计算如下,假设高速缓存线大小为64个字节N=(fp_offset+add_sp_val)/64因此,若N大于1,则溢位已发生。若溢位情况发生,则流程会继续进行方框1808;否则流程会结束。
在方框1808,控制逻辑1502会产生真值的pop_row信号1558,以使顶端项目弹出fp_row堆栈1516,并且控制逻辑1502会产生真值的pop_way信号1586,以使顶端项目弹出fp_way堆栈1534。如以上配合方框1806所讨论的,在一实施例中,会计算N的值,并且N个项目会从fp_row堆栈1516及fp_way堆栈1534弹出。流程会在方框1808结束。
现在参照图19,所显示的是绘示来自于根据本发明的图15的数据高速缓存1402的图16的快速弹出运算的时序的时序图。图19包括称为1到4的四列,其对应于微处理器1400的四个频率周期。图19还包括六行,所标示的每一个表示微处理器1400的不同动作或结果。图19的已知列与行的每个矩形为空白,或者是包括字“弹出(pop)”,用以表示当弹出指令向下经过微处理器1400管线时,弹出指令的位置。
在频率周期1中,根据图19的第一行,执行单元114中的加载单元根据图16的方框1602,而使pop_instr信号344产生真值,以请求弹出指令的弹出数据。
在频率周期2中,根据第二行,行译码器1506会根据图16的方框1604,将位于fp_row信号1556上的行值解碼,而使read[N-1:0]信号1542其中的一产生真值。响应时,储存组件会根据图16的方框1604,而产生由真值的read[N-1:0]信号1542所选择的行的四路中的每个项目的高速缓存线的标签及状态。
在频率周期2中,根据第三行,地址产生器306根据图16的方框1614,来计算虚拟地址334。
在频率周期3中,根据第四行,根据图16的方框1604,多任务器1528会产生由fp_way 1584所指定的高速缓存线1592,而多任务器318会选择由fp_offset 396所指定的选择的高速缓存线1592的适当双字组。在一实施例中,会产生由实际地址336的较低位[5:2]所指定的选择的高速缓存线1592的适当双字组。
在频率周期3中,根据第五行,TLB 308根据图16的方框1616,而产生弹出指令的来源实际地址336。
在频率周期4中,根据第六行,控制逻辑1502根据图16的方框1618到1624,来检查fp_check 1544,以判断是否已执行不正确推测式地弹出运算。
在一实施例中,对应于图15的数据高速缓存1402的加载指令的时序与对应于图1的非堆栈高速缓存122的加载指令的时序类似;因此,图13描述对应于数据高速缓存1402的加载指令的时序。如可借助比较图19与图13而得知,快速弹出运算有助于使数据高速缓存1402产生弹出指令的数据可比传统高速缓存(其不包括图15的快速弹出装置,并且不会在弹出指令与加载指令之间进行区别)快多个频率周期。
在一实施例中,虚拟地址334的位[5:2]用来选择双字组,而不是fp_offset396。
虽然本发明及其目的、特性及优点已详细地说明,但是本发明可包含其它实施例。例如,堆栈高速缓存或LIFO内存可以各种方式来实施,而达成用来当作后进先出内存的内存。一例的实施例为用来当作循环FIFO内存的寄存器文件,其会保持堆栈指针器的顶端与底部,以决定下次要推入或弹出那个项目,以及堆栈何时已空。再者,虽然实施例已配合堆栈会朝向减少内存地址而成长的x86架构指令来进行说明,但是本发明可实施于具有堆栈会朝向增加内存地址而成长的堆栈存取指令的其它微处理器中。此外,虽然已揭示特定高速缓存线大小的实施例,但是可使用具有各种线大小的高速缓存。
再者,虽然本发明及其目的、特性及优点已详细地说明,但是本发明可包含其它实施例。本发明除了使用硬件来实施之外,本发明也可实施于计算机可使用(例如,可读取)媒体中所包含的计算机可读取码(例如,计算机可读取程序代码,数据等)中。计算机码可使在此所揭示的本发明的功能或制造可行,或者是二者皆可行。例如,这可经由使用一般程序语言(例如,C、C++、JAVA、以及类似的程序语言);GDSII数据库;包括Verilog HDL、VHDL、AlteraHDL(AHDL)等等的硬件描述语言(HDL);或此项技术中可用的其它程序化及/或电路(例如,概图)记录工具来达成。计算机码可置于任何已知的计算机可使用(例如,可读取)介质(包括半导体内存、磁盘、光盘(例如,CD-ROM、DVD-ROM、以及类似之物)、以及如计算机可使用(例如,可读取)传送介质(例如,载波,或包括数字、光学、或运用模拟的媒体的任意其它的媒体)所包含的计算机数据信号中。就本身而言,计算机码可在通讯网路(包括因特网及内部网络)上传输。要了解到的是,本发明可实施于计算机码(例如,如智慧财产权(IP)码(如微处理器码)的部份,或如系统阶层式设计(如系统单芯片(System on Chip,简称SOC)))中,并且会转换成硬件,当作集成电路制造的一部份。再者,本发明可实施为硬件及计算机码的组合。
最后,本领域技术人员应该了解到的是,在不脱离本发明的精神及范围之下,为了进行与本发明相同的目的,其可立即使用揭示的概念及特定的实施例,来当作设计或修改其它的结构的基础。
权利要求
1.一种高速缓存,包括数个储存组件,配置为一后进先出内存,所述储存组件中的顶端一个,用以储存由数个最新近推入指令所指定的一高速缓存线的数据,并且用以储存该高速缓存线的一虚拟地址及一实际地址;一比较器,耦接至该顶端的储存组件,用以将该高速缓存线虚拟地址与由一加载指令所请求的数据之一来源虚拟地址进行比较;以及一输出,耦接至该比较器,在判断由该加载指令所请求的该数据的一来源实际地址是否与该实际高速缓存线地址匹配之前,若该比较器显示该来源虚拟地址与存于该顶端储存组件中的该高速缓存线虚拟地址匹配,则用以表示由该加载指令所请求的该数据存在于该高速缓存中。
2.根据权利要求1所述的高速缓存,其中该来源实际地址及该实际高速缓存线地址中的每一个包括一上方部份的转译地址位,以及一下方部份的未转译地址位。
3.根据权利要求2所述的高速缓存,其中该转译地址位包括一实际内存分页的一地址,其中该未转译地址位包括该实际内存分页内的一偏移量。
4.根据权利要求2所述的高速缓存,其中该来源虚拟地址包括该未转译下方部份的该来源实际地址;以及附加于该未转译下方部份的一上方部份的未转译地址位,并且该上方部份的未转译地址位包括一虚拟内存分页的一地址。
5.根据权利要求2所述的高速缓存,其中该来源虚拟地址及该虚拟高速缓存线地址包括分别是该未转译较低部份的该来源实际地址及该实际高速缓存线地址,其中该来源虚拟地址以及该虚拟高速缓存线地址都还包括附加于该未转译下方部份的一上方部份的堆积未转译地址位。
6.根据权利要求1所述的高速缓存,其中该加载指令包括明确地指定该来源虚拟地址的一指令;以及不会暗示地指定与一堆栈指针寄存器值相关的该来源虚拟地址的一指令。
7.根据权利要求1所述的高速缓存,其中所述推入指令中的每一个包括暗示地指定与一堆栈指针寄存器值相关的存于该高速缓存线中的该数据的一内存地址。
8.根据权利要求1所述的高速缓存,还包括一第二比较器,耦接至所述储存组件,用以将该来源实际地址与该实际高速缓存线地址进行比较;一第二输出,耦接至该第二比较器,用以显示该第一输出不正确地表示由该加载指令所请求的该数据存在于该高速缓存中,如果在该第一输出表示由该加载指令所请求的该数据存在于该高速缓存之后,该第二比较器显示该来源实际地址与该实际高速缓存线地址未匹配;一第二比较器,耦接至所述储存组件,用以将该来源虚拟地址与存于所述储存组件的一紧邻顶端一个中的一高速缓存线的一虚拟地址进行比较,该紧邻顶端储存组件会将数个紧邻最新近推入指令所指定的一高速缓存线的数据储存到所述最新近推入指令;数个比较器,耦接至所述储存组件,用以将该来源实际地址与存于所述储存组件中的数个实际高速缓存线地址进行比较;以及一第二输出,耦接至所述比较器,用以显示由该加载指令所请求的该数据非推测式地存在于该高速缓存中,如果该比较器显示该来源虚拟地址与存于该顶端储存组件中的该高速缓存线虚拟地址未匹配,并且所述比较器显示该来源实际地址与存于所述储存组件中的所述实际高速缓存线地址其中之一匹配。
9.根据权利要求8所述的高速缓存,其中在判断该来源实际地址与存于该紧邻顶端储存组件中的该高速缓存线的该实际高速缓存线地址匹配之前,若该第二比较器表示该来源虚拟地址与存该紧邻顶端储存组件中的该高速缓存线虚拟地址匹配,则该第一输出会显示由该加载指令所请求的该数据存在于该高速缓存中,并且在该输出表示由该加载指令所请求的该数据不存在于该高速缓存中的一第一频率周期之后的一第二频率周期中,该第二输出表示由该加载指令所请求的该数据非推测式地存在于该高速缓存中。
10.一种微处理器,包括一第一高速缓存,用以高速缓存由推入指令所指定的数据,该第一高速缓存包括一后进先出堆栈内存,其具有一顶端项目,用以储存对应于最新推入指令数据的一高速缓存线的数据;一第二高速缓存,用以高速缓存由非推入内存存取指令所指定的数据,该第二高速缓存包括一非后进先出内存;以及控制逻辑,耦接至该第一高速缓存及该第二高速缓存,若由一加载指令所指定的一虚拟地址与存入该顶端项目中的该高速缓存线的一虚拟地址匹配,则会从该第一高速缓存中该加载指令所指定的该顶端项目数据,推测式地提供数据。
11.根据权利要求10所述的微处理器,其中若该加载指令所指定的该虚拟地址与存于该顶端项目中的该高速缓存线的该虚拟地址未匹配,但若从该加载指令所指定的该虚拟地址中所转译的一实际地址与存于该第一高速缓存中的数条高速缓存线其中之一的一实际地址匹配,则该控制逻辑会使该第一高速缓存从所述高速缓存线的该匹配一个中,非推测式地产生该加载指令所指定的该数据。
12.根据权利要求11所述的微处理器,其中若从该加载指令所指定的该虚拟地址中所转译的该实际地址与存于该第一高速缓存中的数条高速缓存线中的任一条的该实际地址未匹配,则当从该加载指令所指定的该虚拟地址中所转译的该实际地址与存于该第二高速缓存中的一高速缓存线中的一实际地址匹配时,该控制逻辑会使该第二高速缓存非推测式地产生该加载指令所指定的该数据。
13.根据权利要求10所述的微处理器,还包括数个实际地址比较器,耦接至该控制逻辑,用以检测该控制逻辑是否位于不正确地使该第一高速缓存,从该加载指令所指定的该顶端项目数据中,推测式地提供数据的一状况;以及一微码内存,耦接至该控制逻辑,用以储存用以从该情况中恢复的微指令。
14.根据权利要求13所述的微处理器,其中基于从该加载指令所指定的该虚拟地址中所转译的一实际地址是否未命中该第一高速缓存的一判断,来进行检测。
15.根据权利要求10所述的微处理器,其中在判断从该加载指令所指定的该虚拟地址中所转译的一实际地址是否与存入该顶端项目中的该高速缓存线的一实际地址匹配之前,若该加载指令所指定的该虚拟地址与存入该顶端项目中的该高速缓存线的该虚拟地址匹配,则该控制逻辑会使该第一高速缓存从该加载指令所指定的该顶端项目数据中,推测式地提供数据。
16.一种执行来自于堆栈存储高速缓存的推测式加载运算的方法,该方法包括以后进先出的方式,将堆栈内存数据存入一高速缓存;在该储存之后,判断一加载指令的一虚拟地址是否与存入该高速缓存的一顶端项目中的数据的一虚拟地址匹配;判断该加载指令的一实际地址是否与存入该顶端项目中的数据的一实际地址匹配;以及在判断该加载指令的该实际地址是否与存入该顶端项目中的数据的该实际地址匹配之前,若该加载指令的该虚拟地址与存入该顶端项目中的数据的该虚拟地址匹配,则会从该顶端项目中产生数据。
17.根据权利要求16所述的方法,还包括在判断该加载指令的该实际地址是否与存入该顶端项目中的数据的该实际地址匹配之前,会将该加载指令的该虚拟地址转译成该加载指令的该实际地址;以及当该加载指令的该实际地址与存入该顶端项目中的数据的该实际地址未匹配时,若该加载指令的该虚拟地址与存入该顶端项目中的数据的该虚拟地址匹配,则在从该顶端项目产生数据之后,会产生一例外信号。
18.根据权利要求17所述的方法,其中将该加载指令的该虚拟地址转译成该加载指令的该实际地址借助一转译旁视缓冲器来执行,包括将一虚拟内存分页地址转译成一实际内存分页地址,并且该转译动作与该判断该加载指令的该虚拟地址是否与存入该高速缓存的该顶端项目中的数据的该虚拟地址匹配的动作,二者实质上并行地执行,而该例外信号表示从该顶端项目传送到该加载指令的数据为不正确数据。
19.根据权利要求18所述的方法,还包括响应该例外信号,将正确数据传送到该加载指令;基于非堆栈内存数据的一地址,而将非堆栈内存数据存入一第二高速缓存,而进入该第二高速缓存的位置;判断该加载指令的该实际地址是否与存入该第二高速缓存中的数据的一实际地址匹配;以及若该加载指令的该实际地址与存入该第二高速缓存中的数据的一实际地址匹配,则会从该第二高速缓存中,产生数据。
20.根据权利要求19所述的方法,其中响应于该例外信号而将正确数据传送到该加载指令的动作,包括一微处理器,包含该高速缓存,用以执行一微码例程以产生正确数据,其中该判断该加载指令的该实际地址是否与存入该第二高速缓存中的数据的该实际地址匹配的动作,与该判断该加载指令的该实际地址是否与存入该后进先出高速缓存的该顶端项目中的数据的该实际地址匹配的动作,二者实质上并行地执行。
全文摘要
本发明涉及一种执行快速推测式加载运算的高速缓存。此高速缓存以后进先出(LIFO)的方式,来高速缓存堆栈数据,并且会储存存于其中的高速缓存线的虚拟及实际地址。此高速缓存会将加载指令虚拟地址与顶端高速缓存项目的虚拟地址进行比较,其实质上会与虚拟加载地址转译成实际加载地址并行。若虚拟地址匹配,则此高速缓存会将请求数据,从顶端项目推测式地传送到加载指令。此高速缓存接下来会将实际加载地址与顶端高速缓存项目实际地址进行比较,并且若其不匹配,则此高速缓存会产生例外,并且处理器会产生正确数据。若虚拟及实际加载地址均未命中堆栈高速缓存,则数据会由实质上与堆栈高速缓存并行地存取的非堆栈高速缓存产生。
文档编号G06F9/312GK1619511SQ200410101178
公开日2005年5月25日 申请日期2004年12月20日 优先权日2004年1月16日
发明者罗德尼·E·胡克 申请人:智慧第一公司

最新回复(0)