撰写测试激励文件 - 2021.2 Chinese

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

Document ID
UG1399
Release Date
2021-12-15
Version
2021.2 Chinese

使用 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 函数用于验证综合的顶层函数是否正确,方法是提供激励并调用函数进行综合,然后使用并确认其输出。

重要: 测试激励文件可接受输入实参,这些实参可在启动 C 语言仿真时提供,如 使用 C 语言仿真验证代码 中所述。但测试激励文件执行期间不得要求交互式用户输入。Vitis HLS GUI 没有命令控制台,故而在执行测试激励文件时不能接受用户输入。

例如,以下代码显示了自检测试激励文件的重要功能:

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 会报告错误和仿真失败。

提示: 由于系统环境(例如,Linux、Windows 或 Tcl)可解读 main() 函数的返回值,因此建议将返回值的范围约束为 8 位以保障可移植性和安全性。

当然,仿真结果的准确性受到您提供的测试激励文件所限。您负责确保测试激励文件返回的结果正确无误。如果测试激励文件返回 0,那么无论仿真期间发生了什么,Vitis HLS 都会指示仿真已通过。