写在前面

验证C算法是高层次综合的重要组成部分。
确保C算法执行正确操作和写C testbench所花费的时间确认了结果是正确的,减少了通过设计本身分析不正确的设计所花费的时间,并确保可以自动执行RTL验证。
例程为汉明窗Hamming Window FIR滤波器,有3个版本
使用内置C数据类型
使用ANSI C任意精度数据类型
使用C++任意精度数据类型
补充说明:ANSI C是C的一种标准,已成为习惯用语。ANSI C是由美国国家标准协会(ANSI)及国际标准化组织(ISO)推出的关于C语言的标准。ANSI C 主要标准化了现存的实现, 同时增加了一些来自 C++ 的内容 (主要是函数原型) 并支持多国字符集 (包括备受争议的三字符序列)。 ANSI C 标准同时规定了 C 运行期库例程的标准。

Lab1

回顾好的C testbench应该具备哪些特征?
将预期结果存在sw_result中作为判断标准。
将激励结果存在hw_result中进行比对。
比对错误,则在err_cnt中计数,向控制台发出信息,反映比较的结果。
最后,主函数返回err_cnt,只有err_cnt为0,函数才能通过。

复习C验证和C调试的基本操作。
image.png
被选中部分的文本信息是由testbench自定义的。
image.png
C仿真的结果会放在result.dat中。由于C仿真没有在项目目录中执行,所以必须将任何数据文件添加到项目中作为C测试台文件。
HLS中包括了一个C调试器。
image.png
By default, the code compiles in debug mode. The Launch Debugger option automatically opens the debug perspective at time 0, ready for debug to begin. To compile the code without debug information, select the Optimizing Compile option in the C Simulation dialog box.
默认情况下,代码以调试模式编译。启动调试器选项在时间0时自动打开调试透视图,准备开始调试。若要编译没有调试信息的代码,请在C模拟对话框中选择优化编译选项。
以下为选择优化编译选项的编译界面,看上去和没有选择是没有区别的???可能优化不在这个log中体现出来。
image.png
image.png
在调试模式中,使用Step Into可以逐行运行代码。不过一直点Step Into会一层层去找依赖,会弹出以下界面,比如找不到math.h的库。
Step Into(进入下一层函数)对应Step Return(返回上一层函数)
Step Over运行完当前函数
image.png
image.png
点击resume后返回0退出,说明是正常工作的。一般resume会和断点结合使用,否则可能会回不来正常使用界面(一直在RUN,或者exit)。

Lab2

使用任意精度C类型验证和调试C设计。
image.png
乍一看是有没有_t的区别,上面是C内置的类型,下面是任意精度数据类型。
IMPORTANT: When working with arbitrary precision types you can use the Vivado HLS debug environment only with C++ or SystemC. When using arbitrary precision types with ANSI C,the debug environment cannot be used. With ANSI C, you must instead use printf or fprintf statements for debugging.
使用任意精度数据类型时,只能用C++和System C的调试环境。
在ANSI C环境中无法使用调试环境,或者勉强用printf和fprintf调试。
教程中说会出现弹窗式报错,但我目前没有遇到。确实会遇到数据类型不匹配的warning
姑且认为是版本差异导致有错不报。
image.png

Lab3

使用任意精度C类型验证和调试C++设计。
一般.c文件代表ANSI C,.cpp文件代表C++。默认情况下,cpp文件用C++编译器编译,c文件用C编译器,既然是C,就必须用C的规范,所有局部变量必须放在函数体前面定义好。
cpp可以理解为c plus plus。
使用内置C数据类型
int16_t
int32_t
使用ANSI C任意精度数据类型
int16
int32
使用C++任意精度数据类型
ap_int<16>
ap_int<32>
image.png
in expansion of macro说明宏错了
盲猜是没有库,好像不是
image.png
Compiling ../../../../hamming_window_test.cpp in debug mode
csim.mk:82: recipe for target ‘obj/hamming_window_test.o’ failed
image.png
根据论坛内容找到以下错误并修改。
image.png

  1. #ifndef x //先测试x是否被宏定义过
  2. #define x
  3. 程序段1blabla~ //如果x没有被宏定义过,定义x,并编译程序段 1
  4. #endif
  5. 程序段2blabla~   //如果x已经定义过了则编译程序段2的语句,“忽视”程序段 1

这三个的含义如上
image.png
ap_private的界面找不到,但是可以找到这个比较像的。
使用断点的代码更加高效。更多使用断点(breakpoint)和步骤返回(step return)功能跳过低级(low-level)计算,并在Variables选项卡中查看变量的值。

总结

本教程中将了解到:
C testbench在仿真过程中的重要性。
如何使用C调试环境,设置断点并遍历代码。
如何调试C和C++任意精度类型。

resume-重新开始,继续