传统的单一处理器结构不能满足通信应用对数据处理和控制功能要求,RISC/DSP组合处理器通过恰当地平衡两者的性能在单处理器结构中实现双处理器性能。本文以VoIP应用中RISC/DSP组合处理器设计为例,介绍了当前双处理器实现方法和存在的问题,深入分析通过采用DSP的MAC、桶型移位器和饱和算法电路增强RISC/DSP组合处理器性能的思路。
随着网络技术由传统的电路交换向基于分组网络技术(如VoIP和基于数字用户线的语音技术)的转变,通信系统设计面临很多新的要求,传统的单一结构处理器很难满足这些复杂网络处理任务需求,而同时结合RISC处理器和用于信号检测及噪声消除的数字信号处理器(DSP)的混合结构可以满足这些要求。目前,已经有结合这两类处理器的解决方案,但此类方案增加的成本和复杂度对某些应用而言是难以接受的。其它的可选择方案包括在一个RISC处理器中加入DSP功能,或者从头开始ASIC设计,但这样既费时又成本很高。
上面的这些方案在成本、灵活性和复杂度上各有优缺点,而采用可扩展处理器能综合考虑这些因素,设计工程师可对处理器定制应用指令组。目前这类处理器包括Tensilica公司的Xtensa和ARC International公司的ARCtangent。
可扩展处理器的主要优点是使用统一的存贮器和单一的软件开发环境,比传统的双处理器设计具有更低的成本。此外,由于在内部实现定制,所以此类处理器还能实现知识产权保护。然而,在选择采用可扩展处理器之前,设计工程师必须完全了解应该向指令组中增加什么内容以充分利用这一结构的优点。
双处理器实现方法
一个典型VoIP系统使用一个RISC处理器来实现网络协议处理,执行位和字节操作以实现包头和路由信息解码、数据打包,并处理顺序标记以使信息包能正确实现声音回放。同时,系统还需要一个DSP来实现回声消除、噪声抑制和说话方的音调检测。在将信息打包之前DSP还执行静音检测和语音压缩,以及执行解码和解压这样的反向操作。
满足这些多样要求的传统方案是采用双处理器(见图1):RISC处理器用于连接数字网络,用作协议处理引擎和网络管理器,同时也能处理主系统控制和用户接口;DSP相连于脉码调制(PCM)接口,用于语音压缩及解压等功能。
尽管上面的双处理器方案可行,但其最明显的缺点是两个处理器增加了成本,因为每个处理器有它自己的存贮器和外围器件,每个处理器也需要自己的设计工具链,以及近乎独立的软件开发工作。此外,两个处理器之间的数据交换也是一个问题,必须采用一些公用的双口RAM或FIFO存贮器用作两个处理器之间的缓冲器,或采用一个复杂的软件握手处理方案来控制数据交换。
另外,该方案对于一些小型应用而言是大材小用。网络数据率决定了RISC处理器能够运行并保持的最低时钟速度,但实际上,在对单信道的数据处理中大多数时间RISC处理器都处于空闲状态。在大型系统中,RISC处理器能处理多个信道的数据流,而每个信道都有其自己的DSP,在小型系统中,多余的RISC处理器性能被浪费掉,因为其所需要的数据处理还不能充分利用DSP的性能。
单处理器方案
很明显,单处理器方案在成本上具有优势。有三种传统方法可以实现单处理器设计,即采用一个具有DSP增强功能的RISC处理器或用一个具有RISC控制增强功能的DSP,或创建一个定制的处理器设计,该设计一般是通过开发ASIC来实现。
大多数RISC结构都包含DSP单元,但这些DSP单元还不能满足很多应用需求。在很多情况下,在这类处理器中仅增加了一个乘法累加(MAC)单元,尽管有一些也包含桶形移位器(barrel shifter)。在控制应用中增加这些单元可以加快DSP任务处理速度,但在通信应用中还要求更强的性能。以VoIP系统所要求的DSP为例,这类系统要求5倍于RISC处理能力的DSP。由于这类处理器的结构固定,系统设计工程师需要平衡考虑DSP和RISC的性能。
RISC增强型DSP可能在DSP性能上很强,但却不能提供足够的RISC性能。很多增强型DSP的目标应用为需要最小量位操作的控制应用,此类芯片不能满足网络协议速度,除非大大增强其DSP功能。
相比于RISC,DSP处理器趋向于朝复杂的流水线(pipeline)结构方向发展,能够有效地执行复杂DSP运算。但这种结构对简单控制并没有益处,还可能使DSP作为一个控制处理器显得效率很低,而当DSP只对整字宽数据进行处理时会进一步影响到效率问题。在通信协议处理中,信息包一般由多个8位数据字组成,由于解包后的数据只有最后8位有用,因此即使DSP能够处理16或32位字,其性能也不能得到有效发挥。RISC处理器可以处理打包的字,并能分别处理一个长字的每一个字节,而DSP在进行协议处理时需要对数据解包和重新打包,从而增加了软件和存贮器开销。
目前,市场上已经有平衡结合RISC和DSP性能的标准芯片,但实际上这类器件只是传统双处理器结构的单芯片版本,它们仍然有独立的RISC和DSP内核。尽管这些平台具备统一的实时操作系统和工具的优点,但一定程度上还存在采用双处理器方法进行软件开发/优化上的不足之处。
采用ASIC具有冒险性
通常,你可以设计自己的处理器并以ASIC的形式构建。但ASIC设计需要很长的设计周期,因为必须定制处理器,然后还需要定制编译器、汇编和调试工具。
ASIC方法更大的缺点是难以恰当地平衡DSP和CPU的处理能力。相应的开发工具不能高速地仿真软件执行的情况,难以对设计性能进行预测,而且不能通过设计迭代来调整性能。此外,ASIC一次掩膜的费用达几十万美元,一旦不能正确平衡两者的性能将付出很高的代价。
但ASIC并不是实现定制处理器的唯一方法。采用某类开发工具可以在基本的处理器设计上添加定制指令和执行这些指令的硬件,这类开发工具支持像Xtensa和ARCtangent可扩展处理器,设计工具然后自动产生扩展传递到编译器和其它软件开发工具中,这样编译器和软件开发工具就能支持这类增强内核。
此外,目前还出现了一些其它可扩展结构,但很多是用户可扩展结构,只能支持定制外围器件,具有可定制存贮器配置以匹配目标系统,这些系统不支持增加定制指令。
自动工具生成还有一个隐蔽的很有吸引力的好处,即可以实现软件知识产权(IP)保护。当你通过增加指令和执行这些指令的电路来定制一个可扩展处理器时,你增加了该设计所独有的操作码,由于软件工具是自动集成的,没有一个设计团队以外的人员知道新的操作码有什么功能。因此,如想通过对软件进行反编译来对一个设计进行反向工程是不可能实现的,因为标准处理器中并没有定义这些操作码。
现在的问题就变成你需要增加什么,在一个基本的标准RISC处理器上有三种DSP电路:MAC单元、桶形移位器和饱和算法(Saturation arithmetic)逻辑。此外,一个DSP将提供唯一的存贮器寻址方案。
乘法累加单元
大多数设计工程师将MAC认为是DSP的核心电路,因为很多信号处理算法都具有形式为x-Σaix bi的函数。用一个标准的RISC处理器来实现这种运算需要一个很大乘法程序循环,占用很多CPU时间,而MAC用一个指令就可实现乘法和其后的加法运算,大大地提高了该函数的软件执行速度。
另外一个软件加速器是桶形移位器。将二进制字向左或向右移位能实现很多功能,逻辑移位是将字的首位和末位之间的各位循环移动,这对于子字段对齐很有用。而算法移位会在移位时保持最高位即二进制符号位不变,对其它位进行向左或向右移动,并根据移动方向对相应的空位进行填充。算术移位等效于对这个数乘2或除以2,这对二进制数的乘法、除法和归一化很有用。对于MAC而言,采用桶形移位器只用一个指令就可实现任何数量的移位,从而减少了软件循环,而RISC处理器只能一次移一位。
在执行数学运算时采用饱和算法可以避免出现上溢或下溢。在常用的RISC处理器中,加法和减法会引起翻转,对计数器而言翻转事件表示计数终止,然而对于信号处理而言,如果翻转被错误地解释为数值的突变将会产生错误的结果。为在标准RISC处理器中避免产生翻转,程序员需要对算法子程序增加测试和校正步骤。使用饱和逻辑,校正是自动的,不需要额外的测试或指令。
在按国际标准进行设计时,饱和逻辑的实现非常重要,国际电信联盟(ITU)和欧洲电信标准协会(ETSI)为判定像语音编码器这类算法的性能提供了参考向量。用户希望设计能达到与参考向量之间逐位匹配,以证明算法己正确实现。
为获得精确匹配,饱和逻辑必须是符合标准定义的运算。例如,在一个16×16 MAC运算中,标准要求对累加结果限制在一个有符号32位数的极限值范围内。然而,很多MAC有一个比32位宽的累加器来防止产生上溢或下溢,在将结果存储到一个目标寄存器时会使结果产生饱和,这将得到一个与累加器中的32位饱和值稍微不同的结果,用户可能会把这种差异误认为产生了错误。一个兼容ITU标准的MAC能够执行两种中任何一种类型的饱和算法。
桶形移位器
同样,桶形移位器必须符合ITU/ETSI标准以产生每位都正确的结果。这些移位器需要提供饱和,而且无论移位操作数的大小都必须保持符号位,并处理反向移位操作。如果移位器不符合标准要求,采用标准实现的软件仿真是一个可行的方案,但这就丢掉了采用DSP指令的硬件实现的优越性。
然而,不是所有的DSP都是对指令增强,如存储器寻址方案虽然不是直接与一个特定的指令相关,但会对软件处理一些DSP运算的有效性产生影响。在DSP中,X-Y存储器允许一个操作同时寻址两个源操作数,典型的情况是一个操作数来自X域,另一个来自Y域。在没有总线仲裁下就可以同时进行读/写操作,简化了并行数据移动。
能从相同的域(X或Y)寻址两个源操作数的X-Y存储器系统还可能减少储器访问。如果没有这种功能,软件必须从一个域拷贝数据到另一个域中,因此一个操作数可以从X域取出,而另一个操作数要从Y域取出。当数据序列(rn)存储在单个域中时,MAC a=Σri×rk运算就通常会要求从单个域中访问数据。
另外,由于有额外的两对以上的指针,可进一步简化编程任务并减少大循环占用的Mips数。在这种循环中有大量的不同数据序列参与在“n”次递归计算中,这些递归计算的结果可能需要写入“n”个不同的存储器段,以在后面的算法中进行适当的处理。当n大于2时,要在这么多不同的段中存储就成了很麻烦的问题,需要有额外指针帮助。
X-Y存储器还可以采用图2所示的寻址模式,该模式在DSP运算中特别有用。循环寻址对于创建缓冲器很有用,在实现过滤器时可变偏移更新能起到帮助作用。位反向寻址消除了在进行“蝶状”交叉计算时移动数据的要求,从而简化了快速傅里叶变换计算。
尽管存储器寻址和特殊电路加速了芯片信号处理性能,但必须处理得当,因为增加这些电路将使成本增加,设计工程师必须先了解设计所需要的DSP性能,这样就不会因增加不必要的性能而增加成本。另外,还必须了解处理器需要一个还是两个MAC以及数据的位数,如果需要桶形移位器,移位器应该多长?应该使用一个多大的X-Y存储器?最好在设计开始时就对这些问题进行评估,错误的判断将导致不能满足性能要求或成本过高。
可扩展处理器在这种性能要求不确定的应用领域显示了其优越性,创建内核的开发工具允许对运行中代码的内核性能进行软件仿真,而对扩展指令正在使用与否无关。因此,设计工程师可以选择在仿真中运行样本代码,并评估加入扩展对性能产生的影响。
性能微调
处理器性能微调是一个反复的过程。用仿真器和一个软件执行分析器(profiler),你可以识别软件运行的瓶颈所在,该瓶颈即占用大部分时间的代码段,然后判断一个用户指令是否可以减少CPU周期。如果是这样,在处理器配置中增加这个指令,再次进行仿真。
几个ITU/ETSI DSP指令的代表性执行情况分析如图3所示,该图显示了在实现两个标准语音编码器其中一个时,每秒钟每个DSP指令执行的次数。正如所预想的一样,MAC函数应用最多,每秒钟几百万次,移位指令L_ASL和L_ASR也是最常用指令。这两类指令都可以在DSP扩展到RISC内核时用来增强系统性能。它们的输入操作数“B”为32位,能够分别提供与ASL和ASR相同的功能特性,因为后者对16位的源操作数“b”进行运算。单独在RISC中实现每一个运算将需要很多步,所以采用定制指令相当于为处理器性能加上几百个Mips。
然而,增加一个定制指令对芯片费用及执行速度都会产生一定影响,因此评估增加指令将带来多少成本影响很重要。大多数可扩展处理器设计工具将会对你所加指令对芯片尺寸的影响进行评估,因为一个IC的成本很大程度上决定于其芯片尺寸,这种评估够帮助你大概了解芯片成本。
在评估了价格/性能比之后,你就可以对下一个可能影响性能的瓶颈反复上述过程,像图3中的归一化和舍入运算等经常使用的指令都可以用来实现该过程。在仿真结果达到所需的性能水平时,你可以保持当前的设计不变并由此产生最终的程序。然后,可以使用你已开发的代码来对处理器设计进行一些轻微的调整。
作者:Dariush Baghbadrani
首席DSP工程师
ARC International公司
Email:drani@