处理存储器请求的制作方法

文档序号:11216207阅读:954来源:国知局
处理存储器请求的制造方法与工艺

背景

为了减少与访问存储在主存储器中的数据相关联的延迟,处理器(诸如cpu或gpu)通常具有一个或多个高速缓存,如图1中的示例存储器层次结构100所示。通常存在两个级别的片上高速缓存l1102和l2104,其通常利用sram(静态随机存取存储器)来实现。高速缓存比主存储器108小,主存储器108可在dram(动态随机存取存储器)中实现,但访问高速缓存所涉及的延迟比针对主存储器的延迟短得多并且在层次结构内的较低级别(即,更接近处理器)处变得更短。由于延迟至少近似地与高速缓存的大小相关,因此较低级别的高速缓存(例如,l1)小于较高级别的高速缓存(例如,l2)。

当处理器访问数据项时,数据项从层次结构中的最低级被访问,其中该数据项是可获得的。例如,查找将在l1高速缓存102中执行并且如果数据在l1高速缓存中,则这被称为高速缓存命中并且数据可被加载到寄存器110中的一个中。然而,如果数据不在l1高速缓存(最低级别的高速缓存)中,则这是高速缓存缺失并且依次检查层次结构中的下一级别,直到发现数据(例如,在l1高速缓存缺失的情况下检查l2高速缓存104)。在高速缓存缺失的情况下,数据进入高速缓存(例如,l1高速缓存102)中,并且如果高速缓存已经是满的,则替换算法可用于决定哪个现有数据将被逐出(即,被删除),以便可以存储新的数据。

如果数据项不在片上高速缓存的任一个中(例如,不在图1所示的层次结构中的l1高速缓存102或l2高速缓存104中),则存储器请求被发到外部总线(其也可被称为互连结构)上,使得数据项可从层次结构中的下一级别(例如,主存储器108)中获得。

下面描述的实施方式仅作为示例被提供且不是解决管理对存储器的访问的已知方法的任何或所有缺点的实现的限制。

概述

这个概述被提供来以简化形式引入一些概念,其在以下详细描述中被进一步描述。这个概述并不旨在识别所要求保护的主题的关键特征或必要特征,也不旨在用来协助确定所要求保护的主题的范围。

描述了处理由高速缓存(例如,片上高速缓存)发出的存储器请求的转换器模块,其中这些存储器请求包括在虚拟存储器空间内定义的存储器地址。转换器模块接收这些请求、发出每个请求连同事务标识符并使用该标识符来跟踪存储器请求的状态。转换器模块向存储器管理单元发送地址转换的请求,并且在转换在存储器管理单元中不可用的情况下从存储器管理单元接收另外的存储器请求。存储器请求经由总线被发给存储器,并且一旦从存储器接收到响应,则释放用于请求的事务标识符。当将存储器请求发到总线上时,从存储器管理单元接收的存储器请求可优先于从高速缓存接收的存储器请求。

第一方面提供了一种模块,包括:分配模块,其被布置为从高速缓存接收存储器请求并将事务标识符分配给每个接收的存储器请求,其中从高速缓存接收的存储器请求包括在虚拟地址空间中定义的一个或多个存储器地址;事务跟踪器模块,其被布置为从分配模块接收存储器请求连同所分配的事务标识符、跟踪存储器请求的状态并从存储器管理单元接收转换信息,其中转换信息包括存储器请求中的虚拟存储器地址到物理存储器地址的转换或指向该转换的指针;以及仲裁器模块,其被布置为当存储器请求准备好发出时从事务跟踪器模块接收存储器请求连同所分配的事务标识符,并且经由外部总线将存储器请求发给存储器,并且响应于经由外部总线接收到来自存储器的响应,触发对所分配的事务标识符的释放,其中发给存储器的存储器请求包括使用转换信息确定的一个或多个物理存储器地址。

第二方面提供了一种方法,包括:在转换器模块处从高速缓存接收存储器请求;在转换器模块中,将事务标识符分配给每个接收的存储器请求,其中从高速缓存接收的存储器请求包括在虚拟地址空间中定义的一个或多个存储器地址;在转换器模块中,跟踪存储器请求的状态;在转换器模块中,从存储器管理单元接收转换信息,其中转换信息包括存储器请求中的一个中的虚拟存储器地址到物理存储器地址的转换或指向该转换的指针;经由外部总线将来自转换器模块的存储器请求中的所述一个发到存储器,其中发到存储器的存储器请求包括使用转换信息确定的一个或多个物理存储器地址;以及响应于经由外部总线接收到来自存储器的响应,触发对所分配的事务标识符的释放。

另外的方面提供了处理系统,其被配置为执行本文所述的方法;处理系统包括在集成电路上的硬件中体现的如本文所述的模块;计算机可读代码适于当代码运行在计算机上时执行本文所述的方法的步骤;在集成电路制造系统处制造包括如本文所述的模块的处理系统的方法;集成电路定义数据集,当其在集成电路制造系统中处理时,将系统配置为制造包括如本文所述的模块的处理系统;计算机可读存储介质,其具有在其上存储的集成电路的计算机可读描述,当其在集成电路制造系统中处理时,使集成电路制造系统制造包括如本文所述的模块的处理系统;以及集成电路制造系统,该集成电路制造系统包括:非暂时性计算机可读存储介质,其具有在其上存储的集成电路的计算机可读描述,该集成电路的计算机可读描述描述了图形处理系统;布局处理系统,其被配置为对集成电路描述进行处理,以便生成体现图形处理系统的集成电路的电路布局描述;以及集成电路生成系统,其被配置为根据电路布局描述来制造图形处理系统,其中处理系统包括如本文所述的模块。

转换器模块可被体现在集成电路上的硬件中。可以提供在集成电路制造系统处制造转换器模块和/或包括转换器模块的处理器的方法。可以提供集成电路定义数据集,当其在集成电路制造系统中处理时,将系统配置为制造转换器模块和/或包括转换器模块的处理器。可以提供非暂时性计算机可读存储介质,其具有在其上存储的集成电路的计算机可读描述,当其被处理时,使布局处理系统生成在集成电路制造系统中使用的电路布局描述,以制造转换器模块和/或包括转换器模块的处理器。

可以提供集成电路制造系统,包括:非暂时性计算机可读存储介质,其具有在其上存储的计算机可读集成电路描述,该计算机可读集成电路描述描述了转换器模块和/或包括转换器模块的处理器;布局处理系统,其被配置为对集成电路描述进行处理,以便生成体现转换器模块和/或包括转换器模块的处理器的集成电路的电路布局描述;以及集成电路生成系统,其被配置为根据电路布局描述来制造转换器模块和/或包括转换器模块的处理器。

可以提供用于执行如本文所述的方法的计算机程序代码。可以提供非暂时性计算机可读存储介质,其具有在其上存储的计算机可读指令,当计算机可读指令在计算机系统处执行时,使计算机系统执行如本文所述的方法。

优选特征可在适当时被组合,如对技术人员明显的,并可与本发明的任何方面组合。

附图简述

将参考以下附图通过示例的方式来描述本发明的实施方式,在附图中:

图1是示例存储器层次结构的示意图;

图2是包括第一示例转换器模块的存储器层次结构的一部分的示意图;

图3a是示出如本文所述的转换器模块的第一示例操作方法的流程图;

图3b是示出如本文所述的转换器模块的第二示例操作方法的流程图;

图4是示出如本文所述的转换器模块的第三示例操作方法的流程图;

图5是包括第二示例转换器模块的存储器层次结构的一部分的示意图;

图6是示出如本文所述的转换器模块的第四示例操作方法的流程图;

图7是示出如本文所述的转换器模块的第五示例操作方法的流程图;

图8示出可在如本文所述的转换器模块内实现的两个示例状态图;

图9示出其中实现本文所描述的转换器模块的计算机系统;以及

图10示出包括布局处理系统和集成电路生成系统的集成电路制造系统的示例。

附图图示各种示例。技术人员将认识到附图中示出的元素边界(例如,框、框组或其他形状)表示边界的一个示例。可能的是在一些示例中,一个元素可被设计为多个元素或者多个元素可被设计为一个元素。共同的参考数字在全部附图中用于指示类似的特征。

详细描述

以下描述通过示例的方式来提出,以使得本领域中的技术人员能够制造并使用本发明。本发明不限于本文所描述的实施方式并且对所公开的实施方式的各种修改对于本领域中的技术人员来说将是明显的。

现在将仅通过示例的方式来描述实施方式。

本文描述的是转换器模块(其也可被称为接口模块),该转换器模块位于高速缓存(其可被称为片上高速缓存,因为它是与处理器在同一芯片上的高速缓存、经由内部总线连接并被认为是在处理器核心内的,诸如图1中示出的层次结构100中的l2高速缓存104)和存储器(其可被称为片外存储器,因为它是经由外部总线连接的存储器,诸如图1中示出的层次结构100中的主存储器108)之间。转换器模块(经由内部总线)从片上高速缓存接收存储器请求并将存储器请求发到外部总线上,使得存储器请求可被片外存储器接收。虽然以下描述将高速缓存称为“片上”的,而将存储器称为“片外”的,但是这仅作为示例并且在各种实现方式中,高速缓存和存储器两者可在单个片上系统(例如,同一硅片上的)内实现或者在单个封装内实现。

如下面更详细描述的,转换器模块连接到mmu(存储器管理单元),该mmu在虚拟存储器地址和物理存储器地址之间转换。在使用本文所描述的转换器模块的系统中,片上高速缓存因而在虚拟存储器地址空间中操作并在虚拟存储器地址空间中生成对存储器的请求。本文所描述的转换器模块将这些存储器请求转换成在物理地址空间中的外部总线上使用的协议(例如,axi4ace协议、开放核心协议ocp或私有协议)。在外部总线上使用的协议通常比在内部总线上使用的协议(其通常是私有协议)更重量级,并且虽然外部总线通常无序地操作并且出于性能原因可具有多个通道,但是内部总线通常按顺序操作。在mmu中缺失的情况下(即,由于所需的转换没有存储在mmu中的转换旁视缓冲器tlb中),mmu还生成存储器请求并且这些存储器请求还通过转换器模块被发到外部总线上。

通过对高速缓存的输出执行地址转换(即,使用本文所描述的转换器模块),吸收(absorb)大量的转换延迟是可能的。相反,如果在高速缓存(例如,对高速缓存的输入)之前执行转换,则其可能需要在执行转换的同时暂停处理器,因为转换可以是非常缓慢的。此外,它减少了进入mmu的请求量,这可降低功率消耗,并且由于l1和l2高速缓存之间的总线不再经受mmu缺失(因为它们都在虚拟存储器地址空间中工作),因此这些可保持更高的效率/利用率(例如,因为l2高速缓存将倾向于吸收请求而不暂停,支持提供足够的事务id)。

除了触发(使用mmu从虚拟地址空间到物理地址空间的)地址转换之外,转换器模块将事务标识符(id)分配给从片上高速缓存接收的传入存储器请求并跟踪每个未完成的事务(即,其已被接收但尚未完成)。一旦事务完成,事务id被释放,使得它们可被重新使用(即,分配给另一传入的存储器请求)。当将事务id分配给由mmu/tlb缺失引起的存储器请求时,可以使用一组单独的事务id。这些事务id是与由外部总线分派的并允许总线也进行重新排序的任何id分开且不同的。

事务id的分配和id的跟踪使得存储器请求能够无序地执行,即存储器请求可被无序地发到外部总线上,并且响应不需要在它们在将数据传回到片上高速缓存之前由转换器模块接收时重新排序(即,数据可按照其返回的顺序被传递回mmu或片上高速缓存)。转换器模块使用一个或多个规则来选择接下来将哪些事务发到外部总线上,并且这些规则(以及将请求无序地发到外部总线上的能力)使得mmu/tlb缺失能够被优先化并且与这样的缺失相关联的延迟能够被隐藏(例如,因为可以在等待mmu/tlb缺失返回的同时发出其他事务)。

图2是包括转换器模块202的存储器层次结构的一部分的示意图200,转换器模块202从距离处理器最远的片上高速缓存204(即,在外部总线之前的层次结构中的最后的高速缓存,其也可被称为最后的片上高速缓存,例如l2高速缓存)接收存储器请求,并且经由(连接片外存储器的)外部总线206将存储器请求发给层次结构中的下一存储器(例如,图1的示例中的主存储器108)。转换器模块202连接到包括tlb210的mmu208。由转换器模块202接收的存储器请求可以是高速缓存缺失(即,从其接收请求的高速缓存中的缺失)、高速缓存逐出或高速缓存维护操作(例如,高速缓存刷新)的结果。在高速缓存支持旁路接入的情况下,转换器还可以从高速缓存接收写请求,该写请求不经改变地通过高速缓存。

转换器模块202包括分配模块212,分配模块212从高速缓存204接收读/写请求并将事务id分配给那些请求。转换器模块202还包括事务跟踪器模块214,事务跟踪器模块214使用由分配模块212分配的事务id来跟踪每个传入的读/写请求,例如以确定转换是否在tlb中可用并且因此是否可以发出请求。

分配模块212或事务跟踪器模块214可以针对从高速缓存204接收的每个存储器请求向mmu208发送转换请求。这些转换请求用相应的存储器请求的事务id来标记。响应于转换请求,mmu208将转换或指向该转换的指针以及事务id返回到事务跟踪器模块214(使得事务跟踪器模块214可以使转换/转换指针和相应的存储器请求相匹配)。在mmu命中的情况下,可以立即返回转换/转换指针;然而,在mmu/tlb缺失(即,其中转换没有存储在tlb210中)的情况下,mmu在其可以返回对于特定事务id的转换/转换指针之前生成另外的存储器请求并等待数据返回。如果mmu使用嵌套转换,则在转换/转换指针可被返回到事务跟踪器模块214之前可能需要对存储器进行几次调用(即,发出几个存储器请求),并且这导致几个周期的延迟。

如上所述,可以通过(在仲裁器模块216中)使mmu请求优先于高速缓存发起的请求来最小化由mmu/tlb缺失引起的延迟。还可以通过无序地发出存储器请求来至少部分地隐藏延迟,使得其他存储器请求仍然可以在检索转换时被发出且不被暂停。

转换器模块202还包括仲裁器模块216,仲裁器模块216接收准备从事务跟踪器模块214和mmu208发出的存储器请求。从事务跟踪器模块214接收的请求是从高速缓存202发起的,但现在包括从tlb获得的物理地址(而不是虚拟存储器地址)。从mmu208接收的请求由mmu响应于mmu/tlb缺失(如上所述)而生成。

仲裁器模块216每个时钟周期选择其接收的存储器请求中的一个或多个并将它们发到外部总线206上。仲裁器模块216使用一个或多个规则来确定在任意时间选择并发出哪个存储器请求(例如,可选择最高优先级事务请求),而不是按照事务id顺序工作。在准备发出比可以发到外部总线206上的存储器请求更多的存储器请求的情况下,那些等待发出的存储器请求可在仲裁器模块216内进行缓冲或者可以保持在输出状态中,其中存储器请求等待被仲裁器模块216选择。

在各种示例中,仲裁器模块216可使由mmu208(由于mmu/tlb缺失)生成的存储器请求优先于由高速缓存204生成的存储器请求。这减少了与mmu/tlb缺失相关联的延迟。如果不存在由mmu208生成的存储器请求,则由高速缓存204生成的存储器请求可按照mmu命中的顺序(即,按照tlb中的转换可用的顺序)选择,然而,仲裁器模块216还可以尽可能地试图按照老化的顺序发出来自高速缓存204的存储器请求(例如,如果存在两个来自高速缓存的存储器请求,其中转换是可用的,则最旧的存储器请求可被选择发到外部总线206上)。

仲裁器模块216还接收从外部总线206返回的读数据和写响应,并且这些可按照与其中存储器请求通过仲裁器模块216发到外部总线206上的顺序不同的顺序被接收回来。然而,所接收的读数据和写响应附有相应的事务id,因此仲裁器模块216可确定响应是对应于由高速缓存204还是mmu208发出的请求。在响应对应于由mmu208发出的请求的情况下,该响应(例如,读数据)被传递到mmu208。在响应对应于由高速缓存204发出的请求的情况下,该响应(其可以是读数据或写响应)被传递到事务跟踪器模块214并随后传递到高速缓存上。

在事务跟踪器模块214中对传入的读/写请求的跟踪可包括存储每个事务的当前状态并且当事务的状态变化时,(例如,根据详述状态到状态的可能的转变和发生转变所需的条件的状态图)更新所存储的状态。例如,可用的事务id最初可以处于空闲状态。当事务id(通过分配模块212)被分派给传入的读/写事务并且请求转换时,该状态可被更新为转换状态。当mmu208返回转换(或指向该转换的指针)时,事务的状态可被更新为输出状态。一旦处于输出状态,则事务可以被仲裁器模块216选择,以用于发到外部总线206上。一旦发出,事务被更新为关于读事务的等待数据状态或关于写事务的等待响应状态,然后一旦接收到读数据或写响应并且释放了事务id,则状态返回到空闲状态,其指示事务id可被重新分派给新的传入存储器请求。

将认识到的是,为了使写请求准备好发出(且因此移动到输出状态),要写入的数据还必须是可用的。写数据可由转换器模块202内的单独的路径(未在图2中示出)提供,该单独的路径包括输出写数据缓冲器(owdb)。写数据在被接收时存储在owdb中,并且owdb中的写数据的索引/地址一旦可用就被提供给事务跟踪器模块214。一旦转换和写数据均可用,就准备发出写请求并可将其(连同事务id和owdb索引)传递到仲裁器模块216。一旦写请求被仲裁器选择,则索引和突发长度然后被发送到owdb,使得然后可以使用作为起始地址的索引和突发长度来从owdb中读出伴随写命令的所需的数据,以确定数据的字的数量。

可以参考图3a、图3b和图4对转换器模块202及其组件部分的操作进行更详细的描述。图3a、图3b和图4示出了转换器模块202的三种不同的示例操作方法;然而,如从图中可以看出,这些方法具有许多共同的方法块。

在图3a和图3b中示出的方法中,转换器模块202从高速缓存204接收读/写请求(块302),并且由分配模块212分配事务id(块304)。(在块304中)分配的事务id可选自可用的事务id池中并且事务id可以是外部事务id,即在外部总线206上使用的id。例如,在外部总线206使用axi4ace协议的情况下,(在块304中)分配的外部事务id是axiid。

一旦已经(在块304中)分配事务id,则针对该请求中的任何虚拟存储器地址,请求转换(块306)。如上所述,转换请求可通过分配模块212传递到mmu208(如图2中的箭头所示)或者通过事务跟踪器模块214传递到mmu208。转换请求包括(在块304中)已经分配给传入存储器请求的事务id。

在tlb命中(在块308中为“是”)的情况下,事务跟踪器模块214接收来自mmu的转换或指向tlb中的转换的指针以及与转换相关的事务id(块310)。这使得跟踪每个未决事务的状态的事务跟踪器模块214能够更新所标识的事务的状态,以示出转换已准备就绪。对于写请求,事务只有在转换可用且写数据也可用(即,存储在owdb中)(在块311中为“是”)时才会准备就绪。一旦(由事务id标识的)存储器请求准备发出,则包括从tlb获得的物理地址(例如,而不是在原始传入存储器请求中的虚拟存储器地址)的存储器请求可被传递到仲裁器模块216。

仲裁器模块216从准备就绪的那些存储器请求中选择存储器请求并使用(在块304中)先前分配的事务id来将其发到外部总线206上(块312)。如上所述,可以基于一个或多个规则来执行(在块312中的)选择。

在(块312中)发出具有特定事务id的存储器请求后,仲裁器模块216接收具有匹配的事务id的(用于读请求的)读数据或(用于写请求的)写响应(块314)。基于事务id,仲裁器模块216可以确定读数据或写响应对应的存储器请求是高速缓存204发起的还是mmu208发起的,并且然后(针对高速缓存发起的请求)将读数据或写响应转发到事务跟踪器模块214或者(针对mmu发起的请求)将其转发到mmu208。

一旦读/写请求完成(即,已经从外部总线接收到响应,其有效地完成该事务的生命周期),则可以释放(在块304中)分派给该请求的事务id(块316)。这意味着事务id返回到(在块304中)可分派给传入请求的可用的事务id池。

在tlb缺失(在块308中为“否”)的情况下,事务跟踪器模块214可以不立即接收来自mmu208的转换或转换指针,如图3a所示。相反,mmu发出在mmu内分派了事务id的存储器请求。由mmu分派的事务id可选自分开的可用外部事务id池,其仅用于mmu发起的请求。仲裁器模块216接收由mmu生成的存储器请求及其事务id(块318),并且存储器请求可用于如上所述的选择和发出(块312)。另外,如上所述,(由mmu请求的特殊事务id标识的)mmu请求可优先于高速缓存发起的请求,以便使与mmu/tlb缺失相关联的延迟最小化。

在(块312中)发出mmu请求后,仲裁器模块216(在块314中)接收数据并且可以根据事务id识别出数据与由mmu208生成的存储器请求相关。因此,仲裁器模块216将数据传递到mmu(块320)并且由仲裁器模块216或mmu208释放特殊mmu事务id(块316)。如上所述,(例如,在嵌套转换的情况下)单个tlb缺失可能需要多个存储器查找,因此针对高速缓存发起的请求,在转换在mmu中可用之前,仲裁器模块可以接收另外的存储器请求(如块316到块318的虚线箭头所指示)。

一旦转换可用,事务跟踪器模块214接收来自mmu的转换或指向tlb中的转换的指针以及与转换相关的事务id(块310)。由于转换现在准备就绪,因此(由事务id标识的)存储器请求准备发出并且因此可被传递到仲裁器模块216。如上面提到的,对于写请求,写数据也必须是可用的(即,存储在owdb中),以用于将准备好被发出的存储器请求(在块311中为“是”)。对于读请求,没有类似的约束。

仲裁器模块216(例如,基于一个或多个规则)从准备就绪的那些存储器请求中选择存储器请求,并且使用(在块304中)先前分配的事务id将其发到外部总线206上(块312)。

在(块312中)发出具有特定事务id的存储器请求后,仲裁器模块216接收具有匹配的事务id的(用于读请求的)读数据或(用于写请求的)写响应。基于事务id,仲裁器模块216可以确定读数据或写响应对应的存储器请求是高速缓存204发起的还是mmu208发起的,并且然后(针对高速缓存发起的请求)将读数据或写响应转发到事务跟踪器模块214或者(针对mmu发起的请求)将其转发到mmu208。

如上所述,一旦读/写请求完成,就可以释放(在块304中)分派给高速缓存发起的请求的事务id(块316)。这意味着事务id返回到可用的事务id池,其可(在块304中)被分派给来自高速缓存的另一传入请求。

图3b示出了图3a中示出和以上所述的方法的变型。在该示例方法中,不论是存在tlb命中还是存在tlb缺失,事务跟踪器模块214均接收来自mmu208的转换或转换指针(块310);然而,在tlb缺失的情况下,指针指向被标记为未完成的条目(在块322中为“是”),因此事务跟踪器模块214知道该事务尚未准备好。如上所述,在tlb缺失(这意味着该条目被标记为未完成,在块322中为“是”)的情况下,mmu发出在mmu内分派了事务id的存储器请求(如以上参考图3a描述的)。由mmu分派的事务id可选自分开的可用外部事务id池,其仅用于mmu发起的请求。仲裁器模块216接收由mmu生成的存储器请求及其事务id(块318),并且存储器请求可用于如上所述的选择和发出(块312)。还如上所述,(由mmu请求的特殊事务id标识的)mmu请求可优先于高速缓存发起的请求,以便使与mmu/tlb缺失相关联的延迟最小化。

在(块312中)发出mmu请求后,仲裁器模块216(在块314中)接收数据并且可以根据事务id识别出数据与由mmu208生成的存储器请求相关。因此,仲裁器模块216将数据传递到mmu(块320)并且由仲裁器模块216或mmu208释放特殊mmu事务id(块316)。如上所述,(例如,在嵌套转换的情况下)单个tlb缺失可能需要多个存储器查找,因此针对高速缓存发起的请求,在转换在mmu中可用(如块324中更新的)之前,仲裁器模块可接收另外的存储器请求(如块316到块318的虚线箭头所指示的)。

一旦转换可用,指针指向的条目不再被标记为未完成(在块322中为“否”)并且(由事务id标识的)存储器请求准备发出且因此可被传递到仲裁器模块216。如上面提到的,对于写请求,写数据也必须是可用的(即,存储在owdb中),以用于将准备被发出的存储器请求(在块311中为“是”)。对于读请求,没有类似的约束。

仲裁器模块216(例如,基于一个或多个规则)从准备就绪的那些存储器请求中选择存储器请求,并且使用(在块304中)先前分配的事务id将其发到外部总线206上(块312)。

在(块312中)发出具有特定事务id的存储器请求后,仲裁器模块216接收具有匹配的事务id的(用于读请求的)读数据或(用于写请求的)写响应。基于事务id,仲裁器模块216可以确定读数据或写响应对应的存储器请求是高速缓存204发起的还是mmu208发起的,并且然后(针对高速缓存发起的请求)将读数据或写响应转发到事务跟踪器模块214或者(针对mmu发起的请求)将其转发到mmu208。

如上所述,一旦读/写请求完成,就可以释放(在块304中)分派给高速缓存发起的请求的事务id(块316)。这意味着事务id返回到可用的事务id池,其可(在块304中)被分派给来自高速缓存的另一传入请求。

通过使用上面描述的并在图3a和图3b中示出的方法,可以隐藏由mmu缺失所引起的延迟并且可以支持地址的无序转换。方法改善了性能、延迟容忍和总线利用率。

与图3a和图3b中示出的方法相比,在图4中示出的方法中,使用三种类型的事务id:内部事务id、mmu事务id(其可被认为是特殊类型的内部事务id)和外部事务id。与图3a和图3b的方法不同,在图4的方法中,分配模块212将内部事务id分配给传入存储器请求并且mmu208将mmu事务id分配给其生成的任何存储器请求。然后,在存储器请求被发到外部总线上之前,这些事务id通过仲裁器模块216被映射到外部事务id。

通过以这种方式使用内部事务id,使用较少量的外部事务id是有可能的,因为没有必要为mmu请求保留许多外部事务id。这产生了更灵活的系统(例如,外部总线不需要支持来自高速缓存的n个请求加上来自mmu的m个请求,而是固定大小的外部事务id池可由在任意一个时间点恰好在飞行中的任何比例的mmu请求和高速缓存请求来使用)。可以选择包括mmu事务id的内部事务id的总数以匹配外部事务id的总数,或者可以存在比外部事务id更多的内部事务id。

在存在比外部id更多的内部事务id(包括mmu事务id)的情况下,也许不可能发出所有准备好的存储器请求,这是因为可能不存在任何可用的外部事务id,且因此存储器请求可在仲裁器模块216和/或事物跟踪器模块214内进行缓冲。

如果增加了不包括mmu事务id的内部事务id的数量,则用于跟踪所有未决事务的事务跟踪器模块214中的存储器的大小变得更大;然而,存储器层次结构的效率提高。

在图4中示出的方法中,转换器模块202接收来自高速缓存204的读/写请求(块302),并且内部事务id由分配模块212分配(块404)。(在块404中)分配的内部事务id可选自可用的内部事务id池。

一旦已经(在块404中)分配内部事务id,则针对该请求中的任何虚拟存储器地址,请求转换(块306)。如上所述,转换请求可通过分配模块212传递到mmu208(如图2中的箭头所示)或者通过事务跟踪器模块214传递到mmu208。转换请求包括(在块404中)已经分配给传入存储器请求的内部事务id。

在tlb命中(在块308中为“是”)的情况下,事务跟踪器模块214接收来自mmu的转换或指向tlb中的转换的指针以及与转换相关的内部事务id(块310)。这使得跟踪每个未决事务的状态的事务跟踪器模块214能够更新所标识的事务的状态,以示出转换已准备就绪。一旦包括从tlb获得的物理地址(例如,而不是在传入存储器请求中的虚拟存储器地址)的存储器请求(由内部事务id所标识)准备好发出,则其可被传递到仲裁器模块216。

仲裁器模块216从准备好的那些存储器请求中选择存储器请求(块411),其中,如上所述,该选择可以基于一个或多个规则。在可以发出存储器请求(块413)之前,必须首先向该存储器请求分派来自可用的外部事务id池的外部事务id,并且内部事务id和外部事务id之间的映射被存储在仲裁器模块216中(块412)。

在示例中,外部事务id可通过仲裁器模块216内的重映射逻辑分派,重映射逻辑维持其中内部事务id已被分配给每个外部事务id的数组。当(在块411中)已经由仲裁器模块216选择请求时,重映射逻辑找到数组中可用的空闲条目(例如,数组中的第一可用的空闲条目)。内部事务id被存储在所标识的数组条目中并且已经被分配的条目编号然后形成(在块413中)输出到外部总线206上的外部事务id。

在(块413中)发出具有特定外部事务id的存储器请求后,仲裁器模块216接收具有匹配的外部事务id的(用于读请求的)读数据或(用于写请求的)写响应(块314)。然后,外部事务id映射回到内部id并且释放外部事务id(块415)。

在其中使用以上所描述的数组的示例中,所接收的外部事务id被用作重映射数组的索引并且这允许获得原始内部事务id。一旦发生这种情况,该条目被再次标记为空,允许该条目(以及因此的外部事务id)被重新分派给新的请求。

基于内部事务id,仲裁器模块216可以确定读数据或写响应对应的存储器请求是由高速缓存204发起的还是由mmu208发起的,并且然后(针对高速缓存发起的请求)将读数据或写响应转发到事务跟踪器模块214或者(针对mmu发起的请求)将其转发到mmu208。例如,第一范围或类型的id可被用作用于高速缓存发起的请求的内部事务id,并且第二不同的范围或类型的id可被用作mmu事务id。

一旦读/写请求完成,就可以释放(在块404中)分派给请求的内部事务id(块416)。这意味着内部事务id返回到(在块404中)可分派给传入请求的可用的内部事务id池。

在tlb缺失(在块308中为“否”)的情况下,事务跟踪器模块214可以不立即从mmu208接收转换或转换指针;可选地,如以上参考图3b描述的,可以接收指向被标记为未完成的条目的转换指针。在tlb缺失的情况下,mmu发出在mmu内分派了mmu事务id的存储器请求。由mmu分派的mmu事务id可选自可用的mmu事务id池。仲裁器模块216接收由mmu生成的存储器请求及其mmu事务id(块418)并且可用于(块411中的)选择和(块413中的)发出。mmu请求(由其mmu事务id所标识)可以(在块411中选择请求时)优先于高速缓存发起的请求,以便使与mmu/tlb缺失相关联的延迟最小化。

在(块413中)发出存储器请求之前,分派了外部事务id并存储mmu到外部id的映射(块422)。外部事务id可从可用的外部事务id池分派,并且与以上参考图3a和图3b描述的方法不同,相同的外部事务id池可用于高速缓存发起的存储器请求和mmu发起的存储器请求两者。

在示例中,外部事务id可由(以上描述的)重映射逻辑分派。当请求(在块411中)已由仲裁器模块216选择时,重映射逻辑在数组中找到可用的空闲条目。mmu事务id存储在该特定的数组条目中,然后已经被分配的条目编号形成(在块413中)输出到外部总线206上的外部事务id。

在(块413中)发出mmu请求后,仲裁器模块216(在块314中)接收数据以及外部事务id。然后,该外部事务id(例如,使用由重映射逻辑保持的数组)被映射回到内部id,在这种情况下,内部id是mmu事务id,并且释放外部事务id(块425)。

仲裁器模块216可根据mmu事务id识别出(在块314中)所接收的数据与由mmu208生成的存储器请求相关。因此,仲裁器模块216将数据传递到mmu(块320),并且mmu事务id由mmu208释放。如上所述,(例如,在嵌套转换的情况下)单个tlb缺失可能需要多个存储器查找,因此对于高速缓存发起的请求,在转换在mmu中可用之前,仲裁器模块可以接收另外的存储器请求(如块320到块418的虚线箭头所指示的)。

一旦转换可用,事务跟踪器模块214接收来自mmu的转换或指向tlb中的转换的指针以及与转换相关的事务id(块310)。由于转换现在准备就绪,因此(由在块404中分派的内部事务id标识的)存储器请求准备好发出并且因此可被传递到仲裁器模块216。如以上提到的,对于写请求,写数据也必须是可用的,以便使写请求准备好发出(例如,写数据存储在owdb中)。

仲裁器模块216从那些准备好的存储器请求中选择存储器请求(块411)、分派外部事务id并存储内部到外部事务id的映射(块412)并且使用外部事务id将其发到外部总线206上(块413)。

在(块413中)发出具有特定外部事务id的存储器请求后,仲裁器模块216接收具有匹配的外部事务id的(用于读请求的)读数据或(用于写请求的)写响应(块314)。仲裁器模块216(例如,以上所述的重映射逻辑)将外部事务id映射回到内部事务id并释放外部事务id(块415)。基于内部事务id,仲裁器模块216可以确定在该情况下,存储器请求是从高速缓存204发起的并且然后将读数据或写响应转发到事务跟踪器模块214。

如上所述,一旦读/写请求完成,则可以释放(在块404中)分派给高速缓存发起的请求的内部事务id(块416)。这意味着内部事务id返回到可用的内部事务id池,其可(在块404中)被分派给来自高速缓存的另一传入请求。

在以上参考图2-4描述的示例中,来自高速缓存的读和写请求被一起处理(即,以相同方式对待而没有区分读请求和写请求,使得用于读请求和写请求的事务id从同一池中分派),而mmu请求被分开处理,其中用于mmu请求的事务id从分开的池中分派(其中这些事务id可以是如图4中示出的示例中的内部id或者如图3a和图3b中示出的示例中的外部id)。然而,在其他示例中,读请求和写请求可被分开处理,使得用于读请求的事务id从与用于写请求的事务id分开的id池中分派。与前面的示例一样,分派的事务id可以是外部id(如下面参考图6描述的)或内部id(如下面参考图7描述的)。

通过分别为读请求和写请求分派事务id,存储器层次结构可以更好地匹配外部总线,特别是如果总线和/或片外存储器(例如,图1中示出的层次结构中的主存储器108)可以在固定时间窗口内支持不同数量的读和写(例如,读比写更多)。此外,读不会变成卡在写后面(例如,其中外部总线具有用于读和写的分开的通道)。

图5是包括转换器模块502的存储器层次结构的一部分的示意图500,转换器模块502从距离处理器最远的片上高速缓存204(即,层次结构中的最后的片上高速缓存,例如l2高速缓存)接收存储器请求,并且经由(连接片外存储器的)外部总线206将存储器请求发到层次结构中的下一存储器(例如,图1的示例中的主存储器108)。转换器模块502连接到包括tlb210的mmu208。

与图2中示出的转换器模块202相比,可以看出的是,图5中示出的转换器模块502包括两个并行路径,一个路径用于读请求(在图的左边)以及一个路径用于写请求(在图的右边)。每个路径(读/写)包括分配模块512r、512w、事务跟踪器模块514r、514w以及仲裁器模块516r、516w。如同图2一样,owdb没有在图5中示出。

读分配模块512r从高速缓存204接收读请求并将事务id分配给这些读请求,以及写分配模块512w从高速缓存204接收写请求并将事务id分配给这些写请求。读事务跟踪器模块514r使用由读分配模块512r分配的事务id来跟踪每个传入的读请求(例如,以确定转换是否在tlb中可用,并且因此确定是否可以发出请求),以及写事务跟踪器模块514w使用由写分配模块512w分配的事务id来跟踪每个传入的写请求。

读分配模块512r或读事务跟踪器模块514r可以向mmu208发送转换请求,以用于从高速缓存204接收的每个存储器读请求。这些转换请求用相应的存储器读请求的事务id标记。响应于转换请求,mmu208将转换或指向该转换的指针连同事务id返回到读事务跟踪器模块514r(使得读事务跟踪器模块514r可以匹配转换/转换指针和相应的存储器读请求)。

类似地,写分配模块512w或写事务跟踪器模块514w可以向mmu208发送转换请求,以用于从高速缓存204接收的每个存储器写请求。这些转换请求用相应的存储器写请求的事务id标记。响应于转换请求,mmu208将转换或指向该转换的指针连同事务id返回到写事务跟踪器模块514w(使得读事务跟踪器模块514w可以匹配转换或转换指针和相应的存储器写请求)。

在mmu命中的情况下,转换或转换指针可立即返回到相应的事务跟踪器模块514r、514w(即,对于与存储器读请求相关的转换,返回到读事务跟踪器模块514r,以及对于与存储器写请求相关的转换,返回到写事务跟踪器模块514w)。

在mmu/tlb缺失(即,其中转换没有存储在tlb210中)的情况下,mmu在其可以返回用于特定事务id的转换或转换指针之前生成存储器读请求并等待数据返回。如果mmu使用嵌套转换,则在转换/转换指针可以返回到事务跟踪器模块514r、514w之前可能需要对存储器进行几次调用(即,发出几个存储器读请求),并且这导致几个周期的延迟。

读仲裁器模块516r从读事务跟踪器模块514r接收准备发出的存储器读请求并且还从mmu208接收响应于mmu/tlb缺失而生成的存储器读请求。从读事务跟踪器模块514r接收的读请求是由高速缓存202发起的,但现在包括从tlb获得的物理地址(而不是虚拟存储器地址)。读仲裁器模块516r选择其接收的存储器读请求中的一个或多个并且将它们发到外部总线206上(例如,每时钟周期一个)。读仲裁器模块516r使用一个或多个规则来确定在任意时间选择并发出哪个存储器读请求,而不是按照事务id顺序工作。在准备发出比可以发到外部总线206上的请求更多的存储器读请求的情况下,那些等待发出的存储器读请求可在读仲裁器模块516r内进行缓冲。

在各种示例中,读仲裁器模块516r可以使由mmu208(由于mmu/tlb缺失)生成的存储器读请求优先于由高速缓存204生成的存储器读请求。如果不存在由mmu208生成的存储器读请求,则由高速缓存204生成的存储器读请求可按照mmu命中的顺序(即,按照tlb中的转换可用的顺序)选择,然而,读仲裁器模块516r还可以试图尽可能地按照老化的顺序发出来自高速缓存204的存储器读请求(例如,如果存在两个来自高速缓存的存储器读请求,其中转换可用,则最旧的存储器读请求可被选择以发到外部总线206上)。

读仲裁器模块516r还从外部总线206接收回读数据并且可按照与存储器读请求通过读仲裁器模块516r发到外部总线206上的顺序不同的顺序接收回读数据。然而,所接收的读数据附有相应的事务id,因此读仲裁器模块516r可以确定读数据是对应于由高速缓存204发出的请求还是对应于由mmu208发出的请求。在读数据对应于由mmu208发出的请求的情况下,读数据被传递到mmu208。在读数据对应于由高速缓存204发出的读请求的情况下,读数据被传递到读事务跟踪器模块514r并且然后被传递到高速缓存上。

写仲裁器模块516w从写事务跟踪器模块514w接收准备发出的存储器写请求,并且如上所述,对于准备发出的写请求,写数据也必须是可用的(例如,存储在owdb中)。从写事务跟踪器模块514w接收的写请求是由高速缓存202发起的,但现在包括从tlb获得的物理地址(而不是虚拟存储器地址)。写仲裁器模块516w选择其接收的存储器写请求中的一个或多个并将它们发到外部总线206上(例如,在具有分开的数据总线或数据通道的实现方式中每时钟周期一个)。写仲裁器模块516w使用一个或多个规则来确定在任意时间选择并发出哪个存储器写请求,而不是按照事务id顺序工作。在准备发出的存储器写请求比可以发到外部总线206上的存储器写请求更多的情况下,这些等待发出的存储器写请求可在写仲裁器模块516w中进行缓冲。

在各种示例中,由高速缓存204生成的存储器写请求可按照mmu命中的顺序(即,按照tlb中的转换可用的顺序)选择,然而,写仲裁器模块516w还可以试图尽可能地按照老化的顺序发出来自高速缓存204的存储器写请求(例如,如果存在两个来自高速缓存的存储器写请求,其中转换可用,则可以选择最旧的存储器写请求来发到外部总线206上)。

写仲裁器模块516w还从外部总线206接收回写响应(例如,写已经被写入的确认),并且可以按照与写仲裁器模块516w将存储器写请求发到外部总线206上的顺序不同的顺序接收回写响应。然而,接收到的写响应伴随有相应的事务id。写响应被传递到写事务跟踪器模块514w。

可以参考图3a、图3b和图4对转换器模块502及其组件部分的操作进行更详细的描述。图3a、图3b和图4示出了转换器模块502的两种不同的示例操作方法,其中方法中的每个被复制用于分开的读路径和写路径;然而,如从图中可以看出,这些方法具有许多共同的方法块。

在图3a和图3b中示出的方法中,转换器模块502从高速缓存204接收读/写请求(块302),并且读请求由读路径(包括读分配模块512r、读事务跟踪器模块514r和读仲裁器模块516r)处理,并且写请求由分开的写路径(包括写分配模块512w、写事务跟踪器模块514w和写仲裁器模块516w)处理。

如果请求是读请求,则事务id由读分配模块512r分配,以及如果请求是写请求,则事务id由写分配模块512w分配(块304)。(在块304中)分配的事务id可选自可用的事务id池中并且事务id可以是外部事务id,即在外部总线206上使用的id。例如,在外部总线206使用axi4ace协议的情况下,(在块304中)分配的外部事务id是axiid。分开的可用事务id池由读分配模块512r和写分配模块512w使用,使得读请求被分配了来自第一可用事务id池的事务id,而写请求被分配了来自第二可用事务id池的事务id。

一旦已经(在块304中)分配事务id,则针对该请求中的任何虚拟存储器地址,请求转换(块306)。用于读请求的转换请求可通过读分配模块512r传递到mmu208(如图5中的箭头所示)或者通过读事务跟踪器模块514r传递到mmu208。用于写请求的转换请求可通过写分配模块512w传递到mmu208(如图5中的箭头所示)或者通过写事务跟踪器模块514w传递到mmu208。不管转换请求是涉及读还是写,转换请求包括(在块304中)已经分配给传入存储器请求的事务id。

在针对与读请求对应的转换请求的tlb命中(在块308中为“是”)的情况下,读事务跟踪器模块514r接收来自mmu的转换或指向tlb中的转换的指针以及与转换相关的事务id(块310)。这使得跟踪每个未决的读事务的状态的读事务跟踪器模块514r能够更新所标识的事务的状态,以示出转换已准备就绪。一旦转换准备就绪,则(由事务id标识的)存储器读请求准备好发出,因此包括从tlb获得的物理地址(而不是虚拟存储器地址)的存储器读请求可被传递到读仲裁器模块516r。

类似地,在针对与写请求对应的转换请求的tlb命中(在块308中为“是”)的情况下,写事务跟踪器模块514w接收来自mmu的转换或指向tlb中的转换的指针以及与转换相关的事务id(块310)。这使得跟踪每个未决的写事务的状态的写事务跟踪器模块514w能够更新所标识的事务的状态,以示出转换已准备就绪。一旦转换准备就绪,则(由事务id标识的)存储器写请求准备好发出,因此包括从tlb获得的物理地址(而不是虚拟存储器地址)的存储器写请求可被传递到写仲裁器模块516w。

读仲裁器模块516r从那些准备好的存储器读请求中选择存储器读请求并使用(在块304中)先前分配的事务id来将其发到外部总线206上(块312)。类似地,写仲裁器模块516r从那些准备好的存储器写请求中选择存储器写请求并使用(在块304中)先前分配的事务id来将其发到外部总线206上(块312)。如上所述,(在块312中)选择可基于一个或多个规则并且不同的规则可由读仲裁器模块516r和写仲裁器模块516w使用(例如,因为写仲裁器模块516w并不发出由mmu208生成的存储器请求)。

在(块312中)发出具有特定事务id的存储器读请求后,读仲裁器模块516r接收具有匹配的事务id的读数据(块314)。基于事务id,读仲裁器模块516r可以确定存储器请求是由高速缓存204发起的还是由mmu208发起的,并且然后(针对高速缓存发起的请求)将读数据转发到读事务跟踪器模块514r或者(针对mmu发起的请求)将其转发到mmu208。

在(块312中)发出具有特定事务id的存储器写请求后,写仲裁器模块516w接收具有匹配的事务id的写响应(块314)。写仲裁器模块516w将写响应转发到写事务跟踪器模块514w。

一旦读请求完成,则可以释放(在块304中)分派给读请求的事务id(块316)。这意味着事务id返回到用于读请求的可用的事务id池,其可(在块304中)分派给传入读请求。

一旦写请求完成,则可以释放(在块304中)分派给写请求的事务id(块316)。这意味着事务id返回到用于写请求的可用的事务id池,其可(在块304中)分派给传入写请求。

在针对与读请求对应的转换请求的tlb缺失(在块308中为“否”)的情况下,读事务跟踪器模块514r可以不立即接收来自mmu208的转换或转换指针(如图3a所示)。可选地,如以上参考图3b描述的,可以接收指向被标记为未完成的条目的转换指针。类似地,在针对与写请求对应的转换请求的tlb缺失(在块308中为“否”)的情况下,写事务跟踪器模块514w可以不立即接收来自mmu208的转换或转换指针(如图3a所示)。可选地,如以上参考图3b描述的,可以接收指向被标记为未完成的条目的转换指针。

在tlb缺失(关于与读或写请求相关的缺失并且如以上参考图3a和图3b描述的)的情况下,mmu发出在mmu内分派了事务id的存储器读请求。由mmu分派的事务id可选自分开的可用外部事务id池,其仅用于mmu发起的请求。读仲裁器模块516r接收由mmu生成的存储器读请求及其事务id(块318),并且可用于由如上所述的读仲裁器模块516r(在块312中)选择和发出。另外,如上所述,mmu读请求(由它们的特殊事务id所标识)可(通过读仲裁器模块516r)优先于高速缓存发起的读请求,以便使与mmu/tlb缺失相关联的延迟最小化。

在(块312中)发出mmu请求后,读仲裁器模块516r(在块314中)接收数据并且可以根据事务id识别出数据与由mmu208生成的存储器读请求相关。因此,读仲裁器模块516r将数据传递到mmu(块320)并且由读仲裁器模块516r或mmu208释放特殊的mmu事务id(块316)。如上所述,(例如,在嵌套转换的情况下)单个tlb缺失可能需要多个存储器查找,因此对于高速缓存发起的读或写请求,在转换在mmu中可用之前,读仲裁器模块516r可以接收另外的存储器读请求(如块316到块318的虚线箭头所指示的)。

一旦转换可用于与读请求对应的转换请求,则读事务跟踪器模块514r接收来自mmu的转换或指向tlb中的转换的指针以及与转换相关的事务id(块310),或者在可选的示例中,如图3b所示,指针指向的条目不再是未完成的。由于转换现在准备就绪,因此(由事务id标识的)存储器读请求准备发出并且因此可被传递到读仲裁器模块516r。

类似地,一旦转换可用于与写请求对应的转换请求,则写事务跟踪器模块514w接收来自mmu的转换或指向tlb中的转换的指针以及与转换相关的事务id(块310),或者在可选的示例中,如图3b所示,指针指向的条目不再是未完成的。由于转换现在准备就绪,因此(由事务id标识的)存储器写请求准备发出并且因此可被传递到写仲裁器模块516w。

如上所述,读仲裁器模块516r(例如,基于一个或多个规则)从那些准备好的存储器读请求中选择存储器读请求,并且使用(在块304中)先前分配的事务id将其发到外部总线206上(块312)。类似地,(虽然在一些示例中使用不同的规则来执行选择)写仲裁器模块516w从那些准备好的存储器写请求中选择存储器写请求并使用(在块304中)先前分配的事务id来将其发到外部总线206上(块312)。

在(块312中)发出具有特定事务id的存储器读请求后,读仲裁器模块516r接收具有匹配的事务id的读数据。基于事务id,读仲裁器模块516r可以确定存储器请求是由高速缓存204发起的还是由mmu208发起的,并且然后(针对高速缓存发起的请求)将读数据转发到读事务跟踪器模块514r或者(针对mmu发起的请求)将其转发到mmu208。

在(块312中)发出具有特定事务id的存储器写请求后,写仲裁器模块516w接收具有匹配的事务id的写响应并将写响应转发到写事务跟踪器模块514w。

如上所述,一旦读请求完成,则可以释放(在块304中)分派给高速缓存发起的请求的事务id(块316)。这意味着事务id返回到用于读请求的可用的事务id池,其可(在块304中)被分派给来自高速缓存的另一传入读请求。类似地,一旦写请求完成,则可以释放(在块304中)分派给高速缓存发起的请求的事务id(块316)。这意味着事务id返回到用于写请求的可用的事务id池,其可(在块304中)被分派给来自高速缓存的另一传入写请求。

在图3a和图3b中示出的方法中,使用了外部事务id并且当在图5中示出的存储器层次结构500中使用时,这些外部事务id从许多单独的id池中被分派,例如,一个池用于读请求,另一个池用于写请求以及又一个池用于mmu请求(其是读请求的特殊情况并因此由读路径处理)。将认识到,在各种示例中,可以存在其他事务id池,其用于其他类型的存储器请求并可由转换器模块502内的单独的路径(例如,提供与写请求对应的写数据的单独的路径)处理。

相比之下,在图4中示出的方法中,使用了内部事务id和外部事务id两者,其中当读/写请求准备发到外部总线上时,仅分派外部事务id。当在图5中示出的存储器层次结构500中使用时,图4的方法使用四种类型的事务id:内部读事务id、内部写事务id、mmu事务id(其可被认为是特殊类型的内部读事务id)和外部事务id。与图3a和图3b的方法不同,在图4的方法中,读分配模块512r和写分配模块512w分配内部事务id(即,读分配模块512r分配内部读事务id以及写分配模块512w分配内部写事务id),以及mmu208将mmu事务id分配给其生成的任何存储器请求。这些内部事务id然后在存储器请求发到外部总线上之前通过读仲裁器模块516r或写仲裁器模块516w映射到外部事务id。可以存在用于读和写的外部事务id的分开的池,或者可以存在用于读请求和写请求两者的外部事务id的单个集合。

通过以这种方式使用内部事务id,可能使用较少量的外部事务id,因为没有必要为mmu请求保留许多外部事务id。如上所述,这产生了更灵活的系统(例如,外部总线不需要支持来自高速缓存的n个请求加上来自mmu的m个请求,而是固定大小的外部事务id池可由在任何一个时间点恰好在飞行中的任何比例的mmu请求和高速缓存请求来使用)。可以选择可用的读和写内部事务id的数目以匹配外部总线和/或片外存储器的能力。可以选择包括mmu事务id的内部事务id的总数以匹配外部事务id的总数,或者可以存在比外部事务id更多的内部事务id。

在存在比外部id更多的内部事务id(包括mmu事务id)的情况下,也许不可能发出所有准备好的存储器请求,因为可能不存在任何可用的外部事务id,且因此存储器请求可在读仲裁器模块516r和/或写仲裁器模块516w和/或读事务跟踪器模块514r和/或写事务跟踪器模块514w内进行缓冲。

如果增加了内部读和/或写事务id(未包括mmu事务id)的数量,则用于跟踪所有未决读或写事务的相应的读事务跟踪器模块514r/写事务跟踪器模块514w中的存储器的大小分别变得更大;然而,存储器层次结构的效率提高。

在图4中示出的方法中,当与图5中示出的存储器层次结构500一起使用时,当转换器模块502从高速缓存204接收读请求(块302)时,内部读事务id通过读分配模块512r来从可用的内部读事务id池中分配(块404)。类似地,当转换器模块512从高速缓存204接收写请求(块302)时,内部写事务id通过写分配模块512w来从可用的内部写事务id池中分配(块404)。

一旦已经(在块404中)分配内部事务id,则针对该请求中的任何虚拟存储器地址,请求转换(块306)。如上所述,对于读请求,转换请求可通过读分配模块512r传递到mmu208(如图2中的箭头所示)或者通过读事务跟踪器模块514r传递到mmu208。类似地,对于写请求,转换请求可通过写分配模块512w传递到mmu208(如图2中的箭头所示)或者通过写事务跟踪器模块514w传递到mmu208。传递到mmu208的转换请求包括(在块404中)已经分配给传入存储器请求的内部读/写事务id。

在针对读请求的tlb命中(在块308中为“是”)的情况下,读事务跟踪器模块514r接收来自mmu的转换或指向tlb中的转换的指针以及与转换相关的内部读事务id(块310)。这使得跟踪每个未决的读事务的状态的读事务跟踪器模块514r能够更新所标识的读事务的状态,以示出转换已准备就绪。一旦转换准备就绪,则(由内部读事务id标识的)存储器读请求准备发出且因此可被传递到读仲裁器模块516r,该存储器读请求包括从tlb获得的物理地址(而不是虚拟存储器地址)。

在针对写请求的tlb命中(在块308中为“是”)的情况下,写事务跟踪器模块514w接收来自mmu的转换或指向tlb中的转换的指针以及与转换相关的内部写事务id(块310)。这使得跟踪每个未决的写事务的状态的写事务跟踪器模块514w能够更新所标识的写事务的状态,以示出转换已准备就绪。一旦转换准备就绪,则(由内部写事务id标识的)存储器写请求准备发出且因此可被传递到写仲裁器模块516w,该存储器写请求包括从tlb获得的物理地址(而不是虚拟存储器地址)。

读仲裁器模块516r从那些准备好的存储器读请求中选择存储器读请求(块411),其中如上所述,该选择可基于一个或多个规则。在可以发出存储器读请求(块413)之前,必须首先向存储器读请求分派来自可用的外部事务id池的外部事务id,并且内部读事务id和外部事务id之间的映射被存储在读仲裁器模块516r中(块412)。

类似地,写仲裁器模块516w从那些准备好的存储器写请求中选择存储器写请求(块411),其中,如上所述,该选择可基于一个或多个规则并且其中对于读仲裁器模块516r和写仲裁器模块516w,规则可以是不同的。在可以发出存储器写请求(块413)之前,必须首先向存储器写请求分派来自可用的外部事务id池的外部事务id(其中,如上所述,例如,对于具有分开的读/写通信的外部总线,可以存在分开的外部写事务id池和外部读事务id池),并且内部写事务id和外部事务id之间的映射被存储在写仲裁器模块516w中(块412)。

在各种示例中,外部事务id可通过仲裁器模块516r、516w中的每一个中的重映射逻辑分派,重映射逻辑保留其中内部读/写事务id已被分配给每个外部事务id的数组。当请求已经(在块411中)由仲裁器模块516r、516w选择时,重映射逻辑找到数组中的第一可用的空闲条目(其中每个仲裁器模块保持单独的数组并使用单独的外部事务id池)。内部读/写事务id被存储在该特定的数组条目中并且已经分配的条目编号然后形成外部事务id,其(在块413中)被输出到外部总线206上。

在(块413中)发出具有特定外部事务id的存储器请求后,读仲裁器模块516r接收具有匹配的外部事务id的读数据(块314)。然后,外部事务id被映射回到内部读事务id并且释放外部事务id(块415)。

在其中使用以上描述的数组的示例中,所接收的外部事务id被用作用于读请求的重映射数组的索引并且这允许获得原始内部读事务id。一旦发生这种情况,该条目被再次标记为空,允许外部事务id被重新分派给新的读请求。

基于内部读事务id,读仲裁器模块516r可确定存储器读请求是由高速缓存204发起的还是由mmu208发起的,并且然后(对于高速缓存发起的请求)将读数据转发到读事务跟踪器模块514r或者(对于mmu发起的请求)将读数据转发到mmu208。

一旦读请求完成,则可以释放(在块404中)分配给请求的内部读事务id(块416)。这意味着内部读事务id返回到可用的内部读事务id池,其可(在块404中)被分配给传入的读请求。

在(块413中)发出具有特定的外部事务id的存储器请求后,写仲裁器模块516w接收具有匹配的外部事务id的写响应(块314)。然后,外部事务id被映射回到内部写事务id并且释放外部事务id(块415)。

在其中使用以上描述的数组的示例中,所接收的外部事务id被用作用于写请求的重映射数组的索引并且这允许获得原始内部写事务id。一旦发生这种情况,该条目被再次标记为空,允许外部事务id被重新分派给新的写请求。在重映射后,写响应被转发到写事务跟踪器模块514w。

一旦写请求完成,则可以释放(在块404中)分派给请求的内部写事务id(块416)。这意味着内部写事务id返回到可用的内部写事务id池,其可(在块404中)被分派给传入的写请求。

在tlb缺失(在块308中为“否”)的情况下,(用于读请求的)读事务跟踪器模块514r或(用于写请求的)写事务跟踪器模块514w可以不立即从mmu208接收转换或转换指针(如以上参考图3a描述的)或者可接收指向被标记为未完成的条目的转换指针(如以上参考图3b描述的)。相反,mmu发出在mmu内分派了mmu事务id的存储器读请求。由mmu分派的mmu事务id可选自可用的mmu事务id池。读仲裁器模块516r接收由mmu生成的存储器读请求及其mmu事务id(块418),并且可用于(在块411中)选择和(在块413中)发出。mmu读请求(由其mmu事务id所标识)可以(在块411中选择读请求时)优先于高速缓存发起的读请求,以便使与mmu/tlb缺失相关联的延迟最小化。

在(块413中)发出存储器读请求之前,分派外部事务id并存储mmu到外部id的映射(块422)。外部事务id可从用于读请求的可用的外部事务id池中分派,并且与以上参考图3a和图3b描述的方法不同,相同的外部事务id池可用于高速缓存发起的存储器读请求和mmu发起的存储器读请求两者。

在示例中,外部事务id可由(以上描述的)读仲裁器模块516r中的重映射逻辑分派。当请求已经(在块411中)由读仲裁器模块516r选择时,重映射逻辑找到用于读请求的数组中的第一可用的空闲条目。mmu事务id存储在该特定的数组条目中,然后已经被分配的条目编号形成(在块413中)输出到外部总线206上的外部事务id。

在(块413中)发出mmu读请求后,读仲裁器模块516r(在块314中)接收数据连同外部事务id。该外部事务id然后被映射回到内部id,该内部id在该情况下为mmu事务id,并且例如使用由重映射逻辑保持的数组来释放外部事务id(块425)。

读仲裁器模块516r可根据mmu事务id识别出(块314中)接收的数据与由mmu208生成的存储器请求相关。因此,读仲裁器模块516r将数据传递到mmu(块320)并且mmu事务id由mmu208释放。如上所述,(例如,在嵌套转换的情况下)单个tlb缺失可能需要多个存储器查找,因此对于高速缓存发起的读/写请求,在转换在mmu中可用之前,读仲裁器模块516r可以接收另外的存储器读请求(由块320到块418的虚线箭头所指示的)。

一旦转换可用于读请求,读事务跟踪器模块514r接收来自mmu的转换或指向tlb中的转换的指针以及与转换相关的事务id(块310)。由于转换现在准备就绪,因此存储器读请求(由在块404中分派的内部事务id标识)准备发出并因此可被传递到读仲裁器模块516r。

读仲裁器模块516r从那些准备好的存储器读请求中选择存储器读请求(块411),分派外部事务id并存储内部到外部事务id的映射(块412)并且使用外部事务id将其发到外部总线206上(块413)。

在(块413中)发出具有特定外部事务id的存储器读请求后,读仲裁器模块516r接收具有匹配的事务id的读数据(块314)。读仲裁器模块516r(例如,以上描述的重映射逻辑)将外部事务id映射回内部事务id并释放外部事务id(块415)。基于内部事务id(其可以是mmu事务id或内部读事务id),读仲裁器模块516r可确定存储器请求是由高速缓存204发起的还是由mmu208发起的,并且然后(针对高速缓存发起的请求)将读数据转发到读事务跟踪器模块514r或者(针对mmu发起的请求)将读数据转发到mmu208。

如上所述,一旦读请求完成,就可以释放(在块404中)分派给高速缓存发起的读请求的内部读事务id(块416)。这意味着内部读事务id返回到可用的内部事务id池,其可(在块404中)被分派给来自高速缓存的另一传入读请求。

一旦转换可用于写请求,写事务跟踪器模块514w接收来自mmu的转换或指向tlb中的转换的指针以及与转换相关的事务id(块310)。由于转换现在准备就绪,因此存储器写请求(由在块404中分派的内部事务id标识)准备发出并因此可被传递到写仲裁器模块516w。

写仲裁器模块516w从那些准备好的存储器写请求中选择存储器写请求(块411),分派外部事务id并存储内部到外部事务id的映射(块412)并且使用外部事务id将其发到外部总线206(块413)。

在(块413中)发出具有特定外部事务id的存储器写请求后,写仲裁器模块516w接收具有匹配的事务id的写响应(块314)。写仲裁器模块516w(例如,以上描述的重映射逻辑)将外部事务id映射回内部事务id并释放外部事务id(块415)。写仲裁器模块516w将写响应转发到写事务跟踪器模块514w。

如上所述,一旦写请求完成,就可以释放(在块404中)分派给高速缓存发起的写请求的内部写事务id(块416)。这意味着内部写事务id返回到可用的内部事务id池,其可(在块404中)被分派给来自高速缓存的另一传入写请求。

在各种示例中,转换器模块202、502还可以执行冲突(hazard)检查,例如以检查请求之间的数据相关性并且然后确保在这样的相关性发生的情况下,较早的存储器请求在依赖于其的较晚的存储器请求之前执行。存在几种类型的冲突(其还可被称为地址或数据冲突):写后读(raw)、读后写(war)和写后写(waw)。在raw冲突中,写必须在读之前发生,否则错误的数据将被读取,以及在war冲突中,写必须在读之后发生,否则再一次地错误的数据将被读取。在waw冲突中,写必须按照正确的顺序发生,否则最终存储的数据将不是正确的。在一些示例中,还可以考虑读后读(rar)冲突(如下所述)。冲突检查可在分配模块212、512r、512w和/或事务跟踪器模块214、514r、514w内实现。

为了实现冲突检查,许多附加的检查被引入到以上描述的方法中,并且在存在分开的读和写路径(如在图5的层次结构500中一样)的情况下,每个路径中实现冲突检查的模块进行通信(例如,如虚线箭头520-524所指示的)。

图6和图7示出了其中执行冲突检查的转换器模块502的其他示例操作方法。图6是图3a中示出且以上所描述的方法的变型,以及图7是图4中示出且以上所描述的方法的变型;然而,在图6和图7中,分别示出了读和写路径的操作。此外,虽然图6和图7示出了在tlb缺失的情况下,没有立即接收指针(如以上参考图3a所描述的),但是在图6和图7中示出的方法的变型中,仍然可以接收指针但其可指向被标记为未完成的条目(如以上参考图3b所描述的)。

从图6和图7中可以看出,存在方法的三个附加的阶段(块605、611和615),但是在其他示例中,相同功能可在不同数量的附加阶段中实现或者可被并入到现有阶段中。首先,在已经分配了事务id(在块304或404中,其中这可以是如图6中的外部事务id或者如图7中的内部事务id)之后,执行对未决冲突的检查(块605)。该检查识别出是否存在需要在可以执行新事务之前完成的任何未决事务。未决事务是已经分配了事务id但尚未完成的事务,因此还没有清除事务id。可选地,未决事务可被称为飞行中事务。

由于冲突可发生在读事务和写事务之间(即,针对raw冲突和war冲突),因此通过转换器模块502的一个路径不能与其他路径隔离地执行冲突检查。相反,为了(在块605中)执行冲突检查,实现冲突检查的模块(例如,事务跟踪器模块514r、514w)需要关于所有未决的读和所有未决的写的至少一些信息,而与它们处于的路径无关。该信息可在每个路径中实现冲突检查的模块(例如,事务跟踪器模块514r、514w,如图5中的虚线箭头520所指示的)之间传达,或者可选地,模块可从高速缓存(例如,从其他路径中的分配模块512r、512w,如虚线箭头522、524所指示的)接收关于所有传入请求的数据。

如果(在块605中)针对传入读请求识别到未决冲突,则在读事务跟踪器模块514r中关于该传入请求设置位(或标志),并且(由于这是raw冲突)传入读请求所依赖的未决写请求(也在块605中)由写事务跟踪器模块514w用读请求的事务id来标记。如果还考虑了rar冲突且针对传入读请求识别到rar冲突,则传入读请求所依赖的未决读请求(也在块605中)由读事务跟踪器模块514r用读请求的事务id来标记。

如果(在块605中)针对传入写请求识别到未决冲突,则在写事务跟踪器模块514w中关于该传入请求设置位(或标志)。在waw冲突的情况下,传入写请求所依赖的未决写请求(也在块605中)由写事务跟踪器模块514w用写请求的事务id来标记。在war冲突的情况下,传入写请求所依赖的未决读请求(也在块605中)由读事务跟踪器模块514r用写请求的事务id来标记。

例如,可使用链表来实现(在块605中由事务跟踪器模块514r、514w)对未决请求的标记。例如,如果(在块605中)已经分派了事务id“004”的传入存储器请求被识别为依赖于已经分派了事务id“002”的未决存储器请求,则条目被添加到跟踪存储器请求“002”的事务跟踪器模块(即,如果id“002”的事务为读请求,则为读事务跟踪器模块514r,且如果id“002”的事务为写请求,则为写事务跟踪器模块514w)中的链表,其将事务“002”链接到事务“004”。因此,可以存在两个链表:读链表,其存储在读事务跟踪器模块514r中并存储依赖于较早的读请求的任何存储器请求的细节;以及写链表,其存储在写事务跟踪器模块514w中且存储依赖于较早的写请求的任何存储器请求的细节。

在各种示例中,可以使用单个链表,其包括读和写两者且因此跨两个事务跟踪器模块514r、514w(即,其部分地存储在事务跟踪器模块514r、514w中的每一个中并用作单个组合的链表)。

在各种示例中,链表(不管存在一个链表还是两个链表)被限制,使得只允许对特定地址的单个未完成请求(读或写),因为对相同地址的任何另外的请求应当始终具有排序依赖性且因此将被拖延直至列表中的较早的请求完成。在这样的实现方式中,rar冲突也被包括在冲突检查中,因为其简化了链表。如果rar冲突从冲突检查中排除(因为允许以任何顺序进行对同一地址的两次读不应该引起问题),则对同一地址的后续写请求将需要两个读在写请求的未决冲突位可被清除(如下所述)之前完成,并且这增加了链表和位清除机制的复杂性。

当事务具有在相关的事务跟踪器模块(即,用于读请求的读事务跟踪器模块514r以及用于写请求的写事务跟踪器模块514w)中设置的“未决冲突”位时,该存储器请求不能发到外部总线206上。在各种示例中,这意味着相关的事务跟踪器模块不能向相关的仲裁器模块(即,用于读请求的读仲裁器模块516r以及用于写请求的写仲裁器模块516w)输出存储器请求,直至“未决冲突”位已被清除。在(块312或411中)将存储器请求发到外部总线上之前,通过检查来在图6和图7中示出的示例中实现阻止这样的请求(其具有“未决冲突”位)的发出(块611)。如果(块611中)检查确定为存储器请求设置了“未决冲突”位,则该请求被暂停直至“未决冲突”位被清除。

一旦存储器请求所依赖于的未决请求已完成,则存储器请求的“未决冲突”位被清除。在释放由相关的分配模块(即,用于读请求的读分配模块512r和用于写请求的写分配模块512w)分派的事务id之前或同时,执行检查以识别依赖于已完成的请求的任何较晚的未决存储器请求(块615)。在链表用于记录(块605中的)相关性的情况下,该列表可被检查以(在块615中)识别依赖于已完成的请求的任何较晚的未决存储器请求。

如果(在块615中)识别了一个或多个未决存储器请求,但是只有在那些识别的未决存储器请求也不依赖于另一未决存储器请求时,那些存储器请求的未决冲突位(也在块615中)才可被清除。例如,如果存储器请求“003”依赖于两个存储器请求“002”和“001”,则存储器请求“003”的未决冲突位不能被清除,直到存储器请求“001”和存储器请求“002”都已完成。因此,在(块615中)清除未决冲突位之前,可以检查读事务跟踪器模块514r和写事务跟踪器模块514w两者中的数据(例如,可以检查读链表和写链表)。如上所述,在各种示例中,仅存在单个链表,并且在各种示例中,链表可以被限制,以仅允许对存储器中的单个地址的一个未决存储器请求。

在(如上所述)实现冲突检查的情况下,转换器模块502的早期阶段可以步伐一致地操作,使得两个事务跟踪器模块514r、514w同时从高速缓存204接收关于传入存储器请求的细节。

如上所述,事务跟踪器模块214、514r、514w可以通过存储每个未决读和/写事务的状态来跟踪每个事务。图8示出了两个示例状态图,其中第一状态图801用于读事务(如可由图2中的事务跟踪器模块214或图5中的读事务跟踪器模块514r使用),以及第二状态图802用于写事务(如可由图2中的事务跟踪器模块214或图5中的写事务跟踪器模块514w使用)。如从图8中可以看出,在读状态图801中存在5种可能的状态,以及在写状态图802中存在6种可能的状态,这是因为存在等待写数据可用的额外状态(“等待owdb数据”)。将认识到,这些状态图通过示例的方式提供,并且在各种示例中,在所使用的状态图中,可能存在关于读和/写事务的不同数量的可能状态。

将认识到,本文所描述的转换器模块202、502可以在硬件逻辑中实现,并且更具体地,分配模块212、512r、512w、事务跟踪器模块214、514r、514w和仲裁器模块216、516r、514w可以在硬件逻辑中实现。例如,事务跟踪器模块214、514r、514w可被实现为状态机的数组(例如,每事务id一个状态机),使得每个事务id可以被有效地独立跟踪(例如,如图3a、图3b、图4、图6和图7所示)。

转换器模块202、502和包含它们的存储器层次结构200、500可以与任何类型的处理器一起使用。在各种示例中,处理器可涉及并行计算且因此可以是gpu(例如,使得高速缓存204是gpul2高速缓存)或多线程cpu。在转换器模块202、502用于涉及大量并行处理的处理器(诸如gpu)的情况下,在执行mmu/tlb缺失中所花费的时间内可能存在许多要发出的存储器请求,且因此本文所描述的方法可以提高性能并且至少部分地隐藏mmu/tlb缺失所涉及的任何延迟。

在以上参考图4和图7描述的方法中,可能仅需要具有足够的外部事务id来覆盖外部总线206和连接到该总线的外部存储器的往返处理时间。虽然内部事务id的数量可以与外部事务id的数量相同,但是如上所述,可通过以用于跟踪事务跟踪器模块214、514r、514w内的未决事务的状态的较大存储器为代价提供更大数量的内部事务id来提高存储器层次结构的性能(例如,效率)。

在以上描述中,分配模块212、512r、512w仅将事务id分配给由高速缓存缺失引起的传入存储器请求。在各种示例中,可以更早地应用事务id,使得事务id(无论是如参考图3a、图3b和图6描述的内部事务id还是如参考图4和图7描述的外部事务id)被分配给由处理器(例如,由gpu)发出的所有存储器请求。然而,这需要更多的事务id可用或者存储器请求将被暂停,这是因为不存在要由分配模块212、512r、512w分配的可用事务id。

图9示出了在其中可以实现本文所描述的转换器的计算机系统。计算机系统包括cpu902、gpu904、存储器906和其他设备914,诸如显示器916、扬声器918和照相机920。转换器模块910可以在cpu902和/或gpu904中实现。计算机系统的组件可经由通信总线922彼此通信。

图2和图5的转换器模块202、502被示出为包括许多功能块。这仅是示意性且并不旨在定义这样的实体的不同逻辑元件之间的严格划分。可以以任何合适的方式设置每个功能块。应当理解的是,本文中被描述为由功能块形成的中间值不需要在任何点处由转换器模块物理地生成且可仅表示方便地描述由转换器模块在其输入端和输出端之间执行的处理的逻辑值。

第一另外的示例提供了模块,包括:分配模块,其被布置为从高速缓存(204)接收存储器请求并将事务标识符分配给每个接收的存储器请求,其中从高速缓存接收的存储器请求包括在虚拟地址空间中定义的一个或多个存储器地址;事务跟踪器模块,其被布置为从分配模块接收存储器请求连同所分配的事务标识符,跟踪存储器请求的状态并从存储器管理单元(208)接收转换信息,其中转换信息包括存储器请求中的虚拟存储器地址到物理存储器地址的转换或指向该转换的指针;以及仲裁器模块,其被布置为当存储器请求准备好发出时从事务跟踪器模块接收存储器请求连同所分配的事务标识符,并且经由外部总线将存储器请求发给存储器,并响应于经由外部总线从存储器接收到响应而触发对所分配的事务标识符的释放,其中发给存储器的存储器请求包括使用转换信息确定的一个或多个物理存储器地址。

仲裁器模块还可被布置为接收多个存储器请求,并从尚未发出的任何接收的存储器请求中选择要发出的存储器请求。仲裁器模块还可被布置为从存储器管理单元接收存储器读请求连同由存储器管理单元分配的事务标识符,并且选择来自存储器管理单元的存储器读请求以用于在从事务跟踪器模块接收到的尚未发出的任何存储器请求之前发出。仲裁器模块可被布置为根据预定义的规则来从尚未发出的任何接收的存储器请求中选择要发出的存储器请求。预定义的规则可导致先于从事务跟踪器模块接收的存储器请求选择从存储器管理单元接收的存储器请求,并且如果不存在从存储器管理单元接收的存储器请求,则至少部分地基于用于从事务跟踪器模块接收的存储器请求的转换信息的接收时间来选择从事务跟踪器模块接收的存储器请求。

由分配模块分配的事务标识符可以是外部事务标识符,而且其中仲裁器模块可被布置为使用所分配的外部事务标识符来发出存储器请求。仲裁器模块可以响应于经由外部总线接收来自存储器的响应(该响应包括外部事务标识符)而被布置为识别从其接收到具有相同外部事务标识符的相应请求的单元并且将该响应传输到所识别的单元,其中该单元包括事务跟踪器模块或存储器管理单元。

由分配模块分配的事务标识符可以是内部事务标识符,而且其中仲裁器模块还在选择用于发出的存储器请求之后被布置为将外部事务标识符分派给存储器请求并存储所分配的内部事务标识符和所分派的外部事务标识符之间的映射,而且其中仲裁器模块被布置为使用所分派的外部事务标识符来发出存储器请求。仲裁器模块可以响应于经由外部总线接收来自存储器的响应(该响应包括外部事务标识符)而被布置为将外部事务标识符映射回到所分配的内部事务标识符,识别从其接收到具有相同内部事务标识符的相应请求的单元并且将该响应传输到所识别的单元,其中该单元包括事务跟踪器模块或存储器管理单元。

该模块可包括布置为从高速缓存接收存储器读请求的读路径和布置为从高速缓存接收存储器写请求的写路径,其中读路径包括分配模块、事务跟踪器模块和仲裁器模块,而且其中写路径包括第二分配模块、第二事务跟踪器模块和第二仲裁器模块。事务跟踪器模块和第二事务跟踪器模块都可以被布置为针对数据冲突检查来自高速缓存的传入存储器请求,并且响应于检测到冲突,为传入事务设置标志,而且其中如果该标志被设置,则存储器请求没有准备好发出。事务跟踪器模块和第二事务跟踪器模块都可以被布置为响应于经由外部总线从存储器接收用于较早的存储器请求的响应,清除依赖于该较早的存储器请求的存储器请求的标志。

第二另外的示例提供了一种方法,包括:在转换器模块处从高速缓存接收存储器请求;在转换器模块中,将事务标识符分配给每个接收的存储器请求,其中从高速缓存接收的存储器请求包括在虚拟地址空间中定义的一个或多个存储器地址;在转换器模块中,跟踪存储器请求的状态;在转换器模块中,从存储器管理单元接收转换信息,其中转换信息包括存储器请求中的一个中的虚拟存储器地址到物理存储器地址的转换或指向该转换的指针;经由外部总线将来自转换器模块的存储器请求中的所述一个发到存储器,其中发到存储器的存储器请求包括使用转换信息确定的一个或多个物理存储器地址;以及响应于经由外部总线从存储器接收到响应,触发对所分配的事务标识符的释放。

该方法还可包括:从尚未发出的任何接收的存储器请求中选择要发出的存储器请求。该方法还可包括:从存储器管理单元接收存储器读请求连同由存储器管理单元分配的事务标识符,而且其中选择存储器请求包括选择从存储器管理单元接收的存储器读请求以用于在从高速缓存接收的任何存储器请求之前发出。可以根据预定义的规则来选择要发出的存储器请求。预定义的规则可导致先于从高速缓存接收的存储器请求选择从存储器管理单元接收的存储器请求,并且如果不存在从存储器管理单元接收的存储器请求,则至少部分地基于用于从高速缓存接收的存储器请求的转换信息的接收时间来选择该存储器请求。

所分配的事务标识符可以是外部事务标识符并且存储器请求使用所分配的外部事务标识符来发出。

所分配的事务标识符可以是内部事务标识符,而且其中该方法还可包括在选择用于发出的存储器请求之后:将外部事务标识符分派给存储器请求;以及存储所分配的内部事务标识符和所分派的外部事务标识符之间的映射,而且其中存储器请求使用所分派的外部事务标识符来发出。该方法还可包括:响应于经由外部总线从存储器接收到包括外部事务标识符的响应,将外部事务标识符映射回到所分配的内部事务标识符。

该方法还可包括:针对数据冲突检查从高速缓存接收的存储器请求;以及响应于检测到冲突,为传入请求设置标志,而且其中如果该标志被设置,则存储器请求不能被发出。该方法还可包括:响应于经由外部总线从存储器接收到对于较早的存储器请求的响应,清除依赖于该较早的存储器请求的存储器请求的标志(615)。

第三方面提供了一种系统,包括:处理器,其被布置为将事务标识符分配给由处理器发出的每个存储器请求;以及模块,其包括:分配模块,其被布置为从高速缓存接收存储器请求,其中从高速缓存接收的存储器请求包括由处理器分配的事务标识符和在虚拟地址空间中定义的一个或多个存储器地址;事务跟踪器模块,其被布置为从分配模块接收存储器请求连同所分配的事务标识符,跟踪存储器请求的状态并从存储器管理单元接收转换信息,其中转换信息包括存储器请求中的虚拟存储器地址到物理存储器地址的转换或指向该转换的指针;以及仲裁器模块,其被布置为当存储器请求准备好发出时,从事务跟踪器模块接收存储器请求连同所分配的事务标识符,并且经由外部总线将存储器请求发给存储器并响应于经由外部总线从存储器接收到响应,触发对所分配的事务标识符的释放,其中发给存储器的存储器请求包括使用转换信息确定的一个或多个物理存储器地址。

第四方面提供了一种方法,包括:在处理器中,将事务标识符分配给每个发出的存储器请求;在转换器模块处,从高速缓存接收存储器请求;其中,从高速缓存接收的存储器请求包括由处理器分配的事务标识符和在虚拟地址空间中定义的一个或多个存储器地址;在转换器模块中,跟踪存储器请求的状态;在转换器模块中,从存储器管理单元接收转换信息,其中转换信息包括存储器请求中的虚拟存储器地址到物理存储器地址的转换或指向该转换的指针;经由外部总线将来自转换器模块的存储器请求发到存储器,其中发到存储器的存储器请求包括使用转换信息确定的一个或多个物理存储器地址;以及响应于经由外部总线从存储器接收到响应,触发对所分配的事务标识符的释放。

第五方面提供了集成电路制造系统,包括:非暂时性计算机可读存储介质,其具有在其上存储的集成电路的计算机可读描述,该集成电路的计算机可读描述描述了图形处理系统;布局处理系统,其被配置为对集成电路描述进行处理,以便生成体现图形处理系统的集成电路的电路布局描述;以及集成电路生成系统,其被配置为根据电路布局描述来制造图形处理系统,其中处理系统包括如本文所述的模块。

其他方面提供:处理系统,其被配置为执行本文所述的方法中的任一个;处理系统,其包括在集成电路上的硬件中体现的如本文所述的模块;计算机可读代码,其适于当代码运行在计算机上时,执行本文所述的方法中的任一个的步骤;计算机可读存储介质,其具有在其上编码的计算机可读代码;在集成电路制造系统处制造包括如本文所述的模块的处理系统的方法;集成电路定义数据集,当其在集成电路制造系统中处理时,将系统配置为制造包括如本文所述的模块的处理系统;以及计算机可读存储介质,其具有在其上存储的集成电路的计算机可读描述,当其在集成电路制造系统中处理时,使集成电路制造系统制造包括如本文所述的模块的处理系统。

本文所描述的转换器模块可被体现在集成电路上的硬件中。本文所描述的转换器模块可被配置为执行本文所描述的方法中的任一个。通常,以上描述的功能、方法、技术或组件中的任一个可以在软件、固件、硬件(例如,固定逻辑电路)或其任何组合中实现。本文中使用的术语“模块”、“功能”、“组件”、“元件”、“单元”、“块”和“逻辑”通常可以表示软件、固件、硬件或其任何组合。在软件实现的情况下,模块、功能、组件、元件、单元、块或逻辑表示程序代码,当其在处理器上执行时,程序代码执行指定的任务。本文所描述的算法和方法可由执行使处理器执行算法/方法的代码的一个或多个处理器执行。计算机可读存储介质的示例包括随机存取存储器(ram)、只读存储器(rom)、光盘、闪存、硬盘存储器以及可使用磁、光和其他技术来存储指令或其他数据且可由机器访问的其他存储器设备。

如本文所使用的术语计算机程序代码和计算机可读指令指的是用于处理器的任何种类的可执行代码,包括以机器语言、解释语言或脚本语言表达的代码。可执行代码包括二进制码、机器码、字节码、定义集成电路的代码(诸如硬件描述语言或网表)以及以诸如c、java或opencl的编程语言代码表达的代码。可执行代码可以是例如,任何种类的软件、固件、脚本、模块或库,当其在虚拟机或其他软件环境下被适当执行、处理、解释、编译、执行时,使支持可执行代码的计算机系统的处理器执行由代码指定的任务。

处理器、计算机或计算机系统可以是具有处理能力使得其可执行指令的任何种类的设备、机器或专用电路或其集合或部分。处理器可以是任何种类的通用或专用处理器,诸如cpu、gpu、片上系统、状态机、媒体处理器、专用集成电路(asic)、可编程逻辑阵列、现场可编程门阵列(fpga)、物理处理单元(ppu)、无线电处理单元(rpu)、数字信号处理器(dsp)、通用处理器(例如,通用gpu)、微处理器、被设计为在cpu外加速任务的任何处理单元等。计算机或计算机系统可包括一个或多个处理器。本领域中的技术人员将认识到,这样的处理能力被合并到很多不同的设备内,且因此术语“计算机”包括机顶盒、媒体播放器、数字收音机、pc、服务器、移动电话、个人数字助理和很多其它设备。

还旨在包括定义如本文所述的硬件的配置的软件,诸如hdl(硬件描述语言)软件,如用于设计集成电路或用于配置可编程芯片以执行期望功能。也就是说,可以提供计算机可读存储介质,其具有在其上编码的以集成电路定义数据集的形式的计算可读程序代码,当其在集成电路制造系统中处理时,将系统配置为制造转换器模块,该转换器模块被配置为执行本文所述的方法中的任一个,或者将系统配置为制造包括本文所述的任何装置的处理器和/或高速缓存层次结构。集成电路定义数据集可以是例如,集成电路描述。

集成电路定义数据集可以是计算机代码的形式,例如,作为用于配置可编程芯片的网表、代码,作为定义任何级别的集成电路的硬件描述语言,包括作为寄存器传输级(rtl)代码、作为诸如verilog或vhdl的高级电路表示以及作为诸如oasis(rtm)和gdsii的低级电路表示。逻辑上定义集成电路的更高级表示(诸如rtl)可以在计算机系统处进行处理,该计算机系统被配置用于在软件环境的背景中生成集成电路的制造定义,包括电路元件的定义和用于组合这些元件的规则以便生成由表示如此生成定义的集成电路的制造定义。如通常在计算机系统处执行以定义机器的软件的情况,可能需要一个或多个中间用户步骤(例如,提供命令、变量等),以便使计算机系统被配置用于生成集成电路的制造定义以执行定义集成电路的代码,以便生成该集成电路的制造定义。

现在将参考图10描述在集成电路制造系统处对集成电路定义数据集进行处理以便使系统配置为制造转换器模块或包括如上所述的转换器模块的处理器的示例。

图10示出了集成电路(ic)制造系统1002的示例,其包括布局处理系统1004和集成电路生成系统1006。ic制造系统1002被配置为接收ic定义数据集(例如,定义如在本文中的示例中的任一个中描述的转换器模块202、502或包括这样的转换器模块的处理器),对ic定义数据集进行处理并且根据ic定义数据集来生成ic(例如,其体现本文中的示例中的任一个中描述的转换器模块或包括这样的转换器模块的处理器)。对ic定义数据集的处理使ic制造系统1002配置为制造体现如本文中的示例中的任一个中描述的转换器模块(或包括转换器模块的处理器)的集成电路。更具体地,布局处理系统1004被配置为接收和处理ic定义数据集,以确定电路布局。

根据ic定义数据集确定电路布局的方法在本领域中是已知的,并且例如可涉及合成rtl代码以例如根据逻辑组件(例如,与非(nand)、或非(nor)、与(and)、或(or)、多路复用(mux)和触发器(flip-flop)组件),确定要生成的电路的门级表示。电路布局可通过确定用于逻辑组件的位置信息来从电路的门级表示确定。这可以自动地或者通过用户参与来完成,以便优化电路布局。当布局处理系统1004已经确定电路布局时,它可以向ic生成系统1006输出电路布局定义。

如本领域中已知的,ic生成系统1006根据电路布局定义来生成ic。例如,ic生成系统1006可以实现半导体设备制造工艺以生成ic,半导体设备制造工艺可涉及光刻的多步骤序列和化学处理步骤,在此期间,电子电路逐渐地在由半导体材料制成的晶片上形成。电路布局定义可以是可以在光刻工艺中使用的掩膜的形式以用于根据电路定义来生成ic。可选地,提供给ic生成系统1006的电路布局定义可以是计算机可读代码的形式,ic生成系统1006可以使用该代码以形成用于生成ic的合适的掩膜。

由ic制造系统1002执行的不同过程可以例如通过一方来全部在一个位置中实现。可选地,ic制造系统1002可以是分布式系统,使得一些过程可以在不同位置处执行并且可由不同方执行。例如,以下阶段中的一些可以在不同位置处执行和/或由不同方执行:(i)合成表示ic定义数据集的rtl代码,以形成要生成的电路的门级表示,(ii)基于门级表示,生成电路布局,(iii)根据电路布局来形成掩膜,以及(iv)使用掩膜来制造集成电路。

在其他示例中,在集成电路制造系统处的对集成电路定义数据集的处理可使系统配置为在没有ic定义数据集被处理以便确定电路布局的情况下,制造转换器模块(或包括转换器模块的处理器)。例如,集成电路定义数据集可定义诸如fpga的可重配置处理器的配置,并且对该数据集的处理可使ic制造系统配置为(例如,通过将配置数据加载到fpga)生成具有该所定义的配置的可重配置处理器。

在一些示例中,集成电路定义数据集可以包括运行在由数据集定义的硬件上的软件或者与由数据集定义的硬件组合的软件。在图10中示出的示例中,ic生成系统还可由集成电路定义数据集配置为在制造集成电路时,根据在集成电路定义数据集处定义的程序代码来将固件加载到该集成电路上,或者以其他方式向程序代码提供集成电路以供集成电路使用。

本领域中的技术人员将认识到,用于存储程序指令的存储设备可被分布在网络当中。例如,远程计算机可存储被描述为软件的过程的示例。本地或终端计算机可访问远程计算机并下载软件的一部分或全部以运行程序。可选地,本地计算机可根据需要下载软件的片段,或在本地终端处执行一些软件指令并在远程计算机(或计算机网络)处执行一些软件指令。本领域中的技术人员也将认识到,通过利用本领域中的技术人员已知的常规技术,软件指令的全部或一部分可由专用电路(诸如dsp、可编程逻辑阵列等)执行。

本文所述的方法可由配置有软件的计算机执行,软件是以机器可读形式存储在有形存储介质上,例如,以包括用于配置计算机以执行所描述的方法的组成部分的计算机可读程序代码的计算机程序的形式或以包括适于当程序在计算机上运行时执行本文所述的任何方法的所有步骤的计算机程序代码装置的计算机程序的形式,且其中计算机程序可被体现在计算机可读存储介质上。有形(或非暂时性)存储介质的示例包括磁盘、拇指驱动器、存储卡等,且不包括传播信号。软件可适合于在并行处理器或串行处理器上执行,使得方法步骤可以以任何合适的顺序或同时执行。

本文描述的硬件组件可由非暂时性计算机可读存储介质生成,非暂时性计算机可读存储介质具有在其上编码的计算机可读程序代码。

存储机器可执行数据以用于实现所公开的方面的存储器可以是非暂时性介质。非暂时性介质可以是易失性或非易失性的。易失性非暂时性介质的示例包括基于半导体的存储器,诸如sram或dram。可用于实现非易失性存储器的技术的示例包括光学和磁存储器技术、闪存、相变存储器、电阻式ram。

对“逻辑”的特定引用指的是执行一种或多种功能的结构。逻辑的示例包括被布置成执行那些功能的电路。例如,这样的电路可包括晶体管和/或在制造过程中可用的其它硬件元件。作为示例,这样的晶体管和/或其它元件可用于形成实现和/或包含存储器(诸如寄存器、触发器或锁存器)、逻辑运算器(诸如布尔运算)、数学运算器(诸如加法器、乘法器或移位器)的电路或结构并且互相连接。这样的元件可作为定制电路或标准单元库、宏或者在其它抽象级处提供。这样的元件可以以特定布置互连。逻辑可包括固定功能的电路,且电路可被编程以执行一种或多种功能;这样的编程可从固件或软件更新或控制机制中被提供。被识别为执行一种功能的逻辑也可包括实现组成功能或子过程的逻辑。在示例中,硬件逻辑具有实现固定功能操作或多个操作、状态机或过程的电路。

本文给出的任何范围或设备值可被扩展或改变而不失去所寻求的效应,如对技术人员将明显的。

将理解,上面所述的益处和优点可与一个实施方式有关或可与几个实施方式有关。实施方式不限于解决任何或全部所陈述的问题的实施方式或具有任何或所有所陈述的益处和优点的实施方式。

对“一个(an)”项目的任何引用指的是那些项目中的一个或多个。术语“包括(comprising)”在本文用于意指包括所识别的方法块或元件,但这样的块或元件不包括排他性列表,且装置可包含附加的块或元件,以及方法可包含附加的操作或元件。此外,块、元件和操作本身不是隐含地封闭的。

本文描述的方法的步骤可在适当时以任何适当的顺序或同时被执行。在附图中的方框之间的箭头示出方法步骤的一个示例顺序,但并不旨在排除其它顺序或并行执行多个步骤。此外,各个块可从任何方法中删除而不偏离本文描述的主题的精神和范围。上面描述的示例中的任一个的方面可与所描述的其它示例中的任一个的方面组合以形成另外的示例,而不失去所寻求的效果。在附图中的元件被示为由箭头连接的情况下,将认识到,这些箭头仅示出元件之间的通信(包括数据和控制消息)的一个示例流。元件之间的流可以在任一方向上或在两个方向上。

申请人由此单独地公开了本文所描述的每个单独特征和两个或更多个这样的特征的任意组合,在某种程度上,这样的特征或组合能够基于作为整体的本说明书根据本领域中的技术人员的通用常识来执行,而不管这样的特征或特征组合是否解决了本文所公开的任何问题。鉴于前述描述,对于本领域中的技术人员将明显的是,可以在本发明的范围内做出各种修改。

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