使用 Vitis HLS 设计流程时,对错误编码的 C 语言函数进行综合,然后分析实现详细信息,以判定此函数功能与期望不符的原因,这个过程较为耗时。因此,高层次综合中的第一步应该是验证 C 语言函数是否正确,再生成 RTL 代码,然后使用精心编写的测试激励文件执行仿真。准确编写测试激励文件有助于显著提升工作效率,因为 C 语言函数的执行速度比 RTL 仿真快数个量级。与调试 RTL 代码相比,在综合之前使用 C 语言来开发和确认算法要快得多。
Vitis HLS 使用测试激励文件来编译和执行 C 语言仿真。在编译流程中,您可选择Launch Debugger选项以打开完整的 C 语言调试环境,以便更仔细地分析 C 语言仿真。Vitis HLS 还使用测试激励文件来验证综合的 RTL 输出,如 Vitis HLS 中的 C/RTL 协同仿真 中所述。
测试激励文件包括 main()
函数以及任何其它必要的子函数,这些子函数不包含在 Vitis HLS 为综合所指定的顶层函数的层级内。main 函数用于验证综合的顶层函数是否正确,方法是提供激励并调用函数进行综合,然后使用并确认其输出。
例如,以下代码显示了自检测试激励文件的重要功能:
int main () {
//Esablish an initial return value. 0 = success
int ret=0;
// Call any preliminary functions required to prepare input for the test.
…
…// Call the top-level function multiple times, passing input stimuli as needed.
for(i=0; i<NUM_TRANS; i++){
top_func(input, output);
}
// Capture the output results of the function, write to a file
…
// Compare the results of the function against expected results
ret = system("diff --brief -w output.dat output.golden.dat");
if (ret != 0) {
printf("Test failed !!!\n");
ret=1;
} else {
printf("Test passed !\n");
}
…
return ret;
}
测试激励文件应针对多项传输事务执行顶层函数,以便尽可能应用和验证更多不同的数据值。测试激励文件的效率受到所执行的测试类型的限制。此外,如果您想要在 RTL 仿真期间计算 II,那么您的测试激励文件必须提供多项传输事务,如 Vitis HLS 中的 C/RTL 协同仿真 中所述。
此自检测试激励文件会将函数 output.dat 的结果与 output.golden.dat 中已知良好的结果进行比对。这只是自检测试激励文件的示例之一。还有许多种方法可用于确认顶层函数,您必须根据自己的代码来对测试激励文件进行适当的编码。
在 Vitis HLS 设计流程中,函数 main()
的返回值的指示如下:
- 0 值:结果正确。
- 非 0 值:结果不正确。
测试激励文件可返回任意非 0 值。复杂的测试激励文件可根据失败类型返回不同的值。如果测试激励文件在 C 语言仿真或 C/RTL 协同仿真后返回非 0 值,那么 Vitis HLS 会报告错误和仿真失败。
main()
函数的返回值,因此建议将返回值的范围约束为 8 位以保障可移植性和安全性。当然,仿真结果的准确性受到您提供的测试激励文件所限。您负责确保测试激励文件返回的结果正确无误。如果测试激励文件返回 0,那么无论仿真期间发生了什么,Vitis HLS 都会指示仿真已通过。