DM642 CPU概述
DM642的CPU获取高效的超长指令字(256位),在每个时钟周期供应给八个功能单元八条32位的指令。按VLIW体系结构的特点,它控制了所有八个单元而不需要提供指示是否他们不准备执行。每条32指令的第一位决定下一条指令是否属于同一个指令包,或者是否应该作为下一个执行包的一部分在随后的时钟周期执行。取指包总是256位,然而执行包可以是变化的的长度。可变长执行包是一个重要的存储节约特征,区别于C64X CPU的其他VLIW体系结构。C64X 的VelociTI.2扩展了TMS320C62x? DSP VelociTI的体系结构,扩展部分包括:
1)寄存器组增强
2)数据路径扩展
3)四路8位和双16位扩展的数据流加强
4)附加的硬件功能单元
5)增加正交指令集
6)附加指令降低代码大小,提高寄存器灵活性。
CPU起主要作用的两套功能单元,,每一套包括4个功能单元和一个寄存器组。一套包括功能单元.L1, .S1, .M1, 和.D1,另一套包含.L2,.S2,.M2和D2。两个寄存器组每个包含32个32位寄存器共64个通用寄存器。除了支持在C62x? VelociTI? VLIW体系中的便携16位和32/40位定点数据类型外,C64X系列寄存器组还支持大量的8位数据和64位定点数据类型。两套功能单元,连同两侧的寄存器组,组成CPU的A,B 部分。每部分的四个功能单元可以自由分享自己部分的32位寄存器,此外,每部分特色的数据交叉通路-一条单独的数据总线连接另一部分的所有寄存器,这样两套功能单元可以从对方的寄存器组交叉访问数据。C64X CPU数据交叉通路访问需要多个时钟周期,这使得同一个寄存器在同一个执行包作数据交叉通路时可用作多重功能单元。C64X CPU的所有功能单元都可以通过数据交叉路径访问操作数。在一个时钟周期内,在同一部分的寄存器可以被所有的功能单元访问。在C64X CPU中,当指令试图通过数据交叉路径读在先前一个时钟周期更新过的寄存器时,就会出现延迟时钟。
除了C62X CPU的定点指令,C64X CPU 包括一个积累全面的4路8位和双16位指令集扩展。这些VelociTI.2扩展包括允许C64X CPU 直接操作来自流水线的大量数据而提高指令集的效率。这是一个重要因数对于视频和图象应用来说。
C64X CPU的另一个重要因数是load/store结构,所有的指令操作在寄存器里(相对于数据存储器来说),两套数据处理单元(.D1和.D2)负责所有寄存器组和存储器之间的数据传输。数据处理在.D单元,它允许产生的数据地址从一个使用的寄存器组或另一个寄存器组去加载或存储数据。C64X的.D单元能加载或存储字节(8位),半字(16位),字(32位)为单位的单一指令。随着新的数据路径扩展,C64X的.D单元可以加载和存储双字(64位)为单位的单一指令。此外,不并行的加载或存储指令允许.D寄存器访问在字节边界字或字节。C64X CPU支持各种间接寻址方式,用于5到15位偏移量的线性或循环寻址。所有的指令都是有条件的,并且大部分可以访问64个寄存器中的任一个。然而,有些寄存器不支持特定的寻址方式或是有条件的条件指令。(如果条件不是自动为“真”)
两个.M功能单元执行所有的乘法运算。每个C64X .M单元在每个时钟周期能进行16×16位或4个8×8位的乘法运算。.M单元还能进行16×32位乘法运算,带加/减操作的双16×16位乘法和带加法操作的4路8×8位乘法。除了标准的乘法运算,C64X .M单元还包括位记数,循环,Galois域乘法和双向可变硬件转移。
两个.S和.L功能单元进行一般的算术,逻辑运算和每个时钟周期结果都变化的分支功能。C64X CPU的算术和逻辑运算包括单32位,双16位和4路8位运算。
处理流程开始于一个256位的取指包从程序存储器取出。每个32位指令位于不同的功能单元,它们被指令的一位最低的标志位联系在一起。指令被“连锁”在一起同时执行(最多8条)组成一个执行包。一个“0”在指令的标志位就破坏了联接,有效的给随后的的下一个执行包的指令排序。一个C64X DSP芯片现在允许执行包与取指包边界相交。在TMS320C62x/TMS320C67x DSP芯片中,如果一个执行包与取指包的边界相交(256位宽),它将会在下一个取指包重新组织,而当前取指包的其余指令被NOP指令填充。在C64X CPU芯片中,执行边界的限制已经被取消了,同时,消除所有填充取指包中的NOP指令,从而降低了指令的长度。在一个取指包里的执行指令数量可以是1到8的任何数,在一个时钟周期执行包被分配给各自的功能单元,并且下一个256位的取指包直到所有执行包从当前取指包被分配出去后才开始取指。通过解码后,指令同时驱动所有当前活动的功能单元。以最大效率地执行8条指令在每个时钟周期。大部分结果保存在32位寄存器中,随后它们被移到内存中,以字节,半字或者双字为单位。所有的加载和存储指令都是字节,半字,字或双字寻址的。