折叠式FIFO存储器生成器 |
|||||||
申请号 | CN201310658886.4 | 申请日 | 2013-12-06 | 公开(公告)号 | CN103853522A | 公开(公告)日 | 2014-06-11 |
申请人 | 辉达公司; | 发明人 | 罗伯特·A·阿尔菲里; | ||||
摘要 | 公开了折叠式FIFO 存储器 生成器。可以使用表示先进先出(FIFO)存储器的可综合代码来产生 硬件 元件或者系统中的FIFO存储器。为了更有效地使用FIFO中的存储数据的存储器元件,代码生成器可以生成 线程束 ,其使得FIFO能够使用具有不同于FIFO的规格的规格(即深度和宽度)的存储器元件。例如,线程束使得128深、1位宽的FIFO能够将数据存储在具有每行存储8位的16行的存储器元件中。对于与FIFO通信的任何系统,尽管FIFO使用16×8存储器元件来实现,但FIFO的表现就像128×1FIFO。为了这样做,代码生成器可以生成线程束,其使得折叠式存储器元件的表现就像非折叠式存储器元件。 | ||||||
权利要求 | 1.一种方法,包括: |
||||||
说明书全文 | 折叠式FIFO存储器生成器技术领域背景技术[0002] 设计为处理数据的集成电路一般使用FIFO存储器来在处理级之间存储数据。这些FIFO存储器可以具有不同的宽度、深度、以及不同的输入和输出时钟频率。照惯例,产生可综合代码的生成器已被用来产生不同变化的FIFO存储器。然而,FIFO存储器的不同物理特性可能导致低效率。例如,生成器响应于请求,可以产生与128×1FIFO(即具有每条目1位的128个条目的FIFO)对应的可综合代码。然而,如果使用RAM来实现该FIFO,那么RAM单元的宽度可以至少是8位宽。相应地,128深的FIFO将要求每行8位宽的128行的RAM。因为每个条目仅存储1位,所以行中的其他7位未被使用。这种低效率可能导致硬件系统消耗附加的功率,并且要求的空间比所必须的更多。 发明内容[0003] 本发明的实施例描述接收将第一数据部分存储在FIFO存储器中的请求的方法和计算机可读存储介质。方法和存储介质将第一数据部分存储在FIFO存储器中的缓冲区中。方法和介质接收将第二数据部分存储在FIFO存储器中的请求,并且对将第二数据部分存储在缓冲区将会超过缓冲区的容量进行确定。方法和存储介质将缓冲区的内容存储到FIFO存储器中的存储器元件的单个行,其中存储器元件中的每行设定大小为存储多个数据部分。 [0004] 本发明的另一个实施例描述FIFO存储器,其包括用于存储与由FIFO存储器所接收的写请求相关联的多个数据部分的缓冲区。FIFO存储器还包括耦连到缓冲区的存储器元件,其中存储器元件中的每行设定大小为存储多个数据部分。FIFO存储器包括路由逻辑,其配置为对将下一个数据部分存储在缓冲区将会超过缓冲区的容量进行确定,并且将缓冲区的内容存储到存储器元件的单个行。 [0005] 通过折叠FIFO存储器的深度和宽度以与对应的存储器元件的规格一致,本实施例可以改善能效以及硬件系统所需的面积。具体,相对其规格没有被折叠的用于FIFO的存储器元件,获得的存储器元件可以减少未使用的存储单元的数目。附图说明 [0006] 因此,可以详细地理解本发明上述特征,并且可以参考施例得到对如上面所简要概括的本发明更具体的描述,其中一些实施例在附图中示出。然而,应当注意的是,附图仅示出了本发明的典型实施例,因此不应被认为是对其范围的限制,本发明可以具有其他等效的实施例。 [0007] 图1示出根据本发明的一个实施例的、包括FIFO代码生成器的计算设备的框图。 [0008] 图2示出根据本发明的一个实施例的、包括具有折叠式存储器单元的FIFO的硬件系统的框图。 [0009] 图3A-3G示出根据本发明的实施例的、写入FIFO存储器和从FIFO存储器读取。 [0010] 图4A-4B示出根据本发明的实施例的、从FIFO存储器中的相同存储器地址写入数据和读取数据。 [0011] 图5是根据本发明的一个实施例的、用于确定何时折叠FIFO的存储器元件的方法。 [0012] 图6示出根据本发明的一个实施例的、由多个线程访问的FIFO的硬件系统。 具体实施方式[0014] 为了更有效地使用FIFO中的存储数据的存储器元件,代码生成器可以生成线程束(wrapper),其使得FIFO能够使用具有不同于FIFO的规格的规格(即深度和宽度)的存储器元件。例如,线程束使得128深、1位宽的FIFO能够将数据存储在具有每行存储8位的16行存储器元件中。对于与FIFO通信的任何系统,尽管FIFO使用16×8存储器元件来实现,但FIFO的表现就像128×1FIFO。在一个实施例中,FIFO的规格被折叠以确定对应的存储器元件的规格。例如,假如代码生成器被要求配置具有每条目1位宽的128个条目(128×1)的FIFO。然而,如果存储器元件的各个行被限制为最小8位,在没有对存储器元件的规格进行折叠的情况下,用于该FIFO的实际存储器元件可能是128×8(即具有每行9个存储单元的128行)。在这样的实施例中,每行中的7位可能未被使用。相反,生成器可以折叠所要求的FIFO的规格,从而减小存储器元件的深度并将宽度增加对应量以维持存储器元件的总存储大小。例如,以因子2折叠的128×1FIFO可以由64×2存储器元件来实现。 [0015] 代码生成器可以生成线程束,其使得折叠式存储器元件能够表现得像未折叠的存储器元件。特别是,线程束包括支配数据如何读入和读出折叠式存储器元件的逻辑。以使用128×1FIFO为例,线程束可以将数据存储在折叠式16×8存储器元件中的8位块中。这样,存储器元件中的每个存储位置均可以被使用。相对于使用非折叠式存储器元件,将存储器元件的规格进行折叠不仅提高了存储效率,获得的存储器元件可能要求更小的面积(例如在集成电路中具有更小的占地面积)。继续以上示例,折叠式16×8存储器元件仅需要足以存储128位的面积,而128×8存储器元件要求存储1024位所需的面积。 [0016] 图1示出根据本发明的一个实施例的、包括FIFO代码生成器115的计算系统100的框图。具体地,系统100包括处理器105和系统存储器110。FIFO生成器115可以是存储在存储器110中的程序或者应用程序。生成器115当由处理器105执行时,产生表示FIFO存储器的可综合代码120。可综合代码120可以与由生成器程序所产生的或者由程序员授权的其他代码结合,以产生用于集成电路的可综合代码。可以以Verilog、VHDL或者本领域技术人员已知的其他硬件描述语言来写可综合代码120。可以使用商业上可获得的综合工@ @具诸如由Synopsys公司开发的Design Complier 和由Synplicity公司开发的Synplify来对可综合代码120进行综合,以产生限定集成电路的部件和连接的网表。在一个实施例中,网表可以用于设计和制造图形处理单元(GPU)中的FIFO存储器,GPU可以用在诸如台式计算机、笔记本电脑、移动电话、服务器等计算设备中。 [0017] 图2示出根据本发明的一个实施例的、包括具有折叠式存储器单元的FIFO的硬件系统200的框图。硬件系统200可以是集成电路(例如GPU或者CPU)、FPGA、存储器、安装在共享PCB上的硬件单元等。硬件系统包括至少部分是使用图1的可综合代码生成的FIFO210。也就是说,FIFO210包括其功能由FIFO代码生成器所产生的可综合代码限定的一个或多个硬件元件。FIFO210包括FIFO逻辑215,其包括用于实施FIFO操作(例如存储和取回)所需的逻辑。FIFO逻辑215还可以被赋予任务:接收来自硬件系统200中的其他部件的数据存储请求,以及传送所请求的数据到这些部件。FIFO210包括线程束220,其使得FIFO逻辑215能够与折叠式随机存取存储器(RAM)225交互。例如,FIFO逻辑215可以输入数据和对应的写地址到线程束220,线程束220随后控制如何将数据写到折叠式RAM225。通过使用线程束220,FIFO逻辑215可以配置为,就像FIFO逻辑215被耦连到非折叠式存储器元件而不是折叠式存储器元件一样实施。在一个实施例中,FIFO逻辑215可以是即使FIFO210包括非折叠式存储器单元其仍然会被使用的相同的逻辑。因此,为了使用FIFO210中的折叠式存储器,只需要增加线程束220到FIFO210,而FIFO逻辑215的其余部分可以保持基本不变。 [0018] 折叠式RAM225是具不同于描述FIFO210的深度和宽度规格的规格的存储器元件。在一个实施例中,即使规格可能不同,但总存储空间可以相同(虽然这并不被要求)。例如在总存储容量可以不同的情况下,用户可能期望每条目存储3位的128个条目的FIFO(即最大容量386位)。因为与RAM相关联的物理的或者设计限制,折叠式RAM225的规格可以是 64×8(最大容量512位),而不是例如将会与128×3FIFO的容量匹配的32×6。因此,在FIFO210的操作期间,折叠式RAM225可能包括未被使用的存储位置。尽管如此,即使一些位置未被使用,与使用非折叠式存储器单元(例如128×8RAM)相比,折叠式RAM225仍可能是更节能的和/或面积有效的。虽然在本发明的实施例中RAM示出为FIFO210的存储元件,但本公开并不限于此。在其他实施例中,存储器元件可以由触发器、寄存器、锁存器等实现。 [0019] 图3A-3G示出了根据本发明的实施例的、写入使用线程束220和折叠式RAM225的FIFO存储器以及从使用线程束220和折叠式RAM225的FIFO存储器读取。具体地,线程束220包括缓冲区302(buff)和折叠式RAM225。缓冲区302是与折叠式RAM225分开的存储器元件,并且可以包括多个触发器、锁存器、寄存器等。缓冲区302的输入端耦连到线程束 220的输入(di),并且在该示例中是8位宽。对于图3A-3G,假设FIFO是使用16×8折叠式RAM225来实现的128深1位宽的存储器。 [0020] 如图3A所示,根据时钟信号(例如前沿或者后沿),线程束220按照写使能(we)信号所指示的接收将存储在FIFO中的位301。FIFO逻辑(未示出)可以转发位301到线程束并控制写使能信号。如图3B所示,线程束220根据写地址(wa)将所接收的位存储在缓冲区302。然而此时,位301没有存储在折叠式RAM255(即FIFO的主要存储元件)。相反,位301保持存储在缓冲区302。在一个实施例中,写过程可以描述为位301被接收并且随后存储在缓冲区302的两步骤的过程。写过程可以在两个顺序的时钟周期期间或者在相同周期的上升沿和下降沿期间发生。 [0021] 如图3C所示,重复写过程直到缓冲区302已满。例如,在FIFO逻辑对应于每个命令传送给线程束220一位的情况下,FIFO可以接收8个存储命令。线程束220将这些位存储在缓冲区302。当线程束220将第8个所接收的位存储在缓冲区302时,读使能(re)信号指示FIFO应该输出第1个存储在FIFO中的数据位。 [0022] 图3D示出了使得线程束220能够从缓冲区302或者折叠式RAM225读取数据来满足读请求的逻辑。具体地,线程束220包括存储器选择器305,其配置为确定所请求的数据是存储在缓冲区302还是折叠式RAM225中。如果数据在缓冲区302中,那么存储器选择器305使用可以基于读地址(ra)的3-位信号来从缓冲区302选择对应的位。例如,缓冲区 302中的每个存储器位置可以耦连到8个输入端/1个输出端的多路复用器306或者使用 3-位信号来选择存储位置之一的多路复用器(mux)。如果数据存储在折叠式RAM225中,那么存储器选择器305可以传送4-位行地址信号到折叠式RAM225,其选择数据所位于的行。 下面将具体描述从RAM225读取。 [0023] 因为与图3D中所提供的读地址对应的数据(即位301)存储在缓冲区302中,所以存储器选择器305传送该数据的复制到延迟缓冲区307(buff_d)。也就是说,在一个实施例中,在位301没有被从缓冲区302驱逐的情况下,其被存储在延迟缓冲区307。即使在线程束220中位302保持存储在存储器元件中,线程束之外的FIFO逻辑也可以使与位301相对应的存储器地址无效——即地址1。因此,在取回操作期间,正在读出的数据可能被从FIFO逻辑上驱逐,而实际的数据可以保持存储在FIFO中。继续该示例,地址2成为FIFO存储器的顶部。因此,如果FIFO被要求实施另一个取回操作,那么由FIFO逻辑所提供的新的读地址会是地址2。因此,在该实施例中,管理数据可以由在线程束220外部的FIFO逻辑来实施。然而在其他实施例中,线程束220自身可以具有管理和存储数据两者所需的电路。 [0024] 因为所请求的数据可以来自缓冲区302或者折叠式RAM225,所以线程束220包括多路复用器313,其由延迟缓冲区控制信号(use_buff_d)控制。如在此所示,如果该信号为低,那么线程束220的输出(dout)是延迟缓冲区307的输出。如果信号为高,那么输出位由折叠RAM225提供。 [0025] 在图3E,线程束220按照写使能信号的指示在输入处接收第9位315。然而在存储所接收的数据之前,线程束220可以转移存储在缓冲区302中的至少部分数据到折叠式RAM225。在一个实施例中,线程束220可以使用写使能信号和当前写地址的组合,来确定是否应该转移缓冲区302中的至少一些内容。例如,如果写使能信号为高并且写地址具有与缓冲区302的多个存储容量对应的值,那么线程束220将缓冲区302中的数据转移到折叠式RAM225。 [0026] 如图3F所示,缓冲区302的内容被存储到折叠式RAM225(例如第1行)。此外,将输入位315存储在目前空的缓冲区302。虽然,示出为同步发生,在另一个实施例中,图3F所示的过程可以例如发生在不同的时钟周期。随着更多的数据存储到FIFO,线程束220可以继续填满缓冲区302。一旦该存储器元件再次填满,线程束220可以将数据转移到折叠式RAM225。在一个实施例中,一旦确定缓冲区302是满的,无需等待直到新的数据被接收,线程束220就可以转移数据。 [0027] 在一个实施例中,线程束220之外的FIFO逻辑可以确定如果超出FIFO的容量则该做什么,在该示例中,这在FIFO被要求存储128位以上的数据时发生。在一个实施例中,如果要求存储大于FIFO容量,那么如果发送器是可停的(stallable)则FIFO逻辑可以反压发送器。而且,FIFO逻辑可以继续确定与FIFO顶部对应的地址。假设例如FIFO存储128位数据并且读出第一个8位。因为顺序访问FIFO中的数据,所以由FIFO逻辑将存储在地址1-8处的第一个8位数据无效。如果FIFO逻辑随后转发8个附加的位以存储,线程束220可以自由将这些位存储到之前由被读出的位所占用的存储位置——即地址1-8。FIFO队列的顶部将是地址9,而地址8是FIFO的底部。这样,FIFO可以响应于取回数据的请求而更新,而不必将缓冲区302和折叠式RAM225中的数据驱逐和移位。 [0028] 返回图3E,当线程束220存储位315到缓冲区302时,读使能信号可以指示FIFO逻辑正请求线程束220实施另一个读操作。与其中所请求的数据存储在缓冲区302中的图3D相反,在图3G中线程束220从折叠式RAM225取回所请求的数据302。在一个实施例中,存储器选择器305确定所请求的数据320是存储在缓冲区302还是折叠式RAM225中。例如,存储器选择器305可以基于读地址来确定是否所请求的数据320之前已经从缓冲区302移动到折叠式RAM225。在图3F中因为所请求的数据位320被移动到RAM225,所以存储器选择器305使用行选择信号(ra_f)来激活折叠式RAM225中的与所请求的位320对应的行。 行中的数据随后可以由折叠式RAM225输出。 [0029] 线程束220包括位偏移信号(ro_d),其选择折叠式RAM的8位输出中的特定位。具体,将位偏移信号用作用于多路复用器310的控制信号,以从行选择正确的位。随后控制用于多路复用器313的选择信号,使得来自多路复用器310的输出被用作线程束220的输出,而忽略延迟缓冲区307的输出。随着位320从线程束220输出(即通过多路复用器310和313),其采用的通常路径由箭头360生动示出。在一个实施例中,从折叠式RAM225取回所请求的数据320并从线程束220输出该数据仅占用一个周期,而在其他实施例中,读取过程可能要求多个周期。虽然图3A-3G示出了只有1位宽的FIFO条目,但是线程束可以配置为存储和取回具有任何数目的位的FIFO条目,例如具有2位宽的64个条目的FIFO。 [0030] 图4A-4B示出了根据本发明的实施例的、从FIFO存储器中的相同存储器地址写入数据和读取数据。具体地,图4A示出了FIFO存储器中的线程束400,其使能以并行的方式从相同FIFO存储器地址写入和读取。也就是说,除了能够从不同的地址同步读取和写入之外,图4A-4B所示的FIFO存储器可以实施从相同地址同步读取和写入。为了实施从相同地址读取和写入,写入和读取使能信号都变高。而且,线程束400包括使得所接收的数据370能够旁路缓冲区302的数据路径。如所示,多路复用器365对是否许可所接收的数据位旁路缓冲区302以直接存储到延迟缓冲区307进行控制。多路复用器365由控制信号(same_addr_write_and_read)控制,其基于针对相同地址的写使能和读使能信号。如果这些信号都为高,那么用于多路复用器365的控制信号将在线程束的输入处所接收的数据路由到延迟缓冲区307,如箭头380所示。如果不是,则多路复用器365将存储在缓冲区302的数据位转移到延迟缓冲区307。无论多路复用器365是否许可所接收的数据370旁路缓冲区302,箭头375都示出所接收的位370被传送到缓冲区302用于存储。虽然没有示出,但线程束可以包括图3G中所述的、用于从缓冲区302取回所请求的数据的相同的存储器选择器。 [0031] 图4B示出了当输出所接收的数据时线程束400的状态。线程束400控制多路复用器313,使得延迟缓冲区307的输出——即所接收的位370——成为线程束400的输出。这样,在一个周期所接收的数据可以在下一个周期输出。如果线程束400不包括多路复用器365,那么数据370将从缓冲区302取回,这可能要求附加的时钟周期。因此,在期望从相同地址同步写入和读取的实施例中,线程束400可以是优选的。虽然没有示出,线程束400可以包括如以上在图3A-3G所述的、用于访问和取回存储在折叠式RAM225中的数据的附加的逻辑。 [0032] 表1示出了用于生成折叠式FIFO的可综合代码。具体地,表1示出了可以由图1所示的FIFO生成器产生的可综合代码500。当表1中的代码被综合时,其配置硬件逻辑(例如图3A-3G以及图4A-4B所示的逻辑)为创建用于折叠式FIFO的线程束。也就是说,经综合的代码生成具有上述功能的折叠式FIFO。为了简洁,如表1和2中所提供的代码,图3A-3G以及图4A-4B所示的信号和电路包括相同的变量名。 [0033] [0034] [0035] [0036] [0037] [0038] 表2示出了配置为实现折叠式存储器元件诸如图3A-3G所示的折叠式RAM225的可综合代码。在一个实施例中,表2中的可综合代码由图1所示的FIFO生成器产生。可替代地,FIFO生成器可以将FIFO的折叠的规格转送到单独的应用程序或者模块,其配置为生成用于存储器元件(例如RAM)的可综合代码。 [0039] [0040] 图5是根据本发明的一个实施例的、用于确定何时折叠FIFO的存储器元件的方法500。具体,FIFO生成器可以使用方法500,来确定用于以硬件方式来实现FIFO的存储器元件的规格。在框505,FIFO生成器接收所期望的FIFO的深度和宽度。在一个实施例中,这些规格由用户提供。FIFO生成器将所提供的深度与第一预定义阈值相比较。如果深度低于第一阈值,那么在框510,FIFO生成器可以使用特殊存储器阵列来在FIFO中存储数据。换句话说,如果FIFO是小的(例如小于32个条目),那么FIFO生成器可以使用例如定制为符合FIFO的规格的锁存器阵列来实现FIFO。然而,如果深度超过第一阈值,那么FIFO生成器可以使用具有和FIFO的规格不匹配的规格的存储器元件。如上所述,在一个实施例中,FIFO可以使用RAM存储器,其中存储器的行中的存储单元的数目具有预定最小值。在一个实施例中,FIFO生成器可以调用单独的软件应用程序(例如RAM生成器)用于生成用于配置存储器元件的可综合代码。 [0041] 如果所期望的FIFO的深度超过阈值,那么在框515,FIFO生成器确定所期望的FIFO的宽度是否小于第二阈值。在一个实施例中,第二阈值可以基于存储器元件中的行的最小存储容量来设置。例如,如果RAM中的行为至少8个单元,那么只有所期望的宽度小于5位宽,FIFO生成器可以折叠FIFO。如果不是,则如框520所示,不折叠FIFO的规格可以更有效率,即使这样做导致未使用的存储单元。在另一个实施例中,第二阈值可以设置为与存储器元件中的行的最小宽度匹配。当然,所提供的用于第一和第二阈值的值仅用于示例目的,并且可以根据需要来配置。 [0042] 在框520,FIFO生成器折叠FIFO的规格,直到宽度小于或者等于第一最小宽度阈值。FIFO生成器可以以多种方式来折叠生成器。在一个实施例中,FIFO生成器配置为折叠FIFO,使得条目的数目除以2,而每行的宽度增加1倍。在折叠之后,如果宽度仍然小于第一最小宽度阈值,那么FIFO生成器可以通过再次将行数等分并且将行宽度增加1倍来折叠FIFO。例如,如果第一最小宽度阈值为10,并且所期望的FIFO规格为64×3,那么FIFO生成器将这些规格折叠两次以获得16×12。然而,可以使用任何折叠因子,例如FIFO生成器可以将深度除以4,而将宽度乘以4。 [0043] 在框525,FIFO生成器可以折叠FIFO,直到宽度小于第二最小宽度阈值并且折叠式FIFO的高宽比大于阈值的高宽比。如本文所使用的,高宽比是FIFO中行数和每行的宽度的比——即行数除以宽度。示例来说,规格为128×1的FIFO高宽比为128,而以因子2来折叠FIFO获得规格64×2以及高宽比32。基于高宽比来对FIFO规格折叠,使得FIFO生成器能够控制用于实现FIFO的存储器元件的形状——即行和列之间的关系。例如,可以期望保证高宽比不低于1(即列数不超过行数)。在一个实施例中,FIFO生成器可以配置为对规格进行折叠,以维持宽度小于10并且至少32的高宽比;然而,在其他实施例中,这些阈值可以设置为任何期望的值。 [0044] 如方法500所示,可以实施框520或者框525,无论是否在其他步骤中已对FIFO进行了折叠。也就是说,在框520,如果由用户设置的FIFO的宽度超过第一最小宽度阈值,那么在框525,FIFO生成器仍可以基于第二最小宽度阈值和高宽比阈值来折叠FIFO规格,并且反之亦然。换言之,在框520和525中规定的标准可以彼此独立地实施。因此,可以在两个步骤中都对FIFO的规格进行折叠、仅在一个步骤中对其进行折叠、或者在两个步骤中都不对其进行折叠。而且,在其他实施例中,方法500可以只包括这些步骤的一个。例如,可以单独基于框520来折叠FIFO的规格,而无需确定导致的高宽比和行宽度是否满足框525的标准。 [0045] 在一个实施例中,可以覆写在框520和525建立的折叠标准。具体地,FIFO生成器可以包括手动折叠因子输入值。当用户命令生成器产生FIFO时,用户可以定义应该对FIFO的规格进行折叠的次数。这样做使得FIFO生成器跳过方法500所示的一个或多个框。 [0046] 在框530,假设在框520或者525对FIFO的规格进行了折叠,则FIFO生成器基于改变了的规格来配置存储器元件。在一个实施例中,FIFO生成器可以调用单独的软件应用程序(即RAM生成器)用于生成具有折叠的规格的RAM。RAM生成器可以生成可综合代码,用于基于折叠的规格来实现FIFO的RAM。例如,如果方法500将FIFO规格从128×1变化为16×8,那么后面的规格被传送到RAM生成器,其产生对应于RAM的可综合代码。尽管如此,FIFO仍然可以被准确描述为128×1FIFO,即使底层存储器元件具有不同的规格。 [0047] 在一个实施例中,FIFO生成器或者RAM生成器可以进一步改变折叠的规格。也就是说,可以基于与RAM相关联的限制或者性能因子来进一步优化折叠的规格。例如,RAM可以限制为具有某规格的行宽(例如每行中仅有偶数个单元)。如果方法500生成折叠的规格32×11,FIFO生成器或者RAM生成器可以将规格从32×11变化为32×12,以满足存储器元件的限制或者以增加RAM的性能。 [0048] 图6示出了根据本发明的一个实施例的、由多个线程访问的FIFO中的线程束600。具体地,线程束600包括折叠式RAM610,其使得多个线程能够访问单个FIFO。如图所示,折叠式RAM610为由4个不同的线程——线程0、1、2、和3访问的512×1FIFO提供存储。折叠式RAM610分为四个逻辑分区612A-612D,每个分区与线程之一相关联。例如,RAM610的第一16行中的单元位置分配给线程0、RAM610的下一个16行中的单元位置分配给线程1,等等。因此,每个线程可以将128位存储在折叠式RAM610中。 [0049] 线程束600还包括用于每个线程的缓冲区605和缓冲区读逻辑615。在一个实施例中,缓冲区605A-D和缓冲区读逻辑615A-D可以用于实施与图3A-3G中所述的相同的任务。例如,每个线程可以使用多路复用的/共享的输入或者各自的输入来传送数据到其各自的缓冲区605A-D。如果线程随后传送针对存储在缓冲区605中的数据的读请求,那么线程束600可以使用各自的缓冲区读逻辑615来从该缓冲区605取回数据。虽然没有示出,但是线程束600可以包括附加的逻辑,其许可由缓冲区读逻辑615A-D所取回的数据被路由到线程束600的输出。而且,线程束600包括多路复用器620,其允许缓冲区605A-D传送将被存储在折叠式RAM610中的8位组。每个线程可以具有各自的线程ID,其用作用于多路复用器620的选择信号。如果例如缓冲区605A是满的并且线程束600需要适应来自线程0的存储新的数据位的请求,那么线程束600可以使用与线程0相对应的线程ID来控制多路复用器620,使得将缓冲区605A的内容存储在折叠式RAM610。 [0050] 线程束600还包括行选择逻辑625,用于指示从缓冲区605接收的数据应该存储在哪个行中。与多路复用器620非常类似,行选择逻辑625可以使用线程ID来选择应该使用那个写地址——即写地址wa0与从线程0接收的数据相对应、写地址wa1与从线程1接收的数据相对应,等等。继续前面的示例,为了将缓冲区605A的内容存储在RAM610,行选择逻辑625命令折叠式RAM610将内容存储在写地址wa0处。在一个实施例中,可以使用写地址来直接指示行,例如使用最高有效位。可替代地,行选择逻辑625可以基于写地址和当前线程ID来导出行。例如,行选择逻辑625可以使用七位写地址中的四个最高有效位来确定行0-15。通过使用线程ID,行选择逻辑625可以确定行偏移,以增加到由写地址所指定的行。例如,如果线程束600正在存储缓冲区605B的内容,则行选择逻辑625可以增加16行的偏移值到从写地址wa1导出的行。因此,如果写地址wa1指定存储缓冲区605B的内容的正确的行是行2(其在分配给线程0的折叠式RAM610的部分612A中),那么通过使用线程ID,线程选择逻辑625命令折叠式RAM610反而在分配给线程1的部分612B中的行18处存储数据。如果线程束600正在写来自缓冲区605C或者605D的内容到RAM610,那么行选择逻辑625可以分别使用32或者48行的偏移。可替代地,线程束600外部的FIFO逻辑可以维持随后被提供到线程束600的绝对写地址,这样随后不要实施偏移。无论使用哪种寻址方案,单独的同步线程可以写数据到共享存储器元件。 [0051] 为了从折叠式RAM610读取数据,线程束600使用行选择逻辑625来选择折叠式RAM610中的特定行。然而,代替使用写地址,行选择逻辑625基于读地址(ra0、ra1、ra2和ra3)来识别行。例如逻辑625可以使用与上述类似的过程来识别读出折叠式RAM610的行——即可以从读地址直接导出行或者结合读地址和线程ID来导出行。一旦折叠式RAM610输出正确的行,则线程束610使用多路复用器630和多路复用器635来确定行中的哪个位是输出位。具体地,多路复用器635接收与各自的线程相关联的位偏移信号(ro_d0、ro_d1、ro_d2和ro_d3)。多路复用器635基于线程ID输出正确的位偏移信号,其随后用作多路复用器的630的选择信号。例如,如果线程束正在取回与线程3相关联的数据,那么行选择逻辑625使用读地址ra3来选择RAM610中的与线程3相关联的特定行(即行48-63)。只要线程ID被设置为与线程3相对应的值,多路复用器635就输出线程3的位偏移信号(r0_d3),其随后由多路复用器630用来从折叠式RAM610的输出选择正确的位。 [0052] 在一个实施例中,线程束600用在仅许可顺序访问存储在FIFO中的数据的同步FIFO中。而且,在一个实施例中,折叠式RAM610的规格与FIFO的大小相匹配,使得存储器元件不包括任何未使用的存储单元。在此,分配给每个线程的行数是每行的宽度的倍数。这可以防止缓冲区冲突以及将与一个线程相关联的数据存储到折叠式RAM610的、分配给不同的线程的部分。 [0053] 总而言之,为了更有效使用FIFO中的存储数据的存储器元件,代码生成器可以生成线程束,其使得FIFO能够使用与FIFO的规格(即深度和宽度)相比具有不同规格的存储器元件。例如,线程束使得128深、1位宽的FIFO能够将数据存储在具有每行存储8位的16行的存储器元件中。对于与FIFO通信的任何系统,尽管FIFO使用16×8存储器元件来实现,FIFO的表现就像128×1FIFO。为了这样,代码生成器可以生成线程束,其使得折叠式存储器元件的表现就像非折叠式存储器元件。特别是,线程束包括支配数据如何读入和读出折叠式存储器元件的逻辑。以使用128×1FIFO为例,线程束可以将数据存储在折叠式 16×8存储器元件中的8位块中。这样,存储器元件中的每个存储位置均可以被使用。相对于使用非折叠式存储器元件,对存储器元件的规格进行折叠不仅提高了存储效率,另外获得的存储器元件可以要求更小的面积(例如在集成电路中具有更小的占地面积)。 |