指令集对处理器在不同任务场景的适用性有着深远影响,是处理器设计中要考虑的首要因素。相比于传统的通用处理器,DSP处理器的指令集面向数字信号处理场景高度优化,除了包含通用处理器的常用指令外,在数字信号处理方面也进行了全面增强,在执行信号处理算法时效率更高、使用更便捷。接下来将系统介绍DSP处理器指令集不同于通用处理器指令集的特点。
在数字信号处理任务中,除了常见的算术操作、逻辑操作和移位操作外,乘法操作和乘累加操作也频繁使用。因此,DSP处理器在指令集设计上通常特别强调乘累加能力,并提供了多种类型、位宽的乘法和乘累加指令以及专用硬件的支持,从而大幅提高了计算效率和速度。DSP指令集一般还包括除法、倒数、开平方根等指令,针对控制系统应用中常出现的周期密集的三角函数计算,DSP处理器指令集提供正弦函数、余弦函数、正切函数等三角函数指令;针对PID控制系统的非线性计算,DSP处理器指令集提供对数计算、逆指数计算指令;针对通信系统的特殊计算需求,DSP处理器指令集提供快速傅里叶变换、复数滤波、维特比译码、循环冗余校验的相关指令。通过提供面向不同领域的专用指令,DSP处理器在控制系统、通信应用等应用场景中运算效率极高。
数字信号处理算法通常会涉及循环操作,这些循环操作的循环体指令数目通常较小,但是循环带来的跳转和循环条件检测的开销相对较大。因此,DSP处理器通常会设计专门的硬件循环指令和专门的硬件支持,自动将单个指令或一组指令重复执行若干次,在检查循环是否完成、跳转返回循环顶部等操作时不需要时间开销,从而可以高效地执行循环操作,实现了循环操作的零开销执行。此外,针对数字信号处理中的数据访问特点,DSP处理器提供了后增寻址、取模寻址、位反寻址等专用寻址指令,在1.2.5节将做详细介绍。
哈佛结构是DSP存储结构的显著特征。DSP运算有访存密集的特点,为了提高数据的吞吐量,DSP一般采用数据存储和指令存储分离的存储结构。比较典型的存储结构为三块独立存储,分别为PM、DM0和DM1,其中PM用于存储指令,DM0和DM1均用于存储数据;部分DSP采用两块独立存储,分别为PM和DM,其中PM既可以存储指令又可以存储数据,DM仅存储数据,这种结构也称为超哈佛结构。超哈佛结构中的PM存在访存冲突的情况,即程序控制器的取指操作和数据访存操作同时访问PM存储器。在这种情况下,一般采用数据优先的策略,即取指停顿、数据访存优先执行。
DSP在很多领域中非常注重实时性和确定性,这意味着重复执行相同代码段不会因为操作数的变化而导致运行时间变化,这对于很多应用非常重要。为此,DSP存储通常不采用cache技术,而是采用嵌入式的SRAM。为了减小DSP访问SRAM的延时和提高吞吐量,一般会设计专用的流水协议总线,快速地进行数据的写入或读出。有些数字信号处理场景对确定性要求不高,因此部分DSP也采用了可配置的cache存储结构,以提高编程效率和灵活性。这种可配置的cache一般具有两种工作模式:cache模式和SRAM模式。
DSP内核在进行计算的时候,对内部SRAM中的数据进行处理,当所有数据处理完毕以后,需要从外部存储导入新的数据。如果上述工作串行执行,则在数据从外部存储导入内部存储的期间,DSP内核处于等待状态,这将牺牲计算效率。为此,DSP内部存储通常采用乒乓结构,如DSP内部包含DM0、DM1、DM2和DM3存储器,当DSP内核访问DM0和DM1中的数据时,DMA负责将数据从外部存储搬移到DM2和DM3;当DM0和DM1中的数据计算完毕以后,DSP内核开始从DM2和DM3中访问数据,此时DMA则负责DM0和DM1与外部存储之间的数据搬移。通过上述方式,为DSP内核持续供数,从而保证计算效率。
DSP处理的数据类型一般分为定点数据格式表示和浮点数据格式表示两类。DSP中常用的数据格式表示如图1-2所示。定点多采用8位、16位、32位和64位。浮点一般符合IEEE 754标准,主要为32位单精度浮点计算和64位双精度浮点运算。
图1-2 数字信号处理器常用的数据格式表示
早期的DSP处理器使用定点运算,至今,定点DSP仍然占重要地位。在定点DSP处理器中,数据格式的表示可以是整数和小数。整数运算和小数运算之间的主要区别在于如何处理乘法运算的结果,大多数定点DSP处理器都支持小数运算和整数运算。图1-3说明了简单的8位有符号二进制整数表示和小数表示,由补码形式组成,每一位均存在权重,全部位的权重相加即可转换为十进制数据。对于无符号表示,只需要把最高位的负数权重改为正数权重。
图1-3 8位有符号二进制整数表示a);8位有符号二进制小数表示b)
浮点DSP处理器支持浮点数据格式,由符号位 S 、指数位 E 、尾数位 F 组成。IEEE 754标准32位浮点表示如图1-4所示,符号位 S 、指数位 E 、尾数位 F 的长度分别为1位、8位、23位,并包含一位隐含位。单精度浮点格式与数值对应关系分为非规格化数和规格化数两种情况,隐含位分别为0和1。非规格化数遵循公式Denormal=(-l) S ×(0. F )×2 1-BIAS ,规格化数遵循公式Normal=(-l) S ×(1. F )×2 E -BIAS ,其中单精度浮点格式的偏置值BIAS为127。指数位为无符号的二进制整数表示,尾数位为无符号的小数表示,根据数据换算公式即可转换为十进制数据。
图1-4 IEEE 754标准32位浮点表示
根据定点数据格式与浮点数据格式特点,可以发现相同的数据位宽下存在差异。定点数据格式除了1位符号位,其他位均为有效数字。浮点除了1位符号位,专门分配了部分位宽用于表示指数位,这使得浮点表示可以获得更宽的动态范围,但是相比于定点表示的有效数字有所减少。根据定点数据格式与浮点数据格式的特点,可以满足DSP处理器的算法需求。
运算部件的处理对象是数据,根据数据格式的不同可以划分为定点运算部件和浮点运算部件两大类。相同的数据位宽下,因为浮点运算的复杂度更大,所以浮点运算部件的硬件资源和路径延时一般比定点运算部件大。运算部件支持的操作和运算的速度,标志着运算部件能力的强弱。
运算操作基于数据格式的特点进行实现,浮点数据运算一般遵循IEEE 754标准。加法、减法、比较、乘法等操作,是如今数字信号处理应用中最基本的操作,这些操作由运算部件的硬件结构支持。硬件结构的设计实现,最终映射成最基本的与、或、非、异或电路,因此数据位宽越大、算法越复杂,映射的电路组件就越多。对于不同的运算操作,如今存在比较成熟的通用硬件算法,用于简化和加速硬件实现,如Booth乘法器、超前进位加法器、前导0检测、移位器等。运算操作的结果可能会超出数据格式的表示范围,如除零、上溢、下溢等异常情况,会造成计算结果错误。该情况需要进行特殊处理,如饱和处理、舍入操作、异常设置等,一般需要控制和状态寄存器的支持,以保存出现的异常情况。
常用数据运算操作的硬件算法实现相对成熟,类似于搭积木的过程,将通用的小单元进行组合、拼接,最终实现运算操作。不同的组合方式会有不同的实现效果,因此实现所需要的运算功能往往有多种不同的硬件算法方案。在设计过程中,需要根据性能、功耗和面积指标之间的权衡取舍来选择最合适的硬件实现方案。总体来说,运算部件一般面积大、功耗高、延时长,是提升DSP处理器性能的关键,因此早期的DSP通常只实现定点运算部件。
随着摩尔定律的发展,芯片的面积制约降低,DSP处理普遍包含定点运算部件和浮点运算部件,浮点运算部件甚至会支持浮点乘累加操作,以获得更快的运算速度。但是如今摩尔定律和登纳德缩放定律的失效,功能部件仍然是DSP处理器提升性能的关键。在保证运算速度的情况下,如何设计面积最小的功能部件是一种挑战。当前,设计师通常采用资源复用技术,对实现的运算操作进行操作融合,完成整个运算部件的重构设计以降低面积。
大多数程序执行的访存常被映射成基地址+偏移(base+offset)的模式,这是由于程序常访问数组、指针以及结构体、联合体等复合结构,这类数据结构具有常数的偏移,因此基地址+偏移的寻址模式被视为一种基本的实现。
在指令编码空间足够的情况下,后增寻址(post-modify addressing mode)在DSP中实现较为方便。后增寻址模式是在一次访存后,存放地址的寄存器通常自动增加(或减少)常数的偏移,以备下次访存使用。这种寻址模式对于循环密集的程序而言十分有效。在具体微结构实现上,这种后增寻址的实现方式可采用“前增”的模式,也就是说不占用访存的关键路径,自增地址可以与访存并行计算。
循环缓存(circular buffer),又称取模寻址(modulo addressing mode),是应用于DSP典型算法——有限冲激响应(Finite Impulse Response,FIR)滤波的寻址模式。FIR滤波器是数字信号处理的常用算法,它是一种针对脉冲响应(或对任何有限长度输入的响应)且具有有限持续时间的滤波器。 N 阶离散时间FIR滤波器的脉冲响应持续 N +1个样本(从第一个非零元素到最后一个非零元素),然后稳定为零,输出序列的每个值都是最近 N 个输入值的加权和, N 阶离散时间FIR滤波器的公式如下所示:
FIR新数据写在前一个样本的下一个位置,如果采用线性寻址方式,长度为 N 的FIR数据序列就会一直往高地址方向移动,通常情况下数据空间有限,不具备移动的条件。而采用循环缓存,则通过移动指针而不是移动数据本身来实现,指针能够从最后一个位置跳回到第一个位置。通过这种方式,FIR数据看起来是连续的,最新的数据覆盖最旧的数据。图1-5为循环缓存示意图。
图1-5 循环缓存示意图
位反寻址(bit-reverse addressing mode)是支持高效实现快速傅里叶变换(Fast Fourier Transformation,FFT)算法的特殊寻址方式。给定数组中特定元素的地址,DSP自动计算位反序中下一个元素的地址。FFT算法在进行离散傅里叶变换的蝶形运算开始或结束时需要隐式地将正在处理的数据数组重排,以便最终获得按顺序排列的数据。位反重新排序可以通过将数据字从顺序寻址数组复制到位反序数组来执行,位反寻址可以通过地址规避数据复制带来的开销,达到更高效的处理实现。以4点基2-FFT为例,图1-6为蝶形运算示意图,而图1-7示意了为更高效地进行蝶形运算,在输入处采用位反寻址做数据重排。
图1-6 4点基2-FFT蝶形运算示意图
图1-7 4点基2-FFT位反寻址示意图
访存常在DSP实现的关键路径上,支持更多访存模式意味着在该路径上存在更多样的地址计算,这可能给时序带来挑战或促使访存级增加更多的流水级数。但不使用多种寻址模式同样无法对性能进行保证。因此,如何选择寻址模式是体系结构设计者所应做出的权衡。