C 语言测试激励文件和 C 语言源代码 - 2023.2 简体中文

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

请查看下表中所示的 C 语言测试激励文件和 C 语言源代码。

表 1. 对 C 语言测试激励文件和 C 语言源代码进行调试
问题 需采取的行动
C 语言测试激励文件是否检查结果并在结果正确时返回 0(零)值? 确保 C 语言测试激励文件返回 0 值以便进行 C/RTL 协同仿真。即使结果正确,如果 C 语言测试激励文件不返回 0 值,那么 C/RTL 协同仿真功能仍会报告失败。
C 语言测试激励文件当前是否基于随机数字创建输入数据? 将测试激励文件更改为使用固定种子进行任意随机数字生成。如果用于随机数字生成的种子基于变量(例如,基于时间的种子),那么每次执行测试激励文件时用于仿真的数据都将不尽相同,故而导致结果不同。
当前是否正在多次访问的顶层接口上使用指针? 对于单一传输事务(执行 1 次 C 语言函数)内多次访问的任意指针,请使用 volatile 指针。如果不使用 volatile 指针,那么会根据 C 语言标准将除首次读取和最后一次写入外的所有一切都优化掉。
C 语言代码是否包含未定义的值或者执行界外阵列访问?

确认所有阵列大小都设置正确,以匹配所有访问。超出阵列大小的循环边界常引发各种问题(例如,针对大小为 N-1 的阵列执行 N 次访问)。

确认 C 语言仿真结果符合预期,并且未针对输出值指定随机数据值。

请考虑在 HLS 设计环境外使用业界标准 Valgrind 应用来确认 C 语言代码不含未定义的问题或出界问题。

即使某些变量未定义或者出界,C 语言函数仍可执行并完成。在 C 语言仿真中,将为未定义的值赋予随机数字。在 RTL 仿真中,将为未定义的值赋予未知值或 X 值。

当前在设计中是否使用浮点数学运算?

请检查 C 语言测试激励文件结果是否在可接受的误差范围内,而不是执行精确比较。对于某些浮点数学运算,RTL 实现不同于 C。欲知详情,请参阅 验证和数学函数

请确保向第三方仿真器提供适用于浮点核的 RTL 仿真模型。欲知详情,请参阅 仿真 IP 核

当前是否使用 AMD IP 块和第三方仿真器? 确保已向第三方仿真器提供指向 AMD IP 仿真模型的路径。
当前设计中使用的 hls::stream 构造是否会更改数据速率(例如,抽取或内插)?

分析设计,并使用 STREAM 指令增大用于实现 hls::stream 的 FIFO 的大小。

默认情况下,hls::stream 作为 FIFO 来实现,深度为 2。如果设计导致数据速率增加(例如,内插操作),那么默认 FIFO 大小 2 可能太小,并导致 C/RTL 协同仿真停滞。

当前仿真中使用的数据集是否过大?

执行 C/RTL 协同仿真时使用 reduce_diskspace 选项。在此模式下,HLS 每次仅执行 1 项传输事务。仿真可能运行稍慢,但这会导致存储空间受限,从而导致系统容量问题。

C/RTL 协同仿真功能可同时验证所有传输事务。如果多次调用顶层函数(例如,用于对多个视频帧进行仿真),那么所有仿真输入和输出数据都存储在磁盘上。根据机器设置和操作系统,这可能导致性能问题或执行问题。