不久前,一种新型处理器核心受到了极大的关注,这是一种可以为特定应用而量身定制的处理器。可配置处理器不仅比标准的嵌入式微处理器更快,而且可以做更多工作。有些可配置处理器甚至可以代替 ASIC 和系统芯片(SOC)中的手工编码 RTL。
那么什么是可配置处理器呢?它能做些什么?为什么会有人需要用这种处理器?可配置处理器如何代替 RTL 编码?本文将对这些问题一一解答。
流行的固定指令集架构(fixed-ISA)嵌入式微处理器的架构设计起始于上世纪八十年代,例如 ARM、MIPS 和 PowerPC 处理器,它们均被设计为独立的芯片。这些架构对许多算法的执行是令人满意的,但设计者经常要提高硬件设计中的关键部分的运行速度。即使是 DSP 架构也无法满足客户定制解决方案的速度。
用手工编码 RTL 来加速设计
由于在标准的嵌入式微处理器(甚至带嵌入式 DSP)上,很多应用的运行速度不够快,设计团队就用 Verilog 或 VHDL 语言来手工编写部分设计的代码,以满足性能要求。但是,定制的RTL 逻辑需要很长的时间进行设计和验证。此外,RTL 块设计完成后,由于验证问题,对 RTL 块进行修改是一件很困难的事,而为适应新的标准和产品新功能,修改又经常是必不可少的。
图 1 详细展示了一个典型的 RTL 块的构造,其中左边是 RTL 数据路径,右边是状态机。
图 1. 硬接线式 RTL = 数据路径 + 状态机
在几乎所有的 RTL 设计中,数据路径都消耗了逻辑块中的大多数逻辑门。典型的数据路径可以窄至 16 或 32 位,也可能有几百位宽。数据路径一般含有许多数据寄存器,并且经常有大量的 RAM 块,或者与其它 RTL 块共享的 RAM 接口。
相比之下,RTL 逻辑块的有限状态机(FSM)只包含控制细节。FSM 要捕捉所有通过数据路径的定序数据的细微差别、所有的例外情况和错误情况,以及与其它块的所有握手情况等。由于它的复杂性,因而该部分包含了大部分设计与验证风险。
近来,对 RTL 块所做的设计变动更多地倾向于影响 FSM,而不是数据路径。可配置处理器、可扩展处理器(基本上是一种新型微处理器)提供了一个降低 FSM 设计风险的途径,即用一个预设计、预验证的处理器核心和应用固件代替难于设计与验证的 FSM 块。
什么是可配置处理器?
一个全功能、可配置处理器工具包由一个预定义的基础处理器核心和一个设计工具环境所组成,可以为特定的应用需求对基础处理器进行重要的改变。可配置性的典型形式有:对内存、外部总线宽度、握手协议以及常用处理器外部设备进行增加、删除和修改等。可扩展处理器是可配置处理器的一个重要的超集,它也为系统设计者提供了向处理器中增加指令的能力,而原来处理器架构的设计者可能根本没有考虑过这些指令。
可配置处理器是作为可综合 RTL 代码来交付的,它能被放置到一个 FPGA 或 SOC 设计中。最好的可配置处理器还带有定制的软件开发工具,可以反映出设计人员定义的架构扩展。
一个可配置处理器可以完成与 RTL 功能的操作相称的数据路径操作。等效的数据路径由下列部分实现:基础处理器的整数管线、加上额外的执行单元、寄存器,以及芯片设计师为特定应用而增加的其它功能等。
例如,Tensilica 指令扩展语言(TIE,Verilog的一种简化版)可以让开发者为特定的应用去扩展 Tensilica 的 Xtensa 32 位微处理器架构。TIE 以增加指令和寄存器的形式,对新数据路径功能的高级规范做了优化。一个 TIE 描述比 RTL 更简单也更简洁,因为它省略了所有的顺序逻辑描述,包括 FSM 描述和初始化顺序等。这些复杂的项目更容易在固件里进行开发。
TIE 中描述的新指令和新寄存器通过编译器和汇编程序向固件程序员提供,这些编译器和汇编程序与用于基础处理器指令和寄存器集的程序完全相同。固件通过处理器现有的指令获取、译码和执行等机制,控制数据路径扩展中的操作顺序。FSM 固件通常可以使用高级语言进行编写,如 C 或 C++等。
替代 RTL 的可配置处理器
作为 RTL 替代品的可配置处理器一般使用与传统 RTL 块相同的数据路径结构:如深度管线、并行执行单元、针对特定任务的状态寄存器,以及连接本地与全局存储器的宽数据总线等。扩展后的处理器可以承担和典型 RTL 设计一样高的运算吞吐量,并支持与传统设计同样的数据接口。
然而,可配置处理器数据路径的控制却与 RTL 有着很大的差异。处理器数据路径的逐个周期控制并非固化在 FSM 状态转换中,而是包含在由处理器执行的固件中(见图 2 )。控制流决策发生在分支中;装载和存储操作实现存储器参考;而计算则成为通用指令和专用指令的显示顺序。
图 2. 可编程硬件功能:数据路径 + 处理器 + 软件
从 RTL 数据路径和 FSM 过渡到带有固件控制的可配置处理器具有以下重要的优点:
1. 灵活性:修改固件就可以改变一个块的功能。
2. 基于软件的开发:大多数的芯片功能可以由快速而廉价的软件工具来实现。
3. 更快速、更完全的系统建模:拿一个千万门级的设计来说,即使是最快的 RTL 逻辑仿真器也很难超过每秒几个周期的速度。相对而言,在指令集仿真器上对扩展处理器进行的固件仿真,可以达到每秒几十万或者几百万周期的速度。
4. 控制与数据的统一:所有现代的系统都不仅有硬接线逻辑,它们一定会有一个运行软件的处理器。将基于 RTL 的功能移到处理器中可以消除控制与数据处理之间的人为隔阂。
5. 快速上市:使用可配置的处理器简化了 SOC 设计,缩短了系统建模时间,并且可以加快完成硬件的最终设计。基于固件的状态机可以方便地改动以适合标准的变化,因为实现细节不是"一成不变的"。
6. 设计师工作效率:原用于 RTL 开发和验证的工程人力资源可以大大减少。基于处理器的 SOC 设计方法允许在发现设计错误时进行完美的恢复。
利用基于处理器的方法,可以在软件中进行修改,而不必进行硬件改动,不要低估这种方法带来的好处。可配置处理器用预设计、预验证的处理器核心和应用固件代替了难于设计和验证的 FSM,从而减少了状态机的设计风险。
关键:硬件和软件的自动产生
第一代可配置处理器于 20 世纪 90 年代中期问世。它们有两个主要的不足之处:没有增加新指令和寄存器的自动方法;有关的软件开发工具必须手工进行修改,才能使用这些处理器扩展性能。
在 1999 年初,Tensilica 推出了它的第一种 Xtensa 处理器,它具有自动软硬件产生这一重大创新。设计者用一个基于 Web 的方式设定配置选项。Xtensa 处理器发生器 (Xtensa Processor Generator) 会自动地把新的、设计者定义的指令加入到基础处理器中,并产生所有必需的软件开发工具的定制版本,这些工具包括编译器、调试器、指令集仿真器等等。开发者不需要做任何多余的工作来匹配开发工具和处理器。
Tensilica Xtensa 处理器和它自动产生软硬件的能力引起的反响很大。超过 60 家公司使用 Tensilica 的 Xtensa 处理器进行 SOC 设计。许多公司还在设计中使用多个 Xtensa 处理器,有些设计是用处理器的多个相同版本本完成同样任务,而另一些设计则是用不同的 Xtensa 处理器定制版本在芯片上完成多种任务。
在软件开发过程中使用可配置处理器
图 3. 典型的嵌入式软件开发流程
图 3 表示的是一个典型的嵌入式应用软件的开发流程。设计工作起始于算法。应用开发人员一般使用高级设计工具和象 C 或 C++ 这样的高级语言,他们可能要购买一些已用这些高级语言写好的预先开发的算法。
接着,开发人员将主算法和子算法写成 C 语言,创建一个可移动的、与处理器无关的应用代码基础。再经过仿真,并将子算法以及其它应用软件模块集成为一个协调的整体,然后把整个程序针对目标处理器进行编译,并对完成的应用代码进行测试和剖析。
一旦处理器选定后,软件开发团队经常为了满足性能要求,不得不把代码的关键段转换成供手工细调的汇编语言代码。汇编语言代码开发人员必须小心地将他们的变量与可用寄存器相吻合,因为如果现有的寄存器组不够用,则没有办法往一个固定指令集架构 处理器中增加更多的寄存器。
让处理器适应算法
可配置、可扩展处理器可以让开发人员为目标算法进行处理器的修改。设计者可以增加专用的、可变宽度寄存器,增加专用执行单元和宽的数据总线等,从而为特定的算法达到最佳的处理器配置。
正如借助手调汇编语言一样,通过代码剖析,定制处理器的优化点变得很明显。优化的目标一般都是在最内层的软件循环中,这些运算每秒要执行几千次甚至几百万次。减少这些循环中的目标代码的指令数量可以极大地提高系统的性能。
以下举例说明应用 Tensilica 的 Xtensa 处理器时可能达到的性能改进。
加速 FFT(快速傅立叶变换)
分频 FFT 算法的核心是"蝴蝶"运算,它驻留在 FFT 的最内层循环中。每次蝴蝶运算需要 6 次加法和 4 次乘法,才能计算出基数-2 蝴蝶运算结果的实数和虚数部分。而使用 TIE 语言,设计团队可以用 4 个加法器和 2 个乘法器来增加 Xtensa 处理器的管线,这样能在一个周期内完成半个 FFT 蝴蝶运算。
Xtensa 处理器的可配置数据总线接口可以达到 128 位宽,这样,每个蝴蝶运算的全部 4 个实、虚整数输入项都可以在一个周期内装入专用的 FFT 输入寄存器中。所有 4 个计算输出部分也可以在一个周期内保存在存储器中。
事实上,要想为几百兆赫时钟速度的 SOC 创建一个单周期、可综合的乘法器是非常困难的。因此,比较好的办法是把乘法的运算拉长至两个周期完成,这样乘法器就不会成为 SOC 中的关键时序因素。在本例中,附加的乘法器延迟不会影响吞吐量,在必要时,甚至可以考虑用更长的延迟时间,方法是在蝴蝶执行单元中使用额外的状态存储。
本方法在处理器中加入了一个单指令多数据(SIMD)的蝴蝶计算单元(使用的门数不到 35000 个,包括两个 24 X 24 位的乘法器)。表 1 列出了性能增强的情况。该表还分别显示出有 TIE 扩展和无 TIE 扩展情况下,FFT 程序的代码长度。
表 1. 处理器利用 FFT 指令增强后的加速情况表
加快 MPEG-4 解码速度
在进行 MPEG4 视频数据编码时,最困难的一部分是运动估计,它是通过搜索相邻视频帧,来寻找类似的像素块。这种搜索算法的内部循环有一个 SAD(绝对差之和)运算,其中包含一个减法运算、一个绝对值运算,以及将其结果与上一次计算值进行累加的运算。
对于 QCIF (quarter common image format) 格式图像帧、15Hz 帧频、穷尽搜索的运动估计方案来说,SAD 运算需要略多于 6.41 亿次每秒的运算。如图 4 所示,使用 TIE 后,能够增加 SIMD SAD 硬件,它可以每个周期执行 16 个像素宽的 SAD 指令。(注:使用 Xtensa 处理器的 128 位最大总线宽度时,可以在一个指令中装载 16 个像素的数据。)
使用这种方法,可以把 SAD 的全部三个运算(减、绝对值、加)在一个周期内执行,还可以在一个时钟周期内完成计算所有 16 个像素值的 SIMD 运算。两者的结合可以把原来每秒 6.41 亿次运算要求减少到每秒 1400 万条指令,这是一个相当大的下降。这种 MPEG-4 运动估计加速器现在是 Tensilica 开发的全部 MPEG-4 解码器演示设计的一部分。该 MPEG-4 解码器在基本的 Xtensa 处理器上增加了约 10 万个门,能以每运算方式约 30 MIPS 的速度实现2-way 15 帧/秒的 QCIF 编解码器,或者是 30 帧/秒的 QCIF MPEG-4 解码器。
图 4. MPEG4 SIMD SAD(绝对差之和)指令执行硬件
其它 MPEG-4 算法也可以得到加速,包括可变长度解码、iDCT、位流处理、非量化、AC/DC 预测、颜色变换以及后滤波等。当添加了一些指令对所有这些 MPEG4 解码任务进行加速,并在定制的处理器中创建了一个 MPEG-4 SIMD 引擎后,加速结果令人惊讶。
表 2. 处理器借助 FFT 指令增强后的 MPEG4 解码器提速情况
如表 2 所示,SIMD 引擎带来的加速能把解码 MPEG-4视频片断所需周期数从数十亿级降至数百万级,同时处理器所需工作频率可以降低约 30 倍,只需 10MHz 左右。而在没有加速指令的情况下,处理器要完成 MPEG-4 解码操作需要以大约 300MHz 的速度运行。很显然,10MHz 和 300MHz 处理器的功耗和加工技术成本有着巨大的差别。不论多少汇编语言代码都不可能达到类似的时钟速率巨幅下降的效果。
以上这些例子表明,使用可配置和可扩展的处理器核心可以提高嵌入算法的性能。设计者可以精确地加入所需资源(如专用寄存器、执行单元和宽的数据总线等),以达到期望的算法性能,而不是试图把各种算法硬塞进固定指令集架构处理器的计算资源中。
这种设计方法只要求设计团队能对现有的算法代码进行剖析,并找出代码中的关键内部循环即可(而这两项都是他们已经在做的工作)。然后从这些分析中,设计团队就可以定义加速这些关键循环的新处理器指令与寄存器。运用这种新方法可以极大地提高算法的性能。在大多数情况下,设计者可以用为某个应用调整过的可配置处理器代替整个 RTL 块,从而节省宝贵的设计与验证时间;同时由于该方法固有的可编程特性,又为设计增加了额外的灵活性。
用户1271842 2006-9-12 23:58