一. C/C++ Test bench的基本架构
- Test bench是一个用来验证逻辑功能是否正确的虚拟坏境,由Driver/Stimulus(输入激励)、Reference Model(参考模型,其输出结果是正确结果)、DUT(待测模型,Design Under Test,我们需要综合的C函数)、Monitor(检测DUT的输出)、Scoreboard(将DUT的输出和参考模型的结果做对比);
- C/C++ Test bench是为了验证我们所写的C/C++函数的正确性;
- 在HLS中还会复用C test bench来验证生成的RTL设计;
- 如何写一个高效的test bench,希望被测的函数可以更多次执行,可以覆盖更多的输入情况,将我们的被测函数的输出和已知的正确输出做一个比较,如果结果完全正确返回0;否则返回1;
一个test bench的实例:
test bench结构中的各个部分:
二. Test bench中的测试激励
测试激励的三种来源:
- 定义一个变量并且初始化;
- 将数据存储在数组中;
- 从外部文件中读取数据再赋给数组;
1. 用数组做测试激励的实例
2. 从外部文件读取数据作为激励
- 优点就是外部文件可以比较容易地存储大量数据,这从一定程度上做到了测试的完备性,另外外部文件很灵活 ,可以很容易的修改测试数据;
- C++中从外部读取数据的步骤:创建数据流——读取数据——将数据存储到数组;
使用Template Function可以高效地从外部文件读取数据,可以参数化读取。
最好不要采取绝对路径方式。
一个实例:
三. 输出检测与格式控制
1. 输出检测
- Scoreboard的作用在于将DUT的输出结果与Reference Model中的正确结果比较,当出现错误时给出信息;
- 通常由两种方法来比较:一种是使用if函数做判断,另一种就是用系统函数(system)来做比较,先将DUT的输出放到一个文件中,system函数中输入是文件;
如何将数据写入外部文件?
2. 输出格式的控制
- setw、left、right、internal;
- 整数的输出格式;
- 定点数的输出格式;
- 浮点数的输出格式;