软件仿真 - 2022.1 简体中文

Vitis 统一软件平台文档 应用加速开发 (UG1393)

Document ID
UG1393
Release Date
2022-05-25
Version
2022.1 简体中文

VSC 使用单一源码 C++ 模型,此模型能够快速完成功能确认。软件仿真目标 (-t sw_emu) 必须在 v++ 编译步骤中指定。对于此目标,VSC 将使用 C 语言编译来对加速器和应用源文件进行编译,而不会运行硬件编译。无需运行 Vitis HLS 工具来创建 RTL,使用 g++ 即可链接对象文件。

以下是含两个 PE 的加速器(ldStfsk)的代码示例。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 语言的确认中,将捕获此场景并呈现为挂起。