ToB企服应用市场:ToB评测及商务社交产业平台

标题: Vitis HLS 学习条记--初始化与复位 [打印本页]

作者: 张春    时间: 2024-6-15 00:41
标题: Vitis HLS 学习条记--初始化与复位
目次
1. 简介
2. 控制初始化与复位
2.1 初始化
2.2 复位
2.3 全局复位选项
2.4 复位排除
3. 阵列初始化和复位
3.1 不利用 static 限定符
3.2 利用 static 限定符
3.3 BRAM 和 URAM
4. 总结


1. 简介

本文对比分析两个方面的初始化和复位:阵列和控制(也即块级)
阵列的初始化和复位

控制的初始化与复位


2. 控制初始化与复位


2.1 初始化

默认环境下,C/C++ 中以 static 变量全局变量都初始化为 0,也可由用户赋予特定初始值。
在 Vitis HLS 工具中,需要注意:

在 RTL 中,虽然变量启动时利用的初始值与 C/C++ 语言代码相同,但无法强制该变量返回至此初始状态。要复原初始状态,必须通过复位信号来实现。
2.2 复位

复位端口在 FPGA 中用于在应用复位信号时,立刻将连接到复位端口的寄存器和块 RAM 还原为初始值。通常 RTL 设置中最重要的操作即选择复位行为。
  1. * TOP LEVEL CONTROL
  2. +-----------+---------------+-----------+
  3. | Interface | Type          | Ports     |
  4. +-----------+---------------+-----------+
  5. | ap_clk    | clock         | ap_clk    |
  6. | ap_rst_n  | reset         | ap_rst_n  |
  7. | interrupt | interrupt     | interrupt |
  8. | ap_ctrl   | ap_ctrl_chain |           |
  9. +-----------+---------------+-----------+
复制代码
对于复位行为,重要的是理解初始化与复位之间的差异。
2.3 全局复位选项

复位选项包罗:


“reset”选项包罗 4 项设置:

2.4 复位排除

通过 RESET 编译指示或指令可提供更精致的复位控制。静态变量和全局变量均可通过 RESET 指令来添加复位。还可利用 RESET 指令的 off 选项从复位的变量中移除变量。
示例一:
  1. void foo(int in[3], char a, char b, char c, int out[3]) {
  2. #pragma HLS reset variable=a
复制代码
此示例会为 foo 函数中的 a 变量添加复位,纵然全局复位设置为 none 或 control 也是云云。 
示例二: 
  1. void foo(int in[3], char a, char b, char c, int out[3]) {
  2. #pragma HLS reset variable=a off
复制代码
从 foo 函数中的 a 变量移除复位,纵然全局复位设置为 state 或 all 也是云云。

3. 阵列初始化和复位

对于阵列,推荐利用含 static 限定符的存储器来实现。这不仅可确保 HLS 工具以存储器来实现阵列,还允许利用“static”(静态)类型的默认初始化行为。
最为对比,我们设定两种环境:
3.1 不利用 static 限定符

  1. int coeff[8] = {-2, 8, -4, 10, 14, 10, -4, 8};
复制代码
每次实行函数时,都会为 coeff 阵列分配这些值。综合后,每次实行 kernel 时,用于实现 coeff 的 RAM 都会随这些值一起加载。
如果利用单端口 RAM,此操作耗时 8 个时钟周期。对于 1024 阵列,当然也就需要 1024 个时钟周期,在此期间无法实行任何依赖于 coeff 的运算。
3.2 利用 static 限定符

  1. static int coeff[8] = {-2, 8, -4, 10, 14, 10, -4, 8, -2};
复制代码
该阵列开始实行时会利用指定的值进行初始化。每次实行该函数时,coeff 阵列都会保留前次实行的值。静态阵列在 C/C++ 语言代码中的行为与 RTL 中的存储器行为相同。
如果变量包罗 static 限定符,那么 Vitis HLS 会对 RTL 计划和 FPGA 比特流中的变量进行初始化。因此,无需经历多个时钟周期来初始化存储器,而且可确保大型存储器初始化不会产生任何运算开销。
3.3 BRAM 和 URAM

在不同的硬件平台上,比如 UltraScale+ 或 Versal,内存块(BRAM)和超大型RAM(URAM)的启动和重置方式可能会有所不同。简单来说,Vitis HLS 工具支持两种重置方式:

如果读取/写入阵列,则保留“initial value array”(初始值阵列,ROM)和“run time array”(运行时阵列,RAM)。此行为实用于 BRAM 和 URAM,对应于器件实行期间的硬件 RESET 信号。

4. 总结

本文讨论了初始化和复位在硬件计划中的不同方面。阵列的初始化是在编译时或上电时为变量赋予初始值,而复位是在运行时将变量恢复到其初始状态。控制的初始化和复位也是关键,通过复位信号可以在 kernel 端口添加复位行为。对于阵列,利用 static 限定符的存储器可以实现默认初始化行为,避免运算开销。此外,BRAM 和 URAM 的启动和重置方式也需要根据硬件平台进行考虑。



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4