当前位置: 首页 > news >正文

Vitis HLS 学习笔记--global_array_RAM初始化

目录

1. 简介

2. 代码分析 

3. 对比两种 solution

3.1 solution_A

3.2 solution_B

4. 总结


1. 简介

这个例子展示了如何将全局数组映射到具有不同实现的RAM,并展示了它们如何初始化以及如何重置。

2. 代码分析 

#include <ap_int.h>ap_int<10> A[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
ap_int<10> B[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
ap_int<10> C[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};int test(int i) {
#pragma HLS BIND_STORAGE variable = A type = RAM_2P impl = BRAM
#pragma HLS BIND_STORAGE variable = B type = RAM_2P impl = LUTRAM// URAM is not a supported implementation type for global arrays// #pragma HLS BIND_STORAGE variable=C type=RAM_2P impl=URAMA[i] += B[i] + C[i];B[i] += 5;C[i] += 10;int result = (A[i] + B[i] + C[i]).to_int();return result;
}

代码功能解释:

  • 三个数组:A、B 和 C,每个数组都包含了 10 个 ap_int<10> 类型的元素。这些数组在 HLS 中被绑定到不同的存储实现类型上。
  • #pragma HLS BIND_STORAGE 是用于指定存储实现类型的指令。在这里,我们有两个绑定:
    • A 使用 BRAM(Block RAM)作为存储实现类型。
    • B 使用 LUTRAM(Look-Up Table RAM)作为存储实现类型。
  • 然后,对这些数组进行了一系列操作:
    • A[i] += B[i] + C[i]:将 B[i] 和 C[i] 的值相加,并将结果加到 A[i] 上。
    • B[i] += 5:将 B[i] 的值增加 5。
    • C[i] += 10:将 C[i] 的值增加 10。
  • 最后,计算了 A[i] + B[i] + C[i] 的和,并将其转换为整数类型,然后返回该结果。 

TestBench 代码:

extern int test(int i);int main() {int j = 5;int ret = test(j);int golden = 36;int result = 0;if (ret == golden) {printf("Test passed!\n");} else {printf("Test failed!\n");result = 1;}return result;
}

 

3. 对比两种 solution

3.1 solution_A

需要注意的事项:
[A] 在solution_A中,可以看到对于BRAM/LUTRAM,以下结构在RTL中生成以初始化全局RAM数组(不支持URAM):

proj/solution_A/syn/verilog/test_A_V_RAM_2P_BRAM_1R1W.v:
initial begin$readmemh("./test_A_V_RAM_2P_BRAM_1R1W.dat", ram);
endproj/solution_A/syn/verilog/test_B_V_RAM_2P_LUTRAM_1R1W.v:
initial begin$readmemh("./test_B_V_RAM_2P_LUTRAM_1R1W.dat", ram);
end*.dat文件包含相应数组的初始值。还请注意,全局数组不会导出到接口。
警告:[RTGEN 206-101] 全局数组'B_V'不会作为RTL端口公开。
警告:[RTGEN 206-101] 全局数组'A_V'不会作为RTL端口公开。

3.2 solution_B

 [B] 在solution_B中,可以看到当对BRAM/LUTRAM应用重置时生成的结构。

当将重置指令/编译器指示应用于静态数组(A/B/C)时,将在生成的RTL中看到每个存储器使用ROM和RAM来实现。 初始值仅加载到ROM中(与solution_A相同)。 但每次在断言重置信号后,如果没有写入地址,则从地址读取的值来自ROM,否则将从RAM中读取。 这意味着在每次重置后,内存都会重置回初始化值。 三个数组A/B/C的相同结构如下所示。

proj/solution_B/syn/verilog/test_A_V_RAM_2P_BRAM_1R1W.v://------------------------实例化------------------
test_A_V_RAM_2P_BRAM_1R1W_ram #(.DataWidth      (DataWidth      ),.AddressWidth   (AddressWidth   ),.AddressRange   (AddressRange   ))
test_A_V_RAM_2P_BRAM_1R1W_ram_u(.address0       ( address0      ),.ce0            ( ce0           ),.q0             ( q0_ram        ),.address1       ( address1      ), .ce1            ( ce1           ),.we1            ( we1           ),.d1             ( d1            ),.clk            ( clk           ),.reset          ( reset         ));test_A_V_RAM_2P_BRAM_1R1W_rom #(.DataWidth      ( DataWidth     ),.AddressWidth   ( AddressWidth  ),.AddressRange   ( AddressRange  ))test_A_V_RAM_2P_BRAM_1R1W_rom_u(.ce0            ( ce0           ),.address0       ( address0      ),.q0             ( q0_rom        ),.clk            ( clk           ),.reset          ( reset         ));//------------------------主体---------------------------assign q0     = q0_sel? q0_ram : q0_rom;

4. 总结

该例子展示了如何在HLS中将全局数组映射到不同的RAM实现,并探讨了它们的初始化和重置机制。在代码中,三个数组A、B和C分别映射到BRAM和LUTRAM,并进行了不同的数组操作。Solution_A展示了如何通过初始数据文件将全局数组初始化到RAM中,而Solution_B展示了应用重置指令后的RAM结构,其特点是在每次重置后,内存会恢复到初始化值。Solution_A生成的RTL中,数组初始化由文件加载,并且全局数组不会导出为接口端口;而在Solution_B中,重置指令导致生成ROM和RAM组合的结构,确保在断言重置信号后内存恢复到初始状态。这种机制有助于在硬件实现中保证数据的一致性和稳定性。

相关文章:

  • 【C++初阶学习】第十二弹——stack和queue的介绍和使用
  • 群体优化算法---蜂群优化算法应用于数据挖掘
  • 基于uni-app的 年-月-日 时 时间日期范围控件
  • k8s牛客面经篇
  • 【Spring框架全系列】SpringBoot_3种配置文件_yml语法_多环境开发配置(详细)
  • Linux【工具 03】Telnet服务安装使用(安全性较差 非特殊情况尽量不要使用)
  • 24.面向对象六大原则
  • 【python深度学习】——tensor内部存储结构|内存优化与as_strided|内存紧凑化contiguous
  • 面试题:说说浏览器的缓存机制
  • WebSocket 断网重连、心跳检测功能封装
  • 极简网络用户手册(1)
  • 【代码随想录算法训练营第37期 第二十八天 | LeetCode93.复原IP地址、78.子集、90.子集II】
  • 算法简单笔记3
  • C语言:(动态内存管理)
  • 攻防世界maze做法(迷宫题)
  • [译]Python中的类属性与实例属性的区别
  • 【刷算法】从上往下打印二叉树
  • Android组件 - 收藏集 - 掘金
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • jquery cookie
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • nodejs:开发并发布一个nodejs包
  • React+TypeScript入门
  • 从0到1:PostCSS 插件开发最佳实践
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 强力优化Rancher k8s中国区的使用体验
  • 如何利用MongoDB打造TOP榜小程序
  • 设计模式走一遍---观察者模式
  • 用element的upload组件实现多图片上传和压缩
  • 栈实现走出迷宫(C++)
  • 正则表达式小结
  • 第二十章:异步和文件I/O.(二十三)
  • ​MySQL主从复制一致性检测
  • # 安徽锐锋科技IDMS系统简介
  • #git 撤消对文件的更改
  • $(function(){})与(function($){....})(jQuery)的区别
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (七)c52学习之旅-中断
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (一)基于IDEA的JAVA基础10
  • (转)memcache、redis缓存
  • (转)一些感悟
  • ./和../以及/和~之间的区别
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .NET Core 2.1路线图
  • .Net Core 中间件验签
  • .net core使用ef 6
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET 读取 JSON格式的数据