撰写测试激励文件 - 2023.2 简体中文

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

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

使用 HLS 组件流程时,对错误编码的 C/C++ 语言函数进行综合,然后分析实现详细信息,以判定此函数功能与期望不符的原因,这个过程较为耗时。因此,高层次综合中的第一步应该是验证 C 语言函数是否正确,再生成 RTL 代码,然后使用精心编写的测试激励文件执行仿真。准确编写测试激励文件有助于显著提升工作效率,因为 C 语言函数的执行速度比 RTL 仿真快数个量级。与开发和调试 RTL 代码相比,在综合之前使用 C/C++ 语言来开发和确认算法要快得多。

测试激励文件包括 main() 函数以及任何其他必要的子函数,这些子函数不包含在综合所指定的顶层函数的层级内。main 函数会验证综合的顶层函数是否正确,方法是从测试激励文件提供激励并调用该函数,然后使用并确认其输出。

重要: 测试激励文件可接受输入实参,这些实参可在启动 C 语言仿真时提供,如 运行 C 语言仿真 中所述。但测试激励文件执行期间不得要求交互式用户输入。HLS 工具无法与仿真器进行交互,故而在执行测试激励文件时不能接受用户输入。

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

int main () { 
  //Establish 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,那么您的测试激励文件必须向综合后的函数提供重复的调用,如 运行 C/RTL 协同仿真 中所述。

以上自检测试激励文件会将函数 output.dat 的结果与 output.golden.dat 中已知良好的结果进行比对。这只是自检测试激励文件的示例之一。还有许多种方法可用于确认顶层函数,您必须根据自己的代码来对测试激励文件进行适当的编码。

在 HLS 组件流程中,函数 main() 的返回值的指示如下:

  • 0 值:结果正确。
  • 非 0 值:结果不正确。

测试激励文件可返回任意非 0 值。复杂的测试激励文件可根据失败类型返回不同的值。如果测试激励文件在 C 语言仿真或 C/RTL 协同仿真后返回非 0 值,那么该工具会报告错误和仿真失败。

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

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