对串流数据接口进行建模 - 2021.2 Chinese

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

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

不同于软件,硬件系统的并发性质使其能够充分利用串流数据。数据可持续不断提供给设计,设计可持续不断输出数据。RTL 设计可在设计完成处理现有数据之前接受新数据。

理解易变数据 所示,对软件中的串流数据进行建模是很重要的,编写软件以对现有硬件实现进行建模(即并发/串流性质已存在,且需加以建模)时尤其如此。

有多种方法可供使用:

  • 添加 volatile 限定符,如“多重访问 volatile 指针接口”示例中所示。测试激励文件不会对专用读写进行建模,使用原 C/C++ 语言测试激励文件的 RTL 仿真可能失败,但通过查看追踪文件波形可以发现执行的读写操作正确。
  • 修改代码以对显式专用读写进行建模。请参阅以下示例。
  • 修改代码以使用串流数据类型。串流数据类型支持对使用串流数据的硬件进行准确建模。

以下代码示例已更新,以确保它可从测试激励文件读取 4 个唯一值并写入 2 个唯一值。由于指针访问按顺序进行并从位置 0 开始,因此综合期间可使用串流接口类型。

#include "pointer_stream_good.h"

void pointer_stream_good ( volatile dout_t *d_o,  volatile din_t *d_i) {
 din_t acc = 0;

 acc += *d_i;
 acc += *(d_i+1);
 *d_o = acc;
 acc += *(d_i+2);
 acc += *(d_i+3);
 *(d_o+1) = acc;
}

测试激励文件已更新,可对函数在每项传输事务内读取 4 个唯一值的行为进行建模。此新测试激励文件仅对单一传输事务进行建模。要对多项传输事务进行建模,必须增大输入数据集并多次调用该函数。

#include "pointer_stream_good.h"
 
int main () {
 din_t d_i[4];
 dout_t d_o[4];
     int i, retval=0;
     FILE        *fp;

 // Create input data
 for (i=0;i<4;i++) {
     d_i[i] = i;
 }

 // Call the function to operate on the data
 pointer_stream_good(d_o,d_i);

 // Save the results to a file
 fp=fopen(result.dat,w);
 for (i=0;i<4;i++) {
     if (i<2)
 fprintf(fp, %d %d\n, d_i[i], d_o[i]);
     else
 fprintf(fp, %d \n, d_i[i]);
 }
 fclose(fp);

 // Compare the results file with the golden results
 retval = system(diff --brief -w result.dat result.golden.dat);
 if (retval != 0) {
     printf(Test failed  !!!\n); 
     retval=1;
 } else {
     printf(Test passed !\n);
 }

 // Return 0 if the test
 return retval;
}

测试激励文件可确认算法是否包含如下结果,结果显示:

  • 单一传输事务有 2 项输出。
  • 输出分别为前 2 次输入读取的累加,以及后 2 次输入读取的累加,再加上前 2 者的累加。
    Din Dout
    0   1
    1   6
    2 
    3
  • 多次访问位于函数接口处的指针时需要注意的最后一个问题是 RTL 仿真建模。