CN109643233A - 具有带读取和读取/前进操作数编码的流引擎的数据处理设备 - Google Patents

具有带读取和读取/前进操作数编码的流引擎的数据处理设备 Download PDF

Info

Publication number
CN109643233A
CN109643233A CN201780050918.9A CN201780050918A CN109643233A CN 109643233 A CN109643233 A CN 109643233A CN 201780050918 A CN201780050918 A CN 201780050918A CN 109643233 A CN109643233 A CN 109643233A
Authority
CN
China
Prior art keywords
data
stream
instruction
register
specified
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201780050918.9A
Other languages
English (en)
Other versions
CN109643233B (zh
Inventor
J·茨维西亚克
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Texas Instruments Inc
Original Assignee
Texas Instruments Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Texas Instruments Inc filed Critical Texas Instruments Inc
Priority to CN202211396898.XA priority Critical patent/CN115562729A/zh
Publication of CN109643233A publication Critical patent/CN109643233A/zh
Application granted granted Critical
Publication of CN109643233B publication Critical patent/CN109643233B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30145Instruction analysis, e.g. decoding, instruction word fields
    • G06F9/3016Decoding the operand specifier, e.g. specifier format
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3824Operand accessing
    • G06F9/383Operand prefetching
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3004Arrangements for executing specific machine instructions to perform operations on memory
    • G06F9/30047Prefetch instructions; cache control instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/30105Register structure
    • G06F9/30112Register structure comprising data of variable length
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30145Instruction analysis, e.g. decoding, instruction word fields
    • G06F9/30149Instruction analysis, e.g. decoding, instruction word fields of variable length instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/34Addressing or accessing the instruction operand or the result ; Formation of operand address; Addressing modes
    • G06F9/345Addressing or accessing the instruction operand or the result ; Formation of operand address; Addressing modes of multiple operands or results

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Advance Control (AREA)
  • Executing Machine-Instructions (AREA)

Abstract

在所描述的示例中,数字信号处理器中的流引擎(2700)指定到功能单元的固定数据流。由功能单元(3020)使用的数据被对应指令的输入操作数字段(1305)控制,指令由指令解码器(113)解码。第一子编码器(3011)和第二子编码器(3012)控制来自对应寄存器堆(231,232,233)的数据提供。第三子解码器(3013)检测只读操作数编码并将输出数据从流头端寄存器(2718)提供给功能单元(3020)。第四子解码器(3014)检测读取/前进操作数编码,将数据从流头端寄存器(2718)提供给功能单元(3020)并且还使流前进。类似的第五子码解码器(3015)和第六子码解码器(3016)控制来自第二流的第二头端寄存器(2728)的数据提供。

Description

具有带读取和读取/前进操作数编码的流引擎的数据处理 设备
技术领域
本发明总体涉及数字数据处理,并且更具体地涉及用于操作数取出的流引擎的控制。
背景技术
现代数字信号处理器(DSP)面临多重挑战。工作量不断增加,需要增加带宽。片上系统(SOC)的尺寸和复杂度不断增加。存储器系统延迟严重影响某些类别的算法。随着晶体管越来越小,存储器和寄存器变得不太可靠。随着软件栈越来越大,潜在交互和错误的数量变得越来越大。
对于在实时数据上进行操作的数字信号处理器,存储器带宽和调度是个问题。在实时数据上操作的数字信号处理器通常接收输入数据流,对数据流执行过滤功能(例如编码或解码),并输出经转换的数据流。该系统被称为实时的,因为如果经转换的数据流在被调度时不可用于输出,则应用程序失败。典型的视频编码需要可预测但非连续的输入数据模式。通常,相应的存储器访问难以用可用的地址生成和存储器访问资源实现。典型的应用程序需要存储器访问来加载数据寄存器堆(register file)中的数据寄存器,并且然后提供给执行数据处理的功能单元。
发明内容
在数字信号处理器中的流引擎的所描述的示例中,通过在控制寄存器中存储对应参数来指定固定的数据流。在开始后,数据流是只读的,并且不能被写入。这通常对应于实时过滤操作的需要。
在数据流被取出之后,在将其提供给功能单元之前,将数据流存储在先进先出缓冲器中。数据只能以固定顺序呈现给功能单元。示例实施例提供指定的数据流的数据元素,以顺序地打包具有功能单元的数据宽度的头端寄存器。
使用对应指令的输入操作数字段来控制由功能单元使用的数据。将一对输入操作数编码分配给每个数据流。只读操作数编码将流头端寄存器中的数据提供给功能单元的对应输入。存储在流头端寄存器中的数据不改变。读取/前进(advance)操作数编码将流头端寄存器中的数据提供给功能单元的对应输入,并且还将数据流的接下来的连续数据元素存储在流头端寄存器中。
该技术将流引擎数据提供操作放置在与寄存器堆访问相同的指令集架构级别上。只读操作数编码允许功能单元或另一功能单元重用所取出的数据,而不需要(寄存器堆的)寄存器用于临时存储。对流数据的数据访问与访问寄存器堆的类型和级别相同。由操作数编码控制流数据的消耗。
附图说明
图1示出了根据一个实施例的对偶标量/矢量数据路径处理器。
图2示出了图1的对偶标量/矢量数据路径处理器中的寄存器和功能单元。
图3示出了全局标量寄存器堆。
图4示出了由运算功能单元共享的本地标量寄存器堆。
图5示出了由乘法功能单元共享的本地标量寄存器堆。
图6示出了加载/存储单元共享的本地标量寄存器堆。
图7示出了全局矢量寄存器堆。
图8示出了断言(predicate)寄存器堆。
图9示出了由运算功能单元共享的本地矢量寄存器堆。
图10示出了由乘法和相关功能单元共享的本地矢量寄存器堆。
图11示出了根据优选实施例的中央处理单元的流水线阶段。
图12示出了单个取出包的十六个指令。
图13示出了指令的指令编码的示例。
图14示出了条件码扩展占位(slot)0的位编码。
图15示出了条件码扩展占位1的位编码。
图16示出了常量扩展占位0的位编码。
图17是说明常量扩展的部分框图。
图18示出了根据示例实施例的用于SIMD操作的进位控制。
图19示出了示例实施例的流引擎的概念图。
图20示出了矢量中的通道(lane)分配的第一示例。
图21示出了矢量中的通道分配的第二示例。
图22示出了基本的二维流。
图23示出了图21的示例流内的元素的顺序。
图24说明从较大的矩形中提取较小的矩形。
图25示出了流引擎如何以4字节的转置粒度来取出该示例的流。
图26示出了流引擎如何以8字节的转置粒度来取出该示例的流。
图27示出了示例实施例的流引擎的细节。
图28示出了示例实施例的流模板寄存器。
图29示出了示例实施例的流模板寄存器的标志字段的子字段定义。
图30示出了示出示例实施例的数据的流引擎提供的部分示意图。
具体实施方式
图1示出了根据优选实施例的对偶标量/矢量数据路径处理器。处理器100包括分开的一级指令高速缓存(L1I)121和一级数据高速缓存(L1D)123。处理器100包括持有指令和数据二者的二级组合指令/数据高速缓存(L2)130。图1示出了一级指令高速缓存121和二级组合指令/数据高速缓存130之间的连接(总线142)。图1示出了一级数据高速缓存123和二级组合指令/数据高速缓存130之间的连接(总线145)。在处理器100的优选实施例中,二级组合指令/数据高速缓存130存储用于备份一级指令高速缓存121的指令和用于备份一级数据高速缓存123的数据二者。在优选实施例中,二级组合指令/数据高速缓存130是以图1中未示出的传统方式进一步连接到较高级高速缓存和/或主存储器。在优选实施例中,中央处理单元内核110、一级指令高速缓存121、一级数据高速缓存123和二级组合指令/数据高速缓存130形成在单个集成电路上。该信号集成电路可选地包括其它电路。
中央处理单元内核110根据指令取出单元111的控制从一级指令高速缓存121中取出指令。指令取出单元111确定要执行的接下来的指令,并且调用这种指令的取出包大小集。取出包的性质和大小在下面进一步描述。在高速缓存命中时(如果这些指令被存储在一级指令高速缓存121中),指令直接从一级指令高速缓存121被取出。在高速缓存未命中时(指定的指令取出包未存储在一级指令高速缓存121中),在二级组合高速缓存130中寻找这些指令。在优选实施例中,一级指令高速缓存121中的高速缓存行的大小等于取出包的大小。这些指令的存储器位置是二级组合高速缓存130中的命中或未命中。命中是由二级组合高速缓存130提供服务。未命中则是由另一级高速缓存(未示出)或由主存储器(未示出)提供服务。所请求的指令可以同时提供给一级指令高速缓存121和中央处理单元内核110二者以加速使用。
在优选实施例中,中央处理单元内核110包括多个功能单元,以执行指令指定的数据处理任务。指令分派(dispatch)单元112确定每个取出的指令的目标功能单元。在优选实施例中,中央处理单元110作为超长指令字(VLIW)处理器操作,其能够同时操作在对应功能单元中的多个指令。优选地,编译器在一起执行的执行包中组织指令。指令分派单元112将每个指令指向其目标功能单元。分配给指令的功能单元完全由编译器生成的指令指定。中央处理单元内核110的硬件未参与这个功能单元分配。在优选实施例中,指令分派单元112可以在多个指令上并行操作。这种并行指令的数量由执行包的大小来设置。这将在下文中进一步描述。
指令分派单元112的分派任务的一部分确定指令是在标量数据路径侧A115还是矢量数据路径侧B 116中的功能单元上执行。每个指令中被称为s位的指令位确定哪个数据路径是指令控制的。这将在下文中进一步描述。
指令解码单元113对当前执行包中的每个指令进行解码。解码包括识别执行指令的功能单元、从可能的寄存器堆中识别用于为对应的数据处理操作提供数据的寄存器以及识别对应数据处理操作的结果的寄存器目的地。如下文进一步描述的,指令可以包括代替一个寄存器编号操作数字段的常量字段。该解码的结果是用于控制目标功能单元以对指定数据执行由对应指令指定的数据处理操作的信号。
中央处理单元内核110包括控制寄存器114。控制寄存器114存储用于以与本说明书不相关的方式控制标量数据路径侧A 115和矢量数据路径侧B 116中的功能单元的信息。
来自指令解码器113的已解码的指令和存储在控制寄存器114中的信息被提供到标量数据路径侧A 115和矢量数据路径侧B 116。结果,标量数据路径侧A 115和矢量数据路径侧B 116中的功能单元在指令指定的数据上执行指令指定的数据处理操作并且将结果存储在指令指定的一个或更多个数据寄存器中。标量数据路径侧A 115和矢量数据路径侧B116中的每一个包括优选并行操作的多个功能单元。这些将结合图2进一步详述。标量数据路径侧A 115和矢量数据路径侧B 116之间存在允许数据交换的数据路径117。
中央处理单元内核110还包括基于非基于指令的模块。仿真单元118允许响应于指令确定中央处理单元内核110的机器状态。这种能力通常用于算法开发。中断/异常单元119使中央处理单元内核110能够对外部异步事件(中断)做出响应,并对执行不正确操作(异常)的尝试做出响应。
中央处理单元内核110包括流引擎125。流引擎125将两个数据流从通常缓存在二级组合缓存130中的预定地址提供到矢量数据路径侧B的寄存器堆。这提供从存储器(因为缓存在二级组合缓存130中)直接到功能单元操作数输入的受控数据移动。这这将在下文中进一步描述。
图1示出了各部分之间的总线的示例数据宽度。一级指令高速缓存121经由总线141向指令取出单元111提供指令。总线141优选地是512位总线。总线141从一级指令高速缓存121到中央处理单元110是单向的。二级组合高速缓存130经由总线142向一级指令高速缓存121提供指令。总线142优选地是512位总线。总线142从二级组合高速缓存130到一级指令高速缓存121是单向的。
一级数据高速缓存123经由总线143与标量数据路径侧A 115中的寄存器堆交换数据。总线143优选地是64位总线。一级数据高速缓存123经由总线144与矢量数据路径侧B116中的寄存器堆交换数据。总线144优选地是512位总线。总线143和144被示为双向支持中央处理单元110数据读取和数据写入二者。一级数据高速缓存123经由总线145与二级组合高速缓存130交换数据。总线145优选地是512位总线。总线145被示为用于中央处理单元110数据读取和数据写入二者的双向支持高速缓存服务。
在高速缓存命中时(如果所请求的数据被存储在一级数据高速缓存123中),直接从一级数据高速缓存123取出CPU数据请求。在高速缓存未命中时(指定数据未被存储在一级数据高速缓存123中),在二级组合高速缓存130中寻找该数据。该请求的数据的存储器位置是二级组合高速缓存130中的命中或未命中。命中是由二级组合高速缓存130提供服务。未命中则是由另一级高速缓存(未示出)或从主存储器(未示出)提供服务。所请求的指令可以同时提供给一级数据高速缓存123和中央处理单元内核110二者以加速使用。
二级组合高速缓存130经由总线146将第一数据流的数据提供给流引擎125。总线146优选地是512位总线。流引擎125经由总线147将该第一数据流的数据提供给矢量数据路径侧B 116的功能单元。总线147优选地是512位总线。二级组合高速缓存130经由总线148将第二数据流的数据提供给流引擎125。总线148优选地是512位总线。流引擎125经由总线149将该第二数据流的数据提供给矢量数据路径侧B 116的功能单元。总线149优选地是512位总线。根据优选实施例,总线146、147、148和149被示出为从二级组合高速缓存130到流引擎125以及到矢量数据路径侧B 116是单向的。
在高速缓存命中时(如果所请求的数据被存储在二级组合的高速缓存130中),直接从二级组合高速缓存130中取出流引擎数据请求。在高速缓存未命中时(所指定的数据未被存储在二级组合高速缓存130中),从另一级高速缓存(未示出)或从主存储器(未示出)中寻找该数据。在一些实施例中,一级数据高速缓存123缓存未存储在二级组合高速缓存130中的数据在技术上是可行的。如果支持这种操作,则在流引擎数据请求是二级组合高速缓存130中的未命中时,二级组合高速缓存130应针对该流引擎请求的数据搜寻一级数据高速缓存1233。如果一级数据高速缓存123存储该数据,则其搜寻响应将包括数据,然后提供该数据以服务流引擎请求。如果一级数据高速缓存123没有存储该数据,则其搜寻响应将指示这一点,并且第二级组合高速缓存130必须从另一级高速缓存(未示出)或从主存储器(未示出)服务该流引擎请求。
在优选实施例中,根据名称为“UNIFIED MEMORY SYSTEM ARCHITECTUREINCLUDING CACHE AND DIRECTLY ADDRESSABLE STATIC RANDOM ACCESS MEMORY”(包括高速缓存和直接可寻址的静态随机存取存储器的统一的存储器系统架构)的第6,606,686号美国专利,一级数据高速缓存123和二级组合高速缓存130二者都可以被配置为选定数量的高速缓存或直接可寻址的存储器。
图2示出了标量数据路径侧A115和矢量数据路径侧B 116内的功能单元和寄存器堆的进一步细节。标量数据路径侧A115包括:全局标量寄存器堆211、L1/S1本地寄存器堆212、M1/N1本地寄存器堆213和D1/D2本地寄存器堆214。标量数据路径侧A 115包括:L1单元221、S1单元222、M1单元223、N1单元224、D1单元225和D2单元226。矢量数据路径侧B 116包括:全局矢量寄存器堆231、L2/S2本地寄存器堆232、M2/N2/C本地寄存器堆233和断言寄存器堆234。矢量数据路径侧B 116包括:L2单元241、S2单元242、M2单元243、N2单元244、C单元245和P单元246。在功能单元可以从哪个寄存器堆读取或者可以写入哪个寄存器堆方面强加限制。这些将在下面详述。
标量数据路径侧115包括L1单元221。L1单元221通常接受两个64位操作数并产生一个64位结果。两个操作数各自从全局标量寄存器堆211或L1/S1本地寄存器堆212中的指令指定寄存器被调用。L1单元221优选地执行以下指令选择的操作:64位加/减操作;32位最小/最大操作;8位单指令多数据(SIMD)指令,诸如绝对值之和、最小和最大确定;循环最小/最大操作;以及寄存器堆之间的各种移动操作。该结果可以写入全局标量寄存器堆211、L1/S1本地寄存器堆212、M1/N1本地寄存器堆213或D1/D2本地寄存器堆214的指令指定寄存器中。
标量数据路径侧A115包括S1单元222。S1单元222通常接受两个64位操作数并产生一个64位结果。两个操作数从全局标量寄存器堆211或L1/Sl本地寄存器堆中的指令指定寄存器中被调用。S1单元222优选地执行与L1单元221相同类型的操作。在L1单元221和S1单元222支持的数据处理操作之间可选地可以有轻微的变化。结果可以被写入全局标量寄存器堆211、L1/S1本地寄存器堆212、M1/N1本地寄存器堆213或D1/D2本地寄存器堆214的指令指定寄存器中。
标量数据路径侧A 115包括M1单元223。M1单元223通常接受两个64位操作数并产生一个64位结果。两个操作数从全局标量寄存器堆211或M1/N1本地寄存器堆中的指令指定寄存器中被调用。M1单元223优选地执行以下指令选择的操作:8位乘法操作;复数点积操作;32位位计数操作;复共轭乘法操作;以及逐位逻辑操作、移动、相加和相减。该结果可以写入全局标量寄存器堆211、L1/S1本地寄存器堆212、M1/N1本地寄存器堆213或D1/D2本地寄存器堆214的指令指定寄存器中。
标量数据路径侧A 115包括N1个单元224。N1单元224通常接受两个64位操作数并产生一个64位结果。两个操作数从全局标量寄存器堆211或M1/N1本地寄存器堆213中的指令指定寄存器中被调用。N1单元224优选地执行与M1单元223相同类型的操作。一些双重操作(称为双发指令)将M1单元223和N1单元224二者一起使用。该结果可以写入全局标量寄存器堆211、L1/S1本地寄存器堆212、M1/N1本地寄存器堆213或D1/D2本地寄存器堆214的指令指定寄存器中。
标量数据路径侧115包括D1单元225和D2单元226。D1单元225和D2单元226通常各自接受两个64位操作数,并且各自产生一个64位结果。D1单元225和D2单元226通常执行地址计算和对应的加载和存储操作。D1单元225用于64位的标量加载和存储。D2单元226用于512位的矢量加载和存储。D1单元225和D2单元226还优选地执行:对加载和存储的数据交换、打包和拆包;64位SIMD算术操作;以及64位逐位逻辑操作。D1/D2本地寄存器堆214将通常存储用于对对应的加载和存储进行地址计算的基地址和偏移地址。该两个操作数从全局标量寄存器堆211或D1/D2本地寄存器堆214中的指令指定寄存器中被调用。计算结果可以写入全局标量寄存器堆211、L1/Sl本地寄存器堆212、M1/N1本地寄存器堆213或D1/D2本地寄存器堆214的指令指定寄存器中。
矢量数据路径侧B 116包括L2单元241。L2单元221通常接受两个512位操作数并产生一个512位结果。两个操作数从全局矢量寄存器堆231、L2/S2本地寄存器堆232或断言寄存器堆234中的指令指定寄存器中被调用。除了较宽的512位数据之外,L2单元241优选地执行与L1单元221类似的指令。结果可以写入全局矢量寄存器堆231、L2/S2本地寄存器堆222、M2/N2/C本地寄存器堆233或断言寄存器堆234的指令指定寄存器。
矢量数据路径侧B 116包括S2单元242。S2单元242通常接受两个512位操作数并产生一个512位结果。两个操作数各自从全局矢量寄存器堆231、L2/S2本地寄存器堆232或断言寄存器堆234中的指令指定寄存器中被调用。除了较的512位数据之外,S2单元242优选地执行与S1单元222类似的指令。该结果可以写入全局矢量寄存器堆231、L2/S2本地寄存器堆222、M2/N2/C本地寄存器堆233或断言寄存器堆234的指令指定寄存器。
矢量数据路径侧B 116包括M2单元243。M2单元243通常接受两个512位操作数并产生一个512位结果。两个操作数各自从全局矢量寄存器堆231或M2/N2/C本地寄存器堆233中的指令指定寄存器中被调用。除了更宽的512位数据之外,M2单元243优选地执行与M1单元222类似的指令。该结果可以被写入全局矢量寄存器堆231、L2/S2本地寄存器堆232或M2/N2/C本地寄存器堆233的指令指定寄存器。
矢量数据路径侧B 116包括N2单元244。N2单元244通常接受两个512位操作数并产生一个512位结果。两个操作数从全局矢量寄存器堆231或M2/N2/C本地寄存器堆233中的指令指定寄存器中被调用。N2单元244优选地执行与M2单元243相同类型的操作。一些双重操作(称为双发指令)将M1单元223和N1单元224二者一起使用。该结果可以写入全局矢量寄存器堆231、L2/S2本地寄存器堆232或M2/N2/C本地寄存器堆233的指令指定寄存器。
矢量数据路径侧B 116包括C单元245。C单元245通常接受两个512位操作数并产生一个512位结果。两个操作数从全局矢量寄存器堆231或M2/N2/C本地寄存器堆233中的指令指定寄存器中被调用。C单元245优选地执行:“梳理(Rake)”和“搜索”指令;每个时钟周期高达512个2位PN*8位乘法的I/Q复杂乘法;8位和16位的绝对差值求和(SAD)计算,每个时钟周期高达512个SAD;水平加法和水平最小/最大指令;以及矢量排列指令。C单元245还包括用于控制C单元245指令的某些操作的4个矢量控制寄存器(CUCR0到CUCR3)。控制寄存器CUCR0到CUCR3用作某些C单元245操作的操作数。控制寄存器CUCR0到CUCR3优选用于控制通用排列指令(VPERM),并且用作SIMD多重点积操作(DOTPM)和SIMD多重绝对差值求和(SAD)操作的掩码。控制寄存器CUCR0优选用于存储伽罗瓦(Galios)域乘法操作(GFMPY)的多项式。控制寄存器CUCR1优选用于存储伽罗瓦域多项式发生器函数。
矢量数据路径侧B 116包括P单元246。P单元246对本地断言寄存器堆234的寄存器执行基本逻辑操作。P单元246具有从断言寄存器堆234读取和对断言寄存器堆234写入的直接访问权。这些操作包括与AND、ANDN、OR、XOR、NOR、BITR、NEG、SET、BITCNT、RMBD、BIT降采样(Decimate)和扩展。P单元246的普通预期用途包括用于控制另外的SIMD矢量操作的SIMD矢量比较结果的操纵。
图3示出了全局标量寄存器堆211。存在十六(16)个独立的64位宽的标量寄存器,标记为A0到A15。全局标量寄存器堆211的每个寄存器可以作为64位的标量数据被读取或写入。所有标量数据路径侧A 115功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225和D2单元226)可以读取或写入全局标量寄存器堆211。全局标量寄存器堆211可以作为32位或64位被读取,并且只可以作为64位被写入。指令执行确定读取的数据大小。在下文描述的限制下,矢量数据路径侧B 116功能单元(L2单元241、S2单元242、M2单元243、N2单元244、C单元245和P单元246)可以经由交叉路径117从全局标量寄存器堆211读取。
图4示出了D1/D2本地寄存器堆214。十六(16)个独立的64位宽的标量寄存器,标记为D0至D16。D1/D2本地寄存器堆214的每个寄存器可以作为64位的标量数据被读取或写入。所有标量数据路径侧A 115功能单元(L1单元221、S1单元222、M1单元223、N1单元224、,D1单元225和D2单元226)都可以写入全局标量寄存器堆211。只有D1单元225和D2单元226可以从D1/D2本地标量寄存器堆214中读取。预计存储在D1/D2本地标量寄存器堆214中的数据将包括在地址计算中使用的基地址和偏移地址。
图5示出了L1/S1本地寄存器堆212。图5所示出的实施例具有8个独立的64位宽的标量寄存器,标记为AL0到AL7。优选的指令编码(参见图13)允许L1/S1本地寄存器堆212包括多达16个寄存器。图5的实施例仅实施8个寄存器以减小电路尺寸和复杂度。L1/S1本地寄存器堆212的每个寄存器可以作为64位的标量数据被读取或写入。所有标量数据路径侧A115功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225和D2单元226)都可以写入L1/S1本地标量寄存器堆212。只有L1单元221和S1单元222可以从L1/S1本地标量寄存器堆212读取。
图6示出了M1/N1本地寄存器堆213。图6所示出的实施例具有8个独立的64位宽的标量寄存器,标记为AM0到AM7。优选的指令编码(参见图13)允许M1/N1本地寄存器堆213包括多达16个寄存器。图6的实施例仅实施8个寄存器以减小电路尺寸和复杂度。M1/N1本地寄存器堆213的每个寄存器可以作为64位的标量数据被读取或写入。所有标量数据路径侧A115个功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225和D2单元226)都可以写入M1/N1本地标量寄存器堆213。只有M1单元223和N1单元224可以从M1/N1本地标量寄存器堆213读取。
图7示出了全局矢量寄存器堆231,其包括十六(16)个独立的512位宽的矢量寄存器。全局矢量寄存器堆231的每个寄存器可以作为标记为B0到B15的64位标量数据被读取或写入。全局矢量寄存器堆231的每个寄存器可以作为标记为VB0到VB 15的512位的矢量数据被读取或写入。指令类型确定数据大小。所有矢量数据路径侧B 116功能单元(L2单元241、S2单元242、M3单元243、N2单元244、C单元245和P单元246)可以读取或写入全局标量寄存器堆231。在下文将描述的限制下,标量数据路径侧A 115功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225和D2单元226)可以经由交叉路径117从全局矢量寄存器堆231读取。
图8示出了P本地寄存器堆234,其包括八(8)个独立的64位宽的寄存器,其标记为P0到P15。P本地寄存器堆234的每个寄存器可以作为64位的标量数据被读取或写入。矢量数据路径侧B 116功能单元L2单元241、S2单元242、C单元244和P单元246可以写入P本地寄存器堆234。只有L2单元241、S2单元242和P单元246可以从P本地标量寄存器堆234读取。P本地寄存器堆234的普遍预期用途包括:写入来自L2单元241、S2单元242或C单元244的一位SIMD矢量比较结果;通过P单元246操纵SIMD矢量比较结果;并且使用操纵的结果来控制另外的SIMD矢量操作。
图9示出了L2/S2本地寄存器堆232。图9中所示出的实施例具有8个独立的512位宽的矢量寄存器。优选的指令编码(参见图13)允许L2/S2本地寄存器堆232包括多达16个寄存器。图9的实施例仅实施8个寄存器以减小电路尺寸和复杂度。L2/S2本地矢量寄存器堆232的每个寄存器可以作为标记为BL0至BL7的64位标量数据被读取或写入。L2/S2本地矢量寄存器堆232的每个寄存器可以作为标记为VBL0至VBL7的512位矢量数据被读取或写入。指令类型确定数据大小。所有矢量数据路径侧B 116功能单元(L2单元241、S2单元242、M2单元233、N2单元244、C单元245和P单元246)都可以写入L2/S2本地矢量寄存器堆232。只有L2单元241和S2单元242可以从L2/S2本地矢量寄存器堆232读取。
图10示出了M2/N2/C本地寄存器堆233。图10中所示出的实施例具有8个独立的512位宽矢量寄存器。优选的指令编码(参见图13)允许L1/S1本地寄存器堆212包括多达16个寄存器。图10的实施例仅实施8个寄存器以减小电路尺寸和复杂度。M2/N2/C本地矢量寄存器堆233的每个寄存器可以作为标记为BM0到BM7的64位标量数据被读取或写入。M2/N2/C本地矢量寄存器堆233的每个寄存器可以作为标记为VBM0到VBM7的512位矢量数据被读取或写入。所有矢量数据路径侧B 116功能单元(L2单元241、S2单元242、M2单元243、N2单元244、C单元245和P单元246)都可以写入M2/N2/C本地矢量寄存器堆233。只有M2单元233、N2单元244和C单元245可以从M2/N2/C本地矢量寄存器堆233中读取。
提供由一侧的所有功能单元可访问的全局寄存器堆和由一侧的仅一些功能单元可访问的本地寄存器堆是设计选择。示例实施例可以仅采用与所描述的全局寄存器堆对应的一种类型的寄存器堆来实施。
交叉路径117允许在标量数据路径侧A 115和矢量数据路径侧B 116之间进行有限的数据交换。在每个操作周期期间,可以从全局标量寄存器堆A211中调用一个64位数据字,以用作矢量数据路径侧B 116的一个或更多个功能单元的操作数,并且可以从全局矢量寄存器堆231中调用一个64位数据字,以用作标量数据路径侧A115的一个或更多个功能单元的操作数。任何标量数据路径侧A115功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225和D2单元226)都可以从全局矢量寄存器堆231读取64位操作数。该64位操作数是全局矢量寄存器堆232的被访问的寄存器中的512位数据的最低有效位。多个标量数据路径侧A115功能单元可以在相同的操作周期期间使用相同的64位交叉路径数据作为操作数。然而,在任何单个操作周期中,只有一个64位操作数被从矢量数据路径B侧116传输到标量数据路径A115。任何矢量数据路径侧B 116功能单元(L2单元241、S2单元242、M2单元243、N2单元244、C单元245和P单元246)都可以从全局标量寄存器堆211读取64位操作数。如果对应的指令是标量指令,则交叉路径操作数数据被视为任意其它64位操作数。如果对应的指令是矢量指令,则操作数的高448位由零填充。在相同操作周期期间,多个矢量数据路径侧B116功能单元可以使用相同的64位交叉路径数据作为操作数。在任何单个操作周期中,只有一个64位操作数被从标量数据路径侧A115传输到矢量数据路径侧B 116。
流引擎125在某些受限制情况下传输数据。流引擎125控制两个数据流。流由特定类型的元素序列构成。。对流进行操作的程序顺序地读取数据,依次对每个元素进行操作。每个流都具有以下基本属性。流数据具有定义适当的开始和结束时间。在整个流中,流数据具有固定的元素大小和类型。流数据具有固定的元素序列。因此,程序不能在流中随机搜索。流数据在活动时是只读的。程序无法在从流读取的同时对该流写入。一旦流被开启,流引擎125就:计算地址;从二级统一高速缓存(其可能需要来自更高级别存储器的缓存服务)中取出所定义的数据类型;执行数据类型操作,诸如零扩展、符号扩展、如矩阵转置的数据元素排序/交换;并且将数据直接传递到CPU 110内的编程的数据寄存器堆。因此,流引擎125对于表现良好的数据上的实时数字滤波操作是有用的。流引擎125从对应的CPU释放这些存储器取出任务,从而启用其它处理功能。
流引擎125提供以下益处。流引擎125允许多维存储器访问。流引擎125增加了针对功能单元的可用带宽。由于流缓冲器绕过一级数据高速缓存123,因此流引擎125最小化高速缓存未命中停顿(stall)的数量。流引擎125减少了维持循环所需的标量操作的数量。流引擎125管理地址指针。流引擎125自动处理地址生成,释放地址生成指令占位和D1单元224和D2单元226,用于其它计算。
CPU 110在指令流水线上操作。指令取出自下面进一步描述的固定长度的指令包。所有指令都需要相同数量的流水线阶段用于取出和解码,但需要不同数量的执行阶段。
图11示出了以下流水线阶段:程序取出阶段1110、分派和解码阶段1110以及执行阶段1130。对于所有指令,程序取出阶段1110包括三级。对于所有指令,分派和解码阶段包括三级。取决于指令,执行阶段1130包括一到四级。
取出阶段1110包括程序地址生成级1111(PG)、程序访问级1112(PA)和程序接收级1113(PR)。在程序地址生成级1111(PG)期间,程序地址在CPU中生成,并且读取请求被发送到用于一级指令高速缓存L1I的存储器控制器。在程序访问级1112(PA)期间,一级指令高速缓存L1I处理该请求,访问其存储器中的数据,并将取出包发送到CPU边界(boundary)。在程序接收级1113(PR)期间,CPU寄存该取出包。
指令总是被一次取出十六个32位宽的占位,构成取出包。图12示出了单个取出包的16个指令1201至1216。取出包在512位(16字)边界上对齐。优选实施例采用固定的32位指令长度。由于若干原因,固定长度指令是有利的。固定长度指令实现容易的解码器对齐。恰当对齐的指令取出可以将多个指令加载到并行指令解码器中。可以通过存储在存储器中的预定的指令对齐(在512位边界上对齐的取出包)来实现这种恰当对齐的指令取出,其中所述存储器与固定的指令包取出相联接。对齐的指令取出允许并行解码器在指令大小的取出位上的操作。可变长度指令在他们被解码前需要一个初始步骤,该初始步骤定位每个指令边界。固定长度指令集通常允许更规则的指令字段的布局。这简化了每个解码器的构造,这对于广泛发布(wide issue)的VLIW中央处理器是有利的。
各个指令的执行由每个指令中的p位部分地控制。该p位优选地是32位宽的占位的位0。p位确定指令是否与下一条指令并行执行。从较低地址到较高地址对指令进行扫描。如果指令的p位为1,则下一条跟随的指令(更高的存储器地址)与该指令并行(在与该指令相同的周期内)执行。如果指令的p位为0,则在该指令之后的周期内执行下一条跟随的指令。
CPU 110和一级指令高速缓存L1I 121流水线相互不联接。从一级指令高速缓L1I返回的存取出包返回可以采用不同数量的时钟周期,这取决于外部环境,诸如是否在一级指令高速缓存121中存在命中或是否在二级组合高速缓存130中存在命中。因此,程序访问级1112(PA)可能采用若干时钟周期,而不是像其它级中那样采用一个时钟周期。
并行执行的指令构成执行包。在优选实施例中,执行包可以包含多达十六个指令。执行包中任何两个指令都不可以使用相同的功能单元。。占位是以下五种类型之一:1)在CPU 110的功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225、D2单元226、L2单元241、S2单元242、M2单元243、N2单元244、C单元245和P单元246)中的一个上执行的自包含指令;2)无单位指令,诸如NOP(无操作)指令或多个NOP指令;3)分支指令;4)常量字段扩展;以及5)条件码扩展。下面进一步描述这些占位类型中的一些。
分派和解码阶段1110包括指令分派到适当的执行单元级1121(DS),指令预解码级1122(D1);以及指令解码、操作数读取级1222(D2)。在指令分派到适当的执行单元级1121(DS)期间,将取出包分成执行包并分配给适当的功能单元。在指令预解码级1122(D1)期间,源寄存器、目的地寄存器和相关联的路径被解码以执行功能单元中的指令。在指令解码、操作数读取级1222(D2)期间,完成更详细的单元解码,并且从寄存器堆读取操作数。
执行阶段1130包括执行级1131至1135(E1至E5)。不同类型的指令需要不同数量的这些级以完成他们的执行。流水线的这些级在理解CPU周期边界处的装置状态方面起着重要作用。
在执行1级1131(E1)期间,评估指令的条件并操作操作数。如图11中所示,执行1级1131可以从流缓冲器1141和示意性地示为1142的寄存器堆中的一个接收操作数。对于加载和存储指令,执行地址生成并且将地址修改写入寄存器堆。对于分支指令,PG阶段的分支取出包受到影响。如图11中所示,加载和存储指令访问存储器,其在此示意性地示为存储器1151。对于单周期指令,结果被写入目的地寄存器堆。这假定指令的任何条件都被评估为真。如果条件被评估为假,则在执行1级1131之后,该指令不写入任何结果或不具有任何流水线操作。
在执行2级1132(E2)期间,加载指令将地址发送到存储器。存储指令将地址和数据发送到存储器。如果发生饱和,则使结果饱和的单周期指令设置控制状态寄存器(CSR)中的SAT位。对于2周期指令,结果被写入目的地寄存器堆。
在执行3级1133(E3)期间,执行数据存储器访问。如果发生饱和,则使结果饱和的任何多重指令设置控制状态寄存器(CSR)中的SAT位。对于3周期指令,结果被写入目的地寄存器堆。
在执行4级1134(E4)期间,加载指令将数据带到CPU边界。对于4周期指令,结果被写入目的地寄存器堆。
在执行5级1135(E5)期间,加载指令将数据写入寄存器。这在图11中示意性地示出为从存储器1151到执行5级1135的输入。
图13示出了由示例实施例使用的功能单元指令的指令编码1300的示例。其它指令编码是可行的并且在示例实施例的范围内。每个指令由32位组成并控制单独可控制的功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225、D2单元226、L2单元241、S2单元242、M2单元243、N2单元244、C单元245和P单元246)中的一个的操作。位字段定义如下。
creg字段1301(位29到31)和z位1302(位28)是条件指令中使用的可选字段。这些位用于条件指令以识别断言寄存器和条件。z位1302(位28)指示断言是基于断言寄存器中的零还是非零。如果z=1,则测试是针对等于零。如果z=0,则测试是针对非零。creg=0和z=0的情况被视为始终为真,以允许无条件指令执行。creg字段1301和z字段1302如表1所示在指令中被编码。
表格1
条件指令的执行以存储在指定数据寄存器中的值为条件。该数据寄存器在用于所有功能单元的全局标量寄存器堆211中。z位列中的“z”是指上文描述的零/非零比较选择,并且“x”是不关心状态。该编码只能将16个全局寄存器的一个子集指定为断言寄存器。该选择的做出是为了保留指令编码中的位。无条件指令不具有这些可选位。对于无条件指令,字段1301和1302中的这些位(位28至位31)优选地用作附加操作码位。
dst字段1303(位23到位27)指定对应寄存器堆中的寄存器作为指令结果的目的地。
src2/cst字段1304(位18到位22)具有若干含义,取决于指令操作码字段(对于所有指令是位4到位12以及对于无条件指令是附加位28到31)。第一含义将对应的寄存器堆的寄存器指定为第二操作数。第二含义是直接常量。取决于指令类型,这被视为扩展到指定数据长度的无符号整数和零或者视为扩展到指定数据长度的有符号整数和符号。
src1字段1305(位13到位17)将对应寄存器堆中的寄存器指定为第一源操作数。
用于所有指令的操作码字段1306(位4到位12)(以及用于无条件指令的附加位28到31)指定指令的类型并指定适当的指令选项。这包括所使用的功能单元和执行的操作的明确指定。除了下面描述的指令选项之外,操作码的详细解释超出了本说明书的范围。
e位1307(位2)仅用于直接常量指令,其中常量可以被扩展。如果e=1,则直接常量以下面描述的方式扩展。如果e=0,则直接常量不被扩展。在那种情况下,直接常量由src2/cst字段1304(位18到位22)来指定。该e位1307仅用于某些指令。因此,通过适当的编码,该e位1307可以从不需要它的指令中省略,并且该位用作附加的操作码位。
s位1307(位1)指定标量数据路径侧A115或矢量数据路径侧B 116。如果s=0,则选择标量数据路径侧A115。这将功能单元限制于图2中所示的L1单元221、S1单元222、M1单元223、N1单元224、D1单元225和D2单元226以及对应寄存器堆。类似地,s=1选择矢量数据路径侧B 116,将功能单元限制为图2中所示的L2单元241、S2单元242、M2单元243、N2单元244、P单元246和对应寄存器堆。
p位1308(位0)标记执行包。p位确定指令是否与随后的指令并行执行。从较低地址到较高地址扫描p位。如果对于当前指令,p=1,则下一条指令与当前指令并行执行。如果对于当前指令,p=0,则在当前指令之后的周期中执行下一条指令。所有并行执行的指令构成执行包。一个执行包可以包含多达12条指令。执行包中的每条指令都必须使用不同的功能单元。
存在两个不同的条件码扩展占位。每个执行包可以包含这些独特的32位条件码扩展占位中的每一个,其包含用于相同执行包中的指令的4位creg/z字段。图14示出了用于条件码扩展占位0的编码并且图15示出了用于条件码扩展占位1的编码。
图14示出了用于具有32位的条件码扩展占位0的编码。字段1401(位28至位31)指定4个creg/z位,用于分配给在相同执行包中的L1单元221指令。字段1402(位27至位24)指定4个creg/z位,用于分配给在相同执行包中的L2单元241指令。字段1403(位19至位23)指定4个creg/z位,用于分配给在相同执行包中的S1单元222指令。字段1404(位16到位19)指定4个creg/z位,用于分配给在相同执行包中的S2单元242指令。字段1405(位12到位15)指定4个creg/z位,用于分配给在相同执行包中的D1单元225指令。字段1406(位8到位11)指定4个creg/z位,用于分配给在相同执行包中的D2单元245指令。字段1407(位6和位7)未使用/保留。字段1408(位0到位5)被编码为一组独特位(CCEX0),以识别条件码扩展占位0。在检测到条件码扩展占位0的该独特ID之后,就采用对应的creg/z位来控制在相同执行包中的任何L1单元221、L2单元241、S1单元222、S2单元242、D1单元224和D2单元225指令的条件执行。这些creg/z位的解释如表1所示。如果对应的指令是有条件的(包括creg/z位),则条件码扩展占位0中的对应位将覆盖指令中的条件码位。执行包不能具有指向特定执行单元的多于一个指令。指令的执行包不可以包含多于一个条件码扩展占位0。因此,creg/z位到功能单元指令的映射是明确的。将creg/z位设置为等于“0000”使指令是无条件的。因此,适当编码的条件码扩展占位0可以使一些对应的指令是有条件的并且使一些指令是无条件的。
图15示出了用于具有32位的条件码扩展占位1的编码。字段1501(位28至位31)指定4个creg/z位,用于分配给在相同执行包中的M1单元223指令。字段1502(位27到位24)指定4个creg/z位,用于分配给在相同执行包中的M2单元243指令。字段1503(位19至位23)指定4个creg/z位,用于分配给在相同执行包中的C单元245指令。字段1504(位16到位19)指定4个creg/z位,用于分配给在相同执行包中的N1单元224指令。字段1505(位12至位15)指定4个creg/z位,用于分配给在相同执行包中的N2单元244指令。字段1506(位5到位11)未使用/保留。字段1507(位0到位5)被编码为一组独特位(CCEX1),以识别条件码扩展占位1。在检测到条件码扩展占位1的该独特ID之后,就采用对应的creg/z位来控制在相同执行包中任何M1单元223、M2单元243、C单元245、N1单元224和N2单元244指令的有条件执行。这些creg/z位的解释如表1所示。如果对应的指令是条件的(包括creg/z位),则条件码扩展占位1中的对应位覆盖指令中的条件码位。执行包不能具有指向特定执行单元的多于一个指令。指令的执行包不可以包含多于一个条件码扩展占位1。因此,creg/z位到功能单元指令的映射是明确的。将creg/z位设置为等于“0000”使指令是无条件的。因此,适当编码的条件码扩展占位1可以使一些指令是有条件的并使一些指令是无条件的。
条件码扩展占位0和条件码扩展占位1二者都可以包括p位,用于定义如上文结合图13所述的执行包。在优选实施例中,如图14和图15所示,码扩展占位0和条件码扩展占位1优选地具有始终编码为1的位0(p位)。因此,条件码扩展占位0和条件码扩展占位1都不能位于执行包的最后一个指令占位中。
存在两个不同的常量扩展占位。每个执行包可以包含这些独特的32位常量扩展占位中的每一个,其包含作为高阶位的27位,与5位常量字段1305串接(concatenate),以形成32位常量。如在上面结合指令编码描述的,仅一些指令将src2/cst字段1304定义为常量而不是源寄存器标识符。这些指令中的至少一些可以使用常量扩展占位来将该常量扩展到32位。
图16示出了常量扩展占位0的字段。每个执行包可以包括常量扩展占位0的一个实例和常量扩展占位1的一个实例。图16示出了常量扩展占位0 1600包括两个字段。字段1601(位5到位31)构成扩展的32位常量的27个最高有效位,该扩展的32位常量包括作为五个最低有效位的目标指令scr2/cst字段1304。字段1602(位0到位4)被编码为一组独特位(CSTX0)以识别常量扩展占位0。在优选实施例中,常量扩展占位0 1600仅可用于扩展相同执行包中的L1单元221指令、D1单元225指令中的数据、S2单元242指令、D2单元226指令中的偏移量、M2单元243指令、N2单元244指令、分支指令或C单元245指令中的一个的常量。常量扩展占位1类似于常量扩展占位0,除了位0到位4被编码为一组独特位(CSTX1)以识别常量扩展占位1。在优选实施例中,常量扩展占位1仅可用于扩展在相同的执行包中的L2单元241指令、D2单元226指令中的数据、S1单元222指令、D1单元225指令中的偏移量、M1单元223指令或N1单元224指令中的一个的常量。
以如下方式使用常量扩展占位0和常量扩展占位1。目标指令必须是允许常量指定的类型。这是通过将一个输入操作数寄存器指定字段替换为常量的最低有效位来实施的,如上文关于scr2/cst字段1304所描述的。指令解码器113从指令操作码位确定称为直接字段的这种情况。目标指令还包括一个常量扩展位(e位1307),其专用于发信号通知是不扩展指定常量(优选地,常量扩展位=0)还是扩展常量(优选地,常量扩展位=1)。如果指令解码器113检测到常量扩展占位0或常量扩展占位1,则其针对对应于检测到的常量扩展占位的指令进一步检查该执行包内的其它指令。仅当一个对应指令具有等于1的常量扩展位(e位1307)时,才进行常量扩展。
图17是示出了常量扩展的部分框图1700。图17假设指令解码器113检测到在相同执行包中的常量扩展占位和对应指令。指令解码器113将来自常量扩展占位(位字段1601)的27个扩展位和来自对应指令的5个常量位(位字段1305)提供给串接器1701。串接器1701从这两个部分形成单个32位字。在优选实施例中,来自常量扩展占位(位字段1601)的27个扩展位是最高有效位,而5个常量位(位字段1305)是最低有效位。该组合的32位字被提供给多路复用器1702的一个输入。来自对应指令字段1305的5个常量位将第二输入提供给多路复用器1702。多路复用器1702的选择由常量扩展位的状态控制。如果常量扩展位(e位1307)是1(扩展的),则多路复用器1702选择串接的32位输入。如果常量扩展位为0(未扩展的),则多路复用器1702从对应的指令字段1305选择5个常量位。多路复用器1702将该输出提供给符号扩展单元1703的输入。
符号扩展单元1703从来自多路复用器的输入形成最终操作数值。符号扩展单元1703接收控制输入标量/矢量和数据大小。标量/矢量输入指示对应的指令是标量指令还是矢量指令。数据路径侧A115的功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225和D2单元226)只能执行标量指令。指向这些功能单元中的一个的任何指令都是标量指令。数据路径侧B功能单元L2单元241、S2单元242、M2单元243、N2单元244和C单元245可以执行标量指令或矢量指令。指令解码器113根据操作码位确定该指令是标量指令还是矢量指令。P单元246只可以执行标量指令。数据大小可以是8位(字节B)、16位(半字H)、32位(字W)或64位(双字D)。
表2列出了用于各种选项的符号扩展单元1703的操作。
表2
常量扩展占位0和常量扩展占位1二者都包括p位是可行的,以定义如上文结合图13所述的执行包。在优选实施例中,如在条件码扩展占位的情况那样,常量扩展占位0和常量扩展占位1优选地具有始终编码为1的位0(p位)。因此,常量扩展占位0和常量扩展占位1都不能位于执行包的最后一个指令占位中。
在执行包中包括常量扩展占位0或1以及标记了常量扩展(e位=1)的多于一个对应的指令在技术上是可行的。对于常量扩展占位0,这将意味着在执行包中的L1单元221指令、D1单元225指令中的数据、S2单元242指令、D2单元226指令中的偏移量、M2单元243指令或N2单元244指令中的多于一个具有为1的e位。对于常量扩展占位1,这将意味着在执行包中的L2单元241指令、D2单元226指令中的数据、S1单元222指令、D1单元225指令中的偏移量、M1单元223指令或N1单元224指令中的多于一个具有1的e位。将相同的常量扩展提供到多于一条指令不被认为是有用的功能。因此,在一个实施例中,指令解码器113可以确定这种情况是无效操作并且不被支持。替代性地,该组合可以由施加到标记了常量扩展的每个对应功能单元指令的常量扩展占位的扩展位支持。
特殊矢量断言指令使用断言寄存器堆234中的寄存器来控制矢量操作。在当前实施例中,所有这些SIMD矢量断言指令对所选定的数据大小进行操作。数据大小可包括字节(8位)数据、半字(16位)数据、字(32位)数据、双字(64位)数据、四字(128位)数据和半矢量(256位)数据。根据对应的数据字节,断言寄存器的每个位控制是否执行SIMD操作。P单元245的操作允许基于多于一个矢量比较的各种复合矢量SIMD操作。例如,可以使用两个比较来确定范围。将候选矢量与第一矢量参考进行比较,该第一矢量参考具有在第一数据寄存器内打包的最小范围。候选矢量的第二比较是利用第二参考矢量来进行的,该第二矢量参考具有在第二数据寄存器内打包的最大范围。两个结果断言寄存器的逻辑组合将允许矢量条件操作以确定候选矢量的每个数据部分是在范围内还是在范围之外。
L1单元221、S1单元222、L2单元241、S2单元242和C单元245通常以单指令多数据(SIMD)模式操作。在该SIMD模式下,相同的指令被施加到来自两个操作数的打包数据。每个操作数持有设置在预定占位中的多个数据元素。SIMD操作是通过数据边界处的进位控制来启用的。这种进位控制使得能够在不同的数据宽度上进行操作。
图18示出了进位控制。与门1801接收在操作数宽度运算逻辑单元(对于标量数据路径侧A115功能单元是64位,并且对于矢量数据路径侧B 116功能单元是512位)内的位N的进位输出。与门1801还接收将在下面进一步描述的进位控制信号。与门1801的输出被提供给操作数宽度运算逻辑单元的位N+1的进位输入。诸如与门1801的与门被设置在可能的数据边界处的每一对位之间。例如,对于8位数据,这种与门将位于位7和8之间、位15和16之间、位23和24之间等。每个这种与门接收对应的进位控制信号。如果数据具有最小的大小,则每个进位控制信号为0,有效地阻止相邻位之间的进位传输。如果所选数据大小需要两个运算逻辑单元部分,则对应的进位控制信号为1。下面的表3示出了示例进位控制信号,用于512位宽操作数的情况(诸如矢量数据路径侧B116功能单元所使用的),其可以被分成8位、16位、32位、64位、128位或256位的段。在表3中,高32位控制高位(位128至位511)进位,并且低32位控制低位(位0至位127)进位。不需要控制最高有效位的进位输出,因此只需要63个进位控制信号。
表3
对2的整数幂(2N)的数据大小进行操作是常见的。然而,这种进位控制技术不限于2的整数幂。该技术还适用于其它数据大小和其它操作数宽度。
图19示出了示例实施例的流引擎的概念图。图19示出了单个流的过程。流引擎1900包括流地址生成器1901。流地址生成器1901顺序地生成流的元素的地址,并将这些元素地址提供给系统存储器1910。存储器1910调用存储在元素地址处的数据(数据元素),并将这些数据元素提供到数据先进先出(FIFO)存储器1902。数据FIFO 1902在存储器1910和CPU 1920之间提供缓冲。数据格式化器1903从数据FIFO存储器1902接收数据元素,并根据流定义提供数据格式化。这个过程将在下文描述。流引擎1900将来自数据格式化器1903的格式化的数据元素提供给CPU 1920。CPU 1920上的程序消耗该数据并生成输出。
流元素通常驻留在正常的存储器中。存储器本身不在流上施加特定的结构。程序定义流并且因此通过指定以下流属性来施加结构:流的第一元素的地址;流中元素的大小和类型;流中的数据的格式化;以及与该流相关联的地址序列。
流引擎根据穿行整个存储器的指针来定义流的元素的地址序列。多级嵌套循环控制指针所采用的路径。循环级别的迭代计数表示级别重复的次数。维度给出了该循环级别的指针位置之间的距离。
在基本的前向流中,最内部的循环总是消耗来自存储器的物理上连续的元素。这个最内部循环的隐含维度是1个元素。指针本身以连续递增的顺序从一个元素移动到另一个元素。在内部循环之外的每个级别中,该循环根据该循环级别的维度的大小将指针移动到新的位置。
这种寻址形式允许程序在少量参数中指定穿过存储器的规则路径。表4列出了基本流的寻址参数。
表4
上文的定义将流的连续元素映射到存储器中的递增地址。这适用于大多数算法,但不是全部。通过以递减的存储器地址、反向流寻址的方式读取元素来更好地服务一些算法。
在大多数DSP代码中,f[]和g[]表示存储器中的阵列。对于每个输出,算法以正向方向读取f[],但是以反向方向读取g[]。实际的滤波器将[x]和[t-x]的索引范围限制为有限个元素。为了支持这种模式,流引擎支持按递减地址顺序读取元素。
矩阵乘法给流引擎带来了独特的问题。矩阵乘积中的每个元素是第一矩阵的行与第二矩阵的列之间的矢量点积。程序通常都以行-主顺序或列-主顺序来存储矩阵。行-主顺序将单个行的所有元素连续存储在存储器中。列-主顺序将单个列的所有元素连续存储在存储器中。矩阵通常以与语言的默认阵列顺序相同的顺序存储。作为结果,矩阵乘法中的两个矩阵中只有一个映射到流引擎的二维流定义。在至少一个示例中,第一索引逐步穿过第一阵列上的列,但是逐步穿过第二阵列上的行。这个问题对于流引擎并不是特有的。矩阵乘法的访问模式不能很好地适合大多数通用存储器层次结构。一些软件库转置了两个矩阵中的一个,以便在乘法期间两者均可以按行(或按列)访问。流引擎支持利用转置流的隐式矩阵转置。转置流避免了存储器中显式转换数据的成本。流引擎不是按严格的连续元素顺序访问数据,而是按照遍历顺序有效地交换内部两个循环维度,沿着第二维度将元素取出到连续的矢量通道中。
这个算法是有效的,但对于小的元素大小来说实施起来是不切实际的。一些算法在矩阵块(tile)上工作,这些矩阵块是多列和多行的。因此,流引擎定义了单独的转置粒度。硬件规定最小的粒度。转置粒度也必须至少与元素大小一样大。转置粒度导致流引擎沿着维度1移动之前从维度0取出一个或更多个连续元素。当粒度等于元素大小时,这导致从行-主阵列取出单个列。否则,粒度指定每次从行-主阵列中取出2个、4个或更多个列。通过交换该描述中的行和列,这也适用于列-主布局。参数GRANULE表示以字节为单位的转置粒度。
另一种常见的矩阵乘法技术交换矩阵乘法的最内部的两个循环。当穿过一个矩阵的行读取时,产生的内部循环不再读取另一个矩阵的列。例如,该算法可以将一项提升到内部循环之外,用标量值替换它。在矢量机上,最内部的循环可以在单个标量与矢量乘法之后进行矢量求和来非常有效地实施。示例实施例的DSP CPU没有标量乘矢量乘法。相反,程序必须穿过矢量长度复制标量值,并且使用矢量与矢量相乘。示例实施例的流引擎直接支持这种使用模型以及具有元素复制模式的相关使用模型。在这种模式下,流引擎读取小于全矢量大小的颗粒,并复制该颗粒以填充下一个矢量输出。
流引擎将每个复数作为具有两个子元素的单个元素来处理,这两个子元素给出复数的实部和虚部(直角坐标)或幅度和角度(极坐标)部分。并不是所有的程序或外围设备都同意这些子元素应该存在于存储器中的顺序。因此,流引擎提供了交换复数的两个子元素的能力,而无需花费成本。此特征交换元素的一半而不解释元素的内容,并可用于交换任何类型的子元素对,而不仅仅是复数。
算法通常优选以高精度工作,但是高精度值需要比低精度值更多的存储设备和带宽。通常,程序将数据以低精度存储在存储器中,将这些值提升到更高的精度用于计算,然后将这些值降级以降低精度用于存储。流引擎通过允许算法指定一个类型提升等级来直接支持这种方式。在本优选实施例中,对于整数类型,每个子元素可以以符号扩展或零扩展被提升到下一个较大类型的大小。流引擎可以支持浮点提升,分别将16位浮点值和32位浮点值提升为32位格式和64位格式也是可行的。
流引擎将流定义为元素的离散序列,DSP CPU消耗以矢量连续打包的元素。矢量与流的相似之处在于它们包含具有某个隐式序列的多个同类元素。因为流引擎读取流,但是DSP CPU消耗矢量,所以流引擎必须以一致的方式将流映射到矢量上。
矢量由相同大小的通道组成,每条通道包含子元素。DSP CPU将矢量的最右侧的通道指定为通道0,而不管装置的当前信息单元的储存顺序模式(endian mode)。通道编号从右到左增加。矢量中实际的通道数量根据矢量的长度和子元素的数据大小而变化。
图20示出了矢量中的通道分配的第一示例。矢量2000被划分为8个64位通道(8×64位=512位的矢量长度)。通道0包括位0至位63;行1包括位64至位125;通道2包括位128至位191;通道3包括位192至位255,通道4包括位256至位319,通道5包括位320至位383,通道6包括位384至位447,并且通道7包括位448至位511。
图21示出了矢量中的通道分配的第二示例。矢量2100被划分为16个32位通道(16×32位=512位矢量长度)。通道0包括位0至位31;行1包括位32至位63;通道2包括位64至位95;通道3包括位96至位127;通道4包括位128至位159;通道5包括位160至位191;通道6包括位192至位223;通道7包括位224至位255;通道8包括位256至位287;行9占据了位288至位319;通道10包括位320至位351;通道11包括位352至位387;通道12包括位388至位415;通道13包括位416至位447;通道14包括位448至位479;并且通道15包括位480至位511。
流引擎将最内部的流维度直接映射到矢量通道。它将该维度中较前的元素映射到较低的通道编号,然后将靠后的元素映射到较高的通道编号。不管这个特定的流以增加地址顺序前进还是以减小地址顺序前进,情况都是如此。无论流定义的顺序如何,流引擎都会以增加通道的顺序在矢量中存储元素。对于非复数数据,它将第一元素放置在CPU取出的第一矢量的通道0中,将第二元素放在通道1中,以此类推。对于复数数据,流引擎将第一元素放置在通道0和1中,第二元素放置在通道2和3中,以此类推。元素中的子元素保持相同的相对顺序,而不管流方向如何。对于未交换的复数元素,这将每对中具有较低地址的子元素放置在偶数号通道中,并将每对中具有较高地址的子元素放置在奇数号通道中。交换的复数元素反转了这种映射。
流引擎用CPU从最内部流维度所能取出的尽可能多的元素填充CPU取出的每个矢量。如果最内部维度不是矢量长度的倍数,则流引擎通过填充零将该维度拉长到多倍矢量长度。因此,因此对于较高维度的流,来自外部维度的每次迭代的第一元素到达矢量的通道0。流引擎始终将最内部维度映射到矢量中的连续通道。对于转置流,最内部的维度由沿着维度1而不是维度0的子元素的组构成,因为转置交换了这两个维度。
与一维流相比,二维流表现出很大的多样化。基本的二维流从较大的矩形中取出较小的矩形。转置的二维流逐列读取矩形,而不是逐行读取。第二维度与第一维度重叠的循环流执行重复循环的有限冲击响应(FIR)滤波器抽头,或执行提供输入样本的滑动窗口的FIR滤波器采样。
图22示出了基本的二维流。由ELEM_BYTES、ICNT0、DIM1和ICNT1表示的内部的两个维度给出足够的灵活性来描述从具有维度2211和2212的较大矩形2210中取出具有维度2221和2222的较小矩形2220。在该示例中,矩形2220是64位值的9乘13的矩形,并且矩形2210是更大的11乘19矩形。以下流参数定义了这个流:
ICNTO=9
ELEM_BYTES=8
ICNT1=13
DIM1=88(11乘以8)
因此,0维度2221中的迭代计数是9。在1方向2222上的迭代计数是13。ELEM_BYTES仅缩放(scale)最内维。第一维具有大小为ELEM_BYTES的ICNT0元素。流地址生成器不缩放外部维度。因此,DIM1=88,即11个元素,以每个元素8个字节进行缩放。
图23示出了这个示例流中元素的顺序。流引擎按照顺序2300所示的顺序取出流的元素。前9个元素来自矩形2220的第一行,从左到右为跃程(hop)1到跃程8。第10个元素到第24个元素来自第二行,等等。当流从第9个元素移动到第10个元素时(图23中的跃程9),流引擎根据在内部循环开始时的指针位置(而不是在第一维度结束时的指针所处的结束位置)来计算新的位置,。这使DIM1独立于ELEM_BYTES和ICNT0。DIM1总是表示每个连续行的第一字节之间的距离。
转置的流在维度0之前,沿着维度1访问。以下示例示出了若干的转置的流,不同的转置粒度。图24示出了从具有维度2411和2412的较大矩形2410(14×13)中提取具有维度2421和2422的较小矩形2420(12×8)。在图24中,ELEM_BYTES等于2。
图25示出了流引擎如何以4字节的转置粒度取出该示例的流;取出模式2500从每一行取出元素对(因为4的粒度是值为2的ELEM_BYTES的两倍),除此之外向下移动列。一旦到达一对列的底部,就会用下一对列重复这个模式。
图26示出了流引擎如何以8字节的转置粒度取出该示例的流。整体结构保持相同。在移动到列中的下一行之前,流引擎从每行取出4个元素(因为值为8的粒度是值为2的ELEM_BYTES的四倍),如取出模式2600所示的那样。
到目前为止,检查的流从存储器中恰好读取每个元素一次。流可以从存储器中读取给定的元素多次,实际上在一段存储器上进行循环。FIR滤波器表现出两个常见的循环模式。。FIR针对每个输出重新读取相同的滤波器抽头。FIR也从滑动窗口读取输入采样。两个连续的输出将需要来自两个重叠窗口的输入。
图27示出了流引擎2700的细节。流引擎2700包含三个主要部分:流02710;流12720;以及共享的L2接口2730。流0 2710和流1 2720两者都包含并行操作的相同硬件。流02710和流1 2720两者共享L2接口2730。每个流2710和2720在每个周期提供具有高达512位/周期的CPU。流引擎架构通过其专用流路径和共享的双L2接口来实现这一点。
每个流引擎2700包括专用的四维流地址生成器2711/2721,其各自可以每个周期生成一个新的未对齐的请求。地址生成器2711/2721输出512位对齐的地址,其与由流参数定义的序列中的元素重叠。这将在下文进一步描述。
每个地址生成器2711/2711连接到专用的微表格检测缓冲器(μTLB)2712/2722。μTLB 2712/2722每个周期将单个48位虚拟地址转换为44位物理地址。每个μTLB 2712/2722有8个条目,覆盖具有4kB页面的最小32kB或具有2MB页面的最大16MB。每个地址生成器2711/2721每个周期产生2个地址。μTLB 2712/2722每个周期只转换1个地址。为了保持吞吐量,流引擎2700利用了这样的事实,即大多数流参数将在相同的4kB页面内。因此,地址转换不会修改地址的位0至位11。如果aout0和aout1线在相同的4kB的页面中(aout0[47:12]与aout1[47:12]相同),则μTLB 2712/2722只转换aout0并且重新使用两个地址的较高位的转换。
转换的地址在命令队列2713/2723中排队。这些地址与来自对应的存储分配和跟踪块2714/2724的信息对齐。流引擎2700不显式地管理μTLB2712/2722。系统存储器管理单元(MMU)在上下文切换(context switch)期间根据需要使μTLB无效。
存储分配和跟踪2714/2724管理流的内部存储,发现数据重新使用并跟踪每个数据段的生命周期。存储分配和跟踪2714/2724每个周期接受2个虚拟地址,并将这些地址绑定到流的数据存储中的占位。流引擎2700将其数据存储组织为占位阵列。流引擎2700维护表5中列出的以下元数据以跟踪每个占位中的数据的内容和生命周期。
表5
表6详述了有效、就绪和有效位的交互。
表6
使用该元数据,存储分配和跟踪2714/2724可以识别流中的数据重新使用机会。存储分配和跟踪2714/2724对每个地址执行以下步骤。它将地址与其标记阵列中的相关标记进行比较。在命中时,它取消与该地址关联的命令。在未命中时,它分配一个空闲占位,设置Valid=l,Ready=0并更新输出命令以将它正在取出的数据引导到该占位。在任何一种情况下,占位编号都与地址相关联。存储分配和跟踪2714/2724将引用插入引用队列中。存储分配和跟踪2714/2724设置Active=l并将最近引用更新为引用队列中该引用的位置。这是插入时引用队列的插入指针的值。该过程将生成的地址转换为表示数据的占位编号。从这点之后,流引擎不需要直接跟踪地址。
为了最大化重新使用并最小化停顿,流引擎2700按以下顺序分配占位:如果FIFO中的顺序可用,则占位1在最近分配之后;最低数量的可用占位(如果存在);如果没有可用的占位,则停顿并迭代这两个步骤,直到分配成功。这将倾向于按FIFO顺序分配占位,但如果特定的重新使用模式抵触该顺序工作,也避免停顿。
引用队列2715/2725存储由对应的地址生成器2711/2721生成的引用的序列。该信息驱动数据格式化网络,以便其可以将数据以正确的顺序呈现给CPU。引用队列2715/2725中的每个条目包含用于从数据存储中读出数据并将其与CPU对齐所需的信息。引用队列2715/2725维护在每个占位中的表7中列出的以下信息:
表7
当地址生成器2711/2721生成新地址时,存储分配和跟踪2714/2724在引用队列2715/2725中插入引用。当数据变为可用并且在流保持寄存器中有空间时,存储分配和跟踪2714/2724从引用队列2715/2725中移除引用。当存储分配和跟踪2714/2724从引用队列2715/2725中移除占位引用并格式化数据时,它检查引用是否代表对应占位的最近引用。存储分配和跟踪2714/2724将引用队列2715/2725移除指针与占位记录的最近引用进行比较。如果它们匹配,则存储分配和跟踪2714/2724在数据完成后标记占位为不活动。
流引擎2700具有用于任意数量的元素的数据存储2716/2726。深度缓冲允许流引擎领先于该数据流进行取出,隐藏存储器系统延迟。正确的缓冲量可能从一代产品到一代产品而不同。在当前优选实施例中,流引擎2700为每个流贡献32个占位。每个占位持有64个字节的数据。
蝶形网络(butterfly network)2717/2727由7级蝶形网络组成。蝶形网络2717/2727接收128字节的输入并产生64字节的输出。蝶形的第一级实际上是半级。它收集来自匹配非对齐取出的两个占位的字节,并将它们合并为单个旋转的64字节阵列。其余6级形成一个标准的蝶形网络。蝶形网络2717/2727执行以下操作:将下一个元素向下旋转到字节通道0;如果被请求,用一个2的幂值来提升数据类型;如果被请求,交换复数的实部和虚部分量;如果CPU目前处于高字节序模式(big endian mode),则将高字节序转换为低字节序。用户指定作为流参数的一部分的元素大小、类型提升和实部/虚部交换。
流引擎2700尝试在CPU对数据有需求之前取出并格式化该数据,使得其可以维持完全的吞吐量。保持寄存器2718/2728提供少量的缓冲,使得该过程保持完全的流水线化。除了流引擎2700提供完全的吞吐量这一事实以外,保持寄存器2718/2728在架构上不是直接可见的。
两个流2710/2720共享一对独立的L2接口2730:L2接口A(IFA)2733和L2接口B(IFB)2734。每个L2接口直接向L2控制器提供512位/周期吞吐量,用于1024位/周期的聚合带宽。L2接口使用基于信用的多核总线架构(MBA)协议。L2控制器为每个接口分配自己的命令信用池。池应该有足够的信用,以便在读取L2RAM、L2高速缓存和MSMC RAM(多核共享存储器控制器)时每个接口都可以发送足够的命令来达到完全的回读(read-return)带宽。
为了使性能最大化,两个流都可以使用两个L2接口,从而允许单个流发送2个命令/周期的峰值命令速率。每个接口都优选一个流而不是另一个流,但是这个优选会根据请求而动态变化。IFA 2733和IFB 2734总是优选相反的流,当IFA 2733优选流0时,IFB 2734优选流1,反之亦然。
每个接口2733/2734之前的仲裁器2731/2732在其具有可用信用的每个周期应用以下基本协议。仲裁器2731/2732检查优选流是否具有准备发送的命令。如果是,仲裁器2731/2732选择该命令。仲裁器2731/2732接下来检查替代流是否具有准备发送的至少两个命令或者一个命令且没有信用。如果是,仲裁器2731/2732从替代流中拉出命令。如果任一接口发布命令,则对于下一个请求,优选流和替代流的地位(notion)交换。使用这个简单的算法,这两个接口会尽可能快地分派请求,同时保持两个流之间的公平性。第一规则确保每个流可以在具有可用信用的每个周期发送请求。第二规则提供了机制:当第二接口空闲时,一个流借用另一个流的接口。第三规则针对跨越两个接口的每个流的需求而扩展带宽,确保两个接口本身都不会成为瓶颈。
粗粒旋转器2735/2736使流引擎2700能够支持转置的矩阵寻址模式。在这种模式下,流引擎2700交换其多维循环的两个最内部维度。这逐列而不是逐行访问阵列。旋转器2735/2736在架构上不可见,除了当启用这种转置访问模式时。
流定义模板提供包含数据的流的完整结构。迭代计数和维度提供了大部分的结构,而各种标志提供了其余的细节。对于所有包含数据的流,流引擎定义了单个流模板。它支持的所有流类型都适合该模板。每个字段上方的数字表示256位矢量内的字节数。流引擎定义了用于寻址流中元素的四级循环嵌套。流模板中的大部分字段直接映射到该算法中的参数。图28示出了流模板寄存器2800。字段上方的数字是256位矢量内的字节数。表8显示了流模板的流字段定义。
表8
字段名称 描述 大小/位
ICNT0 循环0(最内部)的迭代计数 32
ICNT1 循环1的迭代计数 32
ICNT2 循环2的迭代计数 32
ICNT3 循环3(最外部)的迭代计数 8
DIM1 循环1的有符号维度 32
DIM2 循环2的有符号维度 32
DIM3 循环3的有符号维度 32
FLAGS 流修改器标志 24
在当前的示例中,DIM0总是等于物理上定义连续的数据的ELEM_BYTES。流模板主要包括32位字段。流模板将ICNT3限制为8位,并且将FLAGS字段限制为24位。流引擎2700将所有迭代计数解释为无符号整数,并将所有维度解释为未经缩放的有符号整数。上文的模板完全指定了元素的类型、流的长度和维度。流指令单独指定开始地址。这通常通过标量寄存器堆211中的标量寄存器指定,该标量寄存器堆211存储该开始地址。这允许程序使用相同的模板开启多个流。
图29示出了标志字段2900的子字段定义。如图28所示,标志字段2900是3字节或24位。图29显示了字段的位数。表9显示了这些字段的定义。
表9
元素类型(ELTYPE)字段定义流中元素的数据类型。该字段的四位的编码如表10所示进行定义。
表10
子元素大小确定用于类型提升和矢量通道宽度的类型。例如,当流请求类型提升时,16位子元素被提升为32位子元素。由于DSP CPU一直以低字节序顺序布置矢量,所以当DSP CPU以高字节序模式操作时,矢量通道宽度是重要的。
总元素大小确定流的最小粒度。在流寻址模型中,它确定流最内部循环的每次迭代流取出的字节数。流总是读取完整的元素,以递增顺序或者以递减顺序。因此,流的最内部维度跨越ICNT0×总元素大小的字节。
实数-复数类型确定流引擎是将每个元素视为实数还是将每个元素视为复数的两个部分(实部/虚部或幅度/角度)。该字段还指定是否交换复数的两个部分。复数类型的总元素大小是其子元素大小的两倍。否则,子元素大小等于总元素大小。
转置(TRANSPOSE)字段确定流引擎是否以转置顺序访问流。转置顺序交换内部的两个寻址级别。TRANSPOSE字段还指示它转置流的粒度。该字段的四位编码如表11所示进行定义。
表11
流引擎2700实际上以与元素大小不同的粒度转置。这允许程序从每一行取出多列元素。转置粒度必须不小于元素大小。
提升(PROMOTE)字段控制流引擎是否提升流中的子元素和提升的类型。当启用时,流引擎2700以单个2的幂次大小来提升类型。该字段的两位的编码如表12所示进行定义。
表12
当流指定“不提升”时,每个子元素将占用宽度与由ELTYPE指定的大小相等的矢量通道。否则,每个子元素占据两倍大的矢量通道。当PROMOTE为00时,流引擎从存储器中取出一半的数据以满足相同数量的流取出。
提升模式01b和10b分别将传入的子元素视为无符号整数和有符号整数。对于无符号整数,流引擎通过用零填充新位来提升。对于有符号整数,流引擎通过用符号位的副本填充新位来提升。正的有符号整数具有等于0的最高有效位。对于正的有符号整数的提升,新位被零填充。负的有符号整数具有等于1的最高有效位。对于负的有符号整数的提升,新位被填1。
提升模式11b将传入的子元素视为浮点数。浮点提升将每个子元素视为浮点类型。流引擎支持两种浮点提升:短浮点(16位)到单精度浮点(32位);单精度浮点(32位)到双精度浮点(64位)。
减速(THROTTLE)字段控制流引擎如何领先于CPU进取地取出。该字段的两位的编码如表13所示进行定义。
表13
THROTTLE不改变流的含义,并且只能作为提示。流引擎可能会忽略此字段。程序不应该依赖特定的减速行为来保证程序的正确性,因为架构没有指定精确的减速行为。THROTTLE允许程序员向硬件提供关于程序自身行为的提示。默认情况下,流引擎试图尽可能远地领先于CPU,以隐藏尽可能多的延迟时间,同时向CPU提供完全流吞吐量。尽管几个关键应用程序需要这种级别的吞吐量,但是它可能会导致针对其他的不佳的系统级别行为。例如,流引擎丢弃穿过上下文切换的所有取出的数据。因此,在具有大量上下文切换的系统中,积极的提前取出可导致带宽浪费。如果CPU非常快速地消耗数据时,在这些系统中的积极的提前取出才是有意义的。
DSP CPU通过少量指令和专用寄存器将流引擎暴露给程序。STROPEN指令开启流。STROPEN命令指定表示开启流0或流1的流编号。STROPEN指定存储如上所述流模板的流模板寄存器。表14列出了STROPEN指令的自变量。
表14
自变量 描述
流开始地址寄存器 存储流开始地址的标量寄存器
流编号 流0或流1
流模板寄存器 存储流模板数据的矢量寄存器
流开始地址寄存器优选地是通用标量寄存器堆211中的标量寄存器。STROPEN指令通过其操作码来指定流0或流1。流模板寄存器优选地是通用矢量寄存器堆221中的矢量寄存器。如果指定的流是活动的,则STROPEN指令关闭先前的流并用指定的流代替该流。
STRCLOSE指令关闭流。STRCLOSE命令指定要关闭的流的流编号。
STRSAVE指令捕获指定流的足够状态信息以在将来重新开始该流。STRRSTR指令恢复以前保存的流。STRSAVE指令不保存流的任何数据。STRSAVE指令只保存元数据。流响应于STRRSTR指令重新取出数据。
流引擎处于以下三种状态之一:不活动的;活动的;或冻结。当不活动时,流引擎什么都不做。从不活动的流引擎取出数据的任何尝试都是错误。直到程序开启流之前,流引擎是不活动的。在程序耗用流中的所有元素或程序关闭流之后,流引擎也变为不活动的。使用流的程序显式使流引擎活动或者不活动。操作环境经由流引擎的隐式冻结行为,联接其自己的显式保存和恢复操作,来管理穿过上下文切换边界的流。
活动的流引擎具有与其关联的流。程序可以从活动的流引擎中取出新的流元素。流引擎保持活动的,直到出现下列之一。当流从流中取出最后一个元素时,它变为不活动的。当程序显式关闭流时,其变为不活动。当CPU响应中断或异常时,流引擎冻结。在流引擎冻结时,冻结的流引擎捕获恢复流所需的所有状态。流引擎响应于中断和异常而冻结。这与特殊指令相结合来保存和恢复冻结的流上下文,以便操作环境可以干净利落地切换上下文。当CPU返回到中断的上下文时,冻结的流重新活动。
程序经由用于流0的保持寄存器2718并且经由用于流1的保持寄存器2728访问流数据。这些寄存器在其它寄存器堆之外。这些寄存器表示相应的流0和流1的流头端。在对应的程序指令中的src1字段1305和src2/cst字段1304的专用位编码读取流数据和流的控制前进。表15示出了根据优选实施例的源操作数字段1305和1304的示例编码。
表15
位编码00000到01111(第一子集)指定全局矢量寄存器堆231中的对应寄存器。只有矢量数据路径侧B包括流引擎。对于具有位编码src1字段1305或src2/cst字段1304的第一子集中的指令,指令解码器113从全局矢量寄存器堆231中的指定的寄存器编号为对应功能单元提供输入操作数。位编码10000到10111(第二子集)指定对应的矢量本地寄存器堆中的对应的寄存器。对于指向L2单元241或S2单元242的指令,本地寄存器堆是L2/S2本地寄存器堆232。对于指向M2单元243、N2单元244或C单元245的指令,本地寄存器堆是M2/N2/C本地寄存器堆233。对于在该第二子集中具有位编码src1字段1305或src2/cst字段1304的指令,指令解码器113从对应的本地寄存器堆(在该实施例中,L2/S2本地寄存器堆232或M2/N2/C本地寄存器堆233)中的指定的寄存器编号为对应功能单元提供输入操作数。
在该实施例中保留位编码11000至11011。这些编码没有被使用。指令解码器113可以忽略这些位编码或者可以生成错误。编译器不会生成这些编码。
位编码11100和11101指向流0。位编码11110和11111指向流1。位编码11100是流0的读取。在检测到指令具有位编码为11100的src1字段1305和src2/cst字段1304后,指令解码器113为该指令的功能单元的对应操作数输入提供存储在保持寄存器2718中的数据。保持寄存器2718持有指定数据流0中的元素,如上文结合图20和图21所描述的。这种数据提供类似于从数据寄存器提供数据。类似地,位11110是流1的读取。在检测到指令具有位编码为11110的src1字段1305和src2/cst字段1304后,指令解码器113为该指令的功能单元的对应操作数输入提供存储在保持寄存器2728中的数据。
读取位编码11100和11110的流被类似地视为指定位编码的寄存器。因此,多于一个功能单元可以从相同的流保持寄存器2718或2728接收输入。单个指令可以为两个输入操作数指定相同的流保持寄存器2718或2728。指令可以指定来自保持寄存器2718的一个输入操作数和来自保持寄存器2728的另一个输入操作数,并且两者顺序是任意的。
位编码11101和11111触发读取/前进流操作。位编码11101是流0的读取/前进。在检测到指令具有位编码为11100的src1字段1305和src2/cst字段1304后,指令解码器113向该指令的功能单元的对应操作数输入提供存储在保持寄存器2718中的数据。然后,流引擎2700将流0前进到指定数据流0中的下一组元素,如上文结合图20和图21所描述的。因此,保持寄存器2918将存储流0中的下一个元素。类似地,位11111是流1的读取/前进。在检测到指令具有位编码为11110的src1字段1305和src2/cst字段1304后,指令解码器113向该指令的功能单元的相应操作数输入提供存储在保持寄存器2728中的数据,并且然后触发流引擎2700以使流1前进以将下一数据元素存储在保持寄存器2728中。数据输入操作以与位编码11100和11110的读取操作相同的方式进行。如上所述,读取/前进操作数位编码将前进增加到定义的下一个流数据元素。
如上所述,可以将相同的流保持寄存器数据提供给功能单元的多于一个的输入和多于一个功能单元。因此,有可能对同一执行包中的指令进行编码,其中这些输入中的一个是读取编码,而相同流的另一个输入是读取/前进编码。在这种情况下,使对应的流前进。因此,如果任何流0或流1操作数位编码是读取/前进位编码,则该流前进,无论任何其他流0操作数位编码是读取还是读取/提前。
根据流的性质,流数据是只读的。因此,表15的位编码不能用于dst字段1303。指令解码器113可以忽略dst字段1303中的这些位编码或者可以生成错误。编译器不会生成这些编码。
图30是示出上文描述的流输入操作数编码的部分示意图3000。图30示出了对功能单元3020的对应src1输入的一个指令的src1字段1305进行解码。对于src2/cst字段1304和功能单元3020的src2输入,这些相同的电路被复制。此外,这些电路可以被复制用于可以被同时分派的执行包内的每个指令。
指令解码器113接收指令的包括src1字段1305的位13至17。操作码字段(用于所有指令的位4到位12以及用于无条件指令的额外的位28到位31)明确地指定对应的功能单元3020。在该实施例中,功能单元3020可以是L2单元241、S2单元242、M2单元243、N2单元244或C单元245。图30中所示的指令解码器113的相关部分对src1字段1305进行解码。子解码器3011确定src1位字段1305是否在00000到01111的范围内。如果是这种情况,则子解码器3011将对应的寄存器编号提供给全局矢量寄存器堆231。在该示例中,该寄存器字段是src1位字段1305的四个最低有效位。全局矢量寄存器堆231调用存储在对应于该寄存器编号的寄存器中的数据,并将该数据提供给功能单元3020的src1输入。这种解码是周知的。
子解码器3012确定src1位字段1305是否在10000到10111的范围内。如果是这种情况,则子解码器3012将对应的寄存器编号提供给对应的本地矢量寄存器堆。如果指令指向L2单元241或S2单元242,则对应的本地矢量寄存器堆是本地矢量寄存器字段232。如果指令指向M2单元243、N2单元244或C单元245,则对应的本地矢量寄存器堆是本地矢量寄存器堆233。在该示例中,该寄存器字段是src1位字段1305的三个最低有效位。本地矢量寄存器堆231调用存储在对应于该寄存器编号的寄存器中的数据,并将该数据提供给功能单元3020的src1输入。对应的本地矢量寄存器堆232/233调用存储在对应于该寄存器编号的寄存器中的数据,并将该数据提供给功能单元3020的src1输入。这种解码是周知的。
子解码器3013确定src1位字段1305是否是11100。如果是这种情况,则子解码器3013将流0读取信号提供给流引擎2700。然后,流引擎2700将存储在保持寄存器2718中的流0数据提供给功能单元3020的src1输入。
子解码器3014确定src1位字段1305是否是11101。如果是这种情况,则子解码器3014将流0读取信号提供给流引擎2700。然后,流引擎2700将存储在保持寄存器2718中的流0数据提供给功能单元3020的src1。子解码器3014将前进信号提供给向流0。如上所述,流引擎2700前进以将流0的下一个顺序数据元素存储在保持寄存器2718中。
子解码器3015确定src1位字段1305是否是11110。如果是这种情况,则子解码器3015将流1读取信号提供给流引擎2700。然后,流引擎2700将存储在保持寄存器2728中的流1数据提供给功能单元3020的src1输入。
子解码器3016确定src1位字段1305是否是11111。如果是这种情况,则子解码器3016将流1读取信号提供给流引擎2700。然后,流引擎2700将存储在保持寄存器2728中的流1数据提供给功能单元3020的src1输入。子解码器3014还将前进信号提供给流1。如上所述,流引擎2700前进以将流2的下一个顺序数据元素存储在保持寄存器2728中。
类似的电路用于响应于src2/cst字段1304的位编码选择提供给功能单元3002的scr2输入的数据。可以用如上所述的方式向功能单元3020的scr2输入提供常量输入。
专用于操作数指定的指令位的准确数量以及数据寄存器和流的数量是设计选择。应用中描述的其它数字选择是可行的。例如,单个全局矢量寄存器堆的指定和本地矢量寄存器堆的省略是可行的。示例实施例采用输入操作数选择字段的位编码来指定流读取,采用另一个位编码以指定流读取和使流前进。

Claims (46)

1.一种数字信号处理器,其包括:
数据寄存器堆,其包括由寄存器编号存储数据指定的多个数据寄存器;
指令存储器,其存储指令,每个指令指定数据处理操作和至少一个数据操作数字段;
指令解码器,其连接到所述指令存储器,用于顺序地从所述指令存储器中调用指令并确定指定的数据处理操作和指定的至少一个操作数;
至少一个功能单元,其连接到所述数据寄存器堆和所述指令解码器,用于根据至少一个操作数执行数据处理操作并将结果存储在指令指定的数据寄存器中,所述至少一个操作数对应于由所述指令解码器解码的指令;
流引擎,其连接到所述指令解码器,所述流引擎响应于流开始指令而操作,以从存储器中调用指令指定的多个数据元素序列的流,所述流引擎包括:流头端寄存器,所述流头端寄存器存储下一个要被使用的所述流的数据元素;以及
其中所述指令解码器可操作用于:解码具有数据操作数字段的指令,所述数据操作数字段具有位编码的第一子集,以将存储在对应数据寄存器中的数据提供给对应的功能单元;解码具有带有预定读取位编码的数据操作数字段的指令,以将存储在所述流头端寄存器中的所述数据提供给所述对应的功能单元;并且解码具有带有预定的读取/前进位编码的数据操作数字段的指令,以将存储在所述流头端寄存器中的所述数据提供给所述对应的功能单元,并通过将所述流的下一个顺序数据元素存储在所述流头端寄存器中来使所述流引擎前进。
2.根据权利要求1所述的数字信号处理器,其中,所述指令指定的流的所述多个数据元素的序列由开始地址和元素大小来指定。
3.根据权利要求2所述的数字信号处理器,其中,所述指定的元素大小包括8位数据。
4.根据权利要求2所述的数字信号处理器,其中,所述指定的元素大小包括16位数据。
5.根据权利要求2所述的数字信号处理器,其中,所述指定的元素大小包括32位数据。
6.根据权利要求2所述的数字信号处理器,其中,所述指定元素大小包括64位数据。
7.根据权利要求2所述的数字信号处理器,其中,所述流包含指令指定数量的数据元素,所述数据元素具有在存储器中在所述开始地址开始的所述元素大小。
8.根据权利要求1所述的数字信号处理器,其中,所述流的每个数据元素具有固定的数据类型。
9.根据权利要求8所述的数字信号处理器,其中,所述数据元素的所述固定数据类型包括无符号整数。
10.根据权利要求8所述的数字信号处理器,其中,所述数据元素的所述固定的数据类型包括有符号整数。
11.根据权利要求8所述的数字信号处理器,其中,所述数据元素的所述固定的数据类型包括浮点数。
12.根据权利要求8所述的数字信号处理器,其中,所述数据元素的所述固定的数据类型是具有两个相等大小的子元素的复数。
13.根据权利要求12所述的数字信号处理器,其中,所述两个大小相等的子元素包括第一实部子元素和第二虚部子元素。
14.根据权利要求12所述的数字信号处理器,其中,所述两个大小相等的子元素包括第一幅度子元素和第二角度子元素。
15.根据权利要求12所述的数字信号处理器,其中,所述两个相等大小的数据子元素中的每个包括8位。
16.根据权利要求12所述的数字信号处理器,其中,所述两个相等大小的数据子元素中的每个包括16位。
17.根据权利要求12所述的数字信号处理器,其中,所述两个相等大小的数据子元素中的每个包括32位。
18.根据权利要求12所述的数字信号处理器,其中,所述两个相等大小的数据子元素中的每个包括64位。
19.根据权利要求12所述的数字信号处理器,其中:
所述流头端寄存器被分为通道;
所述流指定所述复数数据类型不交换或交换;以及
所述流引擎:根据对于复数数据类型不交换的指定,以在所述存储器中存储所述子元素的顺序,将复数取出的数据元素的所述两个子元素存储在所述流头端寄存器的通道中;以及根据对于复数数据类型交换的指定,以与在所述存储器中存储所述子元素的相反的顺序,将复数取出的数据元素的所述两个子元素存储在所述流头端寄存器的通道中。
20.根据权利要求1所述的数字信号处理器,其中,所述指令指定的流的所述多个数据元素的序列由所述数据元素的数据大小和内部循环的取出的迭代次数来指定。
21.根据权利要求20所述的数字信号处理器,其中:
所述指令指定的流的所述多个数据元素至少部分地由存储在流定义模板寄存器中的流定义模板来指定,所述流定义模板寄存器具有指定所述内部循环的迭代数量的内部循环计数数据字段;以及
所述流引擎包括地址生成器,其生成所述流中下一个数据元素的存储器地址,用于从存储器中取出所述下一个元素,由所述地址生成器生成的所述存储器地址从所述流的第一数据元素的所述开始地址开始处开始,并且改变存储器地址直到达到指定的所述内部循环的迭代数量,所述改变存储器地址的量等于用于后续数据元素的指定的数据元素大小。
22.根据权利要求21所述的数字信号处理器,其中:
所述流定义模板寄存器具有指定正向或反向的方向数据字段;以及
如果所述方向数据字段指定正向,则用于后续数据元素的所述地址生成器将所述存储器地址改变为递增的存储器地址;如果所述方向数据字段指定反向,则将所述存储器地址改变为递减的存储器地址。
23.根据权利要求21所述的数字信号处理器,其中:
所述流定义模板寄存器具有指定循环维度的循环维度数据字段和指定至少一个外部循环的循环计数的循环计数数据字段;以及
在循环的数据元素地址的生成完成时,所述地址生成器改变所述存储器地址,所述改变的量对应于由下一个更高循环的所述循环维度数据字段指定的所述循环维度。
24.根据权利要求23所述的数字信号处理器,其中,所述地址生成器将每个循环维度数据字段视为有符号整数。
25.根据权利要求21所述的数字信号处理器,其中:
所述流定义模板寄存器具有指定转置模式或不转置模式的转置数据字段;以及
如果所述转置数据字段指定了转置模式,则在所述开始地址处调用第一数据元素之后,所述地址生成器转置所述内部循环和第一外部循环:
改变所述存储器地址,所述改变的量对应于所述第一外部循环的所述循环维度,并且在所述存储器地址处调用下一个数据元素,所述调用的次数等于所述第一外部循环的所述循环计数;以及
重复以下操作,重复的次数等于所述内部循环的所述循环计数,所述操作包括:改变所述存储器地址,所述改变的量对应于所述数据元素大小;并且改变所述存储器地址,所述改变的量对应于所述第一外部循环的所述循环维度,并且在所述存储器地址处调用下一个数据元素,所述调用的次数等于所述第一外部循环的所述循环计数。
26.根据权利要求21所述的数字信号处理器,其中:
所述流定义模板寄存器具有指定转置模式或不转置模式的转置数据字段,所述转置数据字段在指定所述转置模式时指定转置粒度模式;以及
如果所述转置数据字段指定了转置模式,则在所述开始地址处调用第一数据元素之后,所述地址生成器转置所述内部循环和第一外部循环,重复以下操作,重复的次数等于所述第一外部循环的所述循环维度超出所述粒度的因子,所述操作包括:
改变所述存储器地址,所述改变的量对应于所述第一外部循环的所述循环维度的量,并且在所述存储器地址处调用下一个数据元素,所述调用的次数对应于所述粒度;以及
重复以下操作,重复的次数等于所述内部循环的所述循环计数,包括:改变所述存储器地址,所述改变的量对应于所述数据元素大小的量;并且改变所述存储器地址,所述改变的量对应于所述第一外部循环的所述循环维度,并且在所述存储器地址处调用下一个数据元素,所述调用的次数等于所述第一外部循环的所述循环计数。
27.根据权利要求1所述的数字信号处理器,其中,在所述至少一个操作单元使用之前,所述流引擎预取出指令指定量的所述数据元素。
28.根据权利要求1所述的数字信号处理器,其中:
所述流头端寄存器划分为所述元素数据大小的通道;以及
所述流引擎将所述流的一个数据元素存储在所述流头端寄存器的每个通道中。
29.根据权利要求28所述的数字信号处理器,其中,如果剩余数据元素少于通道,则所述流引擎将所有0都存储在附加通道中。
30.根据权利要求28所述的数字信号处理器,其中,所述流引擎包括:
地址生成器,其生成所述流中下一个数据元素的存储器地址,用于从存储器中取出所述下一个元素;
数据先进先出缓冲器,其临时存储从存储器取出的数据元素;以及
格式化器,其连接到所述数据先进先出缓冲器和所述流头端寄存器,用于从所述数据先进先出缓冲器中调用数据元素,根据每个数据元素执行指令指定的格式化,以及将格式化的数据元素存储在所述流头端寄存器中。
31.根据权利要求30所述的数字信号处理器,其中,所述数据先进先出缓冲器在将数据元素提供给所述至少一个操作单元之后丢弃所存储的数据元素。
32.根据权利要求28所述的数字信号处理器,其中:
所述流指定提升或不提升;以及
所述流引擎:根据不提升的指定,将所述流的一个数据元素存储在所述元素大小的所述流头端寄存器的每个通道中;并且根据提升的指定,提升每个数据元素的所述数据大小,并且将所述流的一个数据元素存储在两倍于原始元素大小的所述流头端寄存器的每个通道中。
33.根据权利要求32所述的数字信号处理器,其中:
所述流指定包括无符号整数数据类型的数据类型;以及
根据不提升的指定,所述流引擎通过零扩展来提升每个无符号整数数据类型数据元素的所述数据大小。
34.根据权利要求32所述的数字信号处理器,其中:
所述流指定包括有符号整数数据类型的数据类型;以及
根据提升的指定,所述流引擎通过符号扩展来提升每个有符号整数数据类型数据元素的所述数据大小。
35.根据权利要求32所述的数字信号处理器,其中:
所述流指定包括浮点数数据类型的数据类型;
根据提升的指定,所述流引擎将具有16位的数据大小的浮点数从短浮点数即16位浮点数提升到单精度浮点数即32位浮点数。
36.根据权利要求32所述的数字信号处理器,其中:
所述流指定包括浮点数数据类型的数据类型;以及
根据提升的指定,所述流引擎将具有32位的数据大小的浮点数从单精度浮点数即32位浮点数提升到双精度浮点数即64位浮点数。
37.根据权利要求1所述的数字信号处理器,还包括:
数据一致性单元,其连接到所述流引擎和所述存储器,所述数据一致性单元可操作以确保所述流与在所述流开始指令之前的对存储器的所有写入一致。
38.根据权利要求37所述的数字信号处理器,其中,所述数据一致性单元不确保所述流与在所述流开始指令之后的对存储器的所有写入一致。
39.根据权利要求38所述的数字信号处理器,其中:
所述流引擎响应于流结束指令而停止数据的调用;以及
所述指令存储器包括控制所述至少一个操作单元的指令,以在对应的流开始指令和对应的流结束指令之间的间隔期间避免存储器写入存储器块内的存储器地址,所述存储器块包括所述指令指定的流的多个数据元素。
40.根据权利要求1所述的数字信号处理器,还包括:
第一奇偶校验位生成器,其接收所述流,所述第一奇偶校验位生成器周期性地从所述流形成第一奇偶校验位,其中所述流引擎连接到所述第一奇偶校验生成器以接收和存储所述流和对应的奇偶校验位;以及
第二奇偶校验位生成器,在将所述流和对应的奇偶校验位提供给所述至少一个操作单元之前,所述第二奇偶校验位生成器在所述流引擎的输出处接收存储的流和对应的奇偶校验位,所述第二奇偶校验位生成器可操作以:在所述流引擎的所述输出处从所述流周期性地形成第二奇偶校验位;将所述第一奇偶校验位和对应的第二奇偶校验位进行比较;如果所述第一奇偶校验位与所述对应的第二奇偶校验位不匹配,则发出奇偶校验故障信号。
41.根据权利要求40所述的数字信号处理器,其中,所述流引擎在奇偶校验故障时重新开始取出所述流。
42.根据权利要求1所述的数字信号处理器,其中:
所述指令存储器存储至少一个流保存指令和至少一个流恢复指令;
响应于流保存指令,所述流引擎保存当前开启流的状态元数据并停止所述当前开启流;以及
响应于流恢复指令,所述流引擎调用先前保存的所述当前开启流的状态元数据,重新开启所述当前开启流,并恢复对应于所述存储的元数据的所述当前开启流。
43.根据权利要求1所述的数字信号处理器,还包括:
一级数据高速缓存,其连接到所述至少一个操作单元,所述一级数据高速缓存临时存储数据,用于由所述至少一个操作单元的操纵,如果对应的数据被存储在其中即高速缓存命中,则所述一级数据高速缓存服务于所述至少一个操作单元存储器读取和写入,以及相反即高速缓存未命中,则将所述至少一个操作单元存储器读取和写入引导到更高级别存储器;以及
二级高速缓存,其连接到所述一级数据高速缓存和所述流引擎,所述二级高速缓存临时存储数据,用于由至少一个操作单元操纵,如果对应的数据被存储在其中即高速缓存命中,则所述二级高速缓存服务于一级数据高速缓存的存储器读取和写入未命中和流引擎存储器读取,以及相反即高速缓存未命中,则将所述至少一个操作单元存储器读取和写入和流引擎读取引导到更高级别的存储器。
44.根据权利要求43所述的数字信号处理器,其中:
所述一级数据高速缓存可以临时存储未存储在所述二级高速缓存中的数据;以及
如果对应的数据未存储在其中即高速缓存未命中,则所述二级高速缓进一步基于流引擎存储器读取:搜寻所述一级数据高速缓存以确定对应的数据是否存储在所述一级数据高速缓存中;以及如果所述对应的数据存储在所述一级数据高速缓存中,则从所述一级数据高速缓存提供所述对应的数据。
45.根据权利要求1所述的数字信号处理器,其中:
所述指令的所述至少一个数据操作数字段包括第一数据操作数字段和第二数据操作数字段;
所述至少一个功能单元包括第一操作数输入和第二操作数输入;以及
所述指令解码器还可操作用于:解码具有第一数据操作数字段的指令,所述第一数据操作数字段具有所述预定的读取位编码,以将存储在所述流头端寄存器中的所述数据提供给所述对应功能单元的所述第一操作数输入;解码具有带有预定的读取/前进位编码的第一数据操作数字段的指令,以将存储在所述流头端寄存器中的所述数据提供给所述对应的功能单元的所述第一操作数输入,并通过将所述流的下一个顺序数据元素存储在所述流头端寄存器中,来使所述流引擎前进;解码具有第二数据操作数字段的指令,所述第二数据操作数字段具有所述预定的读取位编码,以将存储在所述流头端寄存器中的所述数据提供给所述对应功能单元的所述第二操作数输入;并且解码具有带有预定的读取/前进位编码的第二数据操作数字段的指令,以将存储在所述流头端寄存器中的所述数据提供给所述对应功能单元的所述第二操作数输入,并通过将所述流的下一个顺序数据元素存储在所述流头端寄存器中,来使所述流引擎前进。
46.一种数字信号处理器,包括:
数据寄存器堆,其包括由寄存器编号存储数据指定的多个数据寄存器;
存储指令的指令存储器,每个指令经由寄存器编号指定数据处理操作和至少一个数据操作数;
指令解码器,其连接到所述指令存储器,用于顺序地从所述指令存储器中调用指令并确定所述指定的数据处理操作和所述指定的至少一个操作数;
至少一个功能单元,其连接到所述数据寄存器堆和所述指令解码器,用于用于根据至少一个操作数执行数据处理操作并将结果存储在指令指定的数据寄存器中,所述至少一个操作数对应于由所述指令解码器解码的指令;
第一流引擎,其连接到所述指令解码器,其响应于第一流开始指令而操作,以从存储器中调用指令指定的多个数据元素的第一流;
第一流头端寄存器,其连接到所述第一流引擎并且被所述至少一个功能单元可读取作为操作数,所述第一流头端寄存器存储所述第一流的第一取出的数据元素;
第二流引擎,其连接到指令解码器,其响应于第二流开始指令而操作,以从存储器中调用指令指定的多个数据元素的第二流;以及
第二流头端寄存器,其连接到所述第二流引擎,并且被所述至少一个功能单元可读取作为操作数,所述第二流头端寄存器存储所述第二流的第一取出的数据元素;
其中所述指令解码器可操作用于:解码具有数据操作数字段的指令,所述数据操作数字段具有位编码的第一子集,以将存储在对应数据寄存器中的数据提供给对应的功能单元;解码具有带有预定的第一读取位编码的数据操作数字段的指令,以将存储在所述第一流头端寄存器中的所述数据提供给所述对应的功能单元;并且解码具有带有预定的第一读取/前进位编码的数据操作数字段的指令,以将存储在所述第一流头端寄存器中的所述数据提供给所述对应的功能单元,并通过将所述流的下一个顺序数据元素存储在所述流头端寄存器中来使所述流引擎前进。
CN201780050918.9A 2016-07-07 2017-07-07 具有带读取和读取/前进操作数编码的流引擎的数据处理设备 Active CN109643233B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211396898.XA CN115562729A (zh) 2016-07-07 2017-07-07 具有带读取和读取/前进操作数编码的流引擎的数据处理设备

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US15/204,243 2016-07-07
US15/204,243 US10678545B2 (en) 2016-07-07 2016-07-07 Data processing apparatus having streaming engine with read and read/advance operand coding
PCT/US2017/041271 WO2018009919A1 (en) 2016-07-07 2017-07-07 Data processing apparatus having streaming engine with read and read/advance operand coding

Related Child Applications (1)

Application Number Title Priority Date Filing Date
CN202211396898.XA Division CN115562729A (zh) 2016-07-07 2017-07-07 具有带读取和读取/前进操作数编码的流引擎的数据处理设备

Publications (2)

Publication Number Publication Date
CN109643233A true CN109643233A (zh) 2019-04-16
CN109643233B CN109643233B (zh) 2022-11-25

Family

ID=60910758

Family Applications (2)

Application Number Title Priority Date Filing Date
CN201780050918.9A Active CN109643233B (zh) 2016-07-07 2017-07-07 具有带读取和读取/前进操作数编码的流引擎的数据处理设备
CN202211396898.XA Pending CN115562729A (zh) 2016-07-07 2017-07-07 具有带读取和读取/前进操作数编码的流引擎的数据处理设备

Family Applications After (1)

Application Number Title Priority Date Filing Date
CN202211396898.XA Pending CN115562729A (zh) 2016-07-07 2017-07-07 具有带读取和读取/前进操作数编码的流引擎的数据处理设备

Country Status (4)

Country Link
US (3) US10678545B2 (zh)
EP (1) EP3482290B1 (zh)
CN (2) CN109643233B (zh)
WO (1) WO2018009919A1 (zh)

Families Citing this family (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10203958B2 (en) 2013-07-15 2019-02-12 Texas Instruments Incorporated Streaming engine with stream metadata saving for context switching
CN111258639B (zh) * 2018-11-30 2022-10-04 上海寒武纪信息科技有限公司 数据处理方法、处理器、数据处理装置及存储介质
CN111258652B (zh) * 2018-11-30 2022-12-09 上海寒武纪信息科技有限公司 数据处理方法、处理器、数据处理装置及存储介质
CN111258640B (zh) * 2018-11-30 2022-10-04 上海寒武纪信息科技有限公司 数据处理方法、处理器、数据处理装置及存储介质
CN111258638B (zh) * 2018-11-30 2022-10-04 上海寒武纪信息科技有限公司 数据处理方法、处理器、数据处理装置及存储介质
CN111258636B (zh) * 2018-11-30 2022-10-04 上海寒武纪信息科技有限公司 数据处理方法、处理器、数据处理装置及存储介质
CN111258635B (zh) * 2018-11-30 2022-12-09 上海寒武纪信息科技有限公司 数据处理方法、处理器、数据处理装置及存储介质
CN111258644B (zh) * 2018-11-30 2022-08-09 上海寒武纪信息科技有限公司 数据处理方法、处理器、数据处理装置及存储介质
CN111258770B (zh) * 2018-11-30 2023-10-10 上海寒武纪信息科技有限公司 数据处理方法、处理器、数据处理装置及存储介质
CN111258637B (zh) * 2018-11-30 2022-08-05 上海寒武纪信息科技有限公司 数据处理方法、处理器、数据处理装置及存储介质
CN111258642B (zh) * 2018-11-30 2022-10-04 上海寒武纪信息科技有限公司 数据处理方法、处理器、数据处理装置及存储介质
CN111258643B (zh) * 2018-11-30 2022-08-09 上海寒武纪信息科技有限公司 数据处理方法、处理器、数据处理装置及存储介质
CN111258647B (zh) * 2018-11-30 2022-12-09 上海寒武纪信息科技有限公司 数据处理方法、处理器、数据处理装置及存储介质
CN111258645B (zh) * 2018-11-30 2022-12-09 上海寒武纪信息科技有限公司 数据处理方法、处理器、数据处理装置及存储介质
US11392316B2 (en) * 2019-05-24 2022-07-19 Texas Instruments Incorporated System and method for predication handling
US20230297377A1 (en) * 2022-02-04 2023-09-21 Texas Instruments Incorporated Circuit, system, and method for matrix decimation

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102236578A (zh) * 2010-05-07 2011-11-09 微软公司 分布式工作流执行
CN104011670A (zh) * 2011-12-22 2014-08-27 英特尔公司 用于基于向量写掩码的内容而在通用寄存器中存储两个标量常数之一的指令
US20150019840A1 (en) * 2013-07-15 2015-01-15 Texas Instruments Incorporated Highly Integrated Scalable, Flexible DSP Megamodule Architecture
CN105718386A (zh) * 2014-12-22 2016-06-29 德克萨斯仪器股份有限公司 程序存储器控制器中页面窗口的本地页面转换和许可存储

Family Cites Families (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4128876A (en) 1977-04-28 1978-12-05 International Business Machines Corporation Synchronous microcode generated interface for system of microcoded data processors
US5181207A (en) 1988-04-14 1993-01-19 Harris Corp. Error correction mechanism using pattern predictive error correction codes
US5155820A (en) 1989-02-21 1992-10-13 Gibson Glenn A Instruction format with designations for operand lengths of byte, half word, word, or double word encoded in address bits
US6041404A (en) * 1998-03-31 2000-03-21 Intel Corporation Dual function system and method for shuffling packed data elements
US6418489B1 (en) 1999-10-25 2002-07-09 Motorola, Inc. Direct memory access controller and method therefor
US6829696B1 (en) 1999-12-30 2004-12-07 Texas Instruments Incorporated Data processing system with register store/load utilizing data packing/unpacking
US6874039B2 (en) 2000-09-08 2005-03-29 Intel Corporation Method and apparatus for distributed direct memory access for systems on chip
US20030131162A1 (en) * 2002-01-10 2003-07-10 Stacey Secatch Non-destructive read FIFO
US6832296B2 (en) 2002-04-09 2004-12-14 Ip-First, Llc Microprocessor with repeat prefetch instruction
EP1387254B1 (en) * 2002-07-31 2012-12-12 Texas Instruments Incorporated Skip instruction carrying out a test with immediate value
GB2409060B (en) 2003-12-09 2006-08-09 Advanced Risc Mach Ltd Moving data between registers of different register data stores
US7093061B2 (en) * 2004-02-19 2006-08-15 Avago Technologies Fiber Ip (Singapore) Pte. Ltd. FIFO module, deskew circuit and rate matching circuit having the same
JP2006004042A (ja) 2004-06-16 2006-01-05 Renesas Technology Corp データ処理装置
US7574541B2 (en) 2004-08-03 2009-08-11 Lsi Logic Corporation FIFO sub-system with in-line correction
US7890702B2 (en) 2007-11-26 2011-02-15 Advanced Micro Devices, Inc. Prefetch instruction extensions
US8041891B2 (en) 2008-07-14 2011-10-18 Lsi Corporation Method and system for performing RAID level migration
CN104025021A (zh) * 2011-12-23 2014-09-03 英特尔公司 用于滑动窗口数据收集的设备和方法
US11494188B2 (en) 2013-10-24 2022-11-08 Arm Limited Prefetch strategy control for parallel execution of threads based on one or more characteristics of a stream of program instructions indicative that a data access instruction within a program is scheduled to be executed a plurality of times

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102236578A (zh) * 2010-05-07 2011-11-09 微软公司 分布式工作流执行
CN104011670A (zh) * 2011-12-22 2014-08-27 英特尔公司 用于基于向量写掩码的内容而在通用寄存器中存储两个标量常数之一的指令
US20150019840A1 (en) * 2013-07-15 2015-01-15 Texas Instruments Incorporated Highly Integrated Scalable, Flexible DSP Megamodule Architecture
CN105718386A (zh) * 2014-12-22 2016-06-29 德克萨斯仪器股份有限公司 程序存储器控制器中页面窗口的本地页面转换和许可存储

Also Published As

Publication number Publication date
EP3482290A4 (en) 2019-07-31
US20180011707A1 (en) 2018-01-11
US10678545B2 (en) 2020-06-09
US20200341760A1 (en) 2020-10-29
CN115562729A (zh) 2023-01-03
US20230325188A1 (en) 2023-10-12
US11693660B2 (en) 2023-07-04
WO2018009919A1 (en) 2018-01-11
EP3482290B1 (en) 2022-03-02
EP3482290A1 (en) 2019-05-15
CN109643233B (zh) 2022-11-25

Similar Documents

Publication Publication Date Title
CN109643233A (zh) 具有带读取和读取/前进操作数编码的流引擎的数据处理设备
US12045614B2 (en) Streaming engine with cache-like stream data storage and lifetime tracking
US11099933B2 (en) Streaming engine with error detection, correction and restart
US10747636B2 (en) Streaming engine with deferred exception reporting
CN109144568A (zh) 将有效位通道作为矢量断言暴露于cpu
CN110337635A (zh) 用于点积操作的系统、方法和装置
CN108268278A (zh) 具有可配置空间加速器的处理器、方法和系统
CN108205448A (zh) 具有在每个维度上可选择的多维循环寻址的流引擎
CN109952559A (zh) 具有单独可选元素及成组复制的流式传输引擎
US12079470B2 (en) Streaming engine with fetch ahead hysteresis
CN107589957A (zh) 具有双矢量和成双的单矢量操作模式的流参考寄存器
CN108205447B (zh) 使用早期和后期地址以及循环计数寄存器来跟踪架构状态的流引擎
CN109213525A (zh) 具有快捷起始指令的流式传输引擎
CN109992305A (zh) 用于将片寄存器对归零的系统和方法
CN110321165A (zh) 复数向量融合乘加和复数向量乘法的高效实现
CN114675888A (zh) 用于加载矩阵操作加速器瓦片的指令的装置、方法和系统
CN109992303A (zh) 用于将片寄存器对存储到存储器的系统和方法
CN113853591A (zh) 将预定义填补值插入到向量流中
CN112149050A (zh) 用于增强的矩阵乘法器架构的装置、方法和系统

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant