Vitis HLS 学习笔记--资源绑定-使用URAM(1)

目录

1. 简介

2. 代码分析

2.1 存储器代码

2.2 Implementation报告

2.3 存储器类型指定

2.4 存储器初始化

3. 总结


1. 简介

在博文《Vitis HLS 学习笔记--资源绑定-使用URAM-CSDN博客》中,介绍了如何在Vitis HLS环境下设计一个简易的存储器模型。

通过以下编译器指令:

static data_t buffer[NWORDS];
#pragma HLS DEPENDENCE variable = buffer inter WAR false
#pragma HLS BIND_STORAGE variable = buffer type = ram_2p impl = uram

我们成功创建了一个既能读又能写的存储器,并且明确使用了 UltraRAM(URAM)作为其存储媒介。

本文旨在深入探讨该实现的内部机制,通过研究 HLS 工具所生成的 RTL 代码,解析该存储器模型的构建过程和工作原理。

2. 代码分析

2.1 存储器代码

在以下路径,我们可以发现,生成了两个 verilog 文件:

其中 example.v 是顶层文件,而example_buffer_V_RAM_2P_URAM_1R1W.v 则是定义储存器的文件。

打开后,其内容如下:

`timescale 1 ns / 1 ps
module example_buffer_V_RAM_2P_URAM_1R1W (address0, ce0, q0, address1, ce1, d1, we1,  reset,clk);parameter DataWidth = 128;
parameter AddressWidth = 14;
parameter AddressRange = 16384;input[AddressWidth-1:0] address0;
input ce0;
output reg[DataWidth-1:0] q0;
input[AddressWidth-1:0] address1;
input ce1;
input[DataWidth-1:0] d1;
input we1;
input reset;
input clk;(* ram_style = "hls_ultra", cascade_height = 1 *)reg [DataWidth-1:0] ram[0:AddressRange-1];initial begin$readmemh("./example_buffer_V_RAM_2P_URAM_1R1W.dat", ram);
endalways @(posedge clk)  
begin if (ce0) beginq0 <= ram[address0];end
endalways @(posedge clk)  
begin if (ce1) beginif (we1) ram[address1] <= d1; end
endendmodule

其实代码逻辑功能很简单,创建一个具有两个端口(一个用于读取,一个用于写入)的RAM缓冲区。

2.2 Implementation报告

要查看IMPL 报告,需要运行“Run Implementation”:

 我们关注报告中如下内容:

================================================================
== RTL Synthesis Resources
================================================================
+-------------------------+-----+----+-----+------+------+-----+--------+------+---------+----------+----------------+
| Name                    | LUT | FF | DSP | BRAM | URAM | SRL | Pragma | Impl | Latency | Variable | Source         |
+-------------------------+-----+----+-----+------+------+-----+--------+------+---------+----------+----------------+
| inst                    | 136 | 4  |     |      | 8    |     |        |      |         |          |                |
|   (inst)                | 2   | 2  |     |      |      |     |        |      |         |          |                |
|   buffer_V_U            | 134 | 2  |     |      | 8    |     |        |      |         |          |                |
|     bind_storage ram_2p |     |    |     |      |      |     | pragma | uram | 1       | buffer_V | example.cpp:16 |
+-------------------------+-----+----+-----+------+------+-----+--------+------+---------+----------+----------------+

 可见,该存储器使用了8个 URAM来实现的,没有用到 BRAM。

2.3 存储器类型指定

(* ram_style = "hls_ultra", cascade_height = 1 *)reg [DataWidth-1:0] ram[0:AddressRange-1];

ram_style = "hls_ultra",指定RAM类型。

cascade_height = 1,限制级联的深度或高度。在构建所需的存储器时,综合工具应尽量限制使用级联内存块的深度或高度为1。这可以理解为尽量不要让多个RAM块在垂直方向上连接形成更深的存储结构。

2.4 存储器初始化

initial begin$readmemh("./example_buffer_V_RAM_2P_URAM_1R1W.dat", ram);
end

需要特别注意,在大多数情况下,initial块通常被视为仅用于仿真目的,用于在仿真开始时执行一次性操作,而不是用于硬件实现。在此代码段中,initial块通过$readmemh系统任务从指定的文件 "./example_buffer_V_RAM_2P_URAM_1R1W.dat")中读取数据,并将这些数据初始化到URAM(超级RAM)的ram数组中。

然而,在Vitis HLS中,$readmemh,可以被识别并转化为硬件实现的一部分,实现硬件中预加载存储器内容。这一点我们可以在 Package IP 中确认。

3. 总结

通过本文深入探讨了在Vitis HLS环境下设计的存储器模型的内部机制。通过分析生成的RTL代码和IMPL报告,我们了解到该存储器模型利用URAM实现,具有读写功能,并且限制了级联深度为1。特别地,我们注意到存储器的初始化操作在Vitis HLS中被转化为硬件实现的一部分,这为预加载存储器内容提供了便利。总的来说,本文为使用Vitis HLS设计存储器提供了实用的指导,加深了对存储器设计原理的理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/13180.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gin自定义验证器+中文翻译

gin自定义验证器中文翻译 1、说明2、global.go3、validator.go4、eg&#xff1a;main.go5、调用接口测试 1、说明 gin官网自定义验证器给的例子相对比较简单&#xff0c;主要是语法级别&#xff0c;便于入门学习&#xff0c;并且没有给出翻译相关的处理&#xff0c;因此在这里记…

红黑树底层封装map、set C++

目录 一、框架思考 三个问题 问题1的解决 问题2的解决&#xff1a; 问题3的解决&#xff1a; 二、泛型编程 1、仿函数的泛型编程 2、迭代器的泛型编程 3、typename&#xff1a; 4、/--重载 三、原码 红黑树 map set 一、框架思考 map和set都是使用红黑树底层&…

新人学习笔记值(初始JavaScript)

一、Java Script是什么 1.Java Script是世界上最流行的语言之一&#xff0c;是一种运行在客户端的脚本语言&#xff08;script是脚本的意思&#xff09; 2.脚本语言&#xff1a;不需要编译&#xff0c;运行过程中由js解释器&#xff08;js引擎&#xff09;进行解释并运行 3.现在…

Vue原理学习:vdom 和 diff算法(基于snabbdom)

vdom 和 diff 背景 基于组件化&#xff0c;数据驱动视图。只需关心数据&#xff0c;无需关系 DOM &#xff0c;好事儿。 但是&#xff0c;JS 运行非常快&#xff0c;DOM 操作却非常慢&#xff0c;如何让“数据驱动视图”能快速响应&#xff1f; 引入 vdom 用 vnode 表示真实…

联合新能源汽车有限公司出席2024年7月8日杭州快递物流展

参展企业介绍 青岛联合新能源汽车有限公司&#xff08;简称&#xff1a;联合汽车&#xff09;&#xff0c;是一家专注于纯电动汽车领域创新的科技公司&#xff0c;在国内率先提出车电分离&#xff0c;电池标准化并共享的方案&#xff0c;研发了包含标准电池、电池仓、可换电纯电…

Bootstrap Studio for Mac:打造专业级网页设计软件

对于追求高效与品质的设计师和开发者来说&#xff0c;Bootstrap Studio for Mac无疑是最佳选择。它建立在广受欢迎的Bootstrap框架之上&#xff0c;输出干净、语义化的HTML代码。同时&#xff0c;强大的CSS和SASS编辑器&#xff0c;支持自动建议和规则验证&#xff0c;让您的设…

深度学习500问——Chapter08:目标检测(9)

文章目录 8.5 目标检测的技巧汇总 8.5.1 Data Augmentation 8.5.2 OHEM 8.5.3 NMS&#xff1a;Soft NMS/ Polygon NMS/ Inclined NMS/ ConvNMS/ Yes-Net NMS/ Softer NMS 8.5.4 Multi Scale Training/Testing 8.5.5 建立小物体与context的关系 8.5.6 参考relation network 8.5.…

QCustomplot---动态图

QCustomplot绘制动态曲线图-游标及鼠标跟踪显示数值_qcustomplot 游标-CSDN博客 m_timer new QTimer(this);connect(m_timer,SIGNAL(timeout()),this,SLOT(slotTimeout()));m_timer->start(50); void MainWindow::slotTimeout() {static int p0;static int i0;double m,m1…

简单聊聊分布式和集群

前言 分布式和集群&#xff0c;我们都听的比较多&#xff0c;分布式系统和集群的概念对于刚进入职场的小伙伴可能不是很清楚&#xff0c;这篇文章我们就一起看看两者到底是什么&#xff0c;有什么区别。 什么是分布式系统&#xff1f; 先看下书面解释&#xff1a; 分布式系统…

Milvus的系统架构

简介 Milvus的构建在许多知名的向量搜索库比如Faiss, HNSW, DiskANN, SCANN等之上的&#xff0c;它针对稠密向量数据集的相似搜索而设计&#xff0c;能支持百万、十亿甚至万亿级别的向量搜索。 Milvus支持数据分片&#xff0c;流式数据插入&#xff0c;动态schema&#xff0c…

STM32手写寄存器的方式实现点亮LED灯

这次是从头开始学习STM32&#xff0c;看野火的视频开始学习&#xff0c;感觉需要记录的时候就要记录一下学习的心得。野火视频学习的老师讲的还是很到位的&#xff0c;能够学习到很多的细节之处&#xff0c;有时会感觉很啰嗦&#xff0c;但是不得不说确实很详细&#xff0c;只有…

线程池 ThreadPool

一般情况下我们都使用Thread类创建线程&#xff0c;因为通过Thread对象可以对线程进行灵活 的控制。但过多创建线程和销毁线程&#xff0c;会消耗掉大量的内存和CPU资源&#xff0c; 假如某段时间内突然爆发了100个短小的线程&#xff0c;创建和销毁这些线程就会消耗很多时间&a…

SAP_ABAP-思考篇

作为一个SAP十年左右的从业者&#xff0c;其实我很清楚&#xff0c;我自身的能力&#xff0c;确实是很多东西都会一点&#xff0c;但是没有一样是精通的。坦白来说&#xff0c;我的个人简介里&#xff0c;虽然也不算夸大&#xff0c;但我估计有些新手小白看着可能会觉得还挺厉害…

【氮化镓】高电容密度的p-GaN栅电容在高频功率集成中的应用

这篇文章是香港科技大学Kevin J. Chen等人与台积电M.-H. Kwan等人关于高电容密度的p-GaN栅电容在高频功率集成中的应用研究。 文章详细介绍了p-GaN栅电容的设计、特性和在高频功率集成中的应用。通过实验数据和理论分析&#xff0c;文章展示了p-GaN栅电容在实现高电容密度、低…

2.前端路由的配置和使用

一&#xff0c;路由的作用 路由的作用就是将页面文件跟URL地址形成对应匹配 二&#xff0c;如何安装路由 这里我们采用pnpm的方式在项目中执行 pnpm install vue-routernext --save三&#xff0c;路由如何使用 首先创建一个我们需要访问的页面文件&#xff0c;这里我先创建…

二.使用PgAdmin连接Postgresql

二.使用PgAdmin连接Postgresql PostgreSQL是一种开源的对象关系型数据库管理系统(ORDBMS),它支持大部分SQL标准并提供了许多高级功能,例如事务、外键、视图、触发器等。PostgreSQL由PostgreSQL全球开发组维护和开发,它是一种高度可扩展的数据库系统,可以在各种操作系统…

web学习笔记(五十五)

目录 1. 配置代码片段的步骤 2. 条件判断 2.1 v-if、v-else、v-else-if 2.2 v-show 2.3 v-show和v-if的区别 1. 配置代码片段的步骤 在Visual Studio Code中我们可以将常用的代码配置成代码片段&#xff0c;这样就可以在页面上快速输入大段代码了。 &#xff08;1&#…

22 优化日志文件统计程序-按月份统计每个用户每天的访问次数

读取任务一中序列文件&#xff0c;统计每个用户每天的访问次数&#xff0c;最终将2021/1和2021/2的数据分别输出在两个文件中。 一、创建项目步骤&#xff1a; 1.创建项目 2.修改pom.xml文件 <packaging>jar</packaging> <dependencies><dependency>…

HNU-算法设计与分析-作业1

算法设计与分析 计科210X 甘晴void 202108010XXX 前言 这个系列本来想只用一个博客搞定的&#xff0c;谁曾想CSDN对于大批量文字的在线编辑一塌糊涂&#xff0c;感觉走倒车了。只能分成几个博客分别来讲了。后续会有作业-23456。作业重要的是搞懂原因。 文章目录 算法设计与…

【数据结构】时间、空间复杂度实例分析

跌倒了&#xff0c;就重新站起来&#xff0c;继续向前走&#xff1b;傻坐在地上是没用的。&#x1f493;&#x1f493;&#x1f493; 目录 •✨说在前面 &#x1f34b;知识点一&#xff1a;算法的效率 • &#x1f330;1.斐波那契数列的第n项 • &#x1f330;2.算法的复杂度…