不同于软件,硬件系统的并发性质使其能够充分利用串流数据。数据可持续不断提供给设计,设计可持续不断输出数据。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 仿真建模。