在技术进步的推动下,单芯片上可容纳数百万门电路,一种新的设计范式正在兴起。这种新范式允许将整个系统集成和实现在一个芯片上。
这些复杂系统通常包含特定于应用的硬连线部分,以及特定于应用的可编程部分。可编程单元通常由微控制器、数字信号处理器 (DSP)、RISC 处理器或新型“可重配置”处理器组成。拥有所有部件和单元,这些复杂系统需要无缝且完美地协同工作。
通常,在可编程单元上运行的代码需要与硬连线单元接口并交换信息。同样,硬连线单元也与这些系统中的各种可编程部件交换信息。然而,将可编程部分与硬连线部分区分开来并不容易,因为它们都存在于这些系统中。硬连线单元由可编程单元控制,而可编程单元的功能和调整则基于从硬连线单元接收的信息。
在当今复杂的系统中,软件设计师必须了解他们正在为其开发软件的硬件的内部结构,而硬件工程师必须非常清楚将在其设计上运行的应用。此外,硬件和软件设计师都必须非常熟悉将在这些设备上运行的应用的内部结构。显然,这些系统的开发和设计超越了传统的编程和硬件设计,并且需要对硬件的深入了解,以及对要实现的底层应用的深刻理解。
在其最基本的形式中,软件可以被认为是控制硬件的一种方式。我们中的一些人仍然记得或读到,在计算机的早期,程序员通过拨动开关来编程计算机,以输入微代码。随着计算机硬件的进步(将更多门电路集成到芯片上)并变得更加强大,编程语言应运而生并不断发展。这消除了早期拨动开关方法的许多困难。程序员不再需要过度关注软件的绝对效率。周期很充裕,任务通常不必实时运行。程序员现在能够解决以前无法解决的问题,例如管理大型数据库或预测天气。
与流行的类比相反,CPU 并不是计算机中充当大脑的部件;相反,应该将 CPU 上运行的软件视为计算机的大脑。超大规模集成 (VLSI) 技术和软件的最新进展导致了上述范式的出现,从而可以将完整而复杂的系统完全实现在一个芯片上。所谓的片上系统 (SoC) 无处不在。这些系统包含可编程单元以及硬连线单元。因此,它们也可以称为嵌入式系统。我们只需要看看我们的汽车、手表、手机、PDA、相机和家用电器,就能找到这些混合(软件/硬件)系统。
嵌入式系统旨在执行特定的和专用的功能。它们通常在功能和实现方面具有严格的约束。它们通常必须保证实时操作,以及符合尺寸、功耗和重量限制。它们必须满足安全性和可靠性要求,并满足成本目标以及上市时间限制。如此严格的约束对这些系统的设计者提出了相当高的要求。如前所述,硬件设计师需要了解应用,而软件设计师必须了解底层硬件以及应用的具体细节。就其本质而言,SoC 需要是可配置的。系统内的各种硬件单元需要执行不同的任务。程序员必须完全了解整个系统。他们必须了解所有硬件资源、它们的局限性和功能。他们必须能够充分执行硬件/软件划分。
对于可配置设计的一个含义是,程序员必须能够完全识别所有必需的硬件资源,因为一旦设计完成,就无法更改。换句话说,程序员必须参与硬件设计。同样,对于即时可重配置设备,设计者必须了解他们要实现的算法,并且必须能够将算法映射到硬件资源。当然,这对于现场可编程门阵列 (FPGA) 也是非常真实的。程序员需要成为一名熟练的硬件设计师。
以下简要介绍了专用可编程设备的设计方法的演变,这有助于说明硬件和软件之间的界限变得多么模糊。
你们中的许多人熟悉 DSP 中存在的乘法累加 (MAC) 硬件。那些编写过 DSP 程序的人都知道这种硬件如何加速信号处理算法。程序员必须认识到如何实现 [卷积,有限脉冲响应 (FIR)] 形式的方程
使用 MAC 操作。这个方程可以用 N 次乘法和 N-1 次加法来实现。但是,如果程序员使用 MAC 指令,则只需 N 条 MAC 指令即可计算该方程。为了利用 MAC 硬件,程序员必须以特殊方式编写汇编代码或 C 代码,以标记编译器利用 MAC 硬件。DSP 已在许多设备中得到应用。
如今,更强大的处理器支持单指令流多数据流 (SIMD) 和/或超长指令字 (VLIW),两者都能够在每个时钟周期执行多个操作,或者是超标量,能够在每个时钟周期发出多条指令。例如,如果处理器能够在每个周期执行两次乘法,则程序员必须以不同的方式实现之前的方程。如果处理器还具有可以在并行访问的算术逻辑单元 (ALU),则很容易看出,对于偶数 N,完成计算仅需大约 N/2 个周期。程序员通常可以通过执行所谓的循环展开来利用 SIMD 指令和硬件。如果一台机器可以并行执行两个 MAC 操作,则可以展开以下循环以有效地实现 FIR 滤波器的一个点
int n, k, y, x[N], h[N], y[N];
for (n=0; n<M; n++){
y[n] = 0;
for (k=0; k<N; k++)
y[n] += h[k] * x[n-k];
}
它将变为
int n, k, y1,y2, x[N], h[N], y[N];
for (n=0; n<M; n++){
y1 = y2 = 0;
for (k=0; k<N; k+=2) {
y1 += h[k] * x[n-k];
y2 += h[k+1] * x[n-k-1];
}
y[n] = y1 + y2;
}
处理器的速度也在不断提高。速度的提高需要更多的流水线阶段,这反过来又对程序员提出了更高的要求。程序员不仅需要理解和修改算法,而且现在还需要理解与不同指令相对应的流水线延迟以及底层硬件资源,以实现实现的效率。高密度集成电路和设备的出现也在通用处理领域引发了一场革命。定制和专用功能单元和数据路径以利用依赖于应用的数据流现在变得可能。此外,已经提出了可以随着数据集和算法需求的变化而动态更改其配置的机器。可重配置计算领域的早期成果令人鼓舞。它们表明,在包括密码学、信号处理和搜索在内的许多领域,与更传统的处理器解决方案相比,您可以实现 10 到 100 倍的计算密度。Malleable Technologies (PMC-Sierra) 及其即时可重配置处理器采用了这种方法。
Malleable 的处理器是一个可编程逻辑内核,基于 Malleable 数据路径 (MDP) 概念,在该概念中,您从类似 CPU 的数据路径开始,并对其进行修改,以便在每个周期向数据路径馈送许多控制位。MDP 向程序员提供了一组可以在每个周期中使用的硬件。但是,程序员必须确保数据到达功能单元并且所需的单元可用。这允许在少量周期内实现专用功能,这有点类似于在 FPGA 中定义硬件的方式。
数据路径并非旨在在系统级别取代 CPU。相反,它的目的是比任何其他可用的可编程技术(例如 DSP 芯片或内核)更有效地执行所有类型的内循环功能。在系统级别,一个或多个 MDP 内核将由传统的 CPU 控制,这与通常在使用 FPGA 和专用集成电路 (ASIC) 的系统中完成的方式相同。CPU(可能功能非常强大,也可能像 8 位微控制器一样简单)将更有效地利用其用于其执行的外循环控制功能的指令位,从而优化整个系统中的内存使用,同时保持每个元素可编程。
MDP 不会取代系统 CPU,但它会取代 DSP 内核和芯片、FPGA 以及执行计算任务(例如,前向纠错或密码算法)的 ASIC 模块。它旨在以独立的方式处理复杂算法的内循环,而无需与控制 CPU 紧密耦合。内循环可能具有非常原始的组合元素,例如大型乘法、复杂线性反馈移位寄存器 (LFSR) 或其他面向位的函数。此类算法的示例包括:数据加密标准 (DES) 算法,它重复一个复杂的、面向位的步骤 16 次以打乱 64 位数据;以及安全哈希算法-1 (SHA-1),它重复使用 32 位加法、移位和布尔逻辑运算。
MDP 可以被认为是 VLIW/SIMD 设备。它包含一个 ALU,能够进行多个 8 位、16 位或 32 位运算。它还包含一个乘法单元,能够以内积形式进行多个 16 位和 32 位乘法。MDP 的独特之处在于逻辑数据路径,它是一个 64 位单操作数功能单元,执行通用布尔逻辑和路由计算。此功能单元实现密码算法、Reed-Solomon/BCH 码、内容可寻址存储器 (CAM) 等。此外,需要设计与逻辑数据路径相关的 MDP 指令,因为它们通过直接控制位来控制门之间的互连。
Equator Technologies 在其 MAP-CA 和 BSP-15 系列处理器的设计中采用了类似的方法。这些处理器支持 VLIW/SIMD 类型指令集。Equator 已将其设备定位用于媒体处理,并且指令旨在加速这些应用。MAP-CA 和 BSP-15 处理器主要用 C 语言编程。Equator 还为设计人员提供了大量强大的“媒体内在函数”,以利用其设备架构中固有的并行性。
Improv Systems 采用了另一种不同的方法。可配置的 DSP 处理器内核 (Jazz DSP) 允许为应用提供恰到好处的处理性能,并使用设计者自己的逻辑创建专用计算单元。通过将这些预配置的异构 VLIW 处理器组合到可扩展的多处理器平台中,可以扩展此功能。Jazz DSP 处理器结合了重叠的数据路径、分布式寄存器系统和代码压缩。设计人员可以合并自定义寄存器传输级 (RTL) 模块和指令,以创建设计者定义的 DSP 内核。Improv 的架构可以从单个、唯一配置的 Jazz DSP 处理器内核扩展到系统级平台实现,该平台由许多以处理器之间共享内存映射定义的互连结构中的配置 Jazz 处理器组成。Improv 使用 Java 的变体来编程其处理器。高效的编译器从高级 Java 代码生成微代码。
与某些设备(例如 MDP)的即时可重配置性不同,可配置架构一旦在硅片中实现就固定下来。尽管固件仍然可以更改,但硬件资源保持不变。这种方法的优点是程序员可以模拟他们的算法,以找到所需的硬件资源的准确数量,然后综合设计,从而实现高度的效率。虽然即时可重配置性在系统设计完成后提供了更大的灵活性,但可配置系统在设计固定后效率更高。
FPGA 通过可重配置性为设计人员提供了高度的灵活性。尽管过去几年开发的许多可重配置系统已经证明了在各种应用中实现高性能的潜力,但这些系统可能实现的性能改进通常取决于硬件/软件设计人员的技能和经验。
这些设备通常使用硬件描述语言 (HDL)(例如 Verilog 或 VHDL)进行编程。该领域的一个挑战是开发高效的工具来帮助设计人员实现性能改进,而无需参与复杂的低级操作。(用于这些可编程设备的逻辑和布局综合的成熟设计工具确实存在。)
随着具有更快重配置时间和部分重配置支持的 FPGA 的引入,可以在动态可重配置环境中使用 FPGA,从而实现部分即时可重配置性。这项技术使无限硬件或“虚拟硬件”的概念成为可能。虚拟硬件概念通过分时共享给定的可重配置处理单元 (RPU) 来实现。它需要一个调度程序,负责 RPU 之间的配置、执行和通信。如今,大多数 FPGA 供应商都提供带有嵌入式可编程内核的产品,例如 ARM 或 PowerPC。
图 1 显示了嵌入式系统程序员可能在其目标系统中看到的硬件资源类型。这些包括以 SIMD 方式执行各种宽度乘法的乘法器。它们包括也以 SIMD 样式组织的桶形移位器和其他 ALU 功能。可编程逻辑单元可以在逐个周期的基础上进行编程,使用 HDL 的变体,这些变体将用于实现布尔方程。
图 1
还有硬连线单元,用于执行诸如可变长度解码(MPEG 解压缩中使用的 Huffman 解码)之类的任务,以及硬件加速器,例如加速快速傅里叶变换 (FFT,用于 xDSL、802.11a)、离散余弦变换 (DCT,用于 MPEG 压缩/解压缩) 或维特比算法 (用于无线和调制解调器应用) 的加速器。
程序员可能会看到复杂的、可编程的地址生成器,它们可以生成与复杂模式相对应的地址,例如用于计算 FFT 的位反转寻址等。程序员还将看到寄存器文件,这有助于提高系统吞吐量。他们必须能够管理与寄存器文件、系统总线和外部接口的 I/O。
尽管这些系统中的大多数都带有编译器,但程序员必须准备好也用低级语言对系统进行编程。这对于从这些系统中获得最佳性能至关重要。如前所述,程序员必须非常熟悉算法,以便他们可以在硬件/硬连线和软件/可编程之间最佳地划分实现。为了进一步说明这一点,请考虑一个示例,该示例将更传统的实现方法与当今在某些可重配置设备中可能实现的方法进行对比。那些熟悉 VoIP(互联网语音协议)系统的人都知道,为了节省带宽,这些系统采用了语音(或静音)检测器,以便在给定方向(路径)上没有语音时,不传输音频数据。但是,如果完全静音,人们可能会认为线路“断线”了。大多数 VoIP 系统设计者都提供一定程度的背景噪声及其频谱形状。然后,接收器基于接收到的信息生成随机噪声并塑造本地产生的噪声的频谱和强度。这项技术称为舒适噪声生成 (CNG),它使整体体验更加令人愉悦。
传统上,设计人员使用存储在内存中的随机噪声样本或“随机噪声发生器”,后者产生具有给定方差(强度或功率)的随机噪声。然后对该噪声进行滤波以产生“正确”的背景噪声。然而,这在计算上是昂贵的。设计人员通常希望减少计算负载,以便他们可以将计算负载用于编码过程和回声消除。
Malleable Technologies 采取的方法恰好实现了这一目标。(参见图 2。)设计人员使用了适当选择的 31 度“本原多项式”。该多项式确定线性反馈移位寄存器 (LFSR) 的反馈抽头,并生成长度为 231 的伪随机噪声序列。设计人员使用 MDP (LDP) 的可编程逻辑单元来实现此 LFSR(类似于 CRC 的实现方式),并每个周期产生 32 位。然后将这 32 位向量划分为 4 个字节的组。通过模拟确定了这种新的基于字节的序列的统计特性及其方差,并用于生成“正确”的噪声功率。然后将此字节序列用作 MDP (ADP) 算术单元的输入,以塑造其频谱。MDP 的算术单元能够执行八个 8x16 乘法。设计了一个长度为 8 的 FIR 滤波器来近似背景噪声。此实现的吞吐量为每个周期一个样本。
图 2
此示例强调了贯穿本文的大部分要点。它表明程序员需要了解算法的本质和修改算法的方法。他们必须能够通过以类似 Verilog 的 HDL 编写布尔方程来描述和实现硬件(在本例中为 LFSR),并使用工具来生成正确的指令。他们还需要使用 MATLAB/SPW/PTOLEMY 等工具设计滤波器。他们必须能够在实施之前模拟他们的设计,以验证它们是否正常运行。他们需要熟悉他们可用的硬件资源以及有效地使用这些资源的方法。
硬件和软件之间日益模糊的界限部分是由于 VLSI 技术的最新进展,部分是由于设备需要在严格的时序、尺寸、功耗、重量限制等条件下运行。硬件和软件之间界限模糊的最早示例之一是通用处理器中添加和合并 MAC 单元。因此,程序员必须充分理解算法,并了解底层硬件的功能。他们需要能够重新划分和修改算法,以利用他们可用的硬件资源。通过向处理器添加多个 ALU 和 MAC,这种趋势得以延续,这反过来又催生了 SIMD、VLIW 和超标量设计。来自 DSP 供应商(例如 Texas Instruments 和 Analog Devices)的最新设计和产品反映了这一趋势。
尽管了解硬件和在非常低的级别上编码对于 DSP 的从业者来说并不新鲜,但对于其余程序员社区来说肯定是新鲜事物。嵌入式系统和 SoC 的硬件和软件设计之间的界限变得模糊,以至于软件设计师不仅需要精通传统的高级语言,还需要精通汇编代码和 HDL。当然,对于硬件设计师来说也是如此,他们不能再像过去那样在半真空状态下设计硬件。通用的 DSP 不再有用。硬件设计师需要与软件设计师合作,以创建满足严格要求的有效设计。
如今,嵌入式系统和片上系统程序员不仅必须理解算法(理论),而且还必须有能力指定硬件并以硬件描述语言(如 Verilog HDL)描述它,如果他们想在这些竞争激烈的时代生存下去。
Basoglu, Chris, Woobin Lee, and John O'Donnell. The Equator MAP-CA�™ DSP: An End To-End Broadband Signal Processor�™ VLIW. IEEE Transactions on Circuits and Systems for Video Technology, Vol. 12, No. 8, August 2002.
Malleable Technologies (PMC-Sierra). MDP-1 Hardware Architecture and Programming Manual. 2000.
Priebe, R. and C. Ussery. A Configurable Platform for Advanced System-on-Chip Applications. ICSPAT 2000, Dallas, TX, October 2000.
HOMAYOUN SHAHRI,PH.D.,是 Tufon Consulting 的首席合伙人,也是南加州大学 (USC) 的电气工程兼职教授。
最初发表于 Queue vol. 1, no. 2—
在 数字图书馆 中评论本文
George W. Fitzmaurice, Azam Khan, William Buxton, Gordon Kurtenbach, Ravin Balakrishnan - 通过多样化的设备社会进行有感知的数据访问
自 ATM 和杂货店 UPC 收银台等“信息设备”问世以来,已经过去了十年多。对于办公环境,Mark Weiser 于 1991 年开始阐明 UbiComp 的概念,并确定了该趋势的一些显着特征。嵌入式计算也变得越来越普及。例如,微处理器正在发现自己被嵌入到看似传统的钢笔中,这些钢笔可以记住它们写了什么。汽车中的防抱死制动系统由模糊逻辑控制。
Rolf Ernst - 将所有部件组合在一起
随着嵌入式系统复杂性的不断提高,越来越多的系统部件被重用或提供,通常来自外部来源。这些部件的范围从单个硬件组件或软件进程到硬件-软件 (HW-SW) 子系统。它们必须与新开发的部件合作并共享资源,以便满足所有设计约束。简而言之,这就是集成任务,理想情况下,它应该是一个即插即用过程。然而,这在实践中并没有发生,不仅是因为不兼容的接口和通信标准,还因为专业化。
Ivan Goddard - 嵌入式系统中的劳动分工
嵌入式应用越来越多地需要比单个处理器(即使是大量流水线的处理器,使用高性能架构,例如超长指令字 (VLIW) 或超标量)所能提供的更多的处理能力。仅仅提高时钟频率在嵌入式世界中通常是令人望而却步的,因为更高的时钟频率需要成比例地增加功耗,而功耗在嵌入式系统中通常很稀缺。多处理,即在两个或多个处理器上同时运行应用程序,是在固定功耗预算内获得更多处理器周期的自然途径。
Telle Whitney, George Neville-Neil - SoC:软件,硬件,噩梦,幸福
片上系统 (SoC) 设计方法允许设计人员从较小的工作模块或系统创建复杂的硅系统。通过提供一种在更大的上下文中轻松支持专有功能的方法,该上下文包括许多现有设计部件,SoC 设计向更广泛的受众开放了硅设计工艺。