C7000™ 主机仿真支持您在 PC 或 Linux® 主机系统上使用 C7000 编译器内在函数和 TI 向量类型。因此,在使用 C7000 编译器之前,您可以使用不同的调试工具和编程环境来为 C7000 硬件设计原型程序。主机仿真包不会尝试仿真 C7000 CPU。
本文档是使用 C7000 主机仿真编写 C7000 DSP 程序的用户指南。其中包含的示例概述了使用 C7000 编译器 (cl7x) 进行编程和在所需主机系统上使用主机仿真包进行编程之间的主要差异。本文档旨在提供 C7000 主机仿真包的主要特性和限制的参考。
以下文档提供 C7000 的相关信息:
C7000™ and C6000™are TMs ofTI corporate name.
OpenCL™is a TM ofApple Inc. used with permission by Khronos.
Linux®is a reg TM ofLinus Torvalds in the U.S. and other countries.
Windows® and Visual Studio®are reg TMs ofMicrosoft.
Other TMs
C7000 主机仿真包包含 C++ 源代码和头文件,用于驱动 C7000 编译器提供的功能。
在编译 C7000 程序之前可能需要在主机上构建源文件,具体取决于所需的主机。以下各节提供了有关如何在不同主机上构建源代码的详细说明。
为了充分理解本指南中的内容并成功使用主机仿真,需要熟悉 C7000 C/C++ 优化编译器用户指南 (SPRUIG8) 和 C7000 运行时支持库。
通常,C7000 主机仿真的系统要求与安装 C7000 代码生成工具 (CGT) 所需的系统要求一致。
C7000 主机仿真包附带的预编译库需要安装以下编译器。建议您使用与构建和测试 C7000 主机仿真所用版本相匹配的编译器版本。
使用主机仿真时无需 Boost C++ 库和头文件。
C7000 主机仿真包将作为 C7000 CGT 的一部分进行分发。在所需的平台上安装 C7000 CGT 也会安装 C7000 主机仿真包。
不同平台和编译器的库可以在已安装工具的 host_emulation
目录下找到。与主机仿真相关的所有头文件都可以在已安装工具的 host_emulation/include
目录下找到。
对于 Visual C++,<target>-host-emulation.lib
库与静态运行时库的发布 版本兼容。<target>-host-emulationd.lib
库与静态运行时库的调试 版本兼容。
安装的 host_emulation
目录中提供了多个主机仿真库和包含目录。其中每一个库都对应于可配合 C7000 编译器使用的 --silicon_version 和 --mma_version 命令行选项的不同组合。在使用 C7000 主机仿真时,使用对应于所需编译器选项的库和包含目录,如下所示:
--silicon_version 选项 | --mma_version 选项 | 主机仿真库 |
---|---|---|
7100 | 1 | C7100 |
7120 | 2 | C7120 |
7504 | 2_256 | C7504 |
7524 | 2_256 | C7524-MMA2_256 |
7524 | 2_256f | C7524-MMA2_256F |
编写应用程序代码以使用 C7000 主机仿真运行时,应注意以下一般限制:
c7x.h
文件。(请参阅节 3.1。)有关特定编译器错误和警告的信息,以及 C7000 编译器和主机仿真编译器之间的语法解释差异,请参阅节 10。
无论选择何种主机,编写的每个程序都需要满足特定的先决条件,才能使用 C7000 主机仿真运行。
所有将 C7000 编译器功能与主机仿真配合使用的源文件都需要 c7x.h
或 c6x_migration.h
文件(如适用)。这些文件依次包括所有其他所需的头文件。针对主机仿真进行编译时,请勿 #include C7000 运行时支持库中提供的任何其他头文件。
针对主机仿真进行编译时,请勿 #include C7000 运行时支持库中的任何头文件。其中包括 c7x.h
和 c6x_migration.h
文件。而是应使用预处理器符号来控制包含哪些头文件。
明确包含的文件 | 说明 |
c7x.h | 主头文件。包括下面列出的所有其他文件(c6x_migration.h 除外)。 |
c6x_migration.h | 传统内在函数和数据类型。包括下面列出的所有其他文件。 |
自动包括的文件 | |
c7x_cr.h | 全局控制寄存器定义 |
c7x_ecr.h | 全局扩展寄存器定义 |
c7x_iluthist.h | 内部查询表和柱状图控制接口 |
c7x_luthist.h | 查询表和直方图控制接口 |
c7x_strm.h | 流引擎控制接口 |
ti_he_impl
文件夹包含用于实现的其他头文件;不应直接包含此类头文件。
由于底层实现高度依赖于 C++14 结构和功能,因此为 C7000 主机仿真编写的程序必须使用 C++14 语言。
根据编译器的不同,编译命令中可能需要一个用于启用 C++14 支持的特殊标志。
虽然并非强制要求,但强烈建议在使用 C7000 主机仿真进行编程时使用标准整数类型(例如 int32_t
)。使用内置数据类型可以编译和运行,但不能保证这些结果在所有平台上都是正确的。使用标准整数类型代替相应的内置类型将实现正确的结果,并且不会影响将程序转换到 C7000 编译器的能力。
使用主机仿真时,使用 C7000 编译器属性和指令将产生未定义的警告。这种行为是预期行为,无法纠正。如果程序在目标芯片上运行需要这些属性和指令,则通常可以在主机仿真编译器上抑制警告。
C7000 主机仿真包不仿真 C7000 编译器 pragma。因此,与 C7000 主机仿真一同运行的代码中使用时,C7000 编译器 pragma 将不起作用。
表 3-2 中提供了使用主机仿真时自动定义的 C7000 编译器符号的列表。
定义的预处理器符号 | 说明 |
---|---|
__C7000__ | 如果针对 C7000 目标或任何类型的 C7000 主机仿真进行编译,则为已定义。 |
__C7100__ | 如果针对 C7100 主机仿真进行编译,则为已定义。 |
__C7120__ | 如果针对 C7120 主机仿真进行编译,则为已定义。 |
__C7504__ | 如果针对 C7504 主机仿真进行编译,则为已定义。 |
__C7524__ | 如果针对 C7524 主机仿真进行编译,则为已定义。 |
__C7X_HOSTEM__ | 如果针对主机仿真进行编译,则为已定义。在使用目标编译器 (cl7x) 时未定义此参数。 |
__C7X_MMA__ | 默认情况下,已定义。 |
__C7X_MMA_1__ | 如果针对支持 MMA 1 的主机仿真进行编译,则为已定义。 |
__C7X_MMA_2__ | 如果针对支持 MMA 2 的主机仿真进行编译,则为已定义。 |
__C7X_MMA_2_256__ | 如果针对支持 MMA 2_256 的主机仿真进行编译,则为已定义。 |
__C7X_MMA_2_256F__ | 如果针对支持 MMA 2_256F 的主机仿真进行编译,则为已定义。 |
__C7X_NUM_SE__ | 定义为可用流引擎数量。当前始终为 2。 |
__C7X_NUM_SA__ | 定义为可用的流地址生成器数量。当前始终为 4。 |
__little_endian__ | 默认情况下,已定义。 |
以下是一个示例程序,可以交替使用主机仿真和 C7000 编译器进行编译,无需修改源代码。每种情况下都提供了示例编译器命令。
C7000 编译器 (cl7x) 命令行选项与主机仿真编译器不兼容。
/* Example Program test.cpp */
#include "c7x.h"
extern void test(int8 v);
int main()
{
int8 vec1 = int8(1,2,3,4,5,6,7,8);
int8 vec2 = (int8)5;
test(vec1 + vec2);
}
C7100 主机仿真编译器命令 (Linux):
g++ -c --std=c++14 -fno-strict-aliasing -I<cgt_install_path>/host_emulation/include/C7100
test.cpp -L<cgt_install_path>/host_emulation -lC7100-host-emulation
使用主机仿真时,-fno-strict-aliasing 命令行选项应始终与 g++ 一起使用。此选项可确保 g++ 编译器不会使用类型差异来做出别名决策。主机仿真实施方案使用不同类型来实现 TI 向量类型。因此,如果不使用此选项,g++ 可能会利用主机仿真功能错误地优化 TI 向量代码,这可能会导致意外的错误结果。
C7000 编译器命令:
cl7x test.cpp
C7000 编译器提供的所有内在函数都可用于 C7000 主机仿真。以下各小节解决了在主机仿真中使用以下类型的内在函数时可能出现的问题:
以下其他类型的内在函数对于 C7000 主机仿真和 C7000 编译器是相同的:用于向量和标量元素的特殊加载和存储的内在函数、低级别直接映射内在函数、作为寄存器接口向量谓词的一部分的内在函数,以及用于执行查询表和直方图运算的内在函数。
修改控制寄存器的内在函数在 C7000 主机仿真中执行此操作。C7000 主机仿真下可用的所有控制寄存器都可以随时作为无符号 64 位整数进行引用。
主机仿真并不能完全支持依赖于硬件信息的寄存器的读取和写入,例如执行模式和周期计数。虽然所有与这些寄存器关联的符号和内在函数都是为编译目的而定义,但在使用主机仿真时不能依赖它们的值以确保准确。
某些内在函数可能需要特殊处理才能正确使用。对于以下各小节中未提及的所有内在函数,其功能与 C7000 上的功能完全相同。可以在 c7x.h
文件和 C7000 运行时支持包中提供的其他头文件中找到可用于 C7000 编译器的内在函数完整列表。
指令执行可以尽可能接近地仿真硬件。
C7000 编译器中可用的所有类似 OpenCL™ 的内部函数都可在 C7000 主机仿真中使用。内在函数接口保持不变;任何类似 OpenCL 的内在函数的合法使用在 C7000 主机仿真中也是合法的。
C7000 编译器提供的所有流地址生成器内部函数也可在 C7000 主机仿真中使用。它们的接口与 C7000 编译器中的接口相同。