VSC 使用单一源码 C++ 模型,此模型能够快速完成功能确认。软件仿真目标 (-t sw_emu
) 必须在 v++
编译步骤中指定。对于此目标,VSC 将使用 C 语言编译来对加速器和应用源文件进行编译,而不会运行硬件编译。无需运行 Vitis HLS 工具来创建 RTL,使用 g++
即可链接对象文件。
以下是含两个 PE 的加速器(ldSt
和 fsk
)的代码示例。ldSt
PE 会在 AXI4-Stream
L
中写入 sz
码字,fsk
PE 仅将这些码字复制回反馈串流 S
内。fsk
函数体会从 L
读取一个码字,并向 S
写入一个码字。fsk
PE 标记为自由运行,因此对 sz
不可知。
void compute(…) {
hls::stream<T> L, S;
ldSt(…, L, S); // S is feedback
fsk(L, S); // fsk is free-running
}
void ldSt(…, hls::stream<T>& L,
hls::stream<T>& S) {
for (int i=0; i<sz; i++) {
L << input[i];
}
// Error-1: non-empty stream (i < sz-1)
// Error-2: deadlock stream (i < sz+1)
for (int i=0; (i < sz); i++) {
S >> output[i];
}
}
void fsk(hls::stream<T>& L,
hls::stream<T>& S) {
T word;
L >> word;
S << word;
}
由于 C++ 源码完全是以 C 语言编译来构建的,因此该进程极快。此外,VSC 会基于 VSC C++ 模型的某些硬件行为语义来对模型进行检查:
- 在应用层,针对主机到器件的数据移动自动执行运行时断言
- 输入数据缓冲器同步到器件后,可能不再写入该缓冲器
- 器件结果同步到输出数据缓冲器后,可能不再读取该缓冲器
-
CU 和 PE 并行执行以对硬件语义进行建模。因此,
- 可对属于非过程性 C++ 代码的反馈连接进行功能确认
- 自由运行的 PE 可随常规 PE 一起进行功能确认
- 可检测到某些错误硬件行为
- 错误 1:如果 ldSt 中的第二个循环使用的是“i < sz-1”,那么将导致 AXI4-Stream 的“S”非空,并且将被断言有效
- 错误 2:如果 ldSt 中的第二个循环使用的是“i < sz+1”,那么将导致死锁,因为 ldStr 预计收到的码字比写入串流“S”的字数多一个字。在此早期基于 C 语言的确认中,将捕获此场景并呈现为挂起。