掌上多媒体设备的增长极大地改变了终端多媒体芯片供应商对产品的定位需求。这些芯片提供商的IC设计目标不再仅仅针对一两种多媒体编解码器。消费者希望他们的移动设备能够利用不同的设备来播放媒体,能够采用不同的标准进行编码,并能够从不同的设备来下载或者接收媒体数据。视频译码器和编码器引擎必须满足多种需求,并具有面积和功耗优势。
1、设计视频加速引擎的传统RTL方法
上一代视频ASIC的设计主要对MPEG-2进行编码和译码,因为这是DVD标准。有些视频ASIC还支持MPEG-1,用于VCD(视频CD)播放。在多数情况下,MPEG-2编码器和译码器都采用RTL设计方法。一个典型MPEG-2视频ASIC体系结构如图1所示,其中包括由各个RTL模块构成的视频子系统、主控制器和片上存储器。
图1 MPEG-2视频ASIC体系结构
采用硬线RTL体系结构支持多种视频标准,然而,这也意味着每个视频标准都需要一个专用的RTL模块来实现。采用硬线RTL模块实现一个多种标准的视频加速引擎具有一定的局限性。无论是实现一个新的视频标准、更新已有的标准还是消除其中的故障都需要重新进行芯片加工。
2、采用处理器作为视频加速引擎的优势
可编程处理器能够满足多种视频标准的灵活性要求。与RTL模块设计方法相比,可编程处理器具有如下几个优势:一是易于将编解码器与处理器接口;二是满足新的视频标准要求、更新现有编解码器或者采用软件方法在芯片投片后也可以修改故障;三是可以采用软件更新的方法很容易地提高视频编解码器的性能。
然而,传统的32位处理器存在性能瓶颈,因为它们是面向通用代码设计的,而不是面向视频加速引擎设计的。嵌入式DSP也并非专门为视频量身定做的,而是包括硬件功能部件、指令和接口,专门应用于通用DSP领域。因此,为了在传统RISC和DSP处理器上实现视频编解码器,就必须使这些处理器运行在很高的速度(Mhz)上,需要大量的存储器空间,因此需要很大的功耗,不适合便携式应用。
通过研究一个视频内核程序所需要的计算量,即可一目了然。比如,一个绝对差值累加运算SAD,该运算是大部分视频编码算法中运动估计一步常采用的方法。SAD算法将会在相邻两个连续视频帧中找出宏块的运动情况,为此,需要计算两个宏块中每一组对应的像素值之间绝对差值的累加和。
下面C代码给出了SAD核心算法的简单实现:
for (row = 0; row < numrows; row++) {
for (col = 0; col < numcols; col++) {
accum += abs(macroblk1[row][col] - macroblk2[row][col]);
} /* column loop */
} /* row loop */
SAD核心算法的基本计算方法如图2所示。正像图中所示的那样,SAD核心算法首先执行减法操作,然后取绝对值,最后对前面的结果进行累加。
图2 差值绝对值累加(SAD)主要计算方法
在一个RISC处理器上计算一个由两个16x16宏块组成的SAD运算需要256次减法运算、256次绝对值运算和256次累加运算,共需要768次算术运算,这还不包括因数据转移需要的取数和存数操作。由于这需要对每一帧的所有宏块进行操作,因此,随着分辨率的提高引起视频帧增加,使得计算成本极度昂贵。
事实上,对于一个一般的通用RISC处理器而言(包括一些DSP指令,如乘法指令和乘累加指令),执行一个H.264基准译码算法需要250 MHz的性能(CIF分辨率),而执行一个H.264基准编码算法则需要超过1 GHz的性能(CIF分辨率)。完成上述运算,仅处理器内核就需要500mW的功耗,更不要说由访存和视频SOC的其它部件所用的功耗。
3、可配置处理器方法
在一个处理器上实现SAD核心算法的一个更加有效的途径是建立 “减法-绝对值-加法”专用指令。这将大大降低算术运算的开销,对一个16x16宏块而言,运算次数将从768次降为256次。而且,由于采用一个功能部件就可以实现多个简单算术运算的融合操作,因此上面的运算只需一个指令周期就可以完成,这相当于原来的256个周期。 用户不能往一个标准的32位RISC处理器中添加指令,但是,完全可以往一个可配置处理器中添加专用指令。可配置处理器允许设计人员从可配置选项菜单中选择相关配置命令来扩展处理器功能,包括增加专用指令、寄存器文件和接口等。
下面是现代可配置处理器(例如Tensilica公司的 Xtensa处理器)提供的配置和扩展选项,这对于传统的固定模式处理器而言是做不到的。
(i) 配置选项:选项菜单包括下面几项:
a. 设计人员需要或者不需要的指令。例如,16x16的乘法或者乘累加、移位、浮点指令等等。
b. 零开销循环、五级或者七级流水线、局部数据加载或者存储部件个数等。
c. 是否需要存储器保护、存储器地址转换或者存储器管理部件(MMU)
d. 包含或者不包含系统总线接口
e. 系统总线宽度和局部存储器接口宽度
f. 局部(紧密耦合)存储器大小和数量。
g. 中断数量及中断类型和中断优先级。
(ii) 扩展选项:增加设计人员自己定义的功能部件,包括:
a. 寄存器和寄存器文件。
b. 多周期、仲裁复杂指令功能部件。
c. 单指令流多数据流SIMD功能部件。
d. 将单发射处理器变为多发射处理器。
e. 用户定制接口,可以直接对数据通路进行读写操作,例如,类似GPIO(通用输入/输出)引脚的处理器内核端口或者引脚,用于扩展先进先出FIFO队列的队列接口(可以与其它逻辑或者处理器内核进行接口)。
配置选项的好处是让设计人员通过仅选择与其应用有关的选项,就可以构建一个规模适度的处理器,并能够满足其特定应用。扩展选项的好处是让设计人员根据应用定制处理器,包括建立专用指令、寄存器文件、功能部件和相关接口,用于加速系统应用算法的执行。
4、自动化软件开发工具套件支持
可配置和可扩展的关键是不仅能够自动产生预先经过验证的RTL代码,用于设计人员定制处理器(包括所有系统扩展功能),而且还能够自动产生完整的软件工具,包括一个与处理器相匹配并经过优化的开发工具套件、一个基于时钟周期的指令集仿真器以及系统模型。
这种自动化意味着编译器知道设计人员所添加的新指令、相关的寄存器以及寄存器文件。因此,编译器能够对用户定义的指令进行调度,并执行寄存器分配操作。类似地,软件开发人员在调试时除了处理器本身的基本寄存器,还能够了解设计人员定义的寄存器和寄存器文件;同时,软件开发人员能够利用指令集仿真器对设计人员定义的新指令进行仿真。与处理器相关的实时操作系统RTOS端口和系统模型也能够自动产生。Tensilica的软件工具能够在一个小时内自动产生上述软件工具,这是对使用可配置处理器用户的核心承诺,能够执行诸如SAD运算,而不必采用RTL那样的实现方法。
5、采用可配置处理器构建视频加速引擎建立多操作功能部件
将SAD这样的融合操作加到一个可配置处理器中是一件麻烦的事情。一条称为“sub.abs.ac”的新指令可以完成“减法-绝对值-累加”运算操作。这条新指令能够将图2中的操作变成图3中的复操作。
图3 使用新指令计算“减法-绝对值-累加”操作
将该指令添加到处理器中后,C编译器能够识别这条新的“sub.abs.ac”指令,并调度相关指令;调度器将显示“sub.abs.ac”功能部件所使用的内部信号;汇编器能够处理这条新指令;指令集仿真器ISS能够按照时钟周期模式进行仿真。
新的专用视频功能部件插入处理器后的数据通路简图如图4所示。注意到,除了产生功能部件逻辑外,硬件生成工具还能够自动插入前馈通路、控制逻辑以及旁路逻辑,以便将新的功能部件与数据通路中的其它逻辑互连。
图4 插入sub.abs.ac视频专用功能部件后的简化数据通路示意图
包含新指令的C代码描述的SAD算法如下:
for (row = 0; row < numrows; row++) { for (col = 0; col < numcols; col++) {
sub.abs.ac( accum, macroblk1[row][col], macroblk2[row][col]);
} /* column loop */
} /* row loop */
正如前面提到的,对于一个16x16宏块而言,增加新指令后程序主循环中的操作数减少到256个(即numrows = numcols = 16)。
6、建立单指令流多数据流SIMD功能部件
前面的SAD程序还可以进一步优化。程序中的内循环将宏块中16列做相同的运算。这对于SIMD(单指令多数据)功能部件而言是理想选择,相应的指令“sub.abs.ac16”针对16个像素同时完成sub.abs.ac操作,如图5所示。
图5 对16个像素同时进行sub.abs.ac指令的单指令流多数据流计算操作
相应的C语言过程名为sub.abs.ac16,利用此过程名重新改写的SAD内核C程序代码如下:
for (row = 0; row < numrows; row++) {
sub.abs.ac16( accum, macroblk1[row], macroblk2[row]);
} /* row loop */
通过改写后的SAD内核程序从768个算术操作减少为仅16个算术操作。
然而,仅仅只有上述C程序代码是不够的。因为指令sub.abs.ac16需要从两个宏块中读取128位的数据,这需要两个方面的支持:一个128位的寄存器文件和一个宽数据位的取数/存数接口,可配置处理器均支持这些功能。
7、建立用户定制的寄存器文件
在Xtensa可配置处理器中,说明一个任意宽度的定制寄存器文件就像写一行程序那么简单。例如,称为“myRegFile128”的过程语句建立一个宽度为128位的寄存器文件,长度为4,并建立一个相应的新的C数据类型,“myRegFile128”能够用于C/C++程序代码说明变量。软件工具也建立“MOVE”操作,用于将各种C数据类型转换为新的定制数据类型。因此,采用sub.abs.ac16过程和新寄存器文件后的SAD内核C程序代码如下:
for (row = 0; row < numrows; row++) {
myRegFile128 mblk1, mblk2;
mblk1 = macroblk1[row];
mblk2 = macroblk2[row];
sub.abs.ac16( accum, mblk1, mblk2);
} /* row loop */
现在C/C++编译器将会产生一条MOVE指令,将数据从一般的C数据类型移到定制的C数据类型“myRegFile128”,并为新寄存器文件分配寄存器。
8、建立高数据带宽的加载/存储接口
为了对高带宽定制寄存器文件(以及相应的单指令流多数据流SIMD功能部件)进行数据存取,处理器应当具有高带宽数据加载/存储操作能力。对可配置处理器而言,设计人员能够说明定制加载和存储操作指令,直接完成对定制寄存器文件的高带宽加载/存储数据操作。然后,编译器自动产生与高带宽加载/存储接口相应的加载/存储指令。
经过更新后的处理器数据通路如图6所示。硬件生成工具产生高带宽的定制寄存器文件、与数据存储器相关的加载/存储接口以及相应的前馈逻辑、控制逻辑和旁通逻辑。硬件工具还产生相应的硬件逻辑,用于将数据从基准寄存器文件移到用户定义的寄存器文件中。
图6 插入寄存器文件和高带宽加载/存储接口的数据通路
9、更新地址的同时进行加载
或者存储操作
Xtensa可配置处理器允许用户建立另一个非常有用的功能扩展,即建立一条指令,能够同时完成地址更新操作和数据加载/存储操作。建立的新的加载/存储操作指令能够并发完成如下功能: Load A1 ← Memory(Addr1);Addr1 = Addr1 + IndexUpdate
该指令能够完成“背靠背”的加载/存储操作,而不需要专门指令对地址进行更新。
10、建立先进先出(FIFO)接口
和通用输入/输出端口
视频和音频均为流媒体,需要对处理器进行快速数据访问。传统的处理器受限于系统总线接口,以及数据操作执行前对所以数据的加载与存储访问。
为支持流媒体数据/输出操作,Xtensa可配置处理器允许设计人员定义先进先出(FIFO)接口以及通用输入/输出(GPIO)端口,以便直接对数据通路进行读写访问。FIFO和GPIO端口可以是任意数据宽度(可达1024位),数量不限(每个可包含1024个FIFO和GPIO端口)。这些高带宽接口可以直接与数据通路相连,提供很高的数据吞吐量,通过处理器内核对数据进行读、处理和写操作,这对于多媒体和网络应用而言是非常重要的。
具有FIFO接口和GPIO端口的数据通路如图7所示。处理器可以进行如下操作:首先从两个FIFO(在确保两个先进先出队列均不空的情况下)中取出数据,然后计算一个复操作(例如一个乘累加舍入操作),最后将计算结果压入输出FIFO(在确保先进先出队列不满的情况下)。然后,硬件生成工具产生相应的接口信号、控制逻辑和旁通逻辑等;为配置的处理器产生完整的RTL代码。软件生成工具产生一套完整的编译器工具,以及时钟周期精确的指令集仿真器ISS,用于对新指令进行仿真。注意到,这种由设计人员定义FIFO接口和GPIO端口的能力是Xtensa可配置处理器所独有的。
图7 采用定制先进先出(FIFO)接口和通用输入输出(IO)端口的高速通信
11、加速复杂的控制密集型代码的执行
多媒体应用中控制代码的数量与复杂性显著增长,使得程序中数据密集型操作与计算时间近似等价。例如,H.264主程序译码器中的关键部分为CABAC(上下文相关二进制算术编码)算法。该算法几乎完全是具有数据计算和数据比较的控制流判决树。
由于计算的复杂性非常高,绝大多数传统处理器均采用专用的RTL加速器来完成CABAC算法。然而,在可配置处理器上可以通过增加一组专用指令来更加有效地实现CABAC算法。这种实现方法的好处是避免了数据在处理器和RTL加速器之间不停地交换数据。采用可配置处理器的另一个好处是采用指令扩展技术,由于专用硬件在处理器内部,因此可以更好地进行硬件和软件界面划分。
12、小结
现代可配置和可扩展处理器是构建定制视频和音频引擎的理想选择。Tensilica公司提供相关的视频和音频IP作为SOC模块,包括HiFi 2音频引擎、钻石系列标准的38xVDO(视频)多标准和多分辨率视频方法。与之匹配的软件编解码器是非常重要的。HiFi 2音频引擎与相关的软件一起可完成绝大部分流行的音频编解码器,例如MP3、AAC、WMA等。类似地,钻石 38xVDO 视频加速引擎与相应的编码器和译码器软件可以实现H.264 (包括Baseline、Main和profiles)、MPEG-4 (SP 和 ASP)、 MPEG-2、VC-1/WM9及其它标准。这些视频技术涵盖了从QCIF 到CIF以及SD各种分辨率,功耗低,面积小。